ERC-721
Overview
Max Total Supply
0 FP
Holders
386
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 FPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FrontierPass
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-27 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /// @title Frontier Pass /// @author Andre Costa @ MyWeb3Startup.com // 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; } } // OpenZeppelin Contracts v4.4.1 (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. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // 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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // 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); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (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; address internal _oldOwner; uint256 internal lastOwnershipTransfer; 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 Returns the address of the previous owner. */ function oldOwner() public view virtual returns (address) { return _oldOwner; } /** * @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; _oldOwner = oldOwner_; _owner = newOwner; lastOwnershipTransfer = block.timestamp; emit OwnershipTransferred(oldOwner_, newOwner); } } // 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); } } // 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; } } /** * @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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } contract FrontierPass is ERC721, Ownable { /// @notice The base uri of the project string public baseURI; /// @notice The collection's max supply uint256 public maxSupply = 888; /// @notice Total reserved uint256 public reserved = 111; /// @notice Total guaranteed mint count uint256 public guaranteed; /// @dev Merkle tree root hash for guaranteed list bytes32 public rootForGuaranteed; /// @dev Merkle tree root hash for allowed list bytes32 public rootForOversubscribed; /// @dev Mapping to check if an address has already minted to avoid double mints on allow list mints mapping(address => bool) public mintedOnGuaranteed; mapping(address => bool) public mintedOnOversubscribed; /// @dev Counters library to track token id and counts using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; Counters.Counter private _guaranteedAllowListMintedCounter; Counters.Counter private _oversubscribedAllowListMintedCounter; /// @dev Different states of minting enum MintState { PAUSED, // Minting is paused GUARANTEED, // Guaranteed allow list OVERSUBSCRIBED, // General allow list PUBLIC // Open to public } MintState public mintState = MintState.PAUSED; constructor() ERC721("Frontier Pass", "FP") { // baseURI = uri; } /// Base uri functions ///@notice Returns the base uri ///@return Base uri function _baseURI() internal view override returns (string memory) { return baseURI; } ///@notice Sets a new base uri ///@dev Only callable by owner ///@param newBaseURI The new base uri function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } ///@notice Returns the token uri ///@dev Updated to include json ///@param tokenId Token id function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId <= _tokenIdCounter.current(), "URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string.concat(baseURI, Strings.toString(tokenId), ".json") : ""; } /// Minting functions ///@notice Mints nft token for allowed list addresses ///@dev Uses Merkle tree proof ///@param proof The Merkle tree proof of the allow list address function mintAllowlist(bytes32[] calldata proof) external { /// Check if the sale is paused require(mintState == MintState.GUARANTEED || mintState == MintState.OVERSUBSCRIBED, "Not in allowlist minting states"); require(_tokenIdCounter.current() < maxSupply, "Max supply minted"); /// Check if user is on the allow list bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); /// Update the root based on the state bytes32 root; // If current state is for guaranteed mints, set to the guaranteed hash if (mintState == MintState.GUARANTEED) { /// Set the correct root hash root = rootForGuaranteed; /// Check that user has not minted on guaranteed list require(mintedOnGuaranteed[_msgSender()] == false, "User already minted on guaranteed list"); // Check there is sufficient guaranteed mint supply left require(totalGuaranteedAllowListMinted() < guaranteed, "Max guaranteed supply minted"); /// Increase the allow list minted count _guaranteedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnGuaranteed[_msgSender()] = true; } // If current state is for oversubscribed, set to the oversubscribed hash if (mintState == MintState.OVERSUBSCRIBED) { /// Set the correct root hash root = rootForOversubscribed; /// Check that user has not minted on oversubscribed list require(mintedOnOversubscribed[_msgSender()] == false, "User already minted on oversubscribed list"); /// Check there is sufficient oversubscribed supply left /// Balance for oversubscribed mint = max supply minus reserved and guaranteed count require(totalOversubscribedAllowListMinted() < maxSupply - reserved - guaranteed, "Max allow list supply minted"); _oversubscribedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnOversubscribed[_msgSender()] = true; } // Check the merkle proof require(MerkleProof.verify(proof, root, leaf), "Invalid proof"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mints a token to caller addresses function mintPublic() external { require(mintState == MintState.PUBLIC, "Public mint inactive"); /// Check balance of supply /// Total supply minus reserved require(_tokenIdCounter.current() < maxSupply - reserved, "Max available public supply minted"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mint from reserve supply ///@dev Only callable by owner ///@param to Array of addresses to receive airdrop function mintFromReserved(address[] calldata to) external onlyOwner { /// Check balance of supply require(to.length <= reserved, "Amount exceeds reserved supply"); for(uint i; i < to.length;) { /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(to[i], tokenId); /// Unchecked i to save gas unchecked { i++; } } /// Reduce the reserved amount after minting reserved -= to.length; } /// Other view and admin functions /** * @param merkleRoot_ The new merkle root */ function setMerkleRootGuaranteed(bytes32 merkleRoot_) external onlyOwner { rootForGuaranteed = merkleRoot_; } /** * @param merkleRoot_ The new merkle root */ function setMerkleOversubscribed(bytes32 merkleRoot_) external onlyOwner { rootForOversubscribed = merkleRoot_; } ///@notice Returns the total number of nftes minted function totalMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _tokenIdCounter.current(); } ///@notice Returns the current number of guaranteed allow list minted function totalGuaranteedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current(); } ///@notice Returns the current number of oversubscribed allow list minted function totalOversubscribedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _oversubscribedAllowListMintedCounter.current(); } ///@notice Returns the total allow list minted function totalAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current() + _oversubscribedAllowListMintedCounter.current(); } /** * Set mint state. * @param mintState_ The new state of the contract. */ function setMintState(uint256 mintState_) external onlyOwner { require(mintState_ < 5, "Invalid State!"); if (mintState_ == 0) { mintState = MintState.PAUSED; } else if (mintState_ == 1) { mintState = MintState.GUARANTEED; } else if (mintState_ == 2) { mintState = MintState.OVERSUBSCRIBED; } else { mintState = MintState.PUBLIC; } } ///@notice Function to update guaranteed mint count ///@param count New guaranteed mint count function setGuaranteedCount(uint256 count) external onlyOwner { guaranteed = count; } ///@notice Function to update reserved mint count ///@param count New reserved mint count function setReservedCount(uint256 count) external onlyOwner { reserved = count; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"mintFromReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum FrontierPass.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnGuaranteed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnOversubscribed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForGuaranteed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForOversubscribed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setGuaranteedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleOversubscribed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintState_","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setReservedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuaranteedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOversubscribedAllowListMinted","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"}]
Contract Creation Code
6080604052610378600a55606f600b556014805460ff191690553480156200002657600080fd5b506040518060400160405280600d81526020016c46726f6e74696572205061737360981b81525060405180604001604052806002815260200161046560f41b8152508160009081620000799190620001b6565b506001620000888282620001b6565b505050620000a56200009f620000ab60201b60201c565b620000af565b62000282565b3390565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200013c57607f821691505b6020821081036200015d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001b157600081815260208120601f850160051c810160208610156200018c5750805b601f850160051c820191505b81811015620001ad5782815560010162000198565b5050505b505050565b81516001600160401b03811115620001d257620001d262000111565b620001ea81620001e3845462000127565b8462000163565b602080601f831160018114620002225760008415620002095750858301515b600019600386901b1c1916600185901b178555620001ad565b600085815260208120601f198616915b82811015620002535788860151825594840194600190910190840162000232565b5085821015620002725787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61242280620002926000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c8063893807aa1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146104b7578063f2fde38b146104bf578063f487404f146104d2578063f9c957d8146104e3578063fe60d12c146104f657600080fd5b8063c87b56dd14610477578063d371f76b1461048a578063d5abeb0114610492578063e921dad21461049b578063e985e9c5146104a457600080fd5b8063a2309ff8116100ff578063a2309ff81461040c578063ad8c3f3314610414578063b242223214610427578063b88d4fde1461044a578063c051e38a1461045d57600080fd5b8063893807aa146103b55780638c874ebd146103d85780638da5cb5b146103e057806395d89b41146103f1578063a22cb465146103f957600080fd5b806332f4681c116101c95780636352211e1161018d5780636352211e1461036c5780636c0360eb1461037f5780636c96b0831461038757806370a082311461039a578063715018a6146103ad57600080fd5b806332f4681c1461032257806335d5959a1461032b5780633c1860181461033e57806342842e0e1461034657806355f804b31461035957600080fd5b80630bb862d1116102105780630bb862d1146102bf57806316f9b707146102d2578063229fafe2146102e557806323b872dd146102f85780632dc7b8551461030b57600080fd5b806301ffc9a71461024257806306fdde031461026a578063081812fc1461027f578063095ea7b3146102aa575b600080fd5b610255610250366004611c28565b6104ff565b60405190151581526020015b60405180910390f35b610272610551565b6040516102619190611c9c565b61029261028d366004611caf565b6105e3565b6040516001600160a01b039091168152602001610261565b6102bd6102b8366004611ce4565b61060a565b005b6102bd6102cd366004611caf565b610724565b6102bd6102e0366004611caf565b6107f7565b6102bd6102f3366004611d5a565b610826565b6102bd610306366004611d9c565b610920565b610314600d5481565b604051908152602001610261565b610314600c5481565b6102bd610339366004611caf565b610951565b610314610980565b6102bd610354366004611d9c565b61099d565b6102bd610367366004611e64565b6109b8565b61029261037a366004611caf565b6109f2565b610272610a52565b6102bd610395366004611d5a565b610ae0565b6103146103a8366004611ead565b610ed4565b6102bd610f5a565b6102556103c3366004611ead565b60106020526000908152604090205460ff1681565b6102bd610f90565b6006546001600160a01b0316610292565b61027261107c565b6102bd610407366004611ec8565b61108b565b610314611096565b6102bd610422366004611caf565b6110a1565b610255610435366004611ead565b600f6020526000908152604090205460ff1681565b6102bd610458366004611f04565b6110d0565b60145461046a9060ff1681565b6040516102619190611f96565b610272610485366004611caf565b611108565b6103146111be565b610314600a5481565b610314600e5481565b6102556104b2366004611fbe565b6111c9565b6103146111f7565b6102bd6104cd366004611ead565b611202565b6007546001600160a01b0316610292565b6102bd6104f1366004611caf565b61129a565b610314600b5481565b60006001600160e01b031982166380ac58cd60e01b148061053057506001600160e01b03198216635b5e139f60e01b145b8061054b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461056090611ff1565b80601f016020809104026020016040519081016040528092919081815260200182805461058c90611ff1565b80156105d95780601f106105ae576101008083540402835291602001916105d9565b820191906000526020600020905b8154815290600101906020018083116105bc57829003601f168201915b5050505050905090565b60006105ee826112c9565b506000908152600460205260409020546001600160a01b031690565b6000610615826109f2565b9050806001600160a01b0316836001600160a01b0316036106875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806106a357506106a381336111c9565b6107155760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161067e565b61071f8383611328565b505050565b6006546001600160a01b0316331461074e5760405162461bcd60e51b815260040161067e9061202b565b6005811061078f5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642053746174652160901b604482015260640161067e565b806000036107af57601480546000919060ff19166001835b021790555050565b806001036107ca57601480546001919060ff191682806107a7565b806002036107e657601480546002919060ff19166001836107a7565b6014805460ff191660031790555b50565b6006546001600160a01b031633146108215760405162461bcd60e51b815260040161067e9061202b565b600b55565b6006546001600160a01b031633146108505760405162461bcd60e51b815260040161067e9061202b565b600b548111156108a25760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206578636565647320726573657276656420737570706c790000604482015260640161067e565b60005b818110156109015760006108b860115490565b90506108c8601180546001019055565b6108f88484848181106108dd576108dd612060565b90506020020160208101906108f29190611ead565b82611396565b506001016108a5565b5081819050600b6000828254610917919061208c565b90915550505050565b61092a33826113b0565b6109465760405162461bcd60e51b815260040161067e9061209f565b61071f838383611487565b6006546001600160a01b0316331461097b5760405162461bcd60e51b815260040161067e9061202b565b600d55565b600061098b60135490565b60125461099891906120ec565b905090565b61071f838383604051806020016040528060008152506110d0565b6006546001600160a01b031633146109e25760405162461bcd60e51b815260040161067e9061202b565b60096109ee828261214d565b5050565b6000818152600260205260408120546001600160a01b03168061054b5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161067e565b60098054610a5f90611ff1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b90611ff1565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b505050505081565b600160145460ff166003811115610af957610af9611f80565b1480610b1b5750600260145460ff166003811115610b1957610b19611f80565b145b610b675760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300604482015260640161067e565b600a5460115410610bae5760405162461bcd60e51b815260206004820152601160248201527013585e081cdd5c1c1b1e481b5a5b9d1959607a1b604482015260640161067e565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160408051601f19818403018152919052805160209091012090506000600160145460ff166003811115610c0457610c04611f80565b03610cfd5750600d54336000908152600f602052604090205460ff1615610c7c5760405162461bcd60e51b815260206004820152602660248201527f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560448201526519081b1a5cdd60d21b606482015260840161067e565b600c54610c876111f7565b10610cd45760405162461bcd60e51b815260206004820152601c60248201527f4d61782067756172616e7465656420737570706c79206d696e74656400000000604482015260640161067e565b610ce2601280546001019055565b336000908152600f60205260409020805460ff191660011790555b600260145460ff166003811115610d1657610d16611f80565b03610e2d5750600e543360009081526010602052604090205460ff1615610d925760405162461bcd60e51b815260206004820152602a60248201527f5573657220616c7265616479206d696e746564206f6e206f76657273756273636044820152691c9a589959081b1a5cdd60b21b606482015260840161067e565b600c54600b54600a54610da5919061208c565b610daf919061208c565b610db76111be565b10610e045760405162461bcd60e51b815260206004820152601c60248201527f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000604482015260640161067e565b610e12601380546001019055565b336000908152601060205260409020805460ff191660011790555b610e6d84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525085925086915061162d9050565b610ea95760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161067e565b6000610eb460115490565b9050610ec4601180546001019055565b610ecd336108f2565b5050505050565b60006001600160a01b038216610f3e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161067e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f845760405162461bcd60e51b815260040161067e9061202b565b610f8e6000611643565b565b600360145460ff166003811115610fa957610fa9611f80565b14610fed5760405162461bcd60e51b81526020600482015260146024820152735075626c6963206d696e7420696e61637469766560601b604482015260640161067e565b600b54600a54610ffd919061208c565b601154106110585760405162461bcd60e51b815260206004820152602260248201527f4d617820617661696c61626c65207075626c696320737570706c79206d696e74604482015261195960f21b606482015260840161067e565b600061106360115490565b9050611073601180546001019055565b6107f4336108f2565b60606001805461056090611ff1565b6109ee3383836116a5565b600061099860115490565b6006546001600160a01b031633146110cb5760405162461bcd60e51b815260040161067e9061202b565b600e55565b6110da33836113b0565b6110f65760405162461bcd60e51b815260040161067e9061209f565b61110284848484611773565b50505050565b606061111360115490565b8211156111625760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161067e565b60006009805461117190611ff1565b90501161118d576040518060200160405280600081525061054b565b6009611198836117a6565b6040516020016111a992919061220d565b60405160208183030381529060405292915050565b600061099860135490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061099860125490565b6006546001600160a01b0316331461122c5760405162461bcd60e51b815260040161067e9061202b565b6001600160a01b0381166112915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b6107f481611643565b6006546001600160a01b031633146112c45760405162461bcd60e51b815260040161067e9061202b565b600c55565b6000818152600260205260409020546001600160a01b03166107f45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161067e565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061135d826109f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6109ee8282604051806020016040528060008152506118a7565b6000818152600260205260408120546001600160a01b03166114295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161067e565b6000611434836109f2565b9050806001600160a01b0316846001600160a01b0316148061145b575061145b81856111c9565b8061147f5750836001600160a01b0316611474846105e3565b6001600160a01b0316145b949350505050565b826001600160a01b031661149a826109f2565b6001600160a01b0316146114c05760405162461bcd60e51b815260040161067e906122a4565b6001600160a01b0382166115225760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161067e565b826001600160a01b0316611535826109f2565b6001600160a01b03161461155b5760405162461bcd60e51b815260040161067e906122a4565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b03861683526003909152812080546001929061159e90849061208c565b90915550506001600160a01b03821660009081526003602052604081208054600192906115cc9084906120ec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008261163a85846118da565b14949350505050565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036117065760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161067e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61177e848484611487565b61178a84848484611986565b6111025760405162461bcd60e51b815260040161067e906122e9565b6060816000036117cd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117f757806117e18161233b565b91506117f09050600a8361236a565b91506117d1565b60008167ffffffffffffffff81111561181257611812611dd8565b6040519080825280601f01601f19166020018201604052801561183c576020820181803683370190505b5090505b841561147f5761185160018361208c565b915061185e600a8661237e565b6118699060306120ec565b60f81b81838151811061187e5761187e612060565b60200101906001600160f81b031916908160001a9053506118a0600a8661236a565b9450611840565b6118b18383611a87565b6118be6000848484611986565b61071f5760405162461bcd60e51b815260040161067e906122e9565b600081815b845181101561197e5760008582815181106118fc576118fc612060565b6020026020010151905080831161193e57604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061196b565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806119768161233b565b9150506118df565b509392505050565b60006001600160a01b0384163b15611a7c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119ca903390899088908890600401612392565b6020604051808303816000875af1925050508015611a05575060408051601f3d908101601f19168201909252611a02918101906123cf565b60015b611a62573d808015611a33576040519150601f19603f3d011682016040523d82523d6000602084013e611a38565b606091505b508051600003611a5a5760405162461bcd60e51b815260040161067e906122e9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147f565b506001949350505050565b6001600160a01b038216611add5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161067e565b6000818152600260205260409020546001600160a01b031615611b425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067e565b6000818152600260205260409020546001600160a01b031615611ba75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067e565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146107f457600080fd5b600060208284031215611c3a57600080fd5b8135611c4581611c12565b9392505050565b60005b83811015611c67578181015183820152602001611c4f565b50506000910152565b60008151808452611c88816020860160208601611c4c565b601f01601f19169290920160200192915050565b602081526000611c456020830184611c70565b600060208284031215611cc157600080fd5b5035919050565b80356001600160a01b0381168114611cdf57600080fd5b919050565b60008060408385031215611cf757600080fd5b611d0083611cc8565b946020939093013593505050565b60008083601f840112611d2057600080fd5b50813567ffffffffffffffff811115611d3857600080fd5b6020830191508360208260051b8501011115611d5357600080fd5b9250929050565b60008060208385031215611d6d57600080fd5b823567ffffffffffffffff811115611d8457600080fd5b611d9085828601611d0e565b90969095509350505050565b600080600060608486031215611db157600080fd5b611dba84611cc8565b9250611dc860208501611cc8565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611e0957611e09611dd8565b604051601f8501601f19908116603f01168101908282118183101715611e3157611e31611dd8565b81604052809350858152868686011115611e4a57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611e7657600080fd5b813567ffffffffffffffff811115611e8d57600080fd5b8201601f81018413611e9e57600080fd5b61147f84823560208401611dee565b600060208284031215611ebf57600080fd5b611c4582611cc8565b60008060408385031215611edb57600080fd5b611ee483611cc8565b915060208301358015158114611ef957600080fd5b809150509250929050565b60008060008060808587031215611f1a57600080fd5b611f2385611cc8565b9350611f3160208601611cc8565b925060408501359150606085013567ffffffffffffffff811115611f5457600080fd5b8501601f81018713611f6557600080fd5b611f7487823560208401611dee565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160048310611fb857634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215611fd157600080fd5b611fda83611cc8565b9150611fe860208401611cc8565b90509250929050565b600181811c9082168061200557607f821691505b60208210810361202557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561054b5761054b612076565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082018082111561054b5761054b612076565b601f82111561071f57600081815260208120601f850160051c810160208610156121265750805b601f850160051c820191505b8181101561214557828155600101612132565b505050505050565b815167ffffffffffffffff81111561216757612167611dd8565b61217b816121758454611ff1565b846120ff565b602080601f8311600181146121b057600084156121985750858301515b600019600386901b1c1916600185901b178555612145565b600085815260208120601f198616915b828110156121df578886015182559484019460019091019084016121c0565b50858210156121fd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080845461221b81611ff1565b60018281168015612233576001811461224857612277565b60ff1984168752821515830287019450612277565b8860005260208060002060005b8581101561226e5781548a820152908401908201612255565b50505082870194505b50505050835161228b818360208801611c4c565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001820161234d5761234d612076565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261237957612379612354565b500490565b60008261238d5761238d612354565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123c590830184611c70565b9695505050505050565b6000602082840312156123e157600080fd5b8151611c4581611c1256fea2646970667358221220e214c98e070f891a8963d9105d7021bdd93757064e0f9ab6768ea6c8940d9c7d64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c8063893807aa1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146104b7578063f2fde38b146104bf578063f487404f146104d2578063f9c957d8146104e3578063fe60d12c146104f657600080fd5b8063c87b56dd14610477578063d371f76b1461048a578063d5abeb0114610492578063e921dad21461049b578063e985e9c5146104a457600080fd5b8063a2309ff8116100ff578063a2309ff81461040c578063ad8c3f3314610414578063b242223214610427578063b88d4fde1461044a578063c051e38a1461045d57600080fd5b8063893807aa146103b55780638c874ebd146103d85780638da5cb5b146103e057806395d89b41146103f1578063a22cb465146103f957600080fd5b806332f4681c116101c95780636352211e1161018d5780636352211e1461036c5780636c0360eb1461037f5780636c96b0831461038757806370a082311461039a578063715018a6146103ad57600080fd5b806332f4681c1461032257806335d5959a1461032b5780633c1860181461033e57806342842e0e1461034657806355f804b31461035957600080fd5b80630bb862d1116102105780630bb862d1146102bf57806316f9b707146102d2578063229fafe2146102e557806323b872dd146102f85780632dc7b8551461030b57600080fd5b806301ffc9a71461024257806306fdde031461026a578063081812fc1461027f578063095ea7b3146102aa575b600080fd5b610255610250366004611c28565b6104ff565b60405190151581526020015b60405180910390f35b610272610551565b6040516102619190611c9c565b61029261028d366004611caf565b6105e3565b6040516001600160a01b039091168152602001610261565b6102bd6102b8366004611ce4565b61060a565b005b6102bd6102cd366004611caf565b610724565b6102bd6102e0366004611caf565b6107f7565b6102bd6102f3366004611d5a565b610826565b6102bd610306366004611d9c565b610920565b610314600d5481565b604051908152602001610261565b610314600c5481565b6102bd610339366004611caf565b610951565b610314610980565b6102bd610354366004611d9c565b61099d565b6102bd610367366004611e64565b6109b8565b61029261037a366004611caf565b6109f2565b610272610a52565b6102bd610395366004611d5a565b610ae0565b6103146103a8366004611ead565b610ed4565b6102bd610f5a565b6102556103c3366004611ead565b60106020526000908152604090205460ff1681565b6102bd610f90565b6006546001600160a01b0316610292565b61027261107c565b6102bd610407366004611ec8565b61108b565b610314611096565b6102bd610422366004611caf565b6110a1565b610255610435366004611ead565b600f6020526000908152604090205460ff1681565b6102bd610458366004611f04565b6110d0565b60145461046a9060ff1681565b6040516102619190611f96565b610272610485366004611caf565b611108565b6103146111be565b610314600a5481565b610314600e5481565b6102556104b2366004611fbe565b6111c9565b6103146111f7565b6102bd6104cd366004611ead565b611202565b6007546001600160a01b0316610292565b6102bd6104f1366004611caf565b61129a565b610314600b5481565b60006001600160e01b031982166380ac58cd60e01b148061053057506001600160e01b03198216635b5e139f60e01b145b8061054b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461056090611ff1565b80601f016020809104026020016040519081016040528092919081815260200182805461058c90611ff1565b80156105d95780601f106105ae576101008083540402835291602001916105d9565b820191906000526020600020905b8154815290600101906020018083116105bc57829003601f168201915b5050505050905090565b60006105ee826112c9565b506000908152600460205260409020546001600160a01b031690565b6000610615826109f2565b9050806001600160a01b0316836001600160a01b0316036106875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806106a357506106a381336111c9565b6107155760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161067e565b61071f8383611328565b505050565b6006546001600160a01b0316331461074e5760405162461bcd60e51b815260040161067e9061202b565b6005811061078f5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642053746174652160901b604482015260640161067e565b806000036107af57601480546000919060ff19166001835b021790555050565b806001036107ca57601480546001919060ff191682806107a7565b806002036107e657601480546002919060ff19166001836107a7565b6014805460ff191660031790555b50565b6006546001600160a01b031633146108215760405162461bcd60e51b815260040161067e9061202b565b600b55565b6006546001600160a01b031633146108505760405162461bcd60e51b815260040161067e9061202b565b600b548111156108a25760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206578636565647320726573657276656420737570706c790000604482015260640161067e565b60005b818110156109015760006108b860115490565b90506108c8601180546001019055565b6108f88484848181106108dd576108dd612060565b90506020020160208101906108f29190611ead565b82611396565b506001016108a5565b5081819050600b6000828254610917919061208c565b90915550505050565b61092a33826113b0565b6109465760405162461bcd60e51b815260040161067e9061209f565b61071f838383611487565b6006546001600160a01b0316331461097b5760405162461bcd60e51b815260040161067e9061202b565b600d55565b600061098b60135490565b60125461099891906120ec565b905090565b61071f838383604051806020016040528060008152506110d0565b6006546001600160a01b031633146109e25760405162461bcd60e51b815260040161067e9061202b565b60096109ee828261214d565b5050565b6000818152600260205260408120546001600160a01b03168061054b5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161067e565b60098054610a5f90611ff1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b90611ff1565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b505050505081565b600160145460ff166003811115610af957610af9611f80565b1480610b1b5750600260145460ff166003811115610b1957610b19611f80565b145b610b675760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300604482015260640161067e565b600a5460115410610bae5760405162461bcd60e51b815260206004820152601160248201527013585e081cdd5c1c1b1e481b5a5b9d1959607a1b604482015260640161067e565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160408051601f19818403018152919052805160209091012090506000600160145460ff166003811115610c0457610c04611f80565b03610cfd5750600d54336000908152600f602052604090205460ff1615610c7c5760405162461bcd60e51b815260206004820152602660248201527f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560448201526519081b1a5cdd60d21b606482015260840161067e565b600c54610c876111f7565b10610cd45760405162461bcd60e51b815260206004820152601c60248201527f4d61782067756172616e7465656420737570706c79206d696e74656400000000604482015260640161067e565b610ce2601280546001019055565b336000908152600f60205260409020805460ff191660011790555b600260145460ff166003811115610d1657610d16611f80565b03610e2d5750600e543360009081526010602052604090205460ff1615610d925760405162461bcd60e51b815260206004820152602a60248201527f5573657220616c7265616479206d696e746564206f6e206f76657273756273636044820152691c9a589959081b1a5cdd60b21b606482015260840161067e565b600c54600b54600a54610da5919061208c565b610daf919061208c565b610db76111be565b10610e045760405162461bcd60e51b815260206004820152601c60248201527f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000604482015260640161067e565b610e12601380546001019055565b336000908152601060205260409020805460ff191660011790555b610e6d84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525085925086915061162d9050565b610ea95760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161067e565b6000610eb460115490565b9050610ec4601180546001019055565b610ecd336108f2565b5050505050565b60006001600160a01b038216610f3e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161067e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f845760405162461bcd60e51b815260040161067e9061202b565b610f8e6000611643565b565b600360145460ff166003811115610fa957610fa9611f80565b14610fed5760405162461bcd60e51b81526020600482015260146024820152735075626c6963206d696e7420696e61637469766560601b604482015260640161067e565b600b54600a54610ffd919061208c565b601154106110585760405162461bcd60e51b815260206004820152602260248201527f4d617820617661696c61626c65207075626c696320737570706c79206d696e74604482015261195960f21b606482015260840161067e565b600061106360115490565b9050611073601180546001019055565b6107f4336108f2565b60606001805461056090611ff1565b6109ee3383836116a5565b600061099860115490565b6006546001600160a01b031633146110cb5760405162461bcd60e51b815260040161067e9061202b565b600e55565b6110da33836113b0565b6110f65760405162461bcd60e51b815260040161067e9061209f565b61110284848484611773565b50505050565b606061111360115490565b8211156111625760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161067e565b60006009805461117190611ff1565b90501161118d576040518060200160405280600081525061054b565b6009611198836117a6565b6040516020016111a992919061220d565b60405160208183030381529060405292915050565b600061099860135490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061099860125490565b6006546001600160a01b0316331461122c5760405162461bcd60e51b815260040161067e9061202b565b6001600160a01b0381166112915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b6107f481611643565b6006546001600160a01b031633146112c45760405162461bcd60e51b815260040161067e9061202b565b600c55565b6000818152600260205260409020546001600160a01b03166107f45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161067e565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061135d826109f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6109ee8282604051806020016040528060008152506118a7565b6000818152600260205260408120546001600160a01b03166114295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161067e565b6000611434836109f2565b9050806001600160a01b0316846001600160a01b0316148061145b575061145b81856111c9565b8061147f5750836001600160a01b0316611474846105e3565b6001600160a01b0316145b949350505050565b826001600160a01b031661149a826109f2565b6001600160a01b0316146114c05760405162461bcd60e51b815260040161067e906122a4565b6001600160a01b0382166115225760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161067e565b826001600160a01b0316611535826109f2565b6001600160a01b03161461155b5760405162461bcd60e51b815260040161067e906122a4565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b03861683526003909152812080546001929061159e90849061208c565b90915550506001600160a01b03821660009081526003602052604081208054600192906115cc9084906120ec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008261163a85846118da565b14949350505050565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036117065760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161067e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61177e848484611487565b61178a84848484611986565b6111025760405162461bcd60e51b815260040161067e906122e9565b6060816000036117cd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117f757806117e18161233b565b91506117f09050600a8361236a565b91506117d1565b60008167ffffffffffffffff81111561181257611812611dd8565b6040519080825280601f01601f19166020018201604052801561183c576020820181803683370190505b5090505b841561147f5761185160018361208c565b915061185e600a8661237e565b6118699060306120ec565b60f81b81838151811061187e5761187e612060565b60200101906001600160f81b031916908160001a9053506118a0600a8661236a565b9450611840565b6118b18383611a87565b6118be6000848484611986565b61071f5760405162461bcd60e51b815260040161067e906122e9565b600081815b845181101561197e5760008582815181106118fc576118fc612060565b6020026020010151905080831161193e57604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061196b565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806119768161233b565b9150506118df565b509392505050565b60006001600160a01b0384163b15611a7c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119ca903390899088908890600401612392565b6020604051808303816000875af1925050508015611a05575060408051601f3d908101601f19168201909252611a02918101906123cf565b60015b611a62573d808015611a33576040519150601f19603f3d011682016040523d82523d6000602084013e611a38565b606091505b508051600003611a5a5760405162461bcd60e51b815260040161067e906122e9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147f565b506001949350505050565b6001600160a01b038216611add5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161067e565b6000818152600260205260409020546001600160a01b031615611b425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067e565b6000818152600260205260409020546001600160a01b031615611ba75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067e565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146107f457600080fd5b600060208284031215611c3a57600080fd5b8135611c4581611c12565b9392505050565b60005b83811015611c67578181015183820152602001611c4f565b50506000910152565b60008151808452611c88816020860160208601611c4c565b601f01601f19169290920160200192915050565b602081526000611c456020830184611c70565b600060208284031215611cc157600080fd5b5035919050565b80356001600160a01b0381168114611cdf57600080fd5b919050565b60008060408385031215611cf757600080fd5b611d0083611cc8565b946020939093013593505050565b60008083601f840112611d2057600080fd5b50813567ffffffffffffffff811115611d3857600080fd5b6020830191508360208260051b8501011115611d5357600080fd5b9250929050565b60008060208385031215611d6d57600080fd5b823567ffffffffffffffff811115611d8457600080fd5b611d9085828601611d0e565b90969095509350505050565b600080600060608486031215611db157600080fd5b611dba84611cc8565b9250611dc860208501611cc8565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611e0957611e09611dd8565b604051601f8501601f19908116603f01168101908282118183101715611e3157611e31611dd8565b81604052809350858152868686011115611e4a57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611e7657600080fd5b813567ffffffffffffffff811115611e8d57600080fd5b8201601f81018413611e9e57600080fd5b61147f84823560208401611dee565b600060208284031215611ebf57600080fd5b611c4582611cc8565b60008060408385031215611edb57600080fd5b611ee483611cc8565b915060208301358015158114611ef957600080fd5b809150509250929050565b60008060008060808587031215611f1a57600080fd5b611f2385611cc8565b9350611f3160208601611cc8565b925060408501359150606085013567ffffffffffffffff811115611f5457600080fd5b8501601f81018713611f6557600080fd5b611f7487823560208401611dee565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160048310611fb857634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215611fd157600080fd5b611fda83611cc8565b9150611fe860208401611cc8565b90509250929050565b600181811c9082168061200557607f821691505b60208210810361202557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561054b5761054b612076565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082018082111561054b5761054b612076565b601f82111561071f57600081815260208120601f850160051c810160208610156121265750805b601f850160051c820191505b8181101561214557828155600101612132565b505050505050565b815167ffffffffffffffff81111561216757612167611dd8565b61217b816121758454611ff1565b846120ff565b602080601f8311600181146121b057600084156121985750858301515b600019600386901b1c1916600185901b178555612145565b600085815260208120601f198616915b828110156121df578886015182559484019460019091019084016121c0565b50858210156121fd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080845461221b81611ff1565b60018281168015612233576001811461224857612277565b60ff1984168752821515830287019450612277565b8860005260208060002060005b8581101561226e5781548a820152908401908201612255565b50505082870194505b50505050835161228b818360208801611c4c565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001820161234d5761234d612076565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261237957612379612354565b500490565b60008261238d5761238d612354565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123c590830184611c70565b9695505050505050565b6000602082840312156123e157600080fd5b8151611c4581611c1256fea2646970667358221220e214c98e070f891a8963d9105d7021bdd93757064e0f9ab6768ea6c8940d9c7d64736f6c63430008120033
Deployed Bytecode Sourcemap
42366:9259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27082:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27082:305:0;;;;;;;;28010:100;;;:::i;:::-;;;;;;;:::i;29522:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;29522:171:0;1533:203:1;29040:416:0;;;;;;:::i;:::-;;:::i;:::-;;50719:481;;;;;;:::i;:::-;;:::i;51522:96::-;;;;;;:::i;:::-;;:::i;48139:672::-;;;;;;:::i;:::-;;:::i;30222:301::-;;;;;;:::i;:::-;;:::i;42786:32::-;;;;;;;;;3471:25:1;;;3459:2;3444:18;42786:32:0;3325:177:1;42695:25:0;;;;;;48926:123;;;;;;:::i;:::-;;:::i;50308:304::-;;;:::i;30594:151::-;;;;;;:::i;:::-;;:::i;44136:104::-;;;;;;:::i;:::-;;:::i;27720:223::-;;;;;;:::i;:::-;;:::i;42462:21::-;;;:::i;44854:2563::-;;;;;;:::i;:::-;;:::i;27451:207::-;;;;;;:::i;:::-;;:::i;21928:103::-;;;:::i;43089:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47476:521;;;:::i;21102:87::-;21175:6;;-1:-1:-1;;;;;21175:6:0;21102:87;;28179:104;;;:::i;29765:155::-;;;;;;:::i;:::-;;:::i;49314:227::-;;;:::i;49122:127::-;;;;;;:::i;:::-;;:::i;43031:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30816:279;;;;;;:::i;:::-;;:::i;43679:45::-;;;;;;;;;;;;;;;;:::i;44356:298::-;;;;;;:::i;:::-;;:::i;49975:272::-;;;:::i;42538:30::-;;;;;;42880:36;;;;;;29991:164;;;;;;:::i;:::-;;:::i;49624:264::-;;;:::i;22186:201::-;;;;;;:::i;:::-;;:::i;21271:93::-;21347:9;;-1:-1:-1;;;;;21347:9:0;21271:93;;51313:100;;;;;;:::i;:::-;;:::i;42610:29::-;;;;;;27082:305;27184:4;-1:-1:-1;;;;;;27221:40:0;;-1:-1:-1;;;27221:40:0;;:105;;-1:-1:-1;;;;;;;27278:48:0;;-1:-1:-1;;;27278:48:0;27221:105;:158;;;-1:-1:-1;;;;;;;;;;25800:40:0;;;27343:36;27201:178;27082:305;-1:-1:-1;;27082:305:0:o;28010:100::-;28064:13;28097:5;28090:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28010:100;:::o;29522:171::-;29598:7;29618:23;29633:7;29618:14;:23::i;:::-;-1:-1:-1;29661:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29661:24:0;;29522:171::o;29040:416::-;29121:13;29137:23;29152:7;29137:14;:23::i;:::-;29121:39;;29185:5;-1:-1:-1;;;;;29179:11:0;:2;-1:-1:-1;;;;;29179:11:0;;29171:57;;;;-1:-1:-1;;;29171:57:0;;8087:2:1;29171:57:0;;;8069:21:1;8126:2;8106:18;;;8099:30;8165:34;8145:18;;;8138:62;-1:-1:-1;;;8216:18:1;;;8209:31;8257:19;;29171:57:0;;;;;;;;;19826:10;-1:-1:-1;;;;;29263:21:0;;;;:62;;-1:-1:-1;29288:37:0;29305:5;19826:10;29991:164;:::i;29288:37::-;29241:173;;;;-1:-1:-1;;;29241:173:0;;8489:2:1;29241:173:0;;;8471:21:1;8528:2;8508:18;;;8501:30;8567:34;8547:18;;;8540:62;8638:31;8618:18;;;8611:59;8687:19;;29241:173:0;8287:425:1;29241:173:0;29427:21;29436:2;29440:7;29427:8;:21::i;:::-;29110:346;29040:416;;:::o;50719:481::-;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;50812:1:::1;50799:10;:14;50791:41;;;::::0;-1:-1:-1;;;50791:41:0;;9280:2:1;50791:41:0::1;::::0;::::1;9262:21:1::0;9319:2;9299:18;;;9292:30;-1:-1:-1;;;9338:18:1;;;9331:44;9392:18;;50791:41:0::1;9078:338:1::0;50791:41:0::1;50857:10;50871:1;50857:15:::0;50853:340:::1;;50889:9;:28:::0;;50901:16:::1;::::0;50889:9;-1:-1:-1;;50889:28:0::1;::::0;50901:16;50889:28:::1;;;;;;50719:481:::0;:::o;50853:340::-:1;50948:10;50962:1;50948:15:::0;50944:249:::1;;50980:9;:32:::0;;50992:20:::1;::::0;50980:9;-1:-1:-1;;50980:32:0::1;50992:20:::0;;50980:32:::1;::::0;50944:249:::1;51043:10;51057:1;51043:15:::0;51039:154:::1;;51075:9;:36:::0;;51087:24:::1;::::0;51075:9;-1:-1:-1;;51075:36:0::1;::::0;51087:24;51075:36:::1;::::0;51039:154:::1;51153:9;:28:::0;;-1:-1:-1;;51153:28:0::1;51165:16;51153:28;::::0;;51039:154:::1;50719:481:::0;:::o;51522:96::-;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;51593:8:::1;:16:::0;51522:96::o;48139:672::-;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;48276:8:::1;::::0;48263:21;::::1;;48255:64;;;::::0;-1:-1:-1;;;48255:64:0;;9623:2:1;48255:64:0::1;::::0;::::1;9605:21:1::0;9662:2;9642:18;;;9635:30;9701:32;9681:18;;;9674:60;9751:18;;48255:64:0::1;9421:354:1::0;48255:64:0::1;48345:6;48341:374;48353:13:::0;;::::1;48341:374;;;48439:15;48457:25;:15;1043:14:::0;;951:114;48457:25:::1;48439:43;;48497:27;:15;1162:19:::0;;1180:1;1162:19;;;1073:127;48497:27:::1;48573:25;48583:2;;48586:1;48583:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48590:7;48573:9;:25::i;:::-;-1:-1:-1::0;48685:3:0::1;;48341:374;;;;48793:2;;:9;;48781:8;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;48139:672:0:o;30222:301::-;30383:41;19826:10;30416:7;30383:18;:41::i;:::-;30375:99;;;;-1:-1:-1;;;30375:99:0;;;;;;;:::i;:::-;30487:28;30497:4;30503:2;30507:7;30487:9;:28::i;48926:123::-;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;49010:17:::1;:31:::0;48926:123::o;50308:304::-;50360:7;50556:47;:37;1043:14;;951:114;50556:47;50510:33;1043:14;50510:93;;;;:::i;:::-;50503:100;;50308:304;:::o;30594:151::-;30698:39;30715:4;30721:2;30725:7;30698:39;;;;;;;;;;;;:16;:39::i;44136:104::-;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;44212:7:::1;:20;44222:10:::0;44212:7;:20:::1;:::i;:::-;;44136:104:::0;:::o;27720:223::-;27792:7;32453:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32453:16:0;;27856:56;;;;-1:-1:-1;;;27856:56:0;;13127:2:1;27856:56:0;;;13109:21:1;13166:2;13146:18;;;13139:30;-1:-1:-1;;;13185:18:1;;;13178:54;13249:18;;27856:56:0;12925:348:1;42462:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44854:2563::-;44985:20;44972:9;;;;:33;;;;;;;;:::i;:::-;;:74;;;-1:-1:-1;45022:24:0;45009:9;;;;:37;;;;;;;;:::i;:::-;;44972:74;44964:118;;;;-1:-1:-1;;;44964:118:0;;13480:2:1;44964:118:0;;;13462:21:1;13519:2;13499:18;;;13492:30;13558:33;13538:18;;;13531:61;13609:18;;44964:118:0;13278:355:1;44964:118:0;45131:9;;45103:15;1043:14;45103:37;45095:67;;;;-1:-1:-1;;;45095:67:0;;13840:2:1;45095:67:0;;;13822:21:1;13879:2;13859:18;;;13852:30;-1:-1:-1;;;13898:18:1;;;13891:47;13955:18;;45095:67:0;13638:341:1;45095:67:0;45249:30;;-1:-1:-1;;19826:10:0;14133:2:1;14129:15;14125:53;45249:30:0;;;14113:66:1;45224:12:0;;14195::1;;45249:30:0;;;-1:-1:-1;;45249:30:0;;;;;;;;;45239:41;;45249:30;45239:41;;;;;-1:-1:-1;45349:12:0;45472:20;45459:9;;;;:33;;;;;;;;:::i;:::-;;45455:728;;-1:-1:-1;45561:17:0;;19826:10;45671:32;;;;:18;:32;;;;;;;;:41;45663:92;;;;-1:-1:-1;;;45663:92:0;;14420:2:1;45663:92:0;;;14402:21:1;14459:2;14439:18;;;14432:30;14498:34;14478:18;;;14471:62;-1:-1:-1;;;14549:18:1;;;14542:36;14595:19;;45663:92:0;14218:402:1;45663:92:0;45898:10;;45863:32;:30;:32::i;:::-;:45;45855:86;;;;-1:-1:-1;;;45855:86:0;;14827:2:1;45855:86:0;;;14809:21:1;14866:2;14846:18;;;14839:30;14905;14885:18;;;14878:58;14953:18;;45855:86:0;14625:352:1;45855:86:0;46025:45;:33;1162:19;;1180:1;1162:19;;;1073:127;46025:45;19826:10;46132:32;;;;:18;:32;;;;;:39;;-1:-1:-1;;46132:39:0;46167:4;46132:39;;;45455:728;46296:24;46283:9;;;;:37;;;;;;;;:::i;:::-;;46279:802;;-1:-1:-1;46389:21:0;;19826:10;46507:36;;;;:22;:36;;;;;;;;:45;46499:100;;;;-1:-1:-1;;;46499:100:0;;15184:2:1;46499:100:0;;;15166:21:1;15223:2;15203:18;;;15196:30;15262:34;15242:18;;;15235:62;-1:-1:-1;;;15313:18:1;;;15306:40;15363:19;;46499:100:0;14982:406:1;46499:100:0;46854:10;;46843:8;;46831:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;46792:36;:34;:36::i;:::-;:72;46784:113;;;;-1:-1:-1;;;46784:113:0;;15595:2:1;46784:113:0;;;15577:21:1;15634:2;15614:18;;;15607:30;15673;15653:18;;;15646:58;15721:18;;46784:113:0;15393:352:1;46784:113:0;46915:49;:37;1162:19;;1180:1;1162:19;;;1073:127;46915:49;19826:10;47026:36;;;;:22;:36;;;;;:43;;-1:-1:-1;;47026:43:0;47065:4;47026:43;;;46279:802;47136:37;47155:5;;47136:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47162:4:0;;-1:-1:-1;47168:4:0;;-1:-1:-1;47136:18:0;;-1:-1:-1;47136:37:0:i;:::-;47128:63;;;;-1:-1:-1;;;47128:63:0;;15952:2:1;47128:63:0;;;15934:21:1;15991:2;15971:18;;;15964:30;-1:-1:-1;;;16010:18:1;;;16003:43;16063:18;;47128:63:0;15750:337:1;47128:63:0;47255:15;47273:25;:15;1043:14;;951:114;47273:25;47255:43;;47309:27;:15;1162:19;;1180:1;1162:19;;;1073:127;47309:27;47377:32;19826:10;47387:12;19746:98;47377:32;44912:2505;;;44854:2563;;:::o;27451:207::-;27523:7;-1:-1:-1;;;;;27551:19:0;;27543:73;;;;-1:-1:-1;;;27543:73:0;;16294:2:1;27543:73:0;;;16276:21:1;16333:2;16313:18;;;16306:30;16372:34;16352:18;;;16345:62;-1:-1:-1;;;16423:18:1;;;16416:39;16472:19;;27543:73:0;16092:405:1;27543:73:0;-1:-1:-1;;;;;;27634:16:0;;;;;:9;:16;;;;;;;27451:207::o;21928:103::-;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;21993:30:::1;22020:1;21993:18;:30::i;:::-;21928:103::o:0;47476:521::-;47541:16;47528:9;;;;:29;;;;;;;;:::i;:::-;;47520:62;;;;-1:-1:-1;;;47520:62:0;;16704:2:1;47520:62:0;;;16686:21:1;16743:2;16723:18;;;16716:30;-1:-1:-1;;;16762:18:1;;;16755:50;16822:18;;47520:62:0;16502:344:1;47520:62:0;47723:8;;47711:9;;:20;;;;:::i;:::-;47683:15;1043:14;47683:48;47675:95;;;;-1:-1:-1;;;47675:95:0;;17053:2:1;47675:95:0;;;17035:21:1;17092:2;17072:18;;;17065:30;17131:34;17111:18;;;17104:62;-1:-1:-1;;;17182:18:1;;;17175:32;17224:19;;47675:95:0;16851:398:1;47675:95:0;47835:15;47853:25;:15;1043:14;;951:114;47853:25;47835:43;;47889:27;:15;1162:19;;1180:1;1162:19;;;1073:127;47889:27;47957:32;19826:10;47967:12;19746:98;28179:104;28235:13;28268:7;28261:14;;;;;:::i;29765:155::-;29860:52;19826:10;29893:8;29903;29860:18;:52::i;49314:227::-;49357:7;49507:25;:15;1043:14;;951:114;49122:127;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;49206:21:::1;:35:::0;49122:127::o;30816:279::-;30947:41;19826:10;30980:7;30947:18;:41::i;:::-;30939:99;;;;-1:-1:-1;;;30939:99:0;;;;;;;:::i;:::-;31049:38;31063:4;31069:2;31073:7;31082:4;31049:13;:38::i;:::-;30816:279;;;;:::o;44356:298::-;44429:13;44474:25;:15;1043:14;;951:114;44474:25;44463:7;:36;;44455:80;;;;-1:-1:-1;;;44455:80:0;;17456:2:1;44455:80:0;;;17438:21:1;17495:2;17475:18;;;17468:30;17534:33;17514:18;;;17507:61;17585:18;;44455:80:0;17254:355:1;44455:80:0;44579:1;44561:7;44555:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44597:7;44606:25;44623:7;44606:16;:25::i;:::-;44583:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44548:98;44356:298;-1:-1:-1;;44356:298:0:o;49975:272::-;50041:7;50191:47;:37;1043:14;;951:114;29991:164;-1:-1:-1;;;;;30112:25:0;;;30088:4;30112:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29991:164::o;49624:264::-;49686:7;49836:43;:33;1043:14;;951:114;22186:201;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22275:22:0;::::1;22267:73;;;::::0;-1:-1:-1;;;22267:73:0;;18997:2:1;22267:73:0::1;::::0;::::1;18979:21:1::0;19036:2;19016:18;;;19009:30;19075:34;19055:18;;;19048:62;-1:-1:-1;;;19126:18:1;;;19119:36;19172:19;;22267:73:0::1;18795:402:1::0;22267:73:0::1;22351:28;22370:8;22351:18;:28::i;51313:100::-:0;21175:6;;-1:-1:-1;;;;;21175:6:0;19826:10;21497:23;21489:68;;;;-1:-1:-1;;;21489:68:0;;;;;;;:::i;:::-;51386:10:::1;:18:::0;51313:100::o;38516:135::-;32855:4;32453:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32453:16:0;38590:53;;;;-1:-1:-1;;;38590:53:0;;13127:2:1;38590:53:0;;;13109:21:1;13166:2;13146:18;;;13139:30;-1:-1:-1;;;13185:18:1;;;13178:54;13249:18;;38590:53:0;12925:348:1;37829:174:0;37904:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37904:29:0;-1:-1:-1;;;;;37904:29:0;;;;;;;;:24;;37958:23;37904:24;37958:14;:23::i;:::-;-1:-1:-1;;;;;37949:46:0;;;;;;;;;;;37829:174;;:::o;33775:110::-;33851:26;33861:2;33865:7;33851:26;;;;;;;;;;;;:9;:26::i;33085:348::-;33178:4;32453:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32453:16:0;33195:73;;;;-1:-1:-1;;;33195:73:0;;19404:2:1;33195:73:0;;;19386:21:1;19443:2;19423:18;;;19416:30;19482:34;19462:18;;;19455:62;-1:-1:-1;;;19533:18:1;;;19526:42;19585:19;;33195:73:0;19202:408:1;33195:73:0;33279:13;33295:23;33310:7;33295:14;:23::i;:::-;33279:39;;33348:5;-1:-1:-1;;;;;33337:16:0;:7;-1:-1:-1;;;;;33337:16:0;;:52;;;;33357:32;33374:5;33381:7;33357:16;:32::i;:::-;33337:87;;;;33417:7;-1:-1:-1;;;;;33393:31:0;:20;33405:7;33393:11;:20::i;:::-;-1:-1:-1;;;;;33393:31:0;;33337:87;33329:96;33085:348;-1:-1:-1;;;;33085:348:0:o;36925:785::-;37050:4;-1:-1:-1;;;;;37023:31:0;:23;37038:7;37023:14;:23::i;:::-;-1:-1:-1;;;;;37023:31:0;;37015:81;;;;-1:-1:-1;;;37015:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37115:16:0;;37107:65;;;;-1:-1:-1;;;37107:65:0;;20223:2:1;37107:65:0;;;20205:21:1;20262:2;20242:18;;;20235:30;20301:34;20281:18;;;20274:62;-1:-1:-1;;;20352:18:1;;;20345:34;20396:19;;37107:65:0;20021:400:1;37107:65:0;37357:4;-1:-1:-1;;;;;37330:31:0;:23;37345:7;37330:14;:23::i;:::-;-1:-1:-1;;;;;37330:31:0;;37322:81;;;;-1:-1:-1;;;37322:81:0;;;;;;;:::i;:::-;37475:24;;;;:15;:24;;;;;;;;37468:31;;-1:-1:-1;;;;;;37468:31:0;;;-1:-1:-1;;;;;37512:15:0;;;;:9;:15;;;;;:20;;37468:31;;37475:24;37512:20;;37468:31;;37512:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37543:13:0;;;;;;:9;:13;;;;;:18;;37560:1;;37543:13;:18;;37560:1;;37543:18;:::i;:::-;;;;-1:-1:-1;;37582:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37582:21:0;-1:-1:-1;;;;;37582:21:0;;;;;;;;;37621:27;;37582:16;;37621:27;;;;;;;29110:346;29040:416;;:::o;2379:190::-;2504:4;2557;2528:25;2541:5;2548:4;2528:12;:25::i;:::-;:33;;2379:190;-1:-1:-1;;;;2379:190:0:o;22547:275::-;22641:6;;;22658:9;:21;;-1:-1:-1;;;;;;22658:21:0;;;-1:-1:-1;;;;;22641:6:0;;;22658:21;;;;;;22690:17;;;;;;;;;;22742:15;22718:21;:39;22773:41;;22641:6;;22773:41;;22621:17;;22773:41;22610:212;22547:275;:::o;38146:281::-;38267:8;-1:-1:-1;;;;;38258:17:0;:5;-1:-1:-1;;;;;38258:17:0;;38250:55;;;;-1:-1:-1;;;38250:55:0;;20628:2:1;38250:55:0;;;20610:21:1;20667:2;20647:18;;;20640:30;20706:27;20686:18;;;20679:55;20751:18;;38250:55:0;20426:349:1;38250:55:0;-1:-1:-1;;;;;38316:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38316:46:0;;;;;;;;;;38378:41;;540::1;;;38378::0;;513:18:1;38378:41:0;;;;;;;38146:281;;;:::o;31976:270::-;32089:28;32099:4;32105:2;32109:7;32089:9;:28::i;:::-;32136:47;32159:4;32165:2;32169:7;32178:4;32136:22;:47::i;:::-;32128:110;;;;-1:-1:-1;;;32128:110:0;;;;;;;:::i;23138:723::-;23194:13;23415:5;23424:1;23415:10;23411:53;;-1:-1:-1;;23442:10:0;;;;;;;;;;;;-1:-1:-1;;;23442:10:0;;;;;23138:723::o;23411:53::-;23489:5;23474:12;23530:78;23537:9;;23530:78;;23563:8;;;;:::i;:::-;;-1:-1:-1;23586:10:0;;-1:-1:-1;23594:2:0;23586:10;;:::i;:::-;;;23530:78;;;23618:19;23650:6;23640:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23640:17:0;;23618:39;;23668:154;23675:10;;23668:154;;23702:11;23712:1;23702:11;;:::i;:::-;;-1:-1:-1;23771:10:0;23779:2;23771:5;:10;:::i;:::-;23758:24;;:2;:24;:::i;:::-;23745:39;;23728:6;23735;23728:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23728:56:0;;;;;;;;-1:-1:-1;23799:11:0;23808:2;23799:11;;:::i;:::-;;;23668:154;;34112:285;34207:18;34213:2;34217:7;34207:5;:18::i;:::-;34258:53;34289:1;34293:2;34297:7;34306:4;34258:22;:53::i;:::-;34236:153;;;;-1:-1:-1;;;34236:153:0;;;;;;;:::i;2931:701::-;3014:7;3057:4;3014:7;3072:523;3096:5;:12;3092:1;:16;3072:523;;;3130:20;3153:5;3159:1;3153:8;;;;;;;;:::i;:::-;;;;;;;3130:31;;3196:12;3180;:28;3176:408;;3333:44;;;;;;21870:19:1;;;21905:12;;;21898:28;;;21942:12;;3333:44:0;;;;;;;;;;;;3323:55;;;;;;3308:70;;3176:408;;;3523:44;;;;;;21870:19:1;;;21905:12;;;21898:28;;;21942:12;;3523:44:0;;;;;;;;;;;;3513:55;;;;;;3498:70;;3176:408;-1:-1:-1;3110:3:0;;;;:::i;:::-;;;;3072:523;;;-1:-1:-1;3612:12:0;2931:701;-1:-1:-1;;;2931:701:0:o;39215:853::-;39369:4;-1:-1:-1;;;;;39390:13:0;;12059:20;12107:8;39386:675;;39426:71;;-1:-1:-1;;;39426:71:0;;-1:-1:-1;;;;;39426:36:0;;;;;:71;;19826:10;;39477:4;;39483:7;;39492:4;;39426:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39426:71:0;;;;;;;;-1:-1:-1;;39426:71:0;;;;;;;;;;;;:::i;:::-;;;39422:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39667:6;:13;39684:1;39667:18;39663:328;;39710:60;;-1:-1:-1;;;39710:60:0;;;;;;;:::i;39663:328::-;39941:6;39935:13;39926:6;39922:2;39918:15;39911:38;39422:584;-1:-1:-1;;;;;;39548:51:0;-1:-1:-1;;;39548:51:0;;-1:-1:-1;39541:58:0;;39386:675;-1:-1:-1;40045:4:0;39215:853;;;;;;:::o;34733:942::-;-1:-1:-1;;;;;34813:16:0;;34805:61;;;;-1:-1:-1;;;34805:61:0;;22915:2:1;34805:61:0;;;22897:21:1;;;22934:18;;;22927:30;22993:34;22973:18;;;22966:62;23045:18;;34805:61:0;22713:356:1;34805:61:0;32855:4;32453:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32453:16:0;32879:31;34877:58;;;;-1:-1:-1;;;34877:58:0;;23276:2:1;34877:58:0;;;23258:21:1;23315:2;23295:18;;;23288:30;23354;23334:18;;;23327:58;23402:18;;34877:58:0;23074:352:1;34877:58:0;32855:4;32453:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32453:16:0;32879:31;35086:58;;;;-1:-1:-1;;;35086:58:0;;23276:2:1;35086:58:0;;;23258:21:1;23315:2;23295:18;;;23288:30;23354;23334:18;;;23327:58;23402:18;;35086:58:0;23074:352:1;35086:58:0;-1:-1:-1;;;;;35493:13:0;;;;;;:9;:13;;;;;;;;:18;;35510:1;35493:18;;;35535:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35535:21:0;;;;;35574:33;35543:7;;35493:13;;35574:33;;35493:13;;35574:33;44212:20:::1;44136:104:::0;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:367::-;2241:8;2251:6;2305:3;2298:4;2290:6;2286:17;2282:27;2272:55;;2323:1;2320;2313:12;2272:55;-1:-1:-1;2346:20:1;;2389:18;2378:30;;2375:50;;;2421:1;2418;2411:12;2375:50;2458:4;2450:6;2446:17;2434:29;;2518:3;2511:4;2501:6;2498:1;2494:14;2486:6;2482:27;2478:38;2475:47;2472:67;;;2535:1;2532;2525:12;2472:67;2178:367;;;;;:::o;2550:437::-;2636:6;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2753:9;2740:23;2786:18;2778:6;2775:30;2772:50;;;2818:1;2815;2808:12;2772:50;2857:70;2919:7;2910:6;2899:9;2895:22;2857:70;:::i;:::-;2946:8;;2831:96;;-1:-1:-1;2550:437:1;-1:-1:-1;;;;2550:437:1:o;2992:328::-;3069:6;3077;3085;3138:2;3126:9;3117:7;3113:23;3109:32;3106:52;;;3154:1;3151;3144:12;3106:52;3177:29;3196:9;3177:29;:::i;:::-;3167:39;;3225:38;3259:2;3248:9;3244:18;3225:38;:::i;:::-;3215:48;;3310:2;3299:9;3295:18;3282:32;3272:42;;2992:328;;;;;:::o;3874:127::-;3935:10;3930:3;3926:20;3923:1;3916:31;3966:4;3963:1;3956:15;3990:4;3987:1;3980:15;4006:632;4071:5;4101:18;4142:2;4134:6;4131:14;4128:40;;;4148:18;;:::i;:::-;4223:2;4217:9;4191:2;4277:15;;-1:-1:-1;;4273:24:1;;;4299:2;4269:33;4265:42;4253:55;;;4323:18;;;4343:22;;;4320:46;4317:72;;;4369:18;;:::i;:::-;4409:10;4405:2;4398:22;4438:6;4429:15;;4468:6;4460;4453:22;4508:3;4499:6;4494:3;4490:16;4487:25;4484:45;;;4525:1;4522;4515:12;4484:45;4575:6;4570:3;4563:4;4555:6;4551:17;4538:44;4630:1;4623:4;4614:6;4606;4602:19;4598:30;4591:41;;;;4006:632;;;;;:::o;4643:451::-;4712:6;4765:2;4753:9;4744:7;4740:23;4736:32;4733:52;;;4781:1;4778;4771:12;4733:52;4821:9;4808:23;4854:18;4846:6;4843:30;4840:50;;;4886:1;4883;4876:12;4840:50;4909:22;;4962:4;4954:13;;4950:27;-1:-1:-1;4940:55:1;;4991:1;4988;4981:12;4940:55;5014:74;5080:7;5075:2;5062:16;5057:2;5053;5049:11;5014:74;:::i;5541:186::-;5600:6;5653:2;5641:9;5632:7;5628:23;5624:32;5621:52;;;5669:1;5666;5659:12;5621:52;5692:29;5711:9;5692:29;:::i;5732:347::-;5797:6;5805;5858:2;5846:9;5837:7;5833:23;5829:32;5826:52;;;5874:1;5871;5864:12;5826:52;5897:29;5916:9;5897:29;:::i;:::-;5887:39;;5976:2;5965:9;5961:18;5948:32;6023:5;6016:13;6009:21;6002:5;5999:32;5989:60;;6045:1;6042;6035:12;5989:60;6068:5;6058:15;;;5732:347;;;;;:::o;6084:667::-;6179:6;6187;6195;6203;6256:3;6244:9;6235:7;6231:23;6227:33;6224:53;;;6273:1;6270;6263:12;6224:53;6296:29;6315:9;6296:29;:::i;:::-;6286:39;;6344:38;6378:2;6367:9;6363:18;6344:38;:::i;:::-;6334:48;;6429:2;6418:9;6414:18;6401:32;6391:42;;6484:2;6473:9;6469:18;6456:32;6511:18;6503:6;6500:30;6497:50;;;6543:1;6540;6533:12;6497:50;6566:22;;6619:4;6611:13;;6607:27;-1:-1:-1;6597:55:1;;6648:1;6645;6638:12;6597:55;6671:74;6737:7;6732:2;6719:16;6714:2;6710;6706:11;6671:74;:::i;:::-;6661:84;;;6084:667;;;;;;;:::o;6756:127::-;6817:10;6812:3;6808:20;6805:1;6798:31;6848:4;6845:1;6838:15;6872:4;6869:1;6862:15;6888:342;7034:2;7019:18;;7067:1;7056:13;;7046:144;;7112:10;7107:3;7103:20;7100:1;7093:31;7147:4;7144:1;7137:15;7175:4;7172:1;7165:15;7046:144;7199:25;;;6888:342;:::o;7235:260::-;7303:6;7311;7364:2;7352:9;7343:7;7339:23;7335:32;7332:52;;;7380:1;7377;7370:12;7332:52;7403:29;7422:9;7403:29;:::i;:::-;7393:39;;7451:38;7485:2;7474:9;7470:18;7451:38;:::i;:::-;7441:48;;7235:260;;;;;:::o;7500:380::-;7579:1;7575:12;;;;7622;;;7643:61;;7697:4;7689:6;7685:17;7675:27;;7643:61;7750:2;7742:6;7739:14;7719:18;7716:38;7713:161;;7796:10;7791:3;7787:20;7784:1;7777:31;7831:4;7828:1;7821:15;7859:4;7856:1;7849:15;7713:161;;7500:380;;;:::o;8717:356::-;8919:2;8901:21;;;8938:18;;;8931:30;8997:34;8992:2;8977:18;;8970:62;9064:2;9049:18;;8717:356::o;9780:127::-;9841:10;9836:3;9832:20;9829:1;9822:31;9872:4;9869:1;9862:15;9896:4;9893:1;9886:15;9912:127;9973:10;9968:3;9964:20;9961:1;9954:31;10004:4;10001:1;9994:15;10028:4;10025:1;10018:15;10044:128;10111:9;;;10132:11;;;10129:37;;;10146:18;;:::i;10177:409::-;10379:2;10361:21;;;10418:2;10398:18;;;10391:30;10457:34;10452:2;10437:18;;10430:62;-1:-1:-1;;;10523:2:1;10508:18;;10501:43;10576:3;10561:19;;10177:409::o;10591:125::-;10656:9;;;10677:10;;;10674:36;;;10690:18;;:::i;10847:545::-;10949:2;10944:3;10941:11;10938:448;;;10985:1;11010:5;11006:2;10999:17;11055:4;11051:2;11041:19;11125:2;11113:10;11109:19;11106:1;11102:27;11096:4;11092:38;11161:4;11149:10;11146:20;11143:47;;;-1:-1:-1;11184:4:1;11143:47;11239:2;11234:3;11230:12;11227:1;11223:20;11217:4;11213:31;11203:41;;11294:82;11312:2;11305:5;11302:13;11294:82;;;11357:17;;;11338:1;11327:13;11294:82;;;11298:3;;;10847:545;;;:::o;11568:1352::-;11694:3;11688:10;11721:18;11713:6;11710:30;11707:56;;;11743:18;;:::i;:::-;11772:97;11862:6;11822:38;11854:4;11848:11;11822:38;:::i;:::-;11816:4;11772:97;:::i;:::-;11924:4;;11988:2;11977:14;;12005:1;12000:663;;;;12707:1;12724:6;12721:89;;;-1:-1:-1;12776:19:1;;;12770:26;12721:89;-1:-1:-1;;11525:1:1;11521:11;;;11517:24;11513:29;11503:40;11549:1;11545:11;;;11500:57;12823:81;;11970:944;;12000:663;10794:1;10787:14;;;10831:4;10818:18;;-1:-1:-1;;12036:20:1;;;12154:236;12168:7;12165:1;12162:14;12154:236;;;12257:19;;;12251:26;12236:42;;12349:27;;;;12317:1;12305:14;;;;12184:19;;12154:236;;;12158:3;12418:6;12409:7;12406:19;12403:201;;;12479:19;;;12473:26;-1:-1:-1;;12562:1:1;12558:14;;;12574:3;12554:24;12550:37;12546:42;12531:58;12516:74;;12403:201;-1:-1:-1;;;;;12650:1:1;12634:14;;;12630:22;12617:36;;-1:-1:-1;11568:1352:1:o;17614:1176::-;17880:3;17909:1;17942:6;17936:13;17972:36;17998:9;17972:36;:::i;:::-;18027:1;18044:18;;;18071:133;;;;18218:1;18213:356;;;;18037:532;;18071:133;-1:-1:-1;;18104:24:1;;18092:37;;18177:14;;18170:22;18158:35;;18149:45;;;-1:-1:-1;18071:133:1;;18213:356;18244:6;18241:1;18234:17;18274:4;18319:2;18316:1;18306:16;18344:1;18358:165;18372:6;18369:1;18366:13;18358:165;;;18450:14;;18437:11;;;18430:35;18493:16;;;;18387:10;;18358:165;;;18362:3;;;18552:6;18547:3;18543:16;18536:23;;18037:532;;;;;18600:6;18594:13;18616:68;18675:8;18670:3;18663:4;18655:6;18651:17;18616:68;:::i;:::-;-1:-1:-1;;;18706:18:1;;18733:22;;;18782:1;18771:13;;17614:1176;-1:-1:-1;;;;17614:1176:1:o;19615:401::-;19817:2;19799:21;;;19856:2;19836:18;;;19829:30;19895:34;19890:2;19875:18;;19868:62;-1:-1:-1;;;19961:2:1;19946:18;;19939:35;20006:3;19991:19;;19615:401::o;20780:414::-;20982:2;20964:21;;;21021:2;21001:18;;;20994:30;21060:34;21055:2;21040:18;;21033:62;-1:-1:-1;;;21126:2:1;21111:18;;21104:48;21184:3;21169:19;;20780:414::o;21199:135::-;21238:3;21259:17;;;21256:43;;21279:18;;:::i;:::-;-1:-1:-1;21326:1:1;21315:13;;21199:135::o;21339:127::-;21400:10;21395:3;21391:20;21388:1;21381:31;21431:4;21428:1;21421:15;21455:4;21452:1;21445:15;21471:120;21511:1;21537;21527:35;;21542:18;;:::i;:::-;-1:-1:-1;21576:9:1;;21471:120::o;21596:112::-;21628:1;21654;21644:35;;21659:18;;:::i;:::-;-1:-1:-1;21693:9:1;;21596:112::o;21965:489::-;-1:-1:-1;;;;;22234:15:1;;;22216:34;;22286:15;;22281:2;22266:18;;22259:43;22333:2;22318:18;;22311:34;;;22381:3;22376:2;22361:18;;22354:31;;;22159:4;;22402:46;;22428:19;;22420:6;22402:46;:::i;:::-;22394:54;21965:489;-1:-1:-1;;;;;;21965:489:1:o;22459:249::-;22528:6;22581:2;22569:9;22560:7;22556:23;22552:32;22549:52;;;22597:1;22594;22587:12;22549:52;22629:9;22623:16;22648:30;22672:5;22648:30;:::i
Swarm Source
ipfs://e214c98e070f891a8963d9105d7021bdd93757064e0f9ab6768ea6c8940d9c7d
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.