ERC-721
Overview
Max Total Supply
52 SQU
Holders
19
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SQULoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SquareUpContest
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-08 */ // SPDX-License-Identifier: UNLICENSED // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @chainlink/contracts/src/v0.8/interfaces/[email protected] pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * @param callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * @param numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint64 subId) external; /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint64 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint64 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint64 subId, address to) external; } // File @chainlink/contracts/src/v0.8/[email protected] pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _vrfCoordinator; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File contracts/SquareUpContest.sol pragma solidity ^0.8.0; contract SquareUpContest is ERC721, VRFConsumerBaseV2, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter public tokenIds; VRFCoordinatorV2Interface COORDINATOR; uint16 constant RequestConfirmations = 5; string public constant BaseExtension = ".json"; uint constant private MaxTicketsPerMint = 1; uint32 constant CallbackGasLimit = 300000; uint32 constant NumWords = 1; uint64 immutable public LinkSubScriptionId; uint256 immutable public maxSupply; uint256 immutable public MintFee; bytes32 public KeyHash; bytes32 public MerkleRootVIP; bytes32 public MerkleRootWhitelist; uint256[] public LinkRandomWords; uint256 public LinkRandomOffset; uint256 public RequestId; string public BaselineURI; uint256 public dtMintStartVIP; struct Payout { uint256 token; uint256 amount; } struct PayoutSet { uint256 amount; uint time; } enum EPhase { Mint, Between, Game, Payout } enum EMintType{ VIP, Whitelist, Public } EPhase public Phase = EPhase.Mint; mapping(uint256 => PayoutSet) public PayoutPendingWithdrawls; mapping(address=> uint) public VIPClaimed; mapping(address=> uint) public WhitelistClaimed; ///events event PayoutsSet(uint256 indexed tokenId, uint256 indexed amount); event PayoutWithdraw(uint256 indexed tokenId, address indexed user, uint256 indexed amount); constructor( uint64 _linkSubscriptionId, address _vrfCoordinatorAddress, bytes32 _keyHash, string memory _baselineURIMintPhase, uint256 _maxTickets, uint256 _mintFee, uint256 _dtMintStartVIP, bytes32 _merkleRootVIP, bytes32 _merkleRootWhitelist, string memory _contestDescription ) VRFConsumerBaseV2 (_vrfCoordinatorAddress) ERC721(_contestDescription, "SQU") { COORDINATOR = VRFCoordinatorV2Interface(_vrfCoordinatorAddress); LinkSubScriptionId = _linkSubscriptionId; KeyHash = _keyHash; BaselineURI = _baselineURIMintPhase; maxSupply = _maxTickets; MintFee = _mintFee; dtMintStartVIP = _dtMintStartVIP; MerkleRootVIP = _merkleRootVIP; MerkleRootWhitelist = _merkleRootWhitelist; } function MAX_SUPPLY() public view returns (uint256) { return maxSupply; } function mintTicket(uint quantity, address sender) private { for (uint32 i = 0; i < quantity; i++) { tokenIds.increment(); uint256 newItemId = tokenIds.current(); _mint(sender, newItemId); } } function mintCheck(uint quantity, uint amount, EMintType mintType) private view { require(Phase == EPhase.Mint, "Mint phase is off"); require(quantity > 0, "Cant mint 0 tickets"); if (mintType == EMintType.VIP) { require(quantity <= MaxTicketsPerMint, "Can't mint this many tickets in one transaction"); } else { require(quantity <= 10, "Can't mint this many tickets in one transaction"); } require(tokenIds.current() + quantity <= maxSupply, "Can't mint more than the total number of available tickets."); require(amount >= MintFee * quantity, "Not enough funds"); } function mintTicketVIP(uint quantity, bytes32[] calldata _merkleProof) public payable nonReentrant { require(dtMintStartVIP <= block.timestamp, "Can't mint yet. Try again in a few seconds."); require(VIPClaimed[msg.sender] + quantity <= 2, "VIP can't mint more than two tickets"); mintCheck(quantity, msg.value, EMintType.VIP); bytes32 leaf = keccak256((abi.encodePacked(msg.sender))); require(MerkleProof.verify(_merkleProof, MerkleRootVIP, leaf), "Not VIP"); VIPClaimed[msg.sender] = VIPClaimed[msg.sender] + quantity; mintTicket(quantity, msg.sender); } function mintTicketWhitelist(uint quantity, bytes32[] calldata _merkleProof) public payable nonReentrant { require(dtMintStartVIP + 1 hours <= block.timestamp, "Can't mint yet. Try again in a few seconds."); mintCheck(quantity, msg.value, EMintType.Whitelist); bytes32 leaf = keccak256((abi.encodePacked(msg.sender))); require(MerkleProof.verify(_merkleProof, MerkleRootWhitelist, leaf), "Not on the whitelist"); require(WhitelistClaimed[msg.sender] + quantity <= 10, "Whitelist can't mint more than 10 tickets"); WhitelistClaimed[msg.sender] = WhitelistClaimed[msg.sender] + quantity; mintTicket(quantity, msg.sender); } function mintTicketPublic(uint quantity) public payable nonReentrant { require(dtMintStartVIP + 2 hours <= block.timestamp, "Can't mint yet. Try again in a few seconds."); mintCheck(quantity, msg.value, EMintType.Public); mintTicket(quantity, msg.sender); } function setBaseURIGamePhase(string memory _baseUriNew) public onlyOwner { require(Phase == EPhase.Between, "Cannot switch team lists"); require(LinkRandomWords.length > 0, "Cannot set base uri without chainlink random words"); BaselineURI = _baseUriNew; Phase = EPhase.Game; } function setMintPhaseOff() external onlyOwner() { require(Phase == EPhase.Mint, "Mint phase is off"); Phase = EPhase.Between; } function totalSupply() external view returns (uint256) { return tokenIds.current(); } function _baseURI() internal view override returns (string memory) { return BaselineURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "query for nonexistent token"); string memory baseURI = _baseURI(); if (Phase == EPhase.Mint || Phase == EPhase.Between) { return baseURI; } uint256 offset = offsetCalcURI(tokenId); string memory uri = string(abi.encodePacked(baseURI, Strings.toString(offset))); return string(abi.encodePacked(uri, BaseExtension)); } function offsetCalcURI(uint256 tokenId) public view returns (uint256) { require(_exists(tokenId), "query for nonexistent token"); require(LinkRandomWords.length > 0, "link random words doesn't exist"); return (LinkRandomWords[0] + tokenId) % tokenIds.current() + 1; //from 1 to # tickets minted } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721) { require(Phase != EPhase.Payout, "No transfers once payouts are set"); super._beforeTokenTransfer(from, to, tokenId); } function setMintStartTime(uint256 _newTime) external onlyOwner{ dtMintStartVIP = _newTime; } function setGasLaneLink(bytes32 _gasLane) external onlyOwner { KeyHash = _gasLane; } function requestRandomWords() external onlyOwner { require(Phase == EPhase.Between, "Teams cannot be set during the mint phase"); require(LinkRandomWords.length == 0, "Random words can only be set once"); require(tokenIds.current() > 0, "Must have teams to shuffle"); RequestId = COORDINATOR.requestRandomWords( KeyHash, LinkSubScriptionId, RequestConfirmations, CallbackGasLimit, NumWords ); } function fulfillRandomWords( uint256, /* requestId */ uint256[] memory randomWords ) internal override { require(Phase == EPhase.Between, "Teams cannot be set during the mint phase"); LinkRandomWords = randomWords; } function randomWordsGet() external view returns (uint256[] memory) { return LinkRandomWords; } function setPayout(Payout calldata _payout) external onlyOwner { require(_exists(_payout.token), "query for nonexistent token"); require(PayoutPendingWithdrawls[_payout.token].amount == 0 && PayoutPendingWithdrawls[_payout.token].time == 0, "Payout already set in the past"); require(Phase != EPhase.Mint && Phase != EPhase.Between, "Must be in game phase or later"); if (Phase == EPhase.Game) { Phase = EPhase.Payout; } uint timeNow = block.timestamp; PayoutSet memory payoutSet = PayoutSet(_payout.amount, timeNow); PayoutPendingWithdrawls[_payout.token] = payoutSet; emit PayoutsSet(_payout.token, _payout.amount); } function withdrawPayout(uint256 _tokenId) external payable nonReentrant { require(_exists(_tokenId), "query for nonexistent token"); require(ownerOf(_tokenId) == msg.sender, "Unauthorized"); require(PayoutPendingWithdrawls[_tokenId].time > 0, "No Payout set for this ticket"); require(PayoutPendingWithdrawls[_tokenId].amount > 0, "Payout Already Claimed"); uint256 amount = PayoutPendingWithdrawls[_tokenId].amount; PayoutPendingWithdrawls[_tokenId].amount = 0; emit PayoutWithdraw(_tokenId, msg.sender, amount); (bool sent, ) = (msg.sender.call{value: amount}("")); require(sent, "Transfer failed."); } function withdrawUnclaimed(address _destination, uint256 _tokenId) external payable onlyOwner { require(_exists(_tokenId), "query for nonexistent token"); uint timeNow = block.timestamp; require(PayoutPendingWithdrawls[_tokenId].time != 0 && timeNow - PayoutPendingWithdrawls[_tokenId].time > 7776000 , "Can only withdraw unclaimed 90 days after Payouts are set"); uint256 amount = PayoutPendingWithdrawls[_tokenId].amount; PayoutPendingWithdrawls[_tokenId].amount = 0; (bool sent, ) = (_destination.call{value: amount}("")); require(sent, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint64","name":"_linkSubscriptionId","type":"uint64"},{"internalType":"address","name":"_vrfCoordinatorAddress","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"string","name":"_baselineURIMintPhase","type":"string"},{"internalType":"uint256","name":"_maxTickets","type":"uint256"},{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_dtMintStartVIP","type":"uint256"},{"internalType":"bytes32","name":"_merkleRootVIP","type":"bytes32"},{"internalType":"bytes32","name":"_merkleRootWhitelist","type":"bytes32"},{"internalType":"string","name":"_contestDescription","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutsSet","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":[],"name":"BaseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BaselineURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkRandomOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"LinkRandomWords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkSubScriptionId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MerkleRootVIP","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MerkleRootWhitelist","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PayoutPendingWithdrawls","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Phase","outputs":[{"internalType":"enum SquareUpContest.EPhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"VIPClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WhitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dtMintStartVIP","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintTicketPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintTicketVIP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintTicketWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"offsetCalcURI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomWordsGet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomWords","outputs":[],"stateMutability":"nonpayable","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":"_baseUriNew","type":"string"}],"name":"setBaseURIGamePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_gasLane","type":"bytes32"}],"name":"setGasLaneLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintPhaseOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SquareUpContest.Payout","name":"_payout","type":"tuple"}],"name":"setPayout","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":[],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"_value","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":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawPayout","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawUnclaimed","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6101006040526012805460ff191690553480156200001c57600080fd5b5060405162003921380380620039218339810160408190526200003f9162000302565b88816040518060400160405280600381526020016253515560e81b81525081600090805190602001906200007592919062000170565b5080516200008b90600190602084019062000170565b50505060601b6001600160601b031916608052620000b0620000aa3390565b6200011e565b6001600755600980546001600160a01b0319166001600160a01b038b1617905560c08a901b6001600160c01b03191660a052600a8890558651620000fc9060109060208a019062000170565b505060c09490945260e092909252601155600b55600c55506200042192505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200017e90620003ce565b90600052602060002090601f016020900481019282620001a25760008555620001ed565b82601f10620001bd57805160ff1916838001178555620001ed565b82800160010185558215620001ed579182015b82811115620001ed578251825591602001919060010190620001d0565b50620001fb929150620001ff565b5090565b5b80821115620001fb576000815560010162000200565b80516001600160a01b03811681146200022e57600080fd5b919050565b600082601f8301126200024557600080fd5b81516001600160401b03808211156200026257620002626200040b565b604051601f8301601f19908116603f011681019082821181831017156200028d576200028d6200040b565b81604052838152602092508683858801011115620002aa57600080fd5b600091505b83821015620002ce5785820183015181830184015290820190620002af565b83821115620002e05760008385830101525b9695505050505050565b80516001600160401b03811681146200022e57600080fd5b6000806000806000806000806000806101408b8d0312156200032357600080fd5b6200032e8b620002ea565b99506200033e60208c0162000216565b60408c015160608d0151919a5098506001600160401b03808211156200036357600080fd5b620003718e838f0162000233565b985060808d0151975060a08d0151965060c08d0151955060e08d015194506101008d015193506101208d0151915080821115620003ad57600080fd5b50620003bc8d828e0162000233565b9150509295989b9194979a5092959850565b600181811c90821680620003e357607f821691505b602082108114156200040557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160c01c60c05160e05161349d6200048460003960008181610526015261244601526000818161042c015281816107e7015261239901526000818161083b0152611dee015260008181610d880152610dca015261349d6000f3fe6080604052600436106102ae5760003560e01c806370a0823111610175578063b21c7935116100dc578063da1f7bff11610095578063e985e9c51161006f578063e985e9c5146108a1578063ed7483be146108ea578063f2fde38b14610900578063fb96e6491461092057600080fd5b8063da1f7bff14610829578063da4e93cd14610876578063e0c862891461088c57600080fd5b8063b21c793514610762578063b47654f414610775578063b88d4fde14610795578063c87b56dd146107b5578063d5abeb01146107d5578063d5b3621b1461080957600080fd5b806395d89b411161012e57806395d89b41146106b85780639ba7c0a4146106cd5780639c7b99a6146106e0578063a22cb46514610700578063a807e1a314610720578063ab1686ab1461073557600080fd5b806370a0823114610612578063714cff5614610632578063715018a61461064957806381e55e261461065e578063826b41de146106735780638da5cb5b1461069a57600080fd5b80634051a5a61161021957806353a8bf22116101d257806353a8bf22146105485780635867141e1461055e5780635bb8ae7c146105805780636352211e146105c95780636790884a146105e95780636e084235146105fc57600080fd5b80634051a5a61461048157806342842e0e146104a15780634286918c146104c157806344b7c545146104e15780634d456dcb146105015780634eb5659f1461051457600080fd5b80631fe543e31161026b5780631fe543e31461039a57806323b872dd146103ba578063251b5e50146103da5780633227555a1461040757806332cb6b0c1461041d5780633cb6a8d11461045057600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063081812fc1461030a578063095ea7b3146103425780630de5c7131461036457806318160ddd14610377575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612d70565b610936565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd610988565b6040516102df9190613060565b34801561031657600080fd5b5061032a610325366004612d57565b610a1a565b6040516001600160a01b0390911681526020016102df565b34801561034e57600080fd5b5061036261035d366004612d2d565b610aa7565b005b610362610372366004612d2d565b610bbd565b34801561038357600080fd5b5061038c610d6d565b6040519081526020016102df565b3480156103a657600080fd5b506103626103b5366004612ea3565b610d7d565b3480156103c657600080fd5b506103626103d5366004612c39565b610e05565b3480156103e657600080fd5b5061038c6103f5366004612be4565b60146020526000908152604090205481565b34801561041357600080fd5b5061038c600c5481565b34801561042957600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061038c565b34801561045c57600080fd5b506102fd60405180604001604052806005815260200164173539b7b760d91b81525081565b34801561048d57600080fd5b5061036261049c366004612df3565b610e36565b3480156104ad57600080fd5b506103626104bc366004612c39565b61101d565b3480156104cd57600080fd5b5061038c6104dc366004612d57565b611038565b3480156104ed57600080fd5b506103626104fc366004612d57565b6110f0565b61036261050f366004612d57565b61111f565b34801561052057600080fd5b5061038c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561055457600080fd5b5061038c600a5481565b34801561056a57600080fd5b50610573611194565b6040516102df9190612ff4565b34801561058c57600080fd5b506105b461059b366004612d57565b6013602052600090815260409020805460019091015482565b604080519283526020830191909152016102df565b3480156105d557600080fd5b5061032a6105e4366004612d57565b6111eb565b6103626105f7366004612e24565b611262565b34801561060857600080fd5b5061038c600e5481565b34801561061e57600080fd5b5061038c61062d366004612be4565b611444565b34801561063e57600080fd5b5060085461038c9081565b34801561065557600080fd5b506103626114cb565b34801561066a57600080fd5b506102fd611501565b34801561067f57600080fd5b5060125461068d9060ff1681565b6040516102df9190613038565b3480156106a657600080fd5b506006546001600160a01b031661032a565b3480156106c457600080fd5b506102fd61158f565b6103626106db366004612e24565b61159e565b3480156106ec57600080fd5b5061038c6106fb366004612d57565b611755565b34801561070c57600080fd5b5061036261071b366004612cf1565b611776565b34801561072c57600080fd5b50610362611781565b34801561074157600080fd5b5061038c610750366004612be4565b60156020526000908152604090205481565b610362610770366004612d57565b611814565b34801561078157600080fd5b50610362610790366004612daa565b611a3a565b3480156107a157600080fd5b506103626107b0366004612c75565b611b58565b3480156107c157600080fd5b506102fd6107d0366004612d57565b611b90565b3480156107e157600080fd5b5061038c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561081557600080fd5b50610362610824366004612d57565b611c87565b34801561083557600080fd5b5061085d7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102df565b34801561088257600080fd5b5061038c60115481565b34801561089857600080fd5b50610362611cb6565b3480156108ad57600080fd5b506102d36108bc366004612c06565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108f657600080fd5b5061038c600b5481565b34801561090c57600080fd5b5061036261091b366004612be4565b611e96565b34801561092c57600080fd5b5061038c600f5481565b60006001600160e01b031982166380ac58cd60e01b148061096757506001600160e01b03198216635b5e139f60e01b145b8061098257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109979061335b565b80601f01602080910402602001604051908101604052809291908181526020018280546109c39061335b565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2582611f31565b610a8b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ab2826111eb565b9050806001600160a01b0316836001600160a01b03161415610b205760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a82565b336001600160a01b0382161480610b3c5750610b3c81336108bc565b610bae5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a82565b610bb88383611f4e565b505050565b6006546001600160a01b03163314610be75760405162461bcd60e51b8152600401610a82906131df565b610bf081611f31565b610c0c5760405162461bcd60e51b8152600401610a829061315f565b600081815260136020526040902060010154429015801590610c4c57506000828152601360205260409020600101546276a70090610c4a9083613318565b115b610cbe5760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610a82565b60008281526013602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610d1d576040519150601f19603f3d011682016040523d82523d6000602084013e610d22565b606091505b5050905080610d665760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a82565b5050505050565b6000610d7860085490565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610df75760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610a82565b610e018282611fbc565b5050565b610e0f3382612005565b610e2b5760405162461bcd60e51b8152600401610a8290613214565b610bb88383836120ef565b6006546001600160a01b03163314610e605760405162461bcd60e51b8152600401610a82906131df565b610e6a8135611f31565b610e865760405162461bcd60e51b8152600401610a829061315f565b8035600090815260136020526040902054158015610eb557508035600090815260136020526040902060010154155b610f015760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610a82565b600060125460ff166003811115610f1a57610f1a61340f565b14158015610f3f5750600160125460ff166003811115610f3c57610f3c61340f565b14155b610f8b5760405162461bcd60e51b815260206004820152601e60248201527f4d75737420626520696e2067616d65207068617365206f72206c6174657200006044820152606401610a82565b600260125460ff166003811115610fa457610fa461340f565b1415610fb8576012805460ff191660031790555b604080518082018252602080840135808352428284018181528635600081815260139095528685208651815591516001909201919091559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610bb883838360405180602001604052806000815250611b58565b600061104382611f31565b61105f5760405162461bcd60e51b8152600401610a829061315f565b600d546110ae5760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610a82565b60085482600d6000815481106110c6576110c6613425565b90600052602060002001546110db91906132cd565b6110e591906133cf565b6109829060016132cd565b6006546001600160a01b0316331461111a5760405162461bcd60e51b8152600401610a82906131df565b600a55565b600260075414156111425760405162461bcd60e51b8152600401610a8290613265565b6002600755601154429061115890611c206132cd565b11156111765760405162461bcd60e51b8152600401610a8290613073565b61118281346002612296565b61118c81336124ac565b506001600755565b6060600d805480602002602001604051908101604052809291908181526020018280548015610a1057602002820191906000526020600020905b8154815260200190600101908083116111ce575050505050905090565b6000818152600260205260408120546001600160a01b0316806109825760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a82565b600260075414156112855760405162461bcd60e51b8152600401610a8290613265565b6002600755601154429061129b90610e106132cd565b11156112b95760405162461bcd60e51b8152600401610a8290613073565b6112c583346001612296565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061133f83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506124f5565b6113825760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610a82565b33600090815260156020526040902054600a906113a09086906132cd565b11156114005760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e203160448201526830207469636b65747360b81b6064820152608401610a82565b3360009081526015602052604090205461141b9085906132cd565b336000818152601560205260409020919091556114399085906124ac565b505060016007555050565b60006001600160a01b0382166114af5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a82565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114f55760405162461bcd60e51b8152600401610a82906131df565b6114ff600061250b565b565b6010805461150e9061335b565b80601f016020809104026020016040519081016040528092919081815260200182805461153a9061335b565b80156115875780601f1061155c57610100808354040283529160200191611587565b820191906000526020600020905b81548152906001019060200180831161156a57829003601f168201915b505050505081565b6060600180546109979061335b565b600260075414156115c15760405162461bcd60e51b8152600401610a8290613265565b60026007556011544210156115e85760405162461bcd60e51b8152600401610a8290613073565b336000908152601460205260409020546002906116069085906132cd565b11156116605760405162461bcd60e51b8152602060048201526024808201527f5649502063616e2774206d696e74206d6f7265207468616e2074776f207469636044820152636b65747360e01b6064820152608401610a82565b61166c83346000612296565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506116e683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b5491508490506124f5565b61171c5760405162461bcd60e51b815260206004820152600760248201526604e6f74205649560cc1b6044820152606401610a82565b336000908152601460205260409020546117379085906132cd565b336000818152601460205260409020919091556114399085906124ac565b600d818154811061176557600080fd5b600091825260209091200154905081565b610e0133838361255d565b6006546001600160a01b031633146117ab5760405162461bcd60e51b8152600401610a82906131df565b600060125460ff1660038111156117c4576117c461340f565b146118055760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a82565b6012805460ff19166001179055565b600260075414156118375760405162461bcd60e51b8152600401610a8290613265565b600260075561184581611f31565b6118615760405162461bcd60e51b8152600401610a829061315f565b3361186b826111eb565b6001600160a01b0316146118b05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a82565b60008181526013602052604090206001015461190e5760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610a82565b6000818152601360205260409020546119625760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610a82565b600081815260136020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d80600081146119e7576040519150601f19603f3d011682016040523d82523d6000602084013e6119ec565b606091505b5050905080611a305760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a82565b5050600160075550565b6006546001600160a01b03163314611a645760405162461bcd60e51b8152600401610a82906131df565b600160125460ff166003811115611a7d57611a7d61340f565b14611aca5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610a82565b600d54611b345760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610a82565b8051611b47906010906020840190612a9d565b50506012805460ff19166002179055565b611b623383612005565b611b7e5760405162461bcd60e51b8152600401610a8290613214565b611b8a8484848461262c565b50505050565b6060611b9b82611f31565b611bb75760405162461bcd60e51b8152600401610a829061315f565b6000611bc161265f565b9050600060125460ff166003811115611bdc57611bdc61340f565b1480611bfe5750600160125460ff166003811115611bfc57611bfc61340f565b145b15611c095792915050565b6000611c1484611038565b9050600082611c228361266e565b604051602001611c33929190612f88565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611c6e928492909101612f88565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611cb15760405162461bcd60e51b8152600401610a82906131df565b601155565b6006546001600160a01b03163314611ce05760405162461bcd60e51b8152600401610a82906131df565b600160125460ff166003811115611cf957611cf961340f565b14611d165760405162461bcd60e51b8152600401610a8290613196565b600d5415611d705760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610a82565b6000611d7b60085490565b11611dc85760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610a82565b600954600a546040516305d3b1d360e41b8152600481019190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611e5957600080fd5b505af1158015611e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e919190612e0b565b600f55565b6006546001600160a01b03163314611ec05760405162461bcd60e51b8152600401610a82906131df565b6001600160a01b038116611f255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a82565b611f2e8161250b565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f83826111eb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600160125460ff166003811115611fd557611fd561340f565b14611ff25760405162461bcd60e51b8152600401610a8290613196565b8051610bb890600d906020840190612b21565b600061201082611f31565b6120715760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a82565b600061207c836111eb565b9050806001600160a01b0316846001600160a01b031614806120c357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806120e75750836001600160a01b03166120dc84610a1a565b6001600160a01b0316145b949350505050565b826001600160a01b0316612102826111eb565b6001600160a01b0316146121665760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a82565b6001600160a01b0382166121c85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a82565b6121d383838361276c565b6121de600082611f4e565b6001600160a01b0383166000908152600360205260408120805460019290612207908490613318565b90915550506001600160a01b03821660009081526003602052604081208054600192906122359084906132cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600060125460ff1660038111156122af576122af61340f565b146122f05760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a82565b600083116123365760405162461bcd60e51b815260206004820152601360248201527243616e74206d696e742030207469636b65747360681b6044820152606401610a82565b600081600281111561234a5761234a61340f565b14156123765760018311156123715760405162461bcd60e51b8152600401610a8290613110565b612397565b600a8311156123975760405162461bcd60e51b8152600401610a8290613110565b7f0000000000000000000000000000000000000000000000000000000000000000836123c260085490565b6123cc91906132cd565b11156124405760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610a82565b61246a837f00000000000000000000000000000000000000000000000000000000000000006132f9565b821015610bb85760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610a82565b60005b828163ffffffff161015610bb8576124cb600880546001019055565b60006124d660085490565b90506124e283826127dd565b50806124ed816133ab565b9150506124af565b600082612502858461291c565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a82565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6126378484846120ef565b61264384848484612990565b611b8a5760405162461bcd60e51b8152600401610a82906130be565b6060601080546109979061335b565b6060816126925750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126bc57806126a681613390565b91506126b59050600a836132e5565b9150612696565b60008167ffffffffffffffff8111156126d7576126d761343b565b6040519080825280601f01601f191660200182016040528015612701576020820181803683370190505b5090505b84156120e757612716600183613318565b9150612723600a866133cf565b61272e9060306132cd565b60f81b81838151811061274357612743613425565b60200101906001600160f81b031916908160001a905350612765600a866132e5565b9450612705565b600360125460ff1660038111156127855761278561340f565b1415610bb85760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610a82565b6001600160a01b0382166128335760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a82565b61283c81611f31565b156128895760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a82565b6128956000838361276c565b6001600160a01b03821660009081526003602052604081208054600192906128be9084906132cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561298857600085828151811061293e5761293e613425565b602002602001015190508083116129645760008381526020829052604090209250612975565b600081815260208490526040902092505b508061298081613390565b915050612921565b509392505050565b60006001600160a01b0384163b15612a9257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129d4903390899088908890600401612fb7565b602060405180830381600087803b1580156129ee57600080fd5b505af1925050508015612a1e575060408051601f3d908101601f19168201909252612a1b91810190612d8d565b60015b612a78573d808015612a4c576040519150601f19603f3d011682016040523d82523d6000602084013e612a51565b606091505b508051612a705760405162461bcd60e51b8152600401610a82906130be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120e7565b506001949350505050565b828054612aa99061335b565b90600052602060002090601f016020900481019282612acb5760008555612b11565b82601f10612ae457805160ff1916838001178555612b11565b82800160010185558215612b11579182015b82811115612b11578251825591602001919060010190612af6565b50612b1d929150612b5b565b5090565b828054828255906000526020600020908101928215612b115791602002820182811115612b11578251825591602001919060010190612af6565b5b80821115612b1d5760008155600101612b5c565b600067ffffffffffffffff831115612b8a57612b8a61343b565b612b9d601f8401601f191660200161329c565b9050828152838383011115612bb157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612bdf57600080fd5b919050565b600060208284031215612bf657600080fd5b612bff82612bc8565b9392505050565b60008060408385031215612c1957600080fd5b612c2283612bc8565b9150612c3060208401612bc8565b90509250929050565b600080600060608486031215612c4e57600080fd5b612c5784612bc8565b9250612c6560208501612bc8565b9150604084013590509250925092565b60008060008060808587031215612c8b57600080fd5b612c9485612bc8565b9350612ca260208601612bc8565b925060408501359150606085013567ffffffffffffffff811115612cc557600080fd5b8501601f81018713612cd657600080fd5b612ce587823560208401612b70565b91505092959194509250565b60008060408385031215612d0457600080fd5b612d0d83612bc8565b915060208301358015158114612d2257600080fd5b809150509250929050565b60008060408385031215612d4057600080fd5b612d4983612bc8565b946020939093013593505050565b600060208284031215612d6957600080fd5b5035919050565b600060208284031215612d8257600080fd5b8135612bff81613451565b600060208284031215612d9f57600080fd5b8151612bff81613451565b600060208284031215612dbc57600080fd5b813567ffffffffffffffff811115612dd357600080fd5b8201601f81018413612de457600080fd5b6120e784823560208401612b70565b600060408284031215612e0557600080fd5b50919050565b600060208284031215612e1d57600080fd5b5051919050565b600080600060408486031215612e3957600080fd5b83359250602084013567ffffffffffffffff80821115612e5857600080fd5b818601915086601f830112612e6c57600080fd5b813581811115612e7b57600080fd5b8760208260051b8501011115612e9057600080fd5b6020830194508093505050509250925092565b60008060408385031215612eb657600080fd5b8235915060208084013567ffffffffffffffff80821115612ed657600080fd5b818601915086601f830112612eea57600080fd5b813581811115612efc57612efc61343b565b8060051b9150612f0d84830161329c565b8181528481019084860184860187018b1015612f2857600080fd5b600095505b83861015612f4b578035835260019590950194918601918601612f2d565b508096505050505050509250929050565b60008151808452612f7481602086016020860161332f565b601f01601f19169290920160200192915050565b60008351612f9a81846020880161332f565b835190830190612fae81836020880161332f565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fea90830184612f5c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561302c57835183529284019291840191600101613010565b50909695505050505050565b602081016004831061305a57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000612bff6020830184612f5c565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156132c5576132c561343b565b604052919050565b600082198211156132e0576132e06133e3565b500190565b6000826132f4576132f46133f9565b500490565b6000816000190483118215151615613313576133136133e3565b500290565b60008282101561332a5761332a6133e3565b500390565b60005b8381101561334a578181015183820152602001613332565b83811115611b8a5750506000910152565b600181811c9082168061336f57607f821691505b60208210811415612e0557634e487b7160e01b600052602260045260246000fd5b60006000198214156133a4576133a46133e3565b5060010190565b600063ffffffff808316818114156133c5576133c56133e3565b6001019392505050565b6000826133de576133de6133f9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f2e57600080fdfea26469706673582212208701bbcadccee5a994f271ac1fa113e69db90820032d3ec4de63e8ca06741a5564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000063ba23a09b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e69b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e600000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d537650534a7372517569474b41315747694277767162396b76426e37526b4d34547368714c766843717173420000000000000000000000000000000000000000000000000000000000000000000000000000000000001b5371756172655570204e464c20233120536561736f6e20323032330000000000
Deployed Bytecode
0x6080604052600436106102ae5760003560e01c806370a0823111610175578063b21c7935116100dc578063da1f7bff11610095578063e985e9c51161006f578063e985e9c5146108a1578063ed7483be146108ea578063f2fde38b14610900578063fb96e6491461092057600080fd5b8063da1f7bff14610829578063da4e93cd14610876578063e0c862891461088c57600080fd5b8063b21c793514610762578063b47654f414610775578063b88d4fde14610795578063c87b56dd146107b5578063d5abeb01146107d5578063d5b3621b1461080957600080fd5b806395d89b411161012e57806395d89b41146106b85780639ba7c0a4146106cd5780639c7b99a6146106e0578063a22cb46514610700578063a807e1a314610720578063ab1686ab1461073557600080fd5b806370a0823114610612578063714cff5614610632578063715018a61461064957806381e55e261461065e578063826b41de146106735780638da5cb5b1461069a57600080fd5b80634051a5a61161021957806353a8bf22116101d257806353a8bf22146105485780635867141e1461055e5780635bb8ae7c146105805780636352211e146105c95780636790884a146105e95780636e084235146105fc57600080fd5b80634051a5a61461048157806342842e0e146104a15780634286918c146104c157806344b7c545146104e15780634d456dcb146105015780634eb5659f1461051457600080fd5b80631fe543e31161026b5780631fe543e31461039a57806323b872dd146103ba578063251b5e50146103da5780633227555a1461040757806332cb6b0c1461041d5780633cb6a8d11461045057600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063081812fc1461030a578063095ea7b3146103425780630de5c7131461036457806318160ddd14610377575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612d70565b610936565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd610988565b6040516102df9190613060565b34801561031657600080fd5b5061032a610325366004612d57565b610a1a565b6040516001600160a01b0390911681526020016102df565b34801561034e57600080fd5b5061036261035d366004612d2d565b610aa7565b005b610362610372366004612d2d565b610bbd565b34801561038357600080fd5b5061038c610d6d565b6040519081526020016102df565b3480156103a657600080fd5b506103626103b5366004612ea3565b610d7d565b3480156103c657600080fd5b506103626103d5366004612c39565b610e05565b3480156103e657600080fd5b5061038c6103f5366004612be4565b60146020526000908152604090205481565b34801561041357600080fd5b5061038c600c5481565b34801561042957600080fd5b507f000000000000000000000000000000000000000000000000000000000000006461038c565b34801561045c57600080fd5b506102fd60405180604001604052806005815260200164173539b7b760d91b81525081565b34801561048d57600080fd5b5061036261049c366004612df3565b610e36565b3480156104ad57600080fd5b506103626104bc366004612c39565b61101d565b3480156104cd57600080fd5b5061038c6104dc366004612d57565b611038565b3480156104ed57600080fd5b506103626104fc366004612d57565b6110f0565b61036261050f366004612d57565b61111f565b34801561052057600080fd5b5061038c7f0000000000000000000000000000000000000000000000000011c37937e0800081565b34801561055457600080fd5b5061038c600a5481565b34801561056a57600080fd5b50610573611194565b6040516102df9190612ff4565b34801561058c57600080fd5b506105b461059b366004612d57565b6013602052600090815260409020805460019091015482565b604080519283526020830191909152016102df565b3480156105d557600080fd5b5061032a6105e4366004612d57565b6111eb565b6103626105f7366004612e24565b611262565b34801561060857600080fd5b5061038c600e5481565b34801561061e57600080fd5b5061038c61062d366004612be4565b611444565b34801561063e57600080fd5b5060085461038c9081565b34801561065557600080fd5b506103626114cb565b34801561066a57600080fd5b506102fd611501565b34801561067f57600080fd5b5060125461068d9060ff1681565b6040516102df9190613038565b3480156106a657600080fd5b506006546001600160a01b031661032a565b3480156106c457600080fd5b506102fd61158f565b6103626106db366004612e24565b61159e565b3480156106ec57600080fd5b5061038c6106fb366004612d57565b611755565b34801561070c57600080fd5b5061036261071b366004612cf1565b611776565b34801561072c57600080fd5b50610362611781565b34801561074157600080fd5b5061038c610750366004612be4565b60156020526000908152604090205481565b610362610770366004612d57565b611814565b34801561078157600080fd5b50610362610790366004612daa565b611a3a565b3480156107a157600080fd5b506103626107b0366004612c75565b611b58565b3480156107c157600080fd5b506102fd6107d0366004612d57565b611b90565b3480156107e157600080fd5b5061038c7f000000000000000000000000000000000000000000000000000000000000006481565b34801561081557600080fd5b50610362610824366004612d57565b611c87565b34801561083557600080fd5b5061085d7f000000000000000000000000000000000000000000000000000000000000020f81565b60405167ffffffffffffffff90911681526020016102df565b34801561088257600080fd5b5061038c60115481565b34801561089857600080fd5b50610362611cb6565b3480156108ad57600080fd5b506102d36108bc366004612c06565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108f657600080fd5b5061038c600b5481565b34801561090c57600080fd5b5061036261091b366004612be4565b611e96565b34801561092c57600080fd5b5061038c600f5481565b60006001600160e01b031982166380ac58cd60e01b148061096757506001600160e01b03198216635b5e139f60e01b145b8061098257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109979061335b565b80601f01602080910402602001604051908101604052809291908181526020018280546109c39061335b565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2582611f31565b610a8b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ab2826111eb565b9050806001600160a01b0316836001600160a01b03161415610b205760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a82565b336001600160a01b0382161480610b3c5750610b3c81336108bc565b610bae5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a82565b610bb88383611f4e565b505050565b6006546001600160a01b03163314610be75760405162461bcd60e51b8152600401610a82906131df565b610bf081611f31565b610c0c5760405162461bcd60e51b8152600401610a829061315f565b600081815260136020526040902060010154429015801590610c4c57506000828152601360205260409020600101546276a70090610c4a9083613318565b115b610cbe5760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610a82565b60008281526013602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610d1d576040519150601f19603f3d011682016040523d82523d6000602084013e610d22565b606091505b5050905080610d665760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a82565b5050505050565b6000610d7860085490565b905090565b336001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091614610df75760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909166024820152604401610a82565b610e018282611fbc565b5050565b610e0f3382612005565b610e2b5760405162461bcd60e51b8152600401610a8290613214565b610bb88383836120ef565b6006546001600160a01b03163314610e605760405162461bcd60e51b8152600401610a82906131df565b610e6a8135611f31565b610e865760405162461bcd60e51b8152600401610a829061315f565b8035600090815260136020526040902054158015610eb557508035600090815260136020526040902060010154155b610f015760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610a82565b600060125460ff166003811115610f1a57610f1a61340f565b14158015610f3f5750600160125460ff166003811115610f3c57610f3c61340f565b14155b610f8b5760405162461bcd60e51b815260206004820152601e60248201527f4d75737420626520696e2067616d65207068617365206f72206c6174657200006044820152606401610a82565b600260125460ff166003811115610fa457610fa461340f565b1415610fb8576012805460ff191660031790555b604080518082018252602080840135808352428284018181528635600081815260139095528685208651815591516001909201919091559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610bb883838360405180602001604052806000815250611b58565b600061104382611f31565b61105f5760405162461bcd60e51b8152600401610a829061315f565b600d546110ae5760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610a82565b60085482600d6000815481106110c6576110c6613425565b90600052602060002001546110db91906132cd565b6110e591906133cf565b6109829060016132cd565b6006546001600160a01b0316331461111a5760405162461bcd60e51b8152600401610a82906131df565b600a55565b600260075414156111425760405162461bcd60e51b8152600401610a8290613265565b6002600755601154429061115890611c206132cd565b11156111765760405162461bcd60e51b8152600401610a8290613073565b61118281346002612296565b61118c81336124ac565b506001600755565b6060600d805480602002602001604051908101604052809291908181526020018280548015610a1057602002820191906000526020600020905b8154815260200190600101908083116111ce575050505050905090565b6000818152600260205260408120546001600160a01b0316806109825760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a82565b600260075414156112855760405162461bcd60e51b8152600401610a8290613265565b6002600755601154429061129b90610e106132cd565b11156112b95760405162461bcd60e51b8152600401610a8290613073565b6112c583346001612296565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061133f83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506124f5565b6113825760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610a82565b33600090815260156020526040902054600a906113a09086906132cd565b11156114005760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e203160448201526830207469636b65747360b81b6064820152608401610a82565b3360009081526015602052604090205461141b9085906132cd565b336000818152601560205260409020919091556114399085906124ac565b505060016007555050565b60006001600160a01b0382166114af5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a82565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114f55760405162461bcd60e51b8152600401610a82906131df565b6114ff600061250b565b565b6010805461150e9061335b565b80601f016020809104026020016040519081016040528092919081815260200182805461153a9061335b565b80156115875780601f1061155c57610100808354040283529160200191611587565b820191906000526020600020905b81548152906001019060200180831161156a57829003601f168201915b505050505081565b6060600180546109979061335b565b600260075414156115c15760405162461bcd60e51b8152600401610a8290613265565b60026007556011544210156115e85760405162461bcd60e51b8152600401610a8290613073565b336000908152601460205260409020546002906116069085906132cd565b11156116605760405162461bcd60e51b8152602060048201526024808201527f5649502063616e2774206d696e74206d6f7265207468616e2074776f207469636044820152636b65747360e01b6064820152608401610a82565b61166c83346000612296565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506116e683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b5491508490506124f5565b61171c5760405162461bcd60e51b815260206004820152600760248201526604e6f74205649560cc1b6044820152606401610a82565b336000908152601460205260409020546117379085906132cd565b336000818152601460205260409020919091556114399085906124ac565b600d818154811061176557600080fd5b600091825260209091200154905081565b610e0133838361255d565b6006546001600160a01b031633146117ab5760405162461bcd60e51b8152600401610a82906131df565b600060125460ff1660038111156117c4576117c461340f565b146118055760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a82565b6012805460ff19166001179055565b600260075414156118375760405162461bcd60e51b8152600401610a8290613265565b600260075561184581611f31565b6118615760405162461bcd60e51b8152600401610a829061315f565b3361186b826111eb565b6001600160a01b0316146118b05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a82565b60008181526013602052604090206001015461190e5760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610a82565b6000818152601360205260409020546119625760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610a82565b600081815260136020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d80600081146119e7576040519150601f19603f3d011682016040523d82523d6000602084013e6119ec565b606091505b5050905080611a305760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a82565b5050600160075550565b6006546001600160a01b03163314611a645760405162461bcd60e51b8152600401610a82906131df565b600160125460ff166003811115611a7d57611a7d61340f565b14611aca5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610a82565b600d54611b345760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610a82565b8051611b47906010906020840190612a9d565b50506012805460ff19166002179055565b611b623383612005565b611b7e5760405162461bcd60e51b8152600401610a8290613214565b611b8a8484848461262c565b50505050565b6060611b9b82611f31565b611bb75760405162461bcd60e51b8152600401610a829061315f565b6000611bc161265f565b9050600060125460ff166003811115611bdc57611bdc61340f565b1480611bfe5750600160125460ff166003811115611bfc57611bfc61340f565b145b15611c095792915050565b6000611c1484611038565b9050600082611c228361266e565b604051602001611c33929190612f88565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611c6e928492909101612f88565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611cb15760405162461bcd60e51b8152600401610a82906131df565b601155565b6006546001600160a01b03163314611ce05760405162461bcd60e51b8152600401610a82906131df565b600160125460ff166003811115611cf957611cf961340f565b14611d165760405162461bcd60e51b8152600401610a8290613196565b600d5415611d705760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610a82565b6000611d7b60085490565b11611dc85760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610a82565b600954600a546040516305d3b1d360e41b8152600481019190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000020f16602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611e5957600080fd5b505af1158015611e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e919190612e0b565b600f55565b6006546001600160a01b03163314611ec05760405162461bcd60e51b8152600401610a82906131df565b6001600160a01b038116611f255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a82565b611f2e8161250b565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f83826111eb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600160125460ff166003811115611fd557611fd561340f565b14611ff25760405162461bcd60e51b8152600401610a8290613196565b8051610bb890600d906020840190612b21565b600061201082611f31565b6120715760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a82565b600061207c836111eb565b9050806001600160a01b0316846001600160a01b031614806120c357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806120e75750836001600160a01b03166120dc84610a1a565b6001600160a01b0316145b949350505050565b826001600160a01b0316612102826111eb565b6001600160a01b0316146121665760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a82565b6001600160a01b0382166121c85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a82565b6121d383838361276c565b6121de600082611f4e565b6001600160a01b0383166000908152600360205260408120805460019290612207908490613318565b90915550506001600160a01b03821660009081526003602052604081208054600192906122359084906132cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600060125460ff1660038111156122af576122af61340f565b146122f05760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a82565b600083116123365760405162461bcd60e51b815260206004820152601360248201527243616e74206d696e742030207469636b65747360681b6044820152606401610a82565b600081600281111561234a5761234a61340f565b14156123765760018311156123715760405162461bcd60e51b8152600401610a8290613110565b612397565b600a8311156123975760405162461bcd60e51b8152600401610a8290613110565b7f0000000000000000000000000000000000000000000000000000000000000064836123c260085490565b6123cc91906132cd565b11156124405760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610a82565b61246a837f0000000000000000000000000000000000000000000000000011c37937e080006132f9565b821015610bb85760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610a82565b60005b828163ffffffff161015610bb8576124cb600880546001019055565b60006124d660085490565b90506124e283826127dd565b50806124ed816133ab565b9150506124af565b600082612502858461291c565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a82565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6126378484846120ef565b61264384848484612990565b611b8a5760405162461bcd60e51b8152600401610a82906130be565b6060601080546109979061335b565b6060816126925750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126bc57806126a681613390565b91506126b59050600a836132e5565b9150612696565b60008167ffffffffffffffff8111156126d7576126d761343b565b6040519080825280601f01601f191660200182016040528015612701576020820181803683370190505b5090505b84156120e757612716600183613318565b9150612723600a866133cf565b61272e9060306132cd565b60f81b81838151811061274357612743613425565b60200101906001600160f81b031916908160001a905350612765600a866132e5565b9450612705565b600360125460ff1660038111156127855761278561340f565b1415610bb85760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610a82565b6001600160a01b0382166128335760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a82565b61283c81611f31565b156128895760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a82565b6128956000838361276c565b6001600160a01b03821660009081526003602052604081208054600192906128be9084906132cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561298857600085828151811061293e5761293e613425565b602002602001015190508083116129645760008381526020829052604090209250612975565b600081815260208490526040902092505b508061298081613390565b915050612921565b509392505050565b60006001600160a01b0384163b15612a9257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129d4903390899088908890600401612fb7565b602060405180830381600087803b1580156129ee57600080fd5b505af1925050508015612a1e575060408051601f3d908101601f19168201909252612a1b91810190612d8d565b60015b612a78573d808015612a4c576040519150601f19603f3d011682016040523d82523d6000602084013e612a51565b606091505b508051612a705760405162461bcd60e51b8152600401610a82906130be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120e7565b506001949350505050565b828054612aa99061335b565b90600052602060002090601f016020900481019282612acb5760008555612b11565b82601f10612ae457805160ff1916838001178555612b11565b82800160010185558215612b11579182015b82811115612b11578251825591602001919060010190612af6565b50612b1d929150612b5b565b5090565b828054828255906000526020600020908101928215612b115791602002820182811115612b11578251825591602001919060010190612af6565b5b80821115612b1d5760008155600101612b5c565b600067ffffffffffffffff831115612b8a57612b8a61343b565b612b9d601f8401601f191660200161329c565b9050828152838383011115612bb157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612bdf57600080fd5b919050565b600060208284031215612bf657600080fd5b612bff82612bc8565b9392505050565b60008060408385031215612c1957600080fd5b612c2283612bc8565b9150612c3060208401612bc8565b90509250929050565b600080600060608486031215612c4e57600080fd5b612c5784612bc8565b9250612c6560208501612bc8565b9150604084013590509250925092565b60008060008060808587031215612c8b57600080fd5b612c9485612bc8565b9350612ca260208601612bc8565b925060408501359150606085013567ffffffffffffffff811115612cc557600080fd5b8501601f81018713612cd657600080fd5b612ce587823560208401612b70565b91505092959194509250565b60008060408385031215612d0457600080fd5b612d0d83612bc8565b915060208301358015158114612d2257600080fd5b809150509250929050565b60008060408385031215612d4057600080fd5b612d4983612bc8565b946020939093013593505050565b600060208284031215612d6957600080fd5b5035919050565b600060208284031215612d8257600080fd5b8135612bff81613451565b600060208284031215612d9f57600080fd5b8151612bff81613451565b600060208284031215612dbc57600080fd5b813567ffffffffffffffff811115612dd357600080fd5b8201601f81018413612de457600080fd5b6120e784823560208401612b70565b600060408284031215612e0557600080fd5b50919050565b600060208284031215612e1d57600080fd5b5051919050565b600080600060408486031215612e3957600080fd5b83359250602084013567ffffffffffffffff80821115612e5857600080fd5b818601915086601f830112612e6c57600080fd5b813581811115612e7b57600080fd5b8760208260051b8501011115612e9057600080fd5b6020830194508093505050509250925092565b60008060408385031215612eb657600080fd5b8235915060208084013567ffffffffffffffff80821115612ed657600080fd5b818601915086601f830112612eea57600080fd5b813581811115612efc57612efc61343b565b8060051b9150612f0d84830161329c565b8181528481019084860184860187018b1015612f2857600080fd5b600095505b83861015612f4b578035835260019590950194918601918601612f2d565b508096505050505050509250929050565b60008151808452612f7481602086016020860161332f565b601f01601f19169290920160200192915050565b60008351612f9a81846020880161332f565b835190830190612fae81836020880161332f565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fea90830184612f5c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561302c57835183529284019291840191600101613010565b50909695505050505050565b602081016004831061305a57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000612bff6020830184612f5c565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156132c5576132c561343b565b604052919050565b600082198211156132e0576132e06133e3565b500190565b6000826132f4576132f46133f9565b500490565b6000816000190483118215151615613313576133136133e3565b500290565b60008282101561332a5761332a6133e3565b500390565b60005b8381101561334a578181015183820152602001613332565b83811115611b8a5750506000910152565b600181811c9082168061336f57607f821691505b60208210811415612e0557634e487b7160e01b600052602260045260246000fd5b60006000198214156133a4576133a46133e3565b5060010190565b600063ffffffff808316818114156133c5576133c56133e3565b6001019392505050565b6000826133de576133de6133f9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f2e57600080fdfea26469706673582212208701bbcadccee5a994f271ac1fa113e69db90820032d3ec4de63e8ca06741a5564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000063ba23a09b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e69b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e600000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d537650534a7372517569474b41315747694277767162396b76426e37526b4d34547368714c766843717173420000000000000000000000000000000000000000000000000000000000000000000000000000000000001b5371756172655570204e464c20233120536561736f6e20323032330000000000
-----Decoded View---------------
Arg [0] : _linkSubscriptionId (uint64): 527
Arg [1] : _vrfCoordinatorAddress (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [2] : _keyHash (bytes32): 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : _baselineURIMintPhase (string): ipfs://QmSvPSJsrQuiGKA1WGiBwvqb9kvBn7RkM4TshqLvhCqqsB
Arg [4] : _maxTickets (uint256): 100
Arg [5] : _mintFee (uint256): 5000000000000000
Arg [6] : _dtMintStartVIP (uint256): 1673143200
Arg [7] : _merkleRootVIP (bytes32): 0x9b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e6
Arg [8] : _merkleRootWhitelist (bytes32): 0x9b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e6
Arg [9] : _contestDescription (string): SquareUp NFL #1 Season 2023
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000020f
Arg [1] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [2] : 8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [6] : 0000000000000000000000000000000000000000000000000000000063ba23a0
Arg [7] : 9b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e6
Arg [8] : 9b5ea714be4b52ac4fd7aa61ef666eae2ff93ff50e08d10ea489cf39cc62b2e6
Arg [9] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [11] : 697066733a2f2f516d537650534a7372517569474b4131574769427776716239
Arg [12] : 6b76426e37526b4d34547368714c766843717173420000000000000000000000
Arg [13] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [14] : 5371756172655570204e464c20233120536561736f6e20323032330000000000
Deployed Bytecode Sourcemap
55986:9456:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21643:305;;;;;;;;;;-1:-1:-1;21643:305:0;;;;;:::i;:::-;;:::i;:::-;;;9100:14:1;;9093:22;9075:41;;9063:2;9048:18;21643:305:0;;;;;;;;22588:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24148:221::-;;;;;;;;;;-1:-1:-1;24148:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7452:32:1;;;7434:51;;7422:2;7407:18;24148:221:0;7288:203:1;23671:411:0;;;;;;;;;;-1:-1:-1;23671:411:0;;;;;:::i;:::-;;:::i;:::-;;64829:608;;;;;;:::i;:::-;;:::i;61183:93::-;;;;;;;;;;;;;:::i;:::-;;;9273:25:1;;;9261:2;9246:18;61183:93:0;9127:177:1;46179:261:0;;;;;;;;;;-1:-1:-1;46179:261:0;;;;;:::i;:::-;;:::i;24898:339::-;;;;;;;;;;-1:-1:-1;24898:339:0;;;;;:::i;:::-;;:::i;57165:41::-;;;;;;;;;;-1:-1:-1;57165:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;56596:34;;;;;;;;;;;;;;;;58235:81;;;;;;;;;;-1:-1:-1;58301:9:0;58235:81;;56235:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56235:46:0;;;;;63491:674;;;;;;;;;;-1:-1:-1;63491:674:0;;;;;:::i;:::-;;:::i;25308:185::-;;;;;;;;;;-1:-1:-1;25308:185:0;;;;;:::i;:::-;;:::i;61870:314::-;;;;;;;;;;-1:-1:-1;61870:314:0;;;;;:::i;:::-;;:::i;62574:92::-;;;;;;;;;;-1:-1:-1;62574:92:0;;;;;:::i;:::-;;:::i;60450:275::-;;;;;;:::i;:::-;;:::i;56499:32::-;;;;;;;;;;;;;;;56536:22;;;;;;;;;;;;;;;;63383:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57100:60::-;;;;;;;;;;-1:-1:-1;57100:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;26490:25:1;;;26546:2;26531:18;;26524:34;;;;26463:18;57100:60:0;26316:248:1;22282:239:0;;;;;;;;;;-1:-1:-1;22282:239:0;;;;;:::i;:::-;;:::i;59785:659::-;;;;;;:::i;:::-;;:::i;56672:31::-;;;;;;;;;;;;;;;;22012:208;;;;;;;;;;-1:-1:-1;22012:208:0;;;;;:::i;:::-;;:::i;56111:32::-;;;;;;;;;;-1:-1:-1;56111:32:0;;;;;;48166:103;;;;;;;;;;;;;:::i;56737:25::-;;;;;;;;;;;;;:::i;57062:33::-;;;;;;;;;;-1:-1:-1;57062:33:0;;;;;;;;;;;;;;;:::i;47515:87::-;;;;;;;;;;-1:-1:-1;47588:6:0;;-1:-1:-1;;;;;47588:6:0;47515:87;;22757:104;;;;;;;;;;;;;:::i;59185:594::-;;;;;;:::i;:::-;;:::i;56635:32::-;;;;;;;;;;-1:-1:-1;56635:32:0;;;;;:::i;:::-;;:::i;24441:155::-;;;;;;;;;;-1:-1:-1;24441:155:0;;;;;:::i;:::-;;:::i;61037:140::-;;;;;;;;;;;;;:::i;57211:47::-;;;;;;;;;;-1:-1:-1;57211:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;64171:652;;;;;;:::i;:::-;;:::i;60731:300::-;;;;;;;;;;-1:-1:-1;60731:300:0;;;;;:::i;:::-;;:::i;25564:328::-;;;;;;;;;;-1:-1:-1;25564:328:0;;;;;:::i;:::-;;:::i;61386:478::-;;;;;;;;;;-1:-1:-1;61386:478:0;;;;;:::i;:::-;;:::i;56460:34::-;;;;;;;;;;;;;;;62468:100;;;;;;;;;;-1:-1:-1;62468:100:0;;;;;:::i;:::-;;:::i;56413:42::-;;;;;;;;;;;;;;;;;;26743:18:1;26731:31;;;26713:50;;26701:2;26686:18;56413:42:0;26569:200:1;56767:29:0;;;;;;;;;;;;;;;;62672:457;;;;;;;;;;;;;:::i;24667:164::-;;;;;;;;;;-1:-1:-1;24667:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24667:164;56563:28;;;;;;;;;;;;;;;;48424:201;;;;;;;;;;-1:-1:-1;48424:201:0;;;;;:::i;:::-;;:::i;56708:24::-;;;;;;;;;;;;;;;;21643:305;21745:4;-1:-1:-1;;;;;;21782:40:0;;-1:-1:-1;;;21782:40:0;;:105;;-1:-1:-1;;;;;;;21839:48:0;;-1:-1:-1;;;21839:48:0;21782:105;:158;;;-1:-1:-1;;;;;;;;;;20175:40:0;;;21904:36;21762:178;21643:305;-1:-1:-1;;21643:305:0:o;22588:100::-;22642:13;22675:5;22668:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22588:100;:::o;24148:221::-;24224:7;24252:16;24260:7;24252;:16::i;:::-;24244:73;;;;-1:-1:-1;;;24244:73:0;;20989:2:1;24244:73:0;;;20971:21:1;21028:2;21008:18;;;21001:30;21067:34;21047:18;;;21040:62;-1:-1:-1;;;21118:18:1;;;21111:42;21170:19;;24244:73:0;;;;;;;;;-1:-1:-1;24337:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24337:24:0;;24148:221::o;23671:411::-;23752:13;23768:23;23783:7;23768:14;:23::i;:::-;23752:39;;23816:5;-1:-1:-1;;;;;23810:11:0;:2;-1:-1:-1;;;;;23810:11:0;;;23802:57;;;;-1:-1:-1;;;23802:57:0;;23739:2:1;23802:57:0;;;23721:21:1;23778:2;23758:18;;;23751:30;23817:34;23797:18;;;23790:62;-1:-1:-1;;;23868:18:1;;;23861:31;23909:19;;23802:57:0;23537:397:1;23802:57:0;16929:10;-1:-1:-1;;;;;23894:21:0;;;;:62;;-1:-1:-1;23919:37:0;23936:5;16929:10;24667:164;:::i;23919:37::-;23872:168;;;;-1:-1:-1;;;23872:168:0;;18280:2:1;23872:168:0;;;18262:21:1;18319:2;18299:18;;;18292:30;18358:34;18338:18;;;18331:62;18429:26;18409:18;;;18402:54;18473:19;;23872:168:0;18078:420:1;23872:168:0;24053:21;24062:2;24066:7;24053:8;:21::i;:::-;23741:341;23671:411;;:::o;64829:608::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;64938:17:::1;64946:8;64938:7;:17::i;:::-;64930:57;;;;-1:-1:-1::0;;;64930:57:0::1;;;;;;;:::i;:::-;64994:12;65039:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;65009:15:::1;::::0;65039:43;;::::1;::::0;:105:::1;;-1:-1:-1::0;65096:33:0::1;::::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;65137:7:::1;::::0;65086:48:::1;::::0;:7;:48:::1;:::i;:::-;:58;65039:105;65031:176;;;::::0;-1:-1:-1;;;65031:176:0;;22960:2:1;65031:176:0::1;::::0;::::1;22942:21:1::0;22999:2;22979:18;;;22972:30;23038:34;23018:18;;;23011:62;23109:27;23089:18;;;23082:55;23154:19;;65031:176:0::1;22758:421:1::0;65031:176:0::1;65222:14;65239:33:::0;;;:23:::1;:33;::::0;;;;;:40;;65286:44;;;;65354:36;;65239:40;;65222:14;-1:-1:-1;;;;;65354:17:0;::::1;::::0;65239:40;;65222:14;65354:36;65222:14;65354:36;65239:40;65354:17;:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65337:54;;;65406:4;65398:33;;;::::0;-1:-1:-1;;;65398:33:0;;24496:2:1;65398:33:0::1;::::0;::::1;24478:21:1::0;24535:2;24515:18;;;24508:30;-1:-1:-1;;;24554:18:1;;;24547:46;24610:18;;65398:33:0::1;24294:340:1::0;65398:33:0::1;64923:514;;;64829:608:::0;;:::o;61183:93::-;61229:7;61252:18;:8;52722:14;;52630:114;61252:18;61245:25;;61183:93;:::o;46179:261::-;46279:10;-1:-1:-1;;;;;46293:14:0;46279:28;;46275:111;;46325:53;;-1:-1:-1;;;46325:53:0;;46351:10;46325:53;;;7708:34:1;-1:-1:-1;;;;;46363:14:0;7778:15:1;7758:18;;;7751:43;7643:18;;46325:53:0;7496:304:1;46275:111:0;46392:42;46411:9;46422:11;46392:18;:42::i;:::-;46179:261;;:::o;24898:339::-;25093:41;16929:10;25126:7;25093:18;:41::i;:::-;25085:103;;;;-1:-1:-1;;;25085:103:0;;;;;;;:::i;:::-;25201:28;25211:4;25217:2;25221:7;25201:9;:28::i;63491:674::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;63569:22:::1;63577:13:::0;::::1;63569:7;:22::i;:::-;63561:62;;;;-1:-1:-1::0;;;63561:62:0::1;;;;;;;:::i;:::-;63662:13:::0;::::1;63638:38;::::0;;;:23:::1;:38;::::0;;;;:45;:50;:102;::::1;;;-1:-1:-1::0;63716:13:0;::::1;63692:38;::::0;;;:23:::1;:38;::::0;;;;:43:::1;;::::0;:48;63638:102:::1;63630:145;;;::::0;-1:-1:-1;;;63630:145:0;;25977:2:1;63630:145:0::1;::::0;::::1;25959:21:1::0;26016:2;25996:18;;;25989:30;26055:32;26035:18;;;26028:60;26105:18;;63630:145:0::1;25775:354:1::0;63630:145:0::1;63799:11;63790:5;::::0;::::1;;:20;::::0;::::1;;;;;;:::i;:::-;;;:47;;;;-1:-1:-1::0;63823:14:0::1;63814:5;::::0;::::1;;:23;::::0;::::1;;;;;;:::i;:::-;;;63790:47;63782:90;;;::::0;-1:-1:-1;;;63782:90:0;;22173:2:1;63782:90:0::1;::::0;::::1;22155:21:1::0;22212:2;22192:18;;;22185:30;22251:32;22231:18;;;22224:60;22301:18;;63782:90:0::1;21971:354:1::0;63782:90:0::1;63892:11;63883:5;::::0;::::1;;:20;::::0;::::1;;;;;;:::i;:::-;;63879:64;;;63914:5;:21:::0;;-1:-1:-1;;63914:21:0::1;63922:13;63914:21;::::0;;63879:64:::1;64015:34;::::0;;;;::::1;::::0;;64025:14:::1;::::0;;::::1;;64015:34:::0;;;63964:15:::1;64015:34:::0;;::::1;::::0;;;64080:13;::::1;63949:12;64056:38:::0;;;:23:::1;:38:::0;;;;;;:50;;;;;;::::1;::::0;;::::1;::::0;;;;64118:41;;63964:15;;64025:14;;64118:41:::1;::::0;::::1;63554:611;;63491:674:::0;:::o;25308:185::-;25446:39;25463:4;25469:2;25473:7;25446:39;;;;;;;;;;;;:16;:39::i;61870:314::-;61931:7;61955:16;61963:7;61955;:16::i;:::-;61947:56;;;;-1:-1:-1;;;61947:56:0;;;;;;;:::i;:::-;62018:15;:22;62010:70;;;;-1:-1:-1;;;62010:70:0;;10624:2:1;62010:70:0;;;10606:21:1;10663:2;10643:18;;;10636:30;10702:33;10682:18;;;10675:61;10753:18;;62010:70:0;10422:355:1;62010:70:0;62127:8;52722:14;62116:7;62095:15;62111:1;62095:18;;;;;;;;:::i;:::-;;;;;;;;;:28;;;;:::i;:::-;62094:51;;;;:::i;:::-;:55;;62148:1;62094:55;:::i;62574:92::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62642:7:::1;:18:::0;62574:92::o;60450:275::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;60534:14:::1;::::0;60562:15:::1;::::0;60534:24:::1;::::0;60551:7:::1;60534:24;:::i;:::-;:43;;60526:99;;;;-1:-1:-1::0;;;60526:99:0::1;;;;;;;:::i;:::-;60632:48;60642:8;60652:9;60663:16;60632:9;:48::i;:::-;60687:32;60698:8;60708:10;60687;:32::i;:::-;-1:-1:-1::0;50759:1:0;51713:7;:22;60450:275::o;63383:102::-;63432:16;63464:15;63457:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63383:102;:::o;22282:239::-;22354:7;22390:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22390:16:0;22425:19;22417:73;;;;-1:-1:-1;;;22417:73:0;;19116:2:1;22417:73:0;;;19098:21:1;19155:2;19135:18;;;19128:30;19194:34;19174:18;;;19167:62;-1:-1:-1;;;19245:18:1;;;19238:39;19294:19;;22417:73:0;18914:405:1;59785:659:0;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59905:14:::1;::::0;59933:15:::1;::::0;59905:24:::1;::::0;59922:7:::1;59905:24;:::i;:::-;:43;;59897:99;;;;-1:-1:-1::0;;;59897:99:0::1;;;;;;;:::i;:::-;60003:51;60013:8;60023:9;60034:19;60003:9;:51::i;:::-;60087:28;::::0;-1:-1:-1;;60104:10:0::1;6518:2:1::0;6514:15;6510:53;60087:28:0::1;::::0;::::1;6498:66:1::0;60061:12:0::1;::::0;6580::1;;60087:28:0::1;;;;;;;;;;;;60076:41;;;;;;60061:56;;60132:59;60151:12;;60132:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;60165:19:0::1;::::0;;-1:-1:-1;60186:4:0;;-1:-1:-1;60132:18:0::1;:59::i;:::-;60124:92;;;::::0;-1:-1:-1;;;60124:92:0;;13713:2:1;60124:92:0::1;::::0;::::1;13695:21:1::0;13752:2;13732:18;;;13725:30;-1:-1:-1;;;13771:18:1;;;13764:50;13831:18;;60124:92:0::1;13511:344:1::0;60124:92:0::1;60248:10;60231:28;::::0;;;:16:::1;:28;::::0;;;;;60274:2:::1;::::0;60231:39:::1;::::0;60262:8;;60231:39:::1;:::i;:::-;:45;;60223:99;;;::::0;-1:-1:-1;;;60223:99:0;;17870:2:1;60223:99:0::1;::::0;::::1;17852:21:1::0;17909:2;17889:18;;;17882:30;17948:34;17928:18;;;17921:62;-1:-1:-1;;;17999:18:1;;;17992:39;18048:19;;60223:99:0::1;17668:405:1::0;60223:99:0::1;60377:10;60360:28;::::0;;;:16:::1;:28;::::0;;;;;:39:::1;::::0;60391:8;;60360:39:::1;:::i;:::-;60346:10;60329:28;::::0;;;:16:::1;:28;::::0;;;;:70;;;;60406:32:::1;::::0;60417:8;;60406:10:::1;:32::i;:::-;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;;59785:659:0:o;22012:208::-;22084:7;-1:-1:-1;;;;;22112:19:0;;22104:74;;;;-1:-1:-1;;;22104:74:0;;18705:2:1;22104:74:0;;;18687:21:1;18744:2;18724:18;;;18717:30;18783:34;18763:18;;;18756:62;-1:-1:-1;;;18834:18:1;;;18827:40;18884:19;;22104:74:0;18503:406:1;22104:74:0;-1:-1:-1;;;;;;22196:16:0;;;;;:9;:16;;;;;;;22012:208::o;48166:103::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;48231:30:::1;48258:1;48231:18;:30::i;:::-;48166:103::o:0;56737:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22757:104::-;22813:13;22846:7;22839:14;;;;;:::i;59185:594::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59299:14:::1;::::0;59317:15:::1;-1:-1:-1::0;59299:33:0::1;59291:89;;;;-1:-1:-1::0;;;59291:89:0::1;;;;;;;:::i;:::-;59406:10;59395:22;::::0;;;:10:::1;:22;::::0;;;;;59432:1:::1;::::0;59395:33:::1;::::0;59420:8;;59395:33:::1;:::i;:::-;:38;;59387:87;;;::::0;-1:-1:-1;;;59387:87:0;;14825:2:1;59387:87:0::1;::::0;::::1;14807:21:1::0;14864:2;14844:18;;;14837:30;14903:34;14883:18;;;14876:62;-1:-1:-1;;;14954:18:1;;;14947:34;14998:19;;59387:87:0::1;14623:400:1::0;59387:87:0::1;59481:45;59491:8;59501:9;59512:13;59481:9;:45::i;:::-;59559:28;::::0;-1:-1:-1;;59576:10:0::1;6518:2:1::0;6514:15;6510:53;59559:28:0::1;::::0;::::1;6498:66:1::0;59533:12:0::1;::::0;6580::1;;59559:28:0::1;;;;;;;;;;;;59548:41;;;;;;59533:56;;59604:53;59623:12;;59604:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;59637:13:0::1;::::0;;-1:-1:-1;59652:4:0;;-1:-1:-1;59604:18:0::1;:53::i;:::-;59596:73;;;::::0;-1:-1:-1;;;59596:73:0;;19526:2:1;59596:73:0::1;::::0;::::1;19508:21:1::0;19565:1;19545:18;;;19538:29;-1:-1:-1;;;19583:18:1;;;19576:37;19630:18;;59596:73:0::1;19324:330:1::0;59596:73:0::1;59712:10;59701:22;::::0;;;:10:::1;:22;::::0;;;;;:33:::1;::::0;59726:8;;59701:33:::1;:::i;:::-;59687:10;59676:22;::::0;;;:10:::1;:22;::::0;;;;:58;;;;59741:32:::1;::::0;59752:8;;59741:10:::1;:32::i;56635:::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56635:32:0;:::o;24441:155::-;24536:52;16929:10;24569:8;24579;24536:18;:52::i;61037:140::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;61109:11:::1;61100:5;::::0;::::1;;:20;::::0;::::1;;;;;;:::i;:::-;;61092:50;;;::::0;-1:-1:-1;;;61092:50:0;;13367:2:1;61092:50:0::1;::::0;::::1;13349:21:1::0;13406:2;13386:18;;;13379:30;-1:-1:-1;;;13425:18:1;;;13418:47;13482:18;;61092:50:0::1;13165:341:1::0;61092:50:0::1;61149:5;:22:::0;;-1:-1:-1;;61149:22:0::1;61157:14;61149:22;::::0;;61037:140::o;64171:652::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;64258:17:::1;64266:8:::0;64258:7:::1;:17::i;:::-;64250:57;;;;-1:-1:-1::0;;;64250:57:0::1;;;;;;;:::i;:::-;64343:10;64322:17;64330:8:::0;64322:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;64322:31:0::1;;64314:56;;;::::0;-1:-1:-1;;;64314:56:0;;11798:2:1;64314:56:0::1;::::0;::::1;11780:21:1::0;11837:2;11817:18;;;11810:30;-1:-1:-1;;;11856:18:1;;;11849:42;11908:18;;64314:56:0::1;11596:336:1::0;64314:56:0::1;64426:1;64385:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64377:84:::1;;;::::0;-1:-1:-1;;;64377:84:0;;25619:2:1;64377:84:0::1;::::0;::::1;25601:21:1::0;25658:2;25638:18;;;25631:30;25697:31;25677:18;;;25670:59;25746:18;;64377:84:0::1;25417:353:1::0;64377:84:0::1;64519:1;64476:33:::0;;;:23:::1;:33;::::0;;;;:40;64468:79:::1;;;::::0;-1:-1:-1;;;64468:79:0;;17519:2:1;64468:79:0::1;::::0;::::1;17501:21:1::0;17558:2;17538:18;;;17531:30;-1:-1:-1;;;17577:18:1;;;17570:52;17639:18;;64468:79:0::1;17317:346:1::0;64468:79:0::1;64554:14;64571:33:::0;;;:23:::1;:33;::::0;;;;;:40;;64618:44;;;;64674;;64571:40;;;;64699:10:::1;::::0;64595:8;;64674:44:::1;::::0;64554:14;64674:44:::1;64742:34;::::0;64726:9:::1;::::0;64742:10:::1;::::0;64765:6;;64726:9;64742:34;64726:9;64742:34;64765:6;64742:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64725:52;;;64792:4;64784:33;;;::::0;-1:-1:-1;;;64784:33:0;;24496:2:1;64784:33:0::1;::::0;::::1;24478:21:1::0;24535:2;24515:18;;;24508:30;-1:-1:-1;;;24554:18:1;;;24547:46;24610:18;;64784:33:0::1;24294:340:1::0;64784:33:0::1;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;64171:652:0:o;60731:300::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;60828:14:::1;60819:5;::::0;::::1;;:23;::::0;::::1;;;;;;:::i;:::-;;60811:60;;;::::0;-1:-1:-1;;;60811:60:0;;23386:2:1;60811:60:0::1;::::0;::::1;23368:21:1::0;23425:2;23405:18;;;23398:30;23464:26;23444:18;;;23437:54;23508:18;;60811:60:0::1;23184:348:1::0;60811:60:0::1;60886:15;:22:::0;60878:89:::1;;;::::0;-1:-1:-1;;;60878:89:0;;19861:2:1;60878:89:0::1;::::0;::::1;19843:21:1::0;19900:2;19880:18;;;19873:30;19939:34;19919:18;;;19912:62;-1:-1:-1;;;19990:18:1;;;19983:48;20048:19;;60878:89:0::1;19659:414:1::0;60878:89:0::1;60974:25:::0;;::::1;::::0;:11:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;61006:5:0::1;:19:::0;;-1:-1:-1;;61006:19:0::1;61014:11;61006:19;::::0;;60731:300::o;25564:328::-;25739:41;16929:10;25772:7;25739:18;:41::i;:::-;25731:103;;;;-1:-1:-1;;;25731:103:0;;;;;;;:::i;:::-;25845:39;25859:4;25865:2;25869:7;25878:5;25845:13;:39::i;:::-;25564:328;;;;:::o;61386:478::-;61459:13;61489:16;61497:7;61489;:16::i;:::-;61481:56;;;;-1:-1:-1;;;61481:56:0;;;;;;;:::i;:::-;61544:21;61568:10;:8;:10::i;:::-;61544:34;-1:-1:-1;61598:11:0;61589:5;;;;:20;;;;;;;;:::i;:::-;;:47;;;-1:-1:-1;61622:14:0;61613:5;;;;:23;;;;;;;;:::i;:::-;;61589:47;61585:84;;;61654:7;61386:478;-1:-1:-1;;61386:478:0:o;61585:84::-;61675:14;61692:22;61706:7;61692:13;:22::i;:::-;61675:39;;61721:17;61765:7;61774:24;61791:6;61774:16;:24::i;:::-;61748:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61748:51:0;;;;;;61843:13;;;;;;;;-1:-1:-1;;;61748:51:0;61843:13;;;;;;;61821:36;;61748:51;;-1:-1:-1;61821:36:0;;61748:51;;;;61821:36;;:::i;:::-;;;;;;;;;;;;;61807:51;;;;;61386:478;;;:::o;62468:100::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62537:14:::1;:25:::0;62468:100::o;62672:457::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62745:14:::1;62736:5;::::0;::::1;;:23;::::0;::::1;;;;;;:::i;:::-;;62728:77;;;;-1:-1:-1::0;;;62728:77:0::1;;;;;;;:::i;:::-;62820:15;:22:::0;:27;62812:73:::1;;;::::0;-1:-1:-1;;;62812:73:0;;12558:2:1;62812:73:0::1;::::0;::::1;12540:21:1::0;12597:2;12577:18;;;12570:30;12636:34;12616:18;;;12609:62;-1:-1:-1;;;12687:18:1;;;12680:31;12728:19;;62812:73:0::1;12356:397:1::0;62812:73:0::1;62921:1;62900:18;:8;52722:14:::0;;52630:114;62900:18:::1;:22;62892:61;;;::::0;-1:-1:-1;;;62892:61:0;;24141:2:1;62892:61:0::1;::::0;::::1;24123:21:1::0;24180:2;24160:18;;;24153:30;24219:28;24199:18;;;24192:56;24265:18;;62892:61:0::1;23939:350:1::0;62892:61:0::1;62972:11;::::0;63011:7:::1;::::0;62972:151:::1;::::0;-1:-1:-1;;;62972:151:0;;::::1;::::0;::::1;9560:25:1::0;;;;9633:18;63027::0::1;9621:31:1::0;9601:18;;;9594:59;56229:1:0::1;9669:18:1::0;;;9662:47;56369:6:0::1;9754:18:1::0;;;9747:43;62972:11:0;9806:19:1;;;9799:44;-1:-1:-1;;;;;62972:11:0;;::::1;::::0;:30:::1;::::0;9532:19:1;;62972:151:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62960:9;:163:::0;62672:457::o;48424:201::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48513:22:0;::::1;48505:73;;;::::0;-1:-1:-1;;;48505:73:0;;12960:2:1;48505:73:0::1;::::0;::::1;12942:21:1::0;12999:2;12979:18;;;12972:30;13038:34;13018:18;;;13011:62;-1:-1:-1;;;13089:18:1;;;13082:36;13135:19;;48505:73:0::1;12758:402:1::0;48505:73:0::1;48589:28;48608:8;48589:18;:28::i;:::-;48424:201:::0;:::o;27402:127::-;27467:4;27491:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27491:16:0;:30;;;27402:127::o;31548:174::-;31623:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31623:29:0;-1:-1:-1;;;;;31623:29:0;;;;;;;;:24;;31677:23;31623:24;31677:14;:23::i;:::-;-1:-1:-1;;;;;31668:46:0;;;;;;;;;;;31548:174;;:::o;63135:242::-;63275:14;63266:5;;;;:23;;;;;;;;:::i;:::-;;63258:77;;;;-1:-1:-1;;;63258:77:0;;;;;;;:::i;:::-;63342:29;;;;:15;;:29;;;;;:::i;27696:348::-;27789:4;27814:16;27822:7;27814;:16::i;:::-;27806:73;;;;-1:-1:-1;;;27806:73:0;;16750:2:1;27806:73:0;;;16732:21:1;16789:2;16769:18;;;16762:30;16828:34;16808:18;;;16801:62;-1:-1:-1;;;16879:18:1;;;16872:42;16931:19;;27806:73:0;16548:408:1;27806:73:0;27890:13;27906:23;27921:7;27906:14;:23::i;:::-;27890:39;;27959:5;-1:-1:-1;;;;;27948:16:0;:7;-1:-1:-1;;;;;27948:16:0;;:52;;;-1:-1:-1;;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27968:32;27948:87;;;;28028:7;-1:-1:-1;;;;;28004:31:0;:20;28016:7;28004:11;:20::i;:::-;-1:-1:-1;;;;;28004:31:0;;27948:87;27940:96;27696:348;-1:-1:-1;;;;27696:348:0:o;30805:625::-;30964:4;-1:-1:-1;;;;;30937:31:0;:23;30952:7;30937:14;:23::i;:::-;-1:-1:-1;;;;;30937:31:0;;30929:81;;;;-1:-1:-1;;;30929:81:0;;14062:2:1;30929:81:0;;;14044:21:1;14101:2;14081:18;;;14074:30;14140:34;14120:18;;;14113:62;-1:-1:-1;;;14191:18:1;;;14184:35;14236:19;;30929:81:0;13860:401:1;30929:81:0;-1:-1:-1;;;;;31029:16:0;;31021:65;;;;-1:-1:-1;;;31021:65:0;;15575:2:1;31021:65:0;;;15557:21:1;15614:2;15594:18;;;15587:30;15653:34;15633:18;;;15626:62;-1:-1:-1;;;15704:18:1;;;15697:34;15748:19;;31021:65:0;15373:400:1;31021:65:0;31099:39;31120:4;31126:2;31130:7;31099:20;:39::i;:::-;31203:29;31220:1;31224:7;31203:8;:29::i;:::-;-1:-1:-1;;;;;31245:15:0;;;;;;:9;:15;;;;;:20;;31264:1;;31245:15;:20;;31264:1;;31245:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31276:13:0;;;;;;:9;:13;;;;;:18;;31293:1;;31276:13;:18;;31293:1;;31276:18;:::i;:::-;;;;-1:-1:-1;;31305:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31305:21:0;-1:-1:-1;;;;;31305:21:0;;;;;;;;;31344:27;;31305:16;;31344:27;;;;;;;23741:341;23671:411;;:::o;58554:625::-;58658:11;58649:5;;;;:20;;;;;;;;:::i;:::-;;58641:50;;;;-1:-1:-1;;;58641:50:0;;13367:2:1;58641:50:0;;;13349:21:1;13406:2;13386:18;;;13379:30;-1:-1:-1;;;13425:18:1;;;13418:47;13482:18;;58641:50:0;13165:341:1;58641:50:0;58717:1;58706:8;:12;58698:44;;;;-1:-1:-1;;;58698:44:0;;20280:2:1;58698:44:0;;;20262:21:1;20319:2;20299:18;;;20292:30;-1:-1:-1;;;20338:18:1;;;20331:49;20397:18;;58698:44:0;20078:343:1;58698:44:0;58765:13;58753:8;:25;;;;;;;;:::i;:::-;;58749:240;;;56328:1;58797:8;:29;;58789:89;;;;-1:-1:-1;;;58789:89:0;;;;;;;:::i;:::-;58749:240;;;58927:2;58915:8;:14;;58907:74;;;;-1:-1:-1;;;58907:74:0;;;;;;;:::i;:::-;59036:9;59024:8;59003:18;:8;52722:14;;52630:114;59003:18;:29;;;;:::i;:::-;:42;;58995:114;;;;-1:-1:-1;;;58995:114:0;;22532:2:1;58995:114:0;;;22514:21:1;22571:2;22551:18;;;22544:30;22610:34;22590:18;;;22583:62;22681:29;22661:18;;;22654:57;22728:19;;58995:114:0;22330:423:1;58995:114:0;59134:18;59144:8;59134:7;:18;:::i;:::-;59124:6;:28;;59116:57;;;;-1:-1:-1;;;59116:57:0;;15230:2:1;59116:57:0;;;15212:21:1;15269:2;15249:18;;;15242:30;-1:-1:-1;;;15288:18:1;;;15281:46;15344:18;;59116:57:0;15028:340:1;58322:226:0;58393:8;58388:155;58411:8;58407:1;:12;;;58388:155;;;58435:20;:8;52841:19;;52859:1;52841:19;;;52752:127;58435:20;58464:17;58484:18;:8;52722:14;;52630:114;58484:18;58464:38;;58511:24;58517:6;58525:9;58511:5;:24::i;:::-;-1:-1:-1;58421:3:0;;;;:::i;:::-;;;;58388:155;;54451:190;54576:4;54629;54600:25;54613:5;54620:4;54600:12;:25::i;:::-;:33;;54451:190;-1:-1:-1;;;;54451:190:0:o;48785:191::-;48878:6;;;-1:-1:-1;;;;;48895:17:0;;;-1:-1:-1;;;;;;48895:17:0;;;;;;;48928:40;;48878:6;;;48895:17;48878:6;;48928:40;;48859:16;;48928:40;48848:128;48785:191;:::o;31864:315::-;32019:8;-1:-1:-1;;;;;32010:17:0;:5;-1:-1:-1;;;;;32010:17:0;;;32002:55;;;;-1:-1:-1;;;32002:55:0;;15980:2:1;32002:55:0;;;15962:21:1;16019:2;15999:18;;;15992:30;16058:27;16038:18;;;16031:55;16103:18;;32002:55:0;15778:349:1;32002:55:0;-1:-1:-1;;;;;32068:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32068:46:0;;;;;;;;;;32130:41;;9075::1;;;32130::0;;9048:18:1;32130:41:0;;;;;;;31864:315;;;:::o;26774:::-;26931:28;26941:4;26947:2;26951:7;26931:9;:28::i;:::-;26978:48;27001:4;27007:2;27011:7;27020:5;26978:22;:48::i;:::-;26970:111;;;;-1:-1:-1;;;26970:111:0;;;;;;;:::i;61282:98::-;61334:13;61363:11;61356:18;;;;;:::i;17436:723::-;17492:13;17713:10;17709:53;;-1:-1:-1;;17740:10:0;;;;;;;;;;;;-1:-1:-1;;;17740:10:0;;;;;17436:723::o;17709:53::-;17787:5;17772:12;17828:78;17835:9;;17828:78;;17861:8;;;;:::i;:::-;;-1:-1:-1;17884:10:0;;-1:-1:-1;17892:2:0;17884:10;;:::i;:::-;;;17828:78;;;17916:19;17948:6;17938:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17938:17:0;;17916:39;;17966:154;17973:10;;17966:154;;18000:11;18010:1;18000:11;;:::i;:::-;;-1:-1:-1;18069:10:0;18077:2;18069:5;:10;:::i;:::-;18056:24;;:2;:24;:::i;:::-;18043:39;;18026:6;18033;18026:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18026:56:0;;;;;;;;-1:-1:-1;18097:11:0;18106:2;18097:11;;:::i;:::-;;;17966:154;;62190:270;62349:13;62340:5;;;;:22;;;;;;;;:::i;:::-;;;62332:68;;;;-1:-1:-1;;;62332:68:0;;11396:2:1;62332:68:0;;;11378:21:1;11435:2;11415:18;;;11408:30;11474:34;11454:18;;;11447:62;-1:-1:-1;;;11525:18:1;;;11518:31;11566:19;;62332:68:0;11194:397:1;29380:439:0;-1:-1:-1;;;;;29460:16:0;;29452:61;;;;-1:-1:-1;;;29452:61:0;;20628:2:1;29452:61:0;;;20610:21:1;;;20647:18;;;20640:30;20706:34;20686:18;;;20679:62;20758:18;;29452:61:0;20426:356:1;29452:61:0;29533:16;29541:7;29533;:16::i;:::-;29532:17;29524:58;;;;-1:-1:-1;;;29524:58:0;;14468:2:1;29524:58:0;;;14450:21:1;14507:2;14487:18;;;14480:30;14546;14526:18;;;14519:58;14594:18;;29524:58:0;14266:352:1;29524:58:0;29595:45;29624:1;29628:2;29632:7;29595:20;:45::i;:::-;-1:-1:-1;;;;;29653:13:0;;;;;;:9;:13;;;;;:18;;29670:1;;29653:13;:18;;29670:1;;29653:18;:::i;:::-;;;;-1:-1:-1;;29682:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29682:21:0;-1:-1:-1;;;;;29682:21:0;;;;;;;;29721:33;;29682:16;;;29721:33;;29682:16;;29721:33;46179:261;;:::o;55002:675::-;55085:7;55128:4;55085:7;55143:497;55167:5;:12;55163:1;:16;55143:497;;;55201:20;55224:5;55230:1;55224:8;;;;;;;;:::i;:::-;;;;;;;55201:31;;55267:12;55251;:28;55247:382;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55379:57;;55247:382;;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55556:57;;55247:382;-1:-1:-1;55181:3:0;;;;:::i;:::-;;;;55143:497;;;-1:-1:-1;55657:12:0;55002:675;-1:-1:-1;;;55002:675:0:o;32744:799::-;32899:4;-1:-1:-1;;;;;32920:13:0;;9187:19;:23;32916:620;;32956:72;;-1:-1:-1;;;32956:72:0;;-1:-1:-1;;;;;32956:36:0;;;;;:72;;16929:10;;33007:4;;33013:7;;33022:5;;32956:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32956:72:0;;;;;;;;-1:-1:-1;;32956:72:0;;;;;;;;;;;;:::i;:::-;;;32952:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33198:13:0;;33194:272;;33241:60;;-1:-1:-1;;;33241:60:0;;;;;;;:::i;33194:272::-;33416:6;33410:13;33401:6;33397:2;33393:15;33386:38;32952:529;-1:-1:-1;;;;;;33079:51:0;-1:-1:-1;;;33079:51:0;;-1:-1:-1;33072:58:0;;32916:620;-1:-1:-1;33520:4:0;32744:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:186::-;662:6;715:2;703:9;694:7;690:23;686:32;683:52;;;731:1;728;721:12;683:52;754:29;773:9;754:29;:::i;:::-;744:39;603:186;-1:-1:-1;;;603:186:1:o;794:260::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;;1010:38;1044:2;1033:9;1029:18;1010:38;:::i;:::-;1000:48;;794:260;;;;;:::o;1059:328::-;1136:6;1144;1152;1205:2;1193:9;1184:7;1180:23;1176:32;1173:52;;;1221:1;1218;1211:12;1173:52;1244:29;1263:9;1244:29;:::i;:::-;1234:39;;1292:38;1326:2;1315:9;1311:18;1292:38;:::i;:::-;1282:48;;1377:2;1366:9;1362:18;1349:32;1339:42;;1059:328;;;;;:::o;1392:666::-;1487:6;1495;1503;1511;1564:3;1552:9;1543:7;1539:23;1535:33;1532:53;;;1581:1;1578;1571:12;1532:53;1604:29;1623:9;1604:29;:::i;:::-;1594:39;;1652:38;1686:2;1675:9;1671:18;1652:38;:::i;:::-;1642:48;;1737:2;1726:9;1722:18;1709:32;1699:42;;1792:2;1781:9;1777:18;1764:32;1819:18;1811:6;1808:30;1805:50;;;1851:1;1848;1841:12;1805:50;1874:22;;1927:4;1919:13;;1915:27;-1:-1:-1;1905:55:1;;1956:1;1953;1946:12;1905:55;1979:73;2044:7;2039:2;2026:16;2021:2;2017;2013:11;1979:73;:::i;:::-;1969:83;;;1392:666;;;;;;;:::o;2063:347::-;2128:6;2136;2189:2;2177:9;2168:7;2164:23;2160:32;2157:52;;;2205:1;2202;2195:12;2157:52;2228:29;2247:9;2228:29;:::i;:::-;2218:39;;2307:2;2296:9;2292:18;2279:32;2354:5;2347:13;2340:21;2333:5;2330:32;2320:60;;2376:1;2373;2366:12;2320:60;2399:5;2389:15;;;2063:347;;;;;:::o;2415:254::-;2483:6;2491;2544:2;2532:9;2523:7;2519:23;2515:32;2512:52;;;2560:1;2557;2550:12;2512:52;2583:29;2602:9;2583:29;:::i;:::-;2573:39;2659:2;2644:18;;;;2631:32;;-1:-1:-1;;;2415:254:1:o;2674:180::-;2733:6;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;-1:-1:-1;2825:23:1;;2674:180;-1:-1:-1;2674:180:1:o;2859:245::-;2917:6;2970:2;2958:9;2949:7;2945:23;2941:32;2938:52;;;2986:1;2983;2976:12;2938:52;3025:9;3012:23;3044:30;3068:5;3044:30;:::i;3109:249::-;3178:6;3231:2;3219:9;3210:7;3206:23;3202:32;3199:52;;;3247:1;3244;3237:12;3199:52;3279:9;3273:16;3298:30;3322:5;3298:30;:::i;3363:450::-;3432:6;3485:2;3473:9;3464:7;3460:23;3456:32;3453:52;;;3501:1;3498;3491:12;3453:52;3541:9;3528:23;3574:18;3566:6;3563:30;3560:50;;;3606:1;3603;3596:12;3560:50;3629:22;;3682:4;3674:13;;3670:27;-1:-1:-1;3660:55:1;;3711:1;3708;3701:12;3660:55;3734:73;3799:7;3794:2;3781:16;3776:2;3772;3768:11;3734:73;:::i;3818:192::-;3903:6;3956:2;3944:9;3935:7;3931:23;3927:32;3924:52;;;3972:1;3969;3962:12;3924:52;-1:-1:-1;3995:9:1;3818:192;-1:-1:-1;3818:192:1:o;4200:184::-;4270:6;4323:2;4311:9;4302:7;4298:23;4294:32;4291:52;;;4339:1;4336;4329:12;4291:52;-1:-1:-1;4362:16:1;;4200:184;-1:-1:-1;4200:184:1:o;4389:683::-;4484:6;4492;4500;4553:2;4541:9;4532:7;4528:23;4524:32;4521:52;;;4569:1;4566;4559:12;4521:52;4605:9;4592:23;4582:33;;4666:2;4655:9;4651:18;4638:32;4689:18;4730:2;4722:6;4719:14;4716:34;;;4746:1;4743;4736:12;4716:34;4784:6;4773:9;4769:22;4759:32;;4829:7;4822:4;4818:2;4814:13;4810:27;4800:55;;4851:1;4848;4841:12;4800:55;4891:2;4878:16;4917:2;4909:6;4906:14;4903:34;;;4933:1;4930;4923:12;4903:34;4986:7;4981:2;4971:6;4968:1;4964:14;4960:2;4956:23;4952:32;4949:45;4946:65;;;5007:1;5004;4997:12;4946:65;5038:2;5034;5030:11;5020:21;;5060:6;5050:16;;;;;4389:683;;;;;:::o;5077:1025::-;5170:6;5178;5231:2;5219:9;5210:7;5206:23;5202:32;5199:52;;;5247:1;5244;5237:12;5199:52;5283:9;5270:23;5260:33;;5312:2;5365;5354:9;5350:18;5337:32;5388:18;5429:2;5421:6;5418:14;5415:34;;;5445:1;5442;5435:12;5415:34;5483:6;5472:9;5468:22;5458:32;;5528:7;5521:4;5517:2;5513:13;5509:27;5499:55;;5550:1;5547;5540:12;5499:55;5586:2;5573:16;5608:2;5604;5601:10;5598:36;;;5614:18;;:::i;:::-;5660:2;5657:1;5653:10;5643:20;;5683:28;5707:2;5703;5699:11;5683:28;:::i;:::-;5745:15;;;5776:12;;;;5808:11;;;5838;;;5834:20;;5831:33;-1:-1:-1;5828:53:1;;;5877:1;5874;5867:12;5828:53;5899:1;5890:10;;5909:163;5923:2;5920:1;5917:9;5909:163;;;5980:17;;5968:30;;5941:1;5934:9;;;;;6018:12;;;;6050;;5909:163;;;5913:3;6091:5;6081:15;;;;;;;;5077:1025;;;;;:::o;6107:257::-;6148:3;6186:5;6180:12;6213:6;6208:3;6201:19;6229:63;6285:6;6278:4;6273:3;6269:14;6262:4;6255:5;6251:16;6229:63;:::i;:::-;6346:2;6325:15;-1:-1:-1;;6321:29:1;6312:39;;;;6353:4;6308:50;;6107:257;-1:-1:-1;;6107:257:1:o;6603:470::-;6782:3;6820:6;6814:13;6836:53;6882:6;6877:3;6870:4;6862:6;6858:17;6836:53;:::i;:::-;6952:13;;6911:16;;;;6974:57;6952:13;6911:16;7008:4;6996:17;;6974:57;:::i;:::-;7047:20;;6603:470;-1:-1:-1;;;;6603:470:1:o;7805:488::-;-1:-1:-1;;;;;8074:15:1;;;8056:34;;8126:15;;8121:2;8106:18;;8099:43;8173:2;8158:18;;8151:34;;;8221:3;8216:2;8201:18;;8194:31;;;7999:4;;8242:45;;8267:19;;8259:6;8242:45;:::i;:::-;8234:53;7805:488;-1:-1:-1;;;;;;7805:488:1:o;8298:632::-;8469:2;8521:21;;;8591:13;;8494:18;;;8613:22;;;8440:4;;8469:2;8692:15;;;;8666:2;8651:18;;;8440:4;8735:169;8749:6;8746:1;8743:13;8735:169;;;8810:13;;8798:26;;8879:15;;;;8844:12;;;;8771:1;8764:9;8735:169;;;-1:-1:-1;8921:3:1;;8298:632;-1:-1:-1;;;;;;8298:632:1:o;9854:339::-;9997:2;9982:18;;10030:1;10019:13;;10009:144;;10075:10;10070:3;10066:20;10063:1;10056:31;10110:4;10107:1;10100:15;10138:4;10135:1;10128:15;10009:144;10162:25;;;9854:339;:::o;10198:219::-;10347:2;10336:9;10329:21;10310:4;10367:44;10407:2;10396:9;10392:18;10384:6;10367:44;:::i;10782:407::-;10984:2;10966:21;;;11023:2;11003:18;;;10996:30;11062:34;11057:2;11042:18;;11035:62;-1:-1:-1;;;11128:2:1;11113:18;;11106:41;11179:3;11164:19;;10782:407::o;11937:414::-;12139:2;12121:21;;;12178:2;12158:18;;;12151:30;12217:34;12212:2;12197:18;;12190:62;-1:-1:-1;;;12283:2:1;12268:18;;12261:48;12341:3;12326:19;;11937:414::o;16132:411::-;16334:2;16316:21;;;16373:2;16353:18;;;16346:30;16412:34;16407:2;16392:18;;16385:62;-1:-1:-1;;;16478:2:1;16463:18;;16456:45;16533:3;16518:19;;16132:411::o;16961:351::-;17163:2;17145:21;;;17202:2;17182:18;;;17175:30;17241:29;17236:2;17221:18;;17214:57;17303:2;17288:18;;16961:351::o;21200:405::-;21402:2;21384:21;;;21441:2;21421:18;;;21414:30;21480:34;21475:2;21460:18;;21453:62;-1:-1:-1;;;21546:2:1;21531:18;;21524:39;21595:3;21580:19;;21200:405::o;21610:356::-;21812:2;21794:21;;;21831:18;;;21824:30;21890:34;21885:2;21870:18;;21863:62;21957:2;21942:18;;21610:356::o;24639:413::-;24841:2;24823:21;;;24880:2;24860:18;;;24853:30;24919:34;24914:2;24899:18;;24892:62;-1:-1:-1;;;24985:2:1;24970:18;;24963:47;25042:3;25027:19;;24639:413::o;25057:355::-;25259:2;25241:21;;;25298:2;25278:18;;;25271:30;25337:33;25332:2;25317:18;;25310:61;25403:2;25388:18;;25057:355::o;26774:275::-;26845:2;26839:9;26910:2;26891:13;;-1:-1:-1;;26887:27:1;26875:40;;26945:18;26930:34;;26966:22;;;26927:62;26924:88;;;26992:18;;:::i;:::-;27028:2;27021:22;26774:275;;-1:-1:-1;26774:275:1:o;27054:128::-;27094:3;27125:1;27121:6;27118:1;27115:13;27112:39;;;27131:18;;:::i;:::-;-1:-1:-1;27167:9:1;;27054:128::o;27187:120::-;27227:1;27253;27243:35;;27258:18;;:::i;:::-;-1:-1:-1;27292:9:1;;27187:120::o;27312:168::-;27352:7;27418:1;27414;27410:6;27406:14;27403:1;27400:21;27395:1;27388:9;27381:17;27377:45;27374:71;;;27425:18;;:::i;:::-;-1:-1:-1;27465:9:1;;27312:168::o;27485:125::-;27525:4;27553:1;27550;27547:8;27544:34;;;27558:18;;:::i;:::-;-1:-1:-1;27595:9:1;;27485:125::o;27615:258::-;27687:1;27697:113;27711:6;27708:1;27705:13;27697:113;;;27787:11;;;27781:18;27768:11;;;27761:39;27733:2;27726:10;27697:113;;;27828:6;27825:1;27822:13;27819:48;;;-1:-1:-1;;27863:1:1;27845:16;;27838:27;27615:258::o;27878:380::-;27957:1;27953:12;;;;28000;;;28021:61;;28075:4;28067:6;28063:17;28053:27;;28021:61;28128:2;28120:6;28117:14;28097:18;28094:38;28091:161;;;28174:10;28169:3;28165:20;28162:1;28155:31;28209:4;28206:1;28199:15;28237:4;28234:1;28227:15;28263:135;28302:3;-1:-1:-1;;28323:17:1;;28320:43;;;28343:18;;:::i;:::-;-1:-1:-1;28390:1:1;28379:13;;28263:135::o;28403:201::-;28441:3;28469:10;28514:2;28507:5;28503:14;28541:2;28532:7;28529:15;28526:41;;;28547:18;;:::i;:::-;28596:1;28583:15;;28403:201;-1:-1:-1;;;28403:201:1:o;28609:112::-;28641:1;28667;28657:35;;28672:18;;:::i;:::-;-1:-1:-1;28706:9:1;;28609:112::o;28726:127::-;28787:10;28782:3;28778:20;28775:1;28768:31;28818:4;28815:1;28808:15;28842:4;28839:1;28832:15;28858:127;28919:10;28914:3;28910:20;28907:1;28900:31;28950:4;28947:1;28940:15;28974:4;28971:1;28964:15;28990:127;29051:10;29046:3;29042:20;29039:1;29032:31;29082:4;29079:1;29072:15;29106:4;29103:1;29096:15;29122:127;29183:10;29178:3;29174:20;29171:1;29164:31;29214:4;29211:1;29204:15;29238:4;29235:1;29228:15;29254:127;29315:10;29310:3;29306:20;29303:1;29296:31;29346:4;29343:1;29336:15;29370:4;29367:1;29360:15;29386:131;-1:-1:-1;;;;;;29460:32:1;;29450:43;;29440:71;;29507:1;29504;29497:12
Swarm Source
ipfs://8701bbcadccee5a994f271ac1fa113e69db90820032d3ec4de63e8ca06741a55
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.