ETH Price: $2,987.83 (+4.42%)
Gas: 2 Gwei

Token

MetaSkull (MS)
 

Overview

Max Total Supply

1 MS

Holders

1

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MS
0x0847f2f58f9515e799662f7165704c1b103b8c54
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:
MetaSkull

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-18
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * 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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

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

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/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 (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: MetaSkull.sol



/*****************************************************************************************
 __       __  ________ ________ ______    ______   __    __  __    __  __        __       
/  \     /  |/        /        /      \  /      \ /  |  /  |/  |  /  |/  |      /  |       
$$  \   /$$ |$$$$$$$$/$$$$$$$$/$$$$$$  |/$$$$$$  |$$ | /$$/ $$ |  $$ |$$ |      $$ |       
$$$  \ /$$$ |$$ |__      $$ | $$ |__$$ |$$ \__$$/ $$ |/$$/  $$ |  $$ |$$ |      $$ |       
$$$$  /$$$$ |$$    |     $$ | $$    $$ |$$      \ $$  $$<   $$ |  $$ |$$ |      $$ |       
$$ $$ $$/$$ |$$$$$/      $$ | $$$$$$$$ | $$$$$$  |$$$$$  \  $$ |  $$ |$$ |      $$ |        
$$ |$$$/ $$ |$$ |_____   $$ | $$ |  $$ |/  \__$$ |$$ |$$  \ $$ \__$$ |$$ |_____ $$ |_____  
$$ | $/  $$ |$$       |  $$ | $$ |  $$ |$$    $$/ $$ | $$  |$$    $$/ $$       |$$       | 
$$/      $$/ $$$$$$$$/   $$/  $$/   $$/  $$$$$$/  $$/   $$/  $$$$$$/  $$$$$$$$/ $$$$$$$$/  
******************************************************************************************/

pragma solidity ^0.8.7;






interface whitelistPass {
    function burnToken(address who, uint256 amount) external;//Dont need to return boolean
    function getWhitelistList(address who) external returns (bool);
    function setMetaSkullAddress(address whitelistPass) external;
}

contract MetaSkull is IERC721A, Ownable, ERC721A, ReentrancyGuard{

    string public _baseTokenUri = "https://nftstorage.link/ipfs/bafybeidcivhhyftzetnjxk5nbf66lljsyu2fwxfm442352dwknlcrm6jie";
    uint256 public _maxSupply = 1001;
    uint256 public _initialSupply = 0;
    uint256 public _batchMaxSupply = 1001;
    uint256 public _whitelistSupply = 300;
    uint256 public _maxWhitelistMint = 1;
    uint256 public _maxPublicMint = 1;
    //Need to set to 100 eth before during deployment
    //After deployment, need to set to correct mint price
    uint256 public _publicMintPrice = 100 ether;
    uint256 public _whitelistMintPrice = 100 ether;
    bool public _publicSaleIsOpen = false;
    bool public _whitelistSaleIsOpen = false;
    //need to change to correct whitelistPass address after deploy
    address public _whitelistPassAddress = 0x63c940d984B83474f2AC25Ed0D340a865aBdbeE9;
    mapping(address => bool) public _passOwner;
    mapping(address => uint256) public totalPublicMint;
    mapping(address => uint256) public totalWhitelistMint;

    //Events
    event SetPublicSaleBool(address _who, bool _publicSale);
    event SetWhitelistSaleBool(address _who, bool _whitelistSale);
    event Withdraw(address _who, uint256 _balance);
    event SetPublicMintPrice(address _who, uint256 _mintPrice);
    event SetWhitelistMintPrice(address _who, uint256 _mintPrice);
    event SetBatchMaxSupply(address _who, uint256 _batchMaxSupply);
    event SetWhitelistSupply(address _who, uint256 _whitelistSupply);
    event SetMaxWhitelistMint(address _who, uint256 _maxWhitelistMint);
    event SetMaxPublicMint(address _who, uint256 _maxPublicMint);
    event SetWhitelistPassAddress(address _who, address _whitelistPassAddress);

    constructor() ERC721A("MetaSkull", "MS") {

    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "Cannot be called by a contract");
        _;
    }

    //Owner Functions
    function withdraw() external onlyOwner nonReentrant{
        uint256 balance = address(this).balance;
        require(address(this).balance > 0, "Balance is 0");
        payable(owner()).transfer(address(this).balance);
        emit Withdraw(msg.sender, balance);
    }

    function setBaseTokenURI(string memory baseURI_) external onlyOwner {
        _baseTokenUri = baseURI_;
    }

    //Must set whitelist sale to be false before starting public sale
    function setPublicSaleBool(bool publicSale) external onlyOwner {
        if(publicSale)
            _whitelistSaleIsOpen = false;
        _initialSupply = totalSupply();
        _publicSaleIsOpen = publicSale;
        emit SetPublicSaleBool(msg.sender, publicSale);
    }

    //Must set public sale to be false before starting whitelist sale
    function setWhitelistSaleBool(bool whitelistSale) external onlyOwner {
        if(whitelistSale)
            _publicSaleIsOpen = false;
        _whitelistSaleIsOpen = whitelistSale;
        emit SetWhitelistSaleBool(msg.sender, whitelistSale);
    }

    function setBatchMaxSupply(uint256 batchMaxSupply) external onlyOwner {
        if(batchMaxSupply > _maxSupply) revert("Batch supply exceed collection supply!");
        _batchMaxSupply = batchMaxSupply;
        emit SetBatchMaxSupply(msg.sender, batchMaxSupply);
    }

    function ownerMint(address who, uint256 amount) external onlyOwner {
        uint256 totalSupply = totalSupply();
        if(totalSupply == _maxSupply) revert ("Collection minted out!");
        if(totalSupply + amount > _maxSupply) revert ("Mint Exceed Max Supply!");
        if(amount <= 0) revert ("Cannot mint 0 tokens!");

        safeMint(who, amount);
    }

    function setWhitelistSupply(uint256 whitelistSupply) external onlyOwner{
        _whitelistSupply = whitelistSupply;
        emit SetWhitelistSupply(msg.sender, whitelistSupply);
    }

    function setMaxSupply(uint256 maxSupply) external onlyOwner {
        require(totalSupply() < maxSupply, "Max Supply must be larger than total supply");
        _maxSupply = maxSupply;
    }

    //Input unit is in wei
    //Example of setting mint price to 0.1ETH: setMintPrice(100000000000000000)
    function setPublicMintPrice(uint256 mintPrice) external onlyOwner{
        _publicMintPrice = mintPrice;
        emit SetPublicMintPrice(msg.sender, _publicMintPrice);
    }
    
    //Input unit is in wei
    //Example of setting mint price to 0.1ETH: setMintPrice(100000000000000000)
    function setWhitelistMintPrice(uint256 mintPrice) external onlyOwner{
        _whitelistMintPrice = mintPrice;
        emit SetWhitelistMintPrice(msg.sender, _whitelistMintPrice);
    }

    function setMaxWhitelistMint(uint256 maxWhitelistMint) external onlyOwner{
        _maxWhitelistMint = maxWhitelistMint;
        emit SetMaxWhitelistMint(msg.sender, maxWhitelistMint);
    }

    function setMaxPublicMint(uint256 maxPublicMint) external onlyOwner{
        _maxPublicMint = maxPublicMint;
        emit SetMaxPublicMint(msg.sender, maxPublicMint);
    }

    function setWhitelistPassAddress(address whitelistPassAddress) external onlyOwner{
        _whitelistPassAddress = whitelistPassAddress;
        emit SetWhitelistPassAddress(msg.sender, whitelistPassAddress);
    }

    function setMetaSkullAddress() external onlyOwner{
        if(_whitelistPassAddress == 0x0000000000000000000000000000000000000000) revert("Please set correct Whitelist Pass Address!");
        whitelistPass(_whitelistPassAddress).setMetaSkullAddress(address(this));
    }

    //Minter Functions
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, IERC721A)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    //Public Sale Phase
    function mint(uint256 amount) external payable callerIsUser nonReentrant{
        uint256 totalSupply = totalSupply();
        if(!_publicSaleIsOpen) revert ("Public Sale Is not live!");
        if(totalSupply == _maxSupply) revert ("Collection minted out!");
        if(totalSupply + amount > _maxSupply) revert ("Mint Exceed Max Supply!");
        if(totalPublicMint[msg.sender] >= _maxPublicMint) revert ("Already minted maximum amount!");//Set limit to total supply
        if(totalSupply >= (_initialSupply + _batchMaxSupply)) revert ("Minted out for current batch!"); //Feature only available for public sale
        if((totalSupply + amount) > (_initialSupply + _batchMaxSupply)) revert ("Cannot mint more than current batch supply!");
        if(amount <= 0) revert ("Cannot mint 0 tokens!");
        if(msg.value != amount*_publicMintPrice) revert ("Payment amount not correct!");

        totalPublicMint[msg.sender] += amount;
        safeMint(msg.sender, amount);
    }

    //Whitelist Sale Phase
    function whitelistMint(uint256 amount) external payable callerIsUser nonReentrant{
        uint256 totalSupply = totalSupply();
        if(!_whitelistSaleIsOpen) revert ("Whitelist sale is not live!");
        if(totalSupply == _whitelistSupply) revert ("Whitelist allocated collection minted out!");
        if(totalSupply + amount > _whitelistSupply) revert ("Mint Exceed Allocated Whitelist Supply!");
        if(totalWhitelistMint[msg.sender] >= _maxWhitelistMint) revert ("Cannot mint beyond whitelist max mint!");//supposed to be 1 only
        if(amount <= 0) revert ("Cannot mint 0 tokens!");
        if(msg.value != amount*_whitelistMintPrice) revert ("Payment amount not correct!");
        if(amount > _maxWhitelistMint){
            string memory _exceedMaxMint = string(abi.encodePacked("Maximum ", Strings.toString(_maxWhitelistMint), " mint per wallet"));
            revert(_exceedMaxMint);
        }
        _passOwner[msg.sender] = whitelistPass(_whitelistPassAddress).getWhitelistList(msg.sender);
        if(!_passOwner[msg.sender])
            whitelistPass(_whitelistPassAddress).burnToken(msg.sender, amount);
        totalWhitelistMint[msg.sender] += amount;
        safeMint(msg.sender, amount);
    }
    
    //Public Functions
    //Returns the tokenID owned by the given address
    function walletOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 0;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= _maxSupply) {
        address currentTokenOwner = ownerOf(currentTokenId);

        if (currentTokenOwner == owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId+1;

            ownedTokenIndex++;
        }

        currentTokenId++;
        }

        return ownedTokenIds;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721A, IERC721A) returns (string memory) {
        require(_exists(tokenId), "Token does not exist");

        return bytes(_baseTokenUri).length > 0 ? string(abi.encodePacked(_baseTokenUri,'/',Strings.toString(tokenId))) : "";
    }

    function getCurrentSupply() external view returns (uint256) {
        return totalSupply();
    }

    function getMaxSupply() external view returns (uint256) {
        return _maxSupply;
    }

    function getPublicMintPrice() external view returns (uint256) {
        return _publicMintPrice;
    }

    function getWhitelistMintPrice() external view returns (uint256) {
        return _whitelistMintPrice;
    }

    function getBatchMaxSupply() external view returns (uint256) {
        return _batchMaxSupply;
    }

    function getWhitelistSaleBool() external view returns (bool) {
        return _whitelistSaleIsOpen;
    }

    function getPublicSaleBool() external view returns (bool) {
        return _publicSaleIsOpen;
    }

    //Private Funtions
    function safeMint(address to, uint256 tokenId) private {
        _safeMint(to, tokenId);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"uint256","name":"_batchMaxSupply","type":"uint256"}],"name":"SetBatchMaxSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"uint256","name":"_maxPublicMint","type":"uint256"}],"name":"SetMaxPublicMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"uint256","name":"_maxWhitelistMint","type":"uint256"}],"name":"SetMaxWhitelistMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"SetPublicMintPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"SetPublicSaleBool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"SetWhitelistMintPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"address","name":"_whitelistPassAddress","type":"address"}],"name":"SetWhitelistPassAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"bool","name":"_whitelistSale","type":"bool"}],"name":"SetWhitelistSaleBool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"uint256","name":"_whitelistSupply","type":"uint256"}],"name":"SetWhitelistSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_who","type":"address"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_baseTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_batchMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_passOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicSaleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistPassAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistSaleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistSupply","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBatchMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleBool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSaleBool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","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":"address","name":"who","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchMaxSupply","type":"uint256"}],"name":"setBatchMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPublicMint","type":"uint256"}],"name":"setMaxPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWhitelistMint","type":"uint256"}],"name":"setMaxWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMetaSkullAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"publicSale","type":"bool"}],"name":"setPublicSaleBool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setWhitelistMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whitelistPassAddress","type":"address"}],"name":"setWhitelistPassAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"whitelistSale","type":"bool"}],"name":"setWhitelistSaleBool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistSupply","type":"uint256"}],"name":"setWhitelistSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","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":"","type":"address"}],"name":"totalWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280605881526020016200510860589139600a908051906020019062000035929190620002bf565b506103e9600b556000600c556103e9600d5561012c600e556001600f55600160105568056bc75e2d6310000060115568056bc75e2d631000006012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055507363c940d984b83474f2ac25ed0d340a865abdbee9601360026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200010957600080fd5b506040518060400160405280600981526020017f4d657461536b756c6c00000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4d53000000000000000000000000000000000000000000000000000000000000815250620001966200018a620001ee60201b60201c565b620001f660201b60201c565b8160039080519060200190620001ae929190620002bf565b508060049080519060200190620001c7929190620002bf565b50620001d8620002ba60201b60201c565b60018190555050506001600981905550620003d4565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002cd906200036f565b90600052602060002090601f016020900481019282620002f157600085556200033d565b82601f106200030c57805160ff19168380011785556200033d565b828001600101855582156200033d579182015b828111156200033c5782518255916020019190600101906200031f565b5b5090506200034c919062000350565b5090565b5b808211156200036b57600081600090555060010162000351565b5090565b600060028204905060018216806200038857607f821691505b602082108114156200039f576200039e620003a5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614d2480620003e46000396000f3fe60806040526004361061036b5760003560e01c8063580099ed116101c657806395d89b41116100f7578063c3b2d33711610095578063eda2f9451161006f578063eda2f94514610c30578063ee04868c14610c5b578063eec5325114610c86578063f2fde38b14610cb15761036b565b8063c3b2d33714610b8b578063c87b56dd14610bb6578063e985e9c514610bf35761036b565b8063a22cb465116100d1578063a22cb46514610af2578063a611708e14610b1b578063b551e36614610b44578063b88d4fde14610b6f5761036b565b806395d89b4114610a805780639c5e3dd314610aab578063a0712d6814610ad65761036b565b8063715018a611610164578063744dab381161013e578063744dab38146109e3578063777ca7cf14610a0e578063868ff4a214610a395780638da5cb5b14610a555761036b565b8063715018a614610966578063719780111461097d57806372fbfffd146109a65761036b565b806361998e01116101a057806361998e01146108985780636352211e146108c35780636f8b44b01461090057806370a08231146109295761036b565b8063580099ed1461081957806359253464146108445780635d82cf6e1461086f5761036b565b8063270ab52c116102a0578063484b973c1161023e5780634f3e1efc116102185780634f3e1efc14610771578063522dfa751461079c578063543d3d7e146107c757806355a63bf4146107f05761036b565b8063484b973c146106f45780634c0f38c21461071d5780634c40ccc6146107485761036b565b80633ccfd60b1161027a5780633ccfd60b1461065957806342842e0e14610670578063438b63001461068c57806348200604146106c95761036b565b8063270ab52c146105de5780632bdc81401461060757806330176e13146106305761036b565b806311a1b0811161030d5780631c16521c116102e75780631c16521c1461053157806322d7b3991461056e57806322f4596f1461059757806323b872dd146105c25761036b565b806311a1b081146104c457806315aac64c146104db57806318160ddd146105065761036b565b806306fdde031161034957806306fdde0314610415578063081812fc14610440578063095ea7b31461047d5780630e73c8be146104995761036b565b806301ffc9a71461037057806302132f4b146103ad5780630345e3cb146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613876565b610cda565b6040516103a49190613fc2565b60405180910390f35b3480156103b957600080fd5b506103c2610cec565b6040516103cf9190613fc2565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613659565b610d03565b60405161040c919061429f565b60405180910390f35b34801561042157600080fd5b5061042a610d1b565b6040516104379190613fdd565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613919565b610dad565b6040516104749190613ebe565b60405180910390f35b610497600480360381019061049291906137dc565b610e2c565b005b3480156104a557600080fd5b506104ae610f70565b6040516104bb919061429f565b60405180910390f35b3480156104d057600080fd5b506104d9610f76565b005b3480156104e757600080fd5b506104f061109f565b6040516104fd9190613fc2565b60405180910390f35b34801561051257600080fd5b5061051b6110b2565b604051610528919061429f565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613659565b6110c9565b604051610565919061429f565b60405180910390f35b34801561057a57600080fd5b506105956004803603810190610590919061381c565b6110e1565b005b3480156105a357600080fd5b506105ac611161565b6040516105b9919061429f565b60405180910390f35b6105dc60048036038101906105d791906136c6565b611167565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613919565b61148c565b005b34801561061357600080fd5b5061062e60048036038101906106299190613659565b6114d7565b005b34801561063c57600080fd5b50610657600480360381019061065291906138d0565b61155c565b005b34801561066557600080fd5b5061066e61157e565b005b61068a600480360381019061068591906136c6565b6116ae565b005b34801561069857600080fd5b506106b360048036038101906106ae9190613659565b6116ce565b6040516106c09190613fa0565b60405180910390f35b3480156106d557600080fd5b506106de6117e0565b6040516106eb9190613fdd565b60405180910390f35b34801561070057600080fd5b5061071b600480360381019061071691906137dc565b61186e565b005b34801561072957600080fd5b50610732611969565b60405161073f919061429f565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613919565b611973565b005b34801561077d57600080fd5b50610786611a03565b604051610793919061429f565b60405180910390f35b3480156107a857600080fd5b506107b1611a12565b6040516107be9190613fc2565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e9919061381c565b611a25565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613919565b611ab3565b005b34801561082557600080fd5b5061082e611afe565b60405161083b919061429f565b60405180910390f35b34801561085057600080fd5b50610859611b08565b6040516108669190613ebe565b60405180910390f35b34801561087b57600080fd5b5061089660048036038101906108919190613919565b611b2e565b005b3480156108a457600080fd5b506108ad611b7b565b6040516108ba919061429f565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613919565b611b81565b6040516108f79190613ebe565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613919565b611b93565b005b34801561093557600080fd5b50610950600480360381019061094b9190613659565b611bee565b60405161095d919061429f565b60405180910390f35b34801561097257600080fd5b5061097b611ca7565b005b34801561098957600080fd5b506109a4600480360381019061099f9190613919565b611cbb565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190613659565b611d06565b6040516109da9190613fc2565b60405180910390f35b3480156109ef57600080fd5b506109f8611d26565b604051610a05919061429f565b60405180910390f35b348015610a1a57600080fd5b50610a23611d30565b604051610a309190613fc2565b60405180910390f35b610a536004803603810190610a4e9190613919565b611d47565b005b348015610a6157600080fd5b50610a6a6122cd565b604051610a779190613ebe565b60405180910390f35b348015610a8c57600080fd5b50610a956122f6565b604051610aa29190613fdd565b60405180910390f35b348015610ab757600080fd5b50610ac0612388565b604051610acd919061429f565b60405180910390f35b610af06004803603810190610aeb9190613919565b61238e565b005b348015610afe57600080fd5b50610b196004803603810190610b14919061379c565b612769565b005b348015610b2757600080fd5b50610b426004803603810190610b3d9190613919565b612874565b005b348015610b5057600080fd5b50610b596128c1565b604051610b66919061429f565b60405180910390f35b610b896004803603810190610b849190613719565b6128c7565b005b348015610b9757600080fd5b50610ba061293a565b604051610bad919061429f565b60405180910390f35b348015610bc257600080fd5b50610bdd6004803603810190610bd89190613919565b612940565b604051610bea9190613fdd565b60405180910390f35b348015610bff57600080fd5b50610c1a6004803603810190610c159190613686565b6129e8565b604051610c279190613fc2565b60405180910390f35b348015610c3c57600080fd5b50610c45612a7c565b604051610c52919061429f565b60405180910390f35b348015610c6757600080fd5b50610c70612a82565b604051610c7d919061429f565b60405180910390f35b348015610c9257600080fd5b50610c9b612a88565b604051610ca8919061429f565b60405180910390f35b348015610cbd57600080fd5b50610cd86004803603810190610cd39190613659565b612a92565b005b6000610ce582612b16565b9050919050565b6000601360019054906101000a900460ff16905090565b60166020528060005260406000206000915090505481565b606060038054610d2a9061459d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d569061459d565b8015610da35780601f10610d7857610100808354040283529160200191610da3565b820191906000526020600020905b815481529060010190602001808311610d8657829003601f168201915b5050505050905090565b6000610db882612ba8565b610dee576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e3782611b81565b90508073ffffffffffffffffffffffffffffffffffffffff16610e58612c07565b73ffffffffffffffffffffffffffffffffffffffff1614610ebb57610e8481610e7f612c07565b6129e8565b610eba576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d5481565b610f7e612c0f565b600073ffffffffffffffffffffffffffffffffffffffff16601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611007906140df565b60405180910390fd5b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2a5ad73306040518263ffffffff1660e01b815260040161106b9190613ebe565b600060405180830381600087803b15801561108557600080fd5b505af1158015611099573d6000803e3d6000fd5b50505050565b601360019054906101000a900460ff1681565b60006110bc612c8d565b6002546001540303905090565b60156020528060005260406000206000915090505481565b6110e9612c0f565b801561110b576000601360006101000a81548160ff0219169083151502179055505b80601360016101000a81548160ff0219169083151502179055507fb3ea18c491f6cc21f29a85f47df86d4e82bd4f0e89e1be5b7bcd8b0927adb5b53382604051611156929190613f4e565b60405180910390a150565b600b5481565b600061117282612c92565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111d9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111e584612d60565b915091506111fb81876111f6612c07565b612d87565b611247576112108661120b612c07565b6129e8565b611246576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156112ae576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112bb8686866001612dcb565b80156112c657600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061139485611370888887612dd1565b7c020000000000000000000000000000000000000000000000000000000017612df9565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561141c57600060018501905060006005600083815260200190815260200160002054141561141a576001548114611419578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114848686866001612e24565b505050505050565b611494612c0f565b806010819055507f9c7fc5a6a772d894d4c292783c1f9909d92fc9de14bf221e55a19a10410d4aff33826040516114cc929190613f77565b60405180910390a150565b6114df612c0f565b80601360026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff772145330cffdf39dd06f0f4a43236df4ccb0b8aa3871bfbc856cfe13f3a1d63382604051611551929190613ed9565b60405180910390a150565b611564612c0f565b80600a908051906020019061157a929190613458565b5050565b611586612c0f565b600260095414156115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906141ff565b60405180910390fd5b600260098190555060004790506000471161161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906140bf565b60405180910390fd5b6116246122cd565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611669573d6000803e3d6000fd5b507f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364338260405161169b929190613f77565b60405180910390a1506001600981905550565b6116c9838383604051806020016040528060008152506128c7565b505050565b606060006116db83611bee565b905060008167ffffffffffffffff8111156116f9576116f8614736565b5b6040519080825280602002602001820160405280156117275781602001602082028036833780820191505090505b5090506000805b838110801561173f5750600b548211155b156117d457600061174f83611b81565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c05760018361179291906143d2565b8483815181106117a5576117a4614707565b5b60200260200101818152505081806117bc90614600565b9250505b82806117cb90614600565b9350505061172e565b82945050505050919050565b600a80546117ed9061459d565b80601f01602080910402602001604051908101604052809291908181526020018280546118199061459d565b80156118665780601f1061183b57610100808354040283529160200191611866565b820191906000526020600020905b81548152906001019060200180831161184957829003601f168201915b505050505081565b611876612c0f565b60006118806110b2565b9050600b548114156118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be9061403f565b60405180910390fd5b600b5482826118d691906143d2565b1115611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e9061423f565b60405180910390fd5b6000821161195a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119519061407f565b60405180910390fd5b6119648383612e2a565b505050565b6000600b54905090565b61197b612c0f565b600b548111156119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b79061415f565b60405180910390fd5b80600d819055507fc3581674374e2b99e513dc498b892935f89d58e5bbf3d35445f8c71b65bb9ed733826040516119f8929190613f77565b60405180910390a150565b6000611a0d6110b2565b905090565b601360009054906101000a900460ff1681565b611a2d612c0f565b8015611a4f576000601360016101000a81548160ff0219169083151502179055505b611a576110b2565b600c8190555080601360006101000a81548160ff0219169083151502179055507f1a04c7bd4edbc238d6fca2bb1191b018df850b59b51e408efe95ea97608aa3823382604051611aa8929190613f4e565b60405180910390a150565b611abb612c0f565b80600e819055507f7959651cd26132bcd1eb5e86c62d41d4cb15327390f73a1c3c143b9bac2d57503382604051611af3929190613f77565b60405180910390a150565b6000601254905090565b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b36612c0f565b806011819055507fcdac336150ff772f9fa5bc4ea67dfc9b0109e740dccf15ab066d09c67c1d357633601154604051611b70929190613f77565b60405180910390a150565b600f5481565b6000611b8c82612c92565b9050919050565b611b9b612c0f565b80611ba46110b2565b10611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb9061409f565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c56576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611caf612c0f565b611cb96000612e38565b565b611cc3612c0f565b80600f819055507f3cc585406e0f0b92b54c795ff5f46f8d6895a17faf0fdc4cd5d1f07bdd5adb493382604051611cfb929190613f77565b60405180910390a150565b60146020528060005260406000206000915054906101000a900460ff1681565b6000601154905090565b6000601360009054906101000a900460ff16905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac906141bf565b60405180910390fd5b60026009541415611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df2906141ff565b60405180910390fd5b60026009819055506000611e0d6110b2565b9050601360019054906101000a900460ff16611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590613fff565b60405180910390fd5b600e54811415611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a906140ff565b60405180910390fd5b600e548282611eb291906143d2565b1115611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea9061413f565b60405180910390fd5b600f54601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061425f565b60405180910390fd5b60008211611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb09061407f565b60405180910390fd5b60125482611fc79190614459565b3414612008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fff906141df565b60405180910390fd5b600f5482111561207d57600061201f600f54612efc565b60405160200161202f9190613e91565b6040516020818303038152906040529050806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120749190613fdd565b60405180910390fd5b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c464d221336040518263ffffffff1660e01b81526004016120d89190613ebe565b602060405180830381600087803b1580156120f257600080fd5b505af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190613849565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661226157601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1df306c33846040518363ffffffff1660e01b815260040161222e929190613f77565b600060405180830381600087803b15801561224857600080fd5b505af115801561225c573d6000803e3d6000fd5b505050505b81601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b091906143d2565b925050819055506122c13383612e2a565b50600160098190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546123059061459d565b80601f01602080910402602001604051908101604052809291908181526020018280546123319061459d565b801561237e5780601f106123535761010080835404028352916020019161237e565b820191906000526020600020905b81548152906001019060200180831161236157829003601f168201915b5050505050905090565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f3906141bf565b60405180910390fd5b60026009541415612442576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612439906141ff565b60405180910390fd5b600260098190555060006124546110b2565b9050601360009054906101000a900460ff166124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c9061419f565b60405180910390fd5b600b548114156124ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e19061403f565b60405180910390fd5b600b5482826124f991906143d2565b111561253a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125319061423f565b60405180910390fd5b601054601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b49061421f565b60405180910390fd5b600d54600c546125cd91906143d2565b811061260e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126059061417f565b60405180910390fd5b600d54600c5461261e91906143d2565b828261262a91906143d2565b111561266b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126629061427f565b60405180910390fd5b600082116126ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a59061407f565b60405180910390fd5b601154826126bc9190614459565b34146126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f4906141df565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461274c91906143d2565b9250508190555061275d3383612e2a565b50600160098190555050565b8060086000612776612c07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612823612c07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128689190613fc2565b60405180910390a35050565b61287c612c0f565b806012819055507fcd1944422cba843c5417e1ae08795f343933aa1393079fb16898823407afe5cf336012546040516128b6929190613f77565b60405180910390a150565b60115481565b6128d2848484611167565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612934576128fd8484848461305d565b612933576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c5481565b606061294b82612ba8565b61298a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129819061405f565b60405180910390fd5b6000600a80546129999061459d565b9050116129b557604051806020016040528060008152506129e1565b600a6129c083612efc565b6040516020016129d1929190613e62565b6040516020818303038152906040525b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b60105481565b6000600d54905090565b612a9a612c0f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b019061401f565b60405180910390fd5b612b1381612e38565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b7157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ba15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081612bb3612c8d565b11158015612bc2575060015482105b8015612c00575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b612c176131bd565b73ffffffffffffffffffffffffffffffffffffffff16612c356122cd565b73ffffffffffffffffffffffffffffffffffffffff1614612c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c829061411f565b60405180910390fd5b565b600090565b60008082905080612ca1612c8d565b11612d2957600154811015612d285760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612d26575b6000811415612d1c576005600083600190039350838152602001908152602001600020549050612cf1565b8092505050612d5b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612de88686846131c5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612e3482826131ce565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415612f44576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f76578080612f5f90614600565b915050600a82612f6f9190614428565b9150612f4c565b60008167ffffffffffffffff811115612f9257612f91614736565b5b6040519080825280601f01601f191660200182016040528015612fc45781602001600182028036833780820191505090505b5090505b6000851461305157600182612fdd91906144b3565b9150600a85612fec9190614649565b6030612ff891906143d2565b60f81b81838151811061300e5761300d614707565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304a9190614428565b9450612fc8565b8093505050505b919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613083612c07565b8786866040518563ffffffff1660e01b81526004016130a59493929190613f02565b602060405180830381600087803b1580156130bf57600080fd5b505af19250505080156130f057506040513d601f19601f820116820180604052508101906130ed91906138a3565b60015b61316a573d8060008114613120576040519150601f19603f3d011682016040523d82523d6000602084013e613125565b606091505b50600081511415613162576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b60009392505050565b6131e88282604051806020016040528060008152506131ec565b5050565b6131f6838361328a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146132855760006001549050600083820390505b613237600086838060010194508661305d565b61326d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061322457816001541461328257600080fd5b50505b505050565b6000600154905060008214156132cc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132d96000848385612dcb565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613350836133416000866000612dd1565b61334a85613448565b17612df9565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146133f157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506133b6565b50600082141561342d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506134436000848385612e24565b505050565b60006001821460e11b9050919050565b8280546134649061459d565b90600052602060002090601f01602090048101928261348657600085556134cd565b82601f1061349f57805160ff19168380011785556134cd565b828001600101855582156134cd579182015b828111156134cc5782518255916020019190600101906134b1565b5b5090506134da91906134de565b5090565b5b808211156134f75760008160009055506001016134df565b5090565b600061350e613509846142df565b6142ba565b90508281526020810184848401111561352a5761352961476a565b5b61353584828561455b565b509392505050565b600061355061354b84614310565b6142ba565b90508281526020810184848401111561356c5761356b61476a565b5b61357784828561455b565b509392505050565b60008135905061358e81614c92565b92915050565b6000813590506135a381614ca9565b92915050565b6000815190506135b881614ca9565b92915050565b6000813590506135cd81614cc0565b92915050565b6000815190506135e281614cc0565b92915050565b600082601f8301126135fd576135fc614765565b5b813561360d8482602086016134fb565b91505092915050565b600082601f83011261362b5761362a614765565b5b813561363b84826020860161353d565b91505092915050565b60008135905061365381614cd7565b92915050565b60006020828403121561366f5761366e614774565b5b600061367d8482850161357f565b91505092915050565b6000806040838503121561369d5761369c614774565b5b60006136ab8582860161357f565b92505060206136bc8582860161357f565b9150509250929050565b6000806000606084860312156136df576136de614774565b5b60006136ed8682870161357f565b93505060206136fe8682870161357f565b925050604061370f86828701613644565b9150509250925092565b6000806000806080858703121561373357613732614774565b5b60006137418782880161357f565b94505060206137528782880161357f565b935050604061376387828801613644565b925050606085013567ffffffffffffffff8111156137845761378361476f565b5b613790878288016135e8565b91505092959194509250565b600080604083850312156137b3576137b2614774565b5b60006137c18582860161357f565b92505060206137d285828601613594565b9150509250929050565b600080604083850312156137f3576137f2614774565b5b60006138018582860161357f565b925050602061381285828601613644565b9150509250929050565b60006020828403121561383257613831614774565b5b600061384084828501613594565b91505092915050565b60006020828403121561385f5761385e614774565b5b600061386d848285016135a9565b91505092915050565b60006020828403121561388c5761388b614774565b5b600061389a848285016135be565b91505092915050565b6000602082840312156138b9576138b8614774565b5b60006138c7848285016135d3565b91505092915050565b6000602082840312156138e6576138e5614774565b5b600082013567ffffffffffffffff8111156139045761390361476f565b5b61391084828501613616565b91505092915050565b60006020828403121561392f5761392e614774565b5b600061393d84828501613644565b91505092915050565b60006139528383613e44565b60208301905092915050565b613967816144e7565b82525050565b600061397882614366565b6139828185614394565b935061398d83614341565b8060005b838110156139be5781516139a58882613946565b97506139b083614387565b925050600181019050613991565b5085935050505092915050565b6139d4816144f9565b82525050565b60006139e582614371565b6139ef81856143a5565b93506139ff81856020860161456a565b613a0881614779565b840191505092915050565b6000613a1e8261437c565b613a2881856143b6565b9350613a3881856020860161456a565b613a4181614779565b840191505092915050565b6000613a578261437c565b613a6181856143c7565b9350613a7181856020860161456a565b80840191505092915050565b60008154613a8a8161459d565b613a9481866143c7565b94506001821660008114613aaf5760018114613ac057613af3565b60ff19831686528186019350613af3565b613ac985614351565b60005b83811015613aeb57815481890152600182019150602081019050613acc565b838801955050505b50505092915050565b6000613b09601b836143b6565b9150613b148261478a565b602082019050919050565b6000613b2c6026836143b6565b9150613b37826147b3565b604082019050919050565b6000613b4f6008836143c7565b9150613b5a82614802565b600882019050919050565b6000613b726016836143b6565b9150613b7d8261482b565b602082019050919050565b6000613b956014836143b6565b9150613ba082614854565b602082019050919050565b6000613bb86015836143b6565b9150613bc38261487d565b602082019050919050565b6000613bdb602b836143b6565b9150613be6826148a6565b604082019050919050565b6000613bfe600c836143b6565b9150613c09826148f5565b602082019050919050565b6000613c21602a836143b6565b9150613c2c8261491e565b604082019050919050565b6000613c44602a836143b6565b9150613c4f8261496d565b604082019050919050565b6000613c676020836143b6565b9150613c72826149bc565b602082019050919050565b6000613c8a6027836143b6565b9150613c95826149e5565b604082019050919050565b6000613cad6026836143b6565b9150613cb882614a34565b604082019050919050565b6000613cd06010836143c7565b9150613cdb82614a83565b601082019050919050565b6000613cf3601d836143b6565b9150613cfe82614aac565b602082019050919050565b6000613d166018836143b6565b9150613d2182614ad5565b602082019050919050565b6000613d39601e836143b6565b9150613d4482614afe565b602082019050919050565b6000613d5c601b836143b6565b9150613d6782614b27565b602082019050919050565b6000613d7f601f836143b6565b9150613d8a82614b50565b602082019050919050565b6000613da2601e836143b6565b9150613dad82614b79565b602082019050919050565b6000613dc56017836143b6565b9150613dd082614ba2565b602082019050919050565b6000613de86026836143b6565b9150613df382614bcb565b604082019050919050565b6000613e0b6001836143c7565b9150613e1682614c1a565b600182019050919050565b6000613e2e602b836143b6565b9150613e3982614c43565b604082019050919050565b613e4d81614551565b82525050565b613e5c81614551565b82525050565b6000613e6e8285613a7d565b9150613e7982613dfe565b9150613e858284613a4c565b91508190509392505050565b6000613e9c82613b42565b9150613ea88284613a4c565b9150613eb382613cc3565b915081905092915050565b6000602082019050613ed3600083018461395e565b92915050565b6000604082019050613eee600083018561395e565b613efb602083018461395e565b9392505050565b6000608082019050613f17600083018761395e565b613f24602083018661395e565b613f316040830185613e53565b8181036060830152613f4381846139da565b905095945050505050565b6000604082019050613f63600083018561395e565b613f7060208301846139cb565b9392505050565b6000604082019050613f8c600083018561395e565b613f996020830184613e53565b9392505050565b60006020820190508181036000830152613fba818461396d565b905092915050565b6000602082019050613fd760008301846139cb565b92915050565b60006020820190508181036000830152613ff78184613a13565b905092915050565b6000602082019050818103600083015261401881613afc565b9050919050565b6000602082019050818103600083015261403881613b1f565b9050919050565b6000602082019050818103600083015261405881613b65565b9050919050565b6000602082019050818103600083015261407881613b88565b9050919050565b6000602082019050818103600083015261409881613bab565b9050919050565b600060208201905081810360008301526140b881613bce565b9050919050565b600060208201905081810360008301526140d881613bf1565b9050919050565b600060208201905081810360008301526140f881613c14565b9050919050565b6000602082019050818103600083015261411881613c37565b9050919050565b6000602082019050818103600083015261413881613c5a565b9050919050565b6000602082019050818103600083015261415881613c7d565b9050919050565b6000602082019050818103600083015261417881613ca0565b9050919050565b6000602082019050818103600083015261419881613ce6565b9050919050565b600060208201905081810360008301526141b881613d09565b9050919050565b600060208201905081810360008301526141d881613d2c565b9050919050565b600060208201905081810360008301526141f881613d4f565b9050919050565b6000602082019050818103600083015261421881613d72565b9050919050565b6000602082019050818103600083015261423881613d95565b9050919050565b6000602082019050818103600083015261425881613db8565b9050919050565b6000602082019050818103600083015261427881613ddb565b9050919050565b6000602082019050818103600083015261429881613e21565b9050919050565b60006020820190506142b46000830184613e53565b92915050565b60006142c46142d5565b90506142d082826145cf565b919050565b6000604051905090565b600067ffffffffffffffff8211156142fa576142f9614736565b5b61430382614779565b9050602081019050919050565b600067ffffffffffffffff82111561432b5761432a614736565b5b61433482614779565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143dd82614551565b91506143e883614551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561441d5761441c61467a565b5b828201905092915050565b600061443382614551565b915061443e83614551565b92508261444e5761444d6146a9565b5b828204905092915050565b600061446482614551565b915061446f83614551565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144a8576144a761467a565b5b828202905092915050565b60006144be82614551565b91506144c983614551565b9250828210156144dc576144db61467a565b5b828203905092915050565b60006144f282614531565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561458857808201518184015260208101905061456d565b83811115614597576000848401525b50505050565b600060028204905060018216806145b557607f821691505b602082108114156145c9576145c86146d8565b5b50919050565b6145d882614779565b810181811067ffffffffffffffff821117156145f7576145f6614736565b5b80604052505050565b600061460b82614551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561463e5761463d61467a565b5b600182019050919050565b600061465482614551565b915061465f83614551565b92508261466f5761466e6146a9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f57686974656c6973742073616c65206973206e6f74206c697665210000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d20000000000000000000000000000000000000000000000000600082015250565b7f436f6c6c656374696f6e206d696e746564206f75742100000000000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f43616e6e6f74206d696e74203020746f6b656e73210000000000000000000000600082015250565b7f4d617820537570706c79206d757374206265206c6172676572207468616e207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b7f42616c616e636520697320300000000000000000000000000000000000000000600082015250565b7f506c656173652073657420636f72726563742057686974656c6973742050617360008201527f7320416464726573732100000000000000000000000000000000000000000000602082015250565b7f57686974656c69737420616c6c6f636174656420636f6c6c656374696f6e206d60008201527f696e746564206f75742100000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e742045786365656420416c6c6f63617465642057686974656c6973742060008201527f537570706c792100000000000000000000000000000000000000000000000000602082015250565b7f426174636820737570706c792065786365656420636f6c6c656374696f6e207360008201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b7f206d696e74207065722077616c6c657400000000000000000000000000000000600082015250565b7f4d696e746564206f757420666f722063757272656e7420626174636821000000600082015250565b7f5075626c69632053616c65204973206e6f74206c697665210000000000000000600082015250565b7f43616e6e6f742062652063616c6c6564206279206120636f6e74726163740000600082015250565b7f5061796d656e7420616d6f756e74206e6f7420636f7272656374210000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f416c7265616479206d696e746564206d6178696d756d20616d6f756e74210000600082015250565b7f4d696e7420457863656564204d617820537570706c7921000000000000000000600082015250565b7f43616e6e6f74206d696e74206265796f6e642077686974656c697374206d617860008201527f206d696e74210000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e2063757272656e7420626160008201527f74636820737570706c7921000000000000000000000000000000000000000000602082015250565b614c9b816144e7565b8114614ca657600080fd5b50565b614cb2816144f9565b8114614cbd57600080fd5b50565b614cc981614505565b8114614cd457600080fd5b50565b614ce081614551565b8114614ceb57600080fd5b5056fea26469706673582212202873d9d4520ccee1eb8755f403676ede8c2ea4368e6f523d8e83ccec51a0f2e964736f6c6343000807003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696463697668687966747a65746e6a786b356e626636366c6c6a73797532667778666d34343233353264776b6e6c63726d366a6965

Deployed Bytecode

0x60806040526004361061036b5760003560e01c8063580099ed116101c657806395d89b41116100f7578063c3b2d33711610095578063eda2f9451161006f578063eda2f94514610c30578063ee04868c14610c5b578063eec5325114610c86578063f2fde38b14610cb15761036b565b8063c3b2d33714610b8b578063c87b56dd14610bb6578063e985e9c514610bf35761036b565b8063a22cb465116100d1578063a22cb46514610af2578063a611708e14610b1b578063b551e36614610b44578063b88d4fde14610b6f5761036b565b806395d89b4114610a805780639c5e3dd314610aab578063a0712d6814610ad65761036b565b8063715018a611610164578063744dab381161013e578063744dab38146109e3578063777ca7cf14610a0e578063868ff4a214610a395780638da5cb5b14610a555761036b565b8063715018a614610966578063719780111461097d57806372fbfffd146109a65761036b565b806361998e01116101a057806361998e01146108985780636352211e146108c35780636f8b44b01461090057806370a08231146109295761036b565b8063580099ed1461081957806359253464146108445780635d82cf6e1461086f5761036b565b8063270ab52c116102a0578063484b973c1161023e5780634f3e1efc116102185780634f3e1efc14610771578063522dfa751461079c578063543d3d7e146107c757806355a63bf4146107f05761036b565b8063484b973c146106f45780634c0f38c21461071d5780634c40ccc6146107485761036b565b80633ccfd60b1161027a5780633ccfd60b1461065957806342842e0e14610670578063438b63001461068c57806348200604146106c95761036b565b8063270ab52c146105de5780632bdc81401461060757806330176e13146106305761036b565b806311a1b0811161030d5780631c16521c116102e75780631c16521c1461053157806322d7b3991461056e57806322f4596f1461059757806323b872dd146105c25761036b565b806311a1b081146104c457806315aac64c146104db57806318160ddd146105065761036b565b806306fdde031161034957806306fdde0314610415578063081812fc14610440578063095ea7b31461047d5780630e73c8be146104995761036b565b806301ffc9a71461037057806302132f4b146103ad5780630345e3cb146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613876565b610cda565b6040516103a49190613fc2565b60405180910390f35b3480156103b957600080fd5b506103c2610cec565b6040516103cf9190613fc2565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613659565b610d03565b60405161040c919061429f565b60405180910390f35b34801561042157600080fd5b5061042a610d1b565b6040516104379190613fdd565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613919565b610dad565b6040516104749190613ebe565b60405180910390f35b610497600480360381019061049291906137dc565b610e2c565b005b3480156104a557600080fd5b506104ae610f70565b6040516104bb919061429f565b60405180910390f35b3480156104d057600080fd5b506104d9610f76565b005b3480156104e757600080fd5b506104f061109f565b6040516104fd9190613fc2565b60405180910390f35b34801561051257600080fd5b5061051b6110b2565b604051610528919061429f565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613659565b6110c9565b604051610565919061429f565b60405180910390f35b34801561057a57600080fd5b506105956004803603810190610590919061381c565b6110e1565b005b3480156105a357600080fd5b506105ac611161565b6040516105b9919061429f565b60405180910390f35b6105dc60048036038101906105d791906136c6565b611167565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613919565b61148c565b005b34801561061357600080fd5b5061062e60048036038101906106299190613659565b6114d7565b005b34801561063c57600080fd5b50610657600480360381019061065291906138d0565b61155c565b005b34801561066557600080fd5b5061066e61157e565b005b61068a600480360381019061068591906136c6565b6116ae565b005b34801561069857600080fd5b506106b360048036038101906106ae9190613659565b6116ce565b6040516106c09190613fa0565b60405180910390f35b3480156106d557600080fd5b506106de6117e0565b6040516106eb9190613fdd565b60405180910390f35b34801561070057600080fd5b5061071b600480360381019061071691906137dc565b61186e565b005b34801561072957600080fd5b50610732611969565b60405161073f919061429f565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613919565b611973565b005b34801561077d57600080fd5b50610786611a03565b604051610793919061429f565b60405180910390f35b3480156107a857600080fd5b506107b1611a12565b6040516107be9190613fc2565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e9919061381c565b611a25565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613919565b611ab3565b005b34801561082557600080fd5b5061082e611afe565b60405161083b919061429f565b60405180910390f35b34801561085057600080fd5b50610859611b08565b6040516108669190613ebe565b60405180910390f35b34801561087b57600080fd5b5061089660048036038101906108919190613919565b611b2e565b005b3480156108a457600080fd5b506108ad611b7b565b6040516108ba919061429f565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613919565b611b81565b6040516108f79190613ebe565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613919565b611b93565b005b34801561093557600080fd5b50610950600480360381019061094b9190613659565b611bee565b60405161095d919061429f565b60405180910390f35b34801561097257600080fd5b5061097b611ca7565b005b34801561098957600080fd5b506109a4600480360381019061099f9190613919565b611cbb565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190613659565b611d06565b6040516109da9190613fc2565b60405180910390f35b3480156109ef57600080fd5b506109f8611d26565b604051610a05919061429f565b60405180910390f35b348015610a1a57600080fd5b50610a23611d30565b604051610a309190613fc2565b60405180910390f35b610a536004803603810190610a4e9190613919565b611d47565b005b348015610a6157600080fd5b50610a6a6122cd565b604051610a779190613ebe565b60405180910390f35b348015610a8c57600080fd5b50610a956122f6565b604051610aa29190613fdd565b60405180910390f35b348015610ab757600080fd5b50610ac0612388565b604051610acd919061429f565b60405180910390f35b610af06004803603810190610aeb9190613919565b61238e565b005b348015610afe57600080fd5b50610b196004803603810190610b14919061379c565b612769565b005b348015610b2757600080fd5b50610b426004803603810190610b3d9190613919565b612874565b005b348015610b5057600080fd5b50610b596128c1565b604051610b66919061429f565b60405180910390f35b610b896004803603810190610b849190613719565b6128c7565b005b348015610b9757600080fd5b50610ba061293a565b604051610bad919061429f565b60405180910390f35b348015610bc257600080fd5b50610bdd6004803603810190610bd89190613919565b612940565b604051610bea9190613fdd565b60405180910390f35b348015610bff57600080fd5b50610c1a6004803603810190610c159190613686565b6129e8565b604051610c279190613fc2565b60405180910390f35b348015610c3c57600080fd5b50610c45612a7c565b604051610c52919061429f565b60405180910390f35b348015610c6757600080fd5b50610c70612a82565b604051610c7d919061429f565b60405180910390f35b348015610c9257600080fd5b50610c9b612a88565b604051610ca8919061429f565b60405180910390f35b348015610cbd57600080fd5b50610cd86004803603810190610cd39190613659565b612a92565b005b6000610ce582612b16565b9050919050565b6000601360019054906101000a900460ff16905090565b60166020528060005260406000206000915090505481565b606060038054610d2a9061459d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d569061459d565b8015610da35780601f10610d7857610100808354040283529160200191610da3565b820191906000526020600020905b815481529060010190602001808311610d8657829003601f168201915b5050505050905090565b6000610db882612ba8565b610dee576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e3782611b81565b90508073ffffffffffffffffffffffffffffffffffffffff16610e58612c07565b73ffffffffffffffffffffffffffffffffffffffff1614610ebb57610e8481610e7f612c07565b6129e8565b610eba576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d5481565b610f7e612c0f565b600073ffffffffffffffffffffffffffffffffffffffff16601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611007906140df565b60405180910390fd5b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2a5ad73306040518263ffffffff1660e01b815260040161106b9190613ebe565b600060405180830381600087803b15801561108557600080fd5b505af1158015611099573d6000803e3d6000fd5b50505050565b601360019054906101000a900460ff1681565b60006110bc612c8d565b6002546001540303905090565b60156020528060005260406000206000915090505481565b6110e9612c0f565b801561110b576000601360006101000a81548160ff0219169083151502179055505b80601360016101000a81548160ff0219169083151502179055507fb3ea18c491f6cc21f29a85f47df86d4e82bd4f0e89e1be5b7bcd8b0927adb5b53382604051611156929190613f4e565b60405180910390a150565b600b5481565b600061117282612c92565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111d9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111e584612d60565b915091506111fb81876111f6612c07565b612d87565b611247576112108661120b612c07565b6129e8565b611246576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156112ae576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112bb8686866001612dcb565b80156112c657600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061139485611370888887612dd1565b7c020000000000000000000000000000000000000000000000000000000017612df9565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561141c57600060018501905060006005600083815260200190815260200160002054141561141a576001548114611419578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114848686866001612e24565b505050505050565b611494612c0f565b806010819055507f9c7fc5a6a772d894d4c292783c1f9909d92fc9de14bf221e55a19a10410d4aff33826040516114cc929190613f77565b60405180910390a150565b6114df612c0f565b80601360026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff772145330cffdf39dd06f0f4a43236df4ccb0b8aa3871bfbc856cfe13f3a1d63382604051611551929190613ed9565b60405180910390a150565b611564612c0f565b80600a908051906020019061157a929190613458565b5050565b611586612c0f565b600260095414156115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906141ff565b60405180910390fd5b600260098190555060004790506000471161161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906140bf565b60405180910390fd5b6116246122cd565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611669573d6000803e3d6000fd5b507f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364338260405161169b929190613f77565b60405180910390a1506001600981905550565b6116c9838383604051806020016040528060008152506128c7565b505050565b606060006116db83611bee565b905060008167ffffffffffffffff8111156116f9576116f8614736565b5b6040519080825280602002602001820160405280156117275781602001602082028036833780820191505090505b5090506000805b838110801561173f5750600b548211155b156117d457600061174f83611b81565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c05760018361179291906143d2565b8483815181106117a5576117a4614707565b5b60200260200101818152505081806117bc90614600565b9250505b82806117cb90614600565b9350505061172e565b82945050505050919050565b600a80546117ed9061459d565b80601f01602080910402602001604051908101604052809291908181526020018280546118199061459d565b80156118665780601f1061183b57610100808354040283529160200191611866565b820191906000526020600020905b81548152906001019060200180831161184957829003601f168201915b505050505081565b611876612c0f565b60006118806110b2565b9050600b548114156118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be9061403f565b60405180910390fd5b600b5482826118d691906143d2565b1115611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e9061423f565b60405180910390fd5b6000821161195a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119519061407f565b60405180910390fd5b6119648383612e2a565b505050565b6000600b54905090565b61197b612c0f565b600b548111156119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b79061415f565b60405180910390fd5b80600d819055507fc3581674374e2b99e513dc498b892935f89d58e5bbf3d35445f8c71b65bb9ed733826040516119f8929190613f77565b60405180910390a150565b6000611a0d6110b2565b905090565b601360009054906101000a900460ff1681565b611a2d612c0f565b8015611a4f576000601360016101000a81548160ff0219169083151502179055505b611a576110b2565b600c8190555080601360006101000a81548160ff0219169083151502179055507f1a04c7bd4edbc238d6fca2bb1191b018df850b59b51e408efe95ea97608aa3823382604051611aa8929190613f4e565b60405180910390a150565b611abb612c0f565b80600e819055507f7959651cd26132bcd1eb5e86c62d41d4cb15327390f73a1c3c143b9bac2d57503382604051611af3929190613f77565b60405180910390a150565b6000601254905090565b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b36612c0f565b806011819055507fcdac336150ff772f9fa5bc4ea67dfc9b0109e740dccf15ab066d09c67c1d357633601154604051611b70929190613f77565b60405180910390a150565b600f5481565b6000611b8c82612c92565b9050919050565b611b9b612c0f565b80611ba46110b2565b10611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb9061409f565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c56576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611caf612c0f565b611cb96000612e38565b565b611cc3612c0f565b80600f819055507f3cc585406e0f0b92b54c795ff5f46f8d6895a17faf0fdc4cd5d1f07bdd5adb493382604051611cfb929190613f77565b60405180910390a150565b60146020528060005260406000206000915054906101000a900460ff1681565b6000601154905090565b6000601360009054906101000a900460ff16905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac906141bf565b60405180910390fd5b60026009541415611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df2906141ff565b60405180910390fd5b60026009819055506000611e0d6110b2565b9050601360019054906101000a900460ff16611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590613fff565b60405180910390fd5b600e54811415611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a906140ff565b60405180910390fd5b600e548282611eb291906143d2565b1115611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea9061413f565b60405180910390fd5b600f54601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061425f565b60405180910390fd5b60008211611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb09061407f565b60405180910390fd5b60125482611fc79190614459565b3414612008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fff906141df565b60405180910390fd5b600f5482111561207d57600061201f600f54612efc565b60405160200161202f9190613e91565b6040516020818303038152906040529050806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120749190613fdd565b60405180910390fd5b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c464d221336040518263ffffffff1660e01b81526004016120d89190613ebe565b602060405180830381600087803b1580156120f257600080fd5b505af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190613849565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661226157601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1df306c33846040518363ffffffff1660e01b815260040161222e929190613f77565b600060405180830381600087803b15801561224857600080fd5b505af115801561225c573d6000803e3d6000fd5b505050505b81601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b091906143d2565b925050819055506122c13383612e2a565b50600160098190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546123059061459d565b80601f01602080910402602001604051908101604052809291908181526020018280546123319061459d565b801561237e5780601f106123535761010080835404028352916020019161237e565b820191906000526020600020905b81548152906001019060200180831161236157829003601f168201915b5050505050905090565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f3906141bf565b60405180910390fd5b60026009541415612442576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612439906141ff565b60405180910390fd5b600260098190555060006124546110b2565b9050601360009054906101000a900460ff166124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c9061419f565b60405180910390fd5b600b548114156124ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e19061403f565b60405180910390fd5b600b5482826124f991906143d2565b111561253a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125319061423f565b60405180910390fd5b601054601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b49061421f565b60405180910390fd5b600d54600c546125cd91906143d2565b811061260e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126059061417f565b60405180910390fd5b600d54600c5461261e91906143d2565b828261262a91906143d2565b111561266b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126629061427f565b60405180910390fd5b600082116126ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a59061407f565b60405180910390fd5b601154826126bc9190614459565b34146126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f4906141df565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461274c91906143d2565b9250508190555061275d3383612e2a565b50600160098190555050565b8060086000612776612c07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612823612c07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128689190613fc2565b60405180910390a35050565b61287c612c0f565b806012819055507fcd1944422cba843c5417e1ae08795f343933aa1393079fb16898823407afe5cf336012546040516128b6929190613f77565b60405180910390a150565b60115481565b6128d2848484611167565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612934576128fd8484848461305d565b612933576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c5481565b606061294b82612ba8565b61298a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129819061405f565b60405180910390fd5b6000600a80546129999061459d565b9050116129b557604051806020016040528060008152506129e1565b600a6129c083612efc565b6040516020016129d1929190613e62565b6040516020818303038152906040525b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b60105481565b6000600d54905090565b612a9a612c0f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b019061401f565b60405180910390fd5b612b1381612e38565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b7157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ba15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081612bb3612c8d565b11158015612bc2575060015482105b8015612c00575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b612c176131bd565b73ffffffffffffffffffffffffffffffffffffffff16612c356122cd565b73ffffffffffffffffffffffffffffffffffffffff1614612c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c829061411f565b60405180910390fd5b565b600090565b60008082905080612ca1612c8d565b11612d2957600154811015612d285760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612d26575b6000811415612d1c576005600083600190039350838152602001908152602001600020549050612cf1565b8092505050612d5b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612de88686846131c5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612e3482826131ce565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415612f44576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f76578080612f5f90614600565b915050600a82612f6f9190614428565b9150612f4c565b60008167ffffffffffffffff811115612f9257612f91614736565b5b6040519080825280601f01601f191660200182016040528015612fc45781602001600182028036833780820191505090505b5090505b6000851461305157600182612fdd91906144b3565b9150600a85612fec9190614649565b6030612ff891906143d2565b60f81b81838151811061300e5761300d614707565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304a9190614428565b9450612fc8565b8093505050505b919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613083612c07565b8786866040518563ffffffff1660e01b81526004016130a59493929190613f02565b602060405180830381600087803b1580156130bf57600080fd5b505af19250505080156130f057506040513d601f19601f820116820180604052508101906130ed91906138a3565b60015b61316a573d8060008114613120576040519150601f19603f3d011682016040523d82523d6000602084013e613125565b606091505b50600081511415613162576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b60009392505050565b6131e88282604051806020016040528060008152506131ec565b5050565b6131f6838361328a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146132855760006001549050600083820390505b613237600086838060010194508661305d565b61326d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061322457816001541461328257600080fd5b50505b505050565b6000600154905060008214156132cc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132d96000848385612dcb565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613350836133416000866000612dd1565b61334a85613448565b17612df9565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146133f157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506133b6565b50600082141561342d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506134436000848385612e24565b505050565b60006001821460e11b9050919050565b8280546134649061459d565b90600052602060002090601f01602090048101928261348657600085556134cd565b82601f1061349f57805160ff19168380011785556134cd565b828001600101855582156134cd579182015b828111156134cc5782518255916020019190600101906134b1565b5b5090506134da91906134de565b5090565b5b808211156134f75760008160009055506001016134df565b5090565b600061350e613509846142df565b6142ba565b90508281526020810184848401111561352a5761352961476a565b5b61353584828561455b565b509392505050565b600061355061354b84614310565b6142ba565b90508281526020810184848401111561356c5761356b61476a565b5b61357784828561455b565b509392505050565b60008135905061358e81614c92565b92915050565b6000813590506135a381614ca9565b92915050565b6000815190506135b881614ca9565b92915050565b6000813590506135cd81614cc0565b92915050565b6000815190506135e281614cc0565b92915050565b600082601f8301126135fd576135fc614765565b5b813561360d8482602086016134fb565b91505092915050565b600082601f83011261362b5761362a614765565b5b813561363b84826020860161353d565b91505092915050565b60008135905061365381614cd7565b92915050565b60006020828403121561366f5761366e614774565b5b600061367d8482850161357f565b91505092915050565b6000806040838503121561369d5761369c614774565b5b60006136ab8582860161357f565b92505060206136bc8582860161357f565b9150509250929050565b6000806000606084860312156136df576136de614774565b5b60006136ed8682870161357f565b93505060206136fe8682870161357f565b925050604061370f86828701613644565b9150509250925092565b6000806000806080858703121561373357613732614774565b5b60006137418782880161357f565b94505060206137528782880161357f565b935050604061376387828801613644565b925050606085013567ffffffffffffffff8111156137845761378361476f565b5b613790878288016135e8565b91505092959194509250565b600080604083850312156137b3576137b2614774565b5b60006137c18582860161357f565b92505060206137d285828601613594565b9150509250929050565b600080604083850312156137f3576137f2614774565b5b60006138018582860161357f565b925050602061381285828601613644565b9150509250929050565b60006020828403121561383257613831614774565b5b600061384084828501613594565b91505092915050565b60006020828403121561385f5761385e614774565b5b600061386d848285016135a9565b91505092915050565b60006020828403121561388c5761388b614774565b5b600061389a848285016135be565b91505092915050565b6000602082840312156138b9576138b8614774565b5b60006138c7848285016135d3565b91505092915050565b6000602082840312156138e6576138e5614774565b5b600082013567ffffffffffffffff8111156139045761390361476f565b5b61391084828501613616565b91505092915050565b60006020828403121561392f5761392e614774565b5b600061393d84828501613644565b91505092915050565b60006139528383613e44565b60208301905092915050565b613967816144e7565b82525050565b600061397882614366565b6139828185614394565b935061398d83614341565b8060005b838110156139be5781516139a58882613946565b97506139b083614387565b925050600181019050613991565b5085935050505092915050565b6139d4816144f9565b82525050565b60006139e582614371565b6139ef81856143a5565b93506139ff81856020860161456a565b613a0881614779565b840191505092915050565b6000613a1e8261437c565b613a2881856143b6565b9350613a3881856020860161456a565b613a4181614779565b840191505092915050565b6000613a578261437c565b613a6181856143c7565b9350613a7181856020860161456a565b80840191505092915050565b60008154613a8a8161459d565b613a9481866143c7565b94506001821660008114613aaf5760018114613ac057613af3565b60ff19831686528186019350613af3565b613ac985614351565b60005b83811015613aeb57815481890152600182019150602081019050613acc565b838801955050505b50505092915050565b6000613b09601b836143b6565b9150613b148261478a565b602082019050919050565b6000613b2c6026836143b6565b9150613b37826147b3565b604082019050919050565b6000613b4f6008836143c7565b9150613b5a82614802565b600882019050919050565b6000613b726016836143b6565b9150613b7d8261482b565b602082019050919050565b6000613b956014836143b6565b9150613ba082614854565b602082019050919050565b6000613bb86015836143b6565b9150613bc38261487d565b602082019050919050565b6000613bdb602b836143b6565b9150613be6826148a6565b604082019050919050565b6000613bfe600c836143b6565b9150613c09826148f5565b602082019050919050565b6000613c21602a836143b6565b9150613c2c8261491e565b604082019050919050565b6000613c44602a836143b6565b9150613c4f8261496d565b604082019050919050565b6000613c676020836143b6565b9150613c72826149bc565b602082019050919050565b6000613c8a6027836143b6565b9150613c95826149e5565b604082019050919050565b6000613cad6026836143b6565b9150613cb882614a34565b604082019050919050565b6000613cd06010836143c7565b9150613cdb82614a83565b601082019050919050565b6000613cf3601d836143b6565b9150613cfe82614aac565b602082019050919050565b6000613d166018836143b6565b9150613d2182614ad5565b602082019050919050565b6000613d39601e836143b6565b9150613d4482614afe565b602082019050919050565b6000613d5c601b836143b6565b9150613d6782614b27565b602082019050919050565b6000613d7f601f836143b6565b9150613d8a82614b50565b602082019050919050565b6000613da2601e836143b6565b9150613dad82614b79565b602082019050919050565b6000613dc56017836143b6565b9150613dd082614ba2565b602082019050919050565b6000613de86026836143b6565b9150613df382614bcb565b604082019050919050565b6000613e0b6001836143c7565b9150613e1682614c1a565b600182019050919050565b6000613e2e602b836143b6565b9150613e3982614c43565b604082019050919050565b613e4d81614551565b82525050565b613e5c81614551565b82525050565b6000613e6e8285613a7d565b9150613e7982613dfe565b9150613e858284613a4c565b91508190509392505050565b6000613e9c82613b42565b9150613ea88284613a4c565b9150613eb382613cc3565b915081905092915050565b6000602082019050613ed3600083018461395e565b92915050565b6000604082019050613eee600083018561395e565b613efb602083018461395e565b9392505050565b6000608082019050613f17600083018761395e565b613f24602083018661395e565b613f316040830185613e53565b8181036060830152613f4381846139da565b905095945050505050565b6000604082019050613f63600083018561395e565b613f7060208301846139cb565b9392505050565b6000604082019050613f8c600083018561395e565b613f996020830184613e53565b9392505050565b60006020820190508181036000830152613fba818461396d565b905092915050565b6000602082019050613fd760008301846139cb565b92915050565b60006020820190508181036000830152613ff78184613a13565b905092915050565b6000602082019050818103600083015261401881613afc565b9050919050565b6000602082019050818103600083015261403881613b1f565b9050919050565b6000602082019050818103600083015261405881613b65565b9050919050565b6000602082019050818103600083015261407881613b88565b9050919050565b6000602082019050818103600083015261409881613bab565b9050919050565b600060208201905081810360008301526140b881613bce565b9050919050565b600060208201905081810360008301526140d881613bf1565b9050919050565b600060208201905081810360008301526140f881613c14565b9050919050565b6000602082019050818103600083015261411881613c37565b9050919050565b6000602082019050818103600083015261413881613c5a565b9050919050565b6000602082019050818103600083015261415881613c7d565b9050919050565b6000602082019050818103600083015261417881613ca0565b9050919050565b6000602082019050818103600083015261419881613ce6565b9050919050565b600060208201905081810360008301526141b881613d09565b9050919050565b600060208201905081810360008301526141d881613d2c565b9050919050565b600060208201905081810360008301526141f881613d4f565b9050919050565b6000602082019050818103600083015261421881613d72565b9050919050565b6000602082019050818103600083015261423881613d95565b9050919050565b6000602082019050818103600083015261425881613db8565b9050919050565b6000602082019050818103600083015261427881613ddb565b9050919050565b6000602082019050818103600083015261429881613e21565b9050919050565b60006020820190506142b46000830184613e53565b92915050565b60006142c46142d5565b90506142d082826145cf565b919050565b6000604051905090565b600067ffffffffffffffff8211156142fa576142f9614736565b5b61430382614779565b9050602081019050919050565b600067ffffffffffffffff82111561432b5761432a614736565b5b61433482614779565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143dd82614551565b91506143e883614551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561441d5761441c61467a565b5b828201905092915050565b600061443382614551565b915061443e83614551565b92508261444e5761444d6146a9565b5b828204905092915050565b600061446482614551565b915061446f83614551565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144a8576144a761467a565b5b828202905092915050565b60006144be82614551565b91506144c983614551565b9250828210156144dc576144db61467a565b5b828203905092915050565b60006144f282614531565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561458857808201518184015260208101905061456d565b83811115614597576000848401525b50505050565b600060028204905060018216806145b557607f821691505b602082108114156145c9576145c86146d8565b5b50919050565b6145d882614779565b810181811067ffffffffffffffff821117156145f7576145f6614736565b5b80604052505050565b600061460b82614551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561463e5761463d61467a565b5b600182019050919050565b600061465482614551565b915061465f83614551565b92508261466f5761466e6146a9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f57686974656c6973742073616c65206973206e6f74206c697665210000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d20000000000000000000000000000000000000000000000000600082015250565b7f436f6c6c656374696f6e206d696e746564206f75742100000000000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f43616e6e6f74206d696e74203020746f6b656e73210000000000000000000000600082015250565b7f4d617820537570706c79206d757374206265206c6172676572207468616e207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b7f42616c616e636520697320300000000000000000000000000000000000000000600082015250565b7f506c656173652073657420636f72726563742057686974656c6973742050617360008201527f7320416464726573732100000000000000000000000000000000000000000000602082015250565b7f57686974656c69737420616c6c6f636174656420636f6c6c656374696f6e206d60008201527f696e746564206f75742100000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e742045786365656420416c6c6f63617465642057686974656c6973742060008201527f537570706c792100000000000000000000000000000000000000000000000000602082015250565b7f426174636820737570706c792065786365656420636f6c6c656374696f6e207360008201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b7f206d696e74207065722077616c6c657400000000000000000000000000000000600082015250565b7f4d696e746564206f757420666f722063757272656e7420626174636821000000600082015250565b7f5075626c69632053616c65204973206e6f74206c697665210000000000000000600082015250565b7f43616e6e6f742062652063616c6c6564206279206120636f6e74726163740000600082015250565b7f5061796d656e7420616d6f756e74206e6f7420636f7272656374210000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f416c7265616479206d696e746564206d6178696d756d20616d6f756e74210000600082015250565b7f4d696e7420457863656564204d617820537570706c7921000000000000000000600082015250565b7f43616e6e6f74206d696e74206265796f6e642077686974656c697374206d617860008201527f206d696e74210000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e2063757272656e7420626160008201527f74636820737570706c7921000000000000000000000000000000000000000000602082015250565b614c9b816144e7565b8114614ca657600080fd5b50565b614cb2816144f9565b8114614cbd57600080fd5b50565b614cc981614505565b8114614cd457600080fd5b50565b614ce081614551565b8114614ceb57600080fd5b5056fea26469706673582212202873d9d4520ccee1eb8755f403676ede8c2ea4368e6f523d8e83ccec51a0f2e964736f6c63430008070033

Deployed Bytecode Sourcemap

63133:10157:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68783:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72937:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64154:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24595:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31086:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30519:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63413:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68477:274;;;;;;;;;;;;;:::i;:::-;;63845:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20346:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64097:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65948:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63334:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34725:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68069:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68252:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65402:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65120:274;;;;;;;;;;;;;:::i;:::-;;37646:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71384:695;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63207:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66491:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72497:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66210:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72390:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63801:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65592:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66870:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72709:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63960:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67375:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63501:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25988:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67065:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21530:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60965:103;;;;;;;;;;;;;:::i;:::-;;67868:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64048:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72597:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73052:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70051:1243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60317:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24771:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63748:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69021:994;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31644:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67672:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63698:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38437:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63373:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72087:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32035:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63457:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63544:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72827:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61223:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68783:205;68915:4;68944:36;68968:11;68944:23;:36::i;:::-;68937:43;;68783:205;;;:::o;72937:107::-;72992:4;73016:20;;;;;;;;;;;73009:27;;72937:107;:::o;64154:53::-;;;;;;;;;;;;;;;;;:::o;24595:100::-;24649:13;24682:5;24675:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24595:100;:::o;31086:218::-;31162:7;31187:16;31195:7;31187;:16::i;:::-;31182:64;;31212:34;;;;;;;;;;;;;;31182:64;31266:15;:24;31282:7;31266:24;;;;;;;;;;;:30;;;;;;;;;;;;31259:37;;31086:218;;;:::o;30519:408::-;30608:13;30624:16;30632:7;30624;:16::i;:::-;30608:32;;30680:5;30657:28;;:19;:17;:19::i;:::-;:28;;;30653:175;;30705:44;30722:5;30729:19;:17;:19::i;:::-;30705:16;:44::i;:::-;30700:128;;30777:35;;;;;;;;;;;;;;30700:128;30653:175;30873:2;30840:15;:24;30856:7;30840:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;30911:7;30907:2;30891:28;;30900:5;30891:28;;;;;;;;;;;;30597:330;30519:408;;:::o;63413:37::-;;;;:::o;68477:274::-;60203:13;:11;:13::i;:::-;68565:42:::1;68540:67;;:21;;;;;;;;;;;:67;;;68537:124;;;68609:52;;;;;;;;;;:::i;:::-;;;;;;;;68537:124;68686:21;;;;;;;;;;;68672:56;;;68737:4;68672:71;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;68477:274::o:0;63845:40::-;;;;;;;;;;;;;:::o;20346:323::-;20407:7;20635:15;:13;:15::i;:::-;20620:12;;20604:13;;:28;:46;20597:53;;20346:323;:::o;64097:50::-;;;;;;;;;;;;;;;;;:::o;65948:254::-;60203:13;:11;:13::i;:::-;66031::::1;66028:56;;;66079:5;66059:17;;:25;;;;;;;;;;;;;;;;;;66028:56;66118:13;66095:20;;:36;;;;;;;;;;;;;;;;;;66147:47;66168:10;66180:13;66147:47;;;;;;;:::i;:::-;;;;;;;;65948:254:::0;:::o;63334:32::-;;;;:::o;34725:2825::-;34867:27;34897;34916:7;34897:18;:27::i;:::-;34867:57;;34982:4;34941:45;;34957:19;34941:45;;;34937:86;;34995:28;;;;;;;;;;;;;;34937:86;35037:27;35066:23;35093:35;35120:7;35093:26;:35::i;:::-;35036:92;;;;35228:68;35253:15;35270:4;35276:19;:17;:19::i;:::-;35228:24;:68::i;:::-;35223:180;;35316:43;35333:4;35339:19;:17;:19::i;:::-;35316:16;:43::i;:::-;35311:92;;35368:35;;;;;;;;;;;;;;35311:92;35223:180;35434:1;35420:16;;:2;:16;;;35416:52;;;35445:23;;;;;;;;;;;;;;35416:52;35481:43;35503:4;35509:2;35513:7;35522:1;35481:21;:43::i;:::-;35617:15;35614:160;;;35757:1;35736:19;35729:30;35614:160;36154:18;:24;36173:4;36154:24;;;;;;;;;;;;;;;;36152:26;;;;;;;;;;;;36223:18;:22;36242:2;36223:22;;;;;;;;;;;;;;;;36221:24;;;;;;;;;;;36545:146;36582:2;36631:45;36646:4;36652:2;36656:19;36631:14;:45::i;:::-;16745:8;36603:73;36545:18;:146::i;:::-;36516:17;:26;36534:7;36516:26;;;;;;;;;;;:175;;;;36862:1;16745:8;36811:19;:47;:52;36807:627;;;36884:19;36916:1;36906:7;:11;36884:33;;37073:1;37039:17;:30;37057:11;37039:30;;;;;;;;;;;;:35;37035:384;;;37177:13;;37162:11;:28;37158:242;;37357:19;37324:17;:30;37342:11;37324:30;;;;;;;;;;;:52;;;;37158:242;37035:384;36865:569;36807:627;37481:7;37477:2;37462:27;;37471:4;37462:27;;;;;;;;;;;;37500:42;37521:4;37527:2;37531:7;37540:1;37500:20;:42::i;:::-;34856:2694;;;34725:2825;;;:::o;68069:175::-;60203:13;:11;:13::i;:::-;68164::::1;68147:14;:30;;;;68193:43;68210:10;68222:13;68193:43;;;;;;;:::i;:::-;;;;;;;;68069:175:::0;:::o;68252:217::-;60203:13;:11;:13::i;:::-;68368:20:::1;68344:21;;:44;;;;;;;;;;;;;;;;;;68404:57;68428:10;68440:20;68404:57;;;;;;;:::i;:::-;;;;;;;;68252:217:::0;:::o;65402:111::-;60203:13;:11;:13::i;:::-;65497:8:::1;65481:13;:24;;;;;;;;;;;;:::i;:::-;;65402:111:::0;:::o;65120:274::-;60203:13;:11;:13::i;:::-;1845:1:::1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;65182:15:::2;65200:21;65182:39;;65264:1;65240:21;:25;65232:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;65301:7;:5;:7::i;:::-;65293:25;;:48;65319:21;65293:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;65357:29;65366:10;65378:7;65357:29;;;;;;;:::i;:::-;;;;;;;;65171:223;1801:1:::1;2755:7;:22;;;;65120:274::o:0;37646:193::-;37792:39;37809:4;37815:2;37819:7;37792:39;;;;;;;;;;;;:16;:39::i;:::-;37646:193;;;:::o;71384:695::-;71470:16;71504:23;71530:16;71540:5;71530:9;:16::i;:::-;71504:42;;71557:30;71604:15;71590:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71557:63;;71631:22;71668:23;71708:331;71733:15;71715;:33;:65;;;;;71770:10;;71752:14;:28;;71715:65;71708:331;;;71793:25;71821:23;71829:14;71821:7;:23::i;:::-;71793:51;;71882:5;71861:26;;:17;:26;;;71857:142;;;71952:1;71937:14;:16;;;;:::i;:::-;71904:13;71918:15;71904:30;;;;;;;;:::i;:::-;;;;;;;:49;;;;;71970:17;;;;;:::i;:::-;;;;71857:142;72011:16;;;;;:::i;:::-;;;;71782:257;71708:331;;;72058:13;72051:20;;;;;;71384:695;;;:::o;63207:120::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66491:371::-;60203:13;:11;:13::i;:::-;66569:19:::1;66591:13;:11;:13::i;:::-;66569:35;;66633:10;;66618:11;:25;66615:63;;;66645:33;;;;;;;;;;:::i;:::-;;;;;;;;66615:63;66715:10;;66706:6;66692:11;:20;;;;:::i;:::-;:33;66689:72;;;66727:34;;;;;;;;;;:::i;:::-;;;;;;;;66689:72;66785:1;66775:6;:11;66772:48;;66788:32;;;;;;;;;;:::i;:::-;;;;;;;;66772:48;66833:21;66842:3;66847:6;66833:8;:21::i;:::-;66558:304;66491:371:::0;;:::o;72497:92::-;72544:7;72571:10;;72564:17;;72497:92;:::o;66210:273::-;60203:13;:11;:13::i;:::-;66311:10:::1;;66294:14;:27;66291:80;;;66323:48;;;;;;;;;;:::i;:::-;;;;;;;;66291:80;66400:14;66382:15;:32;;;;66430:45;66448:10;66460:14;66430:45;;;;;;;:::i;:::-;;;;;;;;66210:273:::0;:::o;72390:99::-;72441:7;72468:13;:11;:13::i;:::-;72461:20;;72390:99;:::o;63801:37::-;;;;;;;;;;;;;:::o;65592:277::-;60203:13;:11;:13::i;:::-;65669:10:::1;65666:56;;;65717:5;65694:20;;:28;;;;;;;;;;;;;;;;;;65666:56;65750:13;:11;:13::i;:::-;65733:14;:30;;;;65794:10;65774:17;;:30;;;;;;;;;;;;;;;;;;65820:41;65838:10;65850;65820:41;;;;;;;:::i;:::-;;;;;;;;65592:277:::0;:::o;66870:187::-;60203:13;:11;:13::i;:::-;66971:15:::1;66952:16;:34;;;;67002:47;67021:10;67033:15;67002:47;;;;;;;:::i;:::-;;;;;;;;66870:187:::0;:::o;72709:110::-;72765:7;72792:19;;72785:26;;72709:110;:::o;63960:81::-;;;;;;;;;;;;;:::o;67375:176::-;60203:13;:11;:13::i;:::-;67470:9:::1;67451:16;:28;;;;67495:48;67514:10;67526:16;;67495:48;;;;;;;:::i;:::-;;;;;;;;67375:176:::0;:::o;63501:36::-;;;;:::o;25988:152::-;26060:7;26103:27;26122:7;26103:18;:27::i;:::-;26080:52;;25988:152;;;:::o;67065:193::-;60203:13;:11;:13::i;:::-;67160:9:::1;67144:13;:11;:13::i;:::-;:25;67136:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;67241:9;67228:10;:22;;;;67065:193:::0;:::o;21530:233::-;21602:7;21643:1;21626:19;;:5;:19;;;21622:60;;;21654:28;;;;;;;;;;;;;;21622:60;15689:13;21700:18;:25;21719:5;21700:25;;;;;;;;;;;;;;;;:55;21693:62;;21530:233;;;:::o;60965:103::-;60203:13;:11;:13::i;:::-;61030:30:::1;61057:1;61030:18;:30::i;:::-;60965:103::o:0;67868:193::-;60203:13;:11;:13::i;:::-;67972:16:::1;67952:17;:36;;;;68004:49;68024:10;68036:16;68004:49;;;;;;;:::i;:::-;;;;;;;;67868:193:::0;:::o;64048:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;72597:104::-;72650:7;72677:16;;72670:23;;72597:104;:::o;73052:101::-;73104:4;73128:17;;;;;;;;;;;73121:24;;73052:101;:::o;70051:1243::-;65024:10;65011:23;;:9;:23;;;65003:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1:::1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;70143:19:::2;70165:13;:11;:13::i;:::-;70143:35;;70193:20;;;;;;;;;;;70189:64;;70215:38;;;;;;;;;;:::i;:::-;;;;;;;;70189:64;70282:16;;70267:11;:31;70264:89;;;70300:53;;;;;;;;;;:::i;:::-;;;;;;;;70264:89;70390:16;;70381:6;70367:11;:20;;;;:::i;:::-;:39;70364:94;;;70408:50;;;;;;;;;;:::i;:::-;;;;;;;;70364:94;70506:17;;70472:18;:30;70491:10;70472:30;;;;;;;;;;;;;;;;:51;70469:105;;70525:49;;;;;;;;;;:::i;:::-;;;;;;;;70469:105;70621:1;70611:6;:11;70608:48;;70624:32;;;;;;;;;;:::i;:::-;;;;;;;;70608:48;70690:19;;70683:6;:26;;;;:::i;:::-;70670:9;:39;70667:82;;70711:38;;;;;;;;;;:::i;:::-;;;;;;;;70667:82;70772:17;;70763:6;:26;70760:218;;;70805:28;70872:35;70889:17;;70872:16;:35::i;:::-;70843:85;;;;;;;;:::i;:::-;;;;;;;;;;;;;70805:124;;70951:14;70944:22;;;;;;;;;;;:::i;:::-;;;;;;;;70760:218;71027:21;;;;;;;;;;;71013:53;;;71067:10;71013:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70988:10;:22;70999:10;70988:22;;;;;;;;;;;;;;;;:90;;;;;;;;;;;;;;;;;;71093:10;:22;71104:10;71093:22;;;;;;;;;;;;;;;;;;;;;;;;;71089:107;;71144:21;;;;;;;;;;;71130:46;;;71177:10;71189:6;71130:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;71089:107;71241:6;71207:18;:30;71226:10;71207:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;71258:28;71267:10;71279:6;71258:8;:28::i;:::-;70132:1162;1801:1:::1;2755:7;:22;;;;70051:1243:::0;:::o;60317:87::-;60363:7;60390:6;;;;;;;;;;;60383:13;;60317:87;:::o;24771:104::-;24827:13;24860:7;24853:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24771:104;:::o;63748:46::-;;;;:::o;69021:994::-;65024:10;65011:23;;:9;:23;;;65003:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1:::1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;69104:19:::2;69126:13;:11;:13::i;:::-;69104:35;;69154:17;;;;;;;;;;;69150:58;;69173:35;;;;;;;;;;:::i;:::-;;;;;;;;69150:58;69237:10;;69222:11;:25;69219:63;;;69249:33;;;;;;;;;;:::i;:::-;;;;;;;;69219:63;69319:10;;69310:6;69296:11;:20;;;;:::i;:::-;:33;69293:72;;;69331:34;;;;;;;;;;:::i;:::-;;;;;;;;69293:72;69410:14;;69379:15;:27;69395:10;69379:27;;;;;;;;;;;;;;;;:45;69376:91;;69426:41;;;;;;;;;;:::i;:::-;;;;;;;;69376:91;69541:15;;69524:14;;:32;;;;:::i;:::-;69508:11;:49;69505:94;;69559:40;;;;;;;;;;:::i;:::-;;;;;;;;69505:94;69697:15;;69680:14;;:32;;;;:::i;:::-;69669:6;69655:11;:20;;;;:::i;:::-;69654:59;69651:118;;;69715:54;;;;;;;;;;:::i;:::-;;;;;;;;69651:118;69793:1;69783:6;:11;69780:48;;69796:32;;;;;;;;;;:::i;:::-;;;;;;;;69780:48;69862:16;;69855:6;:23;;;;:::i;:::-;69842:9;:36;69839:79;;69880:38;;;;;;;;;;:::i;:::-;;;;;;;;69839:79;69962:6;69931:15;:27;69947:10;69931:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;69979:28;69988:10;70000:6;69979:8;:28::i;:::-;69093:922;1801:1:::1;2755:7;:22;;;;69021:994:::0;:::o;31644:234::-;31791:8;31739:18;:39;31758:19;:17;:19::i;:::-;31739:39;;;;;;;;;;;;;;;:49;31779:8;31739:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;31851:8;31815:55;;31830:19;:17;:19::i;:::-;31815:55;;;31861:8;31815:55;;;;;;:::i;:::-;;;;;;;;31644:234;;:::o;67672:188::-;60203:13;:11;:13::i;:::-;67773:9:::1;67751:19;:31;;;;67798:54;67820:10;67832:19;;67798:54;;;;;;;:::i;:::-;;;;;;;;67672:188:::0;:::o;63698:43::-;;;;:::o;38437:407::-;38612:31;38625:4;38631:2;38635:7;38612:12;:31::i;:::-;38676:1;38658:2;:14;;;:19;38654:183;;38697:56;38728:4;38734:2;38738:7;38747:5;38697:30;:56::i;:::-;38692:145;;38781:40;;;;;;;;;;;;;;38692:145;38654:183;38437:407;;;;:::o;63373:33::-;;;;:::o;72087:295::-;72171:13;72205:16;72213:7;72205;:16::i;:::-;72197:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;72296:1;72272:13;72266:27;;;;;:::i;:::-;;;:31;:108;;;;;;;;;;;;;;;;;72324:13;72342:25;72359:7;72342:16;:25::i;:::-;72307:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72266:108;72259:115;;72087:295;;;:::o;32035:164::-;32132:4;32156:18;:25;32175:5;32156:25;;;;;;;;;;;;;;;:35;32182:8;32156:35;;;;;;;;;;;;;;;;;;;;;;;;;32149:42;;32035:164;;;;:::o;63457:37::-;;;;:::o;63544:33::-;;;;:::o;72827:102::-;72879:7;72906:15;;72899:22;;72827:102;:::o;61223:201::-;60203:13;:11;:13::i;:::-;61332:1:::1;61312:22;;:8;:22;;;;61304:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;61388:28;61407:8;61388:18;:28::i;:::-;61223:201:::0;:::o;23693:639::-;23778:4;24117:10;24102:25;;:11;:25;;;;:102;;;;24194:10;24179:25;;:11;:25;;;;24102:102;:179;;;;24271:10;24256:25;;:11;:25;;;;24102:179;24082:199;;23693:639;;;:::o;32457:282::-;32522:4;32578:7;32559:15;:13;:15::i;:::-;:26;;:66;;;;;32612:13;;32602:7;:23;32559:66;:153;;;;;32711:1;16465:8;32663:17;:26;32681:7;32663:26;;;;;;;;;;;;:44;:49;32559:153;32539:173;;32457:282;;;:::o;54765:105::-;54825:7;54852:10;54845:17;;54765:105;:::o;60482:132::-;60557:12;:10;:12::i;:::-;60546:23;;:7;:5;:7::i;:::-;:23;;;60538:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60482:132::o;19862:92::-;19918:7;19862:92;:::o;27143:1275::-;27210:7;27230:12;27245:7;27230:22;;27313:4;27294:15;:13;:15::i;:::-;:23;27290:1061;;27347:13;;27340:4;:20;27336:1015;;;27385:14;27402:17;:23;27420:4;27402:23;;;;;;;;;;;;27385:40;;27519:1;16465:8;27491:6;:24;:29;27487:845;;;28156:113;28173:1;28163:6;:11;28156:113;;;28216:17;:25;28234:6;;;;;;;28216:25;;;;;;;;;;;;28207:34;;28156:113;;;28302:6;28295:13;;;;;;27487:845;27362:989;27336:1015;27290:1061;28379:31;;;;;;;;;;;;;;27143:1275;;;;:::o;33620:485::-;33722:27;33751:23;33792:38;33833:15;:24;33849:7;33833:24;;;;;;;;;;;33792:65;;34010:18;33987:41;;34067:19;34061:26;34042:45;;33972:126;33620:485;;;:::o;32848:659::-;32997:11;33162:16;33155:5;33151:28;33142:37;;33322:16;33311:9;33307:32;33294:45;;33472:15;33461:9;33458:30;33450:5;33439:9;33436:20;33433:56;33423:66;;32848:659;;;;;:::o;39506:159::-;;;;;:::o;54074:311::-;54209:7;54229:16;16869:3;54255:19;:41;;54229:68;;16869:3;54323:31;54334:4;54340:2;54344:9;54323:10;:31::i;:::-;54315:40;;:62;;54308:69;;;54074:311;;;;;:::o;28966:450::-;29046:14;29214:16;29207:5;29203:28;29194:37;;29391:5;29377:11;29352:23;29348:41;29345:52;29338:5;29335:63;29325:73;;28966:450;;;;:::o;40330:158::-;;;;;:::o;73185:96::-;73251:22;73261:2;73265:7;73251:9;:22::i;:::-;73185:96;;:::o;61584:191::-;61658:16;61677:6;;;;;;;;;;;61658:25;;61703:8;61694:6;;:17;;;;;;;;;;;;;;;;;;61758:8;61727:40;;61748:8;61727:40;;;;;;;;;;;;61647:128;61584:191;:::o;3222:723::-;3278:13;3508:1;3499:5;:10;3495:53;;;3526:10;;;;;;;;;;;;;;;;;;;;;3495:53;3558:12;3573:5;3558:20;;3589:14;3614:78;3629:1;3621:4;:9;3614:78;;3647:8;;;;;:::i;:::-;;;;3678:2;3670:10;;;;;:::i;:::-;;;3614:78;;;3702:19;3734:6;3724:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3702:39;;3752:154;3768:1;3759:5;:10;3752:154;;3796:1;3786:11;;;;;:::i;:::-;;;3863:2;3855:5;:10;;;;:::i;:::-;3842:2;:24;;;;:::i;:::-;3829:39;;3812:6;3819;3812:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3892:2;3883:11;;;;;:::i;:::-;;;3752:154;;;3930:6;3916:21;;;;;3222:723;;;;:::o;40928:716::-;41091:4;41137:2;41112:45;;;41158:19;:17;:19::i;:::-;41179:4;41185:7;41194:5;41112:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41108:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41412:1;41395:6;:13;:18;41391:235;;;41441:40;;;;;;;;;;;;;;41391:235;41584:6;41578:13;41569:6;41565:2;41561:15;41554:38;41108:529;41281:54;;;41271:64;;;:6;:64;;;;41264:71;;;40928:716;;;;;;:::o;58868:98::-;58921:7;58948:10;58941:17;;58868:98;:::o;53775:147::-;53912:6;53775:147;;;;;:::o;48597:112::-;48674:27;48684:2;48688:8;48674:27;;;;;;;;;;;;:9;:27::i;:::-;48597:112;;:::o;47824:689::-;47955:19;47961:2;47965:8;47955:5;:19::i;:::-;48034:1;48016:2;:14;;;:19;48012:483;;48056:11;48070:13;;48056:27;;48102:13;48124:8;48118:3;:14;48102:30;;48151:233;48182:62;48221:1;48225:2;48229:7;;;;;;48238:5;48182:30;:62::i;:::-;48177:167;;48280:40;;;;;;;;;;;;;;48177:167;48379:3;48371:5;:11;48151:233;;48466:3;48449:13;;:20;48445:34;;48471:8;;;48445:34;48037:458;;48012:483;47824:689;;;:::o;42106:2966::-;42179:20;42202:13;;42179:36;;42242:1;42230:8;:13;42226:44;;;42252:18;;;;;;;;;;;;;;42226:44;42283:61;42313:1;42317:2;42321:12;42335:8;42283:21;:61::i;:::-;42827:1;15827:2;42797:1;:26;;42796:32;42784:8;:45;42758:18;:22;42777:2;42758:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;43106:139;43143:2;43197:33;43220:1;43224:2;43228:1;43197:14;:33::i;:::-;43164:30;43185:8;43164:20;:30::i;:::-;:66;43106:18;:139::i;:::-;43072:17;:31;43090:12;43072:31;;;;;;;;;;;:173;;;;43262:16;43293:11;43322:8;43307:12;:23;43293:37;;43843:16;43839:2;43835:25;43823:37;;44215:12;44175:8;44134:1;44072:25;44013:1;43952;43925:335;44586:1;44572:12;44568:20;44526:346;44627:3;44618:7;44615:16;44526:346;;44845:7;44835:8;44832:1;44805:25;44802:1;44799;44794:59;44680:1;44671:7;44667:15;44656:26;;44526:346;;;44530:77;44917:1;44905:8;:13;44901:45;;;44927:19;;;;;;;;;;;;;;44901:45;44979:3;44963:13;:19;;;;42532:2462;;45004:60;45033:1;45037:2;45041:12;45055:8;45004:20;:60::i;:::-;42168:2904;42106:2966;;:::o;29518:324::-;29588:14;29821:1;29811:8;29808:15;29782:24;29778:46;29768:56;;29518:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:345::-;6159:6;6208:2;6196:9;6187:7;6183:23;6179:32;6176:119;;;6214:79;;:::i;:::-;6176:119;6334:1;6359:61;6412:7;6403:6;6392:9;6388:22;6359:61;:::i;:::-;6349:71;;6305:125;6092:345;;;;:::o;6443:327::-;6501:6;6550:2;6538:9;6529:7;6525:23;6521:32;6518:119;;;6556:79;;:::i;:::-;6518:119;6676:1;6701:52;6745:7;6736:6;6725:9;6721:22;6701:52;:::i;:::-;6691:62;;6647:116;6443:327;;;;:::o;6776:349::-;6845:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:119;;;6900:79;;:::i;:::-;6862:119;7020:1;7045:63;7100:7;7091:6;7080:9;7076:22;7045:63;:::i;:::-;7035:73;;6991:127;6776:349;;;;:::o;7131:509::-;7200:6;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7403:1;7392:9;7388:17;7375:31;7433:18;7425:6;7422:30;7419:117;;;7455:79;;:::i;:::-;7419:117;7560:63;7615:7;7606:6;7595:9;7591:22;7560:63;:::i;:::-;7550:73;;7346:287;7131:509;;;;:::o;7646:329::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:53;7950:7;7941:6;7930:9;7926:22;7905:53;:::i;:::-;7895:63;;7851:117;7646:329;;;;:::o;7981:179::-;8050:10;8071:46;8113:3;8105:6;8071:46;:::i;:::-;8149:4;8144:3;8140:14;8126:28;;7981:179;;;;:::o;8166:118::-;8253:24;8271:5;8253:24;:::i;:::-;8248:3;8241:37;8166:118;;:::o;8320:732::-;8439:3;8468:54;8516:5;8468:54;:::i;:::-;8538:86;8617:6;8612:3;8538:86;:::i;:::-;8531:93;;8648:56;8698:5;8648:56;:::i;:::-;8727:7;8758:1;8743:284;8768:6;8765:1;8762:13;8743:284;;;8844:6;8838:13;8871:63;8930:3;8915:13;8871:63;:::i;:::-;8864:70;;8957:60;9010:6;8957:60;:::i;:::-;8947:70;;8803:224;8790:1;8787;8783:9;8778:14;;8743:284;;;8747:14;9043:3;9036:10;;8444:608;;;8320:732;;;;:::o;9058:109::-;9139:21;9154:5;9139:21;:::i;:::-;9134:3;9127:34;9058:109;;:::o;9173:360::-;9259:3;9287:38;9319:5;9287:38;:::i;:::-;9341:70;9404:6;9399:3;9341:70;:::i;:::-;9334:77;;9420:52;9465:6;9460:3;9453:4;9446:5;9442:16;9420:52;:::i;:::-;9497:29;9519:6;9497:29;:::i;:::-;9492:3;9488:39;9481:46;;9263:270;9173:360;;;;:::o;9539:364::-;9627:3;9655:39;9688:5;9655:39;:::i;:::-;9710:71;9774:6;9769:3;9710:71;:::i;:::-;9703:78;;9790:52;9835:6;9830:3;9823:4;9816:5;9812:16;9790:52;:::i;:::-;9867:29;9889:6;9867:29;:::i;:::-;9862:3;9858:39;9851:46;;9631:272;9539:364;;;;:::o;9909:377::-;10015:3;10043:39;10076:5;10043:39;:::i;:::-;10098:89;10180:6;10175:3;10098:89;:::i;:::-;10091:96;;10196:52;10241:6;10236:3;10229:4;10222:5;10218:16;10196:52;:::i;:::-;10273:6;10268:3;10264:16;10257:23;;10019:267;9909:377;;;;:::o;10316:845::-;10419:3;10456:5;10450:12;10485:36;10511:9;10485:36;:::i;:::-;10537:89;10619:6;10614:3;10537:89;:::i;:::-;10530:96;;10657:1;10646:9;10642:17;10673:1;10668:137;;;;10819:1;10814:341;;;;10635:520;;10668:137;10752:4;10748:9;10737;10733:25;10728:3;10721:38;10788:6;10783:3;10779:16;10772:23;;10668:137;;10814:341;10881:38;10913:5;10881:38;:::i;:::-;10941:1;10955:154;10969:6;10966:1;10963:13;10955:154;;;11043:7;11037:14;11033:1;11028:3;11024:11;11017:35;11093:1;11084:7;11080:15;11069:26;;10991:4;10988:1;10984:12;10979:17;;10955:154;;;11138:6;11133:3;11129:16;11122:23;;10821:334;;10635:520;;10423:738;;10316:845;;;;:::o;11167:366::-;11309:3;11330:67;11394:2;11389:3;11330:67;:::i;:::-;11323:74;;11406:93;11495:3;11406:93;:::i;:::-;11524:2;11519:3;11515:12;11508:19;;11167:366;;;:::o;11539:::-;11681:3;11702:67;11766:2;11761:3;11702:67;:::i;:::-;11695:74;;11778:93;11867:3;11778:93;:::i;:::-;11896:2;11891:3;11887:12;11880:19;;11539:366;;;:::o;11911:400::-;12071:3;12092:84;12174:1;12169:3;12092:84;:::i;:::-;12085:91;;12185:93;12274:3;12185:93;:::i;:::-;12303:1;12298:3;12294:11;12287:18;;11911:400;;;:::o;12317:366::-;12459:3;12480:67;12544:2;12539:3;12480:67;:::i;:::-;12473:74;;12556:93;12645:3;12556:93;:::i;:::-;12674:2;12669:3;12665:12;12658:19;;12317:366;;;:::o;12689:::-;12831:3;12852:67;12916:2;12911:3;12852:67;:::i;:::-;12845:74;;12928:93;13017:3;12928:93;:::i;:::-;13046:2;13041:3;13037:12;13030:19;;12689:366;;;:::o;13061:::-;13203:3;13224:67;13288:2;13283:3;13224:67;:::i;:::-;13217:74;;13300:93;13389:3;13300:93;:::i;:::-;13418:2;13413:3;13409:12;13402:19;;13061:366;;;:::o;13433:::-;13575:3;13596:67;13660:2;13655:3;13596:67;:::i;:::-;13589:74;;13672:93;13761:3;13672:93;:::i;:::-;13790:2;13785:3;13781:12;13774:19;;13433:366;;;:::o;13805:::-;13947:3;13968:67;14032:2;14027:3;13968:67;:::i;:::-;13961:74;;14044:93;14133:3;14044:93;:::i;:::-;14162:2;14157:3;14153:12;14146:19;;13805:366;;;:::o;14177:::-;14319:3;14340:67;14404:2;14399:3;14340:67;:::i;:::-;14333:74;;14416:93;14505:3;14416:93;:::i;:::-;14534:2;14529:3;14525:12;14518:19;;14177:366;;;:::o;14549:::-;14691:3;14712:67;14776:2;14771:3;14712:67;:::i;:::-;14705:74;;14788:93;14877:3;14788:93;:::i;:::-;14906:2;14901:3;14897:12;14890:19;;14549:366;;;:::o;14921:::-;15063:3;15084:67;15148:2;15143:3;15084:67;:::i;:::-;15077:74;;15160:93;15249:3;15160:93;:::i;:::-;15278:2;15273:3;15269:12;15262:19;;14921:366;;;:::o;15293:::-;15435:3;15456:67;15520:2;15515:3;15456:67;:::i;:::-;15449:74;;15532:93;15621:3;15532:93;:::i;:::-;15650:2;15645:3;15641:12;15634:19;;15293:366;;;:::o;15665:::-;15807:3;15828:67;15892:2;15887:3;15828:67;:::i;:::-;15821:74;;15904:93;15993:3;15904:93;:::i;:::-;16022:2;16017:3;16013:12;16006:19;;15665:366;;;:::o;16037:402::-;16197:3;16218:85;16300:2;16295:3;16218:85;:::i;:::-;16211:92;;16312:93;16401:3;16312:93;:::i;:::-;16430:2;16425:3;16421:12;16414:19;;16037:402;;;:::o;16445:366::-;16587:3;16608:67;16672:2;16667:3;16608:67;:::i;:::-;16601:74;;16684:93;16773:3;16684:93;:::i;:::-;16802:2;16797:3;16793:12;16786:19;;16445:366;;;:::o;16817:::-;16959:3;16980:67;17044:2;17039:3;16980:67;:::i;:::-;16973:74;;17056:93;17145:3;17056:93;:::i;:::-;17174:2;17169:3;17165:12;17158:19;;16817:366;;;:::o;17189:::-;17331:3;17352:67;17416:2;17411:3;17352:67;:::i;:::-;17345:74;;17428:93;17517:3;17428:93;:::i;:::-;17546:2;17541:3;17537:12;17530:19;;17189:366;;;:::o;17561:::-;17703:3;17724:67;17788:2;17783:3;17724:67;:::i;:::-;17717:74;;17800:93;17889:3;17800:93;:::i;:::-;17918:2;17913:3;17909:12;17902:19;;17561:366;;;:::o;17933:::-;18075:3;18096:67;18160:2;18155:3;18096:67;:::i;:::-;18089:74;;18172:93;18261:3;18172:93;:::i;:::-;18290:2;18285:3;18281:12;18274:19;;17933:366;;;:::o;18305:::-;18447:3;18468:67;18532:2;18527:3;18468:67;:::i;:::-;18461:74;;18544:93;18633:3;18544:93;:::i;:::-;18662:2;18657:3;18653:12;18646:19;;18305:366;;;:::o;18677:::-;18819:3;18840:67;18904:2;18899:3;18840:67;:::i;:::-;18833:74;;18916:93;19005:3;18916:93;:::i;:::-;19034:2;19029:3;19025:12;19018:19;;18677:366;;;:::o;19049:::-;19191:3;19212:67;19276:2;19271:3;19212:67;:::i;:::-;19205:74;;19288:93;19377:3;19288:93;:::i;:::-;19406:2;19401:3;19397:12;19390:19;;19049:366;;;:::o;19421:400::-;19581:3;19602:84;19684:1;19679:3;19602:84;:::i;:::-;19595:91;;19695:93;19784:3;19695:93;:::i;:::-;19813:1;19808:3;19804:11;19797:18;;19421:400;;;:::o;19827:366::-;19969:3;19990:67;20054:2;20049:3;19990:67;:::i;:::-;19983:74;;20066:93;20155:3;20066:93;:::i;:::-;20184:2;20179:3;20175:12;20168:19;;19827:366;;;:::o;20199:108::-;20276:24;20294:5;20276:24;:::i;:::-;20271:3;20264:37;20199:108;;:::o;20313:118::-;20400:24;20418:5;20400:24;:::i;:::-;20395:3;20388:37;20313:118;;:::o;20437:695::-;20715:3;20737:92;20825:3;20816:6;20737:92;:::i;:::-;20730:99;;20846:148;20990:3;20846:148;:::i;:::-;20839:155;;21011:95;21102:3;21093:6;21011:95;:::i;:::-;21004:102;;21123:3;21116:10;;20437:695;;;;;:::o;21138:807::-;21472:3;21494:148;21638:3;21494:148;:::i;:::-;21487:155;;21659:95;21750:3;21741:6;21659:95;:::i;:::-;21652:102;;21771:148;21915:3;21771:148;:::i;:::-;21764:155;;21936:3;21929:10;;21138:807;;;;:::o;21951:222::-;22044:4;22082:2;22071:9;22067:18;22059:26;;22095:71;22163:1;22152:9;22148:17;22139:6;22095:71;:::i;:::-;21951:222;;;;:::o;22179:332::-;22300:4;22338:2;22327:9;22323:18;22315:26;;22351:71;22419:1;22408:9;22404:17;22395:6;22351:71;:::i;:::-;22432:72;22500:2;22489:9;22485:18;22476:6;22432:72;:::i;:::-;22179:332;;;;;:::o;22517:640::-;22712:4;22750:3;22739:9;22735:19;22727:27;;22764:71;22832:1;22821:9;22817:17;22808:6;22764:71;:::i;:::-;22845:72;22913:2;22902:9;22898:18;22889:6;22845:72;:::i;:::-;22927;22995:2;22984:9;22980:18;22971:6;22927:72;:::i;:::-;23046:9;23040:4;23036:20;23031:2;23020:9;23016:18;23009:48;23074:76;23145:4;23136:6;23074:76;:::i;:::-;23066:84;;22517:640;;;;;;;:::o;23163:320::-;23278:4;23316:2;23305:9;23301:18;23293:26;;23329:71;23397:1;23386:9;23382:17;23373:6;23329:71;:::i;:::-;23410:66;23472:2;23461:9;23457:18;23448:6;23410:66;:::i;:::-;23163:320;;;;;:::o;23489:332::-;23610:4;23648:2;23637:9;23633:18;23625:26;;23661:71;23729:1;23718:9;23714:17;23705:6;23661:71;:::i;:::-;23742:72;23810:2;23799:9;23795:18;23786:6;23742:72;:::i;:::-;23489:332;;;;;:::o;23827:373::-;23970:4;24008:2;23997:9;23993:18;23985:26;;24057:9;24051:4;24047:20;24043:1;24032:9;24028:17;24021:47;24085:108;24188:4;24179:6;24085:108;:::i;:::-;24077:116;;23827:373;;;;:::o;24206:210::-;24293:4;24331:2;24320:9;24316:18;24308:26;;24344:65;24406:1;24395:9;24391:17;24382:6;24344:65;:::i;:::-;24206:210;;;;:::o;24422:313::-;24535:4;24573:2;24562:9;24558:18;24550:26;;24622:9;24616:4;24612:20;24608:1;24597:9;24593:17;24586:47;24650:78;24723:4;24714:6;24650:78;:::i;:::-;24642:86;;24422:313;;;;:::o;24741:419::-;24907:4;24945:2;24934:9;24930:18;24922:26;;24994:9;24988:4;24984:20;24980:1;24969:9;24965:17;24958:47;25022:131;25148:4;25022:131;:::i;:::-;25014:139;;24741:419;;;:::o;25166:::-;25332:4;25370:2;25359:9;25355:18;25347:26;;25419:9;25413:4;25409:20;25405:1;25394:9;25390:17;25383:47;25447:131;25573:4;25447:131;:::i;:::-;25439:139;;25166:419;;;:::o;25591:::-;25757:4;25795:2;25784:9;25780:18;25772:26;;25844:9;25838:4;25834:20;25830:1;25819:9;25815:17;25808:47;25872:131;25998:4;25872:131;:::i;:::-;25864:139;;25591:419;;;:::o;26016:::-;26182:4;26220:2;26209:9;26205:18;26197:26;;26269:9;26263:4;26259:20;26255:1;26244:9;26240:17;26233:47;26297:131;26423:4;26297:131;:::i;:::-;26289:139;;26016:419;;;:::o;26441:::-;26607:4;26645:2;26634:9;26630:18;26622:26;;26694:9;26688:4;26684:20;26680:1;26669:9;26665:17;26658:47;26722:131;26848:4;26722:131;:::i;:::-;26714:139;;26441:419;;;:::o;26866:::-;27032:4;27070:2;27059:9;27055:18;27047:26;;27119:9;27113:4;27109:20;27105:1;27094:9;27090:17;27083:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;26866:419;;;:::o;27291:::-;27457:4;27495:2;27484:9;27480:18;27472:26;;27544:9;27538:4;27534:20;27530:1;27519:9;27515:17;27508:47;27572:131;27698:4;27572:131;:::i;:::-;27564:139;;27291:419;;;:::o;27716:::-;27882:4;27920:2;27909:9;27905:18;27897:26;;27969:9;27963:4;27959:20;27955:1;27944:9;27940:17;27933:47;27997:131;28123:4;27997:131;:::i;:::-;27989:139;;27716:419;;;:::o;28141:::-;28307:4;28345:2;28334:9;28330:18;28322:26;;28394:9;28388:4;28384:20;28380:1;28369:9;28365:17;28358:47;28422:131;28548:4;28422:131;:::i;:::-;28414:139;;28141:419;;;:::o;28566:::-;28732:4;28770:2;28759:9;28755:18;28747:26;;28819:9;28813:4;28809:20;28805:1;28794:9;28790:17;28783:47;28847:131;28973:4;28847:131;:::i;:::-;28839:139;;28566:419;;;:::o;28991:::-;29157:4;29195:2;29184:9;29180:18;29172:26;;29244:9;29238:4;29234:20;29230:1;29219:9;29215:17;29208:47;29272:131;29398:4;29272:131;:::i;:::-;29264:139;;28991:419;;;:::o;29416:::-;29582:4;29620:2;29609:9;29605:18;29597:26;;29669:9;29663:4;29659:20;29655:1;29644:9;29640:17;29633:47;29697:131;29823:4;29697:131;:::i;:::-;29689:139;;29416:419;;;:::o;29841:::-;30007:4;30045:2;30034:9;30030:18;30022:26;;30094:9;30088:4;30084:20;30080:1;30069:9;30065:17;30058:47;30122:131;30248:4;30122:131;:::i;:::-;30114:139;;29841:419;;;:::o;30266:::-;30432:4;30470:2;30459:9;30455:18;30447:26;;30519:9;30513:4;30509:20;30505:1;30494:9;30490:17;30483:47;30547:131;30673:4;30547:131;:::i;:::-;30539:139;;30266:419;;;:::o;30691:::-;30857:4;30895:2;30884:9;30880:18;30872:26;;30944:9;30938:4;30934:20;30930:1;30919:9;30915:17;30908:47;30972:131;31098:4;30972:131;:::i;:::-;30964:139;;30691:419;;;:::o;31116:::-;31282:4;31320:2;31309:9;31305:18;31297:26;;31369:9;31363:4;31359:20;31355:1;31344:9;31340:17;31333:47;31397:131;31523:4;31397:131;:::i;:::-;31389:139;;31116:419;;;:::o;31541:::-;31707:4;31745:2;31734:9;31730:18;31722:26;;31794:9;31788:4;31784:20;31780:1;31769:9;31765:17;31758:47;31822:131;31948:4;31822:131;:::i;:::-;31814:139;;31541:419;;;:::o;31966:::-;32132:4;32170:2;32159:9;32155:18;32147:26;;32219:9;32213:4;32209:20;32205:1;32194:9;32190:17;32183:47;32247:131;32373:4;32247:131;:::i;:::-;32239:139;;31966:419;;;:::o;32391:::-;32557:4;32595:2;32584:9;32580:18;32572:26;;32644:9;32638:4;32634:20;32630:1;32619:9;32615:17;32608:47;32672:131;32798:4;32672:131;:::i;:::-;32664:139;;32391:419;;;:::o;32816:::-;32982:4;33020:2;33009:9;33005:18;32997:26;;33069:9;33063:4;33059:20;33055:1;33044:9;33040:17;33033:47;33097:131;33223:4;33097:131;:::i;:::-;33089:139;;32816:419;;;:::o;33241:::-;33407:4;33445:2;33434:9;33430:18;33422:26;;33494:9;33488:4;33484:20;33480:1;33469:9;33465:17;33458:47;33522:131;33648:4;33522:131;:::i;:::-;33514:139;;33241:419;;;:::o;33666:222::-;33759:4;33797:2;33786:9;33782:18;33774:26;;33810:71;33878:1;33867:9;33863:17;33854:6;33810:71;:::i;:::-;33666:222;;;;:::o;33894:129::-;33928:6;33955:20;;:::i;:::-;33945:30;;33984:33;34012:4;34004:6;33984:33;:::i;:::-;33894:129;;;:::o;34029:75::-;34062:6;34095:2;34089:9;34079:19;;34029:75;:::o;34110:307::-;34171:4;34261:18;34253:6;34250:30;34247:56;;;34283:18;;:::i;:::-;34247:56;34321:29;34343:6;34321:29;:::i;:::-;34313:37;;34405:4;34399;34395:15;34387:23;;34110:307;;;:::o;34423:308::-;34485:4;34575:18;34567:6;34564:30;34561:56;;;34597:18;;:::i;:::-;34561:56;34635:29;34657:6;34635:29;:::i;:::-;34627:37;;34719:4;34713;34709:15;34701:23;;34423:308;;;:::o;34737:132::-;34804:4;34827:3;34819:11;;34857:4;34852:3;34848:14;34840:22;;34737:132;;;:::o;34875:141::-;34924:4;34947:3;34939:11;;34970:3;34967:1;34960:14;35004:4;35001:1;34991:18;34983:26;;34875:141;;;:::o;35022:114::-;35089:6;35123:5;35117:12;35107:22;;35022:114;;;:::o;35142:98::-;35193:6;35227:5;35221:12;35211:22;;35142:98;;;:::o;35246:99::-;35298:6;35332:5;35326:12;35316:22;;35246:99;;;:::o;35351:113::-;35421:4;35453;35448:3;35444:14;35436:22;;35351:113;;;:::o;35470:184::-;35569:11;35603:6;35598:3;35591:19;35643:4;35638:3;35634:14;35619:29;;35470:184;;;;:::o;35660:168::-;35743:11;35777:6;35772:3;35765:19;35817:4;35812:3;35808:14;35793:29;;35660:168;;;;:::o;35834:169::-;35918:11;35952:6;35947:3;35940:19;35992:4;35987:3;35983:14;35968:29;;35834:169;;;;:::o;36009:148::-;36111:11;36148:3;36133:18;;36009:148;;;;:::o;36163:305::-;36203:3;36222:20;36240:1;36222:20;:::i;:::-;36217:25;;36256:20;36274:1;36256:20;:::i;:::-;36251:25;;36410:1;36342:66;36338:74;36335:1;36332:81;36329:107;;;36416:18;;:::i;:::-;36329:107;36460:1;36457;36453:9;36446:16;;36163:305;;;;:::o;36474:185::-;36514:1;36531:20;36549:1;36531:20;:::i;:::-;36526:25;;36565:20;36583:1;36565:20;:::i;:::-;36560:25;;36604:1;36594:35;;36609:18;;:::i;:::-;36594:35;36651:1;36648;36644:9;36639:14;;36474:185;;;;:::o;36665:348::-;36705:7;36728:20;36746:1;36728:20;:::i;:::-;36723:25;;36762:20;36780:1;36762:20;:::i;:::-;36757:25;;36950:1;36882:66;36878:74;36875:1;36872:81;36867:1;36860:9;36853:17;36849:105;36846:131;;;36957:18;;:::i;:::-;36846:131;37005:1;37002;36998:9;36987:20;;36665:348;;;;:::o;37019:191::-;37059:4;37079:20;37097:1;37079:20;:::i;:::-;37074:25;;37113:20;37131:1;37113:20;:::i;:::-;37108:25;;37152:1;37149;37146:8;37143:34;;;37157:18;;:::i;:::-;37143:34;37202:1;37199;37195:9;37187:17;;37019:191;;;;:::o;37216:96::-;37253:7;37282:24;37300:5;37282:24;:::i;:::-;37271:35;;37216:96;;;:::o;37318:90::-;37352:7;37395:5;37388:13;37381:21;37370:32;;37318:90;;;:::o;37414:149::-;37450:7;37490:66;37483:5;37479:78;37468:89;;37414:149;;;:::o;37569:126::-;37606:7;37646:42;37639:5;37635:54;37624:65;;37569:126;;;:::o;37701:77::-;37738:7;37767:5;37756:16;;37701:77;;;:::o;37784:154::-;37868:6;37863:3;37858;37845:30;37930:1;37921:6;37916:3;37912:16;37905:27;37784:154;;;:::o;37944:307::-;38012:1;38022:113;38036:6;38033:1;38030:13;38022:113;;;38121:1;38116:3;38112:11;38106:18;38102:1;38097:3;38093:11;38086:39;38058:2;38055:1;38051:10;38046:15;;38022:113;;;38153:6;38150:1;38147:13;38144:101;;;38233:1;38224:6;38219:3;38215:16;38208:27;38144:101;37993:258;37944:307;;;:::o;38257:320::-;38301:6;38338:1;38332:4;38328:12;38318:22;;38385:1;38379:4;38375:12;38406:18;38396:81;;38462:4;38454:6;38450:17;38440:27;;38396:81;38524:2;38516:6;38513:14;38493:18;38490:38;38487:84;;;38543:18;;:::i;:::-;38487:84;38308:269;38257:320;;;:::o;38583:281::-;38666:27;38688:4;38666:27;:::i;:::-;38658:6;38654:40;38796:6;38784:10;38781:22;38760:18;38748:10;38745:34;38742:62;38739:88;;;38807:18;;:::i;:::-;38739:88;38847:10;38843:2;38836:22;38626:238;38583:281;;:::o;38870:233::-;38909:3;38932:24;38950:5;38932:24;:::i;:::-;38923:33;;38978:66;38971:5;38968:77;38965:103;;;39048:18;;:::i;:::-;38965:103;39095:1;39088:5;39084:13;39077:20;;38870:233;;;:::o;39109:176::-;39141:1;39158:20;39176:1;39158:20;:::i;:::-;39153:25;;39192:20;39210:1;39192:20;:::i;:::-;39187:25;;39231:1;39221:35;;39236:18;;:::i;:::-;39221:35;39277:1;39274;39270:9;39265:14;;39109:176;;;;:::o;39291:180::-;39339:77;39336:1;39329:88;39436:4;39433:1;39426:15;39460:4;39457:1;39450:15;39477:180;39525:77;39522:1;39515:88;39622:4;39619:1;39612:15;39646:4;39643:1;39636:15;39663:180;39711:77;39708:1;39701:88;39808:4;39805:1;39798:15;39832:4;39829:1;39822:15;39849:180;39897:77;39894:1;39887:88;39994:4;39991:1;39984:15;40018:4;40015:1;40008:15;40035:180;40083:77;40080:1;40073:88;40180:4;40177:1;40170:15;40204:4;40201:1;40194:15;40221:117;40330:1;40327;40320:12;40344:117;40453:1;40450;40443:12;40467:117;40576:1;40573;40566:12;40590:117;40699:1;40696;40689:12;40713:102;40754:6;40805:2;40801:7;40796:2;40789:5;40785:14;40781:28;40771:38;;40713:102;;;:::o;40821:177::-;40961:29;40957:1;40949:6;40945:14;40938:53;40821:177;:::o;41004:225::-;41144:34;41140:1;41132:6;41128:14;41121:58;41213:8;41208:2;41200:6;41196:15;41189:33;41004:225;:::o;41235:158::-;41375:10;41371:1;41363:6;41359:14;41352:34;41235:158;:::o;41399:172::-;41539:24;41535:1;41527:6;41523:14;41516:48;41399:172;:::o;41577:170::-;41717:22;41713:1;41705:6;41701:14;41694:46;41577:170;:::o;41753:171::-;41893:23;41889:1;41881:6;41877:14;41870:47;41753:171;:::o;41930:230::-;42070:34;42066:1;42058:6;42054:14;42047:58;42139:13;42134:2;42126:6;42122:15;42115:38;41930:230;:::o;42166:162::-;42306:14;42302:1;42294:6;42290:14;42283:38;42166:162;:::o;42334:229::-;42474:34;42470:1;42462:6;42458:14;42451:58;42543:12;42538:2;42530:6;42526:15;42519:37;42334:229;:::o;42569:::-;42709:34;42705:1;42697:6;42693:14;42686:58;42778:12;42773:2;42765:6;42761:15;42754:37;42569:229;:::o;42804:182::-;42944:34;42940:1;42932:6;42928:14;42921:58;42804:182;:::o;42992:226::-;43132:34;43128:1;43120:6;43116:14;43109:58;43201:9;43196:2;43188:6;43184:15;43177:34;42992:226;:::o;43224:225::-;43364:34;43360:1;43352:6;43348:14;43341:58;43433:8;43428:2;43420:6;43416:15;43409:33;43224:225;:::o;43455:166::-;43595:18;43591:1;43583:6;43579:14;43572:42;43455:166;:::o;43627:179::-;43767:31;43763:1;43755:6;43751:14;43744:55;43627:179;:::o;43812:174::-;43952:26;43948:1;43940:6;43936:14;43929:50;43812:174;:::o;43992:180::-;44132:32;44128:1;44120:6;44116:14;44109:56;43992:180;:::o;44178:177::-;44318:29;44314:1;44306:6;44302:14;44295:53;44178:177;:::o;44361:181::-;44501:33;44497:1;44489:6;44485:14;44478:57;44361:181;:::o;44548:180::-;44688:32;44684:1;44676:6;44672:14;44665:56;44548:180;:::o;44734:173::-;44874:25;44870:1;44862:6;44858:14;44851:49;44734:173;:::o;44913:225::-;45053:34;45049:1;45041:6;45037:14;45030:58;45122:8;45117:2;45109:6;45105:15;45098:33;44913:225;:::o;45144:151::-;45284:3;45280:1;45272:6;45268:14;45261:27;45144:151;:::o;45301:230::-;45441:34;45437:1;45429:6;45425:14;45418:58;45510:13;45505:2;45497:6;45493:15;45486:38;45301:230;:::o;45537:122::-;45610:24;45628:5;45610:24;:::i;:::-;45603:5;45600:35;45590:63;;45649:1;45646;45639:12;45590:63;45537:122;:::o;45665:116::-;45735:21;45750:5;45735:21;:::i;:::-;45728:5;45725:32;45715:60;;45771:1;45768;45761:12;45715:60;45665:116;:::o;45787:120::-;45859:23;45876:5;45859:23;:::i;:::-;45852:5;45849:34;45839:62;;45897:1;45894;45887:12;45839:62;45787:120;:::o;45913:122::-;45986:24;46004:5;45986:24;:::i;:::-;45979:5;45976:35;45966:63;;46025:1;46022;46015:12;45966:63;45913:122;:::o

Swarm Source

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