ERC-721
Overview
Max Total Supply
10,000 TEMPUS
Holders
1,348
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TEMPUSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
tempus
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-20 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/tempus.sol pragma solidity ^0.8.4; contract tempus is ERC721A, Ownable { uint256 public maxMintAmount = 4; uint256 public nftPerAddressLimit = 40; uint256 MAX_SUPPLY = 10000; uint256 public mintRate = 0.05 ether; bool public paused = true; bool public revealed = false; string public baseURI; //ipfs://[FILL THIS OUT WITH CID]/ , don't forget trailing / string public hiddenURI; constructor(string memory _initBaseURI, string memory _initHiddenURI) ERC721A("Tempus", "TEMPUS") { setBaseURI(_initBaseURI); setHiddenURI(_initHiddenURI); } //override startTokenID to start at 1 instead of 0 function _startTokenId() internal view virtual override returns (uint256) { return 1; } function mint(uint256 quantity) external payable { // _safeMint's second argument now takes in a quantity, not a tokenId. require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough NFTs left"); if (msg.sender != owner()) { require(!paused, "the contract is paused"); require(quantity <= maxMintAmount, "Exceeded the mint limit for this session"); require(_numberMinted(msg.sender) + quantity <= nftPerAddressLimit, "max NFT per address exceeded"); require(msg.value >= (mintRate * quantity), "Not enough ether sent"); } _safeMint(msg.sender, quantity); } //AMOUNT MEASURED IN WEI function withdraw(uint256 amount) external payable onlyOwner { (bool success, ) = payable(owner()).call{value: amount}(""); require(success); } function _baseURI() internal view override returns (string memory) { return baseURI; } function setMintRate(uint256 _mintRate) public onlyOwner { mintRate = _mintRate; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function toggleReveal(bool _revealed) public onlyOwner { revealed = _revealed; } function setNftPerAddressLimit(uint256 _limit) public onlyOwner { nftPerAddressLimit = _limit; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setHiddenURI(string memory _hiddenURI) public onlyOwner { hiddenURI = _hiddenURI; } function pause(bool _state) public onlyOwner { paused = _state; } function tokenURI(uint256 tokenId) public view override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); if (revealed == false) { return hiddenURI; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length != 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), ".json")) : ""; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return _ownershipOf(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initHiddenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenURI","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintRate","type":"uint256"}],"name":"setMintRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":"bool","name":"_revealed","type":"bool"}],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405260046009556028600a55612710600b5566b1a2bc2ec50000600c556001600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503480156200006257600080fd5b50604051620043cd380380620043cd83398181016040528101906200008891906200050d565b6040518060400160405280600681526020017f54656d70757300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f54454d505553000000000000000000000000000000000000000000000000000081525081600290805190602001906200010c929190620003df565b50806003908051906020019062000125929190620003df565b50620001366200018860201b60201c565b60008190555050506200015e620001526200019160201b60201c565b6200019960201b60201c565b6200016f826200025f60201b60201c565b62000180816200030a60201b60201c565b505062000799565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200026f6200019160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000295620003b560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e590620005b9565b60405180910390fd5b80600e908051906020019062000306929190620003df565b5050565b6200031a6200019160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000340620003b560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000399576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039090620005b9565b60405180910390fd5b80600f9080519060200190620003b1929190620003df565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ed9062000681565b90600052602060002090601f0160209004810192826200041157600085556200045d565b82601f106200042c57805160ff19168380011785556200045d565b828001600101855582156200045d579182015b828111156200045c5782518255916020019190600101906200043f565b5b5090506200046c919062000470565b5090565b5b808211156200048b57600081600090555060010162000471565b5090565b6000620004a6620004a08462000604565b620005db565b905082815260208101848484011115620004c557620004c462000750565b5b620004d28482856200064b565b509392505050565b600082601f830112620004f257620004f16200074b565b5b8151620005048482602086016200048f565b91505092915050565b600080604083850312156200052757620005266200075a565b5b600083015167ffffffffffffffff81111562000548576200054762000755565b5b6200055685828601620004da565b925050602083015167ffffffffffffffff8111156200057a576200057962000755565b5b6200058885828601620004da565b9150509250929050565b6000620005a16020836200063a565b9150620005ae8262000770565b602082019050919050565b60006020820190508181036000830152620005d48162000592565b9050919050565b6000620005e7620005fa565b9050620005f58282620006b7565b919050565b6000604051905090565b600067ffffffffffffffff8211156200062257620006216200071c565b5b6200062d826200075f565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200066b5780820151818401526020810190506200064e565b838111156200067b576000848401525b50505050565b600060028204905060018216806200069a57607f821691505b60208210811415620006b157620006b0620006ed565b5b50919050565b620006c2826200075f565b810181811067ffffffffffffffff82111715620006e457620006e36200071c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613c2480620007a96000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063ba7d2c76116100a0578063d0eb26b01161006f578063d0eb26b014610739578063dbe2193f14610762578063dc33e6811461078b578063e985e9c5146107c8578063f2fde38b1461080557610204565b8063ba7d2c761461067d578063bbaac02f146106a8578063c87b56dd146106d1578063ca0dcf161461070e57610204565b80639231ab2a116100e75780639231ab2a146105a757806395d89b41146105e4578063a0712d681461060f578063a22cb4651461062b578063b88d4fde1461065457610204565b8063715018a6146105115780637f00c7a6146105285780638cc54e7f146105515780638da5cb5b1461057c57610204565b80632e1a7d4d1161019b57806355f804b31161016a57806355f804b3146104185780635c975abb146104415780636352211e1461046c5780636c0360eb146104a957806370a08231146104d457610204565b80632e1a7d4d1461037f57806342842e0e1461039b5780634c100321146103c457806351830227146103ed57610204565b8063095ea7b3116101d7578063095ea7b3146102d757806318160ddd14610300578063239c70ae1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613012565b61082e565b60405161023d9190613407565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612fe5565b610910565b005b34801561027b57600080fd5b506102846109a9565b6040516102919190613422565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906130b5565b610a3b565b6040516102ce91906133a0565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190612fa5565b610ab7565b005b34801561030c57600080fd5b50610315610bbc565b604051610322919061353f565b60405180910390f35b34801561033757600080fd5b50610340610bd3565b60405161034d919061353f565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612e8f565b610bd9565b005b610399600480360381019061039491906130b5565b610be9565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190612e8f565b610ce6565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190612fe5565b610d06565b005b3480156103f957600080fd5b50610402610d9f565b60405161040f9190613407565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061306c565b610db2565b005b34801561044d57600080fd5b50610456610e48565b6040516104639190613407565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e91906130b5565b610e5b565b6040516104a091906133a0565b60405180910390f35b3480156104b557600080fd5b506104be610e71565b6040516104cb9190613422565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612e22565b610eff565b604051610508919061353f565b60405180910390f35b34801561051d57600080fd5b50610526610fcf565b005b34801561053457600080fd5b5061054f600480360381019061054a91906130b5565b611057565b005b34801561055d57600080fd5b506105666110dd565b6040516105739190613422565b60405180910390f35b34801561058857600080fd5b5061059161116b565b60405161059e91906133a0565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c991906130b5565b611195565b6040516105db9190613524565b60405180910390f35b3480156105f057600080fd5b506105f96111ad565b6040516106069190613422565b60405180910390f35b610629600480360381019061062491906130b5565b61123f565b005b34801561063757600080fd5b50610652600480360381019061064d9190612f65565b61141b565b005b34801561066057600080fd5b5061067b60048036038101906106769190612ee2565b611593565b005b34801561068957600080fd5b5061069261160b565b60405161069f919061353f565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca919061306c565b611611565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906130b5565b6116a7565b6040516107059190613422565b60405180910390f35b34801561071a57600080fd5b506107236117f5565b604051610730919061353f565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b91906130b5565b6117fb565b005b34801561076e57600080fd5b50610789600480360381019061078491906130b5565b611881565b005b34801561079757600080fd5b506107b260048036038101906107ad9190612e22565b611907565b6040516107bf919061353f565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190612e4f565b611919565b6040516107fc9190613407565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190612e22565b6119ad565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610909575061090882611aa5565b5b9050919050565b610918611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661093661116b565b73ffffffffffffffffffffffffffffffffffffffff161461098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390613484565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6060600280546109b89061380e565b80601f01602080910402602001604051908101604052809291908181526020018280546109e49061380e565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b5050505050905090565b6000610a4682611b17565b610a7c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac282610e5b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b49611b0f565b73ffffffffffffffffffffffffffffffffffffffff1614610bac57610b7581610b70611b0f565b611919565b610bab576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610bb7838383611b65565b505050565b6000610bc6611c17565b6001546000540303905090565b60095481565b610be4838383611c20565b505050565b610bf1611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610c0f61116b565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613484565b60405180910390fd5b6000610c6f61116b565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c929061338b565b60006040518083038185875af1925050503d8060008114610ccf576040519150601f19603f3d011682016040523d82523d6000602084013e610cd4565b606091505b5050905080610ce257600080fd5b5050565b610d0183838360405180602001604052806000815250611593565b505050565b610d0e611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610d2c61116b565b73ffffffffffffffffffffffffffffffffffffffff1614610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613484565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b600d60019054906101000a900460ff1681565b610dba611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610dd861116b565b73ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613484565b60405180910390fd5b80600e9080519060200190610e44929190612bf3565b5050565b600d60009054906101000a900460ff1681565b6000610e66826120d6565b600001519050919050565b600e8054610e7e9061380e565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa9061380e565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f67576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fd7611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610ff561116b565b73ffffffffffffffffffffffffffffffffffffffff161461104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613484565b60405180910390fd5b6110556000612361565b565b61105f611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661107d61116b565b73ffffffffffffffffffffffffffffffffffffffff16146110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90613484565b60405180910390fd5b8060098190555050565b600f80546110ea9061380e565b80601f01602080910402602001604051908101604052809291908181526020018280546111169061380e565b80156111635780601f1061113857610100808354040283529160200191611163565b820191906000526020600020905b81548152906001019060200180831161114657829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119d612c79565b6111a6826120d6565b9050919050565b6060600380546111bc9061380e565b80601f01602080910402602001604051908101604052809291908181526020018280546111e89061380e565b80156112355780601f1061120a57610100808354040283529160200191611235565b820191906000526020600020905b81548152906001019060200180831161121857829003601f168201915b5050505050905090565b600b548161124b610bbc565b611255919061362f565b1115611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906134e4565b60405180910390fd5b61129e61116b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461140e57600d60009054906101000a900460ff1615611320576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611317906134a4565b60405180910390fd5b600954811115611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c906134c4565b60405180910390fd5b600a548161137233612427565b61137c919061362f565b11156113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490613464565b60405180910390fd5b80600c546113cb91906136b6565b34101561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613504565b60405180910390fd5b5b6114183382612491565b50565b611423611b0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611488576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611495611b0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611542611b0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115879190613407565b60405180910390a35050565b61159e848484611c20565b6115bd8373ffffffffffffffffffffffffffffffffffffffff166124af565b15611605576115ce848484846124d2565b611604576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a5481565b611619611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661163761116b565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613484565b60405180910390fd5b80600f90805190602001906116a3929190612bf3565b5050565b60606116b282611b17565b6116e8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600d60019054906101000a900460ff161515141561179657600f80546117119061380e565b80601f016020809104026020016040519081016040528092919081815260200182805461173d9061380e565b801561178a5780601f1061175f5761010080835404028352916020019161178a565b820191906000526020600020905b81548152906001019060200180831161176d57829003601f168201915b505050505090506117f0565b60006117a0612632565b90506000815114156117c157604051806020016040528060008152506117ec565b806117cb846126c4565b6040516020016117dc92919061335c565b6040516020818303038152906040525b9150505b919050565b600c5481565b611803611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661182161116b565b73ffffffffffffffffffffffffffffffffffffffff1614611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e90613484565b60405180910390fd5b80600a8190555050565b611889611b0f565b73ffffffffffffffffffffffffffffffffffffffff166118a761116b565b73ffffffffffffffffffffffffffffffffffffffff16146118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490613484565b60405180910390fd5b80600c8190555050565b600061191282612427565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119b5611b0f565b73ffffffffffffffffffffffffffffffffffffffff166119d361116b565b73ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2090613484565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9090613444565b60405180910390fd5b611aa281612361565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611b22611c17565b11158015611b31575060005482105b8015611b5e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c2b826120d6565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c96576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611cb7611b0f565b73ffffffffffffffffffffffffffffffffffffffff161480611ce65750611ce585611ce0611b0f565b611919565b5b80611d2b5750611cf4611b0f565b73ffffffffffffffffffffffffffffffffffffffff16611d1384610a3b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd88585856001612825565b611de460008487611b65565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561206457600054821461206357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120cf858585600161282b565b5050505050565b6120de612c79565b6000829050806120ec611c17565b1161232a57600054811015612329576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161232757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461220b57809250505061235c565b5b60011561232657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461232157809250505061235c565b61220c565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6124ab828260405180602001604052806000815250612831565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f8611b0f565b8786866040518563ffffffff1660e01b815260040161251a94939291906133bb565b602060405180830381600087803b15801561253457600080fd5b505af192505050801561256557506040513d601f19601f82011682018060405250810190612562919061303f565b60015b6125df573d8060008114612595576040519150601f19603f3d011682016040523d82523d6000602084013e61259a565b606091505b506000815114156125d7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e80546126419061380e565b80601f016020809104026020016040519081016040528092919081815260200182805461266d9061380e565b80156126ba5780601f1061268f576101008083540402835291602001916126ba565b820191906000526020600020905b81548152906001019060200180831161269d57829003601f168201915b5050505050905090565b6060600082141561270c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612820565b600082905060005b6000821461273e57808061272790613871565b915050600a826127379190613685565b9150612714565b60008167ffffffffffffffff81111561275a576127596139a7565b5b6040519080825280601f01601f19166020018201604052801561278c5781602001600182028036833780820191505090505b5090505b60008514612819576001826127a59190613710565b9150600a856127b491906138ba565b60306127c0919061362f565b60f81b8183815181106127d6576127d5613978565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128129190613685565b9450612790565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561289e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156128d9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128e66000858386612825565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612aa78673ffffffffffffffffffffffffffffffffffffffff166124af565b15612b6c575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b1c60008784806001019550876124d2565b612b52576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612aad578260005414612b6757600080fd5b612bd7565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612b6d575b816000819055505050612bed600085838661282b565b50505050565b828054612bff9061380e565b90600052602060002090601f016020900481019282612c215760008555612c68565b82601f10612c3a57805160ff1916838001178555612c68565b82800160010185558215612c68579182015b82811115612c67578251825591602001919060010190612c4c565b5b509050612c759190612cbc565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612cd5576000816000905550600101612cbd565b5090565b6000612cec612ce78461357f565b61355a565b905082815260208101848484011115612d0857612d076139db565b5b612d138482856137cc565b509392505050565b6000612d2e612d29846135b0565b61355a565b905082815260208101848484011115612d4a57612d496139db565b5b612d558482856137cc565b509392505050565b600081359050612d6c81613b92565b92915050565b600081359050612d8181613ba9565b92915050565b600081359050612d9681613bc0565b92915050565b600081519050612dab81613bc0565b92915050565b600082601f830112612dc657612dc56139d6565b5b8135612dd6848260208601612cd9565b91505092915050565b600082601f830112612df457612df36139d6565b5b8135612e04848260208601612d1b565b91505092915050565b600081359050612e1c81613bd7565b92915050565b600060208284031215612e3857612e376139e5565b5b6000612e4684828501612d5d565b91505092915050565b60008060408385031215612e6657612e656139e5565b5b6000612e7485828601612d5d565b9250506020612e8585828601612d5d565b9150509250929050565b600080600060608486031215612ea857612ea76139e5565b5b6000612eb686828701612d5d565b9350506020612ec786828701612d5d565b9250506040612ed886828701612e0d565b9150509250925092565b60008060008060808587031215612efc57612efb6139e5565b5b6000612f0a87828801612d5d565b9450506020612f1b87828801612d5d565b9350506040612f2c87828801612e0d565b925050606085013567ffffffffffffffff811115612f4d57612f4c6139e0565b5b612f5987828801612db1565b91505092959194509250565b60008060408385031215612f7c57612f7b6139e5565b5b6000612f8a85828601612d5d565b9250506020612f9b85828601612d72565b9150509250929050565b60008060408385031215612fbc57612fbb6139e5565b5b6000612fca85828601612d5d565b9250506020612fdb85828601612e0d565b9150509250929050565b600060208284031215612ffb57612ffa6139e5565b5b600061300984828501612d72565b91505092915050565b600060208284031215613028576130276139e5565b5b600061303684828501612d87565b91505092915050565b600060208284031215613055576130546139e5565b5b600061306384828501612d9c565b91505092915050565b600060208284031215613082576130816139e5565b5b600082013567ffffffffffffffff8111156130a05761309f6139e0565b5b6130ac84828501612ddf565b91505092915050565b6000602082840312156130cb576130ca6139e5565b5b60006130d984828501612e0d565b91505092915050565b6130eb81613744565b82525050565b6130fa81613744565b82525050565b61310981613756565b82525050565b61311881613756565b82525050565b6000613129826135e1565b61313381856135f7565b93506131438185602086016137db565b61314c816139ea565b840191505092915050565b6000613162826135ec565b61316c8185613613565b935061317c8185602086016137db565b613185816139ea565b840191505092915050565b600061319b826135ec565b6131a58185613624565b93506131b58185602086016137db565b80840191505092915050565b60006131ce602683613613565b91506131d9826139fb565b604082019050919050565b60006131f1601c83613613565b91506131fc82613a4a565b602082019050919050565b6000613214600583613624565b915061321f82613a73565b600582019050919050565b6000613237602083613613565b915061324282613a9c565b602082019050919050565b600061325a601683613613565b915061326582613ac5565b602082019050919050565b600061327d602883613613565b915061328882613aee565b604082019050919050565b60006132a0601483613613565b91506132ab82613b3d565b602082019050919050565b60006132c3600083613608565b91506132ce82613b66565b600082019050919050565b60006132e6601583613613565b91506132f182613b69565b602082019050919050565b60608201600082015161331260008501826130e2565b506020820151613325602085018261334d565b5060408201516133386040850182613100565b50505050565b613347816137ae565b82525050565b613356816137b8565b82525050565b60006133688285613190565b91506133748284613190565b915061337f82613207565b91508190509392505050565b6000613396826132b6565b9150819050919050565b60006020820190506133b560008301846130f1565b92915050565b60006080820190506133d060008301876130f1565b6133dd60208301866130f1565b6133ea604083018561333e565b81810360608301526133fc818461311e565b905095945050505050565b600060208201905061341c600083018461310f565b92915050565b6000602082019050818103600083015261343c8184613157565b905092915050565b6000602082019050818103600083015261345d816131c1565b9050919050565b6000602082019050818103600083015261347d816131e4565b9050919050565b6000602082019050818103600083015261349d8161322a565b9050919050565b600060208201905081810360008301526134bd8161324d565b9050919050565b600060208201905081810360008301526134dd81613270565b9050919050565b600060208201905081810360008301526134fd81613293565b9050919050565b6000602082019050818103600083015261351d816132d9565b9050919050565b600060608201905061353960008301846132fc565b92915050565b6000602082019050613554600083018461333e565b92915050565b6000613564613575565b90506135708282613840565b919050565b6000604051905090565b600067ffffffffffffffff82111561359a576135996139a7565b5b6135a3826139ea565b9050602081019050919050565b600067ffffffffffffffff8211156135cb576135ca6139a7565b5b6135d4826139ea565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061363a826137ae565b9150613645836137ae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561367a576136796138eb565b5b828201905092915050565b6000613690826137ae565b915061369b836137ae565b9250826136ab576136aa61391a565b5b828204905092915050565b60006136c1826137ae565b91506136cc836137ae565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613705576137046138eb565b5b828202905092915050565b600061371b826137ae565b9150613726836137ae565b925082821015613739576137386138eb565b5b828203905092915050565b600061374f8261378e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156137f95780820151818401526020810190506137de565b83811115613808576000848401525b50505050565b6000600282049050600182168061382657607f821691505b6020821081141561383a57613839613949565b5b50919050565b613849826139ea565b810181811067ffffffffffffffff82111715613868576138676139a7565b5b80604052505050565b600061387c826137ae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138af576138ae6138eb565b5b600182019050919050565b60006138c5826137ae565b91506138d0836137ae565b9250826138e0576138df61391a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f457863656564656420746865206d696e74206c696d697420666f72207468697360008201527f2073657373696f6e000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c656674000000000000000000000000600082015250565b50565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b613b9b81613744565b8114613ba657600080fd5b50565b613bb281613756565b8114613bbd57600080fd5b50565b613bc981613762565b8114613bd457600080fd5b50565b613be0816137ae565b8114613beb57600080fd5b5056fea264697066735822122006905971c8e0cbd2be9bdf0446e3326e46947207c91b36b66e7d260b05d109fb64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d50434d726d61546d4743536d314e5547477967343257563533664d61707255717a6170346f5a6639636239392f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5272584c7676476a573550384c4b42714a67614e7235634d627848534d4d466a6b69483945523234666a57780000000000000000000000
Deployed Bytecode
0x6080604052600436106102045760003560e01c8063715018a611610118578063ba7d2c76116100a0578063d0eb26b01161006f578063d0eb26b014610739578063dbe2193f14610762578063dc33e6811461078b578063e985e9c5146107c8578063f2fde38b1461080557610204565b8063ba7d2c761461067d578063bbaac02f146106a8578063c87b56dd146106d1578063ca0dcf161461070e57610204565b80639231ab2a116100e75780639231ab2a146105a757806395d89b41146105e4578063a0712d681461060f578063a22cb4651461062b578063b88d4fde1461065457610204565b8063715018a6146105115780637f00c7a6146105285780638cc54e7f146105515780638da5cb5b1461057c57610204565b80632e1a7d4d1161019b57806355f804b31161016a57806355f804b3146104185780635c975abb146104415780636352211e1461046c5780636c0360eb146104a957806370a08231146104d457610204565b80632e1a7d4d1461037f57806342842e0e1461039b5780634c100321146103c457806351830227146103ed57610204565b8063095ea7b3116101d7578063095ea7b3146102d757806318160ddd14610300578063239c70ae1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613012565b61082e565b60405161023d9190613407565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612fe5565b610910565b005b34801561027b57600080fd5b506102846109a9565b6040516102919190613422565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906130b5565b610a3b565b6040516102ce91906133a0565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190612fa5565b610ab7565b005b34801561030c57600080fd5b50610315610bbc565b604051610322919061353f565b60405180910390f35b34801561033757600080fd5b50610340610bd3565b60405161034d919061353f565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612e8f565b610bd9565b005b610399600480360381019061039491906130b5565b610be9565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190612e8f565b610ce6565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190612fe5565b610d06565b005b3480156103f957600080fd5b50610402610d9f565b60405161040f9190613407565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061306c565b610db2565b005b34801561044d57600080fd5b50610456610e48565b6040516104639190613407565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e91906130b5565b610e5b565b6040516104a091906133a0565b60405180910390f35b3480156104b557600080fd5b506104be610e71565b6040516104cb9190613422565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612e22565b610eff565b604051610508919061353f565b60405180910390f35b34801561051d57600080fd5b50610526610fcf565b005b34801561053457600080fd5b5061054f600480360381019061054a91906130b5565b611057565b005b34801561055d57600080fd5b506105666110dd565b6040516105739190613422565b60405180910390f35b34801561058857600080fd5b5061059161116b565b60405161059e91906133a0565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c991906130b5565b611195565b6040516105db9190613524565b60405180910390f35b3480156105f057600080fd5b506105f96111ad565b6040516106069190613422565b60405180910390f35b610629600480360381019061062491906130b5565b61123f565b005b34801561063757600080fd5b50610652600480360381019061064d9190612f65565b61141b565b005b34801561066057600080fd5b5061067b60048036038101906106769190612ee2565b611593565b005b34801561068957600080fd5b5061069261160b565b60405161069f919061353f565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca919061306c565b611611565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906130b5565b6116a7565b6040516107059190613422565b60405180910390f35b34801561071a57600080fd5b506107236117f5565b604051610730919061353f565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b91906130b5565b6117fb565b005b34801561076e57600080fd5b50610789600480360381019061078491906130b5565b611881565b005b34801561079757600080fd5b506107b260048036038101906107ad9190612e22565b611907565b6040516107bf919061353f565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190612e4f565b611919565b6040516107fc9190613407565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190612e22565b6119ad565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610909575061090882611aa5565b5b9050919050565b610918611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661093661116b565b73ffffffffffffffffffffffffffffffffffffffff161461098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390613484565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6060600280546109b89061380e565b80601f01602080910402602001604051908101604052809291908181526020018280546109e49061380e565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b5050505050905090565b6000610a4682611b17565b610a7c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac282610e5b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b49611b0f565b73ffffffffffffffffffffffffffffffffffffffff1614610bac57610b7581610b70611b0f565b611919565b610bab576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610bb7838383611b65565b505050565b6000610bc6611c17565b6001546000540303905090565b60095481565b610be4838383611c20565b505050565b610bf1611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610c0f61116b565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613484565b60405180910390fd5b6000610c6f61116b565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c929061338b565b60006040518083038185875af1925050503d8060008114610ccf576040519150601f19603f3d011682016040523d82523d6000602084013e610cd4565b606091505b5050905080610ce257600080fd5b5050565b610d0183838360405180602001604052806000815250611593565b505050565b610d0e611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610d2c61116b565b73ffffffffffffffffffffffffffffffffffffffff1614610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613484565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b600d60019054906101000a900460ff1681565b610dba611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610dd861116b565b73ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613484565b60405180910390fd5b80600e9080519060200190610e44929190612bf3565b5050565b600d60009054906101000a900460ff1681565b6000610e66826120d6565b600001519050919050565b600e8054610e7e9061380e565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa9061380e565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f67576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fd7611b0f565b73ffffffffffffffffffffffffffffffffffffffff16610ff561116b565b73ffffffffffffffffffffffffffffffffffffffff161461104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613484565b60405180910390fd5b6110556000612361565b565b61105f611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661107d61116b565b73ffffffffffffffffffffffffffffffffffffffff16146110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90613484565b60405180910390fd5b8060098190555050565b600f80546110ea9061380e565b80601f01602080910402602001604051908101604052809291908181526020018280546111169061380e565b80156111635780601f1061113857610100808354040283529160200191611163565b820191906000526020600020905b81548152906001019060200180831161114657829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119d612c79565b6111a6826120d6565b9050919050565b6060600380546111bc9061380e565b80601f01602080910402602001604051908101604052809291908181526020018280546111e89061380e565b80156112355780601f1061120a57610100808354040283529160200191611235565b820191906000526020600020905b81548152906001019060200180831161121857829003601f168201915b5050505050905090565b600b548161124b610bbc565b611255919061362f565b1115611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906134e4565b60405180910390fd5b61129e61116b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461140e57600d60009054906101000a900460ff1615611320576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611317906134a4565b60405180910390fd5b600954811115611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c906134c4565b60405180910390fd5b600a548161137233612427565b61137c919061362f565b11156113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490613464565b60405180910390fd5b80600c546113cb91906136b6565b34101561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613504565b60405180910390fd5b5b6114183382612491565b50565b611423611b0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611488576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611495611b0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611542611b0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115879190613407565b60405180910390a35050565b61159e848484611c20565b6115bd8373ffffffffffffffffffffffffffffffffffffffff166124af565b15611605576115ce848484846124d2565b611604576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a5481565b611619611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661163761116b565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613484565b60405180910390fd5b80600f90805190602001906116a3929190612bf3565b5050565b60606116b282611b17565b6116e8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600d60019054906101000a900460ff161515141561179657600f80546117119061380e565b80601f016020809104026020016040519081016040528092919081815260200182805461173d9061380e565b801561178a5780601f1061175f5761010080835404028352916020019161178a565b820191906000526020600020905b81548152906001019060200180831161176d57829003601f168201915b505050505090506117f0565b60006117a0612632565b90506000815114156117c157604051806020016040528060008152506117ec565b806117cb846126c4565b6040516020016117dc92919061335c565b6040516020818303038152906040525b9150505b919050565b600c5481565b611803611b0f565b73ffffffffffffffffffffffffffffffffffffffff1661182161116b565b73ffffffffffffffffffffffffffffffffffffffff1614611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e90613484565b60405180910390fd5b80600a8190555050565b611889611b0f565b73ffffffffffffffffffffffffffffffffffffffff166118a761116b565b73ffffffffffffffffffffffffffffffffffffffff16146118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490613484565b60405180910390fd5b80600c8190555050565b600061191282612427565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119b5611b0f565b73ffffffffffffffffffffffffffffffffffffffff166119d361116b565b73ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2090613484565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9090613444565b60405180910390fd5b611aa281612361565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611b22611c17565b11158015611b31575060005482105b8015611b5e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c2b826120d6565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c96576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611cb7611b0f565b73ffffffffffffffffffffffffffffffffffffffff161480611ce65750611ce585611ce0611b0f565b611919565b5b80611d2b5750611cf4611b0f565b73ffffffffffffffffffffffffffffffffffffffff16611d1384610a3b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd88585856001612825565b611de460008487611b65565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561206457600054821461206357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120cf858585600161282b565b5050505050565b6120de612c79565b6000829050806120ec611c17565b1161232a57600054811015612329576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161232757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461220b57809250505061235c565b5b60011561232657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461232157809250505061235c565b61220c565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6124ab828260405180602001604052806000815250612831565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f8611b0f565b8786866040518563ffffffff1660e01b815260040161251a94939291906133bb565b602060405180830381600087803b15801561253457600080fd5b505af192505050801561256557506040513d601f19601f82011682018060405250810190612562919061303f565b60015b6125df573d8060008114612595576040519150601f19603f3d011682016040523d82523d6000602084013e61259a565b606091505b506000815114156125d7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e80546126419061380e565b80601f016020809104026020016040519081016040528092919081815260200182805461266d9061380e565b80156126ba5780601f1061268f576101008083540402835291602001916126ba565b820191906000526020600020905b81548152906001019060200180831161269d57829003601f168201915b5050505050905090565b6060600082141561270c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612820565b600082905060005b6000821461273e57808061272790613871565b915050600a826127379190613685565b9150612714565b60008167ffffffffffffffff81111561275a576127596139a7565b5b6040519080825280601f01601f19166020018201604052801561278c5781602001600182028036833780820191505090505b5090505b60008514612819576001826127a59190613710565b9150600a856127b491906138ba565b60306127c0919061362f565b60f81b8183815181106127d6576127d5613978565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128129190613685565b9450612790565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561289e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156128d9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128e66000858386612825565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612aa78673ffffffffffffffffffffffffffffffffffffffff166124af565b15612b6c575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b1c60008784806001019550876124d2565b612b52576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612aad578260005414612b6757600080fd5b612bd7565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612b6d575b816000819055505050612bed600085838661282b565b50505050565b828054612bff9061380e565b90600052602060002090601f016020900481019282612c215760008555612c68565b82601f10612c3a57805160ff1916838001178555612c68565b82800160010185558215612c68579182015b82811115612c67578251825591602001919060010190612c4c565b5b509050612c759190612cbc565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612cd5576000816000905550600101612cbd565b5090565b6000612cec612ce78461357f565b61355a565b905082815260208101848484011115612d0857612d076139db565b5b612d138482856137cc565b509392505050565b6000612d2e612d29846135b0565b61355a565b905082815260208101848484011115612d4a57612d496139db565b5b612d558482856137cc565b509392505050565b600081359050612d6c81613b92565b92915050565b600081359050612d8181613ba9565b92915050565b600081359050612d9681613bc0565b92915050565b600081519050612dab81613bc0565b92915050565b600082601f830112612dc657612dc56139d6565b5b8135612dd6848260208601612cd9565b91505092915050565b600082601f830112612df457612df36139d6565b5b8135612e04848260208601612d1b565b91505092915050565b600081359050612e1c81613bd7565b92915050565b600060208284031215612e3857612e376139e5565b5b6000612e4684828501612d5d565b91505092915050565b60008060408385031215612e6657612e656139e5565b5b6000612e7485828601612d5d565b9250506020612e8585828601612d5d565b9150509250929050565b600080600060608486031215612ea857612ea76139e5565b5b6000612eb686828701612d5d565b9350506020612ec786828701612d5d565b9250506040612ed886828701612e0d565b9150509250925092565b60008060008060808587031215612efc57612efb6139e5565b5b6000612f0a87828801612d5d565b9450506020612f1b87828801612d5d565b9350506040612f2c87828801612e0d565b925050606085013567ffffffffffffffff811115612f4d57612f4c6139e0565b5b612f5987828801612db1565b91505092959194509250565b60008060408385031215612f7c57612f7b6139e5565b5b6000612f8a85828601612d5d565b9250506020612f9b85828601612d72565b9150509250929050565b60008060408385031215612fbc57612fbb6139e5565b5b6000612fca85828601612d5d565b9250506020612fdb85828601612e0d565b9150509250929050565b600060208284031215612ffb57612ffa6139e5565b5b600061300984828501612d72565b91505092915050565b600060208284031215613028576130276139e5565b5b600061303684828501612d87565b91505092915050565b600060208284031215613055576130546139e5565b5b600061306384828501612d9c565b91505092915050565b600060208284031215613082576130816139e5565b5b600082013567ffffffffffffffff8111156130a05761309f6139e0565b5b6130ac84828501612ddf565b91505092915050565b6000602082840312156130cb576130ca6139e5565b5b60006130d984828501612e0d565b91505092915050565b6130eb81613744565b82525050565b6130fa81613744565b82525050565b61310981613756565b82525050565b61311881613756565b82525050565b6000613129826135e1565b61313381856135f7565b93506131438185602086016137db565b61314c816139ea565b840191505092915050565b6000613162826135ec565b61316c8185613613565b935061317c8185602086016137db565b613185816139ea565b840191505092915050565b600061319b826135ec565b6131a58185613624565b93506131b58185602086016137db565b80840191505092915050565b60006131ce602683613613565b91506131d9826139fb565b604082019050919050565b60006131f1601c83613613565b91506131fc82613a4a565b602082019050919050565b6000613214600583613624565b915061321f82613a73565b600582019050919050565b6000613237602083613613565b915061324282613a9c565b602082019050919050565b600061325a601683613613565b915061326582613ac5565b602082019050919050565b600061327d602883613613565b915061328882613aee565b604082019050919050565b60006132a0601483613613565b91506132ab82613b3d565b602082019050919050565b60006132c3600083613608565b91506132ce82613b66565b600082019050919050565b60006132e6601583613613565b91506132f182613b69565b602082019050919050565b60608201600082015161331260008501826130e2565b506020820151613325602085018261334d565b5060408201516133386040850182613100565b50505050565b613347816137ae565b82525050565b613356816137b8565b82525050565b60006133688285613190565b91506133748284613190565b915061337f82613207565b91508190509392505050565b6000613396826132b6565b9150819050919050565b60006020820190506133b560008301846130f1565b92915050565b60006080820190506133d060008301876130f1565b6133dd60208301866130f1565b6133ea604083018561333e565b81810360608301526133fc818461311e565b905095945050505050565b600060208201905061341c600083018461310f565b92915050565b6000602082019050818103600083015261343c8184613157565b905092915050565b6000602082019050818103600083015261345d816131c1565b9050919050565b6000602082019050818103600083015261347d816131e4565b9050919050565b6000602082019050818103600083015261349d8161322a565b9050919050565b600060208201905081810360008301526134bd8161324d565b9050919050565b600060208201905081810360008301526134dd81613270565b9050919050565b600060208201905081810360008301526134fd81613293565b9050919050565b6000602082019050818103600083015261351d816132d9565b9050919050565b600060608201905061353960008301846132fc565b92915050565b6000602082019050613554600083018461333e565b92915050565b6000613564613575565b90506135708282613840565b919050565b6000604051905090565b600067ffffffffffffffff82111561359a576135996139a7565b5b6135a3826139ea565b9050602081019050919050565b600067ffffffffffffffff8211156135cb576135ca6139a7565b5b6135d4826139ea565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061363a826137ae565b9150613645836137ae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561367a576136796138eb565b5b828201905092915050565b6000613690826137ae565b915061369b836137ae565b9250826136ab576136aa61391a565b5b828204905092915050565b60006136c1826137ae565b91506136cc836137ae565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613705576137046138eb565b5b828202905092915050565b600061371b826137ae565b9150613726836137ae565b925082821015613739576137386138eb565b5b828203905092915050565b600061374f8261378e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156137f95780820151818401526020810190506137de565b83811115613808576000848401525b50505050565b6000600282049050600182168061382657607f821691505b6020821081141561383a57613839613949565b5b50919050565b613849826139ea565b810181811067ffffffffffffffff82111715613868576138676139a7565b5b80604052505050565b600061387c826137ae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138af576138ae6138eb565b5b600182019050919050565b60006138c5826137ae565b91506138d0836137ae565b9250826138e0576138df61391a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f457863656564656420746865206d696e74206c696d697420666f72207468697360008201527f2073657373696f6e000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c656674000000000000000000000000600082015250565b50565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b613b9b81613744565b8114613ba657600080fd5b50565b613bb281613756565b8114613bbd57600080fd5b50565b613bc981613762565b8114613bd457600080fd5b50565b613be0816137ae565b8114613beb57600080fd5b5056fea264697066735822122006905971c8e0cbd2be9bdf0446e3326e46947207c91b36b66e7d260b05d109fb64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d50434d726d61546d4743536d314e5547477967343257563533664d61707255717a6170346f5a6639636239392f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5272584c7676476a573550384c4b42714a67614e7235634d627848534d4d466a6b69483945523234666a57780000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmPCMrmaTmGCSm1NUGGyg42WV53fMaprUqzap4oZf9cb99/
Arg [1] : _initHiddenURI (string): ipfs://QmRrXLvvGjW5P8LKBqJgaNr5cMbxHSMMFjkiH9ER24fjWx
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d50434d726d61546d4743536d314e554747796734325756
Arg [4] : 3533664d61707255717a6170346f5a6639636239392f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [6] : 697066733a2f2f516d5272584c7676476a573550384c4b42714a67614e723563
Arg [7] : 4d627848534d4d466a6b69483945523234666a57780000000000000000000000
Deployed Bytecode Sourcemap
47458:3189:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28578:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49867:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31693:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33197:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32759:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27818:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47501:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34062:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48905:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34303:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49421:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47694:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49641:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47661:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31501:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47732:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28947:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4763:103;;;;;;;;;;;;;:::i;:::-;;49291:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47821:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4112:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50508:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31862:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48206:661;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33473:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34559:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47540:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49753:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49954:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47618:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49521:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49187:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50387:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33831:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5021:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28578:305;28680:4;28732:25;28717:40;;;:11;:40;;;;:105;;;;28789:33;28774:48;;;:11;:48;;;;28717:105;:158;;;;28839:36;28863:11;28839:23;:36::i;:::-;28717:158;28697:178;;28578:305;;;:::o;49867:79::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49932:6:::1;49923;;:15;;;;;;;;;;;;;;;;;;49867:79:::0;:::o;31693:100::-;31747:13;31780:5;31773:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31693:100;:::o;33197:204::-;33265:7;33290:16;33298:7;33290;:16::i;:::-;33285:64;;33315:34;;;;;;;;;;;;;;33285:64;33369:15;:24;33385:7;33369:24;;;;;;;;;;;;;;;;;;;;;33362:31;;33197:204;;;:::o;32759:372::-;32832:13;32848:24;32864:7;32848:15;:24::i;:::-;32832:40;;32893:5;32887:11;;:2;:11;;;32883:48;;;32907:24;;;;;;;;;;;;;;32883:48;32964:5;32948:21;;:12;:10;:12::i;:::-;:21;;;32944:139;;32975:37;32992:5;32999:12;:10;:12::i;:::-;32975:16;:37::i;:::-;32971:112;;33036:35;;;;;;;;;;;;;;32971:112;32944:139;33095:28;33104:2;33108:7;33117:5;33095:8;:28::i;:::-;32821:310;32759:372;;:::o;27818:312::-;27871:7;28096:15;:13;:15::i;:::-;28081:12;;28065:13;;:28;:46;28058:53;;27818:312;:::o;47501:32::-;;;;:::o;34062:170::-;34196:28;34206:4;34212:2;34216:7;34196:9;:28::i;:::-;34062:170;;;:::o;48905:166::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48978:12:::1;49004:7;:5;:7::i;:::-;48996:21;;49025:6;48996:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48977:59;;;49055:7;49047:16;;;::::0;::::1;;48966:105;48905:166:::0;:::o;34303:185::-;34441:39;34458:4;34464:2;34468:7;34441:39;;;;;;;;;;;;:16;:39::i;:::-;34303:185;;;:::o;49421:92::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49496:9:::1;49485:8;;:20;;;;;;;;;;;;;;;;;;49421:92:::0;:::o;47694:28::-;;;;;;;;;;;;;:::o;49641:104::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49726:11:::1;49716:7;:21;;;;;;;;;;;;:::i;:::-;;49641:104:::0;:::o;47661:25::-;;;;;;;;;;;;;:::o;31501:125::-;31565:7;31592:21;31605:7;31592:12;:21::i;:::-;:26;;;31585:33;;31501:125;;;:::o;47732:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28947:206::-;29011:7;29052:1;29035:19;;:5;:19;;;29031:60;;;29063:28;;;;;;;;;;;;;;29031:60;29117:12;:19;29130:5;29117:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29109:36;;29102:43;;28947:206;;;:::o;4763:103::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4828:30:::1;4855:1;4828:18;:30::i;:::-;4763:103::o:0;49291:122::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49388:17:::1;49372:13;:33;;;;49291:122:::0;:::o;47821:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4112:87::-;4158:7;4185:6;;;;;;;;;;;4178:13;;4112:87;:::o;50508:136::-;50574:21;;:::i;:::-;50615;50628:7;50615:12;:21::i;:::-;50608:28;;50508:136;;;:::o;31862:104::-;31918:13;31951:7;31944:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31862:104;:::o;48206:661::-;48382:10;;48370:8;48354:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;48346:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48448:7;:5;:7::i;:::-;48434:21;;:10;:21;;;48430:386;;48481:6;;;;;;;;;;;48480:7;48472:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;48549:13;;48537:8;:25;;48529:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48670:18;;48658:8;48630:25;48644:10;48630:13;:25::i;:::-;:36;;;;:::i;:::-;:58;;48622:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48769:8;48758;;:19;;;;:::i;:::-;48744:9;:34;;48736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48430:386;48828:31;48838:10;48850:8;48828:9;:31::i;:::-;48206:661;:::o;33473:287::-;33584:12;:10;:12::i;:::-;33572:24;;:8;:24;;;33568:54;;;33605:17;;;;;;;;;;;;;;33568:54;33680:8;33635:18;:32;33654:12;:10;:12::i;:::-;33635:32;;;;;;;;;;;;;;;:42;33668:8;33635:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33733:8;33704:48;;33719:12;:10;:12::i;:::-;33704:48;;;33743:8;33704:48;;;;;;:::i;:::-;;;;;;;;33473:287;;:::o;34559:370::-;34726:28;34736:4;34742:2;34746:7;34726:9;:28::i;:::-;34769:15;:2;:13;;;:15::i;:::-;34765:157;;;34790:56;34821:4;34827:2;34831:7;34840:5;34790:30;:56::i;:::-;34786:136;;34870:40;;;;;;;;;;;;;;34786:136;34765:157;34559:370;;;;:::o;47540:38::-;;;;:::o;49753:106::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49841:10:::1;49829:9;:22;;;;;;;;;;;;:::i;:::-;;49753:106:::0;:::o;49954:425::-;50019:13;50050:16;50058:7;50050;:16::i;:::-;50045:59;;50075:29;;;;;;;;;;;;;;50045:59;50133:5;50121:17;;:8;;;;;;;;;;;:17;;;50117:66;;;50162:9;50155:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50117:66;50195:28;50226:10;:8;:10::i;:::-;50195:41;;50286:1;50260:14;50254:28;:33;;:117;;;;;;;;;;;;;;;;;50314:14;50330:25;50347:7;50330:16;:25::i;:::-;50297:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50254:117;50247:124;;;49954:425;;;;:::o;47618:36::-;;;;:::o;49521:110::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49617:6:::1;49596:18;:27;;;;49521:110:::0;:::o;49187:96::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49266:9:::1;49255:8;:20;;;;49187:96:::0;:::o;50387:113::-;50445:7;50472:20;50486:5;50472:13;:20::i;:::-;50465:27;;50387:113;;;:::o;33831:164::-;33928:4;33952:18;:25;33971:5;33952:25;;;;;;;;;;;;;;;:35;33978:8;33952:35;;;;;;;;;;;;;;;;;;;;;;;;;33945:42;;33831:164;;;;:::o;5021:201::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5130:1:::1;5110:22;;:8;:22;;;;5102:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5186:28;5205:8;5186:18;:28::i;:::-;5021:201:::0;:::o;16919:157::-;17004:4;17043:25;17028:40;;;:11;:40;;;;17021:47;;16919:157;;;:::o;2836:98::-;2889:7;2916:10;2909:17;;2836:98;:::o;35184:174::-;35241:4;35284:7;35265:15;:13;:15::i;:::-;:26;;:53;;;;;35305:13;;35295:7;:23;35265:53;:85;;;;;35323:11;:20;35335:7;35323:20;;;;;;;;;;;:27;;;;;;;;;;;;35322:28;35265:85;35258:92;;35184:174;;;:::o;44406:196::-;44548:2;44521:15;:24;44537:7;44521:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44586:7;44582:2;44566:28;;44575:5;44566:28;;;;;;;;;;;;44406:196;;;:::o;48097:101::-;48162:7;48189:1;48182:8;;48097:101;:::o;39354:2130::-;39469:35;39507:21;39520:7;39507:12;:21::i;:::-;39469:59;;39567:4;39545:26;;:13;:18;;;:26;;;39541:67;;39580:28;;;;;;;;;;;;;;39541:67;39621:22;39663:4;39647:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39684:36;39701:4;39707:12;:10;:12::i;:::-;39684:16;:36::i;:::-;39647:73;:126;;;;39761:12;:10;:12::i;:::-;39737:36;;:20;39749:7;39737:11;:20::i;:::-;:36;;;39647:126;39621:153;;39792:17;39787:66;;39818:35;;;;;;;;;;;;;;39787:66;39882:1;39868:16;;:2;:16;;;39864:52;;;39893:23;;;;;;;;;;;;;;39864:52;39929:43;39951:4;39957:2;39961:7;39970:1;39929:21;:43::i;:::-;40037:35;40054:1;40058:7;40067:4;40037:8;:35::i;:::-;40398:1;40368:12;:18;40381:4;40368:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40442:1;40414:12;:16;40427:2;40414:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40460:31;40494:11;:20;40506:7;40494:20;;;;;;;;;;;40460:54;;40545:2;40529:8;:13;;;:18;;;;;;;;;;;;;;;;;;40595:15;40562:8;:23;;;:49;;;;;;;;;;;;;;;;;;40863:19;40895:1;40885:7;:11;40863:33;;40911:31;40945:11;:24;40957:11;40945:24;;;;;;;;;;;40911:58;;41013:1;40988:27;;:8;:13;;;;;;;;;;;;:27;;;40984:384;;;41198:13;;41183:11;:28;41179:174;;41252:4;41236:8;:13;;;:20;;;;;;;;;;;;;;;;;;41305:13;:28;;;41279:8;:23;;;:54;;;;;;;;;;;;;;;;;;41179:174;40984:384;40343:1036;;;41415:7;41411:2;41396:27;;41405:4;41396:27;;;;;;;;;;;;41434:42;41455:4;41461:2;41465:7;41474:1;41434:20;:42::i;:::-;39458:2026;;39354:2130;;;:::o;30328:1111::-;30390:21;;:::i;:::-;30424:12;30439:7;30424:22;;30507:4;30488:15;:13;:15::i;:::-;:23;30484:888;;30524:13;;30517:4;:20;30513:859;;;30558:31;30592:11;:17;30604:4;30592:17;;;;;;;;;;;30558:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30633:9;:16;;;30628:729;;30704:1;30678:28;;:9;:14;;;:28;;;30674:101;;30742:9;30735:16;;;;;;30674:101;31077:261;31084:4;31077:261;;;31117:6;;;;;;;;31162:11;:17;31174:4;31162:17;;;;;;;;;;;31150:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31236:1;31210:28;;:9;:14;;;:28;;;31206:109;;31278:9;31271:16;;;;;;31206:109;31077:261;;;30628:729;30539:833;30513:859;30484:888;31400:31;;;;;;;;;;;;;;30328:1111;;;;:::o;5382:191::-;5456:16;5475:6;;;;;;;;;;;5456:25;;5501:8;5492:6;;:17;;;;;;;;;;;;;;;;;;5556:8;5525:40;;5546:8;5525:40;;;;;;;;;;;;5445:128;5382:191;:::o;29235:137::-;29296:7;29331:12;:19;29344:5;29331:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;29323:41;;29316:48;;29235:137;;;:::o;35442:104::-;35511:27;35521:2;35525:8;35511:27;;;;;;;;;;;;:9;:27::i;:::-;35442:104;;:::o;6813:326::-;6873:4;7130:1;7108:7;:19;;;:23;7101:30;;6813:326;;;:::o;45094:667::-;45257:4;45294:2;45278:36;;;45315:12;:10;:12::i;:::-;45329:4;45335:7;45344:5;45278:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45274:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45529:1;45512:6;:13;:18;45508:235;;;45558:40;;;;;;;;;;;;;;45508:235;45701:6;45695:13;45686:6;45682:2;45678:15;45671:38;45274:480;45407:45;;;45397:55;;;:6;:55;;;;45390:62;;;45094:667;;;;;;:::o;49079:100::-;49131:13;49164:7;49157:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49079:100;:::o;398:723::-;454:13;684:1;675:5;:10;671:53;;;702:10;;;;;;;;;;;;;;;;;;;;;671:53;734:12;749:5;734:20;;765:14;790:78;805:1;797:4;:9;790:78;;823:8;;;;;:::i;:::-;;;;854:2;846:10;;;;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:39;;928:154;944:1;935:5;:10;928:154;;972:1;962:11;;;;;:::i;:::-;;;1039:2;1031:5;:10;;;;:::i;:::-;1018:2;:24;;;;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1068:2;1059:11;;;;;:::i;:::-;;;928:154;;;1106:6;1092:21;;;;;398:723;;;;:::o;46409:159::-;;;;;:::o;47227:158::-;;;;;:::o;35919:1749::-;36042:20;36065:13;;36042:36;;36107:1;36093:16;;:2;:16;;;36089:48;;;36118:19;;;;;;;;;;;;;;36089:48;36164:1;36152:8;:13;36148:44;;;36174:18;;;;;;;;;;;;;;36148:44;36205:61;36235:1;36239:2;36243:12;36257:8;36205:21;:61::i;:::-;36578:8;36543:12;:16;36556:2;36543:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36642:8;36602:12;:16;36615:2;36602:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36701:2;36668:11;:25;36680:12;36668:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36768:15;36718:11;:25;36730:12;36718:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36801:20;36824:12;36801:35;;36851:11;36880:8;36865:12;:23;36851:37;;36909:15;:2;:13;;;:15::i;:::-;36905:631;;;36945:313;37001:12;36997:2;36976:38;;36993:1;36976:38;;;;;;;;;;;;37042:69;37081:1;37085:2;37089:14;;;;;;37105:5;37042:30;:69::i;:::-;37037:174;;37147:40;;;;;;;;;;;;;;37037:174;37253:3;37238:12;:18;36945:313;;37339:12;37322:13;;:29;37318:43;;37353:8;;;37318:43;36905:631;;;37402:119;37458:14;;;;;;37454:2;37433:40;;37450:1;37433:40;;;;;;;;;;;;37516:3;37501:12;:18;37402:119;;36905:631;37566:12;37550:13;:28;;;;36518:1072;;37600:60;37629:1;37633:2;37637:12;37651:8;37600:20;:60::i;:::-;36031:1637;35919:1749;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:108::-;7564:24;7582:5;7564:24;:::i;:::-;7559:3;7552:37;7487:108;;:::o;7601:118::-;7688:24;7706:5;7688:24;:::i;:::-;7683:3;7676:37;7601:118;;:::o;7725:99::-;7796:21;7811:5;7796:21;:::i;:::-;7791:3;7784:34;7725:99;;:::o;7830:109::-;7911:21;7926:5;7911:21;:::i;:::-;7906:3;7899:34;7830:109;;:::o;7945:360::-;8031:3;8059:38;8091:5;8059:38;:::i;:::-;8113:70;8176:6;8171:3;8113:70;:::i;:::-;8106:77;;8192:52;8237:6;8232:3;8225:4;8218:5;8214:16;8192:52;:::i;:::-;8269:29;8291:6;8269:29;:::i;:::-;8264:3;8260:39;8253:46;;8035:270;7945:360;;;;:::o;8311:364::-;8399:3;8427:39;8460:5;8427:39;:::i;:::-;8482:71;8546:6;8541:3;8482:71;:::i;:::-;8475:78;;8562:52;8607:6;8602:3;8595:4;8588:5;8584:16;8562:52;:::i;:::-;8639:29;8661:6;8639:29;:::i;:::-;8634:3;8630:39;8623:46;;8403:272;8311:364;;;;:::o;8681:377::-;8787:3;8815:39;8848:5;8815:39;:::i;:::-;8870:89;8952:6;8947:3;8870:89;:::i;:::-;8863:96;;8968:52;9013:6;9008:3;9001:4;8994:5;8990:16;8968:52;:::i;:::-;9045:6;9040:3;9036:16;9029:23;;8791:267;8681:377;;;;:::o;9064:366::-;9206:3;9227:67;9291:2;9286:3;9227:67;:::i;:::-;9220:74;;9303:93;9392:3;9303:93;:::i;:::-;9421:2;9416:3;9412:12;9405:19;;9064:366;;;:::o;9436:::-;9578:3;9599:67;9663:2;9658:3;9599:67;:::i;:::-;9592:74;;9675:93;9764:3;9675:93;:::i;:::-;9793:2;9788:3;9784:12;9777:19;;9436:366;;;:::o;9808:400::-;9968:3;9989:84;10071:1;10066:3;9989:84;:::i;:::-;9982:91;;10082:93;10171:3;10082:93;:::i;:::-;10200:1;10195:3;10191:11;10184:18;;9808:400;;;:::o;10214:366::-;10356:3;10377:67;10441:2;10436:3;10377:67;:::i;:::-;10370:74;;10453:93;10542:3;10453:93;:::i;:::-;10571:2;10566:3;10562:12;10555:19;;10214:366;;;:::o;10586:::-;10728:3;10749:67;10813:2;10808:3;10749:67;:::i;:::-;10742:74;;10825:93;10914:3;10825:93;:::i;:::-;10943:2;10938:3;10934:12;10927:19;;10586:366;;;:::o;10958:::-;11100:3;11121:67;11185:2;11180:3;11121:67;:::i;:::-;11114:74;;11197:93;11286:3;11197:93;:::i;:::-;11315:2;11310:3;11306:12;11299:19;;10958:366;;;:::o;11330:::-;11472:3;11493:67;11557:2;11552:3;11493:67;:::i;:::-;11486:74;;11569:93;11658:3;11569:93;:::i;:::-;11687:2;11682:3;11678:12;11671:19;;11330:366;;;:::o;11702:398::-;11861:3;11882:83;11963:1;11958:3;11882:83;:::i;:::-;11875:90;;11974:93;12063:3;11974:93;:::i;:::-;12092:1;12087:3;12083:11;12076:18;;11702:398;;;:::o;12106:366::-;12248:3;12269:67;12333:2;12328:3;12269:67;:::i;:::-;12262:74;;12345:93;12434:3;12345:93;:::i;:::-;12463:2;12458:3;12454:12;12447:19;;12106:366;;;:::o;12550:697::-;12709:4;12704:3;12700:14;12796:4;12789:5;12785:16;12779:23;12815:63;12872:4;12867:3;12863:14;12849:12;12815:63;:::i;:::-;12724:164;12980:4;12973:5;12969:16;12963:23;12999:61;13054:4;13049:3;13045:14;13031:12;12999:61;:::i;:::-;12898:172;13154:4;13147:5;13143:16;13137:23;13173:57;13224:4;13219:3;13215:14;13201:12;13173:57;:::i;:::-;13080:160;12678:569;12550:697;;:::o;13253:118::-;13340:24;13358:5;13340:24;:::i;:::-;13335:3;13328:37;13253:118;;:::o;13377:105::-;13452:23;13469:5;13452:23;:::i;:::-;13447:3;13440:36;13377:105;;:::o;13488:701::-;13769:3;13791:95;13882:3;13873:6;13791:95;:::i;:::-;13784:102;;13903:95;13994:3;13985:6;13903:95;:::i;:::-;13896:102;;14015:148;14159:3;14015:148;:::i;:::-;14008:155;;14180:3;14173:10;;13488:701;;;;;:::o;14195:379::-;14379:3;14401:147;14544:3;14401:147;:::i;:::-;14394:154;;14565:3;14558:10;;14195:379;;;:::o;14580:222::-;14673:4;14711:2;14700:9;14696:18;14688:26;;14724:71;14792:1;14781:9;14777:17;14768:6;14724:71;:::i;:::-;14580:222;;;;:::o;14808:640::-;15003:4;15041:3;15030:9;15026:19;15018:27;;15055:71;15123:1;15112:9;15108:17;15099:6;15055:71;:::i;:::-;15136:72;15204:2;15193:9;15189:18;15180:6;15136:72;:::i;:::-;15218;15286:2;15275:9;15271:18;15262:6;15218:72;:::i;:::-;15337:9;15331:4;15327:20;15322:2;15311:9;15307:18;15300:48;15365:76;15436:4;15427:6;15365:76;:::i;:::-;15357:84;;14808:640;;;;;;;:::o;15454:210::-;15541:4;15579:2;15568:9;15564:18;15556:26;;15592:65;15654:1;15643:9;15639:17;15630:6;15592:65;:::i;:::-;15454:210;;;;:::o;15670:313::-;15783:4;15821:2;15810:9;15806:18;15798:26;;15870:9;15864:4;15860:20;15856:1;15845:9;15841:17;15834:47;15898:78;15971:4;15962:6;15898:78;:::i;:::-;15890:86;;15670:313;;;;:::o;15989:419::-;16155:4;16193:2;16182:9;16178:18;16170:26;;16242:9;16236:4;16232:20;16228:1;16217:9;16213:17;16206:47;16270:131;16396:4;16270:131;:::i;:::-;16262:139;;15989:419;;;:::o;16414:::-;16580:4;16618:2;16607:9;16603:18;16595:26;;16667:9;16661:4;16657:20;16653:1;16642:9;16638:17;16631:47;16695:131;16821:4;16695:131;:::i;:::-;16687:139;;16414:419;;;:::o;16839:::-;17005:4;17043:2;17032:9;17028:18;17020:26;;17092:9;17086:4;17082:20;17078:1;17067:9;17063:17;17056:47;17120:131;17246:4;17120:131;:::i;:::-;17112:139;;16839:419;;;:::o;17264:::-;17430:4;17468:2;17457:9;17453:18;17445:26;;17517:9;17511:4;17507:20;17503:1;17492:9;17488:17;17481:47;17545:131;17671:4;17545:131;:::i;:::-;17537:139;;17264:419;;;:::o;17689:::-;17855:4;17893:2;17882:9;17878:18;17870:26;;17942:9;17936:4;17932:20;17928:1;17917:9;17913:17;17906:47;17970:131;18096:4;17970:131;:::i;:::-;17962:139;;17689:419;;;:::o;18114:::-;18280:4;18318:2;18307:9;18303:18;18295:26;;18367:9;18361:4;18357:20;18353:1;18342:9;18338:17;18331:47;18395:131;18521:4;18395:131;:::i;:::-;18387:139;;18114:419;;;:::o;18539:::-;18705:4;18743:2;18732:9;18728:18;18720:26;;18792:9;18786:4;18782:20;18778:1;18767:9;18763:17;18756:47;18820:131;18946:4;18820:131;:::i;:::-;18812:139;;18539:419;;;:::o;18964:346::-;19119:4;19157:2;19146:9;19142:18;19134:26;;19170:133;19300:1;19289:9;19285:17;19276:6;19170:133;:::i;:::-;18964:346;;;;:::o;19316:222::-;19409:4;19447:2;19436:9;19432:18;19424:26;;19460:71;19528:1;19517:9;19513:17;19504:6;19460:71;:::i;:::-;19316:222;;;;:::o;19544:129::-;19578:6;19605:20;;:::i;:::-;19595:30;;19634:33;19662:4;19654:6;19634:33;:::i;:::-;19544:129;;;:::o;19679:75::-;19712:6;19745:2;19739:9;19729:19;;19679:75;:::o;19760:307::-;19821:4;19911:18;19903:6;19900:30;19897:56;;;19933:18;;:::i;:::-;19897:56;19971:29;19993:6;19971:29;:::i;:::-;19963:37;;20055:4;20049;20045:15;20037:23;;19760:307;;;:::o;20073:308::-;20135:4;20225:18;20217:6;20214:30;20211:56;;;20247:18;;:::i;:::-;20211:56;20285:29;20307:6;20285:29;:::i;:::-;20277:37;;20369:4;20363;20359:15;20351:23;;20073:308;;;:::o;20387:98::-;20438:6;20472:5;20466:12;20456:22;;20387:98;;;:::o;20491:99::-;20543:6;20577:5;20571:12;20561:22;;20491:99;;;:::o;20596:168::-;20679:11;20713:6;20708:3;20701:19;20753:4;20748:3;20744:14;20729:29;;20596:168;;;;:::o;20770:147::-;20871:11;20908:3;20893:18;;20770:147;;;;:::o;20923:169::-;21007:11;21041:6;21036:3;21029:19;21081:4;21076:3;21072:14;21057:29;;20923:169;;;;:::o;21098:148::-;21200:11;21237:3;21222:18;;21098:148;;;;:::o;21252:305::-;21292:3;21311:20;21329:1;21311:20;:::i;:::-;21306:25;;21345:20;21363:1;21345:20;:::i;:::-;21340:25;;21499:1;21431:66;21427:74;21424:1;21421:81;21418:107;;;21505:18;;:::i;:::-;21418:107;21549:1;21546;21542:9;21535:16;;21252:305;;;;:::o;21563:185::-;21603:1;21620:20;21638:1;21620:20;:::i;:::-;21615:25;;21654:20;21672:1;21654:20;:::i;:::-;21649:25;;21693:1;21683:35;;21698:18;;:::i;:::-;21683:35;21740:1;21737;21733:9;21728:14;;21563:185;;;;:::o;21754:348::-;21794:7;21817:20;21835:1;21817:20;:::i;:::-;21812:25;;21851:20;21869:1;21851:20;:::i;:::-;21846:25;;22039:1;21971:66;21967:74;21964:1;21961:81;21956:1;21949:9;21942:17;21938:105;21935:131;;;22046:18;;:::i;:::-;21935:131;22094:1;22091;22087:9;22076:20;;21754:348;;;;:::o;22108:191::-;22148:4;22168:20;22186:1;22168:20;:::i;:::-;22163:25;;22202:20;22220:1;22202:20;:::i;:::-;22197:25;;22241:1;22238;22235:8;22232:34;;;22246:18;;:::i;:::-;22232:34;22291:1;22288;22284:9;22276:17;;22108:191;;;;:::o;22305:96::-;22342:7;22371:24;22389:5;22371:24;:::i;:::-;22360:35;;22305:96;;;:::o;22407:90::-;22441:7;22484:5;22477:13;22470:21;22459:32;;22407:90;;;:::o;22503:149::-;22539:7;22579:66;22572:5;22568:78;22557:89;;22503:149;;;:::o;22658:126::-;22695:7;22735:42;22728:5;22724:54;22713:65;;22658:126;;;:::o;22790:77::-;22827:7;22856:5;22845:16;;22790:77;;;:::o;22873:101::-;22909:7;22949:18;22942:5;22938:30;22927:41;;22873:101;;;:::o;22980:154::-;23064:6;23059:3;23054;23041:30;23126:1;23117:6;23112:3;23108:16;23101:27;22980:154;;;:::o;23140:307::-;23208:1;23218:113;23232:6;23229:1;23226:13;23218:113;;;23317:1;23312:3;23308:11;23302:18;23298:1;23293:3;23289:11;23282:39;23254:2;23251:1;23247:10;23242:15;;23218:113;;;23349:6;23346:1;23343:13;23340:101;;;23429:1;23420:6;23415:3;23411:16;23404:27;23340:101;23189:258;23140:307;;;:::o;23453:320::-;23497:6;23534:1;23528:4;23524:12;23514:22;;23581:1;23575:4;23571:12;23602:18;23592:81;;23658:4;23650:6;23646:17;23636:27;;23592:81;23720:2;23712:6;23709:14;23689:18;23686:38;23683:84;;;23739:18;;:::i;:::-;23683:84;23504:269;23453:320;;;:::o;23779:281::-;23862:27;23884:4;23862:27;:::i;:::-;23854:6;23850:40;23992:6;23980:10;23977:22;23956:18;23944:10;23941:34;23938:62;23935:88;;;24003:18;;:::i;:::-;23935:88;24043:10;24039:2;24032:22;23822:238;23779:281;;:::o;24066:233::-;24105:3;24128:24;24146:5;24128:24;:::i;:::-;24119:33;;24174:66;24167:5;24164:77;24161:103;;;24244:18;;:::i;:::-;24161:103;24291:1;24284:5;24280:13;24273:20;;24066:233;;;:::o;24305:176::-;24337:1;24354:20;24372:1;24354:20;:::i;:::-;24349:25;;24388:20;24406:1;24388:20;:::i;:::-;24383:25;;24427:1;24417:35;;24432:18;;:::i;:::-;24417:35;24473:1;24470;24466:9;24461:14;;24305:176;;;;:::o;24487:180::-;24535:77;24532:1;24525:88;24632:4;24629:1;24622:15;24656:4;24653:1;24646:15;24673:180;24721:77;24718:1;24711:88;24818:4;24815:1;24808:15;24842:4;24839:1;24832:15;24859:180;24907:77;24904:1;24897:88;25004:4;25001:1;24994:15;25028:4;25025:1;25018:15;25045:180;25093:77;25090:1;25083:88;25190:4;25187:1;25180:15;25214:4;25211:1;25204:15;25231:180;25279:77;25276:1;25269:88;25376:4;25373:1;25366:15;25400:4;25397:1;25390:15;25417:117;25526:1;25523;25516:12;25540:117;25649:1;25646;25639:12;25663:117;25772:1;25769;25762:12;25786:117;25895:1;25892;25885:12;25909:102;25950:6;26001:2;25997:7;25992:2;25985:5;25981:14;25977:28;25967:38;;25909:102;;;:::o;26017:225::-;26157:34;26153:1;26145:6;26141:14;26134:58;26226:8;26221:2;26213:6;26209:15;26202:33;26017:225;:::o;26248:178::-;26388:30;26384:1;26376:6;26372:14;26365:54;26248:178;:::o;26432:155::-;26572:7;26568:1;26560:6;26556:14;26549:31;26432:155;:::o;26593:182::-;26733:34;26729:1;26721:6;26717:14;26710:58;26593:182;:::o;26781:172::-;26921:24;26917:1;26909:6;26905:14;26898:48;26781:172;:::o;26959:227::-;27099:34;27095:1;27087:6;27083:14;27076:58;27168:10;27163:2;27155:6;27151:15;27144:35;26959:227;:::o;27192:170::-;27332:22;27328:1;27320:6;27316:14;27309:46;27192:170;:::o;27368:114::-;;:::o;27488:171::-;27628:23;27624:1;27616:6;27612:14;27605:47;27488:171;:::o;27665:122::-;27738:24;27756:5;27738:24;:::i;:::-;27731:5;27728:35;27718:63;;27777:1;27774;27767:12;27718:63;27665:122;:::o;27793:116::-;27863:21;27878:5;27863:21;:::i;:::-;27856:5;27853:32;27843:60;;27899:1;27896;27889:12;27843:60;27793:116;:::o;27915:120::-;27987:23;28004:5;27987:23;:::i;:::-;27980:5;27977:34;27967:62;;28025:1;28022;28015:12;27967:62;27915:120;:::o;28041:122::-;28114:24;28132:5;28114:24;:::i;:::-;28107:5;28104:35;28094:63;;28153:1;28150;28143:12;28094:63;28041:122;:::o
Swarm Source
ipfs://06905971c8e0cbd2be9bdf0446e3326e46947207c91b36b66e7d260b05d109fb
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.