ETH Price: $3,784.79 (+1.24%)
Gas: 4 Gwei

Token

Hootz NFT (HOOTZ)
 

Overview

Max Total Supply

2,631 HOOTZ

Holders

306

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HOOTZ
0x058FD36A48e1C9980B34b41eaC8a46C3EAF19A41
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HootzNFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-04
*/

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        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);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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`
    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 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        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 auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * 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;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // 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, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // 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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try 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();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @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 Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: tests/HootZ.sol



/*                                                                         {o,o}

                                                                           /) (\

████████████████████████████████████████████████████████████████████████████████

█░░░░░░██░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░░░░░█

█░░▄▀░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀▄▀░░█

█░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░█░░▄▀░░░░░░▄▀░░█░░░░░░▄▀░░░░░░█░░░░░░░░░░░░▄▀▄▀░░█

█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█████░░▄▀░░█████████████░░░░▄▀░░░░█

█░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█████░░▄▀░░███████████░░░░▄▀░░░░███

█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█████░░▄▀░░█████████░░░░▄▀░░░░█████

█░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█████░░▄▀░░███████░░░░▄▀░░░░███████

█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█████░░▄▀░░█████░░░░▄▀░░░░█████████

█░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░█░░▄▀░░░░░░▄▀░░█████░░▄▀░░█████░░▄▀▄▀░░░░░░░░░░░░█

█░░▄▀░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█████░░▄▀░░█████░░▄▀▄▀▄▀▄▀▄▀▄▀▄▀░░█ 

█░░░░░░██░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█████░░░░░░█████░░░░░░░░░░░░░░░░░░█ 

████████████████████████████████████████████████████████████████████████████████

*/



pragma solidity ^0.8.9;







contract HootzNFT is ERC721A, Ownable{

    using Strings for uint256;



    uint256 public constant MAX_SUPPLY = 5000;

    uint256 public constant MAX_MINT = 10;

    uint256 public constant TEAM_RESERVED = 200;

    uint256 public constant PRICE = .005 ether;

  

    string private baseTokenUri;

    string public placeholderTokenUri;



    bool public isRevealed;

    bool public saleIsActive = true;

    bool public pause;

    bool public teamMinted;



    mapping(address => uint256) public totalMint;



    constructor(string memory _placeholderTokenUri, string memory _baseTokenUri) ERC721A("Hootz NFT", "HOOTZ"){

        placeholderTokenUri=_placeholderTokenUri;

        baseTokenUri=_baseTokenUri;

    }



    modifier callerIsUser() {

        require(tx.origin == msg.sender, "Cannot be called by a contract");

        _;

    }



    function checkCurrentMintPrice(uint256 _quantity) public view returns (uint256) {

        uint16[3] memory tiers = [2000, 3000, 4000];

        uint256 _price = 0;

        for (uint256 i = 1; i <= _quantity; i++) {

            uint256 currentToken = totalSupply() + i;

            if (currentToken > tiers[0] && currentToken <= tiers[1]){

                _price += PRICE;

            }

            if (currentToken > tiers[1] && currentToken <= tiers[2]){

                _price += PRICE * 150 / 100;

            }

            if (currentToken > tiers[2]){

                _price += PRICE * 2;

            }

        }

        return _price;

    }

    

    function mint(uint256 _quantity) external payable callerIsUser{

        require(saleIsActive, "Sale not active");

        require(totalSupply() < MAX_SUPPLY, "All tokens have been minted");

        require(totalSupply() + _quantity <= MAX_SUPPLY, "Minting would exceed max supply");

        require(_quantity <= MAX_MINT, "Purchase exceeds max allowed per tx");

        require(_quantity > 0, "Must mint at least one token");



        uint256 _price=checkCurrentMintPrice(_quantity);        

        require(msg.value >= _price, "Price is wrong");



        totalMint[msg.sender] += _quantity;

        _safeMint(msg.sender, _quantity);

    }





    function teamMint() external onlyOwner{

        require(!teamMinted, "Team already minted");

        teamMinted = true;

        _safeMint(msg.sender, TEAM_RESERVED);

    }



    function _baseURI() internal view virtual override returns (string memory) {

        return baseTokenUri;

    }



    //return uri for certain token

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {

        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");



        uint256 trueId = tokenId + 1;



        if(!isRevealed){

            return bytes(placeholderTokenUri).length > 0 ? string(abi.encodePacked(placeholderTokenUri, "unrevealed")) : "";

        }



        return bytes(baseTokenUri).length > 0 ? string(abi.encodePacked(baseTokenUri, trueId.toString())) : "";

    }



    function setTokenUri(string memory _baseTokenUri) external onlyOwner{

        baseTokenUri = _baseTokenUri;

    }

    function setPlaceHolderUri(string memory _placeholderTokenUri) external onlyOwner{

        placeholderTokenUri = _placeholderTokenUri;

    }



    function togglePause() external onlyOwner{

        pause = !pause;

    }



    function toggleSale() external onlyOwner{

        saleIsActive = !saleIsActive;

    }



    function toggleReveal() external onlyOwner{

        isRevealed = !isRevealed;

    }



    function withdraw() external onlyOwner {

        uint256 balance = address(this).balance;

        Address.sendValue(payable(owner()), balance);        

    }



    function contractURI() public view returns (string memory) {

        return bytes(placeholderTokenUri).length > 0 ? string(abi.encodePacked(placeholderTokenUri, "marketplace")) : "";

    }    

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_placeholderTokenUri","type":"string"},{"internalType":"string","name":"_baseTokenUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"checkCurrentMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholderTokenUri","type":"string"}],"name":"setPlaceHolderUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMint","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600b60016101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051620041ae380380620041ae833981810160405281019062000052919062000482565b6040518060400160405280600981526020017f486f6f747a204e465400000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f484f4f545a0000000000000000000000000000000000000000000000000000008152508160029080519060200190620000d692919062000235565b508060039080519060200190620000ef92919062000235565b50620001006200016260201b60201c565b6000819055505050620001286200011c6200016760201b60201c565b6200016f60201b60201c565b81600a90805190602001906200014092919062000235565b5080600990805190602001906200015992919062000235565b5050506200056c565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002439062000536565b90600052602060002090601f016020900481019282620002675760008555620002b3565b82601f106200028257805160ff1916838001178555620002b3565b82800160010185558215620002b3579182015b82811115620002b257825182559160200191906001019062000295565b5b509050620002c29190620002c6565b5090565b5b80821115620002e1576000816000905550600101620002c7565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034e8262000303565b810181811067ffffffffffffffff8211171562000370576200036f62000314565b5b80604052505050565b600062000385620002e5565b905062000393828262000343565b919050565b600067ffffffffffffffff821115620003b657620003b562000314565b5b620003c18262000303565b9050602081019050919050565b60005b83811015620003ee578082015181840152602081019050620003d1565b83811115620003fe576000848401525b50505050565b60006200041b620004158462000398565b62000379565b9050828152602081018484840111156200043a5762000439620002fe565b5b62000447848285620003ce565b509392505050565b600082601f830112620004675762000466620002f9565b5b81516200047984826020860162000404565b91505092915050565b600080604083850312156200049c576200049b620002ef565b5b600083015167ffffffffffffffff811115620004bd57620004bc620002f4565b5b620004cb858286016200044f565b925050602083015167ffffffffffffffff811115620004ef57620004ee620002f4565b5b620004fd858286016200044f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200054f57607f821691505b6020821081141562000566576200056562000507565b5b50919050565b613c32806200057c6000396000f3fe60806040526004361061021a5760003560e01c80637d8966e411610123578063ba7a86b8116100ab578063e8b5498d1161006f578063e8b5498d14610768578063e985e9c514610793578063eb8d2444146107d0578063f0292a03146107fb578063f2fde38b146108265761021a565b8063ba7a86b814610695578063c4ae3168146106ac578063c87b56dd146106c3578063e0fa184214610700578063e8a3d4851461073d5761021a565b806395d89b41116100f257806395d89b41146105d3578063a0712d68146105fe578063a22cb4651461061a578063b0962c5314610643578063b88d4fde1461066c5761021a565b80637d8966e41461053b5780638456cb59146105525780638d859f3e1461057d5780638da5cb5b146105a85761021a565b80633ccfd60b116101a65780635b8ad429116101755780635b8ad429146104685780636352211e1461047f57806370a08231146104bc578063715018a6146104f95780637ae84f7f146105105761021a565b80633ccfd60b146103d257806342842e0e146103e95780634cf5f7a41461041257806354214f691461043d5761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806318160ddd1461031657806323b872dd1461034157806332cb6b0c1461036a578063394ddcab146103955761021a565b806301ffc9a71461021f5780630675b7c61461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612a31565b61084f565b6040516102539190612a79565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e9190612bda565b6108e1565b005b34801561029157600080fd5b5061029a610977565b6040516102a79190612cab565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190612d03565b610a09565b6040516102e49190612d71565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190612db8565b610a85565b005b34801561032257600080fd5b5061032b610c2c565b6040516103389190612e07565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190612e22565b610c43565b005b34801561037657600080fd5b5061037f610c53565b60405161038c9190612e07565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190612d03565b610c59565b6040516103c99190612e07565b60405180910390f35b3480156103de57600080fd5b506103e7610df2565b005b3480156103f557600080fd5b50610410600480360381019061040b9190612e22565b610e87565b005b34801561041e57600080fd5b50610427610ea7565b6040516104349190612cab565b60405180910390f35b34801561044957600080fd5b50610452610f35565b60405161045f9190612a79565b60405180910390f35b34801561047457600080fd5b5061047d610f48565b005b34801561048b57600080fd5b506104a660048036038101906104a19190612d03565b610ff0565b6040516104b39190612d71565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190612e75565b611002565b6040516104f09190612e07565b60405180910390f35b34801561050557600080fd5b5061050e6110bb565b005b34801561051c57600080fd5b50610525611143565b6040516105329190612e07565b60405180910390f35b34801561054757600080fd5b50610550611148565b005b34801561055e57600080fd5b506105676111f0565b6040516105749190612a79565b60405180910390f35b34801561058957600080fd5b50610592611203565b60405161059f9190612e07565b60405180910390f35b3480156105b457600080fd5b506105bd61120e565b6040516105ca9190612d71565b60405180910390f35b3480156105df57600080fd5b506105e8611238565b6040516105f59190612cab565b60405180910390f35b61061860048036038101906106139190612d03565b6112ca565b005b34801561062657600080fd5b50610641600480360381019061063c9190612ece565b611564565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612bda565b6116dc565b005b34801561067857600080fd5b50610693600480360381019061068e9190612faf565b611772565b005b3480156106a157600080fd5b506106aa6117e5565b005b3480156106b857600080fd5b506106c16118d9565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190612d03565b611981565b6040516106f79190612cab565b60405180910390f35b34801561070c57600080fd5b5061072760048036038101906107229190612e75565b611aa5565b6040516107349190612e07565b60405180910390f35b34801561074957600080fd5b50610752611abd565b60405161075f9190612cab565b60405180910390f35b34801561077457600080fd5b5061077d611b11565b60405161078a9190612a79565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190613032565b611b24565b6040516107c79190612a79565b60405180910390f35b3480156107dc57600080fd5b506107e5611bb8565b6040516107f29190612a79565b60405180910390f35b34801561080757600080fd5b50610810611bcb565b60405161081d9190612e07565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190612e75565b611bd0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108aa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108da5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6108e9611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661090761120e565b73ffffffffffffffffffffffffffffffffffffffff161461095d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610954906130be565b60405180910390fd5b8060099080519060200190610973929190612922565b5050565b6060600280546109869061310d565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061310d565b80156109ff5780601f106109d4576101008083540402835291602001916109ff565b820191906000526020600020905b8154815290600101906020018083116109e257829003601f168201915b5050505050905090565b6000610a1482611cd0565b610a4a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9082611d2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b17611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614610b7a57610b4381610b3e611dfd565b611b24565b610b79576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c36611e05565b6001546000540303905090565b610c4e838383611e0a565b505050565b61138881565b60008060405180606001604052806107d061ffff168152602001610bb861ffff168152602001610fa061ffff168152509050600080600190505b848111610de757600081610ca5610c2c565b610caf919061316e565b905083600060038110610cc557610cc46131c4565b5b602002015161ffff1681118015610cf8575083600160038110610ceb57610cea6131c4565b5b602002015161ffff168111155b15610d13576611c37937e0800083610d10919061316e565b92505b83600160038110610d2757610d266131c4565b5b602002015161ffff1681118015610d5a575083600260038110610d4d57610d4c6131c4565b5b602002015161ffff168111155b15610d8d57606460966611c37937e08000610d7591906131f3565b610d7f919061327c565b83610d8a919061316e565b92505b83600260038110610da157610da06131c4565b5b602002015161ffff16811115610dd35760026611c37937e08000610dc591906131f3565b83610dd0919061316e565b92505b508080610ddf906132ad565b915050610c93565b508092505050919050565b610dfa611cc8565b73ffffffffffffffffffffffffffffffffffffffff16610e1861120e565b73ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e65906130be565b60405180910390fd5b6000479050610e84610e7e61120e565b826121b4565b50565b610ea283838360405180602001604052806000815250611772565b505050565b600a8054610eb49061310d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee09061310d565b8015610f2d5780601f10610f0257610100808354040283529160200191610f2d565b820191906000526020600020905b815481529060010190602001808311610f1057829003601f168201915b505050505081565b600b60009054906101000a900460ff1681565b610f50611cc8565b73ffffffffffffffffffffffffffffffffffffffff16610f6e61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbb906130be565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b6000610ffb82611d2f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561106a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110c3611cc8565b73ffffffffffffffffffffffffffffffffffffffff166110e161120e565b73ffffffffffffffffffffffffffffffffffffffff1614611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e906130be565b60405180910390fd5b61114160006122a8565b565b60c881565b611150611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661116e61120e565b73ffffffffffffffffffffffffffffffffffffffff16146111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb906130be565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b600b60029054906101000a900460ff1681565b6611c37937e0800081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112479061310d565b80601f01602080910402602001604051908101604052809291908181526020018280546112739061310d565b80156112c05780601f10611295576101008083540402835291602001916112c0565b820191906000526020600020905b8154815290600101906020018083116112a357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613342565b60405180910390fd5b600b60019054906101000a900460ff16611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e906133ae565b60405180910390fd5b611388611392610c2c565b106113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c99061341a565b60405180910390fd5b611388816113de610c2c565b6113e8919061316e565b1115611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090613486565b60405180910390fd5b600a81111561146d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146490613518565b60405180910390fd5b600081116114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790613584565b60405180910390fd5b60006114bb82610c59565b905080341015611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f7906135f0565b60405180910390fd5b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461154f919061316e565b92505081905550611560338361236e565b5050565b61156c611dfd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115de611dfd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168b611dfd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d09190612a79565b60405180910390a35050565b6116e4611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661170261120e565b73ffffffffffffffffffffffffffffffffffffffff1614611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906130be565b60405180910390fd5b80600a908051906020019061176e929190612922565b5050565b61177d848484611e0a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117df576117a88484848461238c565b6117de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6117ed611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661180b61120e565b73ffffffffffffffffffffffffffffffffffffffff1614611861576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611858906130be565b60405180910390fd5b600b60039054906101000a900460ff16156118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a89061365c565b60405180910390fd5b6001600b60036101000a81548160ff0219169083151502179055506118d73360c861236e565b565b6118e1611cc8565b73ffffffffffffffffffffffffffffffffffffffff166118ff61120e565b73ffffffffffffffffffffffffffffffffffffffff1614611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194c906130be565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b606061198c82611cd0565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c2906136ee565b60405180910390fd5b60006001836119da919061316e565b9050600b60009054906101000a900460ff16611a45576000600a80546119ff9061310d565b905011611a1b5760405180602001604052806000815250611a3d565b600a604051602001611a2d91906137f9565b6040516020818303038152906040525b915050611aa0565b600060098054611a549061310d565b905011611a705760405180602001604052806000815250611a9c565b6009611a7b826124ec565b604051602001611a8c92919061384c565b6040516020818303038152906040525b9150505b919050565b600c6020528060005260406000206000915090505481565b60606000600a8054611ace9061310d565b905011611aea5760405180602001604052806000815250611b0c565b600a604051602001611afc91906138bc565b6040516020818303038152906040525b905090565b600b60039054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60019054906101000a900460ff1681565b600a81565b611bd8611cc8565b73ffffffffffffffffffffffffffffffffffffffff16611bf661120e565b73ffffffffffffffffffffffffffffffffffffffff1614611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c43906130be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390613950565b60405180910390fd5b611cc5816122a8565b50565b600033905090565b600081611cdb611e05565b11158015611cea575060005482105b8015611d28575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611d3e611e05565b11611dc657600054811015611dc55760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611dc3575b6000811415611db9576004600083600190039350838152602001908152602001600020549050611d8e565b8092505050611df8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611e1582611d2f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e7c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e9d611dfd565b73ffffffffffffffffffffffffffffffffffffffff161480611ecc5750611ecb85611ec6611dfd565b611b24565b5b80611f115750611eda611dfd565b73ffffffffffffffffffffffffffffffffffffffff16611ef984610a09565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f4a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fb1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fbe858585600161264d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6120bb86612653565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612145576000600184019050600060046000838152602001908152602001600020541415612143576000548114612142578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121ad858585600161265d565b5050505050565b804710156121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee906139bc565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161221d90613a0d565b60006040518083038185875af1925050503d806000811461225a576040519150601f19603f3d011682016040523d82523d6000602084013e61225f565b606091505b50509050806122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90613a94565b60405180910390fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612388828260405180602001604052806000815250612663565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123b2611dfd565b8786866040518563ffffffff1660e01b81526004016123d49493929190613b09565b602060405180830381600087803b1580156123ee57600080fd5b505af192505050801561241f57506040513d601f19601f8201168201806040525081019061241c9190613b6a565b60015b612499573d806000811461244f576040519150601f19603f3d011682016040523d82523d6000602084013e612454565b606091505b50600081511415612491576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612534576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612648565b600082905060005b6000821461256657808061254f906132ad565b915050600a8261255f919061327c565b915061253c565b60008167ffffffffffffffff81111561258257612581612aaf565b5b6040519080825280601f01601f1916602001820160405280156125b45781602001600182028036833780820191505090505b5090505b60008514612641576001826125cd9190613b97565b9150600a856125dc9190613bcb565b60306125e8919061316e565b60f81b8183815181106125fe576125fd6131c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561263a919061327c565b94506125b8565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561270b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612718600085838661264d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161277d60018514612918565b901b60a042901b61278d86612653565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612891575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612841600087848060010195508761238c565b612877576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106127d257826000541461288c57600080fd5b6128fc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612892575b816000819055505050612912600085838661265d565b50505050565b6000819050919050565b82805461292e9061310d565b90600052602060002090601f0160209004810192826129505760008555612997565b82601f1061296957805160ff1916838001178555612997565b82800160010185558215612997579182015b8281111561299657825182559160200191906001019061297b565b5b5090506129a491906129a8565b5090565b5b808211156129c15760008160009055506001016129a9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a0e816129d9565b8114612a1957600080fd5b50565b600081359050612a2b81612a05565b92915050565b600060208284031215612a4757612a466129cf565b5b6000612a5584828501612a1c565b91505092915050565b60008115159050919050565b612a7381612a5e565b82525050565b6000602082019050612a8e6000830184612a6a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ae782612a9e565b810181811067ffffffffffffffff82111715612b0657612b05612aaf565b5b80604052505050565b6000612b196129c5565b9050612b258282612ade565b919050565b600067ffffffffffffffff821115612b4557612b44612aaf565b5b612b4e82612a9e565b9050602081019050919050565b82818337600083830152505050565b6000612b7d612b7884612b2a565b612b0f565b905082815260208101848484011115612b9957612b98612a99565b5b612ba4848285612b5b565b509392505050565b600082601f830112612bc157612bc0612a94565b5b8135612bd1848260208601612b6a565b91505092915050565b600060208284031215612bf057612bef6129cf565b5b600082013567ffffffffffffffff811115612c0e57612c0d6129d4565b5b612c1a84828501612bac565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c5d578082015181840152602081019050612c42565b83811115612c6c576000848401525b50505050565b6000612c7d82612c23565b612c878185612c2e565b9350612c97818560208601612c3f565b612ca081612a9e565b840191505092915050565b60006020820190508181036000830152612cc58184612c72565b905092915050565b6000819050919050565b612ce081612ccd565b8114612ceb57600080fd5b50565b600081359050612cfd81612cd7565b92915050565b600060208284031215612d1957612d186129cf565b5b6000612d2784828501612cee565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d5b82612d30565b9050919050565b612d6b81612d50565b82525050565b6000602082019050612d866000830184612d62565b92915050565b612d9581612d50565b8114612da057600080fd5b50565b600081359050612db281612d8c565b92915050565b60008060408385031215612dcf57612dce6129cf565b5b6000612ddd85828601612da3565b9250506020612dee85828601612cee565b9150509250929050565b612e0181612ccd565b82525050565b6000602082019050612e1c6000830184612df8565b92915050565b600080600060608486031215612e3b57612e3a6129cf565b5b6000612e4986828701612da3565b9350506020612e5a86828701612da3565b9250506040612e6b86828701612cee565b9150509250925092565b600060208284031215612e8b57612e8a6129cf565b5b6000612e9984828501612da3565b91505092915050565b612eab81612a5e565b8114612eb657600080fd5b50565b600081359050612ec881612ea2565b92915050565b60008060408385031215612ee557612ee46129cf565b5b6000612ef385828601612da3565b9250506020612f0485828601612eb9565b9150509250929050565b600067ffffffffffffffff821115612f2957612f28612aaf565b5b612f3282612a9e565b9050602081019050919050565b6000612f52612f4d84612f0e565b612b0f565b905082815260208101848484011115612f6e57612f6d612a99565b5b612f79848285612b5b565b509392505050565b600082601f830112612f9657612f95612a94565b5b8135612fa6848260208601612f3f565b91505092915050565b60008060008060808587031215612fc957612fc86129cf565b5b6000612fd787828801612da3565b9450506020612fe887828801612da3565b9350506040612ff987828801612cee565b925050606085013567ffffffffffffffff81111561301a576130196129d4565b5b61302687828801612f81565b91505092959194509250565b60008060408385031215613049576130486129cf565b5b600061305785828601612da3565b925050602061306885828601612da3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130a8602083612c2e565b91506130b382613072565b602082019050919050565b600060208201905081810360008301526130d78161309b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061312557607f821691505b60208210811415613139576131386130de565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317982612ccd565b915061318483612ccd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131b9576131b861313f565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006131fe82612ccd565b915061320983612ccd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132425761324161313f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061328782612ccd565b915061329283612ccd565b9250826132a2576132a161324d565b5b828204905092915050565b60006132b882612ccd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132eb576132ea61313f565b5b600182019050919050565b7f43616e6e6f742062652063616c6c6564206279206120636f6e74726163740000600082015250565b600061332c601e83612c2e565b9150613337826132f6565b602082019050919050565b6000602082019050818103600083015261335b8161331f565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b6000613398600f83612c2e565b91506133a382613362565b602082019050919050565b600060208201905081810360008301526133c78161338b565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b6000613404601b83612c2e565b915061340f826133ce565b602082019050919050565b60006020820190508181036000830152613433816133f7565b9050919050565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b6000613470601f83612c2e565b915061347b8261343a565b602082019050919050565b6000602082019050818103600083015261349f81613463565b9050919050565b7f50757263686173652065786365656473206d617820616c6c6f7765642070657260008201527f2074780000000000000000000000000000000000000000000000000000000000602082015250565b6000613502602383612c2e565b915061350d826134a6565b604082019050919050565b60006020820190508181036000830152613531816134f5565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b600061356e601c83612c2e565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b7f50726963652069732077726f6e67000000000000000000000000000000000000600082015250565b60006135da600e83612c2e565b91506135e5826135a4565b602082019050919050565b60006020820190508181036000830152613609816135cd565b9050919050565b7f5465616d20616c7265616479206d696e74656400000000000000000000000000600082015250565b6000613646601383612c2e565b915061365182613610565b602082019050919050565b6000602082019050818103600083015261367581613639565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006136d8602f83612c2e565b91506136e38261367c565b604082019050919050565b60006020820190508181036000830152613707816136cb565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461373b8161310d565b613745818661370e565b945060018216600081146137605760018114613771576137a4565b60ff198316865281860193506137a4565b61377a85613719565b60005b8381101561379c5781548189015260018201915060208101905061377d565b838801955050505b50505092915050565b7f756e72657665616c656400000000000000000000000000000000000000000000600082015250565b60006137e3600a8361370e565b91506137ee826137ad565b600a82019050919050565b6000613805828461372e565b9150613810826137d6565b915081905092915050565b600061382682612c23565b613830818561370e565b9350613840818560208601612c3f565b80840191505092915050565b6000613858828561372e565b9150613864828461381b565b91508190509392505050565b7f6d61726b6574706c616365000000000000000000000000000000000000000000600082015250565b60006138a6600b8361370e565b91506138b182613870565b600b82019050919050565b60006138c8828461372e565b91506138d382613899565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061393a602683612c2e565b9150613945826138de565b604082019050919050565b600060208201905081810360008301526139698161392d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006139a6601d83612c2e565b91506139b182613970565b602082019050919050565b600060208201905081810360008301526139d581613999565b9050919050565b600081905092915050565b50565b60006139f76000836139dc565b9150613a02826139e7565b600082019050919050565b6000613a18826139ea565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613a7e603a83612c2e565b9150613a8982613a22565b604082019050919050565b60006020820190508181036000830152613aad81613a71565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613adb82613ab4565b613ae58185613abf565b9350613af5818560208601612c3f565b613afe81612a9e565b840191505092915050565b6000608082019050613b1e6000830187612d62565b613b2b6020830186612d62565b613b386040830185612df8565b8181036060830152613b4a8184613ad0565b905095945050505050565b600081519050613b6481612a05565b92915050565b600060208284031215613b8057613b7f6129cf565b5b6000613b8e84828501613b55565b91505092915050565b6000613ba282612ccd565b9150613bad83612ccd565b925082821015613bc057613bbf61313f565b5b828203905092915050565b6000613bd682612ccd565b9150613be183612ccd565b925082613bf157613bf061324d565b5b82820690509291505056fea2646970667358221220ff6ff0ab173f7675512bade5b4667807d830cd125892770e4a01a7d1afea2ca764736f6c634300080900330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637d8966e411610123578063ba7a86b8116100ab578063e8b5498d1161006f578063e8b5498d14610768578063e985e9c514610793578063eb8d2444146107d0578063f0292a03146107fb578063f2fde38b146108265761021a565b8063ba7a86b814610695578063c4ae3168146106ac578063c87b56dd146106c3578063e0fa184214610700578063e8a3d4851461073d5761021a565b806395d89b41116100f257806395d89b41146105d3578063a0712d68146105fe578063a22cb4651461061a578063b0962c5314610643578063b88d4fde1461066c5761021a565b80637d8966e41461053b5780638456cb59146105525780638d859f3e1461057d5780638da5cb5b146105a85761021a565b80633ccfd60b116101a65780635b8ad429116101755780635b8ad429146104685780636352211e1461047f57806370a08231146104bc578063715018a6146104f95780637ae84f7f146105105761021a565b80633ccfd60b146103d257806342842e0e146103e95780634cf5f7a41461041257806354214f691461043d5761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806318160ddd1461031657806323b872dd1461034157806332cb6b0c1461036a578063394ddcab146103955761021a565b806301ffc9a71461021f5780630675b7c61461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612a31565b61084f565b6040516102539190612a79565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e9190612bda565b6108e1565b005b34801561029157600080fd5b5061029a610977565b6040516102a79190612cab565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190612d03565b610a09565b6040516102e49190612d71565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190612db8565b610a85565b005b34801561032257600080fd5b5061032b610c2c565b6040516103389190612e07565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190612e22565b610c43565b005b34801561037657600080fd5b5061037f610c53565b60405161038c9190612e07565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190612d03565b610c59565b6040516103c99190612e07565b60405180910390f35b3480156103de57600080fd5b506103e7610df2565b005b3480156103f557600080fd5b50610410600480360381019061040b9190612e22565b610e87565b005b34801561041e57600080fd5b50610427610ea7565b6040516104349190612cab565b60405180910390f35b34801561044957600080fd5b50610452610f35565b60405161045f9190612a79565b60405180910390f35b34801561047457600080fd5b5061047d610f48565b005b34801561048b57600080fd5b506104a660048036038101906104a19190612d03565b610ff0565b6040516104b39190612d71565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190612e75565b611002565b6040516104f09190612e07565b60405180910390f35b34801561050557600080fd5b5061050e6110bb565b005b34801561051c57600080fd5b50610525611143565b6040516105329190612e07565b60405180910390f35b34801561054757600080fd5b50610550611148565b005b34801561055e57600080fd5b506105676111f0565b6040516105749190612a79565b60405180910390f35b34801561058957600080fd5b50610592611203565b60405161059f9190612e07565b60405180910390f35b3480156105b457600080fd5b506105bd61120e565b6040516105ca9190612d71565b60405180910390f35b3480156105df57600080fd5b506105e8611238565b6040516105f59190612cab565b60405180910390f35b61061860048036038101906106139190612d03565b6112ca565b005b34801561062657600080fd5b50610641600480360381019061063c9190612ece565b611564565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612bda565b6116dc565b005b34801561067857600080fd5b50610693600480360381019061068e9190612faf565b611772565b005b3480156106a157600080fd5b506106aa6117e5565b005b3480156106b857600080fd5b506106c16118d9565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190612d03565b611981565b6040516106f79190612cab565b60405180910390f35b34801561070c57600080fd5b5061072760048036038101906107229190612e75565b611aa5565b6040516107349190612e07565b60405180910390f35b34801561074957600080fd5b50610752611abd565b60405161075f9190612cab565b60405180910390f35b34801561077457600080fd5b5061077d611b11565b60405161078a9190612a79565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190613032565b611b24565b6040516107c79190612a79565b60405180910390f35b3480156107dc57600080fd5b506107e5611bb8565b6040516107f29190612a79565b60405180910390f35b34801561080757600080fd5b50610810611bcb565b60405161081d9190612e07565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190612e75565b611bd0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108aa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108da5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6108e9611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661090761120e565b73ffffffffffffffffffffffffffffffffffffffff161461095d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610954906130be565b60405180910390fd5b8060099080519060200190610973929190612922565b5050565b6060600280546109869061310d565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061310d565b80156109ff5780601f106109d4576101008083540402835291602001916109ff565b820191906000526020600020905b8154815290600101906020018083116109e257829003601f168201915b5050505050905090565b6000610a1482611cd0565b610a4a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9082611d2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b17611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614610b7a57610b4381610b3e611dfd565b611b24565b610b79576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c36611e05565b6001546000540303905090565b610c4e838383611e0a565b505050565b61138881565b60008060405180606001604052806107d061ffff168152602001610bb861ffff168152602001610fa061ffff168152509050600080600190505b848111610de757600081610ca5610c2c565b610caf919061316e565b905083600060038110610cc557610cc46131c4565b5b602002015161ffff1681118015610cf8575083600160038110610ceb57610cea6131c4565b5b602002015161ffff168111155b15610d13576611c37937e0800083610d10919061316e565b92505b83600160038110610d2757610d266131c4565b5b602002015161ffff1681118015610d5a575083600260038110610d4d57610d4c6131c4565b5b602002015161ffff168111155b15610d8d57606460966611c37937e08000610d7591906131f3565b610d7f919061327c565b83610d8a919061316e565b92505b83600260038110610da157610da06131c4565b5b602002015161ffff16811115610dd35760026611c37937e08000610dc591906131f3565b83610dd0919061316e565b92505b508080610ddf906132ad565b915050610c93565b508092505050919050565b610dfa611cc8565b73ffffffffffffffffffffffffffffffffffffffff16610e1861120e565b73ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e65906130be565b60405180910390fd5b6000479050610e84610e7e61120e565b826121b4565b50565b610ea283838360405180602001604052806000815250611772565b505050565b600a8054610eb49061310d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee09061310d565b8015610f2d5780601f10610f0257610100808354040283529160200191610f2d565b820191906000526020600020905b815481529060010190602001808311610f1057829003601f168201915b505050505081565b600b60009054906101000a900460ff1681565b610f50611cc8565b73ffffffffffffffffffffffffffffffffffffffff16610f6e61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbb906130be565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b6000610ffb82611d2f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561106a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110c3611cc8565b73ffffffffffffffffffffffffffffffffffffffff166110e161120e565b73ffffffffffffffffffffffffffffffffffffffff1614611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e906130be565b60405180910390fd5b61114160006122a8565b565b60c881565b611150611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661116e61120e565b73ffffffffffffffffffffffffffffffffffffffff16146111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb906130be565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b600b60029054906101000a900460ff1681565b6611c37937e0800081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112479061310d565b80601f01602080910402602001604051908101604052809291908181526020018280546112739061310d565b80156112c05780601f10611295576101008083540402835291602001916112c0565b820191906000526020600020905b8154815290600101906020018083116112a357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613342565b60405180910390fd5b600b60019054906101000a900460ff16611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e906133ae565b60405180910390fd5b611388611392610c2c565b106113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c99061341a565b60405180910390fd5b611388816113de610c2c565b6113e8919061316e565b1115611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090613486565b60405180910390fd5b600a81111561146d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146490613518565b60405180910390fd5b600081116114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790613584565b60405180910390fd5b60006114bb82610c59565b905080341015611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f7906135f0565b60405180910390fd5b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461154f919061316e565b92505081905550611560338361236e565b5050565b61156c611dfd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115de611dfd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168b611dfd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d09190612a79565b60405180910390a35050565b6116e4611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661170261120e565b73ffffffffffffffffffffffffffffffffffffffff1614611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906130be565b60405180910390fd5b80600a908051906020019061176e929190612922565b5050565b61177d848484611e0a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117df576117a88484848461238c565b6117de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6117ed611cc8565b73ffffffffffffffffffffffffffffffffffffffff1661180b61120e565b73ffffffffffffffffffffffffffffffffffffffff1614611861576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611858906130be565b60405180910390fd5b600b60039054906101000a900460ff16156118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a89061365c565b60405180910390fd5b6001600b60036101000a81548160ff0219169083151502179055506118d73360c861236e565b565b6118e1611cc8565b73ffffffffffffffffffffffffffffffffffffffff166118ff61120e565b73ffffffffffffffffffffffffffffffffffffffff1614611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194c906130be565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b606061198c82611cd0565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c2906136ee565b60405180910390fd5b60006001836119da919061316e565b9050600b60009054906101000a900460ff16611a45576000600a80546119ff9061310d565b905011611a1b5760405180602001604052806000815250611a3d565b600a604051602001611a2d91906137f9565b6040516020818303038152906040525b915050611aa0565b600060098054611a549061310d565b905011611a705760405180602001604052806000815250611a9c565b6009611a7b826124ec565b604051602001611a8c92919061384c565b6040516020818303038152906040525b9150505b919050565b600c6020528060005260406000206000915090505481565b60606000600a8054611ace9061310d565b905011611aea5760405180602001604052806000815250611b0c565b600a604051602001611afc91906138bc565b6040516020818303038152906040525b905090565b600b60039054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60019054906101000a900460ff1681565b600a81565b611bd8611cc8565b73ffffffffffffffffffffffffffffffffffffffff16611bf661120e565b73ffffffffffffffffffffffffffffffffffffffff1614611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c43906130be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390613950565b60405180910390fd5b611cc5816122a8565b50565b600033905090565b600081611cdb611e05565b11158015611cea575060005482105b8015611d28575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611d3e611e05565b11611dc657600054811015611dc55760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611dc3575b6000811415611db9576004600083600190039350838152602001908152602001600020549050611d8e565b8092505050611df8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611e1582611d2f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e7c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e9d611dfd565b73ffffffffffffffffffffffffffffffffffffffff161480611ecc5750611ecb85611ec6611dfd565b611b24565b5b80611f115750611eda611dfd565b73ffffffffffffffffffffffffffffffffffffffff16611ef984610a09565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f4a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fb1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fbe858585600161264d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6120bb86612653565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612145576000600184019050600060046000838152602001908152602001600020541415612143576000548114612142578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121ad858585600161265d565b5050505050565b804710156121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee906139bc565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161221d90613a0d565b60006040518083038185875af1925050503d806000811461225a576040519150601f19603f3d011682016040523d82523d6000602084013e61225f565b606091505b50509050806122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90613a94565b60405180910390fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612388828260405180602001604052806000815250612663565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123b2611dfd565b8786866040518563ffffffff1660e01b81526004016123d49493929190613b09565b602060405180830381600087803b1580156123ee57600080fd5b505af192505050801561241f57506040513d601f19601f8201168201806040525081019061241c9190613b6a565b60015b612499573d806000811461244f576040519150601f19603f3d011682016040523d82523d6000602084013e612454565b606091505b50600081511415612491576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612534576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612648565b600082905060005b6000821461256657808061254f906132ad565b915050600a8261255f919061327c565b915061253c565b60008167ffffffffffffffff81111561258257612581612aaf565b5b6040519080825280601f01601f1916602001820160405280156125b45781602001600182028036833780820191505090505b5090505b60008514612641576001826125cd9190613b97565b9150600a856125dc9190613bcb565b60306125e8919061316e565b60f81b8183815181106125fe576125fd6131c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561263a919061327c565b94506125b8565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561270b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612718600085838661264d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161277d60018514612918565b901b60a042901b61278d86612653565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612891575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612841600087848060010195508761238c565b612877576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106127d257826000541461288c57600080fd5b6128fc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612892575b816000819055505050612912600085838661265d565b50505050565b6000819050919050565b82805461292e9061310d565b90600052602060002090601f0160209004810192826129505760008555612997565b82601f1061296957805160ff1916838001178555612997565b82800160010185558215612997579182015b8281111561299657825182559160200191906001019061297b565b5b5090506129a491906129a8565b5090565b5b808211156129c15760008160009055506001016129a9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a0e816129d9565b8114612a1957600080fd5b50565b600081359050612a2b81612a05565b92915050565b600060208284031215612a4757612a466129cf565b5b6000612a5584828501612a1c565b91505092915050565b60008115159050919050565b612a7381612a5e565b82525050565b6000602082019050612a8e6000830184612a6a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ae782612a9e565b810181811067ffffffffffffffff82111715612b0657612b05612aaf565b5b80604052505050565b6000612b196129c5565b9050612b258282612ade565b919050565b600067ffffffffffffffff821115612b4557612b44612aaf565b5b612b4e82612a9e565b9050602081019050919050565b82818337600083830152505050565b6000612b7d612b7884612b2a565b612b0f565b905082815260208101848484011115612b9957612b98612a99565b5b612ba4848285612b5b565b509392505050565b600082601f830112612bc157612bc0612a94565b5b8135612bd1848260208601612b6a565b91505092915050565b600060208284031215612bf057612bef6129cf565b5b600082013567ffffffffffffffff811115612c0e57612c0d6129d4565b5b612c1a84828501612bac565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c5d578082015181840152602081019050612c42565b83811115612c6c576000848401525b50505050565b6000612c7d82612c23565b612c878185612c2e565b9350612c97818560208601612c3f565b612ca081612a9e565b840191505092915050565b60006020820190508181036000830152612cc58184612c72565b905092915050565b6000819050919050565b612ce081612ccd565b8114612ceb57600080fd5b50565b600081359050612cfd81612cd7565b92915050565b600060208284031215612d1957612d186129cf565b5b6000612d2784828501612cee565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d5b82612d30565b9050919050565b612d6b81612d50565b82525050565b6000602082019050612d866000830184612d62565b92915050565b612d9581612d50565b8114612da057600080fd5b50565b600081359050612db281612d8c565b92915050565b60008060408385031215612dcf57612dce6129cf565b5b6000612ddd85828601612da3565b9250506020612dee85828601612cee565b9150509250929050565b612e0181612ccd565b82525050565b6000602082019050612e1c6000830184612df8565b92915050565b600080600060608486031215612e3b57612e3a6129cf565b5b6000612e4986828701612da3565b9350506020612e5a86828701612da3565b9250506040612e6b86828701612cee565b9150509250925092565b600060208284031215612e8b57612e8a6129cf565b5b6000612e9984828501612da3565b91505092915050565b612eab81612a5e565b8114612eb657600080fd5b50565b600081359050612ec881612ea2565b92915050565b60008060408385031215612ee557612ee46129cf565b5b6000612ef385828601612da3565b9250506020612f0485828601612eb9565b9150509250929050565b600067ffffffffffffffff821115612f2957612f28612aaf565b5b612f3282612a9e565b9050602081019050919050565b6000612f52612f4d84612f0e565b612b0f565b905082815260208101848484011115612f6e57612f6d612a99565b5b612f79848285612b5b565b509392505050565b600082601f830112612f9657612f95612a94565b5b8135612fa6848260208601612f3f565b91505092915050565b60008060008060808587031215612fc957612fc86129cf565b5b6000612fd787828801612da3565b9450506020612fe887828801612da3565b9350506040612ff987828801612cee565b925050606085013567ffffffffffffffff81111561301a576130196129d4565b5b61302687828801612f81565b91505092959194509250565b60008060408385031215613049576130486129cf565b5b600061305785828601612da3565b925050602061306885828601612da3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130a8602083612c2e565b91506130b382613072565b602082019050919050565b600060208201905081810360008301526130d78161309b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061312557607f821691505b60208210811415613139576131386130de565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317982612ccd565b915061318483612ccd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131b9576131b861313f565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006131fe82612ccd565b915061320983612ccd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132425761324161313f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061328782612ccd565b915061329283612ccd565b9250826132a2576132a161324d565b5b828204905092915050565b60006132b882612ccd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132eb576132ea61313f565b5b600182019050919050565b7f43616e6e6f742062652063616c6c6564206279206120636f6e74726163740000600082015250565b600061332c601e83612c2e565b9150613337826132f6565b602082019050919050565b6000602082019050818103600083015261335b8161331f565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b6000613398600f83612c2e565b91506133a382613362565b602082019050919050565b600060208201905081810360008301526133c78161338b565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b6000613404601b83612c2e565b915061340f826133ce565b602082019050919050565b60006020820190508181036000830152613433816133f7565b9050919050565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b6000613470601f83612c2e565b915061347b8261343a565b602082019050919050565b6000602082019050818103600083015261349f81613463565b9050919050565b7f50757263686173652065786365656473206d617820616c6c6f7765642070657260008201527f2074780000000000000000000000000000000000000000000000000000000000602082015250565b6000613502602383612c2e565b915061350d826134a6565b604082019050919050565b60006020820190508181036000830152613531816134f5565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b600061356e601c83612c2e565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b7f50726963652069732077726f6e67000000000000000000000000000000000000600082015250565b60006135da600e83612c2e565b91506135e5826135a4565b602082019050919050565b60006020820190508181036000830152613609816135cd565b9050919050565b7f5465616d20616c7265616479206d696e74656400000000000000000000000000600082015250565b6000613646601383612c2e565b915061365182613610565b602082019050919050565b6000602082019050818103600083015261367581613639565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006136d8602f83612c2e565b91506136e38261367c565b604082019050919050565b60006020820190508181036000830152613707816136cb565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461373b8161310d565b613745818661370e565b945060018216600081146137605760018114613771576137a4565b60ff198316865281860193506137a4565b61377a85613719565b60005b8381101561379c5781548189015260018201915060208101905061377d565b838801955050505b50505092915050565b7f756e72657665616c656400000000000000000000000000000000000000000000600082015250565b60006137e3600a8361370e565b91506137ee826137ad565b600a82019050919050565b6000613805828461372e565b9150613810826137d6565b915081905092915050565b600061382682612c23565b613830818561370e565b9350613840818560208601612c3f565b80840191505092915050565b6000613858828561372e565b9150613864828461381b565b91508190509392505050565b7f6d61726b6574706c616365000000000000000000000000000000000000000000600082015250565b60006138a6600b8361370e565b91506138b182613870565b600b82019050919050565b60006138c8828461372e565b91506138d382613899565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061393a602683612c2e565b9150613945826138de565b604082019050919050565b600060208201905081810360008301526139698161392d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006139a6601d83612c2e565b91506139b182613970565b602082019050919050565b600060208201905081810360008301526139d581613999565b9050919050565b600081905092915050565b50565b60006139f76000836139dc565b9150613a02826139e7565b600082019050919050565b6000613a18826139ea565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613a7e603a83612c2e565b9150613a8982613a22565b604082019050919050565b60006020820190508181036000830152613aad81613a71565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613adb82613ab4565b613ae58185613abf565b9350613af5818560208601612c3f565b613afe81612a9e565b840191505092915050565b6000608082019050613b1e6000830187612d62565b613b2b6020830186612d62565b613b386040830185612df8565b8181036060830152613b4a8184613ad0565b905095945050505050565b600081519050613b6481612a05565b92915050565b600060208284031215613b8057613b7f6129cf565b5b6000613b8e84828501613b55565b91505092915050565b6000613ba282612ccd565b9150613bad83612ccd565b925082821015613bc057613bbf61313f565b5b828203905092915050565b6000613bd682612ccd565b9150613be183612ccd565b925082613bf157613bf061324d565b5b82820690509291505056fea2646970667358221220ff6ff0ab173f7675512bade5b4667807d830cd125892770e4a01a7d1afea2ca764736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _placeholderTokenUri (string):
Arg [1] : _baseTokenUri (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55820:4178:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27123:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59038:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32136:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34204:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33664:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26177:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35090:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55904:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56739:693;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59617:166;;;;;;;;;;;;;:::i;:::-;;35331:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56145:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56191:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59516:89;;;;;;;;;;;;;:::i;:::-;;31925:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27802:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11109:103;;;;;;;;;;;;;:::i;:::-;;56000:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59413:91;;;;;;;;;;;;;:::i;:::-;;56262:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56052:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10458:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32305:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57448:676;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34480:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59165:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35587:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58140:183;;;;;;;;;;;;;:::i;:::-;;59323:78;;;;;;;;;;;;;:::i;:::-;;58502:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56323:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59795:194;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56288:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34859:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56222:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55954:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11367:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27123:615;27208:4;27523:10;27508:25;;:11;:25;;;;:102;;;;27600:10;27585:25;;:11;:25;;;;27508:102;:179;;;;27677:10;27662:25;;:11;:25;;;;27508:179;27488:199;;27123:615;;;:::o;59038:119::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59134:13:::1;59119:12;:28;;;;;;;;;;;;:::i;:::-;;59038:119:::0;:::o;32136:100::-;32190:13;32223:5;32216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32136:100;:::o;34204:204::-;34272:7;34297:16;34305:7;34297;:16::i;:::-;34292:64;;34322:34;;;;;;;;;;;;;;34292:64;34376:15;:24;34392:7;34376:24;;;;;;;;;;;;;;;;;;;;;34369:31;;34204:204;;;:::o;33664:474::-;33737:13;33769:27;33788:7;33769:18;:27::i;:::-;33737:61;;33819:5;33813:11;;:2;:11;;;33809:48;;;33833:24;;;;;;;;;;;;;;33809:48;33897:5;33874:28;;:19;:17;:19::i;:::-;:28;;;33870:175;;33922:44;33939:5;33946:19;:17;:19::i;:::-;33922:16;:44::i;:::-;33917:128;;33994:35;;;;;;;;;;;;;;33917:128;33870:175;34084:2;34057:15;:24;34073:7;34057:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34122:7;34118:2;34102:28;;34111:5;34102:28;;;;;;;;;;;;33726:412;33664:474;;:::o;26177:315::-;26230:7;26458:15;:13;:15::i;:::-;26443:12;;26427:13;;:28;:46;26420:53;;26177:315;:::o;35090:170::-;35224:28;35234:4;35240:2;35244:7;35224:9;:28::i;:::-;35090:170;;;:::o;55904:41::-;55941:4;55904:41;:::o;56739:693::-;56810:7;56832:22;:43;;;;;;;;56858:4;56832:43;;;;;;56864:4;56832:43;;;;;;56870:4;56832:43;;;;;;;56888:14;56924:9;56936:1;56924:13;;56919:478;56944:9;56939:1;:14;56919:478;;56977:20;57016:1;57000:13;:11;:13::i;:::-;:17;;;;:::i;:::-;56977:40;;57053:5;57059:1;57053:8;;;;;;;:::i;:::-;;;;;;57038:23;;:12;:23;:51;;;;;57081:5;57087:1;57081:8;;;;;;;:::i;:::-;;;;;;57065:24;;:12;:24;;57038:51;57034:110;;;56084:10;57111:15;;;;;:::i;:::-;;;57034:110;57179:5;57185:1;57179:8;;;;;;;:::i;:::-;;;;;;57164:23;;:12;:23;:51;;;;;57207:5;57213:1;57207:8;;;;;;;:::i;:::-;;;;;;57191:24;;:12;:24;;57164:51;57160:122;;;57261:3;57255;56084:10;57247:11;;;;:::i;:::-;:17;;;;:::i;:::-;57237:27;;;;;:::i;:::-;;;57160:122;57317:5;57323:1;57317:8;;;;;;;:::i;:::-;;;;;;57302:23;;:12;:23;57298:86;;;57365:1;56084:10;57357:9;;;;:::i;:::-;57347:19;;;;;:::i;:::-;;;57298:86;56960:437;56955:3;;;;;:::i;:::-;;;;56919:478;;;;57416:6;57409:13;;;;56739:693;;;:::o;59617:166::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59669:15:::1;59687:21;59669:39;;59721:44;59747:7;:5;:7::i;:::-;59757;59721:17;:44::i;:::-;59656:127;59617:166::o:0;35331:185::-;35469:39;35486:4;35492:2;35496:7;35469:39;;;;;;;;;;;;:16;:39::i;:::-;35331:185;;;:::o;56145:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56191:22::-;;;;;;;;;;;;;:::o;59516:89::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59585:10:::1;;;;;;;;;;;59584:11;59571:10;;:24;;;;;;;;;;;;;;;;;;59516:89::o:0;31925:144::-;31989:7;32032:27;32051:7;32032:18;:27::i;:::-;32009:52;;31925:144;;;:::o;27802:224::-;27866:7;27907:1;27890:19;;:5;:19;;;27886:60;;;27918:28;;;;;;;;;;;;;;27886:60;23141:13;27964:18;:25;27983:5;27964:25;;;;;;;;;;;;;;;;:54;27957:61;;27802:224;;;:::o;11109:103::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11174:30:::1;11201:1;11174:18;:30::i;:::-;11109:103::o:0;56000:43::-;56040:3;56000:43;:::o;59413:91::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59482:12:::1;;;;;;;;;;;59481:13;59466:12;;:28;;;;;;;;;;;;;;;;;;59413:91::o:0;56262:17::-;;;;;;;;;;;;;:::o;56052:42::-;56084:10;56052:42;:::o;10458:87::-;10504:7;10531:6;;;;;;;;;;;10524:13;;10458:87;:::o;32305:104::-;32361:13;32394:7;32387:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32305:104;:::o;57448:676::-;56658:10;56645:23;;:9;:23;;;56637:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57531:12:::1;;;;;;;;;;;57523:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;55941:4;57584:13;:11;:13::i;:::-;:26;57576:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55941:4;57679:9;57663:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;57655:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;55989:2;57759:9;:21;;57751:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;57853:1;57841:9;:13;57833:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;57904:14;57919:32;57941:9;57919:21;:32::i;:::-;57904:47;;57993:6;57980:9;:19;;57972:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;58060:9;58035;:21;58045:10;58035:21;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;58082:32;58092:10;58104:9;58082;:32::i;:::-;57510:614;57448:676:::0;:::o;34480:308::-;34591:19;:17;:19::i;:::-;34579:31;;:8;:31;;;34575:61;;;34619:17;;;;;;;;;;;;;;34575:61;34701:8;34649:18;:39;34668:19;:17;:19::i;:::-;34649:39;;;;;;;;;;;;;;;:49;34689:8;34649:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;34761:8;34725:55;;34740:19;:17;:19::i;:::-;34725:55;;;34771:8;34725:55;;;;;;:::i;:::-;;;;;;;;34480:308;;:::o;59165:146::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59281:20:::1;59259:19;:42;;;;;;;;;;;;:::i;:::-;;59165:146:::0;:::o;35587:396::-;35754:28;35764:4;35770:2;35774:7;35754:9;:28::i;:::-;35815:1;35797:2;:14;;;:19;35793:183;;35836:56;35867:4;35873:2;35877:7;35886:5;35836:30;:56::i;:::-;35831:145;;35920:40;;;;;;;;;;;;;;35831:145;35793:183;35587:396;;;;:::o;58140:183::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58200:10:::1;;;;;;;;;;;58199:11;58191:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;58260:4;58247:10;;:17;;;;;;;;;;;;;;;;;;58277:36;58287:10;56040:3;58277:9;:36::i;:::-;58140:183::o:0;59323:78::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59386:5:::1;;;;;;;;;;;59385:6;59377:5;;:14;;;;;;;;;;;;;;;;;;59323:78::o:0;58502:524::-;58575:13;58611:16;58619:7;58611;:16::i;:::-;58603:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58696:14;58723:1;58713:7;:11;;;;:::i;:::-;58696:28;;58745:10;;;;;;;;;;;58741:157;;58816:1;58786:19;58780:33;;;;;:::i;:::-;;;:37;:104;;;;;;;;;;;;;;;;;58844:19;58827:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;58780:104;58773:111;;;;;58741:157;58950:1;58927:12;58921:26;;;;;:::i;:::-;;;:30;:95;;;;;;;;;;;;;;;;;58978:12;58992:17;:6;:15;:17::i;:::-;58961:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58921:95;58914:102;;;58502:524;;;;:::o;56323:44::-;;;;;;;;;;;;;;;;;:::o;59795:194::-;59839:13;59910:1;59880:19;59874:33;;;;;:::i;:::-;;;:37;:105;;;;;;;;;;;;;;;;;59938:19;59921:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;59874:105;59867:112;;59795:194;:::o;56288:22::-;;;;;;;;;;;;;:::o;34859:164::-;34956:4;34980:18;:25;34999:5;34980:25;;;;;;;;;;;;;;;:35;35006:8;34980:35;;;;;;;;;;;;;;;;;;;;;;;;;34973:42;;34859:164;;;;:::o;56222:31::-;;;;;;;;;;;;;:::o;55954:37::-;55989:2;55954:37;:::o;11367:201::-;10689:12;:10;:12::i;:::-;10678:23;;:7;:5;:7::i;:::-;:23;;;10670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11476:1:::1;11456:22;;:8;:22;;;;11448:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11532:28;11551:8;11532:18;:28::i;:::-;11367:201:::0;:::o;9182:98::-;9235:7;9262:10;9255:17;;9182:98;:::o;36238:273::-;36295:4;36351:7;36332:15;:13;:15::i;:::-;:26;;:66;;;;;36385:13;;36375:7;:23;36332:66;:152;;;;;36483:1;23911:8;36436:17;:26;36454:7;36436:26;;;;;;;;;;;;:43;:48;36332:152;36312:172;;36238:273;;;:::o;29440:1129::-;29507:7;29527:12;29542:7;29527:22;;29610:4;29591:15;:13;:15::i;:::-;:23;29587:915;;29644:13;;29637:4;:20;29633:869;;;29682:14;29699:17;:23;29717:4;29699:23;;;;;;;;;;;;29682:40;;29815:1;23911:8;29788:6;:23;:28;29784:699;;;30307:113;30324:1;30314:6;:11;30307:113;;;30367:17;:25;30385:6;;;;;;;30367:25;;;;;;;;;;;;30358:34;;30307:113;;;30453:6;30446:13;;;;;;29784:699;29659:843;29633:869;29587:915;30530:31;;;;;;;;;;;;;;29440:1129;;;;:::o;50220:105::-;50280:7;50307:10;50300:17;;50220:105;:::o;25700:92::-;25756:7;25700:92;:::o;41477:2515::-;41592:27;41622;41641:7;41622:18;:27::i;:::-;41592:57;;41707:4;41666:45;;41682:19;41666:45;;;41662:86;;41720:28;;;;;;;;;;;;;;41662:86;41761:22;41810:4;41787:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;41831:43;41848:4;41854:19;:17;:19::i;:::-;41831:16;:43::i;:::-;41787:87;:147;;;;41915:19;:17;:19::i;:::-;41891:43;;:20;41903:7;41891:11;:20::i;:::-;:43;;;41787:147;41761:174;;41953:17;41948:66;;41979:35;;;;;;;;;;;;;;41948:66;42043:1;42029:16;;:2;:16;;;42025:52;;;42054:23;;;;;;;;;;;;;;42025:52;42090:43;42112:4;42118:2;42122:7;42131:1;42090:21;:43::i;:::-;42206:15;:24;42222:7;42206:24;;;;;;;;;;;;42199:31;;;;;;;;;;;42598:18;:24;42617:4;42598:24;;;;;;;;;;;;;;;;42596:26;;;;;;;;;;;;42667:18;:22;42686:2;42667:22;;;;;;;;;;;;;;;;42665:24;;;;;;;;;;;24193:8;23795:3;43048:15;:41;;43006:21;43024:2;43006:17;:21::i;:::-;:84;:128;42960:17;:26;42978:7;42960:26;;;;;;;;;;;:174;;;;43304:1;24193:8;43254:19;:46;:51;43250:626;;;43326:19;43358:1;43348:7;:11;43326:33;;43515:1;43481:17;:30;43499:11;43481:30;;;;;;;;;;;;:35;43477:384;;;43619:13;;43604:11;:28;43600:242;;43799:19;43766:17;:30;43784:11;43766:30;;;;;;;;;;;:52;;;;43600:242;43477:384;43307:569;43250:626;43923:7;43919:2;43904:27;;43913:4;43904:27;;;;;;;;;;;;43942:42;43963:4;43969:2;43973:7;43982:1;43942:20;:42::i;:::-;41581:2411;;41477:2515;;;:::o;2494:317::-;2609:6;2584:21;:31;;2576:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2663:12;2681:9;:14;;2703:6;2681:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2662:52;;;2733:7;2725:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2565:246;2494:317;;:::o;11728:191::-;11802:16;11821:6;;;;;;;;;;;11802:25;;11847:8;11838:6;;:17;;;;;;;;;;;;;;;;;;11902:8;11871:40;;11892:8;11871:40;;;;;;;;;;;;11791:128;11728:191;:::o;36595:104::-;36664:27;36674:2;36678:8;36664:27;;;;;;;;;;;;:9;:27::i;:::-;36595:104;;:::o;47689:716::-;47852:4;47898:2;47873:45;;;47919:19;:17;:19::i;:::-;47940:4;47946:7;47955:5;47873:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47869:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48173:1;48156:6;:13;:18;48152:235;;;48202:40;;;;;;;;;;;;;;48152:235;48345:6;48339:13;48330:6;48326:2;48322:15;48315:38;47869:529;48042:54;;;48032:64;;;:6;:64;;;;48025:71;;;47689:716;;;;;;:::o;12291:723::-;12347:13;12577:1;12568:5;:10;12564:53;;;12595:10;;;;;;;;;;;;;;;;;;;;;12564:53;12627:12;12642:5;12627:20;;12658:14;12683:78;12698:1;12690:4;:9;12683:78;;12716:8;;;;;:::i;:::-;;;;12747:2;12739:10;;;;;:::i;:::-;;;12683:78;;;12771:19;12803:6;12793:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12771:39;;12821:154;12837:1;12828:5;:10;12821:154;;12865:1;12855:11;;;;;:::i;:::-;;;12932:2;12924:5;:10;;;;:::i;:::-;12911:2;:24;;;;:::i;:::-;12898:39;;12881:6;12888;12881:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;12961:2;12952:11;;;;;:::i;:::-;;;12821:154;;;12999:6;12985:21;;;;;12291:723;;;;:::o;49053:159::-;;;;;:::o;33225:148::-;33289:14;33350:5;33340:15;;33225:148;;;:::o;49871:158::-;;;;;:::o;37072:2236::-;37195:20;37218:13;;37195:36;;37260:1;37246:16;;:2;:16;;;37242:48;;;37271:19;;;;;;;;;;;;;;37242:48;37317:1;37305:8;:13;37301:44;;;37327:18;;;;;;;;;;;;;;37301:44;37358:61;37388:1;37392:2;37396:12;37410:8;37358:21;:61::i;:::-;37962:1;23278:2;37933:1;:25;;37932:31;37920:8;:44;37894:18;:22;37913:2;37894:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;24058:3;38363:29;38390:1;38378:8;:13;38363:14;:29::i;:::-;:56;;23795:3;38300:15;:41;;38258:21;38276:2;38258:17;:21::i;:::-;:84;:162;38207:17;:31;38225:12;38207:31;;;;;;;;;;;:213;;;;38437:20;38460:12;38437:35;;38487:11;38516:8;38501:12;:23;38487:37;;38563:1;38545:2;:14;;;:19;38541:635;;38585:313;38641:12;38637:2;38616:38;;38633:1;38616:38;;;;;;;;;;;;38682:69;38721:1;38725:2;38729:14;;;;;;38745:5;38682:30;:69::i;:::-;38677:174;;38787:40;;;;;;;;;;;;;;38677:174;38893:3;38878:12;:18;38585:313;;38979:12;38962:13;;:29;38958:43;;38993:8;;;38958:43;38541:635;;;39042:119;39098:14;;;;;;39094:2;39073:40;;39090:1;39073:40;;;;;;;;;;;;39156:3;39141:12;:18;39042:119;;38541:635;39206:12;39190:13;:28;;;;37671:1559;;39240:60;39269:1;39273:2;39277:12;39291:8;39240:20;:60::i;:::-;37184:2124;37072:2236;;;:::o;33460:142::-;33518:14;33579:5;33569:15;;33460:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:99::-;4299:6;4333:5;4327:12;4317:22;;4247:99;;;:::o;4352:169::-;4436:11;4470:6;4465:3;4458:19;4510:4;4505:3;4501:14;4486:29;;4352:169;;;;:::o;4527:307::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4704:1;4699:3;4695:11;4689:18;4685:1;4680:3;4676:11;4669:39;4641:2;4638:1;4634:10;4629:15;;4605:113;;;4736:6;4733:1;4730:13;4727:101;;;4816:1;4807:6;4802:3;4798:16;4791:27;4727:101;4576:258;4527:307;;;:::o;4840:364::-;4928:3;4956:39;4989:5;4956:39;:::i;:::-;5011:71;5075:6;5070:3;5011:71;:::i;:::-;5004:78;;5091:52;5136:6;5131:3;5124:4;5117:5;5113:16;5091:52;:::i;:::-;5168:29;5190:6;5168:29;:::i;:::-;5163:3;5159:39;5152:46;;4932:272;4840:364;;;;:::o;5210:313::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5410:9;5404:4;5400:20;5396:1;5385:9;5381:17;5374:47;5438:78;5511:4;5502:6;5438:78;:::i;:::-;5430:86;;5210:313;;;;:::o;5529:77::-;5566:7;5595:5;5584:16;;5529:77;;;:::o;5612:122::-;5685:24;5703:5;5685:24;:::i;:::-;5678:5;5675:35;5665:63;;5724:1;5721;5714:12;5665:63;5612:122;:::o;5740:139::-;5786:5;5824:6;5811:20;5802:29;;5840:33;5867:5;5840:33;:::i;:::-;5740:139;;;;:::o;5885:329::-;5944:6;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6119:1;6144:53;6189:7;6180:6;6169:9;6165:22;6144:53;:::i;:::-;6134:63;;6090:117;5885:329;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:122::-;6879:24;6897:5;6879:24;:::i;:::-;6872:5;6869:35;6859:63;;6918:1;6915;6908:12;6859:63;6806:122;:::o;6934:139::-;6980:5;7018:6;7005:20;6996:29;;7034:33;7061:5;7034:33;:::i;:::-;6934:139;;;;:::o;7079:474::-;7147:6;7155;7204:2;7192:9;7183:7;7179:23;7175:32;7172:119;;;7210:79;;:::i;:::-;7172:119;7330:1;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7301:117;7457:2;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7428:118;7079:474;;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:182::-;12261:34;12257:1;12249:6;12245:14;12238:58;12121:182;:::o;12309:366::-;12451:3;12472:67;12536:2;12531:3;12472:67;:::i;:::-;12465:74;;12548:93;12637:3;12548:93;:::i;:::-;12666:2;12661:3;12657:12;12650:19;;12309:366;;;:::o;12681:419::-;12847:4;12885:2;12874:9;12870:18;12862:26;;12934:9;12928:4;12924:20;12920:1;12909:9;12905:17;12898:47;12962:131;13088:4;12962:131;:::i;:::-;12954:139;;12681:419;;;:::o;13106:180::-;13154:77;13151:1;13144:88;13251:4;13248:1;13241:15;13275:4;13272:1;13265:15;13292:320;13336:6;13373:1;13367:4;13363:12;13353:22;;13420:1;13414:4;13410:12;13441:18;13431:81;;13497:4;13489:6;13485:17;13475:27;;13431:81;13559:2;13551:6;13548:14;13528:18;13525:38;13522:84;;;13578:18;;:::i;:::-;13522:84;13343:269;13292:320;;;:::o;13618:180::-;13666:77;13663:1;13656:88;13763:4;13760:1;13753:15;13787:4;13784:1;13777:15;13804:305;13844:3;13863:20;13881:1;13863:20;:::i;:::-;13858:25;;13897:20;13915:1;13897:20;:::i;:::-;13892:25;;14051:1;13983:66;13979:74;13976:1;13973:81;13970:107;;;14057:18;;:::i;:::-;13970:107;14101:1;14098;14094:9;14087:16;;13804:305;;;;:::o;14115:180::-;14163:77;14160:1;14153:88;14260:4;14257:1;14250:15;14284:4;14281:1;14274:15;14301:348;14341:7;14364:20;14382:1;14364:20;:::i;:::-;14359:25;;14398:20;14416:1;14398:20;:::i;:::-;14393:25;;14586:1;14518:66;14514:74;14511:1;14508:81;14503:1;14496:9;14489:17;14485:105;14482:131;;;14593:18;;:::i;:::-;14482:131;14641:1;14638;14634:9;14623:20;;14301:348;;;;:::o;14655:180::-;14703:77;14700:1;14693:88;14800:4;14797:1;14790:15;14824:4;14821:1;14814:15;14841:185;14881:1;14898:20;14916:1;14898:20;:::i;:::-;14893:25;;14932:20;14950:1;14932:20;:::i;:::-;14927:25;;14971:1;14961:35;;14976:18;;:::i;:::-;14961:35;15018:1;15015;15011:9;15006:14;;14841:185;;;;:::o;15032:233::-;15071:3;15094:24;15112:5;15094:24;:::i;:::-;15085:33;;15140:66;15133:5;15130:77;15127:103;;;15210:18;;:::i;:::-;15127:103;15257:1;15250:5;15246:13;15239:20;;15032:233;;;:::o;15271:180::-;15411:32;15407:1;15399:6;15395:14;15388:56;15271:180;:::o;15457:366::-;15599:3;15620:67;15684:2;15679:3;15620:67;:::i;:::-;15613:74;;15696:93;15785:3;15696:93;:::i;:::-;15814:2;15809:3;15805:12;15798:19;;15457:366;;;:::o;15829:419::-;15995:4;16033:2;16022:9;16018:18;16010:26;;16082:9;16076:4;16072:20;16068:1;16057:9;16053:17;16046:47;16110:131;16236:4;16110:131;:::i;:::-;16102:139;;15829:419;;;:::o;16254:165::-;16394:17;16390:1;16382:6;16378:14;16371:41;16254:165;:::o;16425:366::-;16567:3;16588:67;16652:2;16647:3;16588:67;:::i;:::-;16581:74;;16664:93;16753:3;16664:93;:::i;:::-;16782:2;16777:3;16773:12;16766:19;;16425:366;;;:::o;16797:419::-;16963:4;17001:2;16990:9;16986:18;16978:26;;17050:9;17044:4;17040:20;17036:1;17025:9;17021:17;17014:47;17078:131;17204:4;17078:131;:::i;:::-;17070:139;;16797:419;;;:::o;17222:177::-;17362:29;17358:1;17350:6;17346:14;17339:53;17222:177;:::o;17405:366::-;17547:3;17568:67;17632:2;17627:3;17568:67;:::i;:::-;17561:74;;17644:93;17733:3;17644:93;:::i;:::-;17762:2;17757:3;17753:12;17746:19;;17405:366;;;:::o;17777:419::-;17943:4;17981:2;17970:9;17966:18;17958:26;;18030:9;18024:4;18020:20;18016:1;18005:9;18001:17;17994:47;18058:131;18184:4;18058:131;:::i;:::-;18050:139;;17777:419;;;:::o;18202:181::-;18342:33;18338:1;18330:6;18326:14;18319:57;18202:181;:::o;18389:366::-;18531:3;18552:67;18616:2;18611:3;18552:67;:::i;:::-;18545:74;;18628:93;18717:3;18628:93;:::i;:::-;18746:2;18741:3;18737:12;18730:19;;18389:366;;;:::o;18761:419::-;18927:4;18965:2;18954:9;18950:18;18942:26;;19014:9;19008:4;19004:20;19000:1;18989:9;18985:17;18978:47;19042:131;19168:4;19042:131;:::i;:::-;19034:139;;18761:419;;;:::o;19186:222::-;19326:34;19322:1;19314:6;19310:14;19303:58;19395:5;19390:2;19382:6;19378:15;19371:30;19186:222;:::o;19414:366::-;19556:3;19577:67;19641:2;19636:3;19577:67;:::i;:::-;19570:74;;19653:93;19742:3;19653:93;:::i;:::-;19771:2;19766:3;19762:12;19755:19;;19414:366;;;:::o;19786:419::-;19952:4;19990:2;19979:9;19975:18;19967:26;;20039:9;20033:4;20029:20;20025:1;20014:9;20010:17;20003:47;20067:131;20193:4;20067:131;:::i;:::-;20059:139;;19786:419;;;:::o;20211:178::-;20351:30;20347:1;20339:6;20335:14;20328:54;20211:178;:::o;20395:366::-;20537:3;20558:67;20622:2;20617:3;20558:67;:::i;:::-;20551:74;;20634:93;20723:3;20634:93;:::i;:::-;20752:2;20747:3;20743:12;20736:19;;20395:366;;;:::o;20767:419::-;20933:4;20971:2;20960:9;20956:18;20948:26;;21020:9;21014:4;21010:20;21006:1;20995:9;20991:17;20984:47;21048:131;21174:4;21048:131;:::i;:::-;21040:139;;20767:419;;;:::o;21192:164::-;21332:16;21328:1;21320:6;21316:14;21309:40;21192:164;:::o;21362:366::-;21504:3;21525:67;21589:2;21584:3;21525:67;:::i;:::-;21518:74;;21601:93;21690:3;21601:93;:::i;:::-;21719:2;21714:3;21710:12;21703:19;;21362:366;;;:::o;21734:419::-;21900:4;21938:2;21927:9;21923:18;21915:26;;21987:9;21981:4;21977:20;21973:1;21962:9;21958:17;21951:47;22015:131;22141:4;22015:131;:::i;:::-;22007:139;;21734:419;;;:::o;22159:169::-;22299:21;22295:1;22287:6;22283:14;22276:45;22159:169;:::o;22334:366::-;22476:3;22497:67;22561:2;22556:3;22497:67;:::i;:::-;22490:74;;22573:93;22662:3;22573:93;:::i;:::-;22691:2;22686:3;22682:12;22675:19;;22334:366;;;:::o;22706:419::-;22872:4;22910:2;22899:9;22895:18;22887:26;;22959:9;22953:4;22949:20;22945:1;22934:9;22930:17;22923:47;22987:131;23113:4;22987:131;:::i;:::-;22979:139;;22706:419;;;:::o;23131:234::-;23271:34;23267:1;23259:6;23255:14;23248:58;23340:17;23335:2;23327:6;23323:15;23316:42;23131:234;:::o;23371:366::-;23513:3;23534:67;23598:2;23593:3;23534:67;:::i;:::-;23527:74;;23610:93;23699:3;23610:93;:::i;:::-;23728:2;23723:3;23719:12;23712:19;;23371:366;;;:::o;23743:419::-;23909:4;23947:2;23936:9;23932:18;23924:26;;23996:9;23990:4;23986:20;23982:1;23971:9;23967:17;23960:47;24024:131;24150:4;24024:131;:::i;:::-;24016:139;;23743:419;;;:::o;24168:148::-;24270:11;24307:3;24292:18;;24168:148;;;;:::o;24322:141::-;24371:4;24394:3;24386:11;;24417:3;24414:1;24407:14;24451:4;24448:1;24438:18;24430:26;;24322:141;;;:::o;24493:845::-;24596:3;24633:5;24627:12;24662:36;24688:9;24662:36;:::i;:::-;24714:89;24796:6;24791:3;24714:89;:::i;:::-;24707:96;;24834:1;24823:9;24819:17;24850:1;24845:137;;;;24996:1;24991:341;;;;24812:520;;24845:137;24929:4;24925:9;24914;24910:25;24905:3;24898:38;24965:6;24960:3;24956:16;24949:23;;24845:137;;24991:341;25058:38;25090:5;25058:38;:::i;:::-;25118:1;25132:154;25146:6;25143:1;25140:13;25132:154;;;25220:7;25214:14;25210:1;25205:3;25201:11;25194:35;25270:1;25261:7;25257:15;25246:26;;25168:4;25165:1;25161:12;25156:17;;25132:154;;;25315:6;25310:3;25306:16;25299:23;;24998:334;;24812:520;;24600:738;;24493:845;;;;:::o;25344:160::-;25484:12;25480:1;25472:6;25468:14;25461:36;25344:160;:::o;25510:402::-;25670:3;25691:85;25773:2;25768:3;25691:85;:::i;:::-;25684:92;;25785:93;25874:3;25785:93;:::i;:::-;25903:2;25898:3;25894:12;25887:19;;25510:402;;;:::o;25918:535::-;26148:3;26170:92;26258:3;26249:6;26170:92;:::i;:::-;26163:99;;26279:148;26423:3;26279:148;:::i;:::-;26272:155;;26444:3;26437:10;;25918:535;;;;:::o;26459:377::-;26565:3;26593:39;26626:5;26593:39;:::i;:::-;26648:89;26730:6;26725:3;26648:89;:::i;:::-;26641:96;;26746:52;26791:6;26786:3;26779:4;26772:5;26768:16;26746:52;:::i;:::-;26823:6;26818:3;26814:16;26807:23;;26569:267;26459:377;;;;:::o;26842:429::-;27019:3;27041:92;27129:3;27120:6;27041:92;:::i;:::-;27034:99;;27150:95;27241:3;27232:6;27150:95;:::i;:::-;27143:102;;27262:3;27255:10;;26842:429;;;;;:::o;27277:161::-;27417:13;27413:1;27405:6;27401:14;27394:37;27277:161;:::o;27444:402::-;27604:3;27625:85;27707:2;27702:3;27625:85;:::i;:::-;27618:92;;27719:93;27808:3;27719:93;:::i;:::-;27837:2;27832:3;27828:12;27821:19;;27444:402;;;:::o;27852:535::-;28082:3;28104:92;28192:3;28183:6;28104:92;:::i;:::-;28097:99;;28213:148;28357:3;28213:148;:::i;:::-;28206:155;;28378:3;28371:10;;27852:535;;;;:::o;28393:225::-;28533:34;28529:1;28521:6;28517:14;28510:58;28602:8;28597:2;28589:6;28585:15;28578:33;28393:225;:::o;28624:366::-;28766:3;28787:67;28851:2;28846:3;28787:67;:::i;:::-;28780:74;;28863:93;28952:3;28863:93;:::i;:::-;28981:2;28976:3;28972:12;28965:19;;28624:366;;;:::o;28996:419::-;29162:4;29200:2;29189:9;29185:18;29177:26;;29249:9;29243:4;29239:20;29235:1;29224:9;29220:17;29213:47;29277:131;29403:4;29277:131;:::i;:::-;29269:139;;28996:419;;;:::o;29421:179::-;29561:31;29557:1;29549:6;29545:14;29538:55;29421:179;:::o;29606:366::-;29748:3;29769:67;29833:2;29828:3;29769:67;:::i;:::-;29762:74;;29845:93;29934:3;29845:93;:::i;:::-;29963:2;29958:3;29954:12;29947:19;;29606:366;;;:::o;29978:419::-;30144:4;30182:2;30171:9;30167:18;30159:26;;30231:9;30225:4;30221:20;30217:1;30206:9;30202:17;30195:47;30259:131;30385:4;30259:131;:::i;:::-;30251:139;;29978:419;;;:::o;30403:147::-;30504:11;30541:3;30526:18;;30403:147;;;;:::o;30556:114::-;;:::o;30676:398::-;30835:3;30856:83;30937:1;30932:3;30856:83;:::i;:::-;30849:90;;30948:93;31037:3;30948:93;:::i;:::-;31066:1;31061:3;31057:11;31050:18;;30676:398;;;:::o;31080:379::-;31264:3;31286:147;31429:3;31286:147;:::i;:::-;31279:154;;31450:3;31443:10;;31080:379;;;:::o;31465:245::-;31605:34;31601:1;31593:6;31589:14;31582:58;31674:28;31669:2;31661:6;31657:15;31650:53;31465:245;:::o;31716:366::-;31858:3;31879:67;31943:2;31938:3;31879:67;:::i;:::-;31872:74;;31955:93;32044:3;31955:93;:::i;:::-;32073:2;32068:3;32064:12;32057:19;;31716:366;;;:::o;32088:419::-;32254:4;32292:2;32281:9;32277:18;32269:26;;32341:9;32335:4;32331:20;32327:1;32316:9;32312:17;32305:47;32369:131;32495:4;32369:131;:::i;:::-;32361:139;;32088:419;;;:::o;32513:98::-;32564:6;32598:5;32592:12;32582:22;;32513:98;;;:::o;32617:168::-;32700:11;32734:6;32729:3;32722:19;32774:4;32769:3;32765:14;32750:29;;32617:168;;;;:::o;32791:360::-;32877:3;32905:38;32937:5;32905:38;:::i;:::-;32959:70;33022:6;33017:3;32959:70;:::i;:::-;32952:77;;33038:52;33083:6;33078:3;33071:4;33064:5;33060:16;33038:52;:::i;:::-;33115:29;33137:6;33115:29;:::i;:::-;33110:3;33106:39;33099:46;;32881:270;32791:360;;;;:::o;33157:640::-;33352:4;33390:3;33379:9;33375:19;33367:27;;33404:71;33472:1;33461:9;33457:17;33448:6;33404:71;:::i;:::-;33485:72;33553:2;33542:9;33538:18;33529:6;33485:72;:::i;:::-;33567;33635:2;33624:9;33620:18;33611:6;33567:72;:::i;:::-;33686:9;33680:4;33676:20;33671:2;33660:9;33656:18;33649:48;33714:76;33785:4;33776:6;33714:76;:::i;:::-;33706:84;;33157:640;;;;;;;:::o;33803:141::-;33859:5;33890:6;33884:13;33875:22;;33906:32;33932:5;33906:32;:::i;:::-;33803:141;;;;:::o;33950:349::-;34019:6;34068:2;34056:9;34047:7;34043:23;34039:32;34036:119;;;34074:79;;:::i;:::-;34036:119;34194:1;34219:63;34274:7;34265:6;34254:9;34250:22;34219:63;:::i;:::-;34209:73;;34165:127;33950:349;;;;:::o;34305:191::-;34345:4;34365:20;34383:1;34365:20;:::i;:::-;34360:25;;34399:20;34417:1;34399:20;:::i;:::-;34394:25;;34438:1;34435;34432:8;34429:34;;;34443:18;;:::i;:::-;34429:34;34488:1;34485;34481:9;34473:17;;34305:191;;;;:::o;34502:176::-;34534:1;34551:20;34569:1;34551:20;:::i;:::-;34546:25;;34585:20;34603:1;34585:20;:::i;:::-;34580:25;;34624:1;34614:35;;34629:18;;:::i;:::-;34614:35;34670:1;34667;34663:9;34658:14;;34502:176;;;;:::o

Swarm Source

ipfs://ff6ff0ab173f7675512bade5b4667807d830cd125892770e4a01a7d1afea2ca7
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.