ERC-721
NFT
Overview
Max Total Supply
6,000 METACLUBBER
Holders
3,336
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 METACLUBBERLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Metaclubbers
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-10 */ pragma solidity 0.8.9; // SPDX-License-Identifier: MIT /** * @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); } /* * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @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/utils/Strings.sol /** * @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/Address.sol /** * @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/extensions/IERC721Metadata.sol /** * @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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol /** * @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/Context.sol /** * @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/token/ERC721/ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: 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 virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract Metaclubbers is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public maximumWalletHoldings = 5; address ethHolderWallet = address(0x0C6676C8858aA53136832D638329D9540cfee989); string baseURI; string public baseExtension = ""; uint256 public cost = 0.20 ether; uint256 public maxSupply = 200; uint256 public maxMintAmount = 5; uint256 public whitelistMintAmount = 1; bool public paused = true; bool public revealed = false; string public notRevealedUri; bool private whitelistEnforced = true; bool private whitelistOver = false; mapping (address => bool) public isWhitelisted; mapping (address => uint256) public whitelistedMintAmount; uint256 public privateMintAmount = 520; constructor() ERC721("Metaclubbers", "METACLUBBER"){ setBaseURI(""); setNotRevealedURI(""); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // private mint for marketing only. function privateMint(uint256 _mintAmount, address destination) public onlyOwner { uint256 supply = totalSupply(); require(_mintAmount > 0, "cannot mint 0"); require(supply + _mintAmount <= maxSupply + privateMintAmount, "Cannot mint above max supply"); require(supply + _mintAmount <= 9999, "Cannot mint above 9999"); for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(destination, supply + i); } } // public function mint(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(!paused, "Minting is paused"); if(whitelistEnforced){ require(isWhitelisted[msg.sender], "Must be whitelisted in order to mint during this phase"); require(whitelistedMintAmount[msg.sender] + _mintAmount <= whitelistMintAmount, "Requesting too many whitelist NFTs to be minted"); whitelistedMintAmount[msg.sender] += _mintAmount; } require(_mintAmount > 0, "cannot mint 0"); require(_mintAmount <= maxMintAmount, "cannot exceed max mint"); require(supply + _mintAmount <= maxSupply, "Cannot mint above max supply"); require(balanceOf(msg.sender) + _mintAmount <= maximumWalletHoldings, "Cannot mint more than the maximum per wallet"); require(msg.value >= cost * _mintAmount, "Must send enough ETH to cover mint fee"); for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, supply + i); } // 1% for developer (bool os, ) = payable(address(0xBb6da379Ed680839c4E1Eb7fE49814cD6e7Cbf8a)).call{value: address(this).balance * 1 / 100}(""); // 99% for Team (os, ) = payable(ethHolderWallet).call{value: address(this).balance}(""); require(os); } function startWhitelist() external onlyOwner { whitelistEnforced = true; } function startPublicSale() external onlyOwner { whitelistEnforced = false; } function whitelistAddresses(address[] calldata wallets, bool whitelistEnabled) external onlyOwner { for (uint256 i = 0; i < wallets.length; i++){ isWhitelisted[wallets[i]] = whitelistEnabled; } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setCost(uint256 _newCost) public onlyOwner { require(_newCost <= 3 ether && _newCost >= 0.1 ether, "Cost must be between 3 and 0.1 ether"); cost = _newCost; } function setMaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { require(_newmaxMintAmount <= 10, "Cannot set higher than 10"); maxMintAmount = _newmaxMintAmount; } function setWhiteListMintAmount(uint256 _newAmount) public onlyOwner { require(_newAmount <= 3, "Cannot set higher than 3"); whitelistMintAmount = _newAmount; } function setMaxHoldings(uint256 _newAmount) public onlyOwner { require(_newAmount >= 5, "Cannot set higher than 5"); maximumWalletHoldings = _newAmount; } function setMaxSupply(uint256 _newMaxSupply) public onlyOwner { require(_newMaxSupply <= 9999, "Cannot set higher than 9999"); maxSupply = _newMaxSupply; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { (bool os, ) = payable(ethHolderWallet).call{value: address(this).balance}(""); require(os); } }
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":"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"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":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumWalletHoldings","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"privateMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","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":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setMaxHoldings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setWhiteListMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWhitelist","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"whitelistEnabled","type":"bool"}],"name":"whitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6005600b55600c80546001600160a01b031916730c6676c8858aa53136832d638329d9540cfee98917905560a06040819052600060808190526200004691600e9162000271565b506702c68af0bb140000600f5560c86010556005601155600160128190556013805461ffff1990811683179091556015805490911690911790556102086018553480156200009357600080fd5b50604080518082018252600c81526b4d657461636c75626265727360a01b60208083019182528351808501909452600b84526a26a2aa20a1a62aa12122a960a91b908401528151919291620000eb9160009162000271565b5080516200010190600190602084019062000271565b5050506200011e620001186200015860201b60201c565b6200015c565b6040805160208101909152600081526200013890620001ae565b604080516020810190915260008152620001529062000216565b62000354565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001fd5760405162461bcd60e51b815260206004820181905260248201526000805160206200324f83398151915260448201526064015b60405180910390fd5b80516200021290600d90602084019062000271565b5050565b600a546001600160a01b03163314620002615760405162461bcd60e51b815260206004820181905260248201526000805160206200324f8339815191526044820152606401620001f4565b8051620002129060149060208401905b8280546200027f9062000317565b90600052602060002090601f016020900481019282620002a35760008555620002ee565b82601f10620002be57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ee578251825591602001919060010190620002d1565b50620002fc92915062000300565b5090565b5b80821115620002fc576000815560010162000301565b600181811c908216806200032c57607f821691505b602082108114156200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b612eeb80620003646000396000f3fe6080604052600436106102935760003560e01c80635c975abb1161015a578063b88d4fde116100c1578063cfb89aba1161007a578063cfb89aba14610793578063d5abeb01146107a9578063da3ef23f146107bf578063e985e9c5146107df578063f2c4ce1e14610828578063f2fde38b1461084857600080fd5b8063b88d4fde146106db578063b90dec1d146106fb578063beb73b3114610711578063bef870ca1461073e578063c66828621461075e578063c87b56dd1461077357600080fd5b80637f19c412116101135780637f19c4121461064b5780638da5cb5b1461066057806395d89b411461067e578063a0712d6814610693578063a22cb465146106a6578063a475b5dd146106c657600080fd5b80635c975abb1461059c57806362e7707e146105b65780636352211e146105d65780636f8b44b0146105f657806370a0823114610616578063715018a61461063657600080fd5b806323b872dd116101fe57806344a0d68a116101b757806344a0d68a146104dd5780634f6ccce7146104fd578063518302271461051d578063555503b11461053c57806355f804b31461055c5780635ae9e94b1461057c57600080fd5b806323b872dd146104185780632f745c59146104385780633af32abf146104585780633ccfd60b1461048857806342842e0e14610490578063438b6300146104b057600080fd5b8063095ea7b311610250578063095ea7b31461037e5780630c1c972a1461039e57806313faede6146103b357806317301004146103d757806318160ddd146103ed578063239c70ae1461040257600080fd5b806301ffc9a71461029857806302329a29146102cd57806306fdde03146102ef578063081812fc14610311578063081c8c4414610349578063088a4ed01461035e575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612799565b610868565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e83660046127cb565b610893565b005b3480156102fb57600080fd5b506103046108d9565b6040516102c4919061283e565b34801561031d57600080fd5b5061033161032c366004612851565b61096b565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b50610304610a00565b34801561036a57600080fd5b506102ed610379366004612851565b610a8e565b34801561038a57600080fd5b506102ed610399366004612881565b610b0e565b3480156103aa57600080fd5b506102ed610c24565b3480156103bf57600080fd5b506103c9600f5481565b6040519081526020016102c4565b3480156103e357600080fd5b506103c960185481565b3480156103f957600080fd5b506008546103c9565b34801561040e57600080fd5b506103c960115481565b34801561042457600080fd5b506102ed6104333660046128ab565b610c5a565b34801561044457600080fd5b506103c9610453366004612881565b610c8b565b34801561046457600080fd5b506102b86104733660046128e7565b60166020526000908152604090205460ff1681565b6102ed610d21565b34801561049c57600080fd5b506102ed6104ab3660046128ab565b610dae565b3480156104bc57600080fd5b506104d06104cb3660046128e7565b610dc9565b6040516102c49190612902565b3480156104e957600080fd5b506102ed6104f8366004612851565b610e6b565b34801561050957600080fd5b506103c9610518366004612851565b610f12565b34801561052957600080fd5b506013546102b890610100900460ff1681565b34801561054857600080fd5b506102ed610557366004612851565b610fa5565b34801561056857600080fd5b506102ed6105773660046129d2565b611025565b34801561058857600080fd5b506102ed610597366004612851565b611066565b3480156105a857600080fd5b506013546102b89060ff1681565b3480156105c257600080fd5b506102ed6105d1366004612a1b565b6110e6565b3480156105e257600080fd5b506103316105f1366004612851565b611187565b34801561060257600080fd5b506102ed610611366004612851565b6111fe565b34801561062257600080fd5b506103c96106313660046128e7565b61127f565b34801561064257600080fd5b506102ed611306565b34801561065757600080fd5b506102ed61133c565b34801561066c57600080fd5b50600a546001600160a01b0316610331565b34801561068a57600080fd5b50610304611375565b6102ed6106a1366004612851565b611384565b3480156106b257600080fd5b506102ed6106c1366004612a9f565b6117db565b3480156106d257600080fd5b506102ed6118a0565b3480156106e757600080fd5b506102ed6106f6366004612ad2565b6118db565b34801561070757600080fd5b506103c9600b5481565b34801561071d57600080fd5b506103c961072c3660046128e7565b60176020526000908152604090205481565b34801561074a57600080fd5b506102ed610759366004612b4e565b61190d565b34801561076a57600080fd5b50610304611a6a565b34801561077f57600080fd5b5061030461078e366004612851565b611a77565b34801561079f57600080fd5b506103c960125481565b3480156107b557600080fd5b506103c960105481565b3480156107cb57600080fd5b506102ed6107da3660046129d2565b611bf6565b3480156107eb57600080fd5b506102b86107fa366004612b71565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561083457600080fd5b506102ed6108433660046129d2565b611c33565b34801561085457600080fd5b506102ed6108633660046128e7565b611c70565b60006001600160e01b0319821663780e9d6360e01b148061088d575061088d82611d08565b92915050565b600a546001600160a01b031633146108c65760405162461bcd60e51b81526004016108bd90612b9b565b60405180910390fd5b6013805460ff1916911515919091179055565b6060600080546108e890612bd0565b80601f016020809104026020016040519081016040528092919081815260200182805461091490612bd0565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108bd565b506000908152600460205260409020546001600160a01b031690565b60148054610a0d90612bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3990612bd0565b8015610a865780601f10610a5b57610100808354040283529160200191610a86565b820191906000526020600020905b815481529060010190602001808311610a6957829003601f168201915b505050505081565b600a546001600160a01b03163314610ab85760405162461bcd60e51b81526004016108bd90612b9b565b600a811115610b095760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f742073657420686967686572207468616e2031300000000000000060448201526064016108bd565b601155565b6000610b1982611187565b9050806001600160a01b0316836001600160a01b03161415610b875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108bd565b336001600160a01b0382161480610ba35750610ba381336107fa565b610c155760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108bd565b610c1f8383611d58565b505050565b600a546001600160a01b03163314610c4e5760405162461bcd60e51b81526004016108bd90612b9b565b6015805460ff19169055565b610c643382611dc6565b610c805760405162461bcd60e51b81526004016108bd90612c0b565b610c1f838383611ebd565b6000610c968361127f565b8210610cf85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108bd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b81526004016108bd90612b9b565b600c546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610d98576040519150601f19603f3d011682016040523d82523d6000602084013e610d9d565b606091505b5050905080610dab57600080fd5b50565b610c1f838383604051806020016040528060008152506118db565b60606000610dd68361127f565b905060008167ffffffffffffffff811115610df357610df3612946565b604051908082528060200260200182016040528015610e1c578160200160208202803683370190505b50905060005b82811015610e6357610e348582610c8b565b828281518110610e4657610e46612c5c565b602090810291909101015280610e5b81612c88565b915050610e22565b509392505050565b600a546001600160a01b03163314610e955760405162461bcd60e51b81526004016108bd90612b9b565b6729a2241af62c00008111158015610eb5575067016345785d8a00008110155b610f0d5760405162461bcd60e51b8152602060048201526024808201527f436f7374206d757374206265206265747765656e203320616e6420302e3120656044820152633a3432b960e11b60648201526084016108bd565b600f55565b6000610f1d60085490565b8210610f805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108bd565b60088281548110610f9357610f93612c5c565b90600052602060002001549050919050565b600a546001600160a01b03163314610fcf5760405162461bcd60e51b81526004016108bd90612b9b565b60038111156110205760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742073657420686967686572207468616e2033000000000000000060448201526064016108bd565b601255565b600a546001600160a01b0316331461104f5760405162461bcd60e51b81526004016108bd90612b9b565b805161106290600d9060208401906126ea565b5050565b600a546001600160a01b031633146110905760405162461bcd60e51b81526004016108bd90612b9b565b60058110156110e15760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742073657420686967686572207468616e2035000000000000000060448201526064016108bd565b600b55565b600a546001600160a01b031633146111105760405162461bcd60e51b81526004016108bd90612b9b565b60005b8281101561118157816016600086868581811061113257611132612c5c565b905060200201602081019061114791906128e7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061117981612c88565b915050611113565b50505050565b6000818152600260205260408120546001600160a01b03168061088d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108bd565b600a546001600160a01b031633146112285760405162461bcd60e51b81526004016108bd90612b9b565b61270f81111561127a5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073657420686967686572207468616e2039393939000000000060448201526064016108bd565b601055565b60006001600160a01b0382166112ea5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108bd565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113305760405162461bcd60e51b81526004016108bd90612b9b565b61133a6000612068565b565b600a546001600160a01b031633146113665760405162461bcd60e51b81526004016108bd90612b9b565b6015805460ff19166001179055565b6060600180546108e890612bd0565b600061138f60085490565b60135490915060ff16156113d95760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b60448201526064016108bd565b60155460ff161561150b573360009081526016602052604090205460ff166114625760405162461bcd60e51b815260206004820152603660248201527f4d7573742062652077686974656c697374656420696e206f7264657220746f206044820152756d696e7420647572696e67207468697320706861736560501b60648201526084016108bd565b60125433600090815260176020526040902054611480908490612ca3565b11156114e65760405162461bcd60e51b815260206004820152602f60248201527f52657175657374696e6720746f6f206d616e792077686974656c697374204e4660448201526e151cc81d1bc81899481b5a5b9d1959608a1b60648201526084016108bd565b3360009081526017602052604081208054849290611505908490612ca3565b90915550505b6000821161154b5760405162461bcd60e51b815260206004820152600d60248201526c063616e6e6f74206d696e74203609c1b60448201526064016108bd565b6011548211156115965760405162461bcd60e51b815260206004820152601660248201527518d85b9b9bdd08195e18d95959081b585e081b5a5b9d60521b60448201526064016108bd565b6010546115a38383612ca3565b11156115f15760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74206d696e742061626f7665206d617820737570706c790000000060448201526064016108bd565b600b54826115fe3361127f565b6116089190612ca3565b111561166b5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d6178696d7560448201526b1b481c195c881dd85b1b195d60a21b60648201526084016108bd565b81600f546116799190612cbb565b3410156116d75760405162461bcd60e51b815260206004820152602660248201527f4d7573742073656e6420656e6f7567682045544820746f20636f766572206d696044820152656e742066656560d01b60648201526084016108bd565b60015b828111611706576116f4336116ef8385612ca3565b6120ba565b806116fe81612c88565b9150506116da565b50600073bb6da379ed680839c4e1eb7fe49814cd6e7cbf8a606461172b476001612cbb565b6117359190612cf0565b604051600081818185875af1925050503d8060008114611771576040519150601f19603f3d011682016040523d82523d6000602084013e611776565b606091505b5050600c546040519192506001600160a01b0316904790600081818185875af1925050503d80600081146117c6576040519150601f19603f3d011682016040523d82523d6000602084013e6117cb565b606091505b50508091505080610c1f57600080fd5b6001600160a01b0382163314156118345760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108bd565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146118ca5760405162461bcd60e51b81526004016108bd90612b9b565b6013805461ff001916610100179055565b6118e53383611dc6565b6119015760405162461bcd60e51b81526004016108bd90612c0b565b611181848484846120d4565b600a546001600160a01b031633146119375760405162461bcd60e51b81526004016108bd90612b9b565b600061194260085490565b9050600083116119845760405162461bcd60e51b815260206004820152600d60248201526c063616e6e6f74206d696e74203609c1b60448201526064016108bd565b6018546010546119949190612ca3565b61199e8483612ca3565b11156119ec5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74206d696e742061626f7665206d617820737570706c790000000060448201526064016108bd565b61270f6119f98483612ca3565b1115611a405760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206d696e742061626f7665203939393960501b60448201526064016108bd565b60015b83811161118157611a58836116ef8385612ca3565b80611a6281612c88565b915050611a43565b600e8054610a0d90612bd0565b6000818152600260205260409020546060906001600160a01b0316611af65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108bd565b601354610100900460ff16611b975760148054611b1290612bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3e90612bd0565b8015611b8b5780601f10611b6057610100808354040283529160200191611b8b565b820191906000526020600020905b815481529060010190602001808311611b6e57829003601f168201915b50505050509050919050565b6000611ba1612107565b90506000815111611bc15760405180602001604052806000815250611bef565b80611bcb84612116565b600e604051602001611bdf93929190612d04565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314611c205760405162461bcd60e51b81526004016108bd90612b9b565b805161106290600e9060208401906126ea565b600a546001600160a01b03163314611c5d5760405162461bcd60e51b81526004016108bd90612b9b565b80516110629060149060208401906126ea565b600a546001600160a01b03163314611c9a5760405162461bcd60e51b81526004016108bd90612b9b565b6001600160a01b038116611cff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108bd565b610dab81612068565b60006001600160e01b031982166380ac58cd60e01b1480611d3957506001600160e01b03198216635b5e139f60e01b145b8061088d57506301ffc9a760e01b6001600160e01b031983161461088d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d8d82611187565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108bd565b6000611e4a83611187565b9050806001600160a01b0316846001600160a01b03161480611e855750836001600160a01b0316611e7a8461096b565b6001600160a01b0316145b80611eb557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ed082611187565b6001600160a01b031614611f385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108bd565b6001600160a01b038216611f9a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108bd565b611fa5838383612214565b611fb0600082611d58565b6001600160a01b0383166000908152600360205260408120805460019290611fd9908490612dc8565b90915550506001600160a01b0382166000908152600360205260408120805460019290612007908490612ca3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6110628282604051806020016040528060008152506122cc565b6120df848484611ebd565b6120eb848484846122ff565b6111815760405162461bcd60e51b81526004016108bd90612ddf565b6060600d80546108e890612bd0565b60608161213a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612164578061214e81612c88565b915061215d9050600a83612cf0565b915061213e565b60008167ffffffffffffffff81111561217f5761217f612946565b6040519080825280601f01601f1916602001820160405280156121a9576020820181803683370190505b5090505b8415611eb5576121be600183612dc8565b91506121cb600a86612e31565b6121d6906030612ca3565b60f81b8183815181106121eb576121eb612c5c565b60200101906001600160f81b031916908160001a90535061220d600a86612cf0565b94506121ad565b6001600160a01b03831661226f5761226a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612292565b816001600160a01b0316836001600160a01b03161461229257612292838261240c565b6001600160a01b0382166122a957610c1f816124a9565b826001600160a01b0316826001600160a01b031614610c1f57610c1f8282612558565b6122d6838361259c565b6122e360008484846122ff565b610c1f5760405162461bcd60e51b81526004016108bd90612ddf565b60006001600160a01b0384163b1561240157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612343903390899088908890600401612e45565b602060405180830381600087803b15801561235d57600080fd5b505af192505050801561238d575060408051601f3d908101601f1916820190925261238a91810190612e82565b60015b6123e7573d8080156123bb576040519150601f19603f3d011682016040523d82523d6000602084013e6123c0565b606091505b5080516123df5760405162461bcd60e51b81526004016108bd90612ddf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611eb5565b506001949350505050565b600060016124198461127f565b6124239190612dc8565b600083815260076020526040902054909150808214612476576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124bb90600190612dc8565b600083815260096020526040812054600880549394509092849081106124e3576124e3612c5c565b90600052602060002001549050806008838154811061250457612504612c5c565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061253c5761253c612e9f565b6001900381819060005260206000200160009055905550505050565b60006125638361127f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166125f25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108bd565b6000818152600260205260409020546001600160a01b0316156126575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108bd565b61266360008383612214565b6001600160a01b038216600090815260036020526040812080546001929061268c908490612ca3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126f690612bd0565b90600052602060002090601f016020900481019282612718576000855561275e565b82601f1061273157805160ff191683800117855561275e565b8280016001018555821561275e579182015b8281111561275e578251825591602001919060010190612743565b5061276a92915061276e565b5090565b5b8082111561276a576000815560010161276f565b6001600160e01b031981168114610dab57600080fd5b6000602082840312156127ab57600080fd5b8135611bef81612783565b803580151581146127c657600080fd5b919050565b6000602082840312156127dd57600080fd5b611bef826127b6565b60005b838110156128015781810151838201526020016127e9565b838111156111815750506000910152565b6000815180845261282a8160208601602086016127e6565b601f01601f19169290920160200192915050565b602081526000611bef6020830184612812565b60006020828403121561286357600080fd5b5035919050565b80356001600160a01b03811681146127c657600080fd5b6000806040838503121561289457600080fd5b61289d8361286a565b946020939093013593505050565b6000806000606084860312156128c057600080fd5b6128c98461286a565b92506128d76020850161286a565b9150604084013590509250925092565b6000602082840312156128f957600080fd5b611bef8261286a565b6020808252825182820181905260009190848201906040850190845b8181101561293a5783518352928401929184019160010161291e565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561297757612977612946565b604051601f8501601f19908116603f0116810190828211818310171561299f5761299f612946565b816040528093508581528686860111156129b857600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156129e457600080fd5b813567ffffffffffffffff8111156129fb57600080fd5b8201601f81018413612a0c57600080fd5b611eb58482356020840161295c565b600080600060408486031215612a3057600080fd5b833567ffffffffffffffff80821115612a4857600080fd5b818601915086601f830112612a5c57600080fd5b813581811115612a6b57600080fd5b8760208260051b8501011115612a8057600080fd5b602092830195509350612a9691860190506127b6565b90509250925092565b60008060408385031215612ab257600080fd5b612abb8361286a565b9150612ac9602084016127b6565b90509250929050565b60008060008060808587031215612ae857600080fd5b612af18561286a565b9350612aff6020860161286a565b925060408501359150606085013567ffffffffffffffff811115612b2257600080fd5b8501601f81018713612b3357600080fd5b612b428782356020840161295c565b91505092959194509250565b60008060408385031215612b6157600080fd5b82359150612ac96020840161286a565b60008060408385031215612b8457600080fd5b612b8d8361286a565b9150612ac96020840161286a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612be457607f821691505b60208210811415612c0557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612c9c57612c9c612c72565b5060010190565b60008219821115612cb657612cb6612c72565b500190565b6000816000190483118215151615612cd557612cd5612c72565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612cff57612cff612cda565b500490565b600084516020612d178285838a016127e6565b855191840191612d2a8184848a016127e6565b8554920191600090600181811c9080831680612d4757607f831692505b858310811415612d6557634e487b7160e01b85526022600452602485fd5b808015612d795760018114612d8a57612db7565b60ff19851688528388019550612db7565b60008b81526020902060005b85811015612daf5781548a820152908401908801612d96565b505083880195505b50939b9a5050505050505050505050565b600082821015612dda57612dda612c72565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612e4057612e40612cda565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e7890830184612812565b9695505050505050565b600060208284031215612e9457600080fd5b8151611bef81612783565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220cf18c9f86862d2ac07f34ec73d26b5d2e4c21f4b0a5ab4ed829ead05c1cf9a8864736f6c634300080900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106102935760003560e01c80635c975abb1161015a578063b88d4fde116100c1578063cfb89aba1161007a578063cfb89aba14610793578063d5abeb01146107a9578063da3ef23f146107bf578063e985e9c5146107df578063f2c4ce1e14610828578063f2fde38b1461084857600080fd5b8063b88d4fde146106db578063b90dec1d146106fb578063beb73b3114610711578063bef870ca1461073e578063c66828621461075e578063c87b56dd1461077357600080fd5b80637f19c412116101135780637f19c4121461064b5780638da5cb5b1461066057806395d89b411461067e578063a0712d6814610693578063a22cb465146106a6578063a475b5dd146106c657600080fd5b80635c975abb1461059c57806362e7707e146105b65780636352211e146105d65780636f8b44b0146105f657806370a0823114610616578063715018a61461063657600080fd5b806323b872dd116101fe57806344a0d68a116101b757806344a0d68a146104dd5780634f6ccce7146104fd578063518302271461051d578063555503b11461053c57806355f804b31461055c5780635ae9e94b1461057c57600080fd5b806323b872dd146104185780632f745c59146104385780633af32abf146104585780633ccfd60b1461048857806342842e0e14610490578063438b6300146104b057600080fd5b8063095ea7b311610250578063095ea7b31461037e5780630c1c972a1461039e57806313faede6146103b357806317301004146103d757806318160ddd146103ed578063239c70ae1461040257600080fd5b806301ffc9a71461029857806302329a29146102cd57806306fdde03146102ef578063081812fc14610311578063081c8c4414610349578063088a4ed01461035e575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612799565b610868565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e83660046127cb565b610893565b005b3480156102fb57600080fd5b506103046108d9565b6040516102c4919061283e565b34801561031d57600080fd5b5061033161032c366004612851565b61096b565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b50610304610a00565b34801561036a57600080fd5b506102ed610379366004612851565b610a8e565b34801561038a57600080fd5b506102ed610399366004612881565b610b0e565b3480156103aa57600080fd5b506102ed610c24565b3480156103bf57600080fd5b506103c9600f5481565b6040519081526020016102c4565b3480156103e357600080fd5b506103c960185481565b3480156103f957600080fd5b506008546103c9565b34801561040e57600080fd5b506103c960115481565b34801561042457600080fd5b506102ed6104333660046128ab565b610c5a565b34801561044457600080fd5b506103c9610453366004612881565b610c8b565b34801561046457600080fd5b506102b86104733660046128e7565b60166020526000908152604090205460ff1681565b6102ed610d21565b34801561049c57600080fd5b506102ed6104ab3660046128ab565b610dae565b3480156104bc57600080fd5b506104d06104cb3660046128e7565b610dc9565b6040516102c49190612902565b3480156104e957600080fd5b506102ed6104f8366004612851565b610e6b565b34801561050957600080fd5b506103c9610518366004612851565b610f12565b34801561052957600080fd5b506013546102b890610100900460ff1681565b34801561054857600080fd5b506102ed610557366004612851565b610fa5565b34801561056857600080fd5b506102ed6105773660046129d2565b611025565b34801561058857600080fd5b506102ed610597366004612851565b611066565b3480156105a857600080fd5b506013546102b89060ff1681565b3480156105c257600080fd5b506102ed6105d1366004612a1b565b6110e6565b3480156105e257600080fd5b506103316105f1366004612851565b611187565b34801561060257600080fd5b506102ed610611366004612851565b6111fe565b34801561062257600080fd5b506103c96106313660046128e7565b61127f565b34801561064257600080fd5b506102ed611306565b34801561065757600080fd5b506102ed61133c565b34801561066c57600080fd5b50600a546001600160a01b0316610331565b34801561068a57600080fd5b50610304611375565b6102ed6106a1366004612851565b611384565b3480156106b257600080fd5b506102ed6106c1366004612a9f565b6117db565b3480156106d257600080fd5b506102ed6118a0565b3480156106e757600080fd5b506102ed6106f6366004612ad2565b6118db565b34801561070757600080fd5b506103c9600b5481565b34801561071d57600080fd5b506103c961072c3660046128e7565b60176020526000908152604090205481565b34801561074a57600080fd5b506102ed610759366004612b4e565b61190d565b34801561076a57600080fd5b50610304611a6a565b34801561077f57600080fd5b5061030461078e366004612851565b611a77565b34801561079f57600080fd5b506103c960125481565b3480156107b557600080fd5b506103c960105481565b3480156107cb57600080fd5b506102ed6107da3660046129d2565b611bf6565b3480156107eb57600080fd5b506102b86107fa366004612b71565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561083457600080fd5b506102ed6108433660046129d2565b611c33565b34801561085457600080fd5b506102ed6108633660046128e7565b611c70565b60006001600160e01b0319821663780e9d6360e01b148061088d575061088d82611d08565b92915050565b600a546001600160a01b031633146108c65760405162461bcd60e51b81526004016108bd90612b9b565b60405180910390fd5b6013805460ff1916911515919091179055565b6060600080546108e890612bd0565b80601f016020809104026020016040519081016040528092919081815260200182805461091490612bd0565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108bd565b506000908152600460205260409020546001600160a01b031690565b60148054610a0d90612bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3990612bd0565b8015610a865780601f10610a5b57610100808354040283529160200191610a86565b820191906000526020600020905b815481529060010190602001808311610a6957829003601f168201915b505050505081565b600a546001600160a01b03163314610ab85760405162461bcd60e51b81526004016108bd90612b9b565b600a811115610b095760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f742073657420686967686572207468616e2031300000000000000060448201526064016108bd565b601155565b6000610b1982611187565b9050806001600160a01b0316836001600160a01b03161415610b875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108bd565b336001600160a01b0382161480610ba35750610ba381336107fa565b610c155760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108bd565b610c1f8383611d58565b505050565b600a546001600160a01b03163314610c4e5760405162461bcd60e51b81526004016108bd90612b9b565b6015805460ff19169055565b610c643382611dc6565b610c805760405162461bcd60e51b81526004016108bd90612c0b565b610c1f838383611ebd565b6000610c968361127f565b8210610cf85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108bd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b81526004016108bd90612b9b565b600c546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610d98576040519150601f19603f3d011682016040523d82523d6000602084013e610d9d565b606091505b5050905080610dab57600080fd5b50565b610c1f838383604051806020016040528060008152506118db565b60606000610dd68361127f565b905060008167ffffffffffffffff811115610df357610df3612946565b604051908082528060200260200182016040528015610e1c578160200160208202803683370190505b50905060005b82811015610e6357610e348582610c8b565b828281518110610e4657610e46612c5c565b602090810291909101015280610e5b81612c88565b915050610e22565b509392505050565b600a546001600160a01b03163314610e955760405162461bcd60e51b81526004016108bd90612b9b565b6729a2241af62c00008111158015610eb5575067016345785d8a00008110155b610f0d5760405162461bcd60e51b8152602060048201526024808201527f436f7374206d757374206265206265747765656e203320616e6420302e3120656044820152633a3432b960e11b60648201526084016108bd565b600f55565b6000610f1d60085490565b8210610f805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108bd565b60088281548110610f9357610f93612c5c565b90600052602060002001549050919050565b600a546001600160a01b03163314610fcf5760405162461bcd60e51b81526004016108bd90612b9b565b60038111156110205760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742073657420686967686572207468616e2033000000000000000060448201526064016108bd565b601255565b600a546001600160a01b0316331461104f5760405162461bcd60e51b81526004016108bd90612b9b565b805161106290600d9060208401906126ea565b5050565b600a546001600160a01b031633146110905760405162461bcd60e51b81526004016108bd90612b9b565b60058110156110e15760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742073657420686967686572207468616e2035000000000000000060448201526064016108bd565b600b55565b600a546001600160a01b031633146111105760405162461bcd60e51b81526004016108bd90612b9b565b60005b8281101561118157816016600086868581811061113257611132612c5c565b905060200201602081019061114791906128e7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061117981612c88565b915050611113565b50505050565b6000818152600260205260408120546001600160a01b03168061088d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108bd565b600a546001600160a01b031633146112285760405162461bcd60e51b81526004016108bd90612b9b565b61270f81111561127a5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742073657420686967686572207468616e2039393939000000000060448201526064016108bd565b601055565b60006001600160a01b0382166112ea5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108bd565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113305760405162461bcd60e51b81526004016108bd90612b9b565b61133a6000612068565b565b600a546001600160a01b031633146113665760405162461bcd60e51b81526004016108bd90612b9b565b6015805460ff19166001179055565b6060600180546108e890612bd0565b600061138f60085490565b60135490915060ff16156113d95760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b60448201526064016108bd565b60155460ff161561150b573360009081526016602052604090205460ff166114625760405162461bcd60e51b815260206004820152603660248201527f4d7573742062652077686974656c697374656420696e206f7264657220746f206044820152756d696e7420647572696e67207468697320706861736560501b60648201526084016108bd565b60125433600090815260176020526040902054611480908490612ca3565b11156114e65760405162461bcd60e51b815260206004820152602f60248201527f52657175657374696e6720746f6f206d616e792077686974656c697374204e4660448201526e151cc81d1bc81899481b5a5b9d1959608a1b60648201526084016108bd565b3360009081526017602052604081208054849290611505908490612ca3565b90915550505b6000821161154b5760405162461bcd60e51b815260206004820152600d60248201526c063616e6e6f74206d696e74203609c1b60448201526064016108bd565b6011548211156115965760405162461bcd60e51b815260206004820152601660248201527518d85b9b9bdd08195e18d95959081b585e081b5a5b9d60521b60448201526064016108bd565b6010546115a38383612ca3565b11156115f15760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74206d696e742061626f7665206d617820737570706c790000000060448201526064016108bd565b600b54826115fe3361127f565b6116089190612ca3565b111561166b5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d6178696d7560448201526b1b481c195c881dd85b1b195d60a21b60648201526084016108bd565b81600f546116799190612cbb565b3410156116d75760405162461bcd60e51b815260206004820152602660248201527f4d7573742073656e6420656e6f7567682045544820746f20636f766572206d696044820152656e742066656560d01b60648201526084016108bd565b60015b828111611706576116f4336116ef8385612ca3565b6120ba565b806116fe81612c88565b9150506116da565b50600073bb6da379ed680839c4e1eb7fe49814cd6e7cbf8a606461172b476001612cbb565b6117359190612cf0565b604051600081818185875af1925050503d8060008114611771576040519150601f19603f3d011682016040523d82523d6000602084013e611776565b606091505b5050600c546040519192506001600160a01b0316904790600081818185875af1925050503d80600081146117c6576040519150601f19603f3d011682016040523d82523d6000602084013e6117cb565b606091505b50508091505080610c1f57600080fd5b6001600160a01b0382163314156118345760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108bd565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146118ca5760405162461bcd60e51b81526004016108bd90612b9b565b6013805461ff001916610100179055565b6118e53383611dc6565b6119015760405162461bcd60e51b81526004016108bd90612c0b565b611181848484846120d4565b600a546001600160a01b031633146119375760405162461bcd60e51b81526004016108bd90612b9b565b600061194260085490565b9050600083116119845760405162461bcd60e51b815260206004820152600d60248201526c063616e6e6f74206d696e74203609c1b60448201526064016108bd565b6018546010546119949190612ca3565b61199e8483612ca3565b11156119ec5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74206d696e742061626f7665206d617820737570706c790000000060448201526064016108bd565b61270f6119f98483612ca3565b1115611a405760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206d696e742061626f7665203939393960501b60448201526064016108bd565b60015b83811161118157611a58836116ef8385612ca3565b80611a6281612c88565b915050611a43565b600e8054610a0d90612bd0565b6000818152600260205260409020546060906001600160a01b0316611af65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108bd565b601354610100900460ff16611b975760148054611b1290612bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3e90612bd0565b8015611b8b5780601f10611b6057610100808354040283529160200191611b8b565b820191906000526020600020905b815481529060010190602001808311611b6e57829003601f168201915b50505050509050919050565b6000611ba1612107565b90506000815111611bc15760405180602001604052806000815250611bef565b80611bcb84612116565b600e604051602001611bdf93929190612d04565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314611c205760405162461bcd60e51b81526004016108bd90612b9b565b805161106290600e9060208401906126ea565b600a546001600160a01b03163314611c5d5760405162461bcd60e51b81526004016108bd90612b9b565b80516110629060149060208401906126ea565b600a546001600160a01b03163314611c9a5760405162461bcd60e51b81526004016108bd90612b9b565b6001600160a01b038116611cff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108bd565b610dab81612068565b60006001600160e01b031982166380ac58cd60e01b1480611d3957506001600160e01b03198216635b5e139f60e01b145b8061088d57506301ffc9a760e01b6001600160e01b031983161461088d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d8d82611187565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108bd565b6000611e4a83611187565b9050806001600160a01b0316846001600160a01b03161480611e855750836001600160a01b0316611e7a8461096b565b6001600160a01b0316145b80611eb557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ed082611187565b6001600160a01b031614611f385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108bd565b6001600160a01b038216611f9a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108bd565b611fa5838383612214565b611fb0600082611d58565b6001600160a01b0383166000908152600360205260408120805460019290611fd9908490612dc8565b90915550506001600160a01b0382166000908152600360205260408120805460019290612007908490612ca3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6110628282604051806020016040528060008152506122cc565b6120df848484611ebd565b6120eb848484846122ff565b6111815760405162461bcd60e51b81526004016108bd90612ddf565b6060600d80546108e890612bd0565b60608161213a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612164578061214e81612c88565b915061215d9050600a83612cf0565b915061213e565b60008167ffffffffffffffff81111561217f5761217f612946565b6040519080825280601f01601f1916602001820160405280156121a9576020820181803683370190505b5090505b8415611eb5576121be600183612dc8565b91506121cb600a86612e31565b6121d6906030612ca3565b60f81b8183815181106121eb576121eb612c5c565b60200101906001600160f81b031916908160001a90535061220d600a86612cf0565b94506121ad565b6001600160a01b03831661226f5761226a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612292565b816001600160a01b0316836001600160a01b03161461229257612292838261240c565b6001600160a01b0382166122a957610c1f816124a9565b826001600160a01b0316826001600160a01b031614610c1f57610c1f8282612558565b6122d6838361259c565b6122e360008484846122ff565b610c1f5760405162461bcd60e51b81526004016108bd90612ddf565b60006001600160a01b0384163b1561240157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612343903390899088908890600401612e45565b602060405180830381600087803b15801561235d57600080fd5b505af192505050801561238d575060408051601f3d908101601f1916820190925261238a91810190612e82565b60015b6123e7573d8080156123bb576040519150601f19603f3d011682016040523d82523d6000602084013e6123c0565b606091505b5080516123df5760405162461bcd60e51b81526004016108bd90612ddf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611eb5565b506001949350505050565b600060016124198461127f565b6124239190612dc8565b600083815260076020526040902054909150808214612476576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124bb90600190612dc8565b600083815260096020526040812054600880549394509092849081106124e3576124e3612c5c565b90600052602060002001549050806008838154811061250457612504612c5c565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061253c5761253c612e9f565b6001900381819060005260206000200160009055905550505050565b60006125638361127f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166125f25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108bd565b6000818152600260205260409020546001600160a01b0316156126575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108bd565b61266360008383612214565b6001600160a01b038216600090815260036020526040812080546001929061268c908490612ca3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126f690612bd0565b90600052602060002090601f016020900481019282612718576000855561275e565b82601f1061273157805160ff191683800117855561275e565b8280016001018555821561275e579182015b8281111561275e578251825591602001919060010190612743565b5061276a92915061276e565b5090565b5b8082111561276a576000815560010161276f565b6001600160e01b031981168114610dab57600080fd5b6000602082840312156127ab57600080fd5b8135611bef81612783565b803580151581146127c657600080fd5b919050565b6000602082840312156127dd57600080fd5b611bef826127b6565b60005b838110156128015781810151838201526020016127e9565b838111156111815750506000910152565b6000815180845261282a8160208601602086016127e6565b601f01601f19169290920160200192915050565b602081526000611bef6020830184612812565b60006020828403121561286357600080fd5b5035919050565b80356001600160a01b03811681146127c657600080fd5b6000806040838503121561289457600080fd5b61289d8361286a565b946020939093013593505050565b6000806000606084860312156128c057600080fd5b6128c98461286a565b92506128d76020850161286a565b9150604084013590509250925092565b6000602082840312156128f957600080fd5b611bef8261286a565b6020808252825182820181905260009190848201906040850190845b8181101561293a5783518352928401929184019160010161291e565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561297757612977612946565b604051601f8501601f19908116603f0116810190828211818310171561299f5761299f612946565b816040528093508581528686860111156129b857600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156129e457600080fd5b813567ffffffffffffffff8111156129fb57600080fd5b8201601f81018413612a0c57600080fd5b611eb58482356020840161295c565b600080600060408486031215612a3057600080fd5b833567ffffffffffffffff80821115612a4857600080fd5b818601915086601f830112612a5c57600080fd5b813581811115612a6b57600080fd5b8760208260051b8501011115612a8057600080fd5b602092830195509350612a9691860190506127b6565b90509250925092565b60008060408385031215612ab257600080fd5b612abb8361286a565b9150612ac9602084016127b6565b90509250929050565b60008060008060808587031215612ae857600080fd5b612af18561286a565b9350612aff6020860161286a565b925060408501359150606085013567ffffffffffffffff811115612b2257600080fd5b8501601f81018713612b3357600080fd5b612b428782356020840161295c565b91505092959194509250565b60008060408385031215612b6157600080fd5b82359150612ac96020840161286a565b60008060408385031215612b8457600080fd5b612b8d8361286a565b9150612ac96020840161286a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612be457607f821691505b60208210811415612c0557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612c9c57612c9c612c72565b5060010190565b60008219821115612cb657612cb6612c72565b500190565b6000816000190483118215151615612cd557612cd5612c72565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612cff57612cff612cda565b500490565b600084516020612d178285838a016127e6565b855191840191612d2a8184848a016127e6565b8554920191600090600181811c9080831680612d4757607f831692505b858310811415612d6557634e487b7160e01b85526022600452602485fd5b808015612d795760018114612d8a57612db7565b60ff19851688528388019550612db7565b60008b81526020902060005b85811015612daf5781548a820152908401908801612d96565b505083880195505b50939b9a5050505050505050505050565b600082821015612dda57612dda612c72565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612e4057612e40612cda565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e7890830184612812565b9695505050505050565b600060208284031215612e9457600080fd5b8151611bef81612783565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220cf18c9f86862d2ac07f34ec73d26b5d2e4c21f4b0a5ab4ed829ead05c1cf9a8864736f6c63430008090033
Deployed Bytecode Sourcemap
42500:5637:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34105:224;;;;;;;;;;-1:-1:-1;34105:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;34105:224:0;;;;;;;;47901:73;;;;;;;;;;-1:-1:-1;47901:73:0;;;;;:::i;:::-;;:::i;:::-;;22032:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23591:221::-;;;;;;;;;;-1:-1:-1;23591:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2042:32:1;;;2024:51;;2012:2;1997:18;23591:221:0;1878:203:1;42986:28:0;;;;;;;;;;;;;:::i;46825:184::-;;;;;;;;;;-1:-1:-1;46825:184:0;;;;;:::i;:::-;;:::i;23114:411::-;;;;;;;;;;-1:-1:-1;23114:411:0;;;;;:::i;:::-;;:::i;45370:86::-;;;;;;;;;;;;;:::i;42771:32::-;;;;;;;;;;;;;;;;;;;2669:25:1;;;2657:2;2642:18;42771:32:0;2523:177:1;43213:38:0;;;;;;;;;;;;;;;;34745:113;;;;;;;;;;-1:-1:-1;34833:10:0;:17;34745:113;;42843:32;;;;;;;;;;;;;;;;24481:339;;;;;;;;;;-1:-1:-1;24481:339:0;;;;;:::i;:::-;;:::i;34413:256::-;;;;;;;;;;-1:-1:-1;34413:256:0;;;;;:::i;:::-;;:::i;43100:46::-;;;;;;;;;;-1:-1:-1;43100:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47981:153;;;:::i;24891:185::-;;;;;;;;;;-1:-1:-1;24891:185:0;;;;;:::i;:::-;;:::i;45693:348::-;;;;;;;;;;-1:-1:-1;45693:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46639:180::-;;;;;;;;;;-1:-1:-1;46639:180:0;;;;;:::i;:::-;;:::i;34935:233::-;;;;;;;;;;-1:-1:-1;34935:233:0;;;;;:::i;:::-;;:::i;42953:28::-;;;;;;;;;;-1:-1:-1;42953:28:0;;;;;;;;;;;47015:173;;;;;;;;;;-1:-1:-1;47015:173:0;;;;;:::i;:::-;;:::i;47669:98::-;;;;;;;;;;-1:-1:-1;47669:98:0;;;;;:::i;:::-;;:::i;47194:167::-;;;;;;;;;;-1:-1:-1;47194:167:0;;;;;:::i;:::-;;:::i;42923:25::-;;;;;;;;;;-1:-1:-1;42923:25:0;;;;;;;;45464:223;;;;;;;;;;-1:-1:-1;45464:223:0;;;;;:::i;:::-;;:::i;21726:239::-;;;;;;;;;;-1:-1:-1;21726:239:0;;;;;:::i;:::-;;:::i;47367:168::-;;;;;;;;;;-1:-1:-1;47367:168:0;;;;;:::i;:::-;;:::i;21456:208::-;;;;;;;;;;-1:-1:-1;21456:208:0;;;;;:::i;:::-;;:::i;41871:94::-;;;;;;;;;;;;;:::i;45278:84::-;;;;;;;;;;;;;:::i;41220:87::-;;;;;;;;;;-1:-1:-1;41293:6:0;;-1:-1:-1;;;;;41293:6:0;41220:87;;22201:104;;;;;;;;;;;;;:::i;43997:1273::-;;;;;;:::i;:::-;;:::i;23884:295::-;;;;;;;;;;-1:-1:-1;23884:295:0;;;;;:::i;:::-;;:::i;46566:65::-;;;;;;;;;;;;;:::i;25147:328::-;;;;;;;;;;-1:-1:-1;25147:328:0;;;;;:::i;:::-;;:::i;42588:40::-;;;;;;;;;;;;;;;;43151:57;;;;;;;;;;-1:-1:-1;43151:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;43532:446;;;;;;;;;;-1:-1:-1;43532:446:0;;;;;:::i;:::-;;:::i;42734:32::-;;;;;;;;;;;;;:::i;46047:497::-;;;;;;;;;;-1:-1:-1;46047:497:0;;;;;:::i;:::-;;:::i;42880:38::-;;;;;;;;;;;;;;;;42808:30;;;;;;;;;;;;;;;;47773:122;;;;;;;;;;-1:-1:-1;47773:122:0;;;;;:::i;:::-;;:::i;24250:164::-;;;;;;;;;;-1:-1:-1;24250:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24371:25:0;;;24347:4;24371:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24250:164;47543:120;;;;;;;;;;-1:-1:-1;47543:120:0;;;;;:::i;:::-;;:::i;42120:192::-;;;;;;;;;;-1:-1:-1;42120:192:0;;;;;:::i;:::-;;:::i;34105:224::-;34207:4;-1:-1:-1;;;;;;34231:50:0;;-1:-1:-1;;;34231:50:0;;:90;;;34285:36;34309:11;34285:23;:36::i;:::-;34224:97;34105:224;-1:-1:-1;;34105:224:0:o;47901:73::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;;;;;;;;;47953:6:::1;:15:::0;;-1:-1:-1;;47953:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47901:73::o;22032:100::-;22086:13;22119:5;22112:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22032:100;:::o;23591:221::-;23667:7;27074:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27074:16:0;23687:73;;;;-1:-1:-1;;;23687:73:0;;8188:2:1;23687:73:0;;;8170:21:1;8227:2;8207:18;;;8200:30;8266:34;8246:18;;;8239:62;-1:-1:-1;;;8317:18:1;;;8310:42;8369:19;;23687:73:0;7986:408:1;23687:73:0;-1:-1:-1;23780:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23780:24:0;;23591:221::o;42986:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46825:184::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;46931:2:::1;46910:17;:23;;46902:61;;;::::0;-1:-1:-1;;;46902:61:0;;8601:2:1;46902:61:0::1;::::0;::::1;8583:21:1::0;8640:2;8620:18;;;8613:30;8679:27;8659:18;;;8652:55;8724:18;;46902:61:0::1;8399:349:1::0;46902:61:0::1;46970:13;:33:::0;46825:184::o;23114:411::-;23195:13;23211:23;23226:7;23211:14;:23::i;:::-;23195:39;;23259:5;-1:-1:-1;;;;;23253:11:0;:2;-1:-1:-1;;;;;23253:11:0;;;23245:57;;;;-1:-1:-1;;;23245:57:0;;8955:2:1;23245:57:0;;;8937:21:1;8994:2;8974:18;;;8967:30;9033:34;9013:18;;;9006:62;-1:-1:-1;;;9084:18:1;;;9077:31;9125:19;;23245:57:0;8753:397:1;23245:57:0;19666:10;-1:-1:-1;;;;;23337:21:0;;;;:62;;-1:-1:-1;23362:37:0;23379:5;19666:10;24250:164;:::i;23362:37::-;23315:168;;;;-1:-1:-1;;;23315:168:0;;9357:2:1;23315:168:0;;;9339:21:1;9396:2;9376:18;;;9369:30;9435:34;9415:18;;;9408:62;9506:26;9486:18;;;9479:54;9550:19;;23315:168:0;9155:420:1;23315:168:0;23496:21;23505:2;23509:7;23496:8;:21::i;:::-;23184:341;23114:411;;:::o;45370:86::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;45425:17:::1;:25:::0;;-1:-1:-1;;45425:25:0::1;::::0;;45370:86::o;24481:339::-;24676:41;19666:10;24709:7;24676:18;:41::i;:::-;24668:103;;;;-1:-1:-1;;;24668:103:0;;;;;;;:::i;:::-;24784:28;24794:4;24800:2;24804:7;24784:9;:28::i;34413:256::-;34510:7;34546:23;34563:5;34546:16;:23::i;:::-;34538:5;:31;34530:87;;;;-1:-1:-1;;;34530:87:0;;10200:2:1;34530:87:0;;;10182:21:1;10239:2;10219:18;;;10212:30;10278:34;10258:18;;;10251:62;-1:-1:-1;;;10329:18:1;;;10322:41;10380:19;;34530:87:0;9998:407:1;34530:87:0;-1:-1:-1;;;;;;34635:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34413:256::o;47981:153::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;48055:15:::1;::::0;48047:63:::1;::::0;48034:7:::1;::::0;-1:-1:-1;;;;;48055:15:0::1;::::0;48084:21:::1;::::0;48034:7;48047:63;48034:7;48047:63;48084:21;48055:15;48047:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48033:77;;;48125:2;48117:11;;;::::0;::::1;;48026:108;47981:153::o:0;24891:185::-;25029:39;25046:4;25052:2;25056:7;25029:39;;;;;;;;;;;;:16;:39::i;45693:348::-;45768:16;45796:23;45822:17;45832:6;45822:9;:17::i;:::-;45796:43;;45846:25;45888:15;45874:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45874:30:0;;45846:58;;45916:9;45911:103;45931:15;45927:1;:19;45911:103;;;45976:30;45996:6;46004:1;45976:19;:30::i;:::-;45962:8;45971:1;45962:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;45948:3;;;;:::i;:::-;;;;45911:103;;;-1:-1:-1;46027:8:0;45693:348;-1:-1:-1;;;45693:348:0:o;46639:180::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;46718:7:::1;46706:8;:19;;:44;;;;;46741:9;46729:8;:21;;46706:44;46698:93;;;::::0;-1:-1:-1;;;46698:93:0;;11226:2:1;46698:93:0::1;::::0;::::1;11208:21:1::0;11265:2;11245:18;;;11238:30;11304:34;11284:18;;;11277:62;-1:-1:-1;;;11355:18:1;;;11348:34;11399:19;;46698:93:0::1;11024:400:1::0;46698:93:0::1;46798:4;:15:::0;46639:180::o;34935:233::-;35010:7;35046:30;34833:10;:17;;34745:113;35046:30;35038:5;:38;35030:95;;;;-1:-1:-1;;;35030:95:0;;11631:2:1;35030:95:0;;;11613:21:1;11670:2;11650:18;;;11643:30;11709:34;11689:18;;;11682:62;-1:-1:-1;;;11760:18:1;;;11753:42;11812:19;;35030:95:0;11429:408:1;35030:95:0;35143:10;35154:5;35143:17;;;;;;;;:::i;:::-;;;;;;;;;35136:24;;34935:233;;;:::o;47015:173::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;47113:1:::1;47099:10;:15;;47091:52;;;::::0;-1:-1:-1;;;47091:52:0;;12044:2:1;47091:52:0::1;::::0;::::1;12026:21:1::0;12083:2;12063:18;;;12056:30;12122:26;12102:18;;;12095:54;12166:18;;47091:52:0::1;11842:348:1::0;47091:52:0::1;47150:19;:32:::0;47015:173::o;47669:98::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;47740:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;47669:98:::0;:::o;47194:167::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;47284:1:::1;47270:10;:15;;47262:52;;;::::0;-1:-1:-1;;;47262:52:0;;12397:2:1;47262:52:0::1;::::0;::::1;12379:21:1::0;12436:2;12416:18;;;12409:30;12475:26;12455:18;;;12448:54;12519:18;;47262:52:0::1;12195:348:1::0;47262:52:0::1;47321:21;:34:::0;47194:167::o;45464:223::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;45576:9:::1;45571:111;45591:18:::0;;::::1;45571:111;;;45656:16;45628:13;:25;45642:7;;45650:1;45642:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45628:25:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;45628:25:0;:44;;-1:-1:-1;;45628:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45611:3;::::1;::::0;::::1;:::i;:::-;;;;45571:111;;;;45464:223:::0;;;:::o;21726:239::-;21798:7;21834:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21834:16:0;21869:19;21861:73;;;;-1:-1:-1;;;21861:73:0;;12750:2:1;21861:73:0;;;12732:21:1;12789:2;12769:18;;;12762:30;12828:34;12808:18;;;12801:62;-1:-1:-1;;;12879:18:1;;;12872:39;12928:19;;21861:73:0;12548:405:1;47367:168:0;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;47461:4:::1;47444:13;:21;;47436:61;;;::::0;-1:-1:-1;;;47436:61:0;;13160:2:1;47436:61:0::1;::::0;::::1;13142:21:1::0;13199:2;13179:18;;;13172:30;13238:29;13218:18;;;13211:57;13285:18;;47436:61:0::1;12958:351:1::0;47436:61:0::1;47504:9;:25:::0;47367:168::o;21456:208::-;21528:7;-1:-1:-1;;;;;21556:19:0;;21548:74;;;;-1:-1:-1;;;21548:74:0;;13516:2:1;21548:74:0;;;13498:21:1;13555:2;13535:18;;;13528:30;13594:34;13574:18;;;13567:62;-1:-1:-1;;;13645:18:1;;;13638:40;13695:19;;21548:74:0;13314:406:1;21548:74:0;-1:-1:-1;;;;;;21640:16:0;;;;;:9;:16;;;;;;;21456:208::o;41871:94::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;41936:21:::1;41954:1;41936:9;:21::i;:::-;41871:94::o:0;45278:84::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;45332:17:::1;:24:::0;;-1:-1:-1;;45332:24:0::1;45352:4;45332:24;::::0;;45278:84::o;22201:104::-;22257:13;22290:7;22283:14;;;;;:::i;43997:1273::-;44054:14;44071:13;34833:10;:17;;34745:113;44071:13;44100:6;;44054:30;;-1:-1:-1;44100:6:0;;44099:7;44091:37;;;;-1:-1:-1;;;44091:37:0;;13927:2:1;44091:37:0;;;13909:21:1;13966:2;13946:18;;;13939:30;-1:-1:-1;;;13985:18:1;;;13978:47;14042:18;;44091:37:0;13725:341:1;44091:37:0;44140:17;;;;44137:332;;;44191:10;44177:25;;;;:13;:25;;;;;;;;44169:92;;;;-1:-1:-1;;;44169:92:0;;14273:2:1;44169:92:0;;;14255:21:1;14312:2;14292:18;;;14285:30;14351:34;14331:18;;;14324:62;-1:-1:-1;;;14402:18:1;;;14395:52;14464:19;;44169:92:0;14071:418:1;44169:92:0;44331:19;;44302:10;44280:33;;;;:21;:33;;;;;;:47;;44316:11;;44280:47;:::i;:::-;:70;;44272:130;;;;-1:-1:-1;;;44272:130:0;;14829:2:1;44272:130:0;;;14811:21:1;14868:2;14848:18;;;14841:30;14907:34;14887:18;;;14880:62;-1:-1:-1;;;14958:18:1;;;14951:45;15013:19;;44272:130:0;14627:411:1;44272:130:0;44435:10;44413:33;;;;:21;:33;;;;;:48;;44450:11;;44413:33;:48;;44450:11;;44413:48;:::i;:::-;;;;-1:-1:-1;;44137:332:0;44499:1;44485:11;:15;44477:41;;;;-1:-1:-1;;;44477:41:0;;15245:2:1;44477:41:0;;;15227:21:1;15284:2;15264:18;;;15257:30;-1:-1:-1;;;15303:18:1;;;15296:43;15356:18;;44477:41:0;15043:337:1;44477:41:0;44548:13;;44533:11;:28;;44525:63;;;;-1:-1:-1;;;44525:63:0;;15587:2:1;44525:63:0;;;15569:21:1;15626:2;15606:18;;;15599:30;-1:-1:-1;;;15645:18:1;;;15638:52;15707:18;;44525:63:0;15385:346:1;44525:63:0;44627:9;;44603:20;44612:11;44603:6;:20;:::i;:::-;:33;;44595:74;;;;-1:-1:-1;;;44595:74:0;;15938:2:1;44595:74:0;;;15920:21:1;15977:2;15957:18;;;15950:30;16016;15996:18;;;15989:58;16064:18;;44595:74:0;15736:352:1;44595:74:0;44723:21;;44708:11;44684:21;44694:10;44684:9;:21::i;:::-;:35;;;;:::i;:::-;:60;;44676:117;;;;-1:-1:-1;;;44676:117:0;;16295:2:1;44676:117:0;;;16277:21:1;16334:2;16314:18;;;16307:30;16373:34;16353:18;;;16346:62;-1:-1:-1;;;16424:18:1;;;16417:42;16476:19;;44676:117:0;16093:408:1;44676:117:0;44830:11;44823:4;;:18;;;;:::i;:::-;44810:9;:31;;44802:82;;;;-1:-1:-1;;;44802:82:0;;16881:2:1;44802:82:0;;;16863:21:1;16920:2;16900:18;;;16893:30;16959:34;16939:18;;;16932:62;-1:-1:-1;;;17010:18:1;;;17003:36;17056:19;;44802:82:0;16679:402:1;44802:82:0;44914:1;44897:93;44922:11;44917:1;:16;44897:93;;44949:33;44959:10;44971;44980:1;44971:6;:10;:::i;:::-;44949:9;:33::i;:::-;44935:3;;;;:::i;:::-;;;;44897:93;;;-1:-1:-1;45024:7:0;45053:42;45138:3;45110:25;:21;45134:1;45110:25;:::i;:::-;:31;;;;:::i;:::-;45037:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45191:15:0;;45183:63;;45023:123;;-1:-1:-1;;;;;;45191:15:0;;45220:21;;45183:63;;;;45220:21;45191:15;45183:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45174:72;;;;;45261:2;45253:11;;;;;23884:295;-1:-1:-1;;;;;23987:24:0;;19666:10;23987:24;;23979:62;;;;-1:-1:-1;;;23979:62:0;;17545:2:1;23979:62:0;;;17527:21:1;17584:2;17564:18;;;17557:30;17623:27;17603:18;;;17596:55;17668:18;;23979:62:0;17343:349:1;23979:62:0;19666:10;24054:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24054:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24054:53:0;;;;;;;;;;24123:48;;540:41:1;;;24054:42:0;;19666:10;24123:48;;513:18:1;24123:48:0;;;;;;;23884:295;;:::o;46566:65::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;46610:8:::1;:15:::0;;-1:-1:-1;;46610:15:0::1;;;::::0;;46566:65::o;25147:328::-;25322:41;19666:10;25355:7;25322:18;:41::i;:::-;25314:103;;;;-1:-1:-1;;;25314:103:0;;;;;;;:::i;:::-;25428:39;25442:4;25448:2;25452:7;25461:5;25428:13;:39::i;43532:446::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;43619:14:::1;43636:13;34833:10:::0;:17;;34745:113;43636:13:::1;43619:30;;43678:1;43664:11;:15;43656:41;;;::::0;-1:-1:-1;;;43656:41:0;;15245:2:1;43656:41:0::1;::::0;::::1;15227:21:1::0;15284:2;15264:18;;;15257:30;-1:-1:-1;;;15303:18:1;;;15296:43;15356:18;;43656:41:0::1;15043:337:1::0;43656:41:0::1;43748:17;;43736:9;;:29;;;;:::i;:::-;43712:20;43721:11:::0;43712:6;:20:::1;:::i;:::-;:53;;43704:94;;;::::0;-1:-1:-1;;;43704:94:0;;15938:2:1;43704:94:0::1;::::0;::::1;15920:21:1::0;15977:2;15957:18;;;15950:30;16016;15996:18;;;15989:58;16064:18;;43704:94:0::1;15736:352:1::0;43704:94:0::1;43837:4;43813:20;43822:11:::0;43813:6;:20:::1;:::i;:::-;:28;;43805:63;;;::::0;-1:-1:-1;;;43805:63:0;;17899:2:1;43805:63:0::1;::::0;::::1;17881:21:1::0;17938:2;17918:18;;;17911:30;-1:-1:-1;;;17957:18:1;;;17950:52;18019:18;;43805:63:0::1;17697:346:1::0;43805:63:0::1;43894:1;43877:96;43902:11;43897:1;:16;43877:96;;43931:34;43941:11:::0;43954:10:::1;43963:1:::0;43954:6;:10:::1;:::i;43931:34::-;43915:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43877:96;;42734:32:::0;;;;;;;:::i;46047:497::-;27050:4;27074:16;;;:7;:16;;;;;;46145:13;;-1:-1:-1;;;;;27074:16:0;46170:97;;;;-1:-1:-1;;;46170:97:0;;18250:2:1;46170:97:0;;;18232:21:1;18289:2;18269:18;;;18262:30;18328:34;18308:18;;;18301:62;-1:-1:-1;;;18379:18:1;;;18372:45;18434:19;;46170:97:0;18048:411:1;46170:97:0;46283:8;;;;;;;46280:62;;46320:14;46313:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46047:497;;;:::o;46280:62::-;46350:28;46381:10;:8;:10::i;:::-;46350:41;;46436:1;46411:14;46405:28;:32;:133;;;;;;;;;;;;;;;;;46473:14;46489:18;:7;:16;:18::i;:::-;46509:13;46456:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46405:133;46398:140;46047:497;-1:-1:-1;;;46047:497:0:o;47773:122::-;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;47856:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;47543:120::-:0;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;47625:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;42120:192::-:0;41293:6;;-1:-1:-1;;;;;41293:6:0;19666:10;41440:23;41432:68;;;;-1:-1:-1;;;41432:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42209:22:0;::::1;42201:73;;;::::0;-1:-1:-1;;;42201:73:0;;20324:2:1;42201:73:0::1;::::0;::::1;20306:21:1::0;20363:2;20343:18;;;20336:30;20402:34;20382:18;;;20375:62;-1:-1:-1;;;20453:18:1;;;20446:36;20499:19;;42201:73:0::1;20122:402:1::0;42201:73:0::1;42285:19;42295:8;42285:9;:19::i;21087:305::-:0;21189:4;-1:-1:-1;;;;;;21226:40:0;;-1:-1:-1;;;21226:40:0;;:105;;-1:-1:-1;;;;;;;21283:48:0;;-1:-1:-1;;;21283:48:0;21226:105;:158;;;-1:-1:-1;;;;;;;;;;7203:40:0;;;21348:36;7094:157;30967:174;31042:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31042:29:0;-1:-1:-1;;;;;31042:29:0;;;;;;;;:24;;31096:23;31042:24;31096:14;:23::i;:::-;-1:-1:-1;;;;;31087:46:0;;;;;;;;;;;30967:174;;:::o;27279:348::-;27372:4;27074:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27074:16:0;27389:73;;;;-1:-1:-1;;;27389:73:0;;20731:2:1;27389:73:0;;;20713:21:1;20770:2;20750:18;;;20743:30;20809:34;20789:18;;;20782:62;-1:-1:-1;;;20860:18:1;;;20853:42;20912:19;;27389:73:0;20529:408:1;27389:73:0;27473:13;27489:23;27504:7;27489:14;:23::i;:::-;27473:39;;27542:5;-1:-1:-1;;;;;27531:16:0;:7;-1:-1:-1;;;;;27531:16:0;;:51;;;;27575:7;-1:-1:-1;;;;;27551:31:0;:20;27563:7;27551:11;:20::i;:::-;-1:-1:-1;;;;;27551:31:0;;27531:51;:87;;;-1:-1:-1;;;;;;24371:25:0;;;24347:4;24371:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27586:32;27523:96;27279:348;-1:-1:-1;;;;27279:348:0:o;30271:578::-;30430:4;-1:-1:-1;;;;;30403:31:0;:23;30418:7;30403:14;:23::i;:::-;-1:-1:-1;;;;;30403:31:0;;30395:85;;;;-1:-1:-1;;;30395:85:0;;21144:2:1;30395:85:0;;;21126:21:1;21183:2;21163:18;;;21156:30;21222:34;21202:18;;;21195:62;-1:-1:-1;;;21273:18:1;;;21266:39;21322:19;;30395:85:0;20942:405:1;30395:85:0;-1:-1:-1;;;;;30499:16:0;;30491:65;;;;-1:-1:-1;;;30491:65:0;;21554:2:1;30491:65:0;;;21536:21:1;21593:2;21573:18;;;21566:30;21632:34;21612:18;;;21605:62;-1:-1:-1;;;21683:18:1;;;21676:34;21727:19;;30491:65:0;21352:400:1;30491:65:0;30569:39;30590:4;30596:2;30600:7;30569:20;:39::i;:::-;30673:29;30690:1;30694:7;30673:8;:29::i;:::-;-1:-1:-1;;;;;30715:15:0;;;;;;:9;:15;;;;;:20;;30734:1;;30715:15;:20;;30734:1;;30715:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30746:13:0;;;;;;:9;:13;;;;;:18;;30763:1;;30746:13;:18;;30763:1;;30746:18;:::i;:::-;;;;-1:-1:-1;;30775:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30775:21:0;-1:-1:-1;;;;;30775:21:0;;;;;;;;;30814:27;;30775:16;;30814:27;;;;;;;30271:578;;;:::o;42320:173::-;42395:6;;;-1:-1:-1;;;;;42412:17:0;;;-1:-1:-1;;;;;;42412:17:0;;;;;;;42445:40;;42395:6;;;42412:17;42395:6;;42445:40;;42376:16;;42445:40;42365:128;42320:173;:::o;27969:110::-;28045:26;28055:2;28059:7;28045:26;;;;;;;;;;;;:9;:26::i;26357:315::-;26514:28;26524:4;26530:2;26534:7;26514:9;:28::i;:::-;26561:48;26584:4;26590:2;26594:7;26603:5;26561:22;:48::i;:::-;26553:111;;;;-1:-1:-1;;;26553:111:0;;;;;;;:::i;43385:102::-;43445:13;43474:7;43467:14;;;;;:::i;7538:723::-;7594:13;7815:10;7811:53;;-1:-1:-1;;7842:10:0;;;;;;;;;;;;-1:-1:-1;;;7842:10:0;;;;;7538:723::o;7811:53::-;7889:5;7874:12;7930:78;7937:9;;7930:78;;7963:8;;;;:::i;:::-;;-1:-1:-1;7986:10:0;;-1:-1:-1;7994:2:0;7986:10;;:::i;:::-;;;7930:78;;;8018:19;8050:6;8040:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8040:17:0;;8018:39;;8068:154;8075:10;;8068:154;;8102:11;8112:1;8102:11;;:::i;:::-;;-1:-1:-1;8171:10:0;8179:2;8171:5;:10;:::i;:::-;8158:24;;:2;:24;:::i;:::-;8145:39;;8128:6;8135;8128:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8128:56:0;;;;;;;;-1:-1:-1;8199:11:0;8208:2;8199:11;;:::i;:::-;;;8068:154;;35781:589;-1:-1:-1;;;;;35987:18:0;;35983:187;;36022:40;36054:7;37197:10;:17;;37170:24;;;;:15;:24;;;;;:44;;;37225:24;;;;;;;;;;;;37093:164;36022:40;35983:187;;;36092:2;-1:-1:-1;;;;;36084:10:0;:4;-1:-1:-1;;;;;36084:10:0;;36080:90;;36111:47;36144:4;36150:7;36111:32;:47::i;:::-;-1:-1:-1;;;;;36184:16:0;;36180:183;;36217:45;36254:7;36217:36;:45::i;36180:183::-;36290:4;-1:-1:-1;;;;;36284:10:0;:2;-1:-1:-1;;;;;36284:10:0;;36280:83;;36311:40;36339:2;36343:7;36311:27;:40::i;28306:321::-;28436:18;28442:2;28446:7;28436:5;:18::i;:::-;28487:54;28518:1;28522:2;28526:7;28535:5;28487:22;:54::i;:::-;28465:154;;;;-1:-1:-1;;;28465:154:0;;;;;;;:::i;31706:799::-;31861:4;-1:-1:-1;;;;;31882:13:0;;10355:20;10403:8;31878:620;;31918:72;;-1:-1:-1;;;31918:72:0;;-1:-1:-1;;;;;31918:36:0;;;;;:72;;19666:10;;31969:4;;31975:7;;31984:5;;31918:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31918:72:0;;;;;;;;-1:-1:-1;;31918:72:0;;;;;;;;;;;;:::i;:::-;;;31914:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32160:13:0;;32156:272;;32203:60;;-1:-1:-1;;;32203:60:0;;;;;;;:::i;32156:272::-;32378:6;32372:13;32363:6;32359:2;32355:15;32348:38;31914:529;-1:-1:-1;;;;;;32041:51:0;-1:-1:-1;;;32041:51:0;;-1:-1:-1;32034:58:0;;31878:620;-1:-1:-1;32482:4:0;31706:799;;;;;;:::o;37884:988::-;38150:22;38200:1;38175:22;38192:4;38175:16;:22::i;:::-;:26;;;;:::i;:::-;38212:18;38233:26;;;:17;:26;;;;;;38150:51;;-1:-1:-1;38366:28:0;;;38362:328;;-1:-1:-1;;;;;38433:18:0;;38411:19;38433:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38484:30;;;;;;:44;;;38601:30;;:17;:30;;;;;:43;;;38362:328;-1:-1:-1;38786:26:0;;;;:17;:26;;;;;;;;38779:33;;;-1:-1:-1;;;;;38830:18:0;;;;;:12;:18;;;;;:34;;;;;;;38823:41;37884:988::o;39167:1079::-;39445:10;:17;39420:22;;39445:21;;39465:1;;39445:21;:::i;:::-;39477:18;39498:24;;;:15;:24;;;;;;39871:10;:26;;39420:46;;-1:-1:-1;39498:24:0;;39420:46;;39871:26;;;;;;:::i;:::-;;;;;;;;;39849:48;;39935:11;39910:10;39921;39910:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40015:28;;;:15;:28;;;;;;;:41;;;40187:24;;;;;40180:31;40222:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39238:1008;;;39167:1079;:::o;36671:221::-;36756:14;36773:20;36790:2;36773:16;:20::i;:::-;-1:-1:-1;;;;;36804:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;36849:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36671:221:0:o;28963:382::-;-1:-1:-1;;;;;29043:16:0;;29035:61;;;;-1:-1:-1;;;29035:61:0;;23505:2:1;29035:61:0;;;23487:21:1;;;23524:18;;;23517:30;23583:34;23563:18;;;23556:62;23635:18;;29035:61:0;23303:356:1;29035:61:0;27050:4;27074:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27074:16:0;:30;29107:58;;;;-1:-1:-1;;;29107:58:0;;23866:2:1;29107:58:0;;;23848:21:1;23905:2;23885:18;;;23878:30;23944;23924:18;;;23917:58;23992:18;;29107:58:0;23664:352:1;29107:58:0;29178:45;29207:1;29211:2;29215:7;29178:20;:45::i;:::-;-1:-1:-1;;;;;29236:13:0;;;;;;:9;:13;;;;;:18;;29253:1;;29236:13;:18;;29253:1;;29236:18;:::i;:::-;;;;-1:-1:-1;;29265:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29265:21:0;-1:-1:-1;;;;;29265:21:0;;;;;;;;29304:33;;29265:16;;;29304:33;;29265:16;;29304:33;28963:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;686:60;592:160;;;:::o;757:180::-;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;942:258::-;1014:1;1024:113;1038:6;1035:1;1032:13;1024:113;;;1114:11;;;1108:18;1095:11;;;1088:39;1060:2;1053:10;1024:113;;;1155:6;1152:1;1149:13;1146:48;;;-1:-1:-1;;1190:1:1;1172:16;;1165:27;942:258::o;1205:::-;1247:3;1285:5;1279:12;1312:6;1307:3;1300:19;1328:63;1384:6;1377:4;1372:3;1368:14;1361:4;1354:5;1350:16;1328:63;:::i;:::-;1445:2;1424:15;-1:-1:-1;;1420:29:1;1411:39;;;;1452:4;1407:50;;1205:258;-1:-1:-1;;1205:258:1:o;1468:220::-;1617:2;1606:9;1599:21;1580:4;1637:45;1678:2;1667:9;1663:18;1655:6;1637:45;:::i;1693:180::-;1752:6;1805:2;1793:9;1784:7;1780:23;1776:32;1773:52;;;1821:1;1818;1811:12;1773:52;-1:-1:-1;1844:23:1;;1693:180;-1:-1:-1;1693:180:1:o;2086:173::-;2154:20;;-1:-1:-1;;;;;2203:31:1;;2193:42;;2183:70;;2249:1;2246;2239:12;2264:254;2332:6;2340;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2432:29;2451:9;2432:29;:::i;:::-;2422:39;2508:2;2493:18;;;;2480:32;;-1:-1:-1;;;2264:254:1:o;2705:328::-;2782:6;2790;2798;2851:2;2839:9;2830:7;2826:23;2822:32;2819:52;;;2867:1;2864;2857:12;2819:52;2890:29;2909:9;2890:29;:::i;:::-;2880:39;;2938:38;2972:2;2961:9;2957:18;2938:38;:::i;:::-;2928:48;;3023:2;3012:9;3008:18;2995:32;2985:42;;2705:328;;;;;:::o;3038:186::-;3097:6;3150:2;3138:9;3129:7;3125:23;3121:32;3118:52;;;3166:1;3163;3156:12;3118:52;3189:29;3208:9;3189:29;:::i;3229:632::-;3400:2;3452:21;;;3522:13;;3425:18;;;3544:22;;;3371:4;;3400:2;3623:15;;;;3597:2;3582:18;;;3371:4;3666:169;3680:6;3677:1;3674:13;3666:169;;;3741:13;;3729:26;;3810:15;;;;3775:12;;;;3702:1;3695:9;3666:169;;;-1:-1:-1;3852:3:1;;3229:632;-1:-1:-1;;;;;;3229:632:1:o;3866:127::-;3927:10;3922:3;3918:20;3915:1;3908:31;3958:4;3955:1;3948:15;3982:4;3979:1;3972:15;3998:632;4063:5;4093:18;4134:2;4126:6;4123:14;4120:40;;;4140:18;;:::i;:::-;4215:2;4209:9;4183:2;4269:15;;-1:-1:-1;;4265:24:1;;;4291:2;4261:33;4257:42;4245:55;;;4315:18;;;4335:22;;;4312:46;4309:72;;;4361:18;;:::i;:::-;4401:10;4397:2;4390:22;4430:6;4421:15;;4460:6;4452;4445:22;4500:3;4491:6;4486:3;4482:16;4479:25;4476:45;;;4517:1;4514;4507:12;4476:45;4567:6;4562:3;4555:4;4547:6;4543:17;4530:44;4622:1;4615:4;4606:6;4598;4594:19;4590:30;4583:41;;;;3998:632;;;;;:::o;4635:451::-;4704:6;4757:2;4745:9;4736:7;4732:23;4728:32;4725:52;;;4773:1;4770;4763:12;4725:52;4813:9;4800:23;4846:18;4838:6;4835:30;4832:50;;;4878:1;4875;4868:12;4832:50;4901:22;;4954:4;4946:13;;4942:27;-1:-1:-1;4932:55:1;;4983:1;4980;4973:12;4932:55;5006:74;5072:7;5067:2;5054:16;5049:2;5045;5041:11;5006:74;:::i;5091:689::-;5183:6;5191;5199;5252:2;5240:9;5231:7;5227:23;5223:32;5220:52;;;5268:1;5265;5258:12;5220:52;5308:9;5295:23;5337:18;5378:2;5370:6;5367:14;5364:34;;;5394:1;5391;5384:12;5364:34;5432:6;5421:9;5417:22;5407:32;;5477:7;5470:4;5466:2;5462:13;5458:27;5448:55;;5499:1;5496;5489:12;5448:55;5539:2;5526:16;5565:2;5557:6;5554:14;5551:34;;;5581:1;5578;5571:12;5551:34;5636:7;5629:4;5619:6;5616:1;5612:14;5608:2;5604:23;5600:34;5597:47;5594:67;;;5657:1;5654;5647:12;5594:67;5688:4;5680:13;;;;-1:-1:-1;5712:6:1;-1:-1:-1;5737:37:1;;5753:20;;;-1:-1:-1;5737:37:1;:::i;:::-;5727:47;;5091:689;;;;;:::o;5785:254::-;5850:6;5858;5911:2;5899:9;5890:7;5886:23;5882:32;5879:52;;;5927:1;5924;5917:12;5879:52;5950:29;5969:9;5950:29;:::i;:::-;5940:39;;5998:35;6029:2;6018:9;6014:18;5998:35;:::i;:::-;5988:45;;5785:254;;;;;:::o;6044:667::-;6139:6;6147;6155;6163;6216:3;6204:9;6195:7;6191:23;6187:33;6184:53;;;6233:1;6230;6223:12;6184:53;6256:29;6275:9;6256:29;:::i;:::-;6246:39;;6304:38;6338:2;6327:9;6323:18;6304:38;:::i;:::-;6294:48;;6389:2;6378:9;6374:18;6361:32;6351:42;;6444:2;6433:9;6429:18;6416:32;6471:18;6463:6;6460:30;6457:50;;;6503:1;6500;6493:12;6457:50;6526:22;;6579:4;6571:13;;6567:27;-1:-1:-1;6557:55:1;;6608:1;6605;6598:12;6557:55;6631:74;6697:7;6692:2;6679:16;6674:2;6670;6666:11;6631:74;:::i;:::-;6621:84;;;6044:667;;;;;;;:::o;6716:254::-;6784:6;6792;6845:2;6833:9;6824:7;6820:23;6816:32;6813:52;;;6861:1;6858;6851:12;6813:52;6897:9;6884:23;6874:33;;6926:38;6960:2;6949:9;6945:18;6926:38;:::i;6975:260::-;7043:6;7051;7104:2;7092:9;7083:7;7079:23;7075:32;7072:52;;;7120:1;7117;7110:12;7072:52;7143:29;7162:9;7143:29;:::i;:::-;7133:39;;7191:38;7225:2;7214:9;7210:18;7191:38;:::i;7240:356::-;7442:2;7424:21;;;7461:18;;;7454:30;7520:34;7515:2;7500:18;;7493:62;7587:2;7572:18;;7240:356::o;7601:380::-;7680:1;7676:12;;;;7723;;;7744:61;;7798:4;7790:6;7786:17;7776:27;;7744:61;7851:2;7843:6;7840:14;7820:18;7817:38;7814:161;;;7897:10;7892:3;7888:20;7885:1;7878:31;7932:4;7929:1;7922:15;7960:4;7957:1;7950:15;7814:161;;7601:380;;;:::o;9580:413::-;9782:2;9764:21;;;9821:2;9801:18;;;9794:30;9860:34;9855:2;9840:18;;9833:62;-1:-1:-1;;;9926:2:1;9911:18;;9904:47;9983:3;9968:19;;9580:413::o;10620:127::-;10681:10;10676:3;10672:20;10669:1;10662:31;10712:4;10709:1;10702:15;10736:4;10733:1;10726:15;10752:127;10813:10;10808:3;10804:20;10801:1;10794:31;10844:4;10841:1;10834:15;10868:4;10865:1;10858:15;10884:135;10923:3;-1:-1:-1;;10944:17:1;;10941:43;;;10964:18;;:::i;:::-;-1:-1:-1;11011:1:1;11000:13;;10884:135::o;14494:128::-;14534:3;14565:1;14561:6;14558:1;14555:13;14552:39;;;14571:18;;:::i;:::-;-1:-1:-1;14607:9:1;;14494:128::o;16506:168::-;16546:7;16612:1;16608;16604:6;16600:14;16597:1;16594:21;16589:1;16582:9;16575:17;16571:45;16568:71;;;16619:18;;:::i;:::-;-1:-1:-1;16659:9:1;;16506:168::o;17086:127::-;17147:10;17142:3;17138:20;17135:1;17128:31;17178:4;17175:1;17168:15;17202:4;17199:1;17192:15;17218:120;17258:1;17284;17274:35;;17289:18;;:::i;:::-;-1:-1:-1;17323:9:1;;17218:120::o;18590:1527::-;18814:3;18852:6;18846:13;18878:4;18891:51;18935:6;18930:3;18925:2;18917:6;18913:15;18891:51;:::i;:::-;19005:13;;18964:16;;;;19027:55;19005:13;18964:16;19049:15;;;19027:55;:::i;:::-;19171:13;;19104:20;;;19144:1;;19231;19253:18;;;;19306;;;;19333:93;;19411:4;19401:8;19397:19;19385:31;;19333:93;19474:2;19464:8;19461:16;19441:18;19438:40;19435:167;;;-1:-1:-1;;;19501:33:1;;19557:4;19554:1;19547:15;19587:4;19508:3;19575:17;19435:167;19618:18;19645:110;;;;19769:1;19764:328;;;;19611:481;;19645:110;-1:-1:-1;;19680:24:1;;19666:39;;19725:20;;;;-1:-1:-1;19645:110:1;;19764:328;18537:1;18530:14;;;18574:4;18561:18;;19859:1;19873:169;19887:8;19884:1;19881:15;19873:169;;;19969:14;;19954:13;;;19947:37;20012:16;;;;19904:10;;19873:169;;;19877:3;;20073:8;20066:5;20062:20;20055:27;;19611:481;-1:-1:-1;20108:3:1;;18590:1527;-1:-1:-1;;;;;;;;;;;18590:1527:1:o;21757:125::-;21797:4;21825:1;21822;21819:8;21816:34;;;21830:18;;:::i;:::-;-1:-1:-1;21867:9:1;;21757:125::o;21887:414::-;22089:2;22071:21;;;22128:2;22108:18;;;22101:30;22167:34;22162:2;22147:18;;22140:62;-1:-1:-1;;;22233:2:1;22218:18;;22211:48;22291:3;22276:19;;21887:414::o;22306:112::-;22338:1;22364;22354:35;;22369:18;;:::i;:::-;-1:-1:-1;22403:9:1;;22306:112::o;22423:489::-;-1:-1:-1;;;;;22692:15:1;;;22674:34;;22744:15;;22739:2;22724:18;;22717:43;22791:2;22776:18;;22769:34;;;22839:3;22834:2;22819:18;;22812:31;;;22617:4;;22860:46;;22886:19;;22878:6;22860:46;:::i;:::-;22852:54;22423:489;-1:-1:-1;;;;;;22423:489:1:o;22917:249::-;22986:6;23039:2;23027:9;23018:7;23014:23;23010:32;23007:52;;;23055:1;23052;23045:12;23007:52;23087:9;23081:16;23106:30;23130:5;23106:30;:::i;23171:127::-;23232:10;23227:3;23223:20;23220:1;23213:31;23263:4;23260:1;23253:15;23287:4;23284:1;23277:15
Swarm Source
ipfs://cf18c9f86862d2ac07f34ec73d26b5d2e4c21f4b0a5ab4ed829ead05c1cf9a88
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.