ERC-721
Overview
Max Total Supply
900 INARI
Holders
236
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 INARILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Inari
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-31 */ // SPDX-License-Identifier: MIT // Creator: Chiru Labs // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) 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); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) 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); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) 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); } // File: contracts/LowerGas.sol // Creator: Chiru Labs pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex = 0; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_ ) { require(maxBatchSize_ > 0, 'ERC721A: max batch size must be nonzero'); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert('ERC721A: unable to get token of owner by index'); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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 override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), 'ERC721A: token already minted'); require(quantity <= maxBatchSize, 'ERC721A: quantity to mint too high'); require(quantity > 0, 'ERC721A: quantity must be greater 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; } _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.0; contract Inari is ERC721A, Ownable { using Strings for uint256; string public uriPrefix = ""; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public cost = 0.057 ether; uint256 public maxSupply = 8778; uint256 public maxMintAmountPerTx = 3; uint256 public nftPerAddressLimitWl = 3; uint256 public noFreeNft = 200; bool public paused = true; bool public revealed = false; bool public onlyWhitelisted = true; bytes32 public whitelistMerkleRoot; mapping(address => uint256) public addressMintedBalance; constructor() ERC721A("Inari", "INARI", 100) { setHiddenMetadataUri("ipfs://Qmaq7DtwL4FKJua5HMKAsK7QXHcKgyXyvYiAQJ1j9veyn2/hidden.json"); } /** * @dev validates merkleProof */ modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) { require( MerkleProof.verify( merkleProof, root, keccak256(abi.encodePacked(msg.sender)) ), "Address does not exist in list" ); _; } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); require(currentIndex + _mintAmount <= maxSupply, "Max supply exceeded!"); _; } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(!paused, "The contract is paused!"); require(!onlyWhitelisted, "Presale is on"); require(msg.value >= cost * _mintAmount, "Insufficient funds!"); _safeMint(msg.sender, _mintAmount); } function mintWhitelist(bytes32[] calldata merkleProof, uint256 _mintAmount) public payable isValidMerkleProof(merkleProof, whitelistMerkleRoot){ uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(!paused, "The contract is paused!"); require(onlyWhitelisted, "Presale has ended"); require(ownerMintedCount + _mintAmount <= nftPerAddressLimitWl, "max NFT per address exceeded"); if(currentIndex + _mintAmount > noFreeNft){ require(msg.value >= cost * _mintAmount, "Insufficient funds!"); } addressMintedBalance[msg.sender]+=_mintAmount; _safeMint(msg.sender, _mintAmount); } function mintOwner(address _to, uint256 _mintAmount) public mintCompliance(_mintAmount) onlyOwner { _safeMint(_to, _mintAmount); } function reserveCitizens(uint256 _mintAmount) public onlyOwner { require(_mintAmount > 0 , "Invalid mint amount!"); require(currentIndex + _mintAmount <= maxSupply, "Max supply exceeded!"); _safeMint(msg.sender, _mintAmount); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 0; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner { whitelistMerkleRoot = merkleRoot; } function setOnlyWhitelisted(bool _state) public onlyOwner { onlyWhitelisted = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setNoFreeNft(uint128 _noOfFree) public onlyOwner { noFreeNft = _noOfFree; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setNftPerAddressLimitWl(uint256 _limit) public onlyOwner { nftPerAddressLimitWl = _limit; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimitWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noFreeNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"_mintAmount","type":"uint256"}],"name":"reserveCitizens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimitWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_noOfFree","type":"uint128"}],"name":"setNoFreeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600080805560c060405260a09081526008906200001d9082620002eb565b50604080518082019091526005815264173539b7b760d91b6020820152600990620000499082620002eb565b5066ca8132b0328000600b5561224a600c556003600d819055600e5560c8600f556010805462ffffff1916620100011790553480156200008857600080fd5b5060405180604001604052806005815260200164496e61726960d81b81525060405180604001604052806005815260200164494e41524960d81b8152506064600081116200012d5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084015b60405180910390fd5b60016200013b8482620002eb565b5060026200014a8382620002eb565b50608052506200015c90503362000186565b62000180604051806080016040528060418152602001620031ed60419139620001d8565b620003b7565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546001600160a01b03163314620002345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000124565b600a620002428282620002eb565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027157607f821691505b6020821081036200029257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e657600081815260208120601f850160051c81016020861015620002c15750805b601f850160051c820191505b81811015620002e257828155600101620002cd565b5050505b505050565b81516001600160401b0381111562000307576200030762000246565b6200031f816200031884546200025c565b8462000298565b602080601f8311600181146200035757600084156200033e5750858301515b600019600386901b1c1916600185901b178555620002e2565b600085815260208120601f198616915b82811015620003885788860151825594840194600190910190840162000367565b5085821015620003a75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051612e0c620003e160003960008181611e6001528181611e8a01526122bf0152612e0c6000f3fe6080604052600436106102935760003560e01c806362b99ad41161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd1461078f578063d5abeb01146107af578063e0a80853146107c5578063e2dfc039146107e5578063e985e9c514610805578063f2fde38b1461084e57600080fd5b8063a22cb465146106f1578063a45ba8e714610711578063a6d612f914610726578063aa98e0c614610739578063b88d4fde1461074f578063bd32fb661461076f57600080fd5b80637ec4a659116101135780637ec4a659146106555780638da5cb5b1461067557806394354fd01461069357806395d89b41146106a95780639c70b512146106be578063a0712d68146106de57600080fd5b806362b99ad4146105ab5780636352211e146105c057806363b4ff78146105e05780636f794f161461060057806370a0823114610620578063715018a61461064057600080fd5b80633c952764116101fe57806344a0d68a116101b757806344a0d68a146104fd5780634f6ccce71461051d5780634fdd43cb1461053d578063518302271461055d5780635503a0e81461057c5780635c975abb1461059157600080fd5b80633c952764146104455780633ccfd60b146104655780633d25fac81461047a578063408cbf941461049057806342842e0e146104b0578063438b6300146104d057600080fd5b806316c38b3c1161025057806316c38b3c1461038d57806318160ddd146103ad57806318cae269146103c25780632063064e146103ef57806323b872dd146104055780632f745c591461042557600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b31461032757806313faede61461034957806316ba10e01461036d575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125c3565b61086e565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108db565b6040516102c49190612630565b3480156102fb57600080fd5b5061030f61030a366004612643565b61096d565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612678565b6109fd565b005b34801561035557600080fd5b5061035f600b5481565b6040519081526020016102c4565b34801561037957600080fd5b5061034761038836600461272e565b610b14565b34801561039957600080fd5b506103476103a8366004612787565b610b4e565b3480156103b957600080fd5b5060005461035f565b3480156103ce57600080fd5b5061035f6103dd3660046127a2565b60126020526000908152604090205481565b3480156103fb57600080fd5b5061035f600e5481565b34801561041157600080fd5b506103476104203660046127bd565b610b8b565b34801561043157600080fd5b5061035f610440366004612678565b610b96565b34801561045157600080fd5b50610347610460366004612787565b610d02565b34801561047157600080fd5b50610347610d48565b34801561048657600080fd5b5061035f600f5481565b34801561049c57600080fd5b506103476104ab366004612678565b610de6565b3480156104bc57600080fd5b506103476104cb3660046127bd565b610e78565b3480156104dc57600080fd5b506104f06104eb3660046127a2565b610e93565b6040516102c491906127f9565b34801561050957600080fd5b50610347610518366004612643565b610f72565b34801561052957600080fd5b5061035f610538366004612643565b610fa1565b34801561054957600080fd5b5061034761055836600461272e565b611003565b34801561056957600080fd5b506010546102b890610100900460ff1681565b34801561058857600080fd5b506102e2611039565b34801561059d57600080fd5b506010546102b89060ff1681565b3480156105b757600080fd5b506102e26110c7565b3480156105cc57600080fd5b5061030f6105db366004612643565b6110d4565b3480156105ec57600080fd5b506103476105fb36600461283d565b6110e6565b34801561060c57600080fd5b5061034761061b366004612643565b61111e565b34801561062c57600080fd5b5061035f61063b3660046127a2565b6111a1565b34801561064c57600080fd5b50610347611232565b34801561066157600080fd5b5061034761067036600461272e565b611268565b34801561068157600080fd5b506007546001600160a01b031661030f565b34801561069f57600080fd5b5061035f600d5481565b3480156106b557600080fd5b506102e261129e565b3480156106ca57600080fd5b506010546102b89062010000900460ff1681565b6103476106ec366004612643565b6112ad565b3480156106fd57600080fd5b5061034761070c366004612866565b6113fe565b34801561071d57600080fd5b506102e26114c2565b610347610734366004612899565b6114cf565b34801561074557600080fd5b5061035f60115481565b34801561075b57600080fd5b5061034761076a366004612914565b611738565b34801561077b57600080fd5b5061034761078a366004612643565b611771565b34801561079b57600080fd5b506102e26107aa366004612643565b6117a0565b3480156107bb57600080fd5b5061035f600c5481565b3480156107d157600080fd5b506103476107e0366004612787565b611916565b3480156107f157600080fd5b50610347610800366004612643565b61195a565b34801561081157600080fd5b506102b8610820366004612990565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561085a57600080fd5b506103476108693660046127a2565b611989565b60006001600160e01b031982166380ac58cd60e01b148061089f57506001600160e01b03198216635b5e139f60e01b145b806108ba57506001600160e01b0319821663780e9d6360e01b145b806108d557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108ea906129ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610916906129ba565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050905090565b600061097a826000541190565b6109e15760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a08826110d4565b9050806001600160a01b0316836001600160a01b031603610a765760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109d8565b336001600160a01b0382161480610a925750610a928133610820565b610b045760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109d8565b610b0f838383611a21565b505050565b6007546001600160a01b03163314610b3e5760405162461bcd60e51b81526004016109d8906129f4565b6009610b4a8282612a6f565b5050565b6007546001600160a01b03163314610b785760405162461bcd60e51b81526004016109d8906129f4565b6010805460ff1916911515919091179055565b610b0f838383611a7d565b6000610ba1836111a1565b8210610bfa5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109d8565b600080549080805b83811015610ca2576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c5557805192505b876001600160a01b0316836001600160a01b031603610c8f57868403610c81575093506108d592505050565b83610c8b81612b45565b9450505b5080610c9a81612b45565b915050610c02565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109d8565b6007546001600160a01b03163314610d2c5760405162461bcd60e51b81526004016109d8906129f4565b60108054911515620100000262ff000019909216919091179055565b6007546001600160a01b03163314610d725760405162461bcd60e51b81526004016109d8906129f4565b6000610d866007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610dd0576040519150601f19603f3d011682016040523d82523d6000602084013e610dd5565b606091505b5050905080610de357600080fd5b50565b80600081118015610df95750600d548111155b610e155760405162461bcd60e51b81526004016109d890612b5e565b600c5481600054610e269190612b8c565b1115610e445760405162461bcd60e51b81526004016109d890612b9f565b6007546001600160a01b03163314610e6e5760405162461bcd60e51b81526004016109d8906129f4565b610b0f8383611dc4565b610b0f83838360405180602001604052806000815250611738565b60606000610ea0836111a1565b905060008167ffffffffffffffff811115610ebd57610ebd6126a2565b604051908082528060200260200182016040528015610ee6578160200160208202803683370190505b5090506000805b8381108015610efe5750600c548211155b15610f68576000610f0e836110d4565b9050866001600160a01b0316816001600160a01b031603610f555782848381518110610f3c57610f3c612bcd565b602090810291909101015281610f5181612b45565b9250505b82610f5f81612b45565b93505050610eed565b5090949350505050565b6007546001600160a01b03163314610f9c5760405162461bcd60e51b81526004016109d8906129f4565b600b55565b600080548210610fff5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109d8565b5090565b6007546001600160a01b0316331461102d5760405162461bcd60e51b81526004016109d8906129f4565b600a610b4a8282612a6f565b60098054611046906129ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611072906129ba565b80156110bf5780601f10611094576101008083540402835291602001916110bf565b820191906000526020600020905b8154815290600101906020018083116110a257829003601f168201915b505050505081565b60088054611046906129ba565b60006110df82611dde565b5192915050565b6007546001600160a01b031633146111105760405162461bcd60e51b81526004016109d8906129f4565b6001600160801b0316600f55565b6007546001600160a01b031633146111485760405162461bcd60e51b81526004016109d8906129f4565b600081116111685760405162461bcd60e51b81526004016109d890612b5e565b600c54816000546111799190612b8c565b11156111975760405162461bcd60e51b81526004016109d890612b9f565b610de33382611dc4565b60006001600160a01b03821661120d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109d8565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b0316331461125c5760405162461bcd60e51b81526004016109d8906129f4565b6112666000611f88565b565b6007546001600160a01b031633146112925760405162461bcd60e51b81526004016109d8906129f4565b6008610b4a8282612a6f565b6060600280546108ea906129ba565b806000811180156112c05750600d548111155b6112dc5760405162461bcd60e51b81526004016109d890612b5e565b600c54816000546112ed9190612b8c565b111561130b5760405162461bcd60e51b81526004016109d890612b9f565b60105460ff16156113585760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016109d8565b60105462010000900460ff16156113a15760405162461bcd60e51b815260206004820152600d60248201526c283932b9b0b6329034b99037b760991b60448201526064016109d8565b81600b546113af9190612be3565b3410156113f45760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d8565b610b4a3383611dc4565b336001600160a01b038316036114565760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109d8565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a8054611046906129ba565b8282601154611546838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b166020820152859250603401905060405160208183030381529060405280519060200120611fda565b6115925760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320646f6573206e6f7420657869737420696e206c697374000060448201526064016109d8565b3360009081526012602052604090205460105460ff16156115ef5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016109d8565b60105462010000900460ff1661163b5760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b19481a185cc8195b991959607a1b60448201526064016109d8565b600e546116488683612b8c565b11156116965760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e46542070657220616464726573732065786365656465640000000060448201526064016109d8565b600f54856000546116a79190612b8c565b11156117005784600b546116bb9190612be3565b3410156117005760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d8565b336000908152601260205260408120805487929061171f908490612b8c565b9091555061172f90503386611dc4565b50505050505050565b611743848484611a7d565b61174f84848484611ff0565b61176b5760405162461bcd60e51b81526004016109d890612bfa565b50505050565b6007546001600160a01b0316331461179b5760405162461bcd60e51b81526004016109d8906129f4565b601155565b60606117ad826000541190565b6118115760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d8565b601054610100900460ff1615156000036118b757600a8054611832906129ba565b80601f016020809104026020016040519081016040528092919081815260200182805461185e906129ba565b80156118ab5780601f10611880576101008083540402835291602001916118ab565b820191906000526020600020905b81548152906001019060200180831161188e57829003601f168201915b50505050509050919050565b60006118c16120f2565b905060008151116118e1576040518060200160405280600081525061190f565b806118eb84612101565b60096040516020016118ff93929190612c4d565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146119405760405162461bcd60e51b81526004016109d8906129f4565b601080549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146119845760405162461bcd60e51b81526004016109d8906129f4565b600e55565b6007546001600160a01b031633146119b35760405162461bcd60e51b81526004016109d8906129f4565b6001600160a01b038116611a185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d8565b610de381611f88565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611a8882611dde565b80519091506000906001600160a01b0316336001600160a01b03161480611abf575033611ab48461096d565b6001600160a01b0316145b80611ad157508151611ad19033610820565b905080611b3b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109d8565b846001600160a01b031682600001516001600160a01b031614611baf5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109d8565b6001600160a01b038416611c135760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109d8565b611c236000848460000151611a21565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b95909216949094021790925590611ce8908590612b8c565b6000818152600360205260409020549091506001600160a01b0316611d7a57611d12816000541190565b15611d7a5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610b4a828260405180602001604052806000815250612202565b6040805180820190915260008082526020820152611dfd826000541190565b611e5c5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109d8565b60007f00000000000000000000000000000000000000000000000000000000000000008310611ebd57611eaf7f000000000000000000000000000000000000000000000000000000000000000084612ced565b611eba906001612b8c565b90505b825b818110611f27576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f1457949350505050565b5080611f1f81612d00565b915050611ebf565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109d8565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611fe78584612539565b14949350505050565b60006001600160a01b0384163b156120e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612034903390899088908890600401612d17565b6020604051808303816000875af192505050801561206f575060408051601f3d908101601f1916820190925261206c91810190612d54565b60015b6120cc573d80801561209d576040519150601f19603f3d011682016040523d82523d6000602084013e6120a2565b606091505b5080516000036120c45760405162461bcd60e51b81526004016109d890612bfa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120ea565b5060015b949350505050565b6060600880546108ea906129ba565b6060816000036121285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612152578061213c81612b45565b915061214b9050600a83612d87565b915061212c565b60008167ffffffffffffffff81111561216d5761216d6126a2565b6040519080825280601f01601f191660200182016040528015612197576020820181803683370190505b5090505b84156120ea576121ac600183612ced565b91506121b9600a86612d9b565b6121c4906030612b8c565b60f81b8183815181106121d9576121d9612bcd565b60200101906001600160f81b031916908160001a9053506121fb600a86612d87565b945061219b565b6000546001600160a01b0384166122655760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109d8565b612270816000541190565b156122bd5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109d8565b7f00000000000000000000000000000000000000000000000000000000000000008311156123385760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109d8565b600083116123945760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b60648201526084016109d8565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906123f0908790612daf565b6001600160801b0316815260200185836020015161240e9190612daf565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561252e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124f26000888488611ff0565b61250e5760405162461bcd60e51b81526004016109d890612bfa565b8161251881612b45565b925050808061252690612b45565b9150506124a5565b506000819055611dbc565b600081815b84518110156125a557600085828151811061255b5761255b612bcd565b602002602001015190508083116125815760008381526020829052604090209250612592565b600081815260208490526040902092505b508061259d81612b45565b91505061253e565b509392505050565b6001600160e01b031981168114610de357600080fd5b6000602082840312156125d557600080fd5b813561190f816125ad565b60005b838110156125fb5781810151838201526020016125e3565b50506000910152565b6000815180845261261c8160208601602086016125e0565b601f01601f19169290920160200192915050565b60208152600061190f6020830184612604565b60006020828403121561265557600080fd5b5035919050565b80356001600160a01b038116811461267357600080fd5b919050565b6000806040838503121561268b57600080fd5b6126948361265c565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156126d3576126d36126a2565b604051601f8501601f19908116603f011681019082821181831017156126fb576126fb6126a2565b8160405280935085815286868601111561271457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561274057600080fd5b813567ffffffffffffffff81111561275757600080fd5b8201601f8101841361276857600080fd5b6120ea848235602084016126b8565b8035801515811461267357600080fd5b60006020828403121561279957600080fd5b61190f82612777565b6000602082840312156127b457600080fd5b61190f8261265c565b6000806000606084860312156127d257600080fd5b6127db8461265c565b92506127e96020850161265c565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561283157835183529284019291840191600101612815565b50909695505050505050565b60006020828403121561284f57600080fd5b81356001600160801b038116811461190f57600080fd5b6000806040838503121561287957600080fd5b6128828361265c565b915061289060208401612777565b90509250929050565b6000806000604084860312156128ae57600080fd5b833567ffffffffffffffff808211156128c657600080fd5b818601915086601f8301126128da57600080fd5b8135818111156128e957600080fd5b8760208260051b85010111156128fe57600080fd5b6020928301989097509590910135949350505050565b6000806000806080858703121561292a57600080fd5b6129338561265c565b93506129416020860161265c565b925060408501359150606085013567ffffffffffffffff81111561296457600080fd5b8501601f8101871361297557600080fd5b612984878235602084016126b8565b91505092959194509250565b600080604083850312156129a357600080fd5b6129ac8361265c565b91506128906020840161265c565b600181811c908216806129ce57607f821691505b6020821081036129ee57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610b0f57600081815260208120601f850160051c81016020861015612a505750805b601f850160051c820191505b81811015611dbc57828155600101612a5c565b815167ffffffffffffffff811115612a8957612a896126a2565b612a9d81612a9784546129ba565b84612a29565b602080601f831160018114612ad25760008415612aba5750858301515b600019600386901b1c1916600185901b178555611dbc565b600085815260208120601f198616915b82811015612b0157888601518255948401946001909101908401612ae2565b5085821015612b1f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600060018201612b5757612b57612b2f565b5060010190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b808201808211156108d5576108d5612b2f565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176108d5576108d5612b2f565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600084516020612c608285838a016125e0565b855191840191612c738184848a016125e0565b8554920191600090612c84816129ba565b60018281168015612c9c5760018114612cb157612cdd565b60ff1984168752821515830287019450612cdd565b896000528560002060005b84811015612cd557815489820152908301908701612cbc565b505082870194505b50929a9950505050505050505050565b818103818111156108d5576108d5612b2f565b600081612d0f57612d0f612b2f565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d4a90830184612604565b9695505050505050565b600060208284031215612d6657600080fd5b815161190f816125ad565b634e487b7160e01b600052601260045260246000fd5b600082612d9657612d96612d71565b500490565b600082612daa57612daa612d71565b500690565b6001600160801b03818116838216019080821115612dcf57612dcf612b2f565b509291505056fea2646970667358221220866ee0d424cac62430c1ed951ce540b2fa3b7c0520b0e3608857f246a0bdeebc64736f6c63430008120033697066733a2f2f516d6171374474774c34464b4a756135484d4b41734b37515848634b6779587976596941514a316a397665796e322f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102935760003560e01c806362b99ad41161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd1461078f578063d5abeb01146107af578063e0a80853146107c5578063e2dfc039146107e5578063e985e9c514610805578063f2fde38b1461084e57600080fd5b8063a22cb465146106f1578063a45ba8e714610711578063a6d612f914610726578063aa98e0c614610739578063b88d4fde1461074f578063bd32fb661461076f57600080fd5b80637ec4a659116101135780637ec4a659146106555780638da5cb5b1461067557806394354fd01461069357806395d89b41146106a95780639c70b512146106be578063a0712d68146106de57600080fd5b806362b99ad4146105ab5780636352211e146105c057806363b4ff78146105e05780636f794f161461060057806370a0823114610620578063715018a61461064057600080fd5b80633c952764116101fe57806344a0d68a116101b757806344a0d68a146104fd5780634f6ccce71461051d5780634fdd43cb1461053d578063518302271461055d5780635503a0e81461057c5780635c975abb1461059157600080fd5b80633c952764146104455780633ccfd60b146104655780633d25fac81461047a578063408cbf941461049057806342842e0e146104b0578063438b6300146104d057600080fd5b806316c38b3c1161025057806316c38b3c1461038d57806318160ddd146103ad57806318cae269146103c25780632063064e146103ef57806323b872dd146104055780632f745c591461042557600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b31461032757806313faede61461034957806316ba10e01461036d575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125c3565b61086e565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108db565b6040516102c49190612630565b3480156102fb57600080fd5b5061030f61030a366004612643565b61096d565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612678565b6109fd565b005b34801561035557600080fd5b5061035f600b5481565b6040519081526020016102c4565b34801561037957600080fd5b5061034761038836600461272e565b610b14565b34801561039957600080fd5b506103476103a8366004612787565b610b4e565b3480156103b957600080fd5b5060005461035f565b3480156103ce57600080fd5b5061035f6103dd3660046127a2565b60126020526000908152604090205481565b3480156103fb57600080fd5b5061035f600e5481565b34801561041157600080fd5b506103476104203660046127bd565b610b8b565b34801561043157600080fd5b5061035f610440366004612678565b610b96565b34801561045157600080fd5b50610347610460366004612787565b610d02565b34801561047157600080fd5b50610347610d48565b34801561048657600080fd5b5061035f600f5481565b34801561049c57600080fd5b506103476104ab366004612678565b610de6565b3480156104bc57600080fd5b506103476104cb3660046127bd565b610e78565b3480156104dc57600080fd5b506104f06104eb3660046127a2565b610e93565b6040516102c491906127f9565b34801561050957600080fd5b50610347610518366004612643565b610f72565b34801561052957600080fd5b5061035f610538366004612643565b610fa1565b34801561054957600080fd5b5061034761055836600461272e565b611003565b34801561056957600080fd5b506010546102b890610100900460ff1681565b34801561058857600080fd5b506102e2611039565b34801561059d57600080fd5b506010546102b89060ff1681565b3480156105b757600080fd5b506102e26110c7565b3480156105cc57600080fd5b5061030f6105db366004612643565b6110d4565b3480156105ec57600080fd5b506103476105fb36600461283d565b6110e6565b34801561060c57600080fd5b5061034761061b366004612643565b61111e565b34801561062c57600080fd5b5061035f61063b3660046127a2565b6111a1565b34801561064c57600080fd5b50610347611232565b34801561066157600080fd5b5061034761067036600461272e565b611268565b34801561068157600080fd5b506007546001600160a01b031661030f565b34801561069f57600080fd5b5061035f600d5481565b3480156106b557600080fd5b506102e261129e565b3480156106ca57600080fd5b506010546102b89062010000900460ff1681565b6103476106ec366004612643565b6112ad565b3480156106fd57600080fd5b5061034761070c366004612866565b6113fe565b34801561071d57600080fd5b506102e26114c2565b610347610734366004612899565b6114cf565b34801561074557600080fd5b5061035f60115481565b34801561075b57600080fd5b5061034761076a366004612914565b611738565b34801561077b57600080fd5b5061034761078a366004612643565b611771565b34801561079b57600080fd5b506102e26107aa366004612643565b6117a0565b3480156107bb57600080fd5b5061035f600c5481565b3480156107d157600080fd5b506103476107e0366004612787565b611916565b3480156107f157600080fd5b50610347610800366004612643565b61195a565b34801561081157600080fd5b506102b8610820366004612990565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561085a57600080fd5b506103476108693660046127a2565b611989565b60006001600160e01b031982166380ac58cd60e01b148061089f57506001600160e01b03198216635b5e139f60e01b145b806108ba57506001600160e01b0319821663780e9d6360e01b145b806108d557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108ea906129ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610916906129ba565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050905090565b600061097a826000541190565b6109e15760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a08826110d4565b9050806001600160a01b0316836001600160a01b031603610a765760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109d8565b336001600160a01b0382161480610a925750610a928133610820565b610b045760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109d8565b610b0f838383611a21565b505050565b6007546001600160a01b03163314610b3e5760405162461bcd60e51b81526004016109d8906129f4565b6009610b4a8282612a6f565b5050565b6007546001600160a01b03163314610b785760405162461bcd60e51b81526004016109d8906129f4565b6010805460ff1916911515919091179055565b610b0f838383611a7d565b6000610ba1836111a1565b8210610bfa5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109d8565b600080549080805b83811015610ca2576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c5557805192505b876001600160a01b0316836001600160a01b031603610c8f57868403610c81575093506108d592505050565b83610c8b81612b45565b9450505b5080610c9a81612b45565b915050610c02565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109d8565b6007546001600160a01b03163314610d2c5760405162461bcd60e51b81526004016109d8906129f4565b60108054911515620100000262ff000019909216919091179055565b6007546001600160a01b03163314610d725760405162461bcd60e51b81526004016109d8906129f4565b6000610d866007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610dd0576040519150601f19603f3d011682016040523d82523d6000602084013e610dd5565b606091505b5050905080610de357600080fd5b50565b80600081118015610df95750600d548111155b610e155760405162461bcd60e51b81526004016109d890612b5e565b600c5481600054610e269190612b8c565b1115610e445760405162461bcd60e51b81526004016109d890612b9f565b6007546001600160a01b03163314610e6e5760405162461bcd60e51b81526004016109d8906129f4565b610b0f8383611dc4565b610b0f83838360405180602001604052806000815250611738565b60606000610ea0836111a1565b905060008167ffffffffffffffff811115610ebd57610ebd6126a2565b604051908082528060200260200182016040528015610ee6578160200160208202803683370190505b5090506000805b8381108015610efe5750600c548211155b15610f68576000610f0e836110d4565b9050866001600160a01b0316816001600160a01b031603610f555782848381518110610f3c57610f3c612bcd565b602090810291909101015281610f5181612b45565b9250505b82610f5f81612b45565b93505050610eed565b5090949350505050565b6007546001600160a01b03163314610f9c5760405162461bcd60e51b81526004016109d8906129f4565b600b55565b600080548210610fff5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109d8565b5090565b6007546001600160a01b0316331461102d5760405162461bcd60e51b81526004016109d8906129f4565b600a610b4a8282612a6f565b60098054611046906129ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611072906129ba565b80156110bf5780601f10611094576101008083540402835291602001916110bf565b820191906000526020600020905b8154815290600101906020018083116110a257829003601f168201915b505050505081565b60088054611046906129ba565b60006110df82611dde565b5192915050565b6007546001600160a01b031633146111105760405162461bcd60e51b81526004016109d8906129f4565b6001600160801b0316600f55565b6007546001600160a01b031633146111485760405162461bcd60e51b81526004016109d8906129f4565b600081116111685760405162461bcd60e51b81526004016109d890612b5e565b600c54816000546111799190612b8c565b11156111975760405162461bcd60e51b81526004016109d890612b9f565b610de33382611dc4565b60006001600160a01b03821661120d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109d8565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b0316331461125c5760405162461bcd60e51b81526004016109d8906129f4565b6112666000611f88565b565b6007546001600160a01b031633146112925760405162461bcd60e51b81526004016109d8906129f4565b6008610b4a8282612a6f565b6060600280546108ea906129ba565b806000811180156112c05750600d548111155b6112dc5760405162461bcd60e51b81526004016109d890612b5e565b600c54816000546112ed9190612b8c565b111561130b5760405162461bcd60e51b81526004016109d890612b9f565b60105460ff16156113585760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016109d8565b60105462010000900460ff16156113a15760405162461bcd60e51b815260206004820152600d60248201526c283932b9b0b6329034b99037b760991b60448201526064016109d8565b81600b546113af9190612be3565b3410156113f45760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d8565b610b4a3383611dc4565b336001600160a01b038316036114565760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109d8565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a8054611046906129ba565b8282601154611546838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b166020820152859250603401905060405160208183030381529060405280519060200120611fda565b6115925760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320646f6573206e6f7420657869737420696e206c697374000060448201526064016109d8565b3360009081526012602052604090205460105460ff16156115ef5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b60448201526064016109d8565b60105462010000900460ff1661163b5760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b19481a185cc8195b991959607a1b60448201526064016109d8565b600e546116488683612b8c565b11156116965760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e46542070657220616464726573732065786365656465640000000060448201526064016109d8565b600f54856000546116a79190612b8c565b11156117005784600b546116bb9190612be3565b3410156117005760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109d8565b336000908152601260205260408120805487929061171f908490612b8c565b9091555061172f90503386611dc4565b50505050505050565b611743848484611a7d565b61174f84848484611ff0565b61176b5760405162461bcd60e51b81526004016109d890612bfa565b50505050565b6007546001600160a01b0316331461179b5760405162461bcd60e51b81526004016109d8906129f4565b601155565b60606117ad826000541190565b6118115760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d8565b601054610100900460ff1615156000036118b757600a8054611832906129ba565b80601f016020809104026020016040519081016040528092919081815260200182805461185e906129ba565b80156118ab5780601f10611880576101008083540402835291602001916118ab565b820191906000526020600020905b81548152906001019060200180831161188e57829003601f168201915b50505050509050919050565b60006118c16120f2565b905060008151116118e1576040518060200160405280600081525061190f565b806118eb84612101565b60096040516020016118ff93929190612c4d565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146119405760405162461bcd60e51b81526004016109d8906129f4565b601080549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146119845760405162461bcd60e51b81526004016109d8906129f4565b600e55565b6007546001600160a01b031633146119b35760405162461bcd60e51b81526004016109d8906129f4565b6001600160a01b038116611a185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d8565b610de381611f88565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611a8882611dde565b80519091506000906001600160a01b0316336001600160a01b03161480611abf575033611ab48461096d565b6001600160a01b0316145b80611ad157508151611ad19033610820565b905080611b3b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109d8565b846001600160a01b031682600001516001600160a01b031614611baf5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109d8565b6001600160a01b038416611c135760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109d8565b611c236000848460000151611a21565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b95909216949094021790925590611ce8908590612b8c565b6000818152600360205260409020549091506001600160a01b0316611d7a57611d12816000541190565b15611d7a5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610b4a828260405180602001604052806000815250612202565b6040805180820190915260008082526020820152611dfd826000541190565b611e5c5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109d8565b60007f00000000000000000000000000000000000000000000000000000000000000648310611ebd57611eaf7f000000000000000000000000000000000000000000000000000000000000006484612ced565b611eba906001612b8c565b90505b825b818110611f27576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f1457949350505050565b5080611f1f81612d00565b915050611ebf565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109d8565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611fe78584612539565b14949350505050565b60006001600160a01b0384163b156120e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612034903390899088908890600401612d17565b6020604051808303816000875af192505050801561206f575060408051601f3d908101601f1916820190925261206c91810190612d54565b60015b6120cc573d80801561209d576040519150601f19603f3d011682016040523d82523d6000602084013e6120a2565b606091505b5080516000036120c45760405162461bcd60e51b81526004016109d890612bfa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120ea565b5060015b949350505050565b6060600880546108ea906129ba565b6060816000036121285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612152578061213c81612b45565b915061214b9050600a83612d87565b915061212c565b60008167ffffffffffffffff81111561216d5761216d6126a2565b6040519080825280601f01601f191660200182016040528015612197576020820181803683370190505b5090505b84156120ea576121ac600183612ced565b91506121b9600a86612d9b565b6121c4906030612b8c565b60f81b8183815181106121d9576121d9612bcd565b60200101906001600160f81b031916908160001a9053506121fb600a86612d87565b945061219b565b6000546001600160a01b0384166122655760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109d8565b612270816000541190565b156122bd5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109d8565b7f00000000000000000000000000000000000000000000000000000000000000648311156123385760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109d8565b600083116123945760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b60648201526084016109d8565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906123f0908790612daf565b6001600160801b0316815260200185836020015161240e9190612daf565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561252e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124f26000888488611ff0565b61250e5760405162461bcd60e51b81526004016109d890612bfa565b8161251881612b45565b925050808061252690612b45565b9150506124a5565b506000819055611dbc565b600081815b84518110156125a557600085828151811061255b5761255b612bcd565b602002602001015190508083116125815760008381526020829052604090209250612592565b600081815260208490526040902092505b508061259d81612b45565b91505061253e565b509392505050565b6001600160e01b031981168114610de357600080fd5b6000602082840312156125d557600080fd5b813561190f816125ad565b60005b838110156125fb5781810151838201526020016125e3565b50506000910152565b6000815180845261261c8160208601602086016125e0565b601f01601f19169290920160200192915050565b60208152600061190f6020830184612604565b60006020828403121561265557600080fd5b5035919050565b80356001600160a01b038116811461267357600080fd5b919050565b6000806040838503121561268b57600080fd5b6126948361265c565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156126d3576126d36126a2565b604051601f8501601f19908116603f011681019082821181831017156126fb576126fb6126a2565b8160405280935085815286868601111561271457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561274057600080fd5b813567ffffffffffffffff81111561275757600080fd5b8201601f8101841361276857600080fd5b6120ea848235602084016126b8565b8035801515811461267357600080fd5b60006020828403121561279957600080fd5b61190f82612777565b6000602082840312156127b457600080fd5b61190f8261265c565b6000806000606084860312156127d257600080fd5b6127db8461265c565b92506127e96020850161265c565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561283157835183529284019291840191600101612815565b50909695505050505050565b60006020828403121561284f57600080fd5b81356001600160801b038116811461190f57600080fd5b6000806040838503121561287957600080fd5b6128828361265c565b915061289060208401612777565b90509250929050565b6000806000604084860312156128ae57600080fd5b833567ffffffffffffffff808211156128c657600080fd5b818601915086601f8301126128da57600080fd5b8135818111156128e957600080fd5b8760208260051b85010111156128fe57600080fd5b6020928301989097509590910135949350505050565b6000806000806080858703121561292a57600080fd5b6129338561265c565b93506129416020860161265c565b925060408501359150606085013567ffffffffffffffff81111561296457600080fd5b8501601f8101871361297557600080fd5b612984878235602084016126b8565b91505092959194509250565b600080604083850312156129a357600080fd5b6129ac8361265c565b91506128906020840161265c565b600181811c908216806129ce57607f821691505b6020821081036129ee57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610b0f57600081815260208120601f850160051c81016020861015612a505750805b601f850160051c820191505b81811015611dbc57828155600101612a5c565b815167ffffffffffffffff811115612a8957612a896126a2565b612a9d81612a9784546129ba565b84612a29565b602080601f831160018114612ad25760008415612aba5750858301515b600019600386901b1c1916600185901b178555611dbc565b600085815260208120601f198616915b82811015612b0157888601518255948401946001909101908401612ae2565b5085821015612b1f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600060018201612b5757612b57612b2f565b5060010190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b808201808211156108d5576108d5612b2f565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176108d5576108d5612b2f565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600084516020612c608285838a016125e0565b855191840191612c738184848a016125e0565b8554920191600090612c84816129ba565b60018281168015612c9c5760018114612cb157612cdd565b60ff1984168752821515830287019450612cdd565b896000528560002060005b84811015612cd557815489820152908301908701612cbc565b505082870194505b50929a9950505050505050505050565b818103818111156108d5576108d5612b2f565b600081612d0f57612d0f612b2f565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d4a90830184612604565b9695505050505050565b600060208284031215612d6657600080fd5b815161190f816125ad565b634e487b7160e01b600052601260045260246000fd5b600082612d9657612d96612d71565b500490565b600082612daa57612daa612d71565b500690565b6001600160801b03818116838216019080821115612dcf57612dcf612b2f565b509291505056fea2646970667358221220866ee0d424cac62430c1ed951ce540b2fa3b7c0520b0e3608857f246a0bdeebc64736f6c63430008120033
Deployed Bytecode Sourcemap
41634:5103:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29359:372;;;;;;;;;;-1:-1:-1;29359:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29359:372:0;;;;;;;;31164:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32725:214::-;;;;;;;;;;-1:-1:-1;32725:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;32725:214:0;1533:203:1;32246:413:0;;;;;;;;;;-1:-1:-1;32246:413:0;;;;;:::i;:::-;;:::i;:::-;;41817:33;;;;;;;;;;;;;;;;;;;2324:25:1;;;2312:2;2297:18;41817:33:0;2178:177:1;46298:100:0;;;;;;;;;;-1:-1:-1;46298:100:0;;;;;:::i;:::-;;:::i;46404:77::-;;;;;;;;;;-1:-1:-1;46404:77:0;;;;;:::i;:::-;;:::i;27800:100::-;;;;;;;;;;-1:-1:-1;27853:7:0;27880:12;27800:100;;42157:55;;;;;;;;;;-1:-1:-1;42157:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;41933:39;;;;;;;;;;;;;;;;33601:162;;;;;;;;;;-1:-1:-1;33601:162:0;;;;;:::i;:::-;;:::i;28464:823::-;;;;;;;;;;-1:-1:-1;28464:823:0;;;;;:::i;:::-;;:::i;45661:95::-;;;;;;;;;;-1:-1:-1;45661:95:0;;;;;:::i;:::-;;:::i;46487:137::-;;;;;;;;;;;;;:::i;41977:30::-;;;;;;;;;;;;;;;;43914:138;;;;;;;;;;-1:-1:-1;43914:138:0;;;;;:::i;:::-;;:::i;33834:177::-;;;;;;;;;;-1:-1:-1;33834:177:0;;;;;:::i;:::-;;:::i;44311:635::-;;;;;;;;;;-1:-1:-1;44311:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45762:74::-;;;;;;;;;;-1:-1:-1;45762:74:0;;;;;:::i;:::-;;:::i;27977:187::-;;;;;;;;;;-1:-1:-1;27977:187:0;;;;;:::i;:::-;;:::i;45940:132::-;;;;;;;;;;-1:-1:-1;45940:132:0;;;;;:::i;:::-;;:::i;42044:28::-;;;;;;;;;;-1:-1:-1;42044:28:0;;;;;;;;;;;41739:33;;;;;;;;;;;;;:::i;42014:25::-;;;;;;;;;;-1:-1:-1;42014:25:0;;;;;;;;41706:28;;;;;;;;;;;;;:::i;30973:124::-;;;;;;;;;;-1:-1:-1;30973:124:0;;;;;:::i;:::-;;:::i;45842:92::-;;;;;;;;;;-1:-1:-1;45842:92:0;;;;;:::i;:::-;;:::i;44058:247::-;;;;;;;;;;-1:-1:-1;44058:247:0;;;;;:::i;:::-;;:::i;29795:221::-;;;;;;;;;;-1:-1:-1;29795:221:0;;;;;:::i;:::-;;:::i;4735:103::-;;;;;;;;;;;;;:::i;46192:100::-;;;;;;;;;;-1:-1:-1;46192:100:0;;;;;:::i;:::-;;:::i;4084:87::-;;;;;;;;;;-1:-1:-1;4157:6:0;;-1:-1:-1;;;;;4157:6:0;4084:87;;41891:37;;;;;;;;;;;;;;;;31333:104;;;;;;;;;;;;;:::i;42077:34::-;;;;;;;;;;-1:-1:-1;42077:34:0;;;;;;;;;;;42954:296;;;;;;:::i;:::-;;:::i;33011:288::-;;;;;;;;;;-1:-1:-1;33011:288:0;;;;;:::i;:::-;;:::i;41777:31::-;;;;;;;;;;;;;:::i;43256:650::-;;;;;;:::i;:::-;;:::i;42118:34::-;;;;;;;;;;;;;;;;34082:355;;;;;;;;;;-1:-1:-1;34082:355:0;;;;;:::i;:::-;;:::i;45539:116::-;;;;;;;;;;-1:-1:-1;45539:116:0;;;;;:::i;:::-;;:::i;44952:494::-;;;;;;;;;;-1:-1:-1;44952:494:0;;;;;:::i;:::-;;:::i;41855:31::-;;;;;;;;;;;;;;;;45452:81;;;;;;;;;;-1:-1:-1;45452:81:0;;;;;:::i;:::-;;:::i;46078:108::-;;;;;;;;;;-1:-1:-1;46078:108:0;;;;;:::i;:::-;;:::i;33370:164::-;;;;;;;;;;-1:-1:-1;33370:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33491:25:0;;;33467:4;33491:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33370:164;4993:201;;;;;;;;;;-1:-1:-1;4993:201:0;;;;;:::i;:::-;;:::i;29359:372::-;29461:4;-1:-1:-1;;;;;;29498:40:0;;-1:-1:-1;;;29498:40:0;;:105;;-1:-1:-1;;;;;;;29555:48:0;;-1:-1:-1;;;29555:48:0;29498:105;:172;;;-1:-1:-1;;;;;;;29620:50:0;;-1:-1:-1;;;29620:50:0;29498:172;:225;;;-1:-1:-1;;;;;;;;;;16625:40:0;;;29687:36;29478:245;29359:372;-1:-1:-1;;29359:372:0:o;31164:100::-;31218:13;31251:5;31244:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31164:100;:::o;32725:214::-;32793:7;32821:16;32829:7;34749:4;34783:12;-1:-1:-1;34773:22:0;34692:111;32821:16;32813:74;;;;-1:-1:-1;;;32813:74:0;;8246:2:1;32813:74:0;;;8228:21:1;8285:2;8265:18;;;8258:30;8324:34;8304:18;;;8297:62;-1:-1:-1;;;8375:18:1;;;8368:43;8428:19;;32813:74:0;;;;;;;;;-1:-1:-1;32907:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32907:24:0;;32725:214::o;32246:413::-;32319:13;32335:24;32351:7;32335:15;:24::i;:::-;32319:40;;32384:5;-1:-1:-1;;;;;32378:11:0;:2;-1:-1:-1;;;;;32378:11:0;;32370:58;;;;-1:-1:-1;;;32370:58:0;;8660:2:1;32370:58:0;;;8642:21:1;8699:2;8679:18;;;8672:30;8738:34;8718:18;;;8711:62;-1:-1:-1;;;8789:18:1;;;8782:32;8831:19;;32370:58:0;8458:398:1;32370:58:0;2888:10;-1:-1:-1;;;;;32463:21:0;;;;:62;;-1:-1:-1;32488:37:0;32505:5;2888:10;33370:164;:::i;32488:37::-;32441:169;;;;-1:-1:-1;;;32441:169:0;;9063:2:1;32441:169:0;;;9045:21:1;9102:2;9082:18;;;9075:30;9141:34;9121:18;;;9114:62;9212:27;9192:18;;;9185:55;9257:19;;32441:169:0;8861:421:1;32441:169:0;32623:28;32632:2;32636:7;32645:5;32623:8;:28::i;:::-;32308:351;32246:413;;:::o;46298:100::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;46370:9:::1;:22;46382:10:::0;46370:9;:22:::1;:::i;:::-;;46298:100:::0;:::o;46404:77::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;46460:6:::1;:15:::0;;-1:-1:-1;;46460:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46404:77::o;33601:162::-;33727:28;33737:4;33743:2;33747:7;33727:9;:28::i;28464:823::-;28553:7;28589:16;28599:5;28589:9;:16::i;:::-;28581:5;:24;28573:71;;;;-1:-1:-1;;;28573:71:0;;12054:2:1;28573:71:0;;;12036:21:1;12093:2;12073:18;;;12066:30;12132:34;12112:18;;;12105:62;-1:-1:-1;;;12183:18:1;;;12176:32;12225:19;;28573:71:0;11852:398:1;28573:71:0;28655:22;27880:12;;;28655:22;;28787:426;28811:14;28807:1;:18;28787:426;;;28847:31;28881:14;;;:11;:14;;;;;;;;;28847:48;;;;;;;;;-1:-1:-1;;;;;28847:48:0;;;;;-1:-1:-1;;;28847:48:0;;;;;;;;;;;;28914:28;28910:103;;28983:14;;;-1:-1:-1;28910:103:0;29052:5;-1:-1:-1;;;;;29031:26:0;:17;-1:-1:-1;;;;;29031:26:0;;29027:175;;29097:5;29082:11;:20;29078:77;;-1:-1:-1;29134:1:0;-1:-1:-1;29127:8:0;;-1:-1:-1;;;29127:8:0;29078:77;29173:13;;;;:::i;:::-;;;;29027:175;-1:-1:-1;28827:3:0;;;;:::i;:::-;;;;28787:426;;;-1:-1:-1;29223:56:0;;-1:-1:-1;;;29223:56:0;;12729:2:1;29223:56:0;;;12711:21:1;12768:2;12748:18;;;12741:30;12807:34;12787:18;;;12780:62;-1:-1:-1;;;12858:18:1;;;12851:44;12912:19;;29223:56:0;12527:410:1;45661:95:0;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;45726:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;45726:24:0;;::::1;::::0;;;::::1;::::0;;45661:95::o;46487:137::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;46532:7:::1;46553;4157:6:::0;;-1:-1:-1;;;;;4157:6:0;;4084:87;46553:7:::1;-1:-1:-1::0;;;;;46545:21:0::1;46574;46545:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46531:69;;;46615:2;46607:11;;;::::0;::::1;;46524:100;46487:137::o:0;43914:138::-;43989:11;42792:1;42778:11;:15;:52;;;;;42812:18;;42797:11;:33;;42778:52;42770:85;;;;-1:-1:-1;;;42770:85:0;;;;;;;:::i;:::-;42900:9;;42885:11;42870:12;;:26;;;;:::i;:::-;:39;;42862:72;;;;-1:-1:-1;;;42862:72:0;;;;;;;:::i;:::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23:::1;4296:68;;;;-1:-1:-1::0;;;4296:68:0::1;;;;;;;:::i;:::-;44019:27:::2;44029:3;44034:11;44019:9;:27::i;33834:177::-:0;33964:39;33981:4;33987:2;33991:7;33964:39;;;;;;;;;;;;:16;:39::i;44311:635::-;44386:16;44414:23;44440:17;44450:6;44440:9;:17::i;:::-;44414:43;;44464:30;44511:15;44497:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44497:30:0;;44464:63;;44534:22;44567:23;44603:309;44628:15;44610;:33;:64;;;;;44665:9;;44647:14;:27;;44610:64;44603:309;;;44685:25;44713:23;44721:14;44713:7;:23::i;:::-;44685:51;;44772:6;-1:-1:-1;;;;;44751:27:0;:17;-1:-1:-1;;;;;44751:27:0;;44747:131;;44824:14;44791:13;44805:15;44791:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;44851:17;;;;:::i;:::-;;;;44747:131;44888:16;;;;:::i;:::-;;;;44676:236;44603:309;;;-1:-1:-1;44927:13:0;;44311:635;-1:-1:-1;;;;44311:635:0:o;45762:74::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;45818:4:::1;:12:::0;45762:74::o;27977:187::-;28044:7;27880:12;;28072:5;:21;28064:69;;;;-1:-1:-1;;;28064:69:0;;14314:2:1;28064:69:0;;;14296:21:1;14353:2;14333:18;;;14326:30;14392:34;14372:18;;;14365:62;-1:-1:-1;;;14443:18:1;;;14436:33;14486:19;;28064:69:0;14112:399:1;28064:69:0;-1:-1:-1;28151:5:0;27977:187::o;45940:132::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;46028:17:::1;:38;46048:18:::0;46028:17;:38:::1;:::i;41739:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41706:28::-;;;;;;;:::i;30973:124::-;31037:7;31064:20;31076:7;31064:11;:20::i;:::-;:25;;30973:124;-1:-1:-1;;30973:124:0:o;45842:92::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45907:21:0::1;:9;:21:::0;45842:92::o;44058:247::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;44150:1:::1;44136:11;:15;44128:49;;;;-1:-1:-1::0;;;44128:49:0::1;;;;;;;:::i;:::-;44222:9;;44207:11;44192:12;;:26;;;;:::i;:::-;:39;;44184:72;;;;-1:-1:-1::0;;;44184:72:0::1;;;;;;;:::i;:::-;44265:34;44275:10;44287:11;44265:9;:34::i;29795:221::-:0;29859:7;-1:-1:-1;;;;;29887:19:0;;29879:75;;;;-1:-1:-1;;;29879:75:0;;14718:2:1;29879:75:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;-1:-1:-1;;;14847:18:1;;;14840:41;14898:19;;29879:75:0;14516:407:1;29879:75:0;-1:-1:-1;;;;;;29980:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29980:27:0;;29795:221::o;4735:103::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;4800:30:::1;4827:1;4800:18;:30::i;:::-;4735:103::o:0;46192:100::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;46264:9:::1;:22;46276:10:::0;46264:9;:22:::1;:::i;31333:104::-:0;31389:13;31422:7;31415:14;;;;;:::i;42954:296::-;43019:11;42792:1;42778:11;:15;:52;;;;;42812:18;;42797:11;:33;;42778:52;42770:85;;;;-1:-1:-1;;;42770:85:0;;;;;;;:::i;:::-;42900:9;;42885:11;42870:12;;:26;;;;:::i;:::-;:39;;42862:72;;;;-1:-1:-1;;;42862:72:0;;;;;;;:::i;:::-;43048:6:::1;::::0;::::1;;43047:7;43039:43;;;::::0;-1:-1:-1;;;43039:43:0;;15130:2:1;43039:43:0::1;::::0;::::1;15112:21:1::0;15169:2;15149:18;;;15142:30;-1:-1:-1;;;15188:18:1;;;15181:53;15251:18;;43039:43:0::1;14928:347:1::0;43039:43:0::1;43098:15;::::0;;;::::1;;;43097:16;43089:42;;;::::0;-1:-1:-1;;;43089:42:0;;15482:2:1;43089:42:0::1;::::0;::::1;15464:21:1::0;15521:2;15501:18;;;15494:30;-1:-1:-1;;;15540:18:1;;;15533:43;15593:18;;43089:42:0::1;15280:337:1::0;43089:42:0::1;43166:11;43159:4;;:18;;;;:::i;:::-;43146:9;:31;;43138:63;;;::::0;-1:-1:-1;;;43138:63:0;;15997:2:1;43138:63:0::1;::::0;::::1;15979:21:1::0;16036:2;16016:18;;;16009:30;-1:-1:-1;;;16055:18:1;;;16048:49;16114:18;;43138:63:0::1;15795:343:1::0;43138:63:0::1;43210:34;43220:10;43232:11;43210:9;:34::i;33011:288::-:0;2888:10;-1:-1:-1;;;;;33106:24:0;;;33098:63;;;;-1:-1:-1;;;33098:63:0;;16345:2:1;33098:63:0;;;16327:21:1;16384:2;16364:18;;;16357:30;16423:28;16403:18;;;16396:56;16469:18;;33098:63:0;16143:350:1;33098:63:0;2888:10;33174:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33174:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33174:53:0;;;;;;;;;;33243:48;;540:41:1;;;33174:42:0;;2888:10;33243:48;;513:18:1;33243:48:0;;;;;;;33011:288;;:::o;41777:31::-;;;;;;;:::i;43256:650::-;43366:11;;43379:19;;42520:128;42553:11;;42520:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42608:28:0;;-1:-1:-1;;42625:10:0;16647:2:1;16643:15;16639:53;42608:28:0;;;16627:66:1;42579:4:0;;-1:-1:-1;16709:12:1;;;-1:-1:-1;42608:28:0;;;;;;;;;;;;42598:39;;;;;;42520:18;:128::i;:::-;42502:196;;;;-1:-1:-1;;;42502:196:0;;16934:2:1;42502:196:0;;;16916:21:1;16973:2;16953:18;;;16946:30;17012:32;16992:18;;;16985:60;17062:18;;42502:196:0;16732:354:1;42502:196:0;43454:10:::1;43406:24;43433:32:::0;;;:20:::1;:32;::::0;;;;;43481:6:::1;::::0;::::1;;43480:7;43472:43;;;::::0;-1:-1:-1;;;43472:43:0;;15130:2:1;43472:43:0::1;::::0;::::1;15112:21:1::0;15169:2;15149:18;;;15142:30;-1:-1:-1;;;15188:18:1;;;15181:53;15251:18;;43472:43:0::1;14928:347:1::0;43472:43:0::1;43530:15;::::0;;;::::1;;;43522:45;;;::::0;-1:-1:-1;;;43522:45:0;;17293:2:1;43522:45:0::1;::::0;::::1;17275:21:1::0;17332:2;17312:18;;;17305:30;-1:-1:-1;;;17351:18:1;;;17344:47;17408:18;;43522:45:0::1;17091:341:1::0;43522:45:0::1;43616:20;::::0;43582:30:::1;43601:11:::0;43582:16;:30:::1;:::i;:::-;:54;;43574:95;;;::::0;-1:-1:-1;;;43574:95:0;;17639:2:1;43574:95:0::1;::::0;::::1;17621:21:1::0;17678:2;17658:18;;;17651:30;17717;17697:18;;;17690:58;17765:18;;43574:95:0::1;17437:352:1::0;43574:95:0::1;43710:9;;43696:11;43681:12;;:26;;;;:::i;:::-;:38;43678:124;;;43759:11;43752:4;;:18;;;;:::i;:::-;43739:9;:31;;43731:63;;;::::0;-1:-1:-1;;;43731:63:0;;15997:2:1;43731:63:0::1;::::0;::::1;15979:21:1::0;16036:2;16016:18;;;16009:30;-1:-1:-1;;;16055:18:1;;;16048:49;16114:18;;43731:63:0::1;15795:343:1::0;43731:63:0::1;43835:10;43814:32;::::0;;;:20:::1;:32;::::0;;;;:45;;43848:11;;43814:32;:45:::1;::::0;43848:11;;43814:45:::1;:::i;:::-;::::0;;;-1:-1:-1;43866:34:0::1;::::0;-1:-1:-1;43876:10:0::1;43888:11:::0;43866:9:::1;:34::i;:::-;43399:507;43256:650:::0;;;;;;:::o;34082:355::-;34241:28;34251:4;34257:2;34261:7;34241:9;:28::i;:::-;34302:48;34325:4;34331:2;34335:7;34344:5;34302:22;:48::i;:::-;34280:149;;;;-1:-1:-1;;;34280:149:0;;;;;;;:::i;:::-;34082:355;;;;:::o;45539:116::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;45617:19:::1;:32:::0;45539:116::o;44952:494::-;45051:13;45092:17;45100:8;34749:4;34783:12;-1:-1:-1;34773:22:0;34692:111;45092:17;45076:98;;;;-1:-1:-1;;;45076:98:0;;18416:2:1;45076:98:0;;;18398:21:1;18455:2;18435:18;;;18428:30;18494:34;18474:18;;;18467:62;-1:-1:-1;;;18545:18:1;;;18538:45;18600:19;;45076:98:0;18214:411:1;45076:98:0;45187:8;;;;;;;:17;;45199:5;45187:17;45183:64;;45222:17;45215:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44952:494;;;:::o;45183:64::-;45255:28;45286:10;:8;:10::i;:::-;45255:41;;45341:1;45316:14;45310:28;:32;:130;;;;;;;;;;;;;;;;;45378:14;45394:19;:8;:17;:19::i;:::-;45415:9;45361:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45310:130;45303:137;44952:494;-1:-1:-1;;;44952:494:0:o;45452:81::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;45510:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;45510:17:0;;::::1;::::0;;;::::1;::::0;;45452:81::o;46078:108::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;46151:20:::1;:29:::0;46078:108::o;4993:201::-;4157:6;;-1:-1:-1;;;;;4157:6:0;2888:10;4304:23;4296:68;;;;-1:-1:-1;;;4296:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5082:22:0;::::1;5074:73;;;::::0;-1:-1:-1;;;5074:73:0;;20093:2:1;5074:73:0::1;::::0;::::1;20075:21:1::0;20132:2;20112:18;;;20105:30;20171:34;20151:18;;;20144:62;-1:-1:-1;;;20222:18:1;;;20215:36;20268:19;;5074:73:0::1;19891:402:1::0;5074:73:0::1;5158:28;5177:8;5158:18;:28::i;38818:196::-:0;38933:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;38933:29:0;-1:-1:-1;;;;;38933:29:0;;;;;;;;;38978:28;;38933:24;;38978:28;;;;;;;38818:196;;;:::o;36917:1783::-;37032:35;37070:20;37082:7;37070:11;:20::i;:::-;37145:18;;37032:58;;-1:-1:-1;37103:22:0;;-1:-1:-1;;;;;37129:34:0;2888:10;-1:-1:-1;;;;;37129:34:0;;:87;;;-1:-1:-1;2888:10:0;37180:20;37192:7;37180:11;:20::i;:::-;-1:-1:-1;;;;;37180:36:0;;37129:87;:154;;;-1:-1:-1;37250:18:0;;37233:50;;2888:10;33370:164;:::i;37233:50::-;37103:181;;37305:17;37297:80;;;;-1:-1:-1;;;37297:80:0;;20500:2:1;37297:80:0;;;20482:21:1;20539:2;20519:18;;;20512:30;20578:34;20558:18;;;20551:62;-1:-1:-1;;;20629:18:1;;;20622:48;20687:19;;37297:80:0;20298:414:1;37297:80:0;37420:4;-1:-1:-1;;;;;37398:26:0;:13;:18;;;-1:-1:-1;;;;;37398:26:0;;37390:77;;;;-1:-1:-1;;;37390:77:0;;20919:2:1;37390:77:0;;;20901:21:1;20958:2;20938:18;;;20931:30;20997:34;20977:18;;;20970:62;-1:-1:-1;;;21048:18:1;;;21041:36;21094:19;;37390:77:0;20717:402:1;37390:77:0;-1:-1:-1;;;;;37486:16:0;;37478:66;;;;-1:-1:-1;;;37478:66:0;;21326:2:1;37478:66:0;;;21308:21:1;21365:2;21345:18;;;21338:30;21404:34;21384:18;;;21377:62;-1:-1:-1;;;21455:18:1;;;21448:35;21500:19;;37478:66:0;21124:401:1;37478:66:0;37665:49;37682:1;37686:7;37695:13;:18;;;37665:8;:49::i;:::-;-1:-1:-1;;;;;37919:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37919:31:0;;;-1:-1:-1;;;;;37919:31:0;;;-1:-1:-1;;37919:31:0;;;;;;;37965:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37965:29:0;;;;;;;;;;;;;38041:43;;;;;;;;;;38067:15;38041:43;;;;;;;;;;38018:20;;;:11;:20;;;;;;:66;;;;;;;;-1:-1:-1;;;;;;38018:66:0;;;;;;;-1:-1:-1;;;38018:66:0;;;;;;;;;;;;37919:18;38346:11;;38018:20;;38346:11;:::i;:::-;38413:1;38372:24;;;:11;:24;;;;;:29;38324:33;;-1:-1:-1;;;;;;38372:29:0;38368:227;;38436:20;38444:11;34749:4;34783:12;-1:-1:-1;34773:22:0;34692:111;38436:20;38432:152;;;38504:64;;;;;;;;38519:18;;-1:-1:-1;;;;;38504:64:0;;;;;;38539:28;;;;38504:64;;;;;;;;;;-1:-1:-1;38477:24:0;;;:11;:24;;;;;;;:91;;;;;;;;;-1:-1:-1;;;38477:91:0;-1:-1:-1;;;;;;38477:91:0;;;;;;;;;;;;38432:152;38631:7;38627:2;-1:-1:-1;;;;;38612:27:0;38621:4;-1:-1:-1;;;;;38612:27:0;;;;;;;;;;;38650:42;37021:1679;;;36917:1783;;;:::o;34811:104::-;34880:27;34890:2;34894:8;34880:27;;;;;;;;;;;;:9;:27::i;30261:650::-;-1:-1:-1;;;;;;;;;;;;;;;;;30364:16:0;30372:7;34749:4;34783:12;-1:-1:-1;34773:22:0;34692:111;30364:16;30356:71;;;;-1:-1:-1;;;30356:71:0;;21732:2:1;30356:71:0;;;21714:21:1;21771:2;21751:18;;;21744:30;21810:34;21790:18;;;21783:62;-1:-1:-1;;;21861:18:1;;;21854:40;21911:19;;30356:71:0;21530:406:1;30356:71:0;30440:26;30492:12;30481:7;:23;30477:103;;30542:22;30552:12;30542:7;:22;:::i;:::-;:26;;30567:1;30542:26;:::i;:::-;30521:47;;30477:103;30612:7;30592:242;30629:18;30621:4;:26;30592:242;;30672:31;30706:17;;;:11;:17;;;;;;;;;30672:51;;;;;;;;;-1:-1:-1;;;;;30672:51:0;;;;;-1:-1:-1;;;30672:51:0;;;;;;;;;;;;30742:28;30738:85;;30798:9;30261:650;-1:-1:-1;;;;30261:650:0:o;30738:85::-;-1:-1:-1;30649:6:0;;;;:::i;:::-;;;;30592:242;;;-1:-1:-1;30846:57:0;;-1:-1:-1;;;30846:57:0;;22417:2:1;30846:57:0;;;22399:21:1;22456:2;22436:18;;;22429:30;22495:34;22475:18;;;22468:62;-1:-1:-1;;;22546:18:1;;;22539:45;22601:19;;30846:57:0;22215:411:1;5354:191:0;5447:6;;;-1:-1:-1;;;;;5464:17:0;;;-1:-1:-1;;;;;;5464:17:0;;;;;;;5497:40;;5447:6;;;5464:17;5447:6;;5497:40;;5428:16;;5497:40;5417:128;5354:191;:::o;24255:190::-;24380:4;24433;24404:25;24417:5;24424:4;24404:12;:25::i;:::-;:33;;24255:190;-1:-1:-1;;;;24255:190:0:o;39579:804::-;39734:4;-1:-1:-1;;;;;39755:13:0;;6695:20;6743:8;39751:625;;39791:72;;-1:-1:-1;;;39791:72:0;;-1:-1:-1;;;;;39791:36:0;;;;;:72;;2888:10;;39842:4;;39848:7;;39857:5;;39791:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39791:72:0;;;;;;;;-1:-1:-1;;39791:72:0;;;;;;;;;;;;:::i;:::-;;;39787:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40037:6;:13;40054:1;40037:18;40033:273;;40080:61;;-1:-1:-1;;;40080:61:0;;;;;;;:::i;40033:273::-;40256:6;40250:13;40241:6;40237:2;40233:15;40226:38;39787:534;-1:-1:-1;;;;;;39914:55:0;-1:-1:-1;;;39914:55:0;;-1:-1:-1;39907:62:0;;39751:625;-1:-1:-1;40360:4:0;39751:625;39579:804;;;;;;:::o;46630:104::-;46690:13;46719:9;46712:16;;;;;:::i;370:723::-;426:13;647:5;656:1;647:10;643:53;;-1:-1:-1;;674:10:0;;;;;;;;;;;;-1:-1:-1;;;674:10:0;;;;;370:723::o;643:53::-;721:5;706:12;762:78;769:9;;762:78;;795:8;;;;:::i;:::-;;-1:-1:-1;818:10:0;;-1:-1:-1;826:2:0;818:10;;:::i;:::-;;;762:78;;;850:19;882:6;872:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;872:17:0;;850:39;;900:154;907:10;;900:154;;934:11;944:1;934:11;;:::i;:::-;;-1:-1:-1;1003:10:0;1011:2;1003:5;:10;:::i;:::-;990:24;;:2;:24;:::i;:::-;977:39;;960:6;967;960:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;960:56:0;;;;;;;;-1:-1:-1;1031:11:0;1040:2;1031:11;;:::i;:::-;;;900:154;;35192:1471;35315:20;35338:12;-1:-1:-1;;;;;35369:16:0;;35361:62;;;;-1:-1:-1;;;35361:62:0;;23955:2:1;35361:62:0;;;23937:21:1;23994:2;23974:18;;;23967:30;24033:34;24013:18;;;24006:62;-1:-1:-1;;;24084:18:1;;;24077:31;24125:19;;35361:62:0;23753:397:1;35361:62:0;35568:21;35576:12;34749:4;34783:12;-1:-1:-1;34773:22:0;34692:111;35568:21;35567:22;35559:64;;;;-1:-1:-1;;;35559:64:0;;24357:2:1;35559:64:0;;;24339:21:1;24396:2;24376:18;;;24369:30;24435:31;24415:18;;;24408:59;24484:18;;35559:64:0;24155:353:1;35559:64:0;35654:12;35642:8;:24;;35634:71;;;;-1:-1:-1;;;35634:71:0;;24715:2:1;35634:71:0;;;24697:21:1;24754:2;24734:18;;;24727:30;24793:34;24773:18;;;24766:62;-1:-1:-1;;;24844:18:1;;;24837:32;24886:19;;35634:71:0;24513:398:1;35634:71:0;35735:1;35724:8;:12;35716:60;;;;-1:-1:-1;;;35716:60:0;;25118:2:1;35716:60:0;;;25100:21:1;25157:2;25137:18;;;25130:30;25196:34;25176:18;;;25169:62;-1:-1:-1;;;25247:18:1;;;25240:33;25290:19;;35716:60:0;24916:399:1;35716:60:0;-1:-1:-1;;;;;35896:16:0;;35863:30;35896:16;;;:12;:16;;;;;;;;;35863:49;;;;;;;;;-1:-1:-1;;;;;35863:49:0;;;;;-1:-1:-1;;;35863:49:0;;;;;;;;;;;35942:135;;;;;;;;35968:19;;35863:49;;35942:135;;;35968:39;;35998:8;;35968:39;:::i;:::-;-1:-1:-1;;;;;35942:135:0;;;;;36057:8;36022:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;35942:135:0;;;;;;-1:-1:-1;;;;;35923:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;35923:154:0;;;;;;;;;;;;36116:43;;;;;;;;;;;36142:15;36116:43;;;;;;;;36088:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;36088:71:0;-1:-1:-1;;;;;;36088:71:0;;;;;;;;;;;;;;;;;;36100:12;;36220:325;36244:8;36240:1;:12;36220:325;;;36279:38;;36304:12;;-1:-1:-1;;;;;36279:38:0;;;36296:1;;36279:38;;36296:1;;36279:38;36358:59;36389:1;36393:2;36397:12;36411:5;36358:22;:59::i;:::-;36332:172;;;;-1:-1:-1;;;36332:172:0;;;;;;;:::i;:::-;36519:14;;;;:::i;:::-;;;;36254:3;;;;;:::i;:::-;;;;36220:325;;;-1:-1:-1;36557:12:0;:27;;;36595:60;34082:355;24807:675;24890:7;24933:4;24890:7;24948:497;24972:5;:12;24968:1;:16;24948:497;;;25006:20;25029:5;25035:1;25029:8;;;;;;;;:::i;:::-;;;;;;;25006:31;;25072:12;25056;:28;25052:382;;25558:13;25608:15;;;25644:4;25637:15;;;25691:4;25675:21;;25184:57;;25052:382;;;25558:13;25608:15;;;25644:4;25637:15;;;25691:4;25675:21;;25361:57;;25052:382;-1:-1:-1;24986:3:0;;;;:::i;:::-;;;;24948:497;;;-1:-1:-1;25462:12:0;24807:675;-1:-1:-1;;;24807:675:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:127::-;2421:10;2416:3;2412:20;2409:1;2402:31;2452:4;2449:1;2442:15;2476:4;2473:1;2466:15;2492:632;2557:5;2587:18;2628:2;2620:6;2617:14;2614:40;;;2634:18;;:::i;:::-;2709:2;2703:9;2677:2;2763:15;;-1:-1:-1;;2759:24:1;;;2785:2;2755:33;2751:42;2739:55;;;2809:18;;;2829:22;;;2806:46;2803:72;;;2855:18;;:::i;:::-;2895:10;2891:2;2884:22;2924:6;2915:15;;2954:6;2946;2939:22;2994:3;2985:6;2980:3;2976:16;2973:25;2970:45;;;3011:1;3008;3001:12;2970:45;3061:6;3056:3;3049:4;3041:6;3037:17;3024:44;3116:1;3109:4;3100:6;3092;3088:19;3084:30;3077:41;;;;2492:632;;;;;:::o;3129:451::-;3198:6;3251:2;3239:9;3230:7;3226:23;3222:32;3219:52;;;3267:1;3264;3257:12;3219:52;3307:9;3294:23;3340:18;3332:6;3329:30;3326:50;;;3372:1;3369;3362:12;3326:50;3395:22;;3448:4;3440:13;;3436:27;-1:-1:-1;3426:55:1;;3477:1;3474;3467:12;3426:55;3500:74;3566:7;3561:2;3548:16;3543:2;3539;3535:11;3500:74;:::i;3585:160::-;3650:20;;3706:13;;3699:21;3689:32;;3679:60;;3735:1;3732;3725:12;3750:180;3806:6;3859:2;3847:9;3838:7;3834:23;3830:32;3827:52;;;3875:1;3872;3865:12;3827:52;3898:26;3914:9;3898:26;:::i;3935:186::-;3994:6;4047:2;4035:9;4026:7;4022:23;4018:32;4015:52;;;4063:1;4060;4053:12;4015:52;4086:29;4105:9;4086:29;:::i;4126:328::-;4203:6;4211;4219;4272:2;4260:9;4251:7;4247:23;4243:32;4240:52;;;4288:1;4285;4278:12;4240:52;4311:29;4330:9;4311:29;:::i;:::-;4301:39;;4359:38;4393:2;4382:9;4378:18;4359:38;:::i;:::-;4349:48;;4444:2;4433:9;4429:18;4416:32;4406:42;;4126:328;;;;;:::o;4459:632::-;4630:2;4682:21;;;4752:13;;4655:18;;;4774:22;;;4601:4;;4630:2;4853:15;;;;4827:2;4812:18;;;4601:4;4896:169;4910:6;4907:1;4904:13;4896:169;;;4971:13;;4959:26;;5040:15;;;;5005:12;;;;4932:1;4925:9;4896:169;;;-1:-1:-1;5082:3:1;;4459:632;-1:-1:-1;;;;;;4459:632:1:o;5096:301::-;5155:6;5208:2;5196:9;5187:7;5183:23;5179:32;5176:52;;;5224:1;5221;5214:12;5176:52;5263:9;5250:23;-1:-1:-1;;;;;5306:5:1;5302:46;5295:5;5292:57;5282:85;;5363:1;5360;5353:12;5402:254;5467:6;5475;5528:2;5516:9;5507:7;5503:23;5499:32;5496:52;;;5544:1;5541;5534:12;5496:52;5567:29;5586:9;5567:29;:::i;:::-;5557:39;;5615:35;5646:2;5635:9;5631:18;5615:35;:::i;:::-;5605:45;;5402:254;;;;;:::o;5661:689::-;5756:6;5764;5772;5825:2;5813:9;5804:7;5800:23;5796:32;5793:52;;;5841:1;5838;5831:12;5793:52;5881:9;5868:23;5910:18;5951:2;5943:6;5940:14;5937:34;;;5967:1;5964;5957:12;5937:34;6005:6;5994:9;5990:22;5980:32;;6050:7;6043:4;6039:2;6035:13;6031:27;6021:55;;6072:1;6069;6062:12;6021:55;6112:2;6099:16;6138:2;6130:6;6127:14;6124:34;;;6154:1;6151;6144:12;6124:34;6209:7;6202:4;6192:6;6189:1;6185:14;6181:2;6177:23;6173:34;6170:47;6167:67;;;6230:1;6227;6220:12;6167:67;6261:4;6253:13;;;;6285:6;;-1:-1:-1;6323:20:1;;;;6310:34;;5661:689;-1:-1:-1;;;;5661:689:1:o;6537:667::-;6632:6;6640;6648;6656;6709:3;6697:9;6688:7;6684:23;6680:33;6677:53;;;6726:1;6723;6716:12;6677:53;6749:29;6768:9;6749:29;:::i;:::-;6739:39;;6797:38;6831:2;6820:9;6816:18;6797:38;:::i;:::-;6787:48;;6882:2;6871:9;6867:18;6854:32;6844:42;;6937:2;6926:9;6922:18;6909:32;6964:18;6956:6;6953:30;6950:50;;;6996:1;6993;6986:12;6950:50;7019:22;;7072:4;7064:13;;7060:27;-1:-1:-1;7050:55:1;;7101:1;7098;7091:12;7050:55;7124:74;7190:7;7185:2;7172:16;7167:2;7163;7159:11;7124:74;:::i;:::-;7114:84;;;6537:667;;;;;;;:::o;7394:260::-;7462:6;7470;7523:2;7511:9;7502:7;7498:23;7494:32;7491:52;;;7539:1;7536;7529:12;7491:52;7562:29;7581:9;7562:29;:::i;:::-;7552:39;;7610:38;7644:2;7633:9;7629:18;7610:38;:::i;7659:380::-;7738:1;7734:12;;;;7781;;;7802:61;;7856:4;7848:6;7844:17;7834:27;;7802:61;7909:2;7901:6;7898:14;7878:18;7875:38;7872:161;;7955:10;7950:3;7946:20;7943:1;7936:31;7990:4;7987:1;7980:15;8018:4;8015:1;8008:15;7872:161;;7659:380;;;:::o;9287:356::-;9489:2;9471:21;;;9508:18;;;9501:30;9567:34;9562:2;9547:18;;9540:62;9634:2;9619:18;;9287:356::o;9774:545::-;9876:2;9871:3;9868:11;9865:448;;;9912:1;9937:5;9933:2;9926:17;9982:4;9978:2;9968:19;10052:2;10040:10;10036:19;10033:1;10029:27;10023:4;10019:38;10088:4;10076:10;10073:20;10070:47;;;-1:-1:-1;10111:4:1;10070:47;10166:2;10161:3;10157:12;10154:1;10150:20;10144:4;10140:31;10130:41;;10221:82;10239:2;10232:5;10229:13;10221:82;;;10284:17;;;10265:1;10254:13;10221:82;;10495:1352;10621:3;10615:10;10648:18;10640:6;10637:30;10634:56;;;10670:18;;:::i;:::-;10699:97;10789:6;10749:38;10781:4;10775:11;10749:38;:::i;:::-;10743:4;10699:97;:::i;:::-;10851:4;;10915:2;10904:14;;10932:1;10927:663;;;;11634:1;11651:6;11648:89;;;-1:-1:-1;11703:19:1;;;11697:26;11648:89;-1:-1:-1;;10452:1:1;10448:11;;;10444:24;10440:29;10430:40;10476:1;10472:11;;;10427:57;11750:81;;10897:944;;10927:663;9721:1;9714:14;;;9758:4;9745:18;;-1:-1:-1;;10963:20:1;;;11081:236;11095:7;11092:1;11089:14;11081:236;;;11184:19;;;11178:26;11163:42;;11276:27;;;;11244:1;11232:14;;;;11111:19;;11081:236;;;11085:3;11345:6;11336:7;11333:19;11330:201;;;11406:19;;;11400:26;-1:-1:-1;;11489:1:1;11485:14;;;11501:3;11481:24;11477:37;11473:42;11458:58;11443:74;;11330:201;-1:-1:-1;;;;;11577:1:1;11561:14;;;11557:22;11544:36;;-1:-1:-1;10495:1352:1:o;12255:127::-;12316:10;12311:3;12307:20;12304:1;12297:31;12347:4;12344:1;12337:15;12371:4;12368:1;12361:15;12387:135;12426:3;12447:17;;;12444:43;;12467:18;;:::i;:::-;-1:-1:-1;12514:1:1;12503:13;;12387:135::o;13152:344::-;13354:2;13336:21;;;13393:2;13373:18;;;13366:30;-1:-1:-1;;;13427:2:1;13412:18;;13405:50;13487:2;13472:18;;13152:344::o;13501:125::-;13566:9;;;13587:10;;;13584:36;;;13600:18;;:::i;13631:344::-;13833:2;13815:21;;;13872:2;13852:18;;;13845:30;-1:-1:-1;;;13906:2:1;13891:18;;13884:50;13966:2;13951:18;;13631:344::o;13980:127::-;14041:10;14036:3;14032:20;14029:1;14022:31;14072:4;14069:1;14062:15;14096:4;14093:1;14086:15;15622:168;15695:9;;;15726;;15743:15;;;15737:22;;15723:37;15713:71;;15764:18;;:::i;17794:415::-;17996:2;17978:21;;;18035:2;18015:18;;;18008:30;18074:34;18069:2;18054:18;;18047:62;-1:-1:-1;;;18140:2:1;18125:18;;18118:49;18199:3;18184:19;;17794:415::o;18630:1256::-;18854:3;18892:6;18886:13;18918:4;18931:64;18988:6;18983:3;18978:2;18970:6;18966:15;18931:64;:::i;:::-;19058:13;;19017:16;;;;19080:68;19058:13;19017:16;19115:15;;;19080:68;:::i;:::-;19237:13;;19170:20;;;19210:1;;19275:36;19237:13;19275:36;:::i;:::-;19330:1;19347:18;;;19374:141;;;;19529:1;19524:337;;;;19340:521;;19374:141;-1:-1:-1;;19409:24:1;;19395:39;;19486:16;;19479:24;19465:39;;19454:51;;;-1:-1:-1;19374:141:1;;19524:337;19555:6;19552:1;19545:17;19603:2;19600:1;19590:16;19628:1;19642:169;19656:8;19653:1;19650:15;19642:169;;;19738:14;;19723:13;;;19716:37;19781:16;;;;19673:10;;19642:169;;;19646:3;;19842:8;19835:5;19831:20;19824:27;;19340:521;-1:-1:-1;19877:3:1;;18630:1256;-1:-1:-1;;;;;;;;;;18630:1256:1:o;21941:128::-;22008:9;;;22029:11;;;22026:37;;;22043:18;;:::i;22074:136::-;22113:3;22141:5;22131:39;;22150:18;;:::i;:::-;-1:-1:-1;;;22186:18:1;;22074:136::o;22631:489::-;-1:-1:-1;;;;;22900:15:1;;;22882:34;;22952:15;;22947:2;22932:18;;22925:43;22999:2;22984:18;;22977:34;;;23047:3;23042:2;23027:18;;23020:31;;;22825:4;;23068:46;;23094:19;;23086:6;23068:46;:::i;:::-;23060:54;22631:489;-1:-1:-1;;;;;;22631:489:1:o;23125:249::-;23194:6;23247:2;23235:9;23226:7;23222:23;23218:32;23215:52;;;23263:1;23260;23253:12;23215:52;23295:9;23289:16;23314:30;23338:5;23314:30;:::i;23379:127::-;23440:10;23435:3;23431:20;23428:1;23421:31;23471:4;23468:1;23461:15;23495:4;23492:1;23485:15;23511:120;23551:1;23577;23567:35;;23582:18;;:::i;:::-;-1:-1:-1;23616:9:1;;23511:120::o;23636:112::-;23668:1;23694;23684:35;;23699:18;;:::i;:::-;-1:-1:-1;23733:9:1;;23636:112::o;25320:197::-;-1:-1:-1;;;;;25442:10:1;;;25454;;;25438:27;;25477:11;;;25474:37;;;25491:18;;:::i;:::-;25474:37;25320:197;;;;:::o
Swarm Source
ipfs://866ee0d424cac62430c1ed951ce540b2fa3b7c0520b0e3608857f246a0bdeebc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.