ERC-721
Overview
Max Total Supply
699 ybSMOL
Holders
106
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 ybSMOLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SMOLNft
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-15 */ // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); (bool success, ) = recipient.call{ value: amount }(''); require( success, 'Address: unable to send value, recipient may have reverted' ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, 'Address: low-level call with value failed' ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, 'Address: insufficient balance for call' ); require(isContract(target), 'Address: call to non-contract'); (bool success, bytes memory returndata) = target.call{ value: value }(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, 'Address: low-level static call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), 'Address: static call to non-contract'); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, 'Address: low-level delegate call failed' ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), 'Address: delegate call to non-contract'); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return '0'; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return '0x00'; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = '0'; buffer[1] = 'x'; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, 'Strings: hex length insufficient'); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), 'ERC721: balance query for the zero address'); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), 'ERC721: owner query for nonexistent token'); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), 'ERC721Metadata: URI query for nonexistent token' ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, 'ERC721: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721: approve caller is not owner nor approved for all' ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), 'ERC721: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), 'ERC721: transfer caller is not owner nor approved' ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), 'ERC721: transfer caller is not owner nor approved' ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721: transfer to non ERC721Receiver implementer' ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), 'ERC721: operator query for nonexistent token'); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ''); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), 'ERC721: transfer to non ERC721Receiver implementer' ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), 'ERC721: mint to the zero address'); require(!_exists(tokenId), 'ERC721: token already minted'); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, 'ERC721: transfer from incorrect owner' ); require(to != address(0), 'ERC721: transfer to the zero address'); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, 'ERC721: approve to caller'); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), 'ERC721Burnable: caller is not owner nor approved' ); _burn(tokenId); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), 'ERC721Enumerable: owner index out of bounds' ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), 'ERC721Enumerable: global index out of bounds' ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), 'Pausable: paused'); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), 'Pausable: not paused'); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), 'ERC721Pausable: token transfer while paused'); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), 'Ownable: new owner is the zero address'); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, 'Counter: decrement overflow'); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File contracts/interfaces/ISmoltingInu.sol pragma solidity ^0.8.9; /** * @dev SmoltingInu token interface */ interface ISmoltingInu is IERC20 { function gameMint(address _user, uint256 _amount) external; function gameBurn(address _user, uint256 _amount) external; function addPlayThrough( address _user, uint256 _amountWagered, uint8 _percentContribution ) external; function setCanSellWithoutElevation(address _wallet, bool _canSellWithoutElev) external; } // File contracts/interfaces/ISMOLNftRewards.sol pragma solidity ^0.8.9; interface ISMOLNftRewards { function claimReward() external; function depositRewards(uint256 _amount) external; function getShares(address wallet) external view returns (uint256); } // File contracts/SMOLNftRewards.sol pragma solidity ^0.8.9; contract SMOLNftRewards is ISMOLNftRewards, Ownable { struct Reward { uint256 totalExcluded; // excluded reward uint256 totalRealised; uint256 lastClaim; // used for boosting logic } struct Share { uint256 amount; uint256 stakedTime; } IERC721 shareholderNFT; ISmoltingInu smol = ISmoltingInu(0x553539d40AE81FD0d9C4b991B0b77bE6f6Bc030e); uint256 public totalStakedUsers; uint256 public totalSharesDeposited; // will only be actual deposited tokens without handling any reflections or otherwise // amount of shares a user has mapping(address => Share) shares; // reward information per user mapping(address => Reward) public rewards; uint256 public totalRewards; uint256 public totalDistributed; uint256 public rewardsPerShare; uint256 private constant ACC_FACTOR = 10**36; event ClaimReward(address user); event DistributeReward(address indexed user); event DepositRewards(address indexed user, uint256 amountTokens); modifier onlyToken() { require(msg.sender == address(shareholderNFT), 'must be token contract'); _; } constructor(address _shareholderNFT) { shareholderNFT = IERC721(_shareholderNFT); } function setShare(address shareholder, uint256 newBalance) external onlyToken { // _addShares and _removeShares takes the amount to add or remove respectively, // so we should handle the diff from the new balance when passing in the amounts // to these functions if (shares[shareholder].amount > newBalance) { _removeShares(shareholder, shares[shareholder].amount - newBalance); } else if (shares[shareholder].amount < newBalance) { _addShares(shareholder, newBalance - shares[shareholder].amount); } } function _addShares(address shareholder, uint256 amount) private { if (shares[shareholder].amount > 0) { _distributeReward(shareholder); } uint256 sharesBefore = shares[shareholder].amount; totalSharesDeposited += amount; shares[shareholder].amount += amount; shares[shareholder].stakedTime = block.timestamp; if (sharesBefore == 0 && shares[shareholder].amount > 0) { totalStakedUsers++; } rewards[shareholder].totalExcluded = getCumulativeRewards( shares[shareholder].amount ); } function _removeShares(address shareholder, uint256 amount) private { require( shares[shareholder].amount > 0 && (amount == 0 || amount <= shares[shareholder].amount), 'you can only unstake if you have some staked' ); _distributeReward(shareholder); uint256 removeAmount = amount == 0 ? shares[shareholder].amount : amount; totalSharesDeposited -= removeAmount; shares[shareholder].amount -= removeAmount; rewards[shareholder].totalExcluded = getCumulativeRewards( shares[shareholder].amount ); } function depositRewards(uint256 _amount) external override onlyOwner { require( totalSharesDeposited > 0, 'must be shares deposited to be rewarded rewards' ); totalRewards += _amount; rewardsPerShare += (ACC_FACTOR * _amount) / totalSharesDeposited; smol.gameMint(address(this), _amount); emit DepositRewards(msg.sender, _amount); } function _distributeReward(address shareholder) internal { if (shares[shareholder].amount == 0) { return; } uint256 amount = getUnpaid(shareholder); rewards[shareholder].totalRealised += amount; rewards[shareholder].totalExcluded = getCumulativeRewards( shares[shareholder].amount ); rewards[shareholder].lastClaim = block.timestamp; if (amount > 0) { totalDistributed += amount; smol.transfer(shareholder, amount); emit DistributeReward(shareholder); } } function claimReward() external override { _distributeReward(msg.sender); emit ClaimReward(msg.sender); } // returns the unpaid rewards function getUnpaid(address shareholder) public view returns (uint256) { if (shares[shareholder].amount == 0) { return 0; } uint256 earnedRewards = getCumulativeRewards(shares[shareholder].amount); uint256 rewardsExcluded = rewards[shareholder].totalExcluded; if (earnedRewards <= rewardsExcluded) { return 0; } return earnedRewards - rewardsExcluded; } function getCumulativeRewards(uint256 share) internal view returns (uint256) { return (share * rewardsPerShare) / ACC_FACTOR; } function getShares(address user) external view override returns (uint256) { return shares[user].amount; } function getShareholderNFT() external view returns (address) { return address(shareholderNFT); } function getSmolToken() external view returns (address) { return address(smol); } function setShareholderNFT(address _nft) external onlyOwner { shareholderNFT = IERC721(_nft); } function setSmolToken(address _token) external onlyOwner { smol = ISmoltingInu(_token); } } // File contracts/SMOLNft.sol pragma solidity ^0.8.9; /** * SMOL yield bearing NFTs */ contract SMOLNft is Ownable, ERC721Burnable, ERC721Enumerable, ERC721Pausable { using Strings for uint256; using Counters for Counters.Counter; uint16 public constant PERCENT_DENOMENATOR = 1000; uint16 private constant FIVE_MINUTES = 60 * 5; Counters.Counter private _tokenIds; SMOLNftRewards private _rewards; mapping(address => bool) private _isRewardsExcluded; // user => timestamp of last mint // used for throttling wallets from minting too often mapping(address => uint256) public userLastMinted; // Base token uri string private baseTokenURI; // baseTokenURI can point to IPFS folder like https://ipfs.io/ipfs/{cid}/ while address public smol = 0x553539d40AE81FD0d9C4b991B0b77bE6f6Bc030e; uint256 public nativeCost = 9 ether / 100; // 0.09 ETH uint256 public smolCost = 100 * 10**18; uint8 public maxPerMint = 10; // Payment address address public paymentAddress = 0x98c574473313EAC3FC6af9740245949380ec166E; // Royalties address address public royaltyAddress = 0x98c574473313EAC3FC6af9740245949380ec166E; // Royalties basis points (percentage using 2 decimals - 1000 = 100, 500 = 50, 0 = 0) uint256 private royaltyBasisPoints = 50; // 5% // Token info string public constant TOKEN_NAME = 'yield bearing smolting'; string public constant TOKEN_SYMBOL = 'ybSMOL'; // yield bearing SMOL uint256 public constant TOTAL_TOKENS = 4269; // Public sale params uint256 public publicSaleStartTime; bool public publicSaleActive; bool public isRevealing; mapping(address => bool) public canMintFreeNft; mapping(address => uint256) public mintedFreeNftTimestamp; mapping(uint256 => uint256) public tokenMintedAt; mapping(uint256 => uint256) public tokenLastTransferredAt; event PublicSaleStart(uint256 indexed _saleStartTime); event PublicSalePaused(uint256 indexed _timeElapsed); event PublicSaleActive(bool indexed _publicSaleActive); event RoyaltyBasisPoints(uint256 indexed _royaltyBasisPoints); // Public sale active modifier modifier whenPublicSaleActive() { require(publicSaleActive, 'Public sale is not active'); _; } // Public sale not active modifier modifier whenPublicSaleNotActive() { require( !publicSaleActive && publicSaleStartTime == 0, 'Public sale is already active' ); _; } // Owner or public sale active modifier modifier whenOwnerOrPublicSaleActive() { require( owner() == _msgSender() || publicSaleActive, 'Public sale is not active' ); _; } // -- Constructor --// constructor(string memory _baseTokenURI) ERC721(TOKEN_NAME, TOKEN_SYMBOL) { baseTokenURI = _baseTokenURI; _rewards = new SMOLNftRewards(address(this)); _rewards.transferOwnership(_msgSender()); _isRewardsExcluded[address(this)] = true; _isRewardsExcluded[address(_rewards)] = true; } // -- External Functions -- // // Start public sale function startPublicSale() external onlyOwner whenPublicSaleNotActive { publicSaleStartTime = block.timestamp; publicSaleActive = true; emit PublicSaleStart(publicSaleStartTime); } // Set this value to the block.timestamp you'd like to reset to // Created as a way to fast foward in time for tier timing unit tests // Can also be used if needing to pause and restart public sale from original start time (returned in startPublicSale() above) function setPublicSaleStartTime(uint256 _publicSaleStartTime) external onlyOwner { publicSaleStartTime = _publicSaleStartTime; emit PublicSaleStart(publicSaleStartTime); } // Toggle public sale function togglePublicSaleActive() external onlyOwner { publicSaleActive = !publicSaleActive; emit PublicSaleActive(publicSaleActive); } // Pause public sale function pausePublicSale() external onlyOwner whenPublicSaleActive { publicSaleActive = false; emit PublicSalePaused(getElapsedSaleTime()); } // Support royalty info - See {EIP-2981}: https://eips.ethereum.org/EIPS/eip-2981 function royaltyInfo(uint256, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { return ( royaltyAddress, (_salePrice * royaltyBasisPoints) / PERCENT_DENOMENATOR ); } function getElapsedSaleTime() public view returns (uint256) { return publicSaleStartTime > 0 ? block.timestamp - publicSaleStartTime : 0; } function getRewards() external view returns (address) { return address(_rewards); } // Get mints left function getMintsLeft() public view returns (uint256) { uint256 currentSupply = super.totalSupply(); return TOTAL_TOKENS - currentSupply; } // Mint token - requires tier and amount function mint(uint256 _amount) public payable whenOwnerOrPublicSaleActive { bool _isOwner = owner() == _msgSender(); require(_isOwner || getElapsedSaleTime() > 0, 'sale not active'); require( _isOwner || block.timestamp > userLastMinted[_msgSender()] + FIVE_MINUTES, 'can only mint once per 5 minutes' ); require( _amount > 0 && (_isOwner || _amount <= maxPerMint), 'must mint at least one and cannot exceed max amount' ); // Check there enough NFTs left to mint require(_amount <= getMintsLeft(), 'minting would exceed max supply'); userLastMinted[_msgSender()] = block.timestamp; // pay for NFTs & handle free NFT mint logic here as well if ( canMintFreeNft[_msgSender()] && mintedFreeNftTimestamp[_msgSender()] == 0 ) { mintedFreeNftTimestamp[_msgSender()] = block.timestamp; _payToMint(_amount - 1); } else { _payToMint(_amount); } for (uint256 i = 0; i < _amount; i++) { _tokenIds.increment(); // Safe mint _safeMint(_msgSender(), _tokenIds.current()); // Store minted at timestamp by token id tokenMintedAt[_tokenIds.current()] = block.timestamp; } } function _payToMint(uint256 _amount) internal whenOwnerOrPublicSaleActive { require(_amount > 0, 'must mint at least 1'); bool isOwner = owner() == _msgSender(); if (isOwner) { if (msg.value > 0) { Address.sendValue(payable(_msgSender()), msg.value); } return; } ISmoltingInu smolToken = ISmoltingInu(smol); uint256 totalNativeCost = nativeCost * _amount; uint256 totalSmolCost = smolCost * _amount; if (totalNativeCost > 0) { require( msg.value >= totalNativeCost, 'not enough native token provided to mint' ); uint256 balanceBefore = address(this).balance; Address.sendValue(payable(paymentAddress), totalNativeCost); // refund user for any extra native sent if (msg.value > totalNativeCost) { Address.sendValue(payable(_msgSender()), msg.value - totalNativeCost); } require( address(this).balance >= balanceBefore - msg.value, 'too much native sent' ); } else if (msg.value > 0) { Address.sendValue(payable(_msgSender()), msg.value); } if (totalSmolCost > 0) { require( smolToken.balanceOf(_msgSender()) >= totalSmolCost, 'not enough SMOL balance to mint' ); smolToken.gameBurn(_msgSender(), totalSmolCost); } } function setPaymentAddress(address _address) external onlyOwner { paymentAddress = _address; } // Set royalty wallet address function setRoyaltyAddress(address _address) external onlyOwner { royaltyAddress = _address; } function setSmolToken(address _smol) external onlyOwner { smol = _smol; } function setNativeCost(uint256 _wei) external onlyOwner { nativeCost = _wei; } function setSmolCost(uint256 _numTokens) external onlyOwner { smolCost = _numTokens; } // Set royalty basis points function setRoyaltyBasisPoints(uint256 _basisPoints) external onlyOwner { royaltyBasisPoints = _basisPoints; emit RoyaltyBasisPoints(_basisPoints); } // Set base URI function setBaseURI(string memory _uri) external onlyOwner { baseTokenURI = _uri; } function setRewards(address _contract) external onlyOwner { _rewards = SMOLNftRewards(_contract); } function setIsRewardsExcluded(address _wallet, bool _isExcluded) public onlyOwner { _isRewardsExcluded[_wallet] = _isExcluded; if (_isExcluded) { _rewards.setShare(_wallet, 0); } else { _rewards.setShare(_wallet, balanceOf(_wallet)); } } function setMaxPerMint(uint8 _max) external onlyOwner { require(maxPerMint > 0, 'have to be able to mint at least 1 NFT'); maxPerMint = _max; } function setCanMintFreeNft(address _wallet, bool _canMintFree) external onlyOwner { canMintFreeNft[_wallet] = _canMintFree; } function setCanMintFreeNftBulk(address[] memory _wallets, bool _canMintFree) external onlyOwner { for (uint256 i = 0; i < _wallets.length; i++) { canMintFreeNft[_wallets[i]] = _canMintFree; } } function isRewardsExcluded(address _wallet) external view returns (bool) { return _isRewardsExcluded[_wallet]; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'Nonexistent token'); return string(abi.encodePacked(_baseURI(), _tokenId.toString(), '.json')); } function isMinted(uint256 _tokenId) external view returns (bool) { return _exists(_tokenId); } // Contract metadata URI - Support for OpenSea: https://docs.opensea.io/docs/contract-level-metadata function contractURI() public view returns (string memory) { return string(abi.encodePacked(_baseURI(), 'contract.json')); } // Override supportsInterface - See {IERC165-supportsInterface} function supportsInterface(bytes4 _interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(_interfaceId); } // Pauses all token transfers - See {ERC721Pausable} function pause() public virtual onlyOwner { _pause(); } // Unpauses all token transfers - See {ERC721Pausable} function unpause() public virtual onlyOwner { _unpause(); } function reveal() external onlyOwner { require(!isRevealing, 'already revealing'); isRevealing = true; } //-- Internal Functions --// function _setRewardsShares(address _from, address _to) internal { if (!_isRewardsExcluded[_from] && _from != address(0)) { _rewards.setShare(_from, balanceOf(_from)); } if (!_isRewardsExcluded[_to] && _to != address(0)) { _rewards.setShare(_to, balanceOf(_to)); } } // Get base URI function _baseURI() internal view override returns (string memory) { return baseTokenURI; } // before all token transfer function _beforeTokenTransfer( address _from, address _to, uint256 _tokenId ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { // Store token last transfer timestamp by id tokenLastTransferredAt[_tokenId] = block.timestamp; super._beforeTokenTransfer(_from, _to, _tokenId); } // after all token transfer function _afterTokenTransfer( address _from, address _to, uint256 _tokenId ) internal virtual override(ERC721) { _setRewardsShares(_from, _to); super._afterTokenTransfer(_from, _to, _tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_publicSaleActive","type":"bool"}],"name":"PublicSaleActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_timeElapsed","type":"uint256"}],"name":"PublicSalePaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_saleStartTime","type":"uint256"}],"name":"PublicSaleStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_royaltyBasisPoints","type":"uint256"}],"name":"RoyaltyBasisPoints","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"PERCENT_DENOMENATOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canMintFreeNft","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getElapsedSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isRewardsExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFreeNftTimestamp","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":"nativeCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pausePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_canMintFree","type":"bool"}],"name":"setCanMintFreeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"},{"internalType":"bool","name":"_canMintFree","type":"bool"}],"name":"setCanMintFreeNftBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_isExcluded","type":"bool"}],"name":"setIsRewardsExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_max","type":"uint8"}],"name":"setMaxPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wei","type":"uint256"}],"name":"setNativeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleStartTime","type":"uint256"}],"name":"setPublicSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_basisPoints","type":"uint256"}],"name":"setRoyaltyBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"setSmolCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_smol","type":"address"}],"name":"setSmolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"smol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smolCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenLastTransferredAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLastMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052601180546001600160a01b031990811673553539d40ae81fd0d9c4b991b0b77be6f6bc030e1790915567013fbe85edc9000060125568056bc75e2d63100000601355601480547498c574473313eac3fc6af9740245949380ec166e0a6001600160a81b0319909116179055601580549091167398c574473313eac3fc6af9740245949380ec166e1790556032601655348015620000a057600080fd5b5060405162004c8538038062004c85833981016040819052620000c391620003a5565b6040518060400160405280601681526020017f7969656c642062656172696e6720736d6f6c74696e6700000000000000000000815250604051806040016040528060068152602001651e5894d353d360d21b815250620001326200012c6200028760201b60201c565b6200028b565b815162000147906001906020850190620002db565b5080516200015d906002906020840190620002db565b5050600b805460ff191690555080516200017f906010906020840190620002db565b50306040516200018f906200036a565b6001600160a01b039091168152602001604051809103906000f080158015620001bc573d6000803e3d6000fd5b50600d80546001600160a01b0319166001600160a01b0392909216918217905563f2fde38b620001e93390565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200022b57600080fd5b505af115801562000240573d6000803e3d6000fd5b5050306000908152600e60205260408082208054600160ff199182168117909255600d546001600160a01b03168452919092208054909116909117905550620004be915050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620002e99062000481565b90600052602060002090601f0160209004810192826200030d576000855562000358565b82601f106200032857805160ff191683800117855562000358565b8280016001018555821562000358579182015b82811115620003585782518255916020019190600101906200033b565b506200036692915062000378565b5090565b610e6b8062003e1a83390190565b5b8082111562000366576000815560010162000379565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620003b957600080fd5b82516001600160401b0380821115620003d157600080fd5b818501915085601f830112620003e657600080fd5b815181811115620003fb57620003fb6200038f565b604051601f8201601f19908116603f011681019083821181831017156200042657620004266200038f565b8160405282815288868487010111156200043f57600080fd5b600093505b8284101562000463578484018601518185018701529285019262000444565b82841115620004755760008684830101525b98975050505050505050565b600181811c908216806200049657607f821691505b60208210811415620004b857634e487b7160e01b600052602260045260246000fd5b50919050565b61394c80620004ce6000396000f3fe6080604052600436106103d95760003560e01c80635e1e1004116101fd578063a07fd2a411610118578063c87b56dd116100ab578063ec38a8621161007a578063ec38a86214610bd8578063f2fde38b14610bf8578063f39e640014610c18578063f9a907c514610c41578063ffedec0c14610c6057600080fd5b8063c87b56dd14610b3a578063d51c24d814610b5a578063e8a3d48514610b7a578063e985e9c514610b8f57600080fd5b8063b6b81940116100e7578063b6b8194014610aca578063b88d4fde14610aea578063baa9607314610b0a578063bc8893b414610b2057600080fd5b8063a07fd2a414610a55578063a22cb46514610a75578063a475b5dd14610a95578063ad2f852a14610aaa57600080fd5b80637d259887116101905780638da5cb5b1161015f5780638da5cb5b146109fa5780638e70e30a14610a1857806395d89b4114610a2d578063a0712d6814610a4257600080fd5b80637d259887146109785780637f1343d2146109a55780638456cb59146109c55780638ca3fcb2146109da57600080fd5b80636d5d40c6116101cc5780636d5d40c6146108f657806370a0823114610916578063715018a61461093657806376772cf81461094b57600080fd5b80635e1e10041461087b578063633423be1461089b5780636352211e146108c05780636bb7b1d9146108e057600080fd5b806318821400116102f857806342842e0e1161028b5780634f6ccce71161025a5780634f6ccce7146107d7578063507e094f146107f757806355f804b3146108235780635b00cfcb146108435780635c975abb1461086357600080fd5b806342842e0e1461075457806342966c68146107745780634369f4e5146107945780634e261486146107c157600080fd5b80632a905318116102c75780632a905318146106cd5780632f745c59146106ff57806333c41a901461071f5780633f4ba83a1461073f57600080fd5b806318821400146105fc5780631d1817221461063e57806323b872dd1461066e5780632a55205a1461068e57600080fd5b80630c1c972a11610370578063105adc4a1161033f578063105adc4a1461056157806310ef4eb31461059a57806317f632ad146105c757806318160ddd146105e757600080fd5b80630c1c972a1461050d5780630c3a92d3146105225780630c41f497146105375780630c894cfe1461054c57600080fd5b8063081812fc116103ac578063081812fc14610489578063095ea7b3146104a95780630a9855fe146104c95780630b7abf77146104e957600080fd5b806301ffc9a7146103de5780630572b0cc1461041357806306d254da1461044557806306fdde0314610467575b600080fd5b3480156103ea57600080fd5b506103fe6103f93660046131e6565b610c80565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b50600d546001600160a01b03165b6040516001600160a01b03909116815260200161040a565b34801561045157600080fd5b50610465610460366004613226565b610c91565b005b34801561047357600080fd5b5061047c610ce6565b60405161040a9190613299565b34801561049557600080fd5b5061042d6104a43660046132ac565b610d78565b3480156104b557600080fd5b506104656104c43660046132c5565b610e0d565b3480156104d557600080fd5b5060115461042d906001600160a01b031681565b3480156104f557600080fd5b506104ff6110ad81565b60405190815260200161040a565b34801561051957600080fd5b50610465610f23565b34801561052e57600080fd5b506104ff610fea565b34801561054357600080fd5b5061046561100a565b34801561055857600080fd5b50610465611093565b34801561056d57600080fd5b506103fe61057c366004613226565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156105a657600080fd5b506104ff6105b5366004613226565b600f6020526000908152604090205481565b3480156105d357600080fd5b506104656105e23660046132ac565b611102565b3480156105f357600080fd5b506009546104ff565b34801561060857600080fd5b5061047c604051806040016040528060168152602001757969656c642062656172696e6720736d6f6c74696e6760501b81525081565b34801561064a57600080fd5b506103fe610659366004613226565b60196020526000908152604090205460ff1681565b34801561067a57600080fd5b506104656106893660046132ef565b611131565b34801561069a57600080fd5b506106ae6106a936600461332b565b611163565b604080516001600160a01b03909316835260208301919091520161040a565b3480156106d957600080fd5b5061047c604051806040016040528060068152602001651e5894d353d360d21b81525081565b34801561070b57600080fd5b506104ff61071a3660046132c5565b61119d565b34801561072b57600080fd5b506103fe61073a3660046132ac565b611233565b34801561074b57600080fd5b50610465611252565b34801561076057600080fd5b5061046561076f3660046132ef565b611286565b34801561078057600080fd5b5061046561078f3660046132ac565b6112a1565b3480156107a057600080fd5b506104ff6107af3660046132ac565b601c6020526000908152604090205481565b3480156107cd57600080fd5b506104ff60135481565b3480156107e357600080fd5b506104ff6107f23660046132ac565b61131b565b34801561080357600080fd5b506014546108119060ff1681565b60405160ff909116815260200161040a565b34801561082f57600080fd5b5061046561083e3660046133ec565b6113ae565b34801561084f57600080fd5b5061046561085e366004613226565b6113ef565b34801561086f57600080fd5b50600b5460ff166103fe565b34801561088757600080fd5b50610465610896366004613226565b61143b565b3480156108a757600080fd5b5060145461042d9061010090046001600160a01b031681565b3480156108cc57600080fd5b5061042d6108db3660046132ac565b61148d565b3480156108ec57600080fd5b506104ff60175481565b34801561090257600080fd5b506104656109113660046132ac565b611504565b34801561092257600080fd5b506104ff610931366004613226565b611561565b34801561094257600080fd5b506104656115e8565b34801561095757600080fd5b506104ff6109663660046132ac565b601b6020526000908152604090205481565b34801561098457600080fd5b506104ff610993366004613226565b601a6020526000908152604090205481565b3480156109b157600080fd5b506104656109c0366004613445565b61161c565b3480156109d157600080fd5b50610465611671565b3480156109e657600080fd5b506104656109f5366004613478565b6116a3565b348015610a0657600080fd5b506000546001600160a01b031661042d565b348015610a2457600080fd5b506104ff611734565b348015610a3957600080fd5b5061047c611757565b610465610a503660046132ac565b611766565b348015610a6157600080fd5b50610465610a703660046132ac565b611a11565b348015610a8157600080fd5b50610465610a90366004613445565b611a40565b348015610aa157600080fd5b50610465611a4b565b348015610ab657600080fd5b5060155461042d906001600160a01b031681565b348015610ad657600080fd5b50610465610ae53660046132ac565b611ad2565b348015610af657600080fd5b50610465610b05366004613537565b611b2f565b348015610b1657600080fd5b506104ff60125481565b348015610b2c57600080fd5b506018546103fe9060ff1681565b348015610b4657600080fd5b5061047c610b553660046132ac565b611b67565b348015610b6657600080fd5b50610465610b75366004613445565b611bfa565b348015610b8657600080fd5b5061047c611d08565b348015610b9b57600080fd5b506103fe610baa3660046135b3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610be457600080fd5b50610465610bf3366004613226565b611d36565b348015610c0457600080fd5b50610465610c13366004613226565b611d82565b348015610c2457600080fd5b50610c2e6103e881565b60405161ffff909116815260200161040a565b348015610c4d57600080fd5b506018546103fe90610100900460ff1681565b348015610c6c57600080fd5b50610465610c7b3660046135dd565b611e1a565b6000610c8b82611ebb565b92915050565b6000546001600160a01b03163314610cc45760405162461bcd60e51b8152600401610cbb90613600565b60405180910390fd5b601580546001600160a01b0319166001600160a01b0392909216919091179055565b606060018054610cf590613635565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2190613635565b8015610d6e5780601f10610d4357610100808354040283529160200191610d6e565b820191906000526020600020905b815481529060010190602001808311610d5157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610df15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cbb565b506000908152600560205260409020546001600160a01b031690565b6000610e188261148d565b9050806001600160a01b0316836001600160a01b03161415610e865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cbb565b336001600160a01b0382161480610ea25750610ea28133610baa565b610f145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610cbb565b610f1e8383611ee0565b505050565b6000546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610cbb90613600565b60185460ff16158015610f605750601754155b610fac5760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c6520697320616c7265616479206163746976650000006044820152606401610cbb565b4260178190556018805460ff191660011790556040517fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a2565b600080610ff660095490565b9050611004816110ad613686565b91505090565b6000546001600160a01b031633146110345760405162461bcd60e51b8152600401610cbb90613600565b60185460ff166110565760405162461bcd60e51b8152600401610cbb9061369d565b6018805460ff19169055611068611734565b6040517fb94d4ebcdba018821f2c6ae2fb3a03d4023685b1c78faa4fe43dada42890cd2d90600090a2565b6000546001600160a01b031633146110bd5760405162461bcd60e51b8152600401610cbb90613600565b6018805460ff19811660ff9182161590811790925560405191161515907fafa97d89ca766bd74e787f7998a071ea20f4ddeea353499106df17bc9cf4deb890600090a2565b6000546001600160a01b0316331461112c5760405162461bcd60e51b8152600401610cbb90613600565b601255565b61113c335b82611f4e565b6111585760405162461bcd60e51b8152600401610cbb906136d4565b610f1e838383612045565b60155460165460009182916001600160a01b03909116906103e8906111889086613725565b611192919061375a565b915091509250929050565b60006111a883611561565b821061120a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610cbb565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000818152600360205260408120546001600160a01b03161515610c8b565b6000546001600160a01b0316331461127c5760405162461bcd60e51b8152600401610cbb90613600565b6112846121f2565b565b610f1e83838360405180602001604052806000815250611b2f565b6112aa33611136565b61130f5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610cbb565b61131881612285565b50565b600061132660095490565b82106113895760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cbb565b6009828154811061139c5761139c61376e565b90600052602060002001549050919050565b6000546001600160a01b031633146113d85760405162461bcd60e51b8152600401610cbb90613600565b80516113eb906010906020840190613137565b5050565b6000546001600160a01b031633146114195760405162461bcd60e51b8152600401610cbb90613600565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114655760405162461bcd60e51b8152600401610cbb90613600565b601480546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600360205260408120546001600160a01b031680610c8b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610cbb565b6000546001600160a01b0316331461152e5760405162461bcd60e51b8152600401610cbb90613600565b601781905560405181907fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a250565b60006001600160a01b0382166115cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610cbb565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146116125760405162461bcd60e51b8152600401610cbb90613600565b6112846000612334565b6000546001600160a01b031633146116465760405162461bcd60e51b8152600401610cbb90613600565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461169b5760405162461bcd60e51b8152600401610cbb90613600565b611284612384565b6000546001600160a01b031633146116cd5760405162461bcd60e51b8152600401610cbb90613600565b60005b8251811015610f1e5781601960008584815181106116f0576116f061376e565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061172c81613784565b9150506116d0565b600080601754116117455750600090565b6017546117529042613686565b905090565b606060028054610cf590613635565b6000546001600160a01b0316331480611781575060185460ff165b61179d5760405162461bcd60e51b8152600401610cbb9061369d565b6000546001600160a01b0316331480806117be575060006117bc611734565b115b6117fc5760405162461bcd60e51b815260206004820152600f60248201526e73616c65206e6f742061637469766560881b6044820152606401610cbb565b80806118235750336000908152600f60205260409020546118209061012c9061379f565b42115b61186f5760405162461bcd60e51b815260206004820181905260248201527f63616e206f6e6c79206d696e74206f6e6365207065722035206d696e757465736044820152606401610cbb565b60008211801561188b5750808061188b575060145460ff168211155b6118f35760405162461bcd60e51b815260206004820152603360248201527f6d757374206d696e74206174206c65617374206f6e6520616e642063616e6e6f6044820152721d08195e18d95959081b585e08185b5bdd5b9d606a1b6064820152608401610cbb565b6118fb610fea565b82111561194a5760405162461bcd60e51b815260206004820152601f60248201527f6d696e74696e6720776f756c6420657863656564206d617820737570706c79006044820152606401610cbb565b336000908152600f60209081526040808320429055601990915290205460ff1680156119835750336000908152601a6020526040902054155b156119b257336000908152601a602052604090204290556119ad6119a8600184613686565b6123ff565b6119bb565b6119bb826123ff565b60005b82811015610f1e576119d4600c80546001019055565b6119e033600c5461272e565b42601b60006119ee600c5490565b815260208101919091526040016000205580611a0981613784565b9150506119be565b6000546001600160a01b03163314611a3b5760405162461bcd60e51b8152600401610cbb90613600565b601355565b6113eb338383612748565b6000546001600160a01b03163314611a755760405162461bcd60e51b8152600401610cbb90613600565b601854610100900460ff1615611ac15760405162461bcd60e51b8152602060048201526011602482015270616c72656164792072657665616c696e6760781b6044820152606401610cbb565b6018805461ff001916610100179055565b6000546001600160a01b03163314611afc5760405162461bcd60e51b8152600401610cbb90613600565b601681905560405181907fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c690600090a250565b611b393383611f4e565b611b555760405162461bcd60e51b8152600401610cbb906136d4565b611b6184848484612817565b50505050565b6000818152600360205260409020546060906001600160a01b0316611bc25760405162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610cbb565b611bca61284a565b611bd383612859565b604051602001611be49291906137b7565b6040516020818303038152906040529050919050565b6000546001600160a01b03163314611c245760405162461bcd60e51b8152600401610cbb90613600565b6001600160a01b0382166000908152600e60205260409020805460ff19168215801591909117909155611cbc57600d54604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505050505050565b600d546001600160a01b03166314b6ca9683611cd781611561565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611c86565b6060611d1261284a565b604051602001611d2291906137f6565b604051602081830303815290604052905090565b6000546001600160a01b03163314611d605760405162461bcd60e51b8152600401610cbb90613600565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611dac5760405162461bcd60e51b8152600401610cbb90613600565b6001600160a01b038116611e115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cbb565b61131881612334565b6000546001600160a01b03163314611e445760405162461bcd60e51b8152600401610cbb90613600565b60145460ff16611ea55760405162461bcd60e51b815260206004820152602660248201527f6861766520746f2062652061626c6520746f206d696e74206174206c65617374604482015265080c4813919560d21b6064820152608401610cbb565b6014805460ff191660ff92909216919091179055565b60006001600160e01b0319821663780e9d6360e01b1480610c8b5750610c8b82612957565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f158261148d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316611fc75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cbb565b6000611fd28361148d565b9050806001600160a01b0316846001600160a01b0316148061200d5750836001600160a01b031661200284610d78565b6001600160a01b0316145b8061203d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120588261148d565b6001600160a01b0316146120bc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610cbb565b6001600160a01b03821661211e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cbb565b6121298383836129a7565b612134600082611ee0565b6001600160a01b038316600090815260046020526040812080546001929061215d908490613686565b90915550506001600160a01b038216600090815260046020526040812080546001929061218b90849061379f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610f1e8383836129c3565b600b5460ff1661223b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610cbb565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60006122908261148d565b905061229e816000846129a7565b6122a9600083611ee0565b6001600160a01b03811660009081526004602052604081208054600192906122d2908490613686565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46113eb816000846129c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b5460ff16156123ca5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610cbb565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122683390565b6000546001600160a01b031633148061241a575060185460ff165b6124365760405162461bcd60e51b8152600401610cbb9061369d565b6000811161247d5760405162461bcd60e51b81526020600482015260146024820152736d757374206d696e74206174206c65617374203160601b6044820152606401610cbb565b6000546001600160a01b0316331480156124a25734156113eb576113eb335b346129cd565b6011546012546001600160a01b03909116906000906124c2908590613725565b90506000846013546124d49190613725565b905081156125cb578134101561253d5760405162461bcd60e51b815260206004820152602860248201527f6e6f7420656e6f756768206e617469766520746f6b656e2070726f7669646564604482015267081d1bc81b5a5b9d60c21b6064820152608401610cbb565b601454479061255a9061010090046001600160a01b0316846129cd565b8234111561257557612575336125708534613686565b6129cd565b61257f3482613686565b4710156125c55760405162461bcd60e51b81526020600482015260146024820152731d1bdbc81b5d58da081b985d1a5d99481cd95b9d60621b6044820152606401610cbb565b506125da565b34156125da576125da3361249c565b801561272757806001600160a01b0384166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561263057600080fd5b505afa158015612644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126689190613827565b10156126b65760405162461bcd60e51b815260206004820152601f60248201527f6e6f7420656e6f75676820534d4f4c2062616c616e636520746f206d696e74006044820152606401610cbb565b6001600160a01b03831663271292f5336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561270e57600080fd5b505af1158015612722573d6000803e3d6000fd5b505050505b5050505050565b6113eb828260405180602001604052806000815250612ae6565b816001600160a01b0316836001600160a01b031614156127aa5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cbb565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612822848484612045565b61282e84848484612b19565b611b615760405162461bcd60e51b8152600401610cbb90613840565b606060108054610cf590613635565b60608161287d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128a7578061289181613784565b91506128a09050600a8361375a565b9150612881565b60008167ffffffffffffffff8111156128c2576128c261334d565b6040519080825280601f01601f1916602001820160405280156128ec576020820181803683370190505b5090505b841561203d57612901600183613686565b915061290e600a86613892565b61291990603061379f565b60f81b81838151811061292e5761292e61376e565b60200101906001600160f81b031916908160001a905350612950600a8661375a565b94506128f0565b60006001600160e01b031982166380ac58cd60e01b148061298857506001600160e01b03198216635b5e139f60e01b145b80610c8b57506301ffc9a760e01b6001600160e01b0319831614610c8b565b6000818152601c60205260409020429055610f1e838383612c26565b610f1e8383612c98565b80471015612a1d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cbb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a6a576040519150601f19603f3d011682016040523d82523d6000602084013e612a6f565b606091505b5050905080610f1e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cbb565b612af08383612d99565b612afd6000848484612b19565b610f1e5760405162461bcd60e51b8152600401610cbb90613840565b60006001600160a01b0384163b15612c1b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b5d9033908990889088906004016138a6565b602060405180830381600087803b158015612b7757600080fd5b505af1925050508015612ba7575060408051601f3d908101601f19168201909252612ba4918101906138e3565b60015b612c01573d808015612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b508051612bf95760405162461bcd60e51b8152600401610cbb90613840565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061203d565b506001949350505050565b612c31838383612eef565b600b5460ff1615610f1e5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610cbb565b6001600160a01b0382166000908152600e602052604090205460ff16158015612cc957506001600160a01b03821615155b15612d4857600d546001600160a01b03166314b6ca9683612ce981611561565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612d2f57600080fd5b505af1158015612d43573d6000803e3d6000fd5b505050505b6001600160a01b0381166000908152600e602052604090205460ff16158015612d7957506001600160a01b03811615155b156113eb57600d546001600160a01b03166314b6ca9682611cd781611561565b6001600160a01b038216612def5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cbb565b6000818152600360205260409020546001600160a01b031615612e545760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cbb565b612e60600083836129a7565b6001600160a01b0382166000908152600460205260408120805460019290612e8990849061379f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46113eb600083836129c3565b6001600160a01b038316612f4a57612f4581600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612f6d565b816001600160a01b0316836001600160a01b031614612f6d57612f6d8382612fa7565b6001600160a01b038216612f8457610f1e81613044565b826001600160a01b0316826001600160a01b031614610f1e57610f1e82826130f3565b60006001612fb484611561565b612fbe9190613686565b600083815260086020526040902054909150808214613011576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061305690600190613686565b6000838152600a60205260408120546009805493945090928490811061307e5761307e61376e565b90600052602060002001549050806009838154811061309f5761309f61376e565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806130d7576130d7613900565b6001900381819060005260206000200160009055905550505050565b60006130fe83611561565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461314390613635565b90600052602060002090601f01602090048101928261316557600085556131ab565b82601f1061317e57805160ff19168380011785556131ab565b828001600101855582156131ab579182015b828111156131ab578251825591602001919060010190613190565b506131b79291506131bb565b5090565b5b808211156131b757600081556001016131bc565b6001600160e01b03198116811461131857600080fd5b6000602082840312156131f857600080fd5b8135613203816131d0565b9392505050565b80356001600160a01b038116811461322157600080fd5b919050565b60006020828403121561323857600080fd5b6132038261320a565b60005b8381101561325c578181015183820152602001613244565b83811115611b615750506000910152565b60008151808452613285816020860160208601613241565b601f01601f19169290920160200192915050565b602081526000613203602083018461326d565b6000602082840312156132be57600080fd5b5035919050565b600080604083850312156132d857600080fd5b6132e18361320a565b946020939093013593505050565b60008060006060848603121561330457600080fd5b61330d8461320a565b925061331b6020850161320a565b9150604084013590509250925092565b6000806040838503121561333e57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561338c5761338c61334d565b604052919050565b600067ffffffffffffffff8311156133ae576133ae61334d565b6133c1601f8401601f1916602001613363565b90508281528383830111156133d557600080fd5b828260208301376000602084830101529392505050565b6000602082840312156133fe57600080fd5b813567ffffffffffffffff81111561341557600080fd5b8201601f8101841361342657600080fd5b61203d84823560208401613394565b8035801515811461322157600080fd5b6000806040838503121561345857600080fd5b6134618361320a565b915061346f60208401613435565b90509250929050565b6000806040838503121561348b57600080fd5b823567ffffffffffffffff808211156134a357600080fd5b818501915085601f8301126134b757600080fd5b81356020828211156134cb576134cb61334d565b8160051b92506134dc818401613363565b82815292840181019281810190898511156134f657600080fd5b948201945b8486101561351b5761350c8661320a565b825294820194908201906134fb565b965061352a9050878201613435565b9450505050509250929050565b6000806000806080858703121561354d57600080fd5b6135568561320a565b93506135646020860161320a565b925060408501359150606085013567ffffffffffffffff81111561358757600080fd5b8501601f8101871361359857600080fd5b6135a787823560208401613394565b91505092959194509250565b600080604083850312156135c657600080fd5b6135cf8361320a565b915061346f6020840161320a565b6000602082840312156135ef57600080fd5b813560ff8116811461320357600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061364957607f821691505b6020821081141561366a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561369857613698613670565b500390565b60208082526019908201527f5075626c69632073616c65206973206e6f742061637469766500000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600081600019048311821515161561373f5761373f613670565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261376957613769613744565b500490565b634e487b7160e01b600052603260045260246000fd5b600060001982141561379857613798613670565b5060010190565b600082198211156137b2576137b2613670565b500190565b600083516137c9818460208801613241565b8351908301906137dd818360208801613241565b64173539b7b760d91b9101908152600501949350505050565b60008251613808818460208701613241565b6c31b7b73a3930b1ba173539b7b760991b920191825250600d01919050565b60006020828403121561383957600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826138a1576138a1613744565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906138d99083018461326d565b9695505050505050565b6000602082840312156138f557600080fd5b8151613203816131d0565b634e487b7160e01b600052603160045260246000fdfea264697066735822122085275662b5f8b8c155cfe1dac8c70729bed975361cbb2ff72a42833e105ff81b64736f6c634300080900336080604052600280546001600160a01b03191673553539d40ae81fd0d9c4b991b0b77be6f6bc030e17905534801561003657600080fd5b50604051610e6b380380610e6b833981016040819052610055916100d3565b61005e33610083565b600180546001600160a01b0319166001600160a01b0392909216919091179055610103565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100e557600080fd5b81516001600160a01b03811681146100fc57600080fd5b9392505050565b610d59806101126000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80638bdf67f2116100a2578063e262391811610071578063e262391814610230578063efca2eed14610243578063f04da65b1461024c578063f2fde38b14610275578063f81ca2581461028857600080fd5b80638bdf67f2146101fb5780638da5cb5b1461020e578063b88a802f1461021f578063c7e1d0b11461022757600080fd5b80633c6e6789116100e95780633c6e6789146101bb5780635b00cfcb146101c4578063715018a6146101d757806380bb4055146101df57806389d96917146101e857600080fd5b80630700037d1461011b578063097046041461016a5780630e15561a1461018f57806314b6ca96146101a6575b600080fd5b61014a610129366004610bc6565b60066020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6001546001600160a01b03165b6040516001600160a01b039091168152602001610161565b61019860075481565b604051908152602001610161565b6101b96101b4366004610be8565b610299565b005b61019860045481565b6101b96101d2366004610bc6565b610392565b6101b96103de565b61019860035481565b6101986101f6366004610bc6565b610414565b6101b9610209366004610c12565b61049a565b6000546001600160a01b0316610177565b6101b961061d565b61019860095481565b6101b961023e366004610bc6565b61065b565b61019860085481565b61019861025a366004610bc6565b6001600160a01b031660009081526005602052604090205490565b6101b9610283366004610bc6565b6106a7565b6002546001600160a01b0316610177565b6001546001600160a01b031633146102f15760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081899481d1bdad95b8818dbdb9d1c9858dd60521b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260056020526040902054811015610344576001600160a01b03821660009081526005602052604090205461034090839061033b908490610c41565b610742565b5050565b6001600160a01b038216600090815260056020526040902054811115610340576001600160a01b03821660009081526005602052604090205461034090839061038d9084610c41565b6108a4565b6000546001600160a01b031633146103bc5760405162461bcd60e51b81526004016102e890610c58565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146104085760405162461bcd60e51b81526004016102e890610c58565b61041260006109aa565b565b6001600160a01b03811660009081526005602052604081205461043957506000919050565b6001600160a01b03821660009081526005602052604081205461045b906109fa565b6001600160a01b038416600090815260066020526040902054909150808211610488575060009392505050565b6104928183610c41565b949350505050565b6000546001600160a01b031633146104c45760405162461bcd60e51b81526004016102e890610c58565b60006004541161052e5760405162461bcd60e51b815260206004820152602f60248201527f6d75737420626520736861726573206465706f736974656420746f206265207260448201526e65776172646564207265776172647360881b60648201526084016102e8565b80600760008282546105409190610c8d565b9091555050600454610561826ec097ce7bc90715b34b9f1000000000610ca5565b61056b9190610cc4565b6009600082825461057c9190610c8d565b9091555050600254604051634eb9029960e01b8152306004820152602481018390526001600160a01b0390911690634eb9029990604401600060405180830381600087803b1580156105cd57600080fd5b505af11580156105e1573d6000803e3d6000fd5b50506040518381523392507fb9ad861b752f80117b35bea6dec99933d8a5ae360f2839ee8784b750d5613409915060200160405180910390a250565b61062633610a2a565b6040513381527f63e32091e4445d16e29c33a6b264577c2d86694021aa4e6f4dd590048f5792e89060200160405180910390a1565b6000546001600160a01b031633146106855760405162461bcd60e51b81526004016102e890610c58565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146106d15760405162461bcd60e51b81526004016102e890610c58565b6001600160a01b0381166107365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102e8565b61073f816109aa565b50565b6001600160a01b03821660009081526005602052604090205415801590610789575080158061078957506001600160a01b0382166000908152600560205260409020548111155b6107ea5760405162461bcd60e51b815260206004820152602c60248201527f796f752063616e206f6e6c7920756e7374616b6520696620796f75206861766560448201526b081cdbdb59481cdd185ad95960a21b60648201526084016102e8565b6107f382610a2a565b60008115610801578161081b565b6001600160a01b0383166000908152600560205260409020545b9050806004600082825461082f9190610c41565b90915550506001600160a01b0383166000908152600560205260408120805483929061085c908490610c41565b90915550506001600160a01b038316600090815260056020526040902054610883906109fa565b6001600160a01b039093166000908152600660205260409020929092555050565b6001600160a01b038216600090815260056020526040902054156108cb576108cb82610a2a565b6001600160a01b03821660009081526005602052604081205460048054919284926108f7908490610c8d565b90915550506001600160a01b03831660009081526005602052604081208054849290610924908490610c8d565b90915550506001600160a01b0383166000908152600560205260409020426001909101558015801561096d57506001600160a01b03831660009081526005602052604090205415155b15610988576003805490600061098283610ce6565b91905055505b6001600160a01b038316600090815260056020526040902054610883906109fa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006ec097ce7bc90715b34b9f100000000060095483610a1a9190610ca5565b610a249190610cc4565b92915050565b6001600160a01b038116600090815260056020526040902054610a4a5750565b6000610a5582610414565b6001600160a01b038316600090815260066020526040812060010180549293508392909190610a85908490610c8d565b90915550506001600160a01b038216600090815260056020526040902054610aac906109fa565b6001600160a01b0383166000908152600660205260409020908155426002909101558015610340578060086000828254610ae69190610c8d565b909155505060025460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b719190610d01565b506040516001600160a01b038316907f12aec06443e8d0b9713948f69d526f256f435e4d689c9d5215a1387d4230597d90600090a25050565b80356001600160a01b0381168114610bc157600080fd5b919050565b600060208284031215610bd857600080fd5b610be182610baa565b9392505050565b60008060408385031215610bfb57600080fd5b610c0483610baa565b946020939093013593505050565b600060208284031215610c2457600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600082821015610c5357610c53610c2b565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115610ca057610ca0610c2b565b500190565b6000816000190483118215151615610cbf57610cbf610c2b565b500290565b600082610ce157634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415610cfa57610cfa610c2b565b5060010190565b600060208284031215610d1357600080fd5b81518015158114610be157600080fdfea26469706673582212207429bfa39e98459cef3f03e1be0a2edd311bb258139eaf9bdf6715473fb33cda64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e736d6f6c74696e67696e752e636f6d2f6e66742f6d657461646174612f0000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103d95760003560e01c80635e1e1004116101fd578063a07fd2a411610118578063c87b56dd116100ab578063ec38a8621161007a578063ec38a86214610bd8578063f2fde38b14610bf8578063f39e640014610c18578063f9a907c514610c41578063ffedec0c14610c6057600080fd5b8063c87b56dd14610b3a578063d51c24d814610b5a578063e8a3d48514610b7a578063e985e9c514610b8f57600080fd5b8063b6b81940116100e7578063b6b8194014610aca578063b88d4fde14610aea578063baa9607314610b0a578063bc8893b414610b2057600080fd5b8063a07fd2a414610a55578063a22cb46514610a75578063a475b5dd14610a95578063ad2f852a14610aaa57600080fd5b80637d259887116101905780638da5cb5b1161015f5780638da5cb5b146109fa5780638e70e30a14610a1857806395d89b4114610a2d578063a0712d6814610a4257600080fd5b80637d259887146109785780637f1343d2146109a55780638456cb59146109c55780638ca3fcb2146109da57600080fd5b80636d5d40c6116101cc5780636d5d40c6146108f657806370a0823114610916578063715018a61461093657806376772cf81461094b57600080fd5b80635e1e10041461087b578063633423be1461089b5780636352211e146108c05780636bb7b1d9146108e057600080fd5b806318821400116102f857806342842e0e1161028b5780634f6ccce71161025a5780634f6ccce7146107d7578063507e094f146107f757806355f804b3146108235780635b00cfcb146108435780635c975abb1461086357600080fd5b806342842e0e1461075457806342966c68146107745780634369f4e5146107945780634e261486146107c157600080fd5b80632a905318116102c75780632a905318146106cd5780632f745c59146106ff57806333c41a901461071f5780633f4ba83a1461073f57600080fd5b806318821400146105fc5780631d1817221461063e57806323b872dd1461066e5780632a55205a1461068e57600080fd5b80630c1c972a11610370578063105adc4a1161033f578063105adc4a1461056157806310ef4eb31461059a57806317f632ad146105c757806318160ddd146105e757600080fd5b80630c1c972a1461050d5780630c3a92d3146105225780630c41f497146105375780630c894cfe1461054c57600080fd5b8063081812fc116103ac578063081812fc14610489578063095ea7b3146104a95780630a9855fe146104c95780630b7abf77146104e957600080fd5b806301ffc9a7146103de5780630572b0cc1461041357806306d254da1461044557806306fdde0314610467575b600080fd5b3480156103ea57600080fd5b506103fe6103f93660046131e6565b610c80565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b50600d546001600160a01b03165b6040516001600160a01b03909116815260200161040a565b34801561045157600080fd5b50610465610460366004613226565b610c91565b005b34801561047357600080fd5b5061047c610ce6565b60405161040a9190613299565b34801561049557600080fd5b5061042d6104a43660046132ac565b610d78565b3480156104b557600080fd5b506104656104c43660046132c5565b610e0d565b3480156104d557600080fd5b5060115461042d906001600160a01b031681565b3480156104f557600080fd5b506104ff6110ad81565b60405190815260200161040a565b34801561051957600080fd5b50610465610f23565b34801561052e57600080fd5b506104ff610fea565b34801561054357600080fd5b5061046561100a565b34801561055857600080fd5b50610465611093565b34801561056d57600080fd5b506103fe61057c366004613226565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156105a657600080fd5b506104ff6105b5366004613226565b600f6020526000908152604090205481565b3480156105d357600080fd5b506104656105e23660046132ac565b611102565b3480156105f357600080fd5b506009546104ff565b34801561060857600080fd5b5061047c604051806040016040528060168152602001757969656c642062656172696e6720736d6f6c74696e6760501b81525081565b34801561064a57600080fd5b506103fe610659366004613226565b60196020526000908152604090205460ff1681565b34801561067a57600080fd5b506104656106893660046132ef565b611131565b34801561069a57600080fd5b506106ae6106a936600461332b565b611163565b604080516001600160a01b03909316835260208301919091520161040a565b3480156106d957600080fd5b5061047c604051806040016040528060068152602001651e5894d353d360d21b81525081565b34801561070b57600080fd5b506104ff61071a3660046132c5565b61119d565b34801561072b57600080fd5b506103fe61073a3660046132ac565b611233565b34801561074b57600080fd5b50610465611252565b34801561076057600080fd5b5061046561076f3660046132ef565b611286565b34801561078057600080fd5b5061046561078f3660046132ac565b6112a1565b3480156107a057600080fd5b506104ff6107af3660046132ac565b601c6020526000908152604090205481565b3480156107cd57600080fd5b506104ff60135481565b3480156107e357600080fd5b506104ff6107f23660046132ac565b61131b565b34801561080357600080fd5b506014546108119060ff1681565b60405160ff909116815260200161040a565b34801561082f57600080fd5b5061046561083e3660046133ec565b6113ae565b34801561084f57600080fd5b5061046561085e366004613226565b6113ef565b34801561086f57600080fd5b50600b5460ff166103fe565b34801561088757600080fd5b50610465610896366004613226565b61143b565b3480156108a757600080fd5b5060145461042d9061010090046001600160a01b031681565b3480156108cc57600080fd5b5061042d6108db3660046132ac565b61148d565b3480156108ec57600080fd5b506104ff60175481565b34801561090257600080fd5b506104656109113660046132ac565b611504565b34801561092257600080fd5b506104ff610931366004613226565b611561565b34801561094257600080fd5b506104656115e8565b34801561095757600080fd5b506104ff6109663660046132ac565b601b6020526000908152604090205481565b34801561098457600080fd5b506104ff610993366004613226565b601a6020526000908152604090205481565b3480156109b157600080fd5b506104656109c0366004613445565b61161c565b3480156109d157600080fd5b50610465611671565b3480156109e657600080fd5b506104656109f5366004613478565b6116a3565b348015610a0657600080fd5b506000546001600160a01b031661042d565b348015610a2457600080fd5b506104ff611734565b348015610a3957600080fd5b5061047c611757565b610465610a503660046132ac565b611766565b348015610a6157600080fd5b50610465610a703660046132ac565b611a11565b348015610a8157600080fd5b50610465610a90366004613445565b611a40565b348015610aa157600080fd5b50610465611a4b565b348015610ab657600080fd5b5060155461042d906001600160a01b031681565b348015610ad657600080fd5b50610465610ae53660046132ac565b611ad2565b348015610af657600080fd5b50610465610b05366004613537565b611b2f565b348015610b1657600080fd5b506104ff60125481565b348015610b2c57600080fd5b506018546103fe9060ff1681565b348015610b4657600080fd5b5061047c610b553660046132ac565b611b67565b348015610b6657600080fd5b50610465610b75366004613445565b611bfa565b348015610b8657600080fd5b5061047c611d08565b348015610b9b57600080fd5b506103fe610baa3660046135b3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610be457600080fd5b50610465610bf3366004613226565b611d36565b348015610c0457600080fd5b50610465610c13366004613226565b611d82565b348015610c2457600080fd5b50610c2e6103e881565b60405161ffff909116815260200161040a565b348015610c4d57600080fd5b506018546103fe90610100900460ff1681565b348015610c6c57600080fd5b50610465610c7b3660046135dd565b611e1a565b6000610c8b82611ebb565b92915050565b6000546001600160a01b03163314610cc45760405162461bcd60e51b8152600401610cbb90613600565b60405180910390fd5b601580546001600160a01b0319166001600160a01b0392909216919091179055565b606060018054610cf590613635565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2190613635565b8015610d6e5780601f10610d4357610100808354040283529160200191610d6e565b820191906000526020600020905b815481529060010190602001808311610d5157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610df15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cbb565b506000908152600560205260409020546001600160a01b031690565b6000610e188261148d565b9050806001600160a01b0316836001600160a01b03161415610e865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cbb565b336001600160a01b0382161480610ea25750610ea28133610baa565b610f145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610cbb565b610f1e8383611ee0565b505050565b6000546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610cbb90613600565b60185460ff16158015610f605750601754155b610fac5760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c6520697320616c7265616479206163746976650000006044820152606401610cbb565b4260178190556018805460ff191660011790556040517fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a2565b600080610ff660095490565b9050611004816110ad613686565b91505090565b6000546001600160a01b031633146110345760405162461bcd60e51b8152600401610cbb90613600565b60185460ff166110565760405162461bcd60e51b8152600401610cbb9061369d565b6018805460ff19169055611068611734565b6040517fb94d4ebcdba018821f2c6ae2fb3a03d4023685b1c78faa4fe43dada42890cd2d90600090a2565b6000546001600160a01b031633146110bd5760405162461bcd60e51b8152600401610cbb90613600565b6018805460ff19811660ff9182161590811790925560405191161515907fafa97d89ca766bd74e787f7998a071ea20f4ddeea353499106df17bc9cf4deb890600090a2565b6000546001600160a01b0316331461112c5760405162461bcd60e51b8152600401610cbb90613600565b601255565b61113c335b82611f4e565b6111585760405162461bcd60e51b8152600401610cbb906136d4565b610f1e838383612045565b60155460165460009182916001600160a01b03909116906103e8906111889086613725565b611192919061375a565b915091509250929050565b60006111a883611561565b821061120a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610cbb565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000818152600360205260408120546001600160a01b03161515610c8b565b6000546001600160a01b0316331461127c5760405162461bcd60e51b8152600401610cbb90613600565b6112846121f2565b565b610f1e83838360405180602001604052806000815250611b2f565b6112aa33611136565b61130f5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610cbb565b61131881612285565b50565b600061132660095490565b82106113895760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cbb565b6009828154811061139c5761139c61376e565b90600052602060002001549050919050565b6000546001600160a01b031633146113d85760405162461bcd60e51b8152600401610cbb90613600565b80516113eb906010906020840190613137565b5050565b6000546001600160a01b031633146114195760405162461bcd60e51b8152600401610cbb90613600565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114655760405162461bcd60e51b8152600401610cbb90613600565b601480546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600360205260408120546001600160a01b031680610c8b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610cbb565b6000546001600160a01b0316331461152e5760405162461bcd60e51b8152600401610cbb90613600565b601781905560405181907fb14aa2dad53a0090fda3c97971fdc6c84331eff6fc43a584628e5d83e131a30990600090a250565b60006001600160a01b0382166115cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610cbb565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146116125760405162461bcd60e51b8152600401610cbb90613600565b6112846000612334565b6000546001600160a01b031633146116465760405162461bcd60e51b8152600401610cbb90613600565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461169b5760405162461bcd60e51b8152600401610cbb90613600565b611284612384565b6000546001600160a01b031633146116cd5760405162461bcd60e51b8152600401610cbb90613600565b60005b8251811015610f1e5781601960008584815181106116f0576116f061376e565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061172c81613784565b9150506116d0565b600080601754116117455750600090565b6017546117529042613686565b905090565b606060028054610cf590613635565b6000546001600160a01b0316331480611781575060185460ff165b61179d5760405162461bcd60e51b8152600401610cbb9061369d565b6000546001600160a01b0316331480806117be575060006117bc611734565b115b6117fc5760405162461bcd60e51b815260206004820152600f60248201526e73616c65206e6f742061637469766560881b6044820152606401610cbb565b80806118235750336000908152600f60205260409020546118209061012c9061379f565b42115b61186f5760405162461bcd60e51b815260206004820181905260248201527f63616e206f6e6c79206d696e74206f6e6365207065722035206d696e757465736044820152606401610cbb565b60008211801561188b5750808061188b575060145460ff168211155b6118f35760405162461bcd60e51b815260206004820152603360248201527f6d757374206d696e74206174206c65617374206f6e6520616e642063616e6e6f6044820152721d08195e18d95959081b585e08185b5bdd5b9d606a1b6064820152608401610cbb565b6118fb610fea565b82111561194a5760405162461bcd60e51b815260206004820152601f60248201527f6d696e74696e6720776f756c6420657863656564206d617820737570706c79006044820152606401610cbb565b336000908152600f60209081526040808320429055601990915290205460ff1680156119835750336000908152601a6020526040902054155b156119b257336000908152601a602052604090204290556119ad6119a8600184613686565b6123ff565b6119bb565b6119bb826123ff565b60005b82811015610f1e576119d4600c80546001019055565b6119e033600c5461272e565b42601b60006119ee600c5490565b815260208101919091526040016000205580611a0981613784565b9150506119be565b6000546001600160a01b03163314611a3b5760405162461bcd60e51b8152600401610cbb90613600565b601355565b6113eb338383612748565b6000546001600160a01b03163314611a755760405162461bcd60e51b8152600401610cbb90613600565b601854610100900460ff1615611ac15760405162461bcd60e51b8152602060048201526011602482015270616c72656164792072657665616c696e6760781b6044820152606401610cbb565b6018805461ff001916610100179055565b6000546001600160a01b03163314611afc5760405162461bcd60e51b8152600401610cbb90613600565b601681905560405181907fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c690600090a250565b611b393383611f4e565b611b555760405162461bcd60e51b8152600401610cbb906136d4565b611b6184848484612817565b50505050565b6000818152600360205260409020546060906001600160a01b0316611bc25760405162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610cbb565b611bca61284a565b611bd383612859565b604051602001611be49291906137b7565b6040516020818303038152906040529050919050565b6000546001600160a01b03163314611c245760405162461bcd60e51b8152600401610cbb90613600565b6001600160a01b0382166000908152600e60205260409020805460ff19168215801591909117909155611cbc57600d54604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505050505050565b600d546001600160a01b03166314b6ca9683611cd781611561565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611c86565b6060611d1261284a565b604051602001611d2291906137f6565b604051602081830303815290604052905090565b6000546001600160a01b03163314611d605760405162461bcd60e51b8152600401610cbb90613600565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611dac5760405162461bcd60e51b8152600401610cbb90613600565b6001600160a01b038116611e115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cbb565b61131881612334565b6000546001600160a01b03163314611e445760405162461bcd60e51b8152600401610cbb90613600565b60145460ff16611ea55760405162461bcd60e51b815260206004820152602660248201527f6861766520746f2062652061626c6520746f206d696e74206174206c65617374604482015265080c4813919560d21b6064820152608401610cbb565b6014805460ff191660ff92909216919091179055565b60006001600160e01b0319821663780e9d6360e01b1480610c8b5750610c8b82612957565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f158261148d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316611fc75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cbb565b6000611fd28361148d565b9050806001600160a01b0316846001600160a01b0316148061200d5750836001600160a01b031661200284610d78565b6001600160a01b0316145b8061203d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120588261148d565b6001600160a01b0316146120bc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610cbb565b6001600160a01b03821661211e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cbb565b6121298383836129a7565b612134600082611ee0565b6001600160a01b038316600090815260046020526040812080546001929061215d908490613686565b90915550506001600160a01b038216600090815260046020526040812080546001929061218b90849061379f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610f1e8383836129c3565b600b5460ff1661223b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610cbb565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60006122908261148d565b905061229e816000846129a7565b6122a9600083611ee0565b6001600160a01b03811660009081526004602052604081208054600192906122d2908490613686565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46113eb816000846129c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b5460ff16156123ca5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610cbb565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122683390565b6000546001600160a01b031633148061241a575060185460ff165b6124365760405162461bcd60e51b8152600401610cbb9061369d565b6000811161247d5760405162461bcd60e51b81526020600482015260146024820152736d757374206d696e74206174206c65617374203160601b6044820152606401610cbb565b6000546001600160a01b0316331480156124a25734156113eb576113eb335b346129cd565b6011546012546001600160a01b03909116906000906124c2908590613725565b90506000846013546124d49190613725565b905081156125cb578134101561253d5760405162461bcd60e51b815260206004820152602860248201527f6e6f7420656e6f756768206e617469766520746f6b656e2070726f7669646564604482015267081d1bc81b5a5b9d60c21b6064820152608401610cbb565b601454479061255a9061010090046001600160a01b0316846129cd565b8234111561257557612575336125708534613686565b6129cd565b61257f3482613686565b4710156125c55760405162461bcd60e51b81526020600482015260146024820152731d1bdbc81b5d58da081b985d1a5d99481cd95b9d60621b6044820152606401610cbb565b506125da565b34156125da576125da3361249c565b801561272757806001600160a01b0384166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561263057600080fd5b505afa158015612644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126689190613827565b10156126b65760405162461bcd60e51b815260206004820152601f60248201527f6e6f7420656e6f75676820534d4f4c2062616c616e636520746f206d696e74006044820152606401610cbb565b6001600160a01b03831663271292f5336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561270e57600080fd5b505af1158015612722573d6000803e3d6000fd5b505050505b5050505050565b6113eb828260405180602001604052806000815250612ae6565b816001600160a01b0316836001600160a01b031614156127aa5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cbb565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612822848484612045565b61282e84848484612b19565b611b615760405162461bcd60e51b8152600401610cbb90613840565b606060108054610cf590613635565b60608161287d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128a7578061289181613784565b91506128a09050600a8361375a565b9150612881565b60008167ffffffffffffffff8111156128c2576128c261334d565b6040519080825280601f01601f1916602001820160405280156128ec576020820181803683370190505b5090505b841561203d57612901600183613686565b915061290e600a86613892565b61291990603061379f565b60f81b81838151811061292e5761292e61376e565b60200101906001600160f81b031916908160001a905350612950600a8661375a565b94506128f0565b60006001600160e01b031982166380ac58cd60e01b148061298857506001600160e01b03198216635b5e139f60e01b145b80610c8b57506301ffc9a760e01b6001600160e01b0319831614610c8b565b6000818152601c60205260409020429055610f1e838383612c26565b610f1e8383612c98565b80471015612a1d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cbb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a6a576040519150601f19603f3d011682016040523d82523d6000602084013e612a6f565b606091505b5050905080610f1e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cbb565b612af08383612d99565b612afd6000848484612b19565b610f1e5760405162461bcd60e51b8152600401610cbb90613840565b60006001600160a01b0384163b15612c1b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b5d9033908990889088906004016138a6565b602060405180830381600087803b158015612b7757600080fd5b505af1925050508015612ba7575060408051601f3d908101601f19168201909252612ba4918101906138e3565b60015b612c01573d808015612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b508051612bf95760405162461bcd60e51b8152600401610cbb90613840565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061203d565b506001949350505050565b612c31838383612eef565b600b5460ff1615610f1e5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610cbb565b6001600160a01b0382166000908152600e602052604090205460ff16158015612cc957506001600160a01b03821615155b15612d4857600d546001600160a01b03166314b6ca9683612ce981611561565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612d2f57600080fd5b505af1158015612d43573d6000803e3d6000fd5b505050505b6001600160a01b0381166000908152600e602052604090205460ff16158015612d7957506001600160a01b03811615155b156113eb57600d546001600160a01b03166314b6ca9682611cd781611561565b6001600160a01b038216612def5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cbb565b6000818152600360205260409020546001600160a01b031615612e545760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cbb565b612e60600083836129a7565b6001600160a01b0382166000908152600460205260408120805460019290612e8990849061379f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46113eb600083836129c3565b6001600160a01b038316612f4a57612f4581600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612f6d565b816001600160a01b0316836001600160a01b031614612f6d57612f6d8382612fa7565b6001600160a01b038216612f8457610f1e81613044565b826001600160a01b0316826001600160a01b031614610f1e57610f1e82826130f3565b60006001612fb484611561565b612fbe9190613686565b600083815260086020526040902054909150808214613011576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061305690600190613686565b6000838152600a60205260408120546009805493945090928490811061307e5761307e61376e565b90600052602060002001549050806009838154811061309f5761309f61376e565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806130d7576130d7613900565b6001900381819060005260206000200160009055905550505050565b60006130fe83611561565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461314390613635565b90600052602060002090601f01602090048101928261316557600085556131ab565b82601f1061317e57805160ff19168380011785556131ab565b828001600101855582156131ab579182015b828111156131ab578251825591602001919060010190613190565b506131b79291506131bb565b5090565b5b808211156131b757600081556001016131bc565b6001600160e01b03198116811461131857600080fd5b6000602082840312156131f857600080fd5b8135613203816131d0565b9392505050565b80356001600160a01b038116811461322157600080fd5b919050565b60006020828403121561323857600080fd5b6132038261320a565b60005b8381101561325c578181015183820152602001613244565b83811115611b615750506000910152565b60008151808452613285816020860160208601613241565b601f01601f19169290920160200192915050565b602081526000613203602083018461326d565b6000602082840312156132be57600080fd5b5035919050565b600080604083850312156132d857600080fd5b6132e18361320a565b946020939093013593505050565b60008060006060848603121561330457600080fd5b61330d8461320a565b925061331b6020850161320a565b9150604084013590509250925092565b6000806040838503121561333e57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561338c5761338c61334d565b604052919050565b600067ffffffffffffffff8311156133ae576133ae61334d565b6133c1601f8401601f1916602001613363565b90508281528383830111156133d557600080fd5b828260208301376000602084830101529392505050565b6000602082840312156133fe57600080fd5b813567ffffffffffffffff81111561341557600080fd5b8201601f8101841361342657600080fd5b61203d84823560208401613394565b8035801515811461322157600080fd5b6000806040838503121561345857600080fd5b6134618361320a565b915061346f60208401613435565b90509250929050565b6000806040838503121561348b57600080fd5b823567ffffffffffffffff808211156134a357600080fd5b818501915085601f8301126134b757600080fd5b81356020828211156134cb576134cb61334d565b8160051b92506134dc818401613363565b82815292840181019281810190898511156134f657600080fd5b948201945b8486101561351b5761350c8661320a565b825294820194908201906134fb565b965061352a9050878201613435565b9450505050509250929050565b6000806000806080858703121561354d57600080fd5b6135568561320a565b93506135646020860161320a565b925060408501359150606085013567ffffffffffffffff81111561358757600080fd5b8501601f8101871361359857600080fd5b6135a787823560208401613394565b91505092959194509250565b600080604083850312156135c657600080fd5b6135cf8361320a565b915061346f6020840161320a565b6000602082840312156135ef57600080fd5b813560ff8116811461320357600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061364957607f821691505b6020821081141561366a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561369857613698613670565b500390565b60208082526019908201527f5075626c69632073616c65206973206e6f742061637469766500000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600081600019048311821515161561373f5761373f613670565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261376957613769613744565b500490565b634e487b7160e01b600052603260045260246000fd5b600060001982141561379857613798613670565b5060010190565b600082198211156137b2576137b2613670565b500190565b600083516137c9818460208801613241565b8351908301906137dd818360208801613241565b64173539b7b760d91b9101908152600501949350505050565b60008251613808818460208701613241565b6c31b7b73a3930b1ba173539b7b760991b920191825250600d01919050565b60006020828403121561383957600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826138a1576138a1613744565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906138d99083018461326d565b9695505050505050565b6000602082840312156138f557600080fd5b8151613203816131d0565b634e487b7160e01b600052603160045260246000fdfea264697066735822122085275662b5f8b8c155cfe1dac8c70729bed975361cbb2ff72a42833e105ff81b64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e736d6f6c74696e67696e752e636f6d2f6e66742f6d657461646174612f0000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _baseTokenURI (string): https://api.smoltinginu.com/nft/metadata/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [2] : 68747470733a2f2f6170692e736d6f6c74696e67696e752e636f6d2f6e66742f
Arg [3] : 6d657461646174612f0000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
57969:11769:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68051:203;;;;;;;;;;-1:-1:-1;68051:203:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;68051:203:0;;;;;;;;62509:91;;;;;;;;;;-1:-1:-1;62585:8:0;;-1:-1:-1;;;;;62585:8:0;62509:91;;;-1:-1:-1;;;;;756:32:1;;;738:51;;726:2;711:18;62509:91:0;592:203:1;65589:102:0;;;;;;;;;;-1:-1:-1;65589:102:0;;;;;:::i;:::-;;:::i;:::-;;21747:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23270:239::-;;;;;;;;;;-1:-1:-1;23270:239:0;;;;;:::i;:::-;;:::i;22835:377::-;;;;;;;;;;-1:-1:-1;22835:377:0;;;;;:::i;:::-;;:::i;58650:64::-;;;;;;;;;;-1:-1:-1;58650:64:0;;;;-1:-1:-1;;;;;58650:64:0;;;59359:43;;;;;;;;;;;;59398:4;59359:43;;;;;2510:25:1;;;2498:2;2483:18;59359:43:0;2364:177:1;60979:198:0;;;;;;;;;;;;;:::i;62627:152::-;;;;;;;;;;;;;:::i;61859:154::-;;;;;;;;;;;;;:::i;61681:148::-;;;;;;;;;;;;;:::i;67243:120::-;;;;;;;;;;-1:-1:-1;67243:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;67330:27:0;67310:4;67330:27;;;:18;:27;;;;;;;;;67243:120;58459:49;;;;;;;;;;-1:-1:-1;58459:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;65784:86;;;;;;;;;;-1:-1:-1;65784:86:0;;;;;:::i;:::-;;:::i;36801:107::-;;;;;;;;;;-1:-1:-1;36885:10:0;:17;36801:107;;59221:60;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59221:60:0;;;;;59536:46;;;;;;;;;;-1:-1:-1;59536:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24048:332;;;;;;;;;;-1:-1:-1;24048:332:0;;;;;:::i;:::-;;:::i;62104:246::-;;;;;;;;;;-1:-1:-1;62104:246:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3324:32:1;;;3306:51;;3388:2;3373:18;;3366:34;;;;3279:18;62104:246:0;3132:274:1;59286:46:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59286:46:0;;;;;36438:295;;;;;;;;;;-1:-1:-1;36438:295:0;;;;;:::i;:::-;;:::i;67634:102::-;;;;;;;;;;-1:-1:-1;67634:102:0;;;;;:::i;:::-;;:::i;68443:67::-;;;;;;;;;;;;;:::i;24443:165::-;;;;;;;;;;-1:-1:-1;24443:165:0;;;;;:::i;:::-;;:::i;33787:252::-;;;;;;;;;;-1:-1:-1;33787:252:0;;;;;:::i;:::-;;:::i;59704:57::-;;;;;;;;;;-1:-1:-1;59704:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;58777:38;;;;;;;;;;;;;;;;36977:272;;;;;;;;;;-1:-1:-1;36977:272:0;;;;;:::i;:::-;;:::i;58820:28::-;;;;;;;;;;-1:-1:-1;58820:28:0;;;;;;;;;;;3583:4:1;3571:17;;;3553:36;;3541:2;3526:18;58820:28:0;3411:184:1;66194:91:0;;;;;;;;;;-1:-1:-1;66194:91:0;;;;;:::i;:::-;;:::i;65697:81::-;;;;;;;;;;-1:-1:-1;65697:81:0;;;;;:::i;:::-;;:::i;43146:80::-;;;;;;;;;;-1:-1:-1;43213:7:0;;;;43146:80;;65448:102;;;;;;;;;;-1:-1:-1;65448:102:0;;;;;:::i;:::-;;:::i;58877:74::-;;;;;;;;;;-1:-1:-1;58877:74:0;;;;;;;-1:-1:-1;;;;;58877:74:0;;;21435:253;;;;;;;;;;-1:-1:-1;21435:253:0;;;;;:::i;:::-;;:::i;59434:34::-;;;;;;;;;;;;;;;;61453:197;;;;;;;;;;-1:-1:-1;61453:197:0;;;;;:::i;:::-;;:::i;21155:226::-;;;;;;;;;;-1:-1:-1;21155:226:0;;;;;:::i;:::-;;:::i;46806:97::-;;;;;;;;;;;;;:::i;59651:48::-;;;;;;;;;;-1:-1:-1;59651:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;59587:57;;;;;;;;;;-1:-1:-1;59587:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;66859:146;;;;;;;;;;-1:-1:-1;66859:146:0;;;;;:::i;:::-;;:::i;68316:63::-;;;;;;;;;;;;;:::i;67011:226::-;;;;;;;;;;-1:-1:-1;67011:226:0;;;;;:::i;:::-;;:::i;46195:81::-;;;;;;;;;;-1:-1:-1;46241:7:0;46264:6;-1:-1:-1;;;;;46264:6:0;46195:81;;62356:147;;;;;;;;;;;;;:::i;21902:98::-;;;;;;;;;;;;;:::i;62829:1240::-;;;;;;:::i;:::-;;:::i;65876:94::-;;;;;;;;;;-1:-1:-1;65876:94:0;;;;;:::i;:::-;;:::i;23573:167::-;;;;;;;;;;-1:-1:-1;23573:167:0;;;;;:::i;:::-;;:::i;68516:117::-;;;;;;;;;;;;;:::i;58982:74::-;;;;;;;;;;-1:-1:-1;58982:74:0;;;;-1:-1:-1;;;;;58982:74:0;;;66007:162;;;;;;;;;;-1:-1:-1;66007:162:0;;;;;:::i;:::-;;:::i;24671:321::-;;;;;;;;;;-1:-1:-1;24671:321:0;;;;;:::i;:::-;;:::i;58719:41::-;;;;;;;;;;;;;;;;59473:28;;;;;;;;;;-1:-1:-1;59473:28:0;;;;;;;;67369:259;;;;;;;;;;-1:-1:-1;67369:259:0;;;;;:::i;:::-;;:::i;66404:287::-;;;;;;;;;;-1:-1:-1;66404:287:0;;;;;:::i;:::-;;:::i;67846:132::-;;;;;;;;;;;;;:::i;23803:186::-;;;;;;;;;;-1:-1:-1;23803:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;23948:25:0;;;23925:4;23948:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23803:186;66291:107;;;;;;;;;;-1:-1:-1;66291:107:0;;;;;:::i;:::-;;:::i;47048:191::-;;;;;;;;;;-1:-1:-1;47048:191:0;;;;;:::i;:::-;;:::i;58124:49::-;;;;;;;;;;;;58169:4;58124:49;;;;;7442:6:1;7430:19;;;7412:38;;7400:2;7385:18;58124:49:0;7268:188:1;59506:23:0;;;;;;;;;;-1:-1:-1;59506:23:0;;;;;;;;;;;66697:156;;;;;;;;;;-1:-1:-1;66697:156:0;;;;;:::i;:::-;;:::i;68051:203::-;68188:4;68211:37;68235:12;68211:23;:37::i;:::-;68204:44;68051:203;-1:-1:-1;;68051:203:0:o;65589:102::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;;;;;;;;;65660:14:::1;:25:::0;;-1:-1:-1;;;;;;65660:25:0::1;-1:-1:-1::0;;;;;65660:25:0;;;::::1;::::0;;;::::1;::::0;;65589:102::o;21747:94::-;21801:13;21830:5;21823:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:94;:::o;23270:239::-;23371:7;26524:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26524:16:0;23390:73;;;;-1:-1:-1;;;23390:73:0;;8683:2:1;23390:73:0;;;8665:21:1;8722:2;8702:18;;;8695:30;8761:34;8741:18;;;8734:62;-1:-1:-1;;;8812:18:1;;;8805:42;8864:19;;23390:73:0;8481:408:1;23390:73:0;-1:-1:-1;23479:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23479:24:0;;23270:239::o;22835:377::-;22912:13;22928:23;22943:7;22928:14;:23::i;:::-;22912:39;;22972:5;-1:-1:-1;;;;;22966:11:0;:2;-1:-1:-1;;;;;22966:11:0;;;22958:57;;;;-1:-1:-1;;;22958:57:0;;9096:2:1;22958:57:0;;;9078:21:1;9135:2;9115:18;;;9108:30;9174:34;9154:18;;;9147:62;-1:-1:-1;;;9225:18:1;;;9218:31;9266:19;;22958:57:0;8894:397:1;22958:57:0;16334:10;-1:-1:-1;;;;;23040:21:0;;;;:62;;-1:-1:-1;23065:37:0;23082:5;16334:10;23803:186;:::i;23065:37::-;23024:152;;;;-1:-1:-1;;;23024:152:0;;9498:2:1;23024:152:0;;;9480:21:1;9537:2;9517:18;;;9510:30;9576:34;9556:18;;;9549:62;9647:26;9627:18;;;9620:54;9691:19;;23024:152:0;9296:420:1;23024:152:0;23185:21;23194:2;23198:7;23185:8;:21::i;:::-;22905:307;22835:377;;:::o;60979:198::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;60254:16:::1;::::0;::::1;;60253:17;:45:::0;::::1;;;-1:-1:-1::0;60274:19:0::1;::::0;:24;60253:45:::1;60237:108;;;::::0;-1:-1:-1;;;60237:108:0;;9923:2:1;60237:108:0::1;::::0;::::1;9905:21:1::0;9962:2;9942:18;;;9935:30;10001:31;9981:18;;;9974:59;10050:18;;60237:108:0::1;9721:353:1::0;60237:108:0::1;61078:15:::2;61056:19;:37:::0;;;61100:16:::2;:23:::0;;-1:-1:-1;;61100:23:0::2;61119:4;61100:23;::::0;;61135:36:::2;::::0;::::2;::::0;61100:16:::2;::::0;61135:36:::2;60979:198::o:0;62627:152::-;62672:7;62688:21;62712:19;36885:10;:17;;36801:107;62712:19;62688:43;-1:-1:-1;62745:28:0;62688:43;59398:4;62745:28;:::i;:::-;62738:35;;;62627:152;:::o;61859:154::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;60091:16:::1;::::0;::::1;;60083:54;;;;-1:-1:-1::0;;;60083:54:0::1;;;;;;;:::i;:::-;61933:16:::2;:24:::0;;-1:-1:-1;;61933:24:0::2;::::0;;61986:20:::2;:18;:20::i;:::-;61969:38;::::0;::::2;::::0;;;::::2;61859:154::o:0;61681:148::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;61761:16:::1;::::0;;-1:-1:-1;;61741:36:0;::::1;61761:16;::::0;;::::1;61760:17;61741:36:::0;;::::1;::::0;;;61789:34:::1;::::0;61806:16;;61789:34:::1;;::::0;::::1;::::0;61761:16:::1;::::0;61789:34:::1;61681:148::o:0;65784:86::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;65847:10:::1;:17:::0;65784:86::o;24048:332::-;24229:41;16334:10;24248:12;24262:7;24229:18;:41::i;:::-;24213:124;;;;-1:-1:-1;;;24213:124:0;;;;;;;:::i;:::-;24346:28;24356:4;24362:2;24366:7;24346:9;:28::i;62104:246::-;62259:14;;62296:18;;62192:16;;;;-1:-1:-1;;;;;62259:14:0;;;;58169:4;;62283:31;;:10;:31;:::i;:::-;62282:55;;;;:::i;:::-;62243:101;;;;62104:246;;;;;:::o;36438:295::-;36560:7;36603:23;36620:5;36603:16;:23::i;:::-;36595:5;:31;36579:108;;;;-1:-1:-1;;;36579:108:0;;11745:2:1;36579:108:0;;;11727:21:1;11784:2;11764:18;;;11757:30;11823:34;11803:18;;;11796:62;-1:-1:-1;;;11874:18:1;;;11867:41;11925:19;;36579:108:0;11543:407:1;36579:108:0;-1:-1:-1;;;;;;36701:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36438:295::o;67634:102::-;67693:4;26524:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26524:16:0;:30;;67713:17;26439:121;68443:67;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;68494:10:::1;:8;:10::i;:::-;68443:67::o:0;24443:165::-;24563:39;24580:4;24586:2;24590:7;24563:39;;;;;;;;;;;;:16;:39::i;33787:252::-;33905:41;16334:10;33924:12;16258:92;33905:41;33889:123;;;;-1:-1:-1;;;33889:123:0;;12157:2:1;33889:123:0;;;12139:21:1;12196:2;12176:18;;;12169:30;12235:34;12215:18;;;12208:62;-1:-1:-1;;;12286:18:1;;;12279:46;12342:19;;33889:123:0;11955:412:1;33889:123:0;34019:14;34025:7;34019:5;:14::i;:::-;33787:252;:::o;36977:272::-;37077:7;37120:30;36885:10;:17;;36801:107;37120:30;37112:5;:38;37096:116;;;;-1:-1:-1;;;37096:116:0;;12574:2:1;37096:116:0;;;12556:21:1;12613:2;12593:18;;;12586:30;12652:34;12632:18;;;12625:62;-1:-1:-1;;;12703:18:1;;;12696:42;12755:19;;37096:116:0;12372:408:1;37096:116:0;37226:10;37237:5;37226:17;;;;;;;;:::i;:::-;;;;;;;;;37219:24;;36977:272;;;:::o;66194:91::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;66260:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;66194:91:::0;:::o;65697:81::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;65760:4:::1;:12:::0;;-1:-1:-1;;;;;;65760:12:0::1;-1:-1:-1::0;;;;;65760:12:0;;;::::1;::::0;;;::::1;::::0;;65697:81::o;65448:102::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;65519:14:::1;:25:::0;;-1:-1:-1;;;;;65519:25:0;;::::1;;;-1:-1:-1::0;;;;;;65519:25:0;;::::1;::::0;;;::::1;::::0;;65448:102::o;21435:253::-;21532:7;21567:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21567:16:0;21598:19;21590:73;;;;-1:-1:-1;;;21590:73:0;;13119:2:1;21590:73:0;;;13101:21:1;13158:2;13138:18;;;13131:30;13197:34;13177:18;;;13170:62;-1:-1:-1;;;13248:18:1;;;13241:39;13297:19;;21590:73:0;12917:405:1;61453:197:0;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;61554:19:::1;:42:::0;;;61608:36:::1;::::0;61576:20;;61608:36:::1;::::0;;;::::1;61453:197:::0;:::o;21155:226::-;21252:7;-1:-1:-1;;;;;21279:19:0;;21271:74;;;;-1:-1:-1;;;21271:74:0;;13529:2:1;21271:74:0;;;13511:21:1;13568:2;13548:18;;;13541:30;13607:34;13587:18;;;13580:62;-1:-1:-1;;;13658:18:1;;;13651:40;13708:19;;21271:74:0;13327:406:1;21271:74:0;-1:-1:-1;;;;;;21359:16:0;;;;;:9;:16;;;;;;;21155:226::o;46806:97::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;46867:30:::1;46894:1;46867:18;:30::i;66859:146::-:0;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66961:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:38;;-1:-1:-1;;66961:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66859:146::o;68316:63::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;68365:8:::1;:6;:8::i;67011:226::-:0;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;67132:9:::1;67127:105;67151:8;:15;67147:1;:19;67127:105;;;67212:12;67182:14;:27;67197:8;67206:1;67197:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;67182:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;67182:27:0;:42;;-1:-1:-1;;67182:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67168:3;::::1;::::0;::::1;:::i;:::-;;;;67127:105;;62356:147:::0;62407:7;62452:1;62430:19;;:23;:67;;-1:-1:-1;62496:1:0;;62356:147::o;62430:67::-;62474:19;;62456:37;;:15;:37;:::i;:::-;62423:74;;62356:147;:::o;21902:98::-;21958:13;21987:7;21980:14;;;;;:::i;62829:1240::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;60470:23;;:43;;-1:-1:-1;60497:16:0;;;;60470:43;60454:102;;;;-1:-1:-1;;;60454:102:0;;;;;;;:::i;:::-;62910:13:::1;46264:6:::0;-1:-1:-1;;;;;46264:6:0;16334:10;62926:23:::1;::::0;;62964:36:::1;;;62999:1;62976:20;:18;:20::i;:::-;:24;62964:36;62956:64;;;::::0;-1:-1:-1;;;62956:64:0;;14080:2:1;62956:64:0::1;::::0;::::1;14062:21:1::0;14119:2;14099:18;;;14092:30;-1:-1:-1;;;14138:18:1;;;14131:45;14193:18;;62956:64:0::1;13878:339:1::0;62956:64:0::1;63043:8;:73;;;-1:-1:-1::0;16334:10:0;63073:28:::1;::::0;;;:14:::1;:28;::::0;;;;;:43:::1;::::0;58217:6:::1;::::0;63073:43:::1;:::i;:::-;63055:15;:61;63043:73;63027:139;;;::::0;-1:-1:-1;;;63027:139:0;;14557:2:1;63027:139:0::1;::::0;::::1;14539:21:1::0;;;14576:18;;;14569:30;14635:34;14615:18;;;14608:62;14687:18;;63027:139:0::1;14355:356:1::0;63027:139:0::1;63199:1;63189:7;:11;:50;;;;;63205:8;:33;;;-1:-1:-1::0;63228:10:0::1;::::0;::::1;;63217:21:::0;::::1;;63205:33;63173:135;;;::::0;-1:-1:-1;;;63173:135:0;;14918:2:1;63173:135:0::1;::::0;::::1;14900:21:1::0;14957:2;14937:18;;;14930:30;14996:34;14976:18;;;14969:62;-1:-1:-1;;;15047:18:1;;;15040:49;15106:19;;63173:135:0::1;14716:415:1::0;63173:135:0::1;63379:14;:12;:14::i;:::-;63368:7;:25;;63360:69;;;::::0;-1:-1:-1;;;63360:69:0;;15338:2:1;63360:69:0::1;::::0;::::1;15320:21:1::0;15377:2;15357:18;;;15350:30;15416:33;15396:18;;;15389:61;15467:18;;63360:69:0::1;15136:355:1::0;63360:69:0::1;16334:10:::0;63438:28:::1;::::0;;;:14:::1;:28;::::0;;;;;;;63469:15:::1;63438:46:::0;;63568:14:::1;:28:::0;;;;;;::::1;;:73:::0;::::1;;;-1:-1:-1::0;16334:10:0;63600:36:::1;::::0;;;:22:::1;:36;::::0;;;;;:41;63568:73:::1;63556:238;;;16334:10:::0;63658:36:::1;::::0;;;:22:::1;:36;::::0;;;;63697:15:::1;63658:54:::0;;63721:23:::1;63732:11;63742:1;63732:7:::0;:11:::1;:::i;:::-;63721:10;:23::i;:::-;63556:238;;;63767:19;63778:7;63767:10;:19::i;:::-;63807:9;63802:262;63826:7;63822:1;:11;63802:262;;;63849:21;:9;48620:19:::0;;48638:1;48620:19;;;48541:111;63849:21:::1;63901:44;16334:10:::0;63925:9:::1;48515:14:::0;63901:9:::1;:44::i;:::-;64041:15;64004:13;:34;64018:19;:9;48515:14:::0;;48427:108;64018:19:::1;64004:34:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64004:34:0;:52;63835:3;::::1;::::0;::::1;:::i;:::-;;;;63802:262;;65876:94:::0;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;65943:8:::1;:21:::0;65876:94::o;23573:167::-;23682:52;16334:10;23715:8;23725;23682:18;:52::i;68516:117::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;68569:11:::1;::::0;::::1;::::0;::::1;;;68568:12;68560:42;;;::::0;-1:-1:-1;;;68560:42:0;;15698:2:1;68560:42:0::1;::::0;::::1;15680:21:1::0;15737:2;15717:18;;;15710:30;-1:-1:-1;;;15756:18:1;;;15749:47;15813:18;;68560:42:0::1;15496:341:1::0;68560:42:0::1;68609:11;:18:::0;;-1:-1:-1;;68609:18:0::1;;;::::0;;68516:117::o;66007:162::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;66086:18:::1;:33:::0;;;66131:32:::1;::::0;66107:12;;66131:32:::1;::::0;;;::::1;66007:162:::0;:::o;24671:321::-;24832:41;16334:10;24865:7;24832:18;:41::i;:::-;24816:124;;;;-1:-1:-1;;;24816:124:0;;;;;;;:::i;:::-;24947:39;24961:4;24967:2;24971:7;24980:5;24947:13;:39::i;:::-;24671:321;;;;:::o;67369:259::-;26504:4;26524:16;;;:7;:16;;;;;;67468:13;;-1:-1:-1;;;;;26524:16:0;67493:47;;;;-1:-1:-1;;;67493:47:0;;16044:2:1;67493:47:0;;;16026:21:1;16083:2;16063:18;;;16056:30;-1:-1:-1;;;16102:18:1;;;16095:47;16159:18;;67493:47:0;15842:341:1;67493:47:0;67580:10;:8;:10::i;:::-;67592:19;:8;:17;:19::i;:::-;67563:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67549:73;;67369:259;;;:::o;66404:287::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66506:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;:41;;-1:-1:-1;;66506:41:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;66554:132:::1;;66580:8;::::0;:29:::1;::::0;-1:-1:-1;;;66580:29:0;;-1:-1:-1;;;;;3324:32:1;;;66580:29:0::1;::::0;::::1;3306:51:1::0;66580:8:0::1;3373:18:1::0;;;3366:34;66580:8:0;;::::1;::::0;:17:::1;::::0;3279:18:1;;66580:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66260:19;66194:91:::0;:::o;66554:132::-:1;66632:8;::::0;-1:-1:-1;;;;;66632:8:0::1;:17;66650:7:::0;66659:18:::1;66650:7:::0;66659:9:::1;:18::i;:::-;66632:46;::::0;-1:-1:-1;;;;;;66632:46:0::1;::::0;;;;;;-1:-1:-1;;;;;3324:32:1;;;66632:46:0::1;::::0;::::1;3306:51:1::0;3373:18;;;3366:34;3279:18;;66632:46:0::1;3132:274:1::0;67846:132:0;67890:13;67943:10;:8;:10::i;:::-;67926:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;67912:60;;67846:132;:::o;66291:107::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;66356:8:::1;:36:::0;;-1:-1:-1;;;;;;66356:36:0::1;-1:-1:-1::0;;;;;66356:36:0;;;::::1;::::0;;;::::1;::::0;;66291:107::o;47048:191::-;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47133:22:0;::::1;47125:73;;;::::0;-1:-1:-1;;;47125:73:0;;17776:2:1;47125:73:0::1;::::0;::::1;17758:21:1::0;17815:2;17795:18;;;17788:30;17854:34;17834:18;;;17827:62;-1:-1:-1;;;17905:18:1;;;17898:36;17951:19;;47125:73:0::1;17574:402:1::0;47125:73:0::1;47205:28;47224:8;47205:18;:28::i;66697:156::-:0;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;46397:23;46389:68;;;;-1:-1:-1;;;46389:68:0;;;;;;;:::i;:::-;66766:10:::1;::::0;::::1;;66758:65;;;::::0;-1:-1:-1;;;66758:65:0;;18183:2:1;66758:65:0::1;::::0;::::1;18165:21:1::0;18222:2;18202:18;;;18195:30;18261:34;18241:18;;;18234:62;-1:-1:-1;;;18312:18:1;;;18305:36;18358:19;;66758:65:0::1;17981:402:1::0;66758:65:0::1;66830:10;:17:::0;;-1:-1:-1;;66830:17:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;66697:156::o;36102:260::-;36229:4;-1:-1:-1;;;;;;36259:50:0;;-1:-1:-1;;;36259:50:0;;:97;;;36320:36;36344:11;36320:23;:36::i;30325:164::-;30396:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30396:29:0;-1:-1:-1;;;;;30396:29:0;;;;;;;;:24;;30446:23;30396:24;30446:14;:23::i;:::-;-1:-1:-1;;;;;30437:46:0;;;;;;;;;;;30325:164;;:::o;26711:371::-;26824:4;26524:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26524:16:0;26840:73;;;;-1:-1:-1;;;26840:73:0;;18590:2:1;26840:73:0;;;18572:21:1;18629:2;18609:18;;;18602:30;18668:34;18648:18;;;18641:62;-1:-1:-1;;;18719:18:1;;;18712:42;18771:19;;26840:73:0;18388:408:1;26840:73:0;26920:13;26936:23;26951:7;26936:14;:23::i;:::-;26920:39;;26985:5;-1:-1:-1;;;;;26974:16:0;:7;-1:-1:-1;;;;;26974:16:0;;:58;;;;27025:7;-1:-1:-1;;;;;27001:31:0;:20;27013:7;27001:11;:20::i;:::-;-1:-1:-1;;;;;27001:31:0;;26974:58;:101;;;-1:-1:-1;;;;;;23948:25:0;;;23925:4;23948:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27043:32;26966:110;26711:371;-1:-1:-1;;;;26711:371:0:o;29629:590::-;29778:4;-1:-1:-1;;;;;29751:31:0;:23;29766:7;29751:14;:23::i;:::-;-1:-1:-1;;;;;29751:31:0;;29735:102;;;;-1:-1:-1;;;29735:102:0;;19003:2:1;29735:102:0;;;18985:21:1;19042:2;19022:18;;;19015:30;19081:34;19061:18;;;19054:62;-1:-1:-1;;;19132:18:1;;;19125:35;19177:19;;29735:102:0;18801:401:1;29735:102:0;-1:-1:-1;;;;;29852:16:0;;29844:65;;;;-1:-1:-1;;;29844:65:0;;19409:2:1;29844:65:0;;;19391:21:1;19448:2;19428:18;;;19421:30;19487:34;19467:18;;;19460:62;-1:-1:-1;;;19538:18:1;;;19531:34;19582:19;;29844:65:0;19207:400:1;29844:65:0;29918:39;29939:4;29945:2;29949:7;29918:20;:39::i;:::-;30014:29;30031:1;30035:7;30014:8;:29::i;:::-;-1:-1:-1;;;;;30052:15:0;;;;;;:9;:15;;;;;:20;;30071:1;;30052:15;:20;;30071:1;;30052:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30079:13:0;;;;;;:9;:13;;;;;:18;;30096:1;;30079:13;:18;;30096:1;;30079:18;:::i;:::-;;;;-1:-1:-1;;30104:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30104:21:0;-1:-1:-1;;;;;30104:21:0;;;;;;;;;30139:27;;30104:16;;30139:27;;;;;;;30175:38;30195:4;30201:2;30205:7;30175:19;:38::i;44105:110::-;43213:7;;;;43689:41;;;;-1:-1:-1;;;43689:41:0;;19814:2:1;43689:41:0;;;19796:21:1;19853:2;19833:18;;;19826:30;-1:-1:-1;;;19872:18:1;;;19865:50;19932:18;;43689:41:0;19612:344:1;43689:41:0;44160:7:::1;:15:::0;;-1:-1:-1;;44160:15:0::1;::::0;;44187:22:::1;16334:10:::0;44196:12:::1;44187:22;::::0;-1:-1:-1;;;;;756:32:1;;;738:51;;726:2;711:18;44187:22:0::1;;;;;;;44105:110::o:0;28930:386::-;28986:13;29002:23;29017:7;29002:14;:23::i;:::-;28986:39;;29034:48;29055:5;29070:1;29074:7;29034:20;:48::i;:::-;29115:29;29132:1;29136:7;29115:8;:29::i;:::-;-1:-1:-1;;;;;29153:16:0;;;;;;:9;:16;;;;;:21;;29173:1;;29153:16;:21;;29173:1;;29153:21;:::i;:::-;;;;-1:-1:-1;;29188:16:0;;;;:7;:16;;;;;;29181:23;;-1:-1:-1;;;;;;29181:23:0;;;29218:36;29196:7;;29188:16;-1:-1:-1;;;;;29218:36:0;;;;;29188:16;;29218:36;29263:47;29283:5;29298:1;29302:7;29263:19;:47::i;47389:177::-;47459:16;47478:6;;-1:-1:-1;;;;;47491:17:0;;;-1:-1:-1;;;;;;47491:17:0;;;;;;47520:40;;47478:6;;;;;;;47520:40;;47459:16;47520:40;47452:114;47389:177;:::o;43872:108::-;43213:7;;;;43445:9;43437:38;;;;-1:-1:-1;;;43437:38:0;;20163:2:1;43437:38:0;;;20145:21:1;20202:2;20182:18;;;20175:30;-1:-1:-1;;;20221:18:1;;;20214:46;20277:18;;43437:38:0;19961:340:1;43437:38:0;43928:7:::1;:14:::0;;-1:-1:-1;;43928:14:0::1;43938:4;43928:14;::::0;;43954:20:::1;43961:12;16334:10:::0;;16258:92;64075:1367;46241:7;46264:6;-1:-1:-1;;;;;46264:6:0;16334:10;60470:23;;:43;;-1:-1:-1;60497:16:0;;;;60470:43;60454:102;;;;-1:-1:-1;;;60454:102:0;;;;;;;:::i;:::-;64174:1:::1;64164:7;:11;64156:44;;;::::0;-1:-1:-1;;;64156:44:0;;20508:2:1;64156:44:0::1;::::0;::::1;20490:21:1::0;20547:2;20527:18;;;20520:30;-1:-1:-1;;;20566:18:1;;;20559:50;20626:18;;64156:44:0::1;20306:344:1::0;64156:44:0::1;64207:12;46264:6:::0;-1:-1:-1;;;;;46264:6:0;16334:10;64222:23:::1;64252:135:::0;::::1;;;64278:9;:13:::0;64274:91:::1;;64304:51;16334:10:::0;64330:12:::1;64345:9;64304:17;:51::i;64252:135::-;64433:4;::::0;64471:10:::1;::::0;-1:-1:-1;;;;;64433:4:0;;::::1;::::0;64395:22:::1;::::0;64471:20:::1;::::0;64484:7;;64471:20:::1;:::i;:::-;64445:46;;64498:21;64533:7;64522:8;;:18;;;;:::i;:::-;64498:42:::0;-1:-1:-1;64553:19:0;;64549:663:::1;;64614:15;64601:9;:28;;64583:108;;;::::0;-1:-1:-1;;;64583:108:0;;20857:2:1;64583:108:0::1;::::0;::::1;20839:21:1::0;20896:2;20876:18;;;20869:30;20935:34;20915:18;;;20908:62;-1:-1:-1;;;20986:18:1;;;20979:38;21034:19;;64583:108:0::1;20655:404:1::0;64583:108:0::1;64780:14;::::0;64724:21:::1;::::0;64754:59:::1;::::0;64780:14:::1;::::0;::::1;-1:-1:-1::0;;;;;64780:14:0::1;64797:15:::0;64754:17:::1;:59::i;:::-;64886:15;64874:9;:27;64870:123;;;64914:69;16334:10:::0;64955:27:::1;64967:15:::0;64955:9:::1;:27;:::i;:::-;64914:17;:69::i;:::-;65044:25;65060:9;65044:13:::0;:25:::1;:::i;:::-;65019:21;:50;;65001:110;;;::::0;-1:-1:-1;;;65001:110:0;;21266:2:1;65001:110:0::1;::::0;::::1;21248:21:1::0;21305:2;21285:18;;;21278:30;-1:-1:-1;;;21324:18:1;;;21317:50;21384:18;;65001:110:0::1;21064:344:1::0;65001:110:0::1;64574:545;64549:663;;;65129:9;:13:::0;65125:87:::1;;65153:51;16334:10:::0;65179:12:::1;16258:92:::0;65153:51:::1;65224:17:::0;;65220:217:::1;;65307:13:::0;-1:-1:-1;;;;;65270:19:0;::::1;;16334:10:::0;65270:33:::1;::::0;-1:-1:-1;;;;;;65270:33:0::1;::::0;;;;;;-1:-1:-1;;;;;756:32:1;;;65270:33:0::1;::::0;::::1;738:51:1::0;711:18;;65270:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;65252:121;;;::::0;-1:-1:-1;;;65252:121:0;;21804:2:1;65252:121:0::1;::::0;::::1;21786:21:1::0;21843:2;21823:18;;;21816:30;21882:33;21862:18;;;21855:61;21933:18;;65252:121:0::1;21602:355:1::0;65252:121:0::1;-1:-1:-1::0;;;;;65382:18:0;::::1;;16334:10:::0;65382:47:::1;::::0;-1:-1:-1;;;;;;65382:47:0::1;::::0;;;;;;-1:-1:-1;;;;;3324:32:1;;;65382:47:0::1;::::0;::::1;3306:51:1::0;3373:18;;;3366:34;;;3279:18;;65382:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65220:217;64149:1293;;;;64075:1367:::0;:::o;27402:104::-;27474:26;27484:2;27488:7;27474:26;;;;;;;;;;;;:9;:26::i;30619:287::-;30756:8;-1:-1:-1;;;;;30747:17:0;:5;-1:-1:-1;;;;;30747:17:0;;;30739:55;;;;-1:-1:-1;;;30739:55:0;;22164:2:1;30739:55:0;;;22146:21:1;22203:2;22183:18;;;22176:30;22242:27;22222:18;;;22215:55;22287:18;;30739:55:0;21962:349:1;30739:55:0;-1:-1:-1;;;;;30801:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30801:46:0;;;;;;;;;;30859:41;;540::1;;;30859::0;;513:18:1;30859:41:0;;;;;;;30619:287;;;:::o;25836:308::-;25971:28;25981:4;25987:2;25991:7;25971:9;:28::i;:::-;26022:48;26045:4;26051:2;26055:7;26064:5;26022:22;:48::i;:::-;26006:132;;;;-1:-1:-1;;;26006:132:0;;;;;;;:::i;69000:99::-;69052:13;69081:12;69074:19;;;;;:::i;16817:637::-;16873:13;17082:10;17078:43;;-1:-1:-1;;17103:10:0;;;;;;;;;;;;-1:-1:-1;;;17103:10:0;;;;;16817:637::o;17078:43::-;17142:5;17127:12;17175:62;17182:9;;17175:62;;17202:8;;;;:::i;:::-;;-1:-1:-1;17219:10:0;;-1:-1:-1;17227:2:0;17219:10;;:::i;:::-;;;17175:62;;;17243:19;17275:6;17265:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17265:17:0;;17243:39;;17289:132;17296:10;;17289:132;;17317:11;17327:1;17317:11;;:::i;:::-;;-1:-1:-1;17380:10:0;17388:2;17380:5;:10;:::i;:::-;17367:24;;:2;:24;:::i;:::-;17354:39;;17337:6;17344;17337:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17337:56:0;;;;;;;;-1:-1:-1;17402:11:0;17411:2;17402:11;;:::i;:::-;;;17289:132;;20790:309;20917:4;-1:-1:-1;;;;;;20947:40:0;;-1:-1:-1;;;20947:40:0;;:99;;-1:-1:-1;;;;;;;20998:48:0;;-1:-1:-1;;;20998:48:0;20947:99;:146;;;-1:-1:-1;;;;;;;;;;19394:40:0;;;21057:36;19261:179;69137:334;69358:32;;;;:22;:32;;;;;69393:15;69358:50;;69417:48;69444:5;69451:3;69381:8;69417:26;:48::i;69508:227::-;69644:29;69662:5;69669:3;69644:17;:29::i;9810:326::-;9921:6;9896:21;:31;;9888:73;;;;-1:-1:-1;;;9888:73:0;;23054:2:1;9888:73:0;;;23036:21:1;23093:2;23073:18;;;23066:30;23132:31;23112:18;;;23105:59;23181:18;;9888:73:0;22852:353:1;9888:73:0;9971:12;9989:9;-1:-1:-1;;;;;9989:14:0;10012:6;9989:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9970:54;;;10047:7;10031:99;;;;-1:-1:-1;;;10031:99:0;;23622:2:1;10031:99:0;;;23604:21:1;23661:2;23641:18;;;23634:30;23700:34;23680:18;;;23673:62;23771:28;23751:18;;;23744:56;23817:19;;10031:99:0;23420:422:1;27723:281:0;27835:18;27841:2;27845:7;27835:5;:18::i;:::-;27876:54;27907:1;27911:2;27915:7;27924:5;27876:22;:54::i;:::-;27860:138;;;;-1:-1:-1;;;27860:138:0;;;;;;;:::i;31449:685::-;31586:4;-1:-1:-1;;;;;31603:13:0;;8880:19;:23;31599:530;;31642:72;;-1:-1:-1;;;31642:72:0;;-1:-1:-1;;;;;31642:36:0;;;;;:72;;16334:10;;31693:4;;31699:7;;31708:5;;31642:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31642:72:0;;;;;;;;-1:-1:-1;;31642:72:0;;;;;;;;;;;;:::i;:::-;;;31629:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31869:13:0;;31865:214;;31902:60;;-1:-1:-1;;;31902:60:0;;;;;;;:::i;31865:214::-;32047:6;32041:13;32032:6;32028:2;32024:15;32017:38;31629:459;-1:-1:-1;;;;;;31764:51:0;-1:-1:-1;;;31764:51:0;;-1:-1:-1;31757:58:0;;31599:530;-1:-1:-1;32117:4:0;31449:685;;;;;;:::o;44884:251::-;45010:45;45037:4;45043:2;45047:7;45010:26;:45::i;:::-;43213:7;;;;45072:9;45064:65;;;;-1:-1:-1;;;45064:65:0;;24797:2:1;45064:65:0;;;24779:21:1;24836:2;24816:18;;;24809:30;24875:34;24855:18;;;24848:62;-1:-1:-1;;;24926:18:1;;;24919:41;24977:19;;45064:65:0;24595:407:1;68673:302:0;-1:-1:-1;;;;;68749:25:0;;;;;;:18;:25;;;;;;;;68748:26;:49;;;;-1:-1:-1;;;;;;68778:19:0;;;;68748:49;68744:114;;;68808:8;;-1:-1:-1;;;;;68808:8:0;:17;68826:5;68833:16;68826:5;68833:9;:16::i;:::-;68808:42;;-1:-1:-1;;;;;;68808:42:0;;;;;;;-1:-1:-1;;;;;3324:32:1;;;68808:42:0;;;3306:51:1;3373:18;;;3366:34;3279:18;;68808:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68744:114;-1:-1:-1;;;;;68869:23:0;;;;;;:18;:23;;;;;;;;68868:24;:45;;;;-1:-1:-1;;;;;;68896:17:0;;;;68868:45;68864:106;;;68924:8;;-1:-1:-1;;;;;68924:8:0;:17;68942:3;68947:14;68942:3;68947:9;:14::i;28314:409::-;-1:-1:-1;;;;;28390:16:0;;28382:61;;;;-1:-1:-1;;;28382:61:0;;25209:2:1;28382:61:0;;;25191:21:1;;;25228:18;;;25221:30;25287:34;25267:18;;;25260:62;25339:18;;28382:61:0;25007:356:1;28382:61:0;26504:4;26524:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26524:16:0;:30;28450:58;;;;-1:-1:-1;;;28450:58:0;;25570:2:1;28450:58:0;;;25552:21:1;25609:2;25589:18;;;25582:30;25648;25628:18;;;25621:58;25696:18;;28450:58:0;25368:352:1;28450:58:0;28517:45;28546:1;28550:2;28554:7;28517:20;:45::i;:::-;-1:-1:-1;;;;;28571:13:0;;;;;;:9;:13;;;;;:18;;28588:1;;28571:13;:18;;28588:1;;28571:18;:::i;:::-;;;;-1:-1:-1;;28596:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28596:21:0;-1:-1:-1;;;;;28596:21:0;;;;;;;;28631:33;;28596:16;;;28631:33;;28596:16;;28631:33;28673:44;28701:1;28705:2;28709:7;28673:19;:44::i;37830:521::-;-1:-1:-1;;;;;38014:18:0;;38010:167;;38043:40;38075:7;39138:10;:17;;39111:24;;;;:15;:24;;;;;:44;;;39162:24;;;;;;;;;;;;39038:154;38043:40;38010:167;;;38109:2;-1:-1:-1;;;;;38101:10:0;:4;-1:-1:-1;;;;;38101:10:0;;38097:80;;38122:47;38155:4;38161:7;38122:32;:47::i;:::-;-1:-1:-1;;;;;38187:16:0;;38183:163;;38214:45;38251:7;38214:36;:45::i;38183:163::-;38283:4;-1:-1:-1;;;;;38277:10:0;:2;-1:-1:-1;;;;;38277:10:0;;38273:73;;38298:40;38326:2;38330:7;38298:27;:40::i;39801:936::-;40063:22;40113:1;40088:22;40105:4;40088:16;:22::i;:::-;:26;;;;:::i;:::-;40121:18;40142:26;;;:17;:26;;;;;;40063:51;;-1:-1:-1;40267:28:0;;;40263:306;;-1:-1:-1;;;;;40328:18:0;;40306:19;40328:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40373:30;;;;;;:44;;;40484:30;;:17;:30;;;;;:43;;;40263:306;-1:-1:-1;40657:26:0;;;;:17;:26;;;;;;;;40650:33;;;-1:-1:-1;;;;;40697:18:0;;;;;:12;:18;;;;;:34;;;;;;;40690:41;39801:936::o;41020:1025::-;41286:10;:17;41261:22;;41286:21;;41306:1;;41286:21;:::i;:::-;41314:18;41335:24;;;:15;:24;;;;;;41692:10;:26;;41261:46;;-1:-1:-1;41335:24:0;;41261:46;;41692:26;;;;;;:::i;:::-;;;;;;;;;41670:48;;41752:11;41727:10;41738;41727:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41828:28;;;:15;:28;;;;;;;:41;;;41992:24;;;;;41985:31;42023:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41091:954;;;41020:1025;:::o;38640:207::-;38721:14;38738:20;38755:2;38738:16;:20::i;:::-;-1:-1:-1;;;;;38765:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38806:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38640:207:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;800:173::-;868:20;;-1:-1:-1;;;;;917:31:1;;907:42;;897:70;;963:1;960;953:12;897:70;800:173;;;:::o;978:186::-;1037:6;1090:2;1078:9;1069:7;1065:23;1061:32;1058:52;;;1106:1;1103;1096:12;1058:52;1129:29;1148:9;1129:29;:::i;1169:258::-;1241:1;1251:113;1265:6;1262:1;1259:13;1251:113;;;1341:11;;;1335:18;1322:11;;;1315:39;1287:2;1280:10;1251:113;;;1382:6;1379:1;1376:13;1373:48;;;-1:-1:-1;;1417:1:1;1399:16;;1392:27;1169:258::o;1432:::-;1474:3;1512:5;1506:12;1539:6;1534:3;1527:19;1555:63;1611:6;1604:4;1599:3;1595:14;1588:4;1581:5;1577:16;1555:63;:::i;:::-;1672:2;1651:15;-1:-1:-1;;1647:29:1;1638:39;;;;1679:4;1634:50;;1432:258;-1:-1:-1;;1432:258:1:o;1695:220::-;1844:2;1833:9;1826:21;1807:4;1864:45;1905:2;1894:9;1890:18;1882:6;1864:45;:::i;1920:180::-;1979:6;2032:2;2020:9;2011:7;2007:23;2003:32;2000:52;;;2048:1;2045;2038:12;2000:52;-1:-1:-1;2071:23:1;;1920:180;-1:-1:-1;1920:180:1:o;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:248::-;2947:6;2955;3008:2;2996:9;2987:7;2983:23;2979:32;2976:52;;;3024:1;3021;3014:12;2976:52;-1:-1:-1;;3047:23:1;;;3117:2;3102:18;;;3089:32;;-1:-1:-1;2879:248:1:o;3600:127::-;3661:10;3656:3;3652:20;3649:1;3642:31;3692:4;3689:1;3682:15;3716:4;3713:1;3706:15;3732:275;3803:2;3797:9;3868:2;3849:13;;-1:-1:-1;;3845:27:1;3833:40;;3903:18;3888:34;;3924:22;;;3885:62;3882:88;;;3950:18;;:::i;:::-;3986:2;3979:22;3732:275;;-1:-1:-1;3732:275:1:o;4012:407::-;4077:5;4111:18;4103:6;4100:30;4097:56;;;4133:18;;:::i;:::-;4171:57;4216:2;4195:15;;-1:-1:-1;;4191:29:1;4222:4;4187:40;4171:57;:::i;:::-;4162:66;;4251:6;4244:5;4237:21;4291:3;4282:6;4277:3;4273:16;4270:25;4267:45;;;4308:1;4305;4298:12;4267:45;4357:6;4352:3;4345:4;4338:5;4334:16;4321:43;4411:1;4404:4;4395:6;4388:5;4384:18;4380:29;4373:40;4012:407;;;;;:::o;4424:451::-;4493:6;4546:2;4534:9;4525:7;4521:23;4517:32;4514:52;;;4562:1;4559;4552:12;4514:52;4602:9;4589:23;4635:18;4627:6;4624:30;4621:50;;;4667:1;4664;4657:12;4621:50;4690:22;;4743:4;4735:13;;4731:27;-1:-1:-1;4721:55:1;;4772:1;4769;4762:12;4721:55;4795:74;4861:7;4856:2;4843:16;4838:2;4834;4830:11;4795:74;:::i;4880:160::-;4945:20;;5001:13;;4994:21;4984:32;;4974:60;;5030:1;5027;5020:12;5045:254;5110:6;5118;5171:2;5159:9;5150:7;5146:23;5142:32;5139:52;;;5187:1;5184;5177:12;5139:52;5210:29;5229:9;5210:29;:::i;:::-;5200:39;;5258:35;5289:2;5278:9;5274:18;5258:35;:::i;:::-;5248:45;;5045:254;;;;;:::o;5304:1022::-;5394:6;5402;5455:2;5443:9;5434:7;5430:23;5426:32;5423:52;;;5471:1;5468;5461:12;5423:52;5511:9;5498:23;5540:18;5581:2;5573:6;5570:14;5567:34;;;5597:1;5594;5587:12;5567:34;5635:6;5624:9;5620:22;5610:32;;5680:7;5673:4;5669:2;5665:13;5661:27;5651:55;;5702:1;5699;5692:12;5651:55;5738:2;5725:16;5760:4;5783:2;5779;5776:10;5773:36;;;5789:18;;:::i;:::-;5835:2;5832:1;5828:10;5818:20;;5858:28;5882:2;5878;5874:11;5858:28;:::i;:::-;5920:15;;;5990:11;;;5986:20;;;5951:12;;;;6018:19;;;6015:39;;;6050:1;6047;6040:12;6015:39;6074:11;;;;6094:148;6110:6;6105:3;6102:15;6094:148;;;6176:23;6195:3;6176:23;:::i;:::-;6164:36;;6127:12;;;;6220;;;;6094:148;;;6261:5;-1:-1:-1;6285:35:1;;-1:-1:-1;6301:18:1;;;6285:35;:::i;:::-;6275:45;;;;;;5304:1022;;;;;:::o;6331:667::-;6426:6;6434;6442;6450;6503:3;6491:9;6482:7;6478:23;6474:33;6471:53;;;6520:1;6517;6510:12;6471:53;6543:29;6562:9;6543:29;:::i;:::-;6533:39;;6591:38;6625:2;6614:9;6610:18;6591:38;:::i;:::-;6581:48;;6676:2;6665:9;6661:18;6648:32;6638:42;;6731:2;6720:9;6716:18;6703:32;6758:18;6750:6;6747:30;6744:50;;;6790:1;6787;6780:12;6744:50;6813:22;;6866:4;6858:13;;6854:27;-1:-1:-1;6844:55:1;;6895:1;6892;6885:12;6844:55;6918:74;6984:7;6979:2;6966:16;6961:2;6957;6953:11;6918:74;:::i;:::-;6908:84;;;6331:667;;;;;;;:::o;7003:260::-;7071:6;7079;7132:2;7120:9;7111:7;7107:23;7103:32;7100:52;;;7148:1;7145;7138:12;7100:52;7171:29;7190:9;7171:29;:::i;:::-;7161:39;;7219:38;7253:2;7242:9;7238:18;7219:38;:::i;7461:269::-;7518:6;7571:2;7559:9;7550:7;7546:23;7542:32;7539:52;;;7587:1;7584;7577:12;7539:52;7626:9;7613:23;7676:4;7669:5;7665:16;7658:5;7655:27;7645:55;;7696:1;7693;7686:12;7735:356;7937:2;7919:21;;;7956:18;;;7949:30;8015:34;8010:2;7995:18;;7988:62;8082:2;8067:18;;7735:356::o;8096:380::-;8175:1;8171:12;;;;8218;;;8239:61;;8293:4;8285:6;8281:17;8271:27;;8239:61;8346:2;8338:6;8335:14;8315:18;8312:38;8309:161;;;8392:10;8387:3;8383:20;8380:1;8373:31;8427:4;8424:1;8417:15;8455:4;8452:1;8445:15;8309:161;;8096:380;;;:::o;10079:127::-;10140:10;10135:3;10131:20;10128:1;10121:31;10171:4;10168:1;10161:15;10195:4;10192:1;10185:15;10211:125;10251:4;10279:1;10276;10273:8;10270:34;;;10284:18;;:::i;:::-;-1:-1:-1;10321:9:1;;10211:125::o;10341:349::-;10543:2;10525:21;;;10582:2;10562:18;;;10555:30;10621:27;10616:2;10601:18;;10594:55;10681:2;10666:18;;10341:349::o;10695:413::-;10897:2;10879:21;;;10936:2;10916:18;;;10909:30;10975:34;10970:2;10955:18;;10948:62;-1:-1:-1;;;11041:2:1;11026:18;;11019:47;11098:3;11083:19;;10695:413::o;11113:168::-;11153:7;11219:1;11215;11211:6;11207:14;11204:1;11201:21;11196:1;11189:9;11182:17;11178:45;11175:71;;;11226:18;;:::i;:::-;-1:-1:-1;11266:9:1;;11113:168::o;11286:127::-;11347:10;11342:3;11338:20;11335:1;11328:31;11378:4;11375:1;11368:15;11402:4;11399:1;11392:15;11418:120;11458:1;11484;11474:35;;11489:18;;:::i;:::-;-1:-1:-1;11523:9:1;;11418:120::o;12785:127::-;12846:10;12841:3;12837:20;12834:1;12827:31;12877:4;12874:1;12867:15;12901:4;12898:1;12891:15;13738:135;13777:3;-1:-1:-1;;13798:17:1;;13795:43;;;13818:18;;:::i;:::-;-1:-1:-1;13865:1:1;13854:13;;13738:135::o;14222:128::-;14262:3;14293:1;14289:6;14286:1;14283:13;14280:39;;;14299:18;;:::i;:::-;-1:-1:-1;14335:9:1;;14222:128::o;16188:637::-;16468:3;16506:6;16500:13;16522:53;16568:6;16563:3;16556:4;16548:6;16544:17;16522:53;:::i;:::-;16638:13;;16597:16;;;;16660:57;16638:13;16597:16;16694:4;16682:17;;16660:57;:::i;:::-;-1:-1:-1;;;16739:20:1;;16768:22;;;16817:1;16806:13;;16188:637;-1:-1:-1;;;;16188:637:1:o;17117:452::-;17349:3;17387:6;17381:13;17403:53;17449:6;17444:3;17437:4;17429:6;17425:17;17403:53;:::i;:::-;-1:-1:-1;;;17478:16:1;;17503:30;;;-1:-1:-1;17560:2:1;17549:14;;17117:452;-1:-1:-1;17117:452:1:o;21413:184::-;21483:6;21536:2;21524:9;21515:7;21511:23;21507:32;21504:52;;;21552:1;21549;21542:12;21504:52;-1:-1:-1;21575:16:1;;21413:184;-1:-1:-1;21413:184:1:o;22316:414::-;22518:2;22500:21;;;22557:2;22537:18;;;22530:30;22596:34;22591:2;22576:18;;22569:62;-1:-1:-1;;;22662:2:1;22647:18;;22640:48;22720:3;22705:19;;22316:414::o;22735:112::-;22767:1;22793;22783:35;;22798:18;;:::i;:::-;-1:-1:-1;22832:9:1;;22735:112::o;23847:489::-;-1:-1:-1;;;;;24116:15:1;;;24098:34;;24168:15;;24163:2;24148:18;;24141:43;24215:2;24200:18;;24193:34;;;24263:3;24258:2;24243:18;;24236:31;;;24041:4;;24284:46;;24310:19;;24302:6;24284:46;:::i;:::-;24276:54;23847:489;-1:-1:-1;;;;;;23847:489:1:o;24341:249::-;24410:6;24463:2;24451:9;24442:7;24438:23;24434:32;24431:52;;;24479:1;24476;24469:12;24431:52;24511:9;24505:16;24530:30;24554:5;24530:30;:::i;25725:127::-;25786:10;25781:3;25777:20;25774:1;25767:31;25817:4;25814:1;25807:15;25841:4;25838:1;25831:15
Swarm Source
ipfs://7429bfa39e98459cef3f03e1be0a2edd311bb258139eaf9bdf6715473fb33cda
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.