ERC-721
Overview
Max Total Supply
69 TTX
Holders
37
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 TTXLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TISMTroops
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-29 */ // https://EZFCM10iX.com // SPDX-License-Identifier: MIT pragma solidity 0.8.20; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. C U ON THE MOON */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, 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 ); } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy)) for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) { // If the function selector has not been overwritten, // it is an out-of-gas error. if eq(shr(224, mload(0x00)), functionSelector) { // To prevent gas under-estimation. revert(0, 0) } } // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if the caller is a blocked operator. modifier onlyAllowedOperator(address from) virtual { if (from != msg.sender) { if (!_isPriorityOperator(msg.sender)) { if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender); } } _; } /// @dev Modifier to guard a function from approving a blocked operator.. modifier onlyAllowedOperatorApproval(address operator) virtual { if (!_isPriorityOperator(operator)) { if (_operatorFilteringEnabled()) _revertIfBlocked(operator); } _; } /// @dev Helper function that reverts if the `operator` is blocked by the registry. function _revertIfBlocked(address operator) private view { /// @solidity memory-safe-assembly assembly { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`. mstore(0x3a, operator) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } /// @dev For deriving contracts to override, so that operator filtering /// can be turned on / off. /// Returns true by default. function _operatorFilteringEnabled() internal view virtual returns (bool) { return true; } /// @dev For deriving contracts to override, so that preferred marketplaces can /// skip operator filtering, helping users save gas. /// Returns false for all inputs by default. function _isPriorityOperator(address) internal view virtual returns (bool) { return false; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title 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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { using Strings for uint256; // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector); 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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Returns whether the ownership slot at `index` is initialized. * An uninitialized slot does not necessarily mean that the slot has no owner. */ function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; if (packed & _BITMASK_BURNED == 0) return packed; // Otherwise, the token is burned, and we must revert. // This handles the case of batch burned tokens, where only the burned bit // of the starting slot is set, and remaining slots are left uninitialized. _revert(OwnerQueryForNonexistentToken.selector); } } // Otherwise, the data exists and we can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. // If the token is not burned, return `packed`. Otherwise, revert. if (packed & _BITMASK_BURNED == 0) return packed; } _revert(OwnerQueryForNonexistentToken.selector); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool result) { if (_startTokenId() <= tokenId) { if (tokenId < _currentIndex) { uint256 packed; while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId; result = packed & _BITMASK_BURNED == 0; } } } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. from, // `from`. toMasked, // `to`. tokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { _revert(TransferToNonERC721ReceiverImplementer.selector); } assembly { revert(add(32, reason), mload(reason)) } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) _revert(MintZeroQuantity.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 end = startTokenId + quantity; uint256 tokenId = startTokenId; do { assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } while (++tokenId != end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) _revert(MintToZeroAddress.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) _revert(bytes4(0)); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck && _msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev For more efficient reverts. */ function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } } /** * @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 paused state. */ constructor() { _paused = true; } /** * @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()); } } /** * @dev Interface of ERC721ABurnable. */ interface IERC721ABurnable is IERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } /** * @title ERC721ABurnable. * * @dev ERC721A token that can be irreversibly burned (destroyed). */ abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } } /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory ownership) { unchecked { if (tokenId >= _startTokenId()) { if (tokenId < _nextTokenId()) { // If the `tokenId` is within bounds, // scan backwards for the initialized ownership slot. while (!_ownershipIsInitialized(tokenId)) --tokenId; return _ownershipAt(tokenId); } } } } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { TokenOwnership[] memory ownerships; uint256 i = tokenIds.length; assembly { // Grab the free memory pointer. ownerships := mload(0x40) // Store the length. mstore(ownerships, i) // Allocate one word for the length, // `tokenIds.length` words for the pointers. i := shl(5, i) // Multiply `i` by 32. mstore(0x40, add(add(ownerships, 0x20), i)) } while (i != 0) { uint256 tokenId; assembly { i := sub(i, 0x20) tokenId := calldataload(add(tokenIds.offset, i)) } TokenOwnership memory ownership = explicitOwnershipOf(tokenId); assembly { // Store the pointer of `ownership` in the `ownerships` array. mstore(add(add(ownerships, 0x20), i), ownership) } } return ownerships; } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { return _tokensOfOwnerIn(owner, start, stop); } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { uint256 start = _startTokenId(); uint256 stop = _nextTokenId(); uint256[] memory tokenIds; if (start != stop) tokenIds = _tokensOfOwnerIn(owner, start, stop); return tokenIds; } /** * @dev Helper function for returning an array of token IDs owned by `owner`. * * Note that this function is optimized for smaller bytecode size over runtime gas, * since it is meant to be called off-chain. */ function _tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) private view returns (uint256[] memory) { unchecked { if (start >= stop) _revert(InvalidQueryRange.selector); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } uint256 stopLimit = _nextTokenId(); // Set `stop = min(stop, stopLimit)`. if (stop >= stopLimit) { stop = stopLimit; } uint256[] memory tokenIds; uint256 tokenIdsMaxLength = balanceOf(owner); bool startLtStop = start < stop; assembly { // Set `tokenIdsMaxLength` to zero if `start` is less than `stop`. tokenIdsMaxLength := mul(tokenIdsMaxLength, startLtStop) } if (tokenIdsMaxLength != 0) { // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (stop - start <= tokenIdsMaxLength) { tokenIdsMaxLength = stop - start; } assembly { // Grab the free memory pointer. tokenIds := mload(0x40) // Allocate one word for the length, and `tokenIdsMaxLength` words // for the data. `shl(5, x)` is equivalent to `mul(32, x)`. mstore(0x40, add(tokenIds, shl(5, add(tokenIdsMaxLength, 1)))) } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), // initialize `currOwnershipAddr`. // `ownership.address` will not be zero, // as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } uint256 tokenIdsIdx; // Use a do-while, which is slightly more efficient for this case, // as the array will at least contain one element. do { ownership = _ownershipAt(start); assembly { switch mload(add(ownership, 0x40)) // if `ownership.burned == false`. case 0 { // if `ownership.addr != address(0)`. // The `addr` already has it's upper 96 bits clearned, // since it is written to memory with regular Solidity. if mload(ownership) { currOwnershipAddr := mload(ownership) } // if `currOwnershipAddr == owner`. // The `shl(96, x)` is to make the comparison agnostic to any // dirty upper 96 bits in `owner`. if iszero(shl(96, xor(currOwnershipAddr, owner))) { tokenIdsIdx := add(tokenIdsIdx, 1) mstore(add(tokenIds, shl(5, tokenIdsIdx)), start) } } // Otherwise, reset `currOwnershipAddr`. // This handles the case of batch burned tokens // (burned bit of first slot set, remaining slots left uninitialized). default { currOwnershipAddr := 0 } start := add(start, 1) } } while (!(start == stop || tokenIdsIdx == tokenIdsMaxLength)); // Store the length of the array. assembly { mstore(tokenIds, tokenIdsIdx) } } return tokenIds; } } } contract TISMTroops is ERC721A, ERC721ABurnable, ERC721AQueryable, Pausable, Ownable, OperatorFilterer { bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02; using Strings for uint256; string baseURI; string placeholderURI; string constant baseExtension = ""; uint256 price = 20_000_000_000_000_000; uint256 _max = 50; mapping(address => uint256) public mintPass; constructor() ERC721A("TISM Troops", "TTX") { } function setBaseURI(string calldata _base) external onlyOwner { baseURI = _base; } function setMax(uint256 limit) external onlyOwner { _max = limit; } function setMintPass(address _holder, uint256 _amount) external onlyOwner { mintPass[_holder] = _amount; } function setPlaceholderURI(string calldata _placeholder) external onlyOwner { placeholderURI = _placeholder; } function _baseURI() internal view override returns (string memory) { return baseURI; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function mint(uint256 amount) external payable { require(amount > 0, "No NFTs minted"); require(totalSupply() + amount <= _max, "Total mint exceeded"); // 5000 total require(msg.value >= amount * price, "Insufficient funds"); //0.02Eth per NFT super._mint(msg.sender, amount); } function mintWithPass(uint256 amount) external payable whenNotPaused { require(amount > 0, "No NFTs minted"); require(totalSupply() + amount <= _max, "Total mint exceeded"); // 5000 total uint256 passes = mintPass[msg.sender]; require(amount <= passes, "Not enough passes"); mintPass[msg.sender] -= amount; super._mint(msg.sender, amount); } function setPrice(uint256 _price) external onlyOwner { price = _price; } function tokenURI(uint256 tokenId) public view override(ERC721A, IERC721A) returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory base = _baseURI(); if (bytes(base).length > 0) { return concatenate(base, concatenate(tokenId.toString(), baseExtension)); } if (bytes(placeholderURI).length > 0) { return placeholderURI; } return super.tokenURI(tokenId); } function concatenate(string memory a, string memory b) internal pure returns (string memory) { return string(abi.encodePacked(a, b)); } function extractTokens(address _token) external onlyOwner { IERC20(_token).transfer(msg.sender, IERC20(_token).balanceOf(address(this))); } function extractETH() external onlyOwner { bool success; (success, ) = msg.sender.call{value: address(this).balance}(""); } receive() external payable { } function setApprovalForAll(address operator, bool approved) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom( address from, address to, uint256 tokenId ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function totalMinted() public view returns (uint256) { return _totalMinted(); } function totalBurned() public view returns (uint256) { return _totalBurned(); } function nextTokenId() public view returns (uint256) { return _nextTokenId(); } function getAux(address owner) public view returns (uint64) { return _getAux(owner); } function setAux(address owner, uint64 aux) external onlyOwner { _setAux(owner, aux); } function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function getOwnershipAt(uint256 index) public view returns (TokenOwnership memory) { return _ownershipAt(index); } function getOwnershipOf(uint256 index) public view returns (TokenOwnership memory) { return _ownershipOf(index); } function initializeOwnershipAt(uint256 index) public { _initializeOwnershipAt(index); } /** * ROYALTY FUNCTIONS */ uint256 private _royaltyBps; address payable private _royaltyRecipient; bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; function supportsInterface(bytes4 interfaceId) public view override(ERC721A, IERC721A) returns (bool) { return super.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981; } function updateRoyalties(address payable recipient, uint256 bps) external onlyOwner { _royaltyRecipient = recipient; _royaltyBps = bps; } function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) { return (_royaltyRecipient, value*_royaltyBps/10000); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"ownership","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"extractTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAux","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOwnershipAt","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"initializeOwnershipAt","outputs":[],"stateMutability":"nonpayable","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":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPass","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWithPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint64","name":"aux","type":"uint64"}],"name":"setAux","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMintPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholder","type":"string"}],"name":"setPlaceholderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"payable","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 payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405266470de4df820000600b556032600c5534801562000020575f80fd5b506040518060400160405280600b81526020016a5449534d2054726f6f707360a81b815250604051806040016040528060038152602001620a8a8b60eb1b81525081600290816200007291906200019c565b5060036200008182826200019c565b5060015f9081556008805460ff191660011790559150620000a190503390565b60088054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000264565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200012557607f821691505b6020821081036200014457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000197575f81815260208120601f850160051c81016020861015620001725750805b601f850160051c820191505b8181101562000193578281556001016200017e565b5050505b505050565b81516001600160401b03811115620001b857620001b8620000fc565b620001d081620001c9845462000110565b846200014a565b602080601f83116001811462000206575f8415620001ee5750858301515b5f19600386901b1c1916600185901b17855562000193565b5f85815260208120601f198616915b82811015620002365788860151825594840194600190910190840162000215565b50858210156200025457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6128ea80620002725f395ff3fe608060405260043610610283575f3560e01c806370a0823111610155578063b88d4fde116100be578063dc33e68111610078578063dc33e68114610781578063e7396382146107a0578063e985e9c5146107cb578063f252363314610812578063f2fde38b14610831578063fabb71d214610850575f80fd5b8063b88d4fde146106d1578063bf0b175e146106e4578063c041de1f1461071c578063c23dc68f1461072f578063c87b56dd1461074e578063d89135cd1461076d575f80fd5b806391b7f5ed1161010f57806391b7f5ed1461063757806395d89b411461065657806399a2557a1461066a578063a0712d6814610689578063a22cb4651461069c578063a2309ff8146106bb575f80fd5b806370a082311461058f578063715018a6146105ae57806375794a3c146105c25780638456cb59146105d55780638462151c146105e95780638da5cb5b14610615575f80fd5b806342842e0e116101f757806353b1233d116101b157806353b1233d146104d057806355f804b3146104ef5780635bbb21771461050e5780635c975abb1461053a5780636352211e146105515780636c2f5acd14610570575f80fd5b806342842e0e1461041557806342966c6814610428578063453ab1411461044757806348466402146104665780634f558e791461048557806352d8a4d1146104a4575f80fd5b806318160ddd1161024857806318160ddd1461034e5780631fe9eabc1461037257806323b872dd146103915780632a55205a146103a45780633574a2dd146103e25780633f4ba83a14610401575f80fd5b806301ffc9a71461028e57806306fdde03146102c257806307ebd12f146102e3578063081812fc14610304578063095ea7b31461033b575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102ad6102a8366004612121565b610864565b60405190151581526020015b60405180910390f35b3480156102cd575f80fd5b506102d661088f565b6040516102b99190612189565b3480156102ee575f80fd5b506103026102fd3660046121af565b61091f565b005b34801561030f575f80fd5b5061032361031e3660046121ca565b610a38565b6040516001600160a01b0390911681526020016102b9565b6103026103493660046121e1565b610a71565b348015610359575f80fd5b506001545f54035f19015b6040519081526020016102b9565b34801561037d575f80fd5b5061030261038c3660046121ca565b610a8a565b61030261039f36600461220b565b610abf565b3480156103af575f80fd5b506103c36103be366004612249565b610aea565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156103ed575f80fd5b506103026103fc366004612269565b610b23565b34801561040c575f80fd5b50610302610b60565b61030261042336600461220b565b610b9a565b348015610433575f80fd5b506103026104423660046121ca565b610bbf565b348015610452575f80fd5b506103026104613660046122d5565b610bcd565b348015610471575f80fd5b506103026104803660046121e1565b610c2d565b348015610490575f80fd5b506102ad61049f3660046121ca565b610c78565b3480156104af575f80fd5b506104c36104be3660046121ca565b610c82565b6040516102b99190612355565b3480156104db575f80fd5b506103026104ea3660046121ca565b610cae565b3480156104fa575f80fd5b50610302610509366004612269565b610cb7565b348015610519575f80fd5b5061052d610528366004612363565b610cf4565b6040516102b991906123c0565b348015610545575f80fd5b5060085460ff166102ad565b34801561055c575f80fd5b5061032361056b3660046121ca565b610d3f565b34801561057b575f80fd5b5061030261058a3660046121e1565b610d49565b34801561059a575f80fd5b506103646105a93660046121af565b610d9f565b3480156105b9575f80fd5b50610302610de3565b3480156105cd575f80fd5b505f54610364565b3480156105e0575f80fd5b50610302610e67565b3480156105f4575f80fd5b506106086106033660046121af565b610e9f565b6040516102b99190612401565b348015610620575f80fd5b5060085461010090046001600160a01b0316610323565b348015610642575f80fd5b506103026106513660046121ca565b610ec5565b348015610661575f80fd5b506102d6610efa565b348015610675575f80fd5b50610608610684366004612438565b610f09565b6103026106973660046121ca565b610f16565b3480156106a7575f80fd5b506103026106b6366004612477565b61100e565b3480156106c6575f80fd5b505f545f1901610364565b6103026106df3660046124b7565b611022565b3480156106ef575f80fd5b506107036106fe3660046121af565b61104f565b60405167ffffffffffffffff90911681526020016102b9565b61030261072a3660046121ca565b61106f565b34801561073a575f80fd5b506104c36107493660046121ca565b6111d3565b348015610759575f80fd5b506102d66107683660046121ca565b611233565b348015610778575f80fd5b50610364611397565b34801561078c575f80fd5b5061036461079b3660046121af565b6113a1565b3480156107ab575f80fd5b506103646107ba3660046121af565b600d6020525f908152604090205481565b3480156107d6575f80fd5b506102ad6107e5366004612590565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561081d575f80fd5b506104c361082c3660046121ca565b6113cb565b34801561083c575f80fd5b5061030261084b3660046121af565b6113f3565b34801561085b575f80fd5b506103026114ee565b5f61086e8261155d565b8061088957506001600160e01b0319821663152a902d60e11b145b92915050565b60606002805461089e906125bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108ca906125bc565b80156109155780601f106108ec57610100808354040283529160200191610915565b820191905f5260205f20905b8154815290600101906020018083116108f857829003601f168201915b5050505050905090565b6008546001600160a01b036101009091041633146109585760405162461bcd60e51b815260040161094f906125f4565b60405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156109a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c89190612629565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610a10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a349190612640565b5050565b5f610a42826115aa565b610a5657610a566333d1c03960e21b6115f2565b505f908152600660205260409020546001600160a01b031690565b81610a7b816115fa565b610a858383611639565b505050565b6008546001600160a01b03610100909104163314610aba5760405162461bcd60e51b815260040161094f906125f4565b600c55565b826001600160a01b0381163314610ad957610ad9336115fa565b610ae4848484611645565b50505050565b600f54600e545f9182916001600160a01b039091169061271090610b0e908661266f565b610b18919061269a565b915091509250929050565b6008546001600160a01b03610100909104163314610b535760405162461bcd60e51b815260040161094f906125f4565b600a610a858284836126fa565b6008546001600160a01b03610100909104163314610b905760405162461bcd60e51b815260040161094f906125f4565b610b986117a9565b565b826001600160a01b0381163314610bb457610bb4336115fa565b610ae484848461183c565b610bca816001611856565b50565b6008546001600160a01b03610100909104163314610bfd5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0382165f908152600560205260409020805460c083901b6001600160c01b039091161790555050565b6008546001600160a01b03610100909104163314610c5d5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b039091165f908152600d6020526040902055565b5f610889826115aa565b604080516080810182525f8082526020820181905291810182905260608101919091526108898261198d565b610bca816119c1565b6008546001600160a01b03610100909104163314610ce75760405162461bcd60e51b815260040161094f906125f4565b6009610a858284836126fa565b60408051828152600583901b8082016020019092526060915b8015610d3757601f1980820191860101355f610d28826111d3565b8484016020015250610d0d9050565b509392505050565b5f610889826119ef565b6008546001600160a01b03610100909104163314610d795760405162461bcd60e51b815260040161094f906125f4565b600f80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b5f6001600160a01b038216610dbe57610dbe6323d3ad8160e21b6115f2565b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03610100909104163314610e135760405162461bcd60e51b815260040161094f906125f4565b6008546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b905090565b6008546001600160a01b03610100909104163314610e975760405162461bcd60e51b815260040161094f906125f4565b610b98611a89565b5f5460609060019082828214610ebd57610eba858484611b04565b90505b949350505050565b6008546001600160a01b03610100909104163314610ef55760405162461bcd60e51b815260040161094f906125f4565b600b55565b60606003805461089e906125bc565b6060610ebd848484611b04565b5f8111610f565760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f1901610f6f91906127b5565b1115610fb35760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b600b54610fc0908261266f565b3410156110045760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b604482015260640161094f565b610bca3382611bfc565b81611018816115fa565b610a858383611cb6565b836001600160a01b038116331461103c5761103c336115fa565b61104885858585611d21565b5050505050565b6001600160a01b0381165f9081526005602052604081205460c01c610889565b60085460ff16156110b55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b5f81116110f55760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f190161110e91906127b5565b11156111525760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b335f908152600d6020526040902054808211156111a55760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682070617373657360781b604482015260640161094f565b335f908152600d6020526040812080548492906111c39084906127c8565b90915550610a3490503383611bfc565b604080516080810182525f8082526020820181905291810182905260608101919091526001821061122e575f5482101561122e575b5f82815260046020526040902054611225575f1990910190611208565b61088982611d5c565b919050565b606061123e826115aa565b6112a45760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b606482015260840161094f565b5f6112ad611d96565b8051909150156112e7576112e0816112db6112c786611da5565b60405180602001604052805f815250611ea2565b611ea2565b9392505050565b5f600a80546112f5906125bc565b9050111561138e57600a805461130a906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611336906125bc565b80156113815780601f1061135857610100808354040283529160200191611381565b820191905f5260205f20905b81548152906001019060200180831161136457829003601f168201915b5050505050915050919050565b6112e083611ece565b5f610e6260015490565b6001600160a01b0381165f908152600560205260408082205467ffffffffffffffff911c16610889565b604080516080810182525f808252602082018190529181018290526060810191909152611225565b6008546001600160a01b036101009091041633146114235760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0381166114885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094f565b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6008546001600160a01b0361010090910416331461151e5760405162461bcd60e51b815260040161094f906125f4565b6040515f90339047908381818185875af1925050503d805f8114610ae4576040519150601f19603f3d011682016040523d82523d5f602084013e610ae4565b5f6301ffc9a760e01b6001600160e01b03198316148061158d57506380ac58cd60e01b6001600160e01b03198316145b806108895750506001600160e01b031916635b5e139f60e01b1490565b5f8160011161122e575f5482101561122e575f5b505f82815260046020526040812054908190036115e5576115de836127db565b92506115be565b600160e01b161592915050565b805f5260045ffd5b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa611632573d5f803e3d5ffd5b5f603a5250565b610a3482826001611f45565b5f61164f826119ef565b6001600160a01b0394851694909150811684146116755761167562a1148160e81b6115f2565b5f82815260066020526040902080546116a08187335b6001600160a01b039081169116811491141790565b6116c2576116ae86336107e5565b6116c2576116c2632ce44b5f60e11b6115f2565b80156116cc575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b8416900361175857600184015f818152600460205260408120549003611756575f548114611756575f8181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4805f036117a0576117a0633a954ecd60e21b6115f2565b50505050505050565b60085460ff166117f25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161094f565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8583838360405180602001604052805f815250611022565b5f611860836119ef565b9050805f8061187c865f90815260066020526040902080549091565b9150915084156118b35761189181843361168b565b6118b35761189f83336107e5565b6118b3576118b3632ce44b5f60e11b6115f2565b80156118bd575f82555b6001600160a01b0383165f81815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b175f87815260046020526040812091909155600160e11b8516900361194657600186015f818152600460205260408120549003611944575f548114611944575f8181526004602052604090208590555b505b60405186905f906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b604080516080810182525f8082526020820181905291810182905260608101919091526108896119bc836119ef565b611fe6565b5f818152600460205260408120549003610bca576119de816119ef565b5f8281526004602052604090205550565b5f81600111611a7957505f8181526004602052604081205490819003611a67575f548210611a2757611a27636f96cda160e11b6115f2565b5b505f19015f818152600460205260409020548015611a2857600160e01b81165f03611a5257919050565b611a62636f96cda160e11b6115f2565b611a28565b600160e01b81165f03611a7957919050565b61122e636f96cda160e11b6115f2565b60085460ff1615611acf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861181f3390565b6060818310611b1d57611b1d631960ccad60e11b6115f2565b6001831015611b2b57600192505b5f54808310611b38578092505b60605f611b4487610d9f565b85871090810291508115611bf0578187870311611b615786860391505b60405192506001820160051b83016040525f611b7c886111d3565b90505f8160400151611b8c575080515b5f5b611b978a611d5c565b925060408301515f8114611bad575f9250611bd2565b835115611bb957835192505b8b831860601b611bd2576001820191508a8260051b8801525b5060018a019950888a1480611be657508481145b15611b8e57855250505b50909695505050505050565b5f805490829003611c1757611c1763b562e8dd60e01b6115f2565b5f8181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b17811790915580845260059092528220805468010000000000000001860201905590819003611c7457611c74622e076360e81b6115f2565b818301825b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4818160010191508103611c7957505f5550505050565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d2c848484610abf565b6001600160a01b0383163b15610ae457611d488484848461202e565b610ae457610ae46368d2bf6b60e11b6115f2565b604080516080810182525f8082526020820181905291810182905260608101919091525f8281526004602052604090205461088990611fe6565b60606009805461089e906125bc565b6060815f03611dcb5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611df45780611dde816127f0565b9150611ded9050600a8361269a565b9150611dce565b5f8167ffffffffffffffff811115611e0e57611e0e6124a3565b6040519080825280601f01601f191660200182016040528015611e38576020820181803683370190505b5090505b8415610ebd57611e4d6001836127c8565b9150611e5a600a86612808565b611e659060306127b5565b60f81b818381518110611e7a57611e7a61281b565b60200101906001600160f81b03191690815f1a905350611e9b600a8661269a565b9450611e3c565b60608282604051602001611eb792919061282f565b604051602081830303815290604052905092915050565b6060611ed9826115aa565b611eed57611eed630a14c4b560e41b6115f2565b5f611ef6611d96565b905080515f03611f145760405180602001604052805f8152506112e0565b80611f1e84611da5565b604051602001611f2f92919061282f565b6040516020818303038152906040529392505050565b5f611f4f83610d3f565b9050818015611f675750336001600160a01b03821614155b15611f8a57611f7681336107e5565b611f8a57611f8a6367d9dca160e11b6115f2565b5f8381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a029061206290339089908890889060040161285d565b6020604051808303815f875af192505050801561209c575060408051601f3d908101601f1916820190925261209991810190612899565b60015b6120ef573d8080156120c9576040519150601f19603f3d011682016040523d82523d5f602084013e6120ce565b606091505b5080515f036120e7576120e76368d2bf6b60e11b6115f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160e01b031981168114610bca575f80fd5b5f60208284031215612131575f80fd5b81356112e08161210c565b5f5b8381101561215657818101518382015260200161213e565b50505f910152565b5f815180845261217581602086016020860161213c565b601f01601f19169290920160200192915050565b602081525f6112e0602083018461215e565b6001600160a01b0381168114610bca575f80fd5b5f602082840312156121bf575f80fd5b81356112e08161219b565b5f602082840312156121da575f80fd5b5035919050565b5f80604083850312156121f2575f80fd5b82356121fd8161219b565b946020939093013593505050565b5f805f6060848603121561221d575f80fd5b83356122288161219b565b925060208401356122388161219b565b929592945050506040919091013590565b5f806040838503121561225a575f80fd5b50508035926020909101359150565b5f806020838503121561227a575f80fd5b823567ffffffffffffffff80821115612291575f80fd5b818501915085601f8301126122a4575f80fd5b8135818111156122b2575f80fd5b8660208285010111156122c3575f80fd5b60209290920196919550909350505050565b5f80604083850312156122e6575f80fd5b82356122f18161219b565b9150602083013567ffffffffffffffff8116811461230d575f80fd5b809150509250929050565b80516001600160a01b0316825260208082015167ffffffffffffffff169083015260408082015115159083015260609081015162ffffff16910152565b608081016108898284612318565b5f8060208385031215612374575f80fd5b823567ffffffffffffffff8082111561238b575f80fd5b818501915085601f83011261239e575f80fd5b8135818111156123ac575f80fd5b8660208260051b85010111156122c3575f80fd5b602080825282518282018190525f9190848201906040850190845b81811015611bf0576123ee838551612318565b92840192608092909201916001016123db565b602080825282518282018190525f9190848201906040850190845b81811015611bf05783518352928401929184019160010161241c565b5f805f6060848603121561244a575f80fd5b83356124558161219b565b95602085013595506040909401359392505050565b8015158114610bca575f80fd5b5f8060408385031215612488575f80fd5b82356124938161219b565b9150602083013561230d8161246a565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156124ca575f80fd5b84356124d58161219b565b935060208501356124e58161219b565b925060408501359150606085013567ffffffffffffffff80821115612508575f80fd5b818701915087601f83011261251b575f80fd5b81358181111561252d5761252d6124a3565b604051601f8201601f19908116603f01168101908382118183101715612555576125556124a3565b816040528281528a602084870101111561256d575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156125a1575f80fd5b82356125ac8161219b565b9150602083013561230d8161219b565b600181811c908216806125d057607f821691505b6020821081036125ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215612639575f80fd5b5051919050565b5f60208284031215612650575f80fd5b81516112e08161246a565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108895761088961265b565b634e487b7160e01b5f52601260045260245ffd5b5f826126a8576126a8612686565b500490565b601f821115610a85575f81815260208120601f850160051c810160208610156126d35750805b601f850160051c820191505b818110156126f2578281556001016126df565b505050505050565b67ffffffffffffffff831115612712576127126124a3565b6127268361272083546125bc565b836126ad565b5f601f841160018114612757575f85156127405750838201355b5f19600387901b1c1916600186901b178355611048565b5f83815260209020601f19861690835b828110156127875786850135825560209485019460019092019101612767565b50868210156127a3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b808201808211156108895761088961265b565b818103818111156108895761088961265b565b5f816127e9576127e961265b565b505f190190565b5f600182016128015761280161265b565b5060010190565b5f8261281657612816612686565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f835161284081846020880161213c565b83519083019061285481836020880161213c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061288f9083018461215e565b9695505050505050565b5f602082840312156128a9575f80fd5b81516112e08161210c56fea2646970667358221220cb63a01a2c71cacd76ec0444bc81a627194a767887badb3165fc052138c29f1a64736f6c63430008140033
Deployed Bytecode
0x608060405260043610610283575f3560e01c806370a0823111610155578063b88d4fde116100be578063dc33e68111610078578063dc33e68114610781578063e7396382146107a0578063e985e9c5146107cb578063f252363314610812578063f2fde38b14610831578063fabb71d214610850575f80fd5b8063b88d4fde146106d1578063bf0b175e146106e4578063c041de1f1461071c578063c23dc68f1461072f578063c87b56dd1461074e578063d89135cd1461076d575f80fd5b806391b7f5ed1161010f57806391b7f5ed1461063757806395d89b411461065657806399a2557a1461066a578063a0712d6814610689578063a22cb4651461069c578063a2309ff8146106bb575f80fd5b806370a082311461058f578063715018a6146105ae57806375794a3c146105c25780638456cb59146105d55780638462151c146105e95780638da5cb5b14610615575f80fd5b806342842e0e116101f757806353b1233d116101b157806353b1233d146104d057806355f804b3146104ef5780635bbb21771461050e5780635c975abb1461053a5780636352211e146105515780636c2f5acd14610570575f80fd5b806342842e0e1461041557806342966c6814610428578063453ab1411461044757806348466402146104665780634f558e791461048557806352d8a4d1146104a4575f80fd5b806318160ddd1161024857806318160ddd1461034e5780631fe9eabc1461037257806323b872dd146103915780632a55205a146103a45780633574a2dd146103e25780633f4ba83a14610401575f80fd5b806301ffc9a71461028e57806306fdde03146102c257806307ebd12f146102e3578063081812fc14610304578063095ea7b31461033b575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102ad6102a8366004612121565b610864565b60405190151581526020015b60405180910390f35b3480156102cd575f80fd5b506102d661088f565b6040516102b99190612189565b3480156102ee575f80fd5b506103026102fd3660046121af565b61091f565b005b34801561030f575f80fd5b5061032361031e3660046121ca565b610a38565b6040516001600160a01b0390911681526020016102b9565b6103026103493660046121e1565b610a71565b348015610359575f80fd5b506001545f54035f19015b6040519081526020016102b9565b34801561037d575f80fd5b5061030261038c3660046121ca565b610a8a565b61030261039f36600461220b565b610abf565b3480156103af575f80fd5b506103c36103be366004612249565b610aea565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156103ed575f80fd5b506103026103fc366004612269565b610b23565b34801561040c575f80fd5b50610302610b60565b61030261042336600461220b565b610b9a565b348015610433575f80fd5b506103026104423660046121ca565b610bbf565b348015610452575f80fd5b506103026104613660046122d5565b610bcd565b348015610471575f80fd5b506103026104803660046121e1565b610c2d565b348015610490575f80fd5b506102ad61049f3660046121ca565b610c78565b3480156104af575f80fd5b506104c36104be3660046121ca565b610c82565b6040516102b99190612355565b3480156104db575f80fd5b506103026104ea3660046121ca565b610cae565b3480156104fa575f80fd5b50610302610509366004612269565b610cb7565b348015610519575f80fd5b5061052d610528366004612363565b610cf4565b6040516102b991906123c0565b348015610545575f80fd5b5060085460ff166102ad565b34801561055c575f80fd5b5061032361056b3660046121ca565b610d3f565b34801561057b575f80fd5b5061030261058a3660046121e1565b610d49565b34801561059a575f80fd5b506103646105a93660046121af565b610d9f565b3480156105b9575f80fd5b50610302610de3565b3480156105cd575f80fd5b505f54610364565b3480156105e0575f80fd5b50610302610e67565b3480156105f4575f80fd5b506106086106033660046121af565b610e9f565b6040516102b99190612401565b348015610620575f80fd5b5060085461010090046001600160a01b0316610323565b348015610642575f80fd5b506103026106513660046121ca565b610ec5565b348015610661575f80fd5b506102d6610efa565b348015610675575f80fd5b50610608610684366004612438565b610f09565b6103026106973660046121ca565b610f16565b3480156106a7575f80fd5b506103026106b6366004612477565b61100e565b3480156106c6575f80fd5b505f545f1901610364565b6103026106df3660046124b7565b611022565b3480156106ef575f80fd5b506107036106fe3660046121af565b61104f565b60405167ffffffffffffffff90911681526020016102b9565b61030261072a3660046121ca565b61106f565b34801561073a575f80fd5b506104c36107493660046121ca565b6111d3565b348015610759575f80fd5b506102d66107683660046121ca565b611233565b348015610778575f80fd5b50610364611397565b34801561078c575f80fd5b5061036461079b3660046121af565b6113a1565b3480156107ab575f80fd5b506103646107ba3660046121af565b600d6020525f908152604090205481565b3480156107d6575f80fd5b506102ad6107e5366004612590565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561081d575f80fd5b506104c361082c3660046121ca565b6113cb565b34801561083c575f80fd5b5061030261084b3660046121af565b6113f3565b34801561085b575f80fd5b506103026114ee565b5f61086e8261155d565b8061088957506001600160e01b0319821663152a902d60e11b145b92915050565b60606002805461089e906125bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108ca906125bc565b80156109155780601f106108ec57610100808354040283529160200191610915565b820191905f5260205f20905b8154815290600101906020018083116108f857829003601f168201915b5050505050905090565b6008546001600160a01b036101009091041633146109585760405162461bcd60e51b815260040161094f906125f4565b60405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156109a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c89190612629565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610a10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a349190612640565b5050565b5f610a42826115aa565b610a5657610a566333d1c03960e21b6115f2565b505f908152600660205260409020546001600160a01b031690565b81610a7b816115fa565b610a858383611639565b505050565b6008546001600160a01b03610100909104163314610aba5760405162461bcd60e51b815260040161094f906125f4565b600c55565b826001600160a01b0381163314610ad957610ad9336115fa565b610ae4848484611645565b50505050565b600f54600e545f9182916001600160a01b039091169061271090610b0e908661266f565b610b18919061269a565b915091509250929050565b6008546001600160a01b03610100909104163314610b535760405162461bcd60e51b815260040161094f906125f4565b600a610a858284836126fa565b6008546001600160a01b03610100909104163314610b905760405162461bcd60e51b815260040161094f906125f4565b610b986117a9565b565b826001600160a01b0381163314610bb457610bb4336115fa565b610ae484848461183c565b610bca816001611856565b50565b6008546001600160a01b03610100909104163314610bfd5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0382165f908152600560205260409020805460c083901b6001600160c01b039091161790555050565b6008546001600160a01b03610100909104163314610c5d5760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b039091165f908152600d6020526040902055565b5f610889826115aa565b604080516080810182525f8082526020820181905291810182905260608101919091526108898261198d565b610bca816119c1565b6008546001600160a01b03610100909104163314610ce75760405162461bcd60e51b815260040161094f906125f4565b6009610a858284836126fa565b60408051828152600583901b8082016020019092526060915b8015610d3757601f1980820191860101355f610d28826111d3565b8484016020015250610d0d9050565b509392505050565b5f610889826119ef565b6008546001600160a01b03610100909104163314610d795760405162461bcd60e51b815260040161094f906125f4565b600f80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b5f6001600160a01b038216610dbe57610dbe6323d3ad8160e21b6115f2565b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03610100909104163314610e135760405162461bcd60e51b815260040161094f906125f4565b6008546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b905090565b6008546001600160a01b03610100909104163314610e975760405162461bcd60e51b815260040161094f906125f4565b610b98611a89565b5f5460609060019082828214610ebd57610eba858484611b04565b90505b949350505050565b6008546001600160a01b03610100909104163314610ef55760405162461bcd60e51b815260040161094f906125f4565b600b55565b60606003805461089e906125bc565b6060610ebd848484611b04565b5f8111610f565760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f1901610f6f91906127b5565b1115610fb35760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b600b54610fc0908261266f565b3410156110045760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b604482015260640161094f565b610bca3382611bfc565b81611018816115fa565b610a858383611cb6565b836001600160a01b038116331461103c5761103c336115fa565b61104885858585611d21565b5050505050565b6001600160a01b0381165f9081526005602052604081205460c01c610889565b60085460ff16156110b55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b5f81116110f55760405162461bcd60e51b815260206004820152600e60248201526d139bc81391951cc81b5a5b9d195960921b604482015260640161094f565b600c546001545f54839190035f190161110e91906127b5565b11156111525760405162461bcd60e51b8152602060048201526013602482015272151bdd185b081b5a5b9d08195e18d959591959606a1b604482015260640161094f565b335f908152600d6020526040902054808211156111a55760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682070617373657360781b604482015260640161094f565b335f908152600d6020526040812080548492906111c39084906127c8565b90915550610a3490503383611bfc565b604080516080810182525f8082526020820181905291810182905260608101919091526001821061122e575f5482101561122e575b5f82815260046020526040902054611225575f1990910190611208565b61088982611d5c565b919050565b606061123e826115aa565b6112a45760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b606482015260840161094f565b5f6112ad611d96565b8051909150156112e7576112e0816112db6112c786611da5565b60405180602001604052805f815250611ea2565b611ea2565b9392505050565b5f600a80546112f5906125bc565b9050111561138e57600a805461130a906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611336906125bc565b80156113815780601f1061135857610100808354040283529160200191611381565b820191905f5260205f20905b81548152906001019060200180831161136457829003601f168201915b5050505050915050919050565b6112e083611ece565b5f610e6260015490565b6001600160a01b0381165f908152600560205260408082205467ffffffffffffffff911c16610889565b604080516080810182525f808252602082018190529181018290526060810191909152611225565b6008546001600160a01b036101009091041633146114235760405162461bcd60e51b815260040161094f906125f4565b6001600160a01b0381166114885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094f565b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6008546001600160a01b0361010090910416331461151e5760405162461bcd60e51b815260040161094f906125f4565b6040515f90339047908381818185875af1925050503d805f8114610ae4576040519150601f19603f3d011682016040523d82523d5f602084013e610ae4565b5f6301ffc9a760e01b6001600160e01b03198316148061158d57506380ac58cd60e01b6001600160e01b03198316145b806108895750506001600160e01b031916635b5e139f60e01b1490565b5f8160011161122e575f5482101561122e575f5b505f82815260046020526040812054908190036115e5576115de836127db565b92506115be565b600160e01b161592915050565b805f5260045ffd5b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa611632573d5f803e3d5ffd5b5f603a5250565b610a3482826001611f45565b5f61164f826119ef565b6001600160a01b0394851694909150811684146116755761167562a1148160e81b6115f2565b5f82815260066020526040902080546116a08187335b6001600160a01b039081169116811491141790565b6116c2576116ae86336107e5565b6116c2576116c2632ce44b5f60e11b6115f2565b80156116cc575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b8416900361175857600184015f818152600460205260408120549003611756575f548114611756575f8181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4805f036117a0576117a0633a954ecd60e21b6115f2565b50505050505050565b60085460ff166117f25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161094f565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8583838360405180602001604052805f815250611022565b5f611860836119ef565b9050805f8061187c865f90815260066020526040902080549091565b9150915084156118b35761189181843361168b565b6118b35761189f83336107e5565b6118b3576118b3632ce44b5f60e11b6115f2565b80156118bd575f82555b6001600160a01b0383165f81815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b175f87815260046020526040812091909155600160e11b8516900361194657600186015f818152600460205260408120549003611944575f548114611944575f8181526004602052604090208590555b505b60405186905f906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b604080516080810182525f8082526020820181905291810182905260608101919091526108896119bc836119ef565b611fe6565b5f818152600460205260408120549003610bca576119de816119ef565b5f8281526004602052604090205550565b5f81600111611a7957505f8181526004602052604081205490819003611a67575f548210611a2757611a27636f96cda160e11b6115f2565b5b505f19015f818152600460205260409020548015611a2857600160e01b81165f03611a5257919050565b611a62636f96cda160e11b6115f2565b611a28565b600160e01b81165f03611a7957919050565b61122e636f96cda160e11b6115f2565b60085460ff1615611acf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161094f565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861181f3390565b6060818310611b1d57611b1d631960ccad60e11b6115f2565b6001831015611b2b57600192505b5f54808310611b38578092505b60605f611b4487610d9f565b85871090810291508115611bf0578187870311611b615786860391505b60405192506001820160051b83016040525f611b7c886111d3565b90505f8160400151611b8c575080515b5f5b611b978a611d5c565b925060408301515f8114611bad575f9250611bd2565b835115611bb957835192505b8b831860601b611bd2576001820191508a8260051b8801525b5060018a019950888a1480611be657508481145b15611b8e57855250505b50909695505050505050565b5f805490829003611c1757611c1763b562e8dd60e01b6115f2565b5f8181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b17811790915580845260059092528220805468010000000000000001860201905590819003611c7457611c74622e076360e81b6115f2565b818301825b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4818160010191508103611c7957505f5550505050565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d2c848484610abf565b6001600160a01b0383163b15610ae457611d488484848461202e565b610ae457610ae46368d2bf6b60e11b6115f2565b604080516080810182525f8082526020820181905291810182905260608101919091525f8281526004602052604090205461088990611fe6565b60606009805461089e906125bc565b6060815f03611dcb5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611df45780611dde816127f0565b9150611ded9050600a8361269a565b9150611dce565b5f8167ffffffffffffffff811115611e0e57611e0e6124a3565b6040519080825280601f01601f191660200182016040528015611e38576020820181803683370190505b5090505b8415610ebd57611e4d6001836127c8565b9150611e5a600a86612808565b611e659060306127b5565b60f81b818381518110611e7a57611e7a61281b565b60200101906001600160f81b03191690815f1a905350611e9b600a8661269a565b9450611e3c565b60608282604051602001611eb792919061282f565b604051602081830303815290604052905092915050565b6060611ed9826115aa565b611eed57611eed630a14c4b560e41b6115f2565b5f611ef6611d96565b905080515f03611f145760405180602001604052805f8152506112e0565b80611f1e84611da5565b604051602001611f2f92919061282f565b6040516020818303038152906040529392505050565b5f611f4f83610d3f565b9050818015611f675750336001600160a01b03821614155b15611f8a57611f7681336107e5565b611f8a57611f8a6367d9dca160e11b6115f2565b5f8381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a029061206290339089908890889060040161285d565b6020604051808303815f875af192505050801561209c575060408051601f3d908101601f1916820190925261209991810190612899565b60015b6120ef573d8080156120c9576040519150601f19603f3d011682016040523d82523d5f602084013e6120ce565b606091505b5080515f036120e7576120e76368d2bf6b60e11b6115f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160e01b031981168114610bca575f80fd5b5f60208284031215612131575f80fd5b81356112e08161210c565b5f5b8381101561215657818101518382015260200161213e565b50505f910152565b5f815180845261217581602086016020860161213c565b601f01601f19169290920160200192915050565b602081525f6112e0602083018461215e565b6001600160a01b0381168114610bca575f80fd5b5f602082840312156121bf575f80fd5b81356112e08161219b565b5f602082840312156121da575f80fd5b5035919050565b5f80604083850312156121f2575f80fd5b82356121fd8161219b565b946020939093013593505050565b5f805f6060848603121561221d575f80fd5b83356122288161219b565b925060208401356122388161219b565b929592945050506040919091013590565b5f806040838503121561225a575f80fd5b50508035926020909101359150565b5f806020838503121561227a575f80fd5b823567ffffffffffffffff80821115612291575f80fd5b818501915085601f8301126122a4575f80fd5b8135818111156122b2575f80fd5b8660208285010111156122c3575f80fd5b60209290920196919550909350505050565b5f80604083850312156122e6575f80fd5b82356122f18161219b565b9150602083013567ffffffffffffffff8116811461230d575f80fd5b809150509250929050565b80516001600160a01b0316825260208082015167ffffffffffffffff169083015260408082015115159083015260609081015162ffffff16910152565b608081016108898284612318565b5f8060208385031215612374575f80fd5b823567ffffffffffffffff8082111561238b575f80fd5b818501915085601f83011261239e575f80fd5b8135818111156123ac575f80fd5b8660208260051b85010111156122c3575f80fd5b602080825282518282018190525f9190848201906040850190845b81811015611bf0576123ee838551612318565b92840192608092909201916001016123db565b602080825282518282018190525f9190848201906040850190845b81811015611bf05783518352928401929184019160010161241c565b5f805f6060848603121561244a575f80fd5b83356124558161219b565b95602085013595506040909401359392505050565b8015158114610bca575f80fd5b5f8060408385031215612488575f80fd5b82356124938161219b565b9150602083013561230d8161246a565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156124ca575f80fd5b84356124d58161219b565b935060208501356124e58161219b565b925060408501359150606085013567ffffffffffffffff80821115612508575f80fd5b818701915087601f83011261251b575f80fd5b81358181111561252d5761252d6124a3565b604051601f8201601f19908116603f01168101908382118183101715612555576125556124a3565b816040528281528a602084870101111561256d575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156125a1575f80fd5b82356125ac8161219b565b9150602083013561230d8161219b565b600181811c908216806125d057607f821691505b6020821081036125ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215612639575f80fd5b5051919050565b5f60208284031215612650575f80fd5b81516112e08161246a565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108895761088961265b565b634e487b7160e01b5f52601260045260245ffd5b5f826126a8576126a8612686565b500490565b601f821115610a85575f81815260208120601f850160051c810160208610156126d35750805b601f850160051c820191505b818110156126f2578281556001016126df565b505050505050565b67ffffffffffffffff831115612712576127126124a3565b6127268361272083546125bc565b836126ad565b5f601f841160018114612757575f85156127405750838201355b5f19600387901b1c1916600186901b178355611048565b5f83815260209020601f19861690835b828110156127875786850135825560209485019460019092019101612767565b50868210156127a3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b808201808211156108895761088961265b565b818103818111156108895761088961265b565b5f816127e9576127e961265b565b505f190190565b5f600182016128015761280161265b565b5060010190565b5f8261281657612816612686565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f835161284081846020880161213c565b83519083019061285481836020880161213c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061288f9083018461215e565b9695505050505050565b5f602082840312156128a9575f80fd5b81516112e08161210c56fea2646970667358221220cb63a01a2c71cacd76ec0444bc81a627194a767887badb3165fc052138c29f1a64736f6c63430008140033
Deployed Bytecode Sourcemap
90977:6217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96604:255;;;;;;;;;;-1:-1:-1;96604:255:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;96604:255:0;;;;;;;;44302:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;93692:153::-;;;;;;;;;;-1:-1:-1;93692:153:0;;;;;:::i;:::-;;:::i;:::-;;51336:227;;;;;;;;;;-1:-1:-1;51336:227:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2085:32:1;;;2067:51;;2055:2;2040:18;51336:227:0;1921:203:1;94291:225:0;;;;;;:::i;:::-;;:::i;40044:323::-;;;;;;;;;;-1:-1:-1;9595:4:0;40318:12;40105:7;40302:13;:28;-1:-1:-1;;40302:46:0;40044:323;;;2595:25:1;;;2583:2;2568:18;40044:323:0;2449:177:1;91573:81:0;;;;;;;;;;-1:-1:-1;91573:81:0;;;;;:::i;:::-;;:::i;94524:224::-;;;;;;:::i;:::-;;:::i;97035:156::-;;;;;;;;;;-1:-1:-1;97035:156:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3537:32:1;;;3519:51;;3601:2;3586:18;;3579:34;;;;3492:18;97035:156:0;3345:274:1;91790:124:0;;;;;;;;;;-1:-1:-1;91790:124:0;;;;;:::i;:::-;;:::i;92099:65::-;;;;;;;;;;;;;:::i;94756:232::-;;;;;;:::i;:::-;;:::i;79657:94::-;;;;;;;;;;-1:-1:-1;79657:94:0;;;;;:::i;:::-;;:::i;95802:100::-;;;;;;;;;;-1:-1:-1;95802:100:0;;;;;:::i;:::-;;:::i;91662:120::-;;;;;;;;;;-1:-1:-1;91662:120:0;;;;;:::i;:::-;;:::i;95910:102::-;;;;;;;;;;-1:-1:-1;95910:102:0;;;;;:::i;:::-;;:::i;96156:128::-;;;;;;;;;;-1:-1:-1;96156:128:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;96292:101::-;;;;;;;;;;-1:-1:-1;96292:101:0;;;;;:::i;:::-;;:::i;91469:96::-;;;;;;;;;;-1:-1:-1;91469:96:0;;;;;:::i;:::-;;:::i;83819:1163::-;;;;;;;;;;-1:-1:-1;83819:1163:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77799:86::-;;;;;;;;;;-1:-1:-1;77870:7:0;;;;77799:86;;45704:152;;;;;;;;;;-1:-1:-1;45704:152:0;;;;;:::i;:::-;;:::i;96867:160::-;;;;;;;;;;-1:-1:-1;96867:160:0;;;;;:::i;:::-;;:::i;41228:242::-;;;;;;;;;;-1:-1:-1;41228:242:0;;;;;:::i;:::-;;:::i;3797:148::-;;;;;;;;;;;;;:::i;95593:93::-;;;;;;;;;;-1:-1:-1;95637:7:0;39813:13;95593:93;;92030:61;;;;;;;;;;;;;:::i;86040:325::-;;;;;;;;;;-1:-1:-1;86040:325:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3583:79::-;;;;;;;;;;-1:-1:-1;3648:6:0;;;;;-1:-1:-1;;;;;3648:6:0;3583:79;;92915:86;;;;;;;;;;-1:-1:-1;92915:86:0;;;;;:::i;:::-;;:::i;44478:104::-;;;;;;;;;;;;;:::i;85370:223::-;;;;;;;;;;-1:-1:-1;85370:223:0;;;;;:::i;:::-;;:::i;92172:323::-;;;;;;:::i;:::-;;:::i;94056:227::-;;;;;;;;;;-1:-1:-1;94056:227:0;;;;;:::i;:::-;;:::i;95391:93::-;;;;;;;;;;-1:-1:-1;95435:7:0;40711:13;-1:-1:-1;;40711:31:0;95391:93;95593;94996:266;;;;;;:::i;:::-;;:::i;95694:100::-;;;;;;;;;;-1:-1:-1;95694:100:0;;;;;:::i;:::-;;:::i;:::-;;;10065:18:1;10053:31;;;10035:50;;10023:2;10008:18;95694:100:0;9891:200:1;92503:404:0;;;;;;:::i;:::-;;:::i;83064:596::-;;;;;;;;;;-1:-1:-1;83064:596:0;;;;;:::i;:::-;;:::i;93009:518::-;;;;;;;;;;-1:-1:-1;93009:518:0;;;;;:::i;:::-;;:::i;95492:93::-;;;;;;;;;;;;;:::i;95270:113::-;;;;;;;;;;-1:-1:-1;95270:113:0;;;;;:::i;:::-;;:::i;91351:43::-;;;;;;;;;;-1:-1:-1;91351:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;52294:164;;;;;;;;;;-1:-1:-1;52294:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;52415:25:0;;;52391:4;52415:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52294:164;96020:128;;;;;;;;;;-1:-1:-1;96020:128:0;;;;;:::i;:::-;;:::i;3953:281::-;;;;;;;;;;-1:-1:-1;3953:281:0;;;;;:::i;:::-;;:::i;93861:144::-;;;;;;;;;;;;;:::i;96604:255::-;96736:4;96765:36;96789:11;96765:23;:36::i;:::-;:86;;;-1:-1:-1;;;;;;;96805:46:0;;-1:-1:-1;;;96805:46:0;96765:86;96758:93;96604:255;-1:-1:-1;;96604:255:0:o;44302:100::-;44356:13;44389:5;44382:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44302:100;:::o;93692:153::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;;;;;;;;;93797:39:::1;::::0;-1:-1:-1;;;93797:39:0;;93830:4:::1;93797:39;::::0;::::1;2067:51:1::0;-1:-1:-1;;;;;93761:23:0;::::1;::::0;::::1;::::0;93785:10:::1;::::0;93761:23;;93797:24:::1;::::0;2040:18:1;;93797:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93761:76;::::0;-1:-1:-1;;;;;;93761:76:0::1;::::0;;;;;;-1:-1:-1;;;;;3537:32:1;;;93761:76:0::1;::::0;::::1;3519:51:1::0;3586:18;;;3579:34;3492:18;;93761:76:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;93692:153:::0;:::o;51336:227::-;51412:7;51437:16;51445:7;51437;:16::i;:::-;51432:73;;51455:50;-1:-1:-1;;;51455:7:0;:50::i;:::-;-1:-1:-1;51525:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;51525:30:0;;51336:227::o;94291:225::-;94450:8;7838:26;7855:8;7838:16;:26::i;:::-;94476:32:::1;94490:8;94500:7;94476:13;:32::i;:::-;94291:225:::0;;;:::o;91573:81::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;91634:4:::1;:12:::0;91573:81::o;94524:224::-;94686:4;-1:-1:-1;;;;;7394:18:0;;7402:10;7394:18;7390:184;;7519:28;7536:10;7519:16;:28::i;:::-;94703:37:::1;94722:4;94728:2;94732:7;94703:18;:37::i;:::-;94524:224:::0;;;;:::o;97035:156::-;97140:17;;97165:11;;97103:7;;;;-1:-1:-1;;;;;97140:17:0;;;;97177:5;;97159:17;;:5;:17;:::i;:::-;:23;;;;:::i;:::-;97132:51;;;;97035:156;;;;;:::o;91790:124::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;91877:14:::1;:29;91894:12:::0;;91877:14;:29:::1;:::i;92099:65::-:0;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;92146:10:::1;:8;:10::i;:::-;92099:65::o:0;94756:232::-;94922:4;-1:-1:-1;;;;;7394:18:0;;7402:10;7394:18;7390:184;;7519:28;7536:10;7519:16;:28::i;:::-;94939:41:::1;94962:4;94968:2;94972:7;94939:22;:41::i;79657:94::-:0;79723:20;79729:7;79738:4;79723:5;:20::i;:::-;79657:94;:::o;95802:100::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42538:25:0;;42521:14;42538:25;;;:18;:25;;;;;;;35761:3;42775:24;;;-1:-1:-1;;;;;42738:32:0;;;42737:63;42811:34;;93761:76:::1;93692:153:::0;:::o;91662:120::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;91747:17:0;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:27;91662:120::o;95910:102::-;95964:4;95988:16;95996:7;95988;:16::i;96156:128::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96257:19:0;96270:5;96257:12;:19::i;96292:101::-;96356:29;96379:5;96356:22;:29::i;91469:96::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;91542:7:::1;:15;91552:5:::0;;91542:7;:15:::1;:::i;83819:1163::-:0;84177:4;84171:11;;84230:21;;;84382:1;84378:9;;;84437:29;;;84457:4;84437:29;84424:43;;;83963:23;;84488:459;84495:6;;84488:459;;-1:-1:-1;;84581:12:0;;;;84635:23;;;84622:37;84518:15;84722:28;84622:37;84722:19;:28::i;:::-;84880:29;;;84900:4;84880:29;84873:48;-1:-1:-1;84488:459:0;;-1:-1:-1;84488:459:0;;-1:-1:-1;84964:10:0;83819:1163;-1:-1:-1;;;83819:1163:0:o;45704:152::-;45776:7;45819:27;45838:7;45819:18;:27::i;96867:160::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;96962:17:::1;:29:::0;;-1:-1:-1;;;;;;96962:29:0::1;-1:-1:-1::0;;;;;96962:29:0;;;::::1;::::0;;;::::1;::::0;;;97002:11:::1;:17:::0;96867:160::o;41228:242::-;41300:7;-1:-1:-1;;;;;41324:19:0;;41320:69;;41345:44;-1:-1:-1;;;41345:7:0;:44::i;:::-;-1:-1:-1;;;;;;41407:25:0;;;;;:18;:25;;;;;;35387:13;41407:55;;41228:242::o;3797:148::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;3888:6:::1;::::0;3867:40:::1;::::0;3904:1:::1;::::0;3888:6:::1;::::0;::::1;-1:-1:-1::0;;;;;3888:6:0::1;::::0;3867:40:::1;::::0;3904:1;;3867:40:::1;3918:6;:19:::0;;-1:-1:-1;;;;;;3918:19:0::1;::::0;;3797:148::o;95664:14::-;95657:21;;95593:93;:::o;92030:61::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;92075:8:::1;:6;:8::i;86040:325::-:0;86147:13;39813;86118:16;;9595:4;;86118:16;86269:13;;;86265:66;;86295:36;86312:5;86319;86326:4;86295:16;:36::i;:::-;86284:47;;86265:66;86349:8;86040:325;-1:-1:-1;;;;86040:325:0:o;92915:86::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;92979:5:::1;:14:::0;92915:86::o;44478:104::-;44534:13;44567:7;44560:14;;;;;:::i;85370:223::-;85513:16;85549:36;85566:5;85573;85580:4;85549:16;:36::i;92172:323::-;92247:1;92238:6;:10;92230:37;;;;-1:-1:-1;;;92230:37:0;;14496:2:1;92230:37:0;;;14478:21:1;14535:2;14515:18;;;14508:30;-1:-1:-1;;;14554:18:1;;;14547:44;14608:18;;92230:37:0;14294:338:1;92230:37:0;92314:4;;9595;40318:12;40105:7;40302:13;92304:6;;40302:28;;-1:-1:-1;;40302:46:0;92288:22;;;;:::i;:::-;:30;;92280:62;;;;-1:-1:-1;;;92280:62:0;;14969:2:1;92280:62:0;;;14951:21:1;15008:2;14988:18;;;14981:30;-1:-1:-1;;;15027:18:1;;;15020:49;15086:18;;92280:62:0;14767:343:1;92280:62:0;92397:5;;92388:14;;:6;:14;:::i;:::-;92375:9;:27;;92367:58;;;;-1:-1:-1;;;92367:58:0;;15317:2:1;92367:58:0;;;15299:21:1;15356:2;15336:18;;;15329:30;-1:-1:-1;;;15375:18:1;;;15368:48;15433:18;;92367:58:0;15115:342:1;92367:58:0;92456:31;92468:10;92480:6;92456:11;:31::i;94056:227::-;94206:8;7838:26;7855:8;7838:16;:26::i;:::-;94232:43:::1;94256:8;94266;94232:23;:43::i;94996:266::-:0;95190:4;-1:-1:-1;;;;;7394:18:0;;7402:10;7394:18;7390:184;;7519:28;7536:10;7519:16;:28::i;:::-;95207:47:::1;95230:4;95236:2;95240:7;95249:4;95207:22;:47::i;:::-;94996:266:::0;;;;;:::o;95694:100::-;-1:-1:-1;;;;;42212:25:0;;95746:6;42212:25;;;:18;:25;;;;;;35761:3;42212:40;95772:14;42124:137;92503:404;77870:7;;;;78124:9;78116:38;;;;-1:-1:-1;;;78116:38:0;;15664:2:1;78116:38:0;;;15646:21:1;15703:2;15683:18;;;15676:30;-1:-1:-1;;;15722:18:1;;;15715:46;15778:18;;78116:38:0;15462:340:1;78116:38:0;92600:1:::1;92591:6;:10;92583:37;;;::::0;-1:-1:-1;;;92583:37:0;;14496:2:1;92583:37:0::1;::::0;::::1;14478:21:1::0;14535:2;14515:18;;;14508:30;-1:-1:-1;;;14554:18:1;;;14547:44;14608:18;;92583:37:0::1;14294:338:1::0;92583:37:0::1;92667:4;::::0;9595;40318:12;40105:7;40302:13;92657:6;;40302:28;;-1:-1:-1;;40302:46:0;92641:22:::1;;;;:::i;:::-;:30;;92633:62;;;::::0;-1:-1:-1;;;92633:62:0;;14969:2:1;92633:62:0::1;::::0;::::1;14951:21:1::0;15008:2;14988:18;;;14981:30;-1:-1:-1;;;15027:18:1;;;15020:49;15086:18;;92633:62:0::1;14767:343:1::0;92633:62:0::1;92746:10;92720:14;92737:20:::0;;;:8:::1;:20;::::0;;;;;92776:16;;::::1;;92768:46;;;::::0;-1:-1:-1;;;92768:46:0;;16009:2:1;92768:46:0::1;::::0;::::1;15991:21:1::0;16048:2;16028:18;;;16021:30;-1:-1:-1;;;16067:18:1;;;16060:47;16124:18;;92768:46:0::1;15807:341:1::0;92768:46:0::1;92834:10;92825:20;::::0;;;:8:::1;:20;::::0;;;;:30;;92849:6;;92825:20;:30:::1;::::0;92849:6;;92825:30:::1;:::i;:::-;::::0;;;-1:-1:-1;92868:31:0::1;::::0;-1:-1:-1;92880:10:0::1;92892:6:::0;92868:11:::1;:31::i;83064:596::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9595:4:0;83271:7;:26;83267:375;;39786:7;39813:13;83322:7;:24;83318:309;;;83505:51;46732:4;46756:24;;;:17;:24;;;;;;83505:51;;-1:-1:-1;;83547:9:0;;;;83505:51;;;83586:21;83599:7;83586:12;:21::i;83318:309::-;83064:596;;;:::o;93009:518::-;93093:13;93127:16;93135:7;93127;:16::i;:::-;93119:78;;;;-1:-1:-1;;;93119:78:0;;16488:2:1;93119:78:0;;;16470:21:1;16527:2;16507:18;;;16500:30;16566:34;16546:18;;;16539:62;-1:-1:-1;;;16617:18:1;;;16610:47;16674:19;;93119:78:0;16286:413:1;93119:78:0;93208:18;93229:10;:8;:10::i;:::-;93256:18;;93208:31;;-1:-1:-1;93256:22:0;93252:127;;93302:65;93314:4;93320:46;93332:18;:7;:16;:18::i;:::-;93352:13;;;;;;;;;;;;93320:11;:46::i;:::-;93302:11;:65::i;:::-;93295:72;93009:518;-1:-1:-1;;;93009:518:0:o;93252:127::-;93426:1;93401:14;93395:28;;;;;:::i;:::-;;;:32;93391:86;;;93451:14;93444:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93009:518;;;:::o;93391:86::-;93496:23;93511:7;93496:14;:23::i;95492:93::-;95536:7;95563:14;40925:12;;;40843:102;95270:113;-1:-1:-1;;;;;41641:25:0;;95328:7;41641:25;;;:18;:25;;35525:2;41641:25;;;;35387:13;41641:50;;41640:82;95355:20;41552:178;96020:128;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96080:21:0;-1:-1:-1;3953:281:0;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4056:22:0;::::1;4034:110;;;::::0;-1:-1:-1;;;4034:110:0;;16906:2:1;4034:110:0::1;::::0;::::1;16888:21:1::0;16945:2;16925:18;;;16918:30;16984:34;16964:18;;;16957:62;-1:-1:-1;;;17035:18:1;;;17028:36;17081:19;;4034:110:0::1;16704:402:1::0;4034:110:0::1;4181:6;::::0;4160:38:::1;::::0;-1:-1:-1;;;;;4160:38:0;;::::1;::::0;4181:6:::1;::::0;::::1;;::::0;4160:38:::1;::::0;;;::::1;4209:6;:17:::0;;-1:-1:-1;;;;;4209:17:0;;::::1;;;-1:-1:-1::0;;;;;;4209:17:0;;::::1;::::0;;;::::1;::::0;;3953:281::o;93861:144::-;3710:6;;-1:-1:-1;;;;;3710:6:0;;;;;203:10;3710:22;3702:67;;;;-1:-1:-1;;;3702:67:0;;;;;;;:::i;:::-;93948:49:::1;::::0;93912:12:::1;::::0;93948:10:::1;::::0;93971:21:::1;::::0;93912:12;93948:49;93912:12;93948:49;93971:21;93948:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43400:639:::0;43485:4;-1:-1:-1;;;;;;;;;43809:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;43886:25:0;;;43809:102;:179;;;-1:-1:-1;;;;;;;;43963:25:0;-1:-1:-1;;;43963:25:0;;43400:639::o;52716:368::-;52781:11;52828:7;9595:4;52809:26;52805:272;;52866:13;;52856:7;:23;52852:214;;;52900:14;52933:60;-1:-1:-1;52950:26:0;;;;:17;:26;;;;;;;52940:42;;;52933:60;;52984:9;;;:::i;:::-;;;52933:60;;;-1:-1:-1;;;53021:24:0;:29;;52716:368;-1:-1:-1;;52716:368:0:o;76647:165::-;76748:13;76742:4;76735:27;76789:4;76783;76776:18;7992:1359;8385:22;8379:4;8372:36;8478:9;8472:4;8465:23;8553:8;8547:4;8540:22;8730:4;8724;8718;8712;8685:25;8678:5;8667:68;8657:274;;8851:16;8845:4;8839;8824:44;8899:16;8893:4;8886:30;8657:274;9331:1;9325:4;9318:15;7992:1359;:::o;51053:124::-;51142:27;51151:2;51155:7;51164:4;51142:8;:27::i;55070:3523::-;55212:27;55242;55261:7;55242:18;:27::i;:::-;-1:-1:-1;;;;;55397:22:0;;;;55212:57;;-1:-1:-1;55457:45:0;;;;55453:95;;55504:44;-1:-1:-1;;;55504:7:0;:44::i;:::-;55562:27;54178:24;;;:15;:24;;;;;54406:26;;55753:68;54406:26;55795:4;203:10;55801:19;-1:-1:-1;;;;;53652:32:0;;;53496:28;;53781:20;;53803:30;;53778:56;;53193:659;55753:68;55748:189;;55841:43;55858:4;203:10;52294:164;:::i;55841:43::-;55836:101;;55886:51;-1:-1:-1;;;55886:7:0;:51::i;:::-;56086:15;56083:160;;;56226:1;56205:19;56198:30;56083:160;-1:-1:-1;;;;;56623:24:0;;;;;;;:18;:24;;;;;;56621:26;;-1:-1:-1;;56621:26:0;;;56692:22;;;;;;;;;56690:24;;-1:-1:-1;56690:24:0;;;50155:11;50130:23;50126:41;50113:63;-1:-1:-1;;;50113:63:0;56985:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;57280:47:0;;:52;;57276:627;;57385:1;57375:11;;57353:19;57508:30;;;:17;:30;;;;;;:35;;57504:384;;57646:13;;57631:11;:28;57627:242;;57793:30;;;;:17;:30;;;;;:52;;;57627:242;57334:569;57276:627;-1:-1:-1;;;;;58035:20:0;;58415:7;58035:20;58345:4;58287:25;58016:16;;58152:299;58476:8;58488:1;58476:13;58472:58;;58491:39;-1:-1:-1;;;58491:7:0;:39::i;:::-;55201:3392;;;;55070:3523;;;:::o;78858:120::-;77870:7;;;;78394:41;;;;-1:-1:-1;;;78394:41:0;;17664:2:1;78394:41:0;;;17646:21:1;17703:2;17683:18;;;17676:30;-1:-1:-1;;;17722:18:1;;;17715:50;17782:18;;78394:41:0;17462:344:1;78394:41:0;78917:7:::1;:15:::0;;-1:-1:-1;;78917:15:0::1;::::0;;78948:22:::1;203:10:::0;78957:12:::1;78948:22;::::0;-1:-1:-1;;;;;2085:32:1;;;2067:51;;2055:2;2040:18;78948:22:0::1;;;;;;;78858:120::o:0;58689:193::-;58835:39;58852:4;58858:2;58862:7;58835:39;;;;;;;;;;;;:16;:39::i;70986:3090::-;71066:27;71096;71115:7;71096:18;:27::i;:::-;71066:57;-1:-1:-1;71066:57:0;71136:12;;71258:35;71285:7;54067:27;54178:24;;;:15;:24;;;;;54406:26;;54178:24;;53965:485;71258:35;71201:92;;;;71310:13;71306:325;;;71431:68;71456:15;71473:4;203:10;71479:19;123:98;71431:68;71426:193;;71523:43;71540:4;203:10;52294:164;:::i;71523:43::-;71518:101;;71568:51;-1:-1:-1;;;71568:7:0;:51::i;:::-;71787:15;71784:160;;;71927:1;71906:19;71899:30;71784:160;-1:-1:-1;;;;;72546:24:0;;;;;;:18;:24;;;;;:60;;72574:32;72546:60;;;50155:11;50130:23;50126:41;50113:63;-1:-1:-1;;;50113:63:0;72844:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;73169:47:0;;:52;;73165:627;;73274:1;73264:11;;73242:19;73397:30;;;:17;:30;;;;;;:35;;73393:384;;73535:13;;73520:11;:28;73516:242;;73682:30;;;;:17;:30;;;;;:52;;;73516:242;73223:569;73165:627;73820:35;;73847:7;;73843:1;;-1:-1:-1;;;;;73820:35:0;;;;;73843:1;;73820:35;-1:-1:-1;;74043:12:0;:14;;;;;;-1:-1:-1;;;;70986:3090:0:o;46045:166::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46156:47:0;46175:27;46194:7;46175:18;:27::i;:::-;46156:18;:47::i;46906:196::-;46985:24;;;;:17;:24;;;;;;:29;;46981:114;;47058:25;47077:5;47058:18;:25::i;:::-;47031:24;;;;:17;:24;;;;;:52;46906:196;:::o;47184:2012::-;47251:14;47301:7;9595:4;47282:26;47278:1853;;-1:-1:-1;47334:26:0;;;;:17;:26;;;;;;;47460:11;;;47456:1292;;47507:13;;47496:7;:24;47492:77;;47522:47;-1:-1:-1;;;47522:7:0;:47::i;:::-;48126:607;-1:-1:-1;;;48222:9:0;48204:28;;;;:17;:28;;;;;;48278:25;;48126:607;48278:25;-1:-1:-1;;;48330:6:0;:24;48358:1;48330:29;48326:48;;47184:2012;;;:::o;48326:48::-;48666:47;-1:-1:-1;;;48666:7:0;:47::i;:::-;48126:607;;47456:1292;-1:-1:-1;;;49075:6:0;:24;49103:1;49075:29;49071:48;;47184:2012;;;:::o;49071:48::-;49141:47;-1:-1:-1;;;49141:7:0;:47::i;78599:118::-;77870:7;;;;78124:9;78116:38;;;;-1:-1:-1;;;78116:38:0;;15664:2:1;78116:38:0;;;15646:21:1;15703:2;15683:18;;;15676:30;-1:-1:-1;;;15722:18:1;;;15715:46;15778:18;;78116:38:0;15462:340:1;78116:38:0;78659:7:::1;:14:::0;;-1:-1:-1;;78659:14:0::1;78669:4;78659:14;::::0;;78689:20:::1;78696:12;203:10:::0;;123:98;86621:4349;86747:16;86814:4;86805:5;:13;86801:54;;86820:35;-1:-1:-1;;;86820:7:0;:35::i;:::-;9595:4;86933:5;:23;86929:87;;;9595:4;86977:23;;86929:87;87030:17;39813:13;87134:17;;;87130:74;;87179:9;87172:16;;87130:74;87218:25;87258;87286:16;87296:5;87286:9;:16::i;:::-;87336:12;;;87496:35;;;;-1:-1:-1;87564:22:0;;87560:3362;;87786:17;87777:5;87770:4;:12;:33;87766:114;;87855:5;87848:4;:12;87828:32;;87766:114;88002:4;87996:11;87984:23;;88255:1;88236:17;88232:25;88229:1;88225:33;88215:8;88211:48;88205:4;88198:62;88435:31;88469:26;88489:5;88469:19;:26::i;:::-;88435:60;;88514:25;88811:9;:16;;;88806:100;;-1:-1:-1;88872:14:0;;88806:100;88924:19;89114:1644;89152:19;89165:5;89152:12;:19::i;:::-;89140:31;;89258:4;89247:9;89243:20;89237:27;89355:1;89350:907;;;;90578:1;90557:22;;89230:1376;;89350:907;89633:9;89627:16;89624:123;;;89706:9;89700:16;89679:37;;89624:123;90038:5;90019:17;90015:29;90011:2;90007:38;89997:233;;90114:1;90101:11;90097:19;90082:34;;90193:5;90178:11;90175:1;90171:19;90161:8;90157:34;90150:49;89997:233;89230:1376;90652:1;90645:5;90641:13;90632:22;;90715:4;90706:5;:13;:49;;;;90738:17;90723:11;:32;90706:49;90704:52;89114:1644;;90859:29;;-1:-1:-1;;87560:3362:0;-1:-1:-1;90943:8:0;;86621:4349;-1:-1:-1;;;;;;86621:4349:0:o;63133:2305::-;63206:20;63229:13;;;63257;;;63253:53;;63272:34;-1:-1:-1;;;63272:7:0;:34::i;:::-;63819:31;;;;:17;:31;;;;;;;;-1:-1:-1;;;;;49981:28:0;;50155:11;50130:23;50126:41;50599:1;50586:15;;50560:24;50556:46;50123:52;50113:63;;63819:173;;;64210:22;;;:18;:22;;;;;:71;;64248:32;64236:45;;64210:71;;;49981:28;64471:13;;;64467:54;;64486:35;-1:-1:-1;;;64486:7:0;:35::i;:::-;64552:23;;;:12;64637:676;65056:7;65012:8;64967:1;64901:25;64838:1;64773;64742:358;65308:3;65295:9;;;;;;:16;64637:676;;-1:-1:-1;65329:13:0;:19;-1:-1:-1;94291:225:0;;;:::o;51903:234::-;203:10;51998:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;51998:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;51998:60:0;;;;;;;;;;52074:55;;540:41:1;;;51998:49:0;;203:10;52074:55;;513:18:1;52074:55:0;;;;;;;51903:234;;:::o;59480:416::-;59655:31;59668:4;59674:2;59678:7;59655:12;:31::i;:::-;-1:-1:-1;;;;;59701:14:0;;;:19;59697:192;;59740:56;59771:4;59777:2;59781:7;59790:5;59740:30;:56::i;:::-;59735:154;;59817:56;-1:-1:-1;;;59817:7:0;:56::i;46307:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46435:24:0;;;;:17;:24;;;;;;46416:44;;:18;:44::i;91922:100::-;91974:13;92007:7;92000:14;;;;;:::i;24480:723::-;24536:13;24757:5;24766:1;24757:10;24753:53;;-1:-1:-1;;24784:10:0;;;;;;;;;;;;-1:-1:-1;;;24784:10:0;;;;;24480:723::o;24753:53::-;24831:5;24816:12;24872:78;24879:9;;24872:78;;24905:8;;;;:::i;:::-;;-1:-1:-1;24928:10:0;;-1:-1:-1;24936:2:0;24928:10;;:::i;:::-;;;24872:78;;;24960:19;24992:6;24982:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24982:17:0;;24960:39;;25010:154;25017:10;;25010:154;;25044:11;25054:1;25044:11;;:::i;:::-;;-1:-1:-1;25113:10:0;25121:2;25113:5;:10;:::i;:::-;25100:24;;:2;:24;:::i;:::-;25087:39;;25070:6;25077;25070:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;25070:56:0;;;;;;;;-1:-1:-1;25141:11:0;25150:2;25141:11;;:::i;:::-;;;25010:154;;93535:149;93613:13;93670:1;93673;93653:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;93639:37;;93535:149;;;;:::o;44688:327::-;44761:13;44792:16;44800:7;44792;:16::i;:::-;44787:68;;44810:45;-1:-1:-1;;;44810:7:0;:45::i;:::-;44868:21;44892:10;:8;:10::i;:::-;44868:34;;44926:7;44920:21;44945:1;44920:26;:87;;;;;;;;;;;;;;;;;44973:7;44982:18;:7;:16;:18::i;:::-;44956:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44913:94;44688:327;-1:-1:-1;;;44688:327:0:o;69927:474::-;70056:13;70072:16;70080:7;70072;:16::i;:::-;70056:32;;70105:13;:45;;;;-1:-1:-1;203:10:0;-1:-1:-1;;;;;70122:28:0;;;;70105:45;70101:201;;;70170:44;70187:5;203:10;52294:164;:::i;70170:44::-;70165:137;;70235:51;-1:-1:-1;;;70235:7:0;:51::i;:::-;70314:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;70314:35:0;-1:-1:-1;;;;;70314:35:0;;;;;;;;;70365:28;;70314:24;;70365:28;;;;;;;70045:356;69927:474;;;:::o;49295:366::-;-1:-1:-1;;;;;;;;;;;;;49405:41:0;;;;36046:3;49491:33;;;49457:68;;-1:-1:-1;;;49457:68:0;-1:-1:-1;;;49555:24:0;;:29;;-1:-1:-1;;;49536:48:0;;;;36567:3;49624:28;;;;-1:-1:-1;;;49595:58:0;-1:-1:-1;49295:366:0:o;61980:691::-;62164:88;;-1:-1:-1;;;62164:88:0;;62143:4;;-1:-1:-1;;;;;62164:45:0;;;;;:88;;203:10;;62231:4;;62237:7;;62246:5;;62164:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62164:88:0;;;;;;;;-1:-1:-1;;62164:88:0;;;;;;;;;;;;:::i;:::-;;;62160:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62447:6;:13;62464:1;62447:18;62443:115;;62486:56;-1:-1:-1;;;62486:7:0;:56::i;:::-;62630:6;62624:13;62615:6;62611:2;62607:15;62600:38;62160:504;-1:-1:-1;;;;;;62323:64:0;-1:-1:-1;;;62323:64:0;;-1:-1:-1;61980:691:0;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:131::-;-1:-1:-1;;;;;1423:31:1;;1413:42;;1403:70;;1469:1;1466;1459:12;1484:247;1543:6;1596:2;1584:9;1575:7;1571:23;1567:32;1564:52;;;1612:1;1609;1602:12;1564:52;1651:9;1638:23;1670:31;1695:5;1670:31;:::i;1736:180::-;1795:6;1848:2;1836:9;1827:7;1823:23;1819:32;1816:52;;;1864:1;1861;1854:12;1816:52;-1:-1:-1;1887:23:1;;1736:180;-1:-1:-1;1736:180:1:o;2129:315::-;2197:6;2205;2258:2;2246:9;2237:7;2233:23;2229:32;2226:52;;;2274:1;2271;2264:12;2226:52;2313:9;2300:23;2332:31;2357:5;2332:31;:::i;:::-;2382:5;2434:2;2419:18;;;;2406:32;;-1:-1:-1;;;2129:315:1:o;2631:456::-;2708:6;2716;2724;2777:2;2765:9;2756:7;2752:23;2748:32;2745:52;;;2793:1;2790;2783:12;2745:52;2832:9;2819:23;2851:31;2876:5;2851:31;:::i;:::-;2901:5;-1:-1:-1;2958:2:1;2943:18;;2930:32;2971:33;2930:32;2971:33;:::i;:::-;2631:456;;3023:7;;-1:-1:-1;;;3077:2:1;3062:18;;;;3049:32;;2631:456::o;3092:248::-;3160:6;3168;3221:2;3209:9;3200:7;3196:23;3192:32;3189:52;;;3237:1;3234;3227:12;3189:52;-1:-1:-1;;3260:23:1;;;3330:2;3315:18;;;3302:32;;-1:-1:-1;3092:248:1:o;3624:592::-;3695:6;3703;3756:2;3744:9;3735:7;3731:23;3727:32;3724:52;;;3772:1;3769;3762:12;3724:52;3812:9;3799:23;3841:18;3882:2;3874:6;3871:14;3868:34;;;3898:1;3895;3888:12;3868:34;3936:6;3925:9;3921:22;3911:32;;3981:7;3974:4;3970:2;3966:13;3962:27;3952:55;;4003:1;4000;3993:12;3952:55;4043:2;4030:16;4069:2;4061:6;4058:14;4055:34;;;4085:1;4082;4075:12;4055:34;4130:7;4125:2;4116:6;4112:2;4108:15;4104:24;4101:37;4098:57;;;4151:1;4148;4141:12;4098:57;4182:2;4174:11;;;;;4204:6;;-1:-1:-1;3624:592:1;;-1:-1:-1;;;;3624:592:1:o;4221:427::-;4288:6;4296;4349:2;4337:9;4328:7;4324:23;4320:32;4317:52;;;4365:1;4362;4355:12;4317:52;4404:9;4391:23;4423:31;4448:5;4423:31;:::i;:::-;4473:5;-1:-1:-1;4530:2:1;4515:18;;4502:32;4578:18;4565:32;;4553:45;;4543:73;;4612:1;4609;4602:12;4543:73;4635:7;4625:17;;;4221:427;;;;;:::o;4653:349::-;4737:12;;-1:-1:-1;;;;;4733:38:1;4721:51;;4825:4;4814:16;;;4808:23;4833:18;4804:48;4788:14;;;4781:72;4916:4;4905:16;;;4899:23;4892:31;4885:39;4869:14;;;4862:63;4978:4;4967:16;;;4961:23;4986:8;4957:38;4941:14;;4934:62;4653:349::o;5007:266::-;5203:3;5188:19;;5216:51;5192:9;5249:6;5216:51;:::i;5278:615::-;5364:6;5372;5425:2;5413:9;5404:7;5400:23;5396:32;5393:52;;;5441:1;5438;5431:12;5393:52;5481:9;5468:23;5510:18;5551:2;5543:6;5540:14;5537:34;;;5567:1;5564;5557:12;5537:34;5605:6;5594:9;5590:22;5580:32;;5650:7;5643:4;5639:2;5635:13;5631:27;5621:55;;5672:1;5669;5662:12;5621:55;5712:2;5699:16;5738:2;5730:6;5727:14;5724:34;;;5754:1;5751;5744:12;5724:34;5807:7;5802:2;5792:6;5789:1;5785:14;5781:2;5777:23;5773:32;5770:45;5767:65;;;5828:1;5825;5818:12;5898:722;6131:2;6183:21;;;6253:13;;6156:18;;;6275:22;;;6102:4;;6131:2;6354:15;;;;6328:2;6313:18;;;6102:4;6397:197;6411:6;6408:1;6405:13;6397:197;;;6460:52;6508:3;6499:6;6493:13;6460:52;:::i;:::-;6569:15;;;;6541:4;6532:14;;;;;6433:1;6426:9;6397:197;;6953:632;7124:2;7176:21;;;7246:13;;7149:18;;;7268:22;;;7095:4;;7124:2;7347:15;;;;7321:2;7306:18;;;7095:4;7390:169;7404:6;7401:1;7398:13;7390:169;;;7465:13;;7453:26;;7534:15;;;;7499:12;;;;7426:1;7419:9;7390:169;;7590:383;7667:6;7675;7683;7736:2;7724:9;7715:7;7711:23;7707:32;7704:52;;;7752:1;7749;7742:12;7704:52;7791:9;7778:23;7810:31;7835:5;7810:31;:::i;:::-;7860:5;7912:2;7897:18;;7884:32;;-1:-1:-1;7963:2:1;7948:18;;;7935:32;;7590:383;-1:-1:-1;;;7590:383:1:o;7978:118::-;8064:5;8057:13;8050:21;8043:5;8040:32;8030:60;;8086:1;8083;8076:12;8101:382;8166:6;8174;8227:2;8215:9;8206:7;8202:23;8198:32;8195:52;;;8243:1;8240;8233:12;8195:52;8282:9;8269:23;8301:31;8326:5;8301:31;:::i;:::-;8351:5;-1:-1:-1;8408:2:1;8393:18;;8380:32;8421:30;8380:32;8421:30;:::i;8488:127::-;8549:10;8544:3;8540:20;8537:1;8530:31;8580:4;8577:1;8570:15;8604:4;8601:1;8594:15;8620:1266;8715:6;8723;8731;8739;8792:3;8780:9;8771:7;8767:23;8763:33;8760:53;;;8809:1;8806;8799:12;8760:53;8848:9;8835:23;8867:31;8892:5;8867:31;:::i;:::-;8917:5;-1:-1:-1;8974:2:1;8959:18;;8946:32;8987:33;8946:32;8987:33;:::i;:::-;9039:7;-1:-1:-1;9093:2:1;9078:18;;9065:32;;-1:-1:-1;9148:2:1;9133:18;;9120:32;9171:18;9201:14;;;9198:34;;;9228:1;9225;9218:12;9198:34;9266:6;9255:9;9251:22;9241:32;;9311:7;9304:4;9300:2;9296:13;9292:27;9282:55;;9333:1;9330;9323:12;9282:55;9369:2;9356:16;9391:2;9387;9384:10;9381:36;;;9397:18;;:::i;:::-;9472:2;9466:9;9440:2;9526:13;;-1:-1:-1;;9522:22:1;;;9546:2;9518:31;9514:40;9502:53;;;9570:18;;;9590:22;;;9567:46;9564:72;;;9616:18;;:::i;:::-;9656:10;9652:2;9645:22;9691:2;9683:6;9676:18;9731:7;9726:2;9721;9717;9713:11;9709:20;9706:33;9703:53;;;9752:1;9749;9742:12;9703:53;9808:2;9803;9799;9795:11;9790:2;9782:6;9778:15;9765:46;9853:1;9848:2;9843;9835:6;9831:15;9827:24;9820:35;9874:6;9864:16;;;;;;;8620:1266;;;;;;;:::o;10096:388::-;10164:6;10172;10225:2;10213:9;10204:7;10200:23;10196:32;10193:52;;;10241:1;10238;10231:12;10193:52;10280:9;10267:23;10299:31;10324:5;10299:31;:::i;:::-;10349:5;-1:-1:-1;10406:2:1;10391:18;;10378:32;10419:33;10378:32;10419:33;:::i;10489:380::-;10568:1;10564:12;;;;10611;;;10632:61;;10686:4;10678:6;10674:17;10664:27;;10632:61;10739:2;10731:6;10728:14;10708:18;10705:38;10702:161;;10785:10;10780:3;10776:20;10773:1;10766:31;10820:4;10817:1;10810:15;10848:4;10845:1;10838:15;10702:161;;10489:380;;;:::o;10874:356::-;11076:2;11058:21;;;11095:18;;;11088:30;11154:34;11149:2;11134:18;;11127:62;11221:2;11206:18;;10874:356::o;11235:184::-;11305:6;11358:2;11346:9;11337:7;11333:23;11329:32;11326:52;;;11374:1;11371;11364:12;11326:52;-1:-1:-1;11397:16:1;;11235:184;-1:-1:-1;11235:184:1:o;11424:245::-;11491:6;11544:2;11532:9;11523:7;11519:23;11515:32;11512:52;;;11560:1;11557;11550:12;11512:52;11592:9;11586:16;11611:28;11633:5;11611:28;:::i;11674:127::-;11735:10;11730:3;11726:20;11723:1;11716:31;11766:4;11763:1;11756:15;11790:4;11787:1;11780:15;11806:168;11879:9;;;11910;;11927:15;;;11921:22;;11907:37;11897:71;;11948:18;;:::i;11979:127::-;12040:10;12035:3;12031:20;12028:1;12021:31;12071:4;12068:1;12061:15;12095:4;12092:1;12085:15;12111:120;12151:1;12177;12167:35;;12182:18;;:::i;:::-;-1:-1:-1;12216:9:1;;12111:120::o;12362:545::-;12464:2;12459:3;12456:11;12453:448;;;12500:1;12525:5;12521:2;12514:17;12570:4;12566:2;12556:19;12640:2;12628:10;12624:19;12621:1;12617:27;12611:4;12607:38;12676:4;12664:10;12661:20;12658:47;;;-1:-1:-1;12699:4:1;12658:47;12754:2;12749:3;12745:12;12742:1;12738:20;12732:4;12728:31;12718:41;;12809:82;12827:2;12820:5;12817:13;12809:82;;;12872:17;;;12853:1;12842:13;12809:82;;;12813:3;;;12362:545;;;:::o;13083:1206::-;13207:18;13202:3;13199:27;13196:53;;;13229:18;;:::i;:::-;13258:94;13348:3;13308:38;13340:4;13334:11;13308:38;:::i;:::-;13302:4;13258:94;:::i;:::-;13378:1;13403:2;13398:3;13395:11;13420:1;13415:616;;;;14075:1;14092:3;14089:93;;;-1:-1:-1;14148:19:1;;;14135:33;14089:93;-1:-1:-1;;13040:1:1;13036:11;;;13032:24;13028:29;13018:40;13064:1;13060:11;;;13015:57;14195:78;;13388:895;;13415:616;12309:1;12302:14;;;12346:4;12333:18;;-1:-1:-1;;13451:17:1;;;13552:9;13574:229;13588:7;13585:1;13582:14;13574:229;;;13677:19;;;13664:33;13649:49;;13784:4;13769:20;;;;13737:1;13725:14;;;;13604:12;13574:229;;;13578:3;13831;13822:7;13819:16;13816:159;;;13955:1;13951:6;13945:3;13939;13936:1;13932:11;13928:21;13924:34;13920:39;13907:9;13902:3;13898:19;13885:33;13881:79;13873:6;13866:95;13816:159;;;14018:1;14012:3;14009:1;14005:11;14001:19;13995:4;13988:33;13388:895;;13083:1206;;;:::o;14637:125::-;14702:9;;;14723:10;;;14720:36;;;14736:18;;:::i;16153:128::-;16220:9;;;16241:11;;;16238:37;;;16255:18;;:::i;17321:136::-;17360:3;17388:5;17378:39;;17397:18;;:::i;:::-;-1:-1:-1;;;17433:18:1;;17321:136::o;17811:135::-;17850:3;17871:17;;;17868:43;;17891:18;;:::i;:::-;-1:-1:-1;17938:1:1;17927:13;;17811:135::o;17951:112::-;17983:1;18009;17999:35;;18014:18;;:::i;:::-;-1:-1:-1;18048:9:1;;17951:112::o;18068:127::-;18129:10;18124:3;18120:20;18117:1;18110:31;18160:4;18157:1;18150:15;18184:4;18181:1;18174:15;18200:496;18379:3;18417:6;18411:13;18433:66;18492:6;18487:3;18480:4;18472:6;18468:17;18433:66;:::i;:::-;18562:13;;18521:16;;;;18584:70;18562:13;18521:16;18631:4;18619:17;;18584:70;:::i;:::-;18670:20;;18200:496;-1:-1:-1;;;;18200:496:1:o;18701:489::-;-1:-1:-1;;;;;18970:15:1;;;18952:34;;19022:15;;19017:2;19002:18;;18995:43;19069:2;19054:18;;19047:34;;;19117:3;19112:2;19097:18;;19090:31;;;18895:4;;19138:46;;19164:19;;19156:6;19138:46;:::i;:::-;19130:54;18701:489;-1:-1:-1;;;;;;18701:489:1:o;19195:249::-;19264:6;19317:2;19305:9;19296:7;19292:23;19288:32;19285:52;;;19333:1;19330;19323:12;19285:52;19365:9;19359:16;19384:30;19408:5;19384:30;:::i
Swarm Source
ipfs://cb63a01a2c71cacd76ec0444bc81a627194a767887badb3165fc052138c29f1a
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.