ETH Price: $3,486.63 (+2.31%)
Gas: 12 Gwei

Token

Larry Punks (LP)
 

Overview

Max Total Supply

6,160 LP

Holders

1,579

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
firerus.eth
Balance
5 LP
0xb6ed0d1b01e577a7e02f9a084e54aafc6ab38d20
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:
LarryPunks

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-29
*/

/**
 *Submitted for verification at Etherscan.io on 2023-08-30
*/

// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol)

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            require(proofPos == proofLen, "MerkleProof: invalid multiproof");
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            require(proofPos == proofLen, "MerkleProof: invalid multiproof");
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

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

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

/**
 * @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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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);
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)

// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

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

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

/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.18;

contract LarryPunks is DefaultOperatorFilterer, ERC2981, ERC721AQueryable, Ownable {

  mapping(address => uint256) public mintsInWallet;
  mapping (address => uint256) public WLClaims;
  mapping(address => uint256) public freeMints;

  uint public FreeMints = 0;
  uint public price = 0.0042 ether;
  uint public publicPrice = 0.0055 ether;
  uint public totalWLMints = 0;
  uint public maxPerWallet = 40;
  uint256 public reservedMints = 50;
  uint256 public freePerWL = 1;
  uint256 public maxPerWL = 2;
  string public baseURI;
  uint256 public MaxPerTX = 10;
  using MerkleProof for bytes32[];
  bytes32 public whitelistMerkleRoot;
  bool public WLActive;
  bool public publicActive;
  uint256 private totWalletWL;
  uint256 public SUPPLY = 6160;

  constructor() ERC721A("Larry Punks", "LP") { }

   function setBaseUri(string memory _uri) external onlyOwner {
    baseURI = _uri;
   }

   function setMerkleRoot(bytes32 root) external onlyOwner {
    whitelistMerkleRoot = root;
    }

   function setCost(uint256 price_) external onlyOwner {
        price = price_;
    }

    function setPublicCost(uint256 publicPrice_) external onlyOwner {
        publicPrice = publicPrice_;
    }

    function settotWalletWL(uint256 count) external onlyOwner {
        totWalletWL = count;
    }

    function costCheck() public view returns (uint256) {
        return price;
    }

    function costPublicCheck() public view returns (uint256) {
        return publicPrice;
    }

    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function setPublicActive() external onlyOwner {
    publicActive = !publicActive;
   }

    function setWLActive() external onlyOwner {
    WLActive = !WLActive;
    }

   function setfreePerWL(uint256 count) external onlyOwner {
    freePerWL = count;
   }

   function setMaxPerWL(uint256 count) external onlyOwner {
    maxPerWL = count;
   }

   function setMaxPerTX(uint256 count) external onlyOwner {
    MaxPerTX = count;
   }

   function teamMint(uint256 count) external onlyOwner
    {
        uint256 leftSupply = reservedMints;

        require(totalSupply() + count <= SUPPLY, "No more supply");
        require(leftSupply >= count, "All Team Supply Minted");
    
        reservedMints = leftSupply - count;
        _safeMint(msg.sender, count);
       
    }

    function mint(uint256 count) payable public {

    require(publicActive, "Sale Not Active");
    require(((totalSupply() + count) <= (SUPPLY - totWalletWL + FreeMints)), "The only supply left is FREE reserved mints");
    require(msg.value >= count * publicPrice, "Not enough ETH sent");
    require(((totalSupply() + count) <= SUPPLY), "No more supply, check on secondary");
    require ((count <= MaxPerTX), "Max per transaction exceeded");
    require (((mintsInWallet[msg.sender] + count) <= maxPerWallet), "Max per wallet exceeded");
    
    mintsInWallet[msg.sender] += count;
    _safeMint(msg.sender, count);
   }
  
    function WlMint(uint256 count, bytes32[] memory proof) payable public {

    require(((totalSupply() + count) <= (SUPPLY - totWalletWL + FreeMints)), "The only supply left is FREE reserved mints");
    require(WLActive, "WL Sale Not Active");
    require(_verify(_leaf(msg.sender), whitelistMerkleRoot, proof), "Not whitelisted");
    require(((totalSupply() + count) <= SUPPLY), "No more Supply, Check out on Secondary");
    require(WLClaims[msg.sender] + count <= maxPerWL, "WL supply is sold out");     
  
    if((freeMints[msg.sender] < freePerWL))
    {
       if(count >= (freePerWL - freeMints[msg.sender]))
            {
             require(msg.value >= (count * price) - ((freePerWL - freeMints[msg.sender]) * price), "Not enough ETH");
             freeMints[msg.sender] = freePerWL;
             FreeMints += freePerWL;
             totalWLMints += count;
            }
    }
    else 
    {
        require(msg.value >= count * price, "Not enough ETH");
        totalWLMints += count;
    }

    WLClaims[msg.sender] += count;
    _safeMint(msg.sender, count);
  }

  function _leaf(address account) public pure returns (bytes32) {
    return keccak256(abi.encodePacked(account));
  }

  function _verify(bytes32 leaf, bytes32 root, bytes32[] memory proof) public pure returns (bool) {
    return MerkleProof.verify(proof, root, leaf);
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  function setApprovalForAll(address operator, bool approved)
    public
    override(ERC721A, IERC721A)
    onlyAllowedOperatorApproval(operator)
  {
    super.setApprovalForAll(operator, approved);
  }

  function approve(address operator, uint256 tokenId) public override(ERC721A, IERC721A) payable onlyAllowedOperatorApproval(operator) {
    super.approve(operator, tokenId);
  }

  function transferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) payable onlyAllowedOperator(from) {
    super.transferFrom(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) payable onlyAllowedOperator(from) {
    super.safeTransferFrom(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
    public
    override(ERC721A, IERC721A)
    payable
    onlyAllowedOperator(from)
  {
    super.safeTransferFrom(from, to, tokenId, data);
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC721A, ERC2981) returns (bool) {
    return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
  }
}

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":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxPerTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WLClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"WlMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_leaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"_verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costPublicCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freePerWL","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsInWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setMaxPerTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setMaxPerWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicPrice_","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWLActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setfreePerWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"settotWalletWL","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":"count","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWLMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600e55660eebe0b40e8000600f5566138a388a43c00060105560006011556028601255603260135560016014556002601555600a601755611810601b553480156200005057600080fd5b506040518060400160405280600b81526020017f4c617272792050756e6b730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4c50000000000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002c95780156200018f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200015592919062000445565b600060405180830381600087803b1580156200017057600080fd5b505af115801562000185573d6000803e3d6000fd5b50505050620002c8565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000249576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200020f92919062000445565b600060405180830381600087803b1580156200022a57600080fd5b505af11580156200023f573d6000803e3d6000fd5b50505050620002c7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000292919062000472565b600060405180830381600087803b158015620002ad57600080fd5b505af1158015620002c2573d6000803e3d6000fd5b505050505b5b5b50508160049081620002dc919062000709565b508060059081620002ee919062000709565b50620002ff6200032d60201b60201c565b6002819055505050620003276200031b6200033260201b60201c565b6200033a60201b60201c565b620007f0565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200042d8262000400565b9050919050565b6200043f8162000420565b82525050565b60006040820190506200045c600083018562000434565b6200046b602083018462000434565b9392505050565b600060208201905062000489600083018462000434565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200051157607f821691505b602082108103620005275762000526620004c9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000552565b6200059d868362000552565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005ea620005e4620005de84620005b5565b620005bf565b620005b5565b9050919050565b6000819050919050565b6200060683620005c9565b6200061e6200061582620005f1565b8484546200055f565b825550505050565b600090565b6200063562000626565b62000642818484620005fb565b505050565b5b818110156200066a576200065e6000826200062b565b60018101905062000648565b5050565b601f821115620006b95762000683816200052d565b6200068e8462000542565b810160208510156200069e578190505b620006b6620006ad8562000542565b83018262000647565b50505b505050565b600082821c905092915050565b6000620006de60001984600802620006be565b1980831691505092915050565b6000620006f98383620006cb565b9150826002028217905092915050565b62000714826200048f565b67ffffffffffffffff81111562000730576200072f6200049a565b5b6200073c8254620004f8565b620007498282856200066e565b600060209050601f8311600181146200078157600084156200076c578287015190505b620007788582620006eb565b865550620007e8565b601f19841662000791866200052d565b60005b82811015620007bb5784890151825560018201915060208501945060208101905062000794565b86831015620007db5784890151620007d7601f891682620006cb565b8355505b6001600288020188555050505b505050505050565b6153a180620008006000396000f3fe6080604052600436106103815760003560e01c8063715018a6116101d1578063a0bcfc7f11610102578063c50497ae116100a0578063ed4c2fb71161006f578063ed4c2fb714610cfd578063ee64aefb14610d3a578063f2fde38b14610d65578063f94ccec014610d8e57610381565b8063c50497ae14610c2f578063c87b56dd14610c5a578063e5a4756c14610c97578063e985e9c514610cc057610381565b8063aa98e0c6116100dc578063aa98e0c614610b6e578063b1fab33114610b99578063b88d4fde14610bd6578063c23dc68f14610bf257610381565b8063a0bcfc7f14610af1578063a22cb46514610b1a578063a945bf8014610b4357610381565b80638e6df6411161016f57806399a2557a1161014957806399a2557a14610a42578063a0226dea14610a7f578063a035b1fe14610aaa578063a0712d6814610ad557610381565b80638e6df641146109c357806395d89b41146109da57806397731e4e14610a0557610381565b80637f8448a9116101ab5780637f8448a914610909578063811d2437146109325780638462151c1461095b5780638da5cb5b1461099857610381565b8063715018a61461089e57806372679727146108b55780637cb64759146108e057610381565b80633f2981cf116102b65780635bbb21771161025457806368785e111161022357806368785e11146107d05780636c0360eb146107f95780636d41d4fb1461082457806370a082311461086157610381565b80635bbb21771461070f57806361efde221461074c5780636352211e1461076857806364b72188146107a557610381565b806344a0d68a1161029057806344a0d68a14610653578063453c23101461067c57806349912e8d146106a757806358d95384146106e457610381565b80633f2981cf146105e157806341f434341461060c57806342842e0e1461063757610381565b8063120e5221116103235780632a55205a116102fd5780632a55205a146105385780632cb9b2ac146105765780632fbba115146105a15780633ccfd60b146105ca57610381565b8063120e5221146104c857806318160ddd146104f157806323b872dd1461051c57610381565b806306fdde031161035f57806306fdde0314610419578063081812fc14610444578063095ea7b3146104815780630b0514af1461049d57610381565b806301ffc9a71461038657806304ccbbf9146103c357806306a8250e146103ee575b600080fd5b34801561039257600080fd5b506103ad60048036038101906103a8919061382d565b610da5565b6040516103ba9190613875565b60405180910390f35b3480156103cf57600080fd5b506103d8610dc7565b6040516103e591906138a9565b60405180910390f35b3480156103fa57600080fd5b50610403610dcd565b60405161041091906138a9565b60405180910390f35b34801561042557600080fd5b5061042e610dd7565b60405161043b9190613954565b60405180910390f35b34801561045057600080fd5b5061046b600480360381019061046691906139a2565b610e69565b6040516104789190613a10565b60405180910390f35b61049b60048036038101906104969190613a57565b610ee8565b005b3480156104a957600080fd5b506104b2610f01565b6040516104bf91906138a9565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea91906139a2565b610f07565b005b3480156104fd57600080fd5b50610506610f19565b60405161051391906138a9565b60405180910390f35b61053660048036038101906105319190613a97565b610f30565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613aea565b610f7f565b60405161056d929190613b2a565b60405180910390f35b34801561058257600080fd5b5061058b611169565b60405161059891906138a9565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c391906139a2565b61116f565b005b3480156105d657600080fd5b506105df611238565b005b3480156105ed57600080fd5b506105f66112ef565b6040516106039190613875565b60405180910390f35b34801561061857600080fd5b50610621611302565b60405161062e9190613bb2565b60405180910390f35b610651600480360381019061064c9190613a97565b611314565b005b34801561065f57600080fd5b5061067a600480360381019061067591906139a2565b611363565b005b34801561068857600080fd5b50610691611375565b60405161069e91906138a9565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c99190613bcd565b61137b565b6040516106db9190613c13565b60405180910390f35b3480156106f057600080fd5b506106f96113ab565b6040516107069190613875565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190613c93565b6113be565b6040516107439190613e43565b60405180910390f35b61076660048036038101906107619190613fcf565b611481565b005b34801561077457600080fd5b5061078f600480360381019061078a91906139a2565b611919565b60405161079c9190613a10565b60405180910390f35b3480156107b157600080fd5b506107ba61192b565b6040516107c791906138a9565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906139a2565b611935565b005b34801561080557600080fd5b5061080e611947565b60405161081b9190613954565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190613bcd565b6119d5565b60405161085891906138a9565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190613bcd565b6119ed565b60405161089591906138a9565b60405180910390f35b3480156108aa57600080fd5b506108b3611aa5565b005b3480156108c157600080fd5b506108ca611ab9565b6040516108d791906138a9565b60405180910390f35b3480156108ec57600080fd5b506109076004803603810190610902919061402b565b611abf565b005b34801561091557600080fd5b50610930600480360381019061092b91906139a2565b611ad1565b005b34801561093e57600080fd5b50610959600480360381019061095491906139a2565b611ae3565b005b34801561096757600080fd5b50610982600480360381019061097d9190613bcd565b611af5565b60405161098f9190614116565b60405180910390f35b3480156109a457600080fd5b506109ad611c38565b6040516109ba9190613a10565b60405180910390f35b3480156109cf57600080fd5b506109d8611c62565b005b3480156109e657600080fd5b506109ef611c96565b6040516109fc9190613954565b60405180910390f35b348015610a1157600080fd5b50610a2c6004803603810190610a279190614138565b611d28565b604051610a399190613875565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a6491906141a7565b611d3e565b604051610a769190614116565b60405180910390f35b348015610a8b57600080fd5b50610a94611f4a565b604051610aa191906138a9565b60405180910390f35b348015610ab657600080fd5b50610abf611f50565b604051610acc91906138a9565b60405180910390f35b610aef6004803603810190610aea91906139a2565b611f56565b005b348015610afd57600080fd5b50610b186004803603810190610b1391906142af565b6121f4565b005b348015610b2657600080fd5b50610b416004803603810190610b3c9190614324565b61220f565b005b348015610b4f57600080fd5b50610b58612228565b604051610b6591906138a9565b60405180910390f35b348015610b7a57600080fd5b50610b8361222e565b604051610b909190613c13565b60405180910390f35b348015610ba557600080fd5b50610bc06004803603810190610bbb9190613bcd565b612234565b604051610bcd91906138a9565b60405180910390f35b610bf06004803603810190610beb9190614405565b61224c565b005b348015610bfe57600080fd5b50610c196004803603810190610c1491906139a2565b61229d565b604051610c2691906144dd565b60405180910390f35b348015610c3b57600080fd5b50610c44612307565b604051610c5191906138a9565b60405180910390f35b348015610c6657600080fd5b50610c816004803603810190610c7c91906139a2565b61230d565b604051610c8e9190613954565b60405180910390f35b348015610ca357600080fd5b50610cbe6004803603810190610cb991906139a2565b6123ab565b005b348015610ccc57600080fd5b50610ce76004803603810190610ce291906144f8565b6123bd565b604051610cf49190613875565b60405180910390f35b348015610d0957600080fd5b50610d246004803603810190610d1f9190613bcd565b612451565b604051610d3191906138a9565b60405180910390f35b348015610d4657600080fd5b50610d4f612469565b604051610d5c91906138a9565b60405180910390f35b348015610d7157600080fd5b50610d8c6004803603810190610d879190613bcd565b61246f565b005b348015610d9a57600080fd5b50610da36124f2565b005b6000610db082612526565b80610dc05750610dbf826125b8565b5b9050919050565b60175481565b6000601054905090565b606060048054610de690614567565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1290614567565b8015610e5f5780601f10610e3457610100808354040283529160200191610e5f565b820191906000526020600020905b815481529060010190602001808311610e4257829003601f168201915b5050505050905090565b6000610e7482612632565b610eaa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610ef281612691565b610efc838361278e565b505050565b600e5481565b610f0f6128d2565b80601a8190555050565b6000610f23612950565b6003546002540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f6e57610f6d33612691565b5b610f79848484612955565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036111145760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061111e612c77565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661114a91906145c7565b6111549190614638565b90508160000151819350935050509250929050565b60135481565b6111776128d2565b60006013549050601b548261118a610f19565b6111949190614669565b11156111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc906146e9565b60405180910390fd5b81811015611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614755565b60405180910390fd5b81816112249190614775565b6013819055506112343383612c81565b5050565b6112406128d2565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611266906147da565b60006040518083038185875af1925050503d80600081146112a3576040519150601f19603f3d011682016040523d82523d6000602084013e6112a8565b606091505b50509050806112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e39061483b565b60405180910390fd5b50565b601960019054906101000a900460ff1681565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113525761135133612691565b5b61135d848484612c9f565b50505050565b61136b6128d2565b80600f8190555050565b60125481565b60008160405160200161138e91906148a3565b604051602081830303815290604052805190602001209050919050565b601960009054906101000a900460ff1681565b6060600083839050905060008167ffffffffffffffff8111156113e4576113e3613e65565b5b60405190808252806020026020018201604052801561141d57816020015b61140a613772565b8152602001906001900390816114025790505b50905060005b8281146114755761144c8686838181106114405761143f6148be565b5b9050602002013561229d565b82828151811061145f5761145e6148be565b5b6020026020010181905250806001019050611423565b50809250505092915050565b600e54601a54601b546114949190614775565b61149e9190614669565b826114a7610f19565b6114b19190614669565b11156114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e99061495f565b60405180910390fd5b601960009054906101000a900460ff16611541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611538906149cb565b60405180910390fd5b61155661154d3361137b565b60185483611d28565b611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90614a37565b60405180910390fd5b601b54826115a1610f19565b6115ab9190614669565b11156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390614ac9565b60405180910390fd5b60155482600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461163a9190614669565b111561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290614b35565b60405180910390fd5b601454600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561184b57600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546117119190614775565b821061184657600f54600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546117679190614775565b61177191906145c7565b600f548361177f91906145c7565b6117899190614775565b3410156117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290614ba1565b60405180910390fd5b601454600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601454600e60008282546118259190614669565b92505081905550816011600082825461183e9190614669565b925050819055505b6118b5565b600f548261185991906145c7565b34101561189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189290614ba1565b60405180910390fd5b81601160008282546118ad9190614669565b925050819055505b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119049190614669565b925050819055506119153383612c81565b5050565b600061192482612cbf565b9050919050565b6000600f54905090565b61193d6128d2565b8060148190555050565b6016805461195490614567565b80601f016020809104026020016040519081016040528092919081815260200182805461198090614567565b80156119cd5780601f106119a2576101008083540402835291602001916119cd565b820191906000526020600020905b8154815290600101906020018083116119b057829003601f168201915b505050505081565b600d6020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a54576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611aad6128d2565b611ab76000612d8b565b565b60145481565b611ac76128d2565b8060188190555050565b611ad96128d2565b8060158190555050565b611aeb6128d2565b8060108190555050565b60606000806000611b05856119ed565b905060008167ffffffffffffffff811115611b2357611b22613e65565b5b604051908082528060200260200182016040528015611b515781602001602082028036833780820191505090505b509050611b5c613772565b6000611b66612950565b90505b838614611c2a57611b7981612e51565b91508160400151611c1f57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611bc457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c1e5780838780600101985081518110611c1157611c106148be565b5b6020026020010181815250505b5b806001019050611b69565b508195505050505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c6a6128d2565b601960009054906101000a900460ff1615601960006101000a81548160ff021916908315150217905550565b606060058054611ca590614567565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd190614567565b8015611d1e5780601f10611cf357610100808354040283529160200191611d1e565b820191906000526020600020905b815481529060010190602001808311611d0157829003601f168201915b5050505050905090565b6000611d35828486612e7c565b90509392505050565b6060818310611d79576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d84612e93565b9050611d8e612950565b851015611da057611d9d612950565b94505b80841115611dac578093505b6000611db7876119ed565b905084861015611dda576000868603905081811015611dd4578091505b50611ddf565b600090505b60008167ffffffffffffffff811115611dfb57611dfa613e65565b5b604051908082528060200260200182016040528015611e295781602001602082028036833780820191505090505b50905060008203611e405780945050505050611f43565b6000611e4b8861229d565b905060008160400151611e6057816000015190505b60008990505b888114158015611e765750848714155b15611f3557611e8481612e51565b92508260400151611f2a57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611ecf57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f295780848880600101995081518110611f1c57611f1b6148be565b5b6020026020010181815250505b5b806001019050611e66565b508583528296505050505050505b9392505050565b60115481565b600f5481565b601960019054906101000a900460ff16611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c90614c0d565b60405180910390fd5b600e54601a54601b54611fb89190614775565b611fc29190614669565b81611fcb610f19565b611fd59190614669565b1115612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d9061495f565b60405180910390fd5b6010548161202491906145c7565b341015612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614c79565b60405180910390fd5b601b5481612072610f19565b61207c9190614669565b11156120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490614d0b565b60405180910390fd5b601754811115612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614d77565b60405180910390fd5b60125481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121509190614669565b1115612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890614de3565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e09190614669565b925050819055506121f13382612c81565b50565b6121fc6128d2565b806016908161220b9190614fa5565b5050565b8161221981612691565b6122238383612e9d565b505050565b60105481565b60185481565b600b6020528060005260406000206000915090505481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461228a5761228933612691565b5b61229685858585612fa8565b5050505050565b6122a5613772565b6122ad613772565b6122b5612950565b8310806122c957506122c5612e93565b8310155b156122d75780915050612302565b6122e083612e51565b90508060400151156122f55780915050612302565b6122fe8361301b565b9150505b919050565b601b5481565b606061231882612632565b61234e576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061235861303b565b9050600081510361237857604051806020016040528060008152506123a3565b80612382846130cd565b6040516020016123939291906150b3565b6040516020818303038152906040525b915050919050565b6123b36128d2565b8060178190555050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915090505481565b60155481565b6124776128d2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90615149565b60405180910390fd5b6124ef81612d8b565b50565b6124fa6128d2565b601960019054906101000a900460ff1615601960016101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061258157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061262b575061262a8261311d565b5b9050919050565b60008161263d612950565b1115801561264c575060025482105b801561268a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561278b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612708929190615169565b602060405180830381865afa158015612725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274991906151a7565b61278a57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127819190613a10565b60405180910390fd5b5b50565b600061279982611919565b90508073ffffffffffffffffffffffffffffffffffffffff166127ba613187565b73ffffffffffffffffffffffffffffffffffffffff161461281d576127e6816127e1613187565b6123bd565b61281c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6128da61318f565b73ffffffffffffffffffffffffffffffffffffffff166128f8611c38565b73ffffffffffffffffffffffffffffffffffffffff161461294e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294590615220565b60405180910390fd5b565b600090565b600061296082612cbf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129c7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806129d384613197565b915091506129e981876129e4613187565b6131be565b612a35576129fe866129f9613187565b6123bd565b612a34576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a9b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612aa88686866001613202565b8015612ab357600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612b8185612b5d888887613208565b7c020000000000000000000000000000000000000000000000000000000017613230565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612c075760006001850190506000600660008381526020019081526020016000205403612c05576002548114612c04578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c6f868686600161325b565b505050505050565b6000612710905090565b612c9b828260405180602001604052806000815250613261565b5050565b612cba8383836040518060200160405280600081525061224c565b505050565b60008082905080612cce612950565b11612d5457600254811015612d535760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612d51575b60008103612d47576006600083600190039350838152602001908152602001600020549050612d1d565b8092505050612d86565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e59613772565b612e7560066000848152602001908152602001600020546132ff565b9050919050565b600082612e8985846133b5565b1490509392505050565b6000600254905090565b8060096000612eaa613187565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612f57613187565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f9c9190613875565b60405180910390a35050565b612fb3848484610f30565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461301557612fde8484848461340b565b613014576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b613023613772565b61303461302f83612cbf565b6132ff565b9050919050565b60606016805461304a90614567565b80601f016020809104026020016040519081016040528092919081815260200182805461307690614567565b80156130c35780601f10613098576101008083540402835291602001916130c3565b820191906000526020600020905b8154815290600101906020018083116130a657829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561310857600184039350600a81066030018453600a81049050806130e6575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861321f86868461355b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61326b8383613564565b60008373ffffffffffffffffffffffffffffffffffffffff163b146132fa5760006002549050600083820390505b6132ac600086838060010194508661340b565b6132e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106132995781600254146132f757600080fd5b50505b505050565b613307613772565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015613400576133eb828683815181106133de576133dd6148be565b5b6020026020010151613720565b915080806133f890615240565b9150506133be565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613431613187565b8786866040518563ffffffff1660e01b815260040161345394939291906152dd565b6020604051808303816000875af192505050801561348f57506040513d601f19601f8201168201806040525081019061348c919061533e565b60015b613508573d80600081146134bf576040519150601f19603f3d011682016040523d82523d6000602084013e6134c4565b606091505b506000815103613500576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006002549050600082036135a5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135b26000848385613202565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506136298361361a6000866000613208565b6136238561374b565b17613230565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146136ca57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061368f565b5060008203613705576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600281905550505061371b600084838561325b565b505050565b600081831061373857613733828461375b565b613743565b613742838361375b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61380a816137d5565b811461381557600080fd5b50565b60008135905061382781613801565b92915050565b600060208284031215613843576138426137cb565b5b600061385184828501613818565b91505092915050565b60008115159050919050565b61386f8161385a565b82525050565b600060208201905061388a6000830184613866565b92915050565b6000819050919050565b6138a381613890565b82525050565b60006020820190506138be600083018461389a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138fe5780820151818401526020810190506138e3565b60008484015250505050565b6000601f19601f8301169050919050565b6000613926826138c4565b61393081856138cf565b93506139408185602086016138e0565b6139498161390a565b840191505092915050565b6000602082019050818103600083015261396e818461391b565b905092915050565b61397f81613890565b811461398a57600080fd5b50565b60008135905061399c81613976565b92915050565b6000602082840312156139b8576139b76137cb565b5b60006139c68482850161398d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139fa826139cf565b9050919050565b613a0a816139ef565b82525050565b6000602082019050613a256000830184613a01565b92915050565b613a34816139ef565b8114613a3f57600080fd5b50565b600081359050613a5181613a2b565b92915050565b60008060408385031215613a6e57613a6d6137cb565b5b6000613a7c85828601613a42565b9250506020613a8d8582860161398d565b9150509250929050565b600080600060608486031215613ab057613aaf6137cb565b5b6000613abe86828701613a42565b9350506020613acf86828701613a42565b9250506040613ae08682870161398d565b9150509250925092565b60008060408385031215613b0157613b006137cb565b5b6000613b0f8582860161398d565b9250506020613b208582860161398d565b9150509250929050565b6000604082019050613b3f6000830185613a01565b613b4c602083018461389a565b9392505050565b6000819050919050565b6000613b78613b73613b6e846139cf565b613b53565b6139cf565b9050919050565b6000613b8a82613b5d565b9050919050565b6000613b9c82613b7f565b9050919050565b613bac81613b91565b82525050565b6000602082019050613bc76000830184613ba3565b92915050565b600060208284031215613be357613be26137cb565b5b6000613bf184828501613a42565b91505092915050565b6000819050919050565b613c0d81613bfa565b82525050565b6000602082019050613c286000830184613c04565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c5357613c52613c2e565b5b8235905067ffffffffffffffff811115613c7057613c6f613c33565b5b602083019150836020820283011115613c8c57613c8b613c38565b5b9250929050565b60008060208385031215613caa57613ca96137cb565b5b600083013567ffffffffffffffff811115613cc857613cc76137d0565b5b613cd485828601613c3d565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d15816139ef565b82525050565b600067ffffffffffffffff82169050919050565b613d3881613d1b565b82525050565b613d478161385a565b82525050565b600062ffffff82169050919050565b613d6581613d4d565b82525050565b608082016000820151613d816000850182613d0c565b506020820151613d946020850182613d2f565b506040820151613da76040850182613d3e565b506060820151613dba6060850182613d5c565b50505050565b6000613dcc8383613d6b565b60808301905092915050565b6000602082019050919050565b6000613df082613ce0565b613dfa8185613ceb565b9350613e0583613cfc565b8060005b83811015613e36578151613e1d8882613dc0565b9750613e2883613dd8565b925050600181019050613e09565b5085935050505092915050565b60006020820190508181036000830152613e5d8184613de5565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e9d8261390a565b810181811067ffffffffffffffff82111715613ebc57613ebb613e65565b5b80604052505050565b6000613ecf6137c1565b9050613edb8282613e94565b919050565b600067ffffffffffffffff821115613efb57613efa613e65565b5b602082029050602081019050919050565b613f1581613bfa565b8114613f2057600080fd5b50565b600081359050613f3281613f0c565b92915050565b6000613f4b613f4684613ee0565b613ec5565b90508083825260208201905060208402830185811115613f6e57613f6d613c38565b5b835b81811015613f975780613f838882613f23565b845260208401935050602081019050613f70565b5050509392505050565b600082601f830112613fb657613fb5613c2e565b5b8135613fc6848260208601613f38565b91505092915050565b60008060408385031215613fe657613fe56137cb565b5b6000613ff48582860161398d565b925050602083013567ffffffffffffffff811115614015576140146137d0565b5b61402185828601613fa1565b9150509250929050565b600060208284031215614041576140406137cb565b5b600061404f84828501613f23565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61408d81613890565b82525050565b600061409f8383614084565b60208301905092915050565b6000602082019050919050565b60006140c382614058565b6140cd8185614063565b93506140d883614074565b8060005b838110156141095781516140f08882614093565b97506140fb836140ab565b9250506001810190506140dc565b5085935050505092915050565b6000602082019050818103600083015261413081846140b8565b905092915050565b600080600060608486031215614151576141506137cb565b5b600061415f86828701613f23565b935050602061417086828701613f23565b925050604084013567ffffffffffffffff811115614191576141906137d0565b5b61419d86828701613fa1565b9150509250925092565b6000806000606084860312156141c0576141bf6137cb565b5b60006141ce86828701613a42565b93505060206141df8682870161398d565b92505060406141f08682870161398d565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561421a57614219613e65565b5b6142238261390a565b9050602081019050919050565b82818337600083830152505050565b600061425261424d846141ff565b613ec5565b90508281526020810184848401111561426e5761426d6141fa565b5b614279848285614230565b509392505050565b600082601f83011261429657614295613c2e565b5b81356142a684826020860161423f565b91505092915050565b6000602082840312156142c5576142c46137cb565b5b600082013567ffffffffffffffff8111156142e3576142e26137d0565b5b6142ef84828501614281565b91505092915050565b6143018161385a565b811461430c57600080fd5b50565b60008135905061431e816142f8565b92915050565b6000806040838503121561433b5761433a6137cb565b5b600061434985828601613a42565b925050602061435a8582860161430f565b9150509250929050565b600067ffffffffffffffff82111561437f5761437e613e65565b5b6143888261390a565b9050602081019050919050565b60006143a86143a384614364565b613ec5565b9050828152602081018484840111156143c4576143c36141fa565b5b6143cf848285614230565b509392505050565b600082601f8301126143ec576143eb613c2e565b5b81356143fc848260208601614395565b91505092915050565b6000806000806080858703121561441f5761441e6137cb565b5b600061442d87828801613a42565b945050602061443e87828801613a42565b935050604061444f8782880161398d565b925050606085013567ffffffffffffffff8111156144705761446f6137d0565b5b61447c878288016143d7565b91505092959194509250565b60808201600082015161449e6000850182613d0c565b5060208201516144b16020850182613d2f565b5060408201516144c46040850182613d3e565b5060608201516144d76060850182613d5c565b50505050565b60006080820190506144f26000830184614488565b92915050565b6000806040838503121561450f5761450e6137cb565b5b600061451d85828601613a42565b925050602061452e85828601613a42565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061457f57607f821691505b60208210810361459257614591614538565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145d282613890565b91506145dd83613890565b92508282026145eb81613890565b9150828204841483151761460257614601614598565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061464382613890565b915061464e83613890565b92508261465e5761465d614609565b5b828204905092915050565b600061467482613890565b915061467f83613890565b925082820190508082111561469757614696614598565b5b92915050565b7f4e6f206d6f726520737570706c79000000000000000000000000000000000000600082015250565b60006146d3600e836138cf565b91506146de8261469d565b602082019050919050565b60006020820190508181036000830152614702816146c6565b9050919050565b7f416c6c205465616d20537570706c79204d696e74656400000000000000000000600082015250565b600061473f6016836138cf565b915061474a82614709565b602082019050919050565b6000602082019050818103600083015261476e81614732565b9050919050565b600061478082613890565b915061478b83613890565b92508282039050818111156147a3576147a2614598565b5b92915050565b600081905092915050565b50565b60006147c46000836147a9565b91506147cf826147b4565b600082019050919050565b60006147e5826147b7565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006148256010836138cf565b9150614830826147ef565b602082019050919050565b6000602082019050818103600083015261485481614818565b9050919050565b60008160601b9050919050565b60006148738261485b565b9050919050565b600061488582614868565b9050919050565b61489d614898826139ef565b61487a565b82525050565b60006148af828461488c565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546865206f6e6c7920737570706c79206c65667420697320465245452072657360008201527f6572766564206d696e7473000000000000000000000000000000000000000000602082015250565b6000614949602b836138cf565b9150614954826148ed565b604082019050919050565b600060208201905081810360008301526149788161493c565b9050919050565b7f574c2053616c65204e6f74204163746976650000000000000000000000000000600082015250565b60006149b56012836138cf565b91506149c08261497f565b602082019050919050565b600060208201905081810360008301526149e4816149a8565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000614a21600f836138cf565b9150614a2c826149eb565b602082019050919050565b60006020820190508181036000830152614a5081614a14565b9050919050565b7f4e6f206d6f726520537570706c792c20436865636b206f7574206f6e2053656360008201527f6f6e646172790000000000000000000000000000000000000000000000000000602082015250565b6000614ab36026836138cf565b9150614abe82614a57565b604082019050919050565b60006020820190508181036000830152614ae281614aa6565b9050919050565b7f574c20737570706c7920697320736f6c64206f75740000000000000000000000600082015250565b6000614b1f6015836138cf565b9150614b2a82614ae9565b602082019050919050565b60006020820190508181036000830152614b4e81614b12565b9050919050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614b8b600e836138cf565b9150614b9682614b55565b602082019050919050565b60006020820190508181036000830152614bba81614b7e565b9050919050565b7f53616c65204e6f74204163746976650000000000000000000000000000000000600082015250565b6000614bf7600f836138cf565b9150614c0282614bc1565b602082019050919050565b60006020820190508181036000830152614c2681614bea565b9050919050565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000614c636013836138cf565b9150614c6e82614c2d565b602082019050919050565b60006020820190508181036000830152614c9281614c56565b9050919050565b7f4e6f206d6f726520737570706c792c20636865636b206f6e207365636f6e646160008201527f7279000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cf56022836138cf565b9150614d0082614c99565b604082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f4d617820706572207472616e73616374696f6e20657863656564656400000000600082015250565b6000614d61601c836138cf565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564000000000000000000600082015250565b6000614dcd6017836138cf565b9150614dd882614d97565b602082019050919050565b60006020820190508181036000830152614dfc81614dc0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614e657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e28565b614e6f8683614e28565b95508019841693508086168417925050509392505050565b6000614ea2614e9d614e9884613890565b613b53565b613890565b9050919050565b6000819050919050565b614ebc83614e87565b614ed0614ec882614ea9565b848454614e35565b825550505050565b600090565b614ee5614ed8565b614ef0818484614eb3565b505050565b5b81811015614f1457614f09600082614edd565b600181019050614ef6565b5050565b601f821115614f5957614f2a81614e03565b614f3384614e18565b81016020851015614f42578190505b614f56614f4e85614e18565b830182614ef5565b50505b505050565b600082821c905092915050565b6000614f7c60001984600802614f5e565b1980831691505092915050565b6000614f958383614f6b565b9150826002028217905092915050565b614fae826138c4565b67ffffffffffffffff811115614fc757614fc6613e65565b5b614fd18254614567565b614fdc828285614f18565b600060209050601f83116001811461500f5760008415614ffd578287015190505b6150078582614f89565b86555061506f565b601f19841661501d86614e03565b60005b8281101561504557848901518255600182019150602085019450602081019050615020565b86831015615062578489015161505e601f891682614f6b565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061508d826138c4565b6150978185615077565b93506150a78185602086016138e0565b80840191505092915050565b60006150bf8285615082565b91506150cb8284615082565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151336026836138cf565b915061513e826150d7565b604082019050919050565b6000602082019050818103600083015261516281615126565b9050919050565b600060408201905061517e6000830185613a01565b61518b6020830184613a01565b9392505050565b6000815190506151a1816142f8565b92915050565b6000602082840312156151bd576151bc6137cb565b5b60006151cb84828501615192565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061520a6020836138cf565b9150615215826151d4565b602082019050919050565b60006020820190508181036000830152615239816151fd565b9050919050565b600061524b82613890565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361527d5761527c614598565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60006152af82615288565b6152b98185615293565b93506152c98185602086016138e0565b6152d28161390a565b840191505092915050565b60006080820190506152f26000830187613a01565b6152ff6020830186613a01565b61530c604083018561389a565b818103606083015261531e81846152a4565b905095945050505050565b60008151905061533881613801565b92915050565b600060208284031215615354576153536137cb565b5b600061536284828501615329565b9150509291505056fea26469706673582212206d70c4eea415f7b07c1fea5919de1b390b4e2bab49f008e43054b14b025062ad64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106103815760003560e01c8063715018a6116101d1578063a0bcfc7f11610102578063c50497ae116100a0578063ed4c2fb71161006f578063ed4c2fb714610cfd578063ee64aefb14610d3a578063f2fde38b14610d65578063f94ccec014610d8e57610381565b8063c50497ae14610c2f578063c87b56dd14610c5a578063e5a4756c14610c97578063e985e9c514610cc057610381565b8063aa98e0c6116100dc578063aa98e0c614610b6e578063b1fab33114610b99578063b88d4fde14610bd6578063c23dc68f14610bf257610381565b8063a0bcfc7f14610af1578063a22cb46514610b1a578063a945bf8014610b4357610381565b80638e6df6411161016f57806399a2557a1161014957806399a2557a14610a42578063a0226dea14610a7f578063a035b1fe14610aaa578063a0712d6814610ad557610381565b80638e6df641146109c357806395d89b41146109da57806397731e4e14610a0557610381565b80637f8448a9116101ab5780637f8448a914610909578063811d2437146109325780638462151c1461095b5780638da5cb5b1461099857610381565b8063715018a61461089e57806372679727146108b55780637cb64759146108e057610381565b80633f2981cf116102b65780635bbb21771161025457806368785e111161022357806368785e11146107d05780636c0360eb146107f95780636d41d4fb1461082457806370a082311461086157610381565b80635bbb21771461070f57806361efde221461074c5780636352211e1461076857806364b72188146107a557610381565b806344a0d68a1161029057806344a0d68a14610653578063453c23101461067c57806349912e8d146106a757806358d95384146106e457610381565b80633f2981cf146105e157806341f434341461060c57806342842e0e1461063757610381565b8063120e5221116103235780632a55205a116102fd5780632a55205a146105385780632cb9b2ac146105765780632fbba115146105a15780633ccfd60b146105ca57610381565b8063120e5221146104c857806318160ddd146104f157806323b872dd1461051c57610381565b806306fdde031161035f57806306fdde0314610419578063081812fc14610444578063095ea7b3146104815780630b0514af1461049d57610381565b806301ffc9a71461038657806304ccbbf9146103c357806306a8250e146103ee575b600080fd5b34801561039257600080fd5b506103ad60048036038101906103a8919061382d565b610da5565b6040516103ba9190613875565b60405180910390f35b3480156103cf57600080fd5b506103d8610dc7565b6040516103e591906138a9565b60405180910390f35b3480156103fa57600080fd5b50610403610dcd565b60405161041091906138a9565b60405180910390f35b34801561042557600080fd5b5061042e610dd7565b60405161043b9190613954565b60405180910390f35b34801561045057600080fd5b5061046b600480360381019061046691906139a2565b610e69565b6040516104789190613a10565b60405180910390f35b61049b60048036038101906104969190613a57565b610ee8565b005b3480156104a957600080fd5b506104b2610f01565b6040516104bf91906138a9565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea91906139a2565b610f07565b005b3480156104fd57600080fd5b50610506610f19565b60405161051391906138a9565b60405180910390f35b61053660048036038101906105319190613a97565b610f30565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613aea565b610f7f565b60405161056d929190613b2a565b60405180910390f35b34801561058257600080fd5b5061058b611169565b60405161059891906138a9565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c391906139a2565b61116f565b005b3480156105d657600080fd5b506105df611238565b005b3480156105ed57600080fd5b506105f66112ef565b6040516106039190613875565b60405180910390f35b34801561061857600080fd5b50610621611302565b60405161062e9190613bb2565b60405180910390f35b610651600480360381019061064c9190613a97565b611314565b005b34801561065f57600080fd5b5061067a600480360381019061067591906139a2565b611363565b005b34801561068857600080fd5b50610691611375565b60405161069e91906138a9565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c99190613bcd565b61137b565b6040516106db9190613c13565b60405180910390f35b3480156106f057600080fd5b506106f96113ab565b6040516107069190613875565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190613c93565b6113be565b6040516107439190613e43565b60405180910390f35b61076660048036038101906107619190613fcf565b611481565b005b34801561077457600080fd5b5061078f600480360381019061078a91906139a2565b611919565b60405161079c9190613a10565b60405180910390f35b3480156107b157600080fd5b506107ba61192b565b6040516107c791906138a9565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906139a2565b611935565b005b34801561080557600080fd5b5061080e611947565b60405161081b9190613954565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190613bcd565b6119d5565b60405161085891906138a9565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190613bcd565b6119ed565b60405161089591906138a9565b60405180910390f35b3480156108aa57600080fd5b506108b3611aa5565b005b3480156108c157600080fd5b506108ca611ab9565b6040516108d791906138a9565b60405180910390f35b3480156108ec57600080fd5b506109076004803603810190610902919061402b565b611abf565b005b34801561091557600080fd5b50610930600480360381019061092b91906139a2565b611ad1565b005b34801561093e57600080fd5b50610959600480360381019061095491906139a2565b611ae3565b005b34801561096757600080fd5b50610982600480360381019061097d9190613bcd565b611af5565b60405161098f9190614116565b60405180910390f35b3480156109a457600080fd5b506109ad611c38565b6040516109ba9190613a10565b60405180910390f35b3480156109cf57600080fd5b506109d8611c62565b005b3480156109e657600080fd5b506109ef611c96565b6040516109fc9190613954565b60405180910390f35b348015610a1157600080fd5b50610a2c6004803603810190610a279190614138565b611d28565b604051610a399190613875565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a6491906141a7565b611d3e565b604051610a769190614116565b60405180910390f35b348015610a8b57600080fd5b50610a94611f4a565b604051610aa191906138a9565b60405180910390f35b348015610ab657600080fd5b50610abf611f50565b604051610acc91906138a9565b60405180910390f35b610aef6004803603810190610aea91906139a2565b611f56565b005b348015610afd57600080fd5b50610b186004803603810190610b1391906142af565b6121f4565b005b348015610b2657600080fd5b50610b416004803603810190610b3c9190614324565b61220f565b005b348015610b4f57600080fd5b50610b58612228565b604051610b6591906138a9565b60405180910390f35b348015610b7a57600080fd5b50610b8361222e565b604051610b909190613c13565b60405180910390f35b348015610ba557600080fd5b50610bc06004803603810190610bbb9190613bcd565b612234565b604051610bcd91906138a9565b60405180910390f35b610bf06004803603810190610beb9190614405565b61224c565b005b348015610bfe57600080fd5b50610c196004803603810190610c1491906139a2565b61229d565b604051610c2691906144dd565b60405180910390f35b348015610c3b57600080fd5b50610c44612307565b604051610c5191906138a9565b60405180910390f35b348015610c6657600080fd5b50610c816004803603810190610c7c91906139a2565b61230d565b604051610c8e9190613954565b60405180910390f35b348015610ca357600080fd5b50610cbe6004803603810190610cb991906139a2565b6123ab565b005b348015610ccc57600080fd5b50610ce76004803603810190610ce291906144f8565b6123bd565b604051610cf49190613875565b60405180910390f35b348015610d0957600080fd5b50610d246004803603810190610d1f9190613bcd565b612451565b604051610d3191906138a9565b60405180910390f35b348015610d4657600080fd5b50610d4f612469565b604051610d5c91906138a9565b60405180910390f35b348015610d7157600080fd5b50610d8c6004803603810190610d879190613bcd565b61246f565b005b348015610d9a57600080fd5b50610da36124f2565b005b6000610db082612526565b80610dc05750610dbf826125b8565b5b9050919050565b60175481565b6000601054905090565b606060048054610de690614567565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1290614567565b8015610e5f5780601f10610e3457610100808354040283529160200191610e5f565b820191906000526020600020905b815481529060010190602001808311610e4257829003601f168201915b5050505050905090565b6000610e7482612632565b610eaa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610ef281612691565b610efc838361278e565b505050565b600e5481565b610f0f6128d2565b80601a8190555050565b6000610f23612950565b6003546002540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f6e57610f6d33612691565b5b610f79848484612955565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036111145760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061111e612c77565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661114a91906145c7565b6111549190614638565b90508160000151819350935050509250929050565b60135481565b6111776128d2565b60006013549050601b548261118a610f19565b6111949190614669565b11156111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc906146e9565b60405180910390fd5b81811015611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614755565b60405180910390fd5b81816112249190614775565b6013819055506112343383612c81565b5050565b6112406128d2565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611266906147da565b60006040518083038185875af1925050503d80600081146112a3576040519150601f19603f3d011682016040523d82523d6000602084013e6112a8565b606091505b50509050806112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e39061483b565b60405180910390fd5b50565b601960019054906101000a900460ff1681565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113525761135133612691565b5b61135d848484612c9f565b50505050565b61136b6128d2565b80600f8190555050565b60125481565b60008160405160200161138e91906148a3565b604051602081830303815290604052805190602001209050919050565b601960009054906101000a900460ff1681565b6060600083839050905060008167ffffffffffffffff8111156113e4576113e3613e65565b5b60405190808252806020026020018201604052801561141d57816020015b61140a613772565b8152602001906001900390816114025790505b50905060005b8281146114755761144c8686838181106114405761143f6148be565b5b9050602002013561229d565b82828151811061145f5761145e6148be565b5b6020026020010181905250806001019050611423565b50809250505092915050565b600e54601a54601b546114949190614775565b61149e9190614669565b826114a7610f19565b6114b19190614669565b11156114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e99061495f565b60405180910390fd5b601960009054906101000a900460ff16611541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611538906149cb565b60405180910390fd5b61155661154d3361137b565b60185483611d28565b611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90614a37565b60405180910390fd5b601b54826115a1610f19565b6115ab9190614669565b11156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390614ac9565b60405180910390fd5b60155482600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461163a9190614669565b111561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290614b35565b60405180910390fd5b601454600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561184b57600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546117119190614775565b821061184657600f54600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546117679190614775565b61177191906145c7565b600f548361177f91906145c7565b6117899190614775565b3410156117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290614ba1565b60405180910390fd5b601454600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601454600e60008282546118259190614669565b92505081905550816011600082825461183e9190614669565b925050819055505b6118b5565b600f548261185991906145c7565b34101561189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189290614ba1565b60405180910390fd5b81601160008282546118ad9190614669565b925050819055505b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119049190614669565b925050819055506119153383612c81565b5050565b600061192482612cbf565b9050919050565b6000600f54905090565b61193d6128d2565b8060148190555050565b6016805461195490614567565b80601f016020809104026020016040519081016040528092919081815260200182805461198090614567565b80156119cd5780601f106119a2576101008083540402835291602001916119cd565b820191906000526020600020905b8154815290600101906020018083116119b057829003601f168201915b505050505081565b600d6020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a54576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611aad6128d2565b611ab76000612d8b565b565b60145481565b611ac76128d2565b8060188190555050565b611ad96128d2565b8060158190555050565b611aeb6128d2565b8060108190555050565b60606000806000611b05856119ed565b905060008167ffffffffffffffff811115611b2357611b22613e65565b5b604051908082528060200260200182016040528015611b515781602001602082028036833780820191505090505b509050611b5c613772565b6000611b66612950565b90505b838614611c2a57611b7981612e51565b91508160400151611c1f57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611bc457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c1e5780838780600101985081518110611c1157611c106148be565b5b6020026020010181815250505b5b806001019050611b69565b508195505050505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c6a6128d2565b601960009054906101000a900460ff1615601960006101000a81548160ff021916908315150217905550565b606060058054611ca590614567565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd190614567565b8015611d1e5780601f10611cf357610100808354040283529160200191611d1e565b820191906000526020600020905b815481529060010190602001808311611d0157829003601f168201915b5050505050905090565b6000611d35828486612e7c565b90509392505050565b6060818310611d79576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d84612e93565b9050611d8e612950565b851015611da057611d9d612950565b94505b80841115611dac578093505b6000611db7876119ed565b905084861015611dda576000868603905081811015611dd4578091505b50611ddf565b600090505b60008167ffffffffffffffff811115611dfb57611dfa613e65565b5b604051908082528060200260200182016040528015611e295781602001602082028036833780820191505090505b50905060008203611e405780945050505050611f43565b6000611e4b8861229d565b905060008160400151611e6057816000015190505b60008990505b888114158015611e765750848714155b15611f3557611e8481612e51565b92508260400151611f2a57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611ecf57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f295780848880600101995081518110611f1c57611f1b6148be565b5b6020026020010181815250505b5b806001019050611e66565b508583528296505050505050505b9392505050565b60115481565b600f5481565b601960019054906101000a900460ff16611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c90614c0d565b60405180910390fd5b600e54601a54601b54611fb89190614775565b611fc29190614669565b81611fcb610f19565b611fd59190614669565b1115612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d9061495f565b60405180910390fd5b6010548161202491906145c7565b341015612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614c79565b60405180910390fd5b601b5481612072610f19565b61207c9190614669565b11156120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490614d0b565b60405180910390fd5b601754811115612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614d77565b60405180910390fd5b60125481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121509190614669565b1115612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890614de3565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e09190614669565b925050819055506121f13382612c81565b50565b6121fc6128d2565b806016908161220b9190614fa5565b5050565b8161221981612691565b6122238383612e9d565b505050565b60105481565b60185481565b600b6020528060005260406000206000915090505481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461228a5761228933612691565b5b61229685858585612fa8565b5050505050565b6122a5613772565b6122ad613772565b6122b5612950565b8310806122c957506122c5612e93565b8310155b156122d75780915050612302565b6122e083612e51565b90508060400151156122f55780915050612302565b6122fe8361301b565b9150505b919050565b601b5481565b606061231882612632565b61234e576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061235861303b565b9050600081510361237857604051806020016040528060008152506123a3565b80612382846130cd565b6040516020016123939291906150b3565b6040516020818303038152906040525b915050919050565b6123b36128d2565b8060178190555050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915090505481565b60155481565b6124776128d2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90615149565b60405180910390fd5b6124ef81612d8b565b50565b6124fa6128d2565b601960019054906101000a900460ff1615601960016101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061258157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061262b575061262a8261311d565b5b9050919050565b60008161263d612950565b1115801561264c575060025482105b801561268a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561278b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612708929190615169565b602060405180830381865afa158015612725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274991906151a7565b61278a57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127819190613a10565b60405180910390fd5b5b50565b600061279982611919565b90508073ffffffffffffffffffffffffffffffffffffffff166127ba613187565b73ffffffffffffffffffffffffffffffffffffffff161461281d576127e6816127e1613187565b6123bd565b61281c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6128da61318f565b73ffffffffffffffffffffffffffffffffffffffff166128f8611c38565b73ffffffffffffffffffffffffffffffffffffffff161461294e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294590615220565b60405180910390fd5b565b600090565b600061296082612cbf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129c7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806129d384613197565b915091506129e981876129e4613187565b6131be565b612a35576129fe866129f9613187565b6123bd565b612a34576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a9b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612aa88686866001613202565b8015612ab357600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612b8185612b5d888887613208565b7c020000000000000000000000000000000000000000000000000000000017613230565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612c075760006001850190506000600660008381526020019081526020016000205403612c05576002548114612c04578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c6f868686600161325b565b505050505050565b6000612710905090565b612c9b828260405180602001604052806000815250613261565b5050565b612cba8383836040518060200160405280600081525061224c565b505050565b60008082905080612cce612950565b11612d5457600254811015612d535760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612d51575b60008103612d47576006600083600190039350838152602001908152602001600020549050612d1d565b8092505050612d86565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e59613772565b612e7560066000848152602001908152602001600020546132ff565b9050919050565b600082612e8985846133b5565b1490509392505050565b6000600254905090565b8060096000612eaa613187565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612f57613187565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f9c9190613875565b60405180910390a35050565b612fb3848484610f30565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461301557612fde8484848461340b565b613014576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b613023613772565b61303461302f83612cbf565b6132ff565b9050919050565b60606016805461304a90614567565b80601f016020809104026020016040519081016040528092919081815260200182805461307690614567565b80156130c35780601f10613098576101008083540402835291602001916130c3565b820191906000526020600020905b8154815290600101906020018083116130a657829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561310857600184039350600a81066030018453600a81049050806130e6575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861321f86868461355b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61326b8383613564565b60008373ffffffffffffffffffffffffffffffffffffffff163b146132fa5760006002549050600083820390505b6132ac600086838060010194508661340b565b6132e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106132995781600254146132f757600080fd5b50505b505050565b613307613772565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015613400576133eb828683815181106133de576133dd6148be565b5b6020026020010151613720565b915080806133f890615240565b9150506133be565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613431613187565b8786866040518563ffffffff1660e01b815260040161345394939291906152dd565b6020604051808303816000875af192505050801561348f57506040513d601f19601f8201168201806040525081019061348c919061533e565b60015b613508573d80600081146134bf576040519150601f19603f3d011682016040523d82523d6000602084013e6134c4565b606091505b506000815103613500576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006002549050600082036135a5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135b26000848385613202565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506136298361361a6000866000613208565b6136238561374b565b17613230565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146136ca57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061368f565b5060008203613705576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600281905550505061371b600084838561325b565b505050565b600081831061373857613733828461375b565b613743565b613742838361375b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61380a816137d5565b811461381557600080fd5b50565b60008135905061382781613801565b92915050565b600060208284031215613843576138426137cb565b5b600061385184828501613818565b91505092915050565b60008115159050919050565b61386f8161385a565b82525050565b600060208201905061388a6000830184613866565b92915050565b6000819050919050565b6138a381613890565b82525050565b60006020820190506138be600083018461389a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138fe5780820151818401526020810190506138e3565b60008484015250505050565b6000601f19601f8301169050919050565b6000613926826138c4565b61393081856138cf565b93506139408185602086016138e0565b6139498161390a565b840191505092915050565b6000602082019050818103600083015261396e818461391b565b905092915050565b61397f81613890565b811461398a57600080fd5b50565b60008135905061399c81613976565b92915050565b6000602082840312156139b8576139b76137cb565b5b60006139c68482850161398d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139fa826139cf565b9050919050565b613a0a816139ef565b82525050565b6000602082019050613a256000830184613a01565b92915050565b613a34816139ef565b8114613a3f57600080fd5b50565b600081359050613a5181613a2b565b92915050565b60008060408385031215613a6e57613a6d6137cb565b5b6000613a7c85828601613a42565b9250506020613a8d8582860161398d565b9150509250929050565b600080600060608486031215613ab057613aaf6137cb565b5b6000613abe86828701613a42565b9350506020613acf86828701613a42565b9250506040613ae08682870161398d565b9150509250925092565b60008060408385031215613b0157613b006137cb565b5b6000613b0f8582860161398d565b9250506020613b208582860161398d565b9150509250929050565b6000604082019050613b3f6000830185613a01565b613b4c602083018461389a565b9392505050565b6000819050919050565b6000613b78613b73613b6e846139cf565b613b53565b6139cf565b9050919050565b6000613b8a82613b5d565b9050919050565b6000613b9c82613b7f565b9050919050565b613bac81613b91565b82525050565b6000602082019050613bc76000830184613ba3565b92915050565b600060208284031215613be357613be26137cb565b5b6000613bf184828501613a42565b91505092915050565b6000819050919050565b613c0d81613bfa565b82525050565b6000602082019050613c286000830184613c04565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c5357613c52613c2e565b5b8235905067ffffffffffffffff811115613c7057613c6f613c33565b5b602083019150836020820283011115613c8c57613c8b613c38565b5b9250929050565b60008060208385031215613caa57613ca96137cb565b5b600083013567ffffffffffffffff811115613cc857613cc76137d0565b5b613cd485828601613c3d565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d15816139ef565b82525050565b600067ffffffffffffffff82169050919050565b613d3881613d1b565b82525050565b613d478161385a565b82525050565b600062ffffff82169050919050565b613d6581613d4d565b82525050565b608082016000820151613d816000850182613d0c565b506020820151613d946020850182613d2f565b506040820151613da76040850182613d3e565b506060820151613dba6060850182613d5c565b50505050565b6000613dcc8383613d6b565b60808301905092915050565b6000602082019050919050565b6000613df082613ce0565b613dfa8185613ceb565b9350613e0583613cfc565b8060005b83811015613e36578151613e1d8882613dc0565b9750613e2883613dd8565b925050600181019050613e09565b5085935050505092915050565b60006020820190508181036000830152613e5d8184613de5565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e9d8261390a565b810181811067ffffffffffffffff82111715613ebc57613ebb613e65565b5b80604052505050565b6000613ecf6137c1565b9050613edb8282613e94565b919050565b600067ffffffffffffffff821115613efb57613efa613e65565b5b602082029050602081019050919050565b613f1581613bfa565b8114613f2057600080fd5b50565b600081359050613f3281613f0c565b92915050565b6000613f4b613f4684613ee0565b613ec5565b90508083825260208201905060208402830185811115613f6e57613f6d613c38565b5b835b81811015613f975780613f838882613f23565b845260208401935050602081019050613f70565b5050509392505050565b600082601f830112613fb657613fb5613c2e565b5b8135613fc6848260208601613f38565b91505092915050565b60008060408385031215613fe657613fe56137cb565b5b6000613ff48582860161398d565b925050602083013567ffffffffffffffff811115614015576140146137d0565b5b61402185828601613fa1565b9150509250929050565b600060208284031215614041576140406137cb565b5b600061404f84828501613f23565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61408d81613890565b82525050565b600061409f8383614084565b60208301905092915050565b6000602082019050919050565b60006140c382614058565b6140cd8185614063565b93506140d883614074565b8060005b838110156141095781516140f08882614093565b97506140fb836140ab565b9250506001810190506140dc565b5085935050505092915050565b6000602082019050818103600083015261413081846140b8565b905092915050565b600080600060608486031215614151576141506137cb565b5b600061415f86828701613f23565b935050602061417086828701613f23565b925050604084013567ffffffffffffffff811115614191576141906137d0565b5b61419d86828701613fa1565b9150509250925092565b6000806000606084860312156141c0576141bf6137cb565b5b60006141ce86828701613a42565b93505060206141df8682870161398d565b92505060406141f08682870161398d565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561421a57614219613e65565b5b6142238261390a565b9050602081019050919050565b82818337600083830152505050565b600061425261424d846141ff565b613ec5565b90508281526020810184848401111561426e5761426d6141fa565b5b614279848285614230565b509392505050565b600082601f83011261429657614295613c2e565b5b81356142a684826020860161423f565b91505092915050565b6000602082840312156142c5576142c46137cb565b5b600082013567ffffffffffffffff8111156142e3576142e26137d0565b5b6142ef84828501614281565b91505092915050565b6143018161385a565b811461430c57600080fd5b50565b60008135905061431e816142f8565b92915050565b6000806040838503121561433b5761433a6137cb565b5b600061434985828601613a42565b925050602061435a8582860161430f565b9150509250929050565b600067ffffffffffffffff82111561437f5761437e613e65565b5b6143888261390a565b9050602081019050919050565b60006143a86143a384614364565b613ec5565b9050828152602081018484840111156143c4576143c36141fa565b5b6143cf848285614230565b509392505050565b600082601f8301126143ec576143eb613c2e565b5b81356143fc848260208601614395565b91505092915050565b6000806000806080858703121561441f5761441e6137cb565b5b600061442d87828801613a42565b945050602061443e87828801613a42565b935050604061444f8782880161398d565b925050606085013567ffffffffffffffff8111156144705761446f6137d0565b5b61447c878288016143d7565b91505092959194509250565b60808201600082015161449e6000850182613d0c565b5060208201516144b16020850182613d2f565b5060408201516144c46040850182613d3e565b5060608201516144d76060850182613d5c565b50505050565b60006080820190506144f26000830184614488565b92915050565b6000806040838503121561450f5761450e6137cb565b5b600061451d85828601613a42565b925050602061452e85828601613a42565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061457f57607f821691505b60208210810361459257614591614538565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145d282613890565b91506145dd83613890565b92508282026145eb81613890565b9150828204841483151761460257614601614598565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061464382613890565b915061464e83613890565b92508261465e5761465d614609565b5b828204905092915050565b600061467482613890565b915061467f83613890565b925082820190508082111561469757614696614598565b5b92915050565b7f4e6f206d6f726520737570706c79000000000000000000000000000000000000600082015250565b60006146d3600e836138cf565b91506146de8261469d565b602082019050919050565b60006020820190508181036000830152614702816146c6565b9050919050565b7f416c6c205465616d20537570706c79204d696e74656400000000000000000000600082015250565b600061473f6016836138cf565b915061474a82614709565b602082019050919050565b6000602082019050818103600083015261476e81614732565b9050919050565b600061478082613890565b915061478b83613890565b92508282039050818111156147a3576147a2614598565b5b92915050565b600081905092915050565b50565b60006147c46000836147a9565b91506147cf826147b4565b600082019050919050565b60006147e5826147b7565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006148256010836138cf565b9150614830826147ef565b602082019050919050565b6000602082019050818103600083015261485481614818565b9050919050565b60008160601b9050919050565b60006148738261485b565b9050919050565b600061488582614868565b9050919050565b61489d614898826139ef565b61487a565b82525050565b60006148af828461488c565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546865206f6e6c7920737570706c79206c65667420697320465245452072657360008201527f6572766564206d696e7473000000000000000000000000000000000000000000602082015250565b6000614949602b836138cf565b9150614954826148ed565b604082019050919050565b600060208201905081810360008301526149788161493c565b9050919050565b7f574c2053616c65204e6f74204163746976650000000000000000000000000000600082015250565b60006149b56012836138cf565b91506149c08261497f565b602082019050919050565b600060208201905081810360008301526149e4816149a8565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000614a21600f836138cf565b9150614a2c826149eb565b602082019050919050565b60006020820190508181036000830152614a5081614a14565b9050919050565b7f4e6f206d6f726520537570706c792c20436865636b206f7574206f6e2053656360008201527f6f6e646172790000000000000000000000000000000000000000000000000000602082015250565b6000614ab36026836138cf565b9150614abe82614a57565b604082019050919050565b60006020820190508181036000830152614ae281614aa6565b9050919050565b7f574c20737570706c7920697320736f6c64206f75740000000000000000000000600082015250565b6000614b1f6015836138cf565b9150614b2a82614ae9565b602082019050919050565b60006020820190508181036000830152614b4e81614b12565b9050919050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614b8b600e836138cf565b9150614b9682614b55565b602082019050919050565b60006020820190508181036000830152614bba81614b7e565b9050919050565b7f53616c65204e6f74204163746976650000000000000000000000000000000000600082015250565b6000614bf7600f836138cf565b9150614c0282614bc1565b602082019050919050565b60006020820190508181036000830152614c2681614bea565b9050919050565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000614c636013836138cf565b9150614c6e82614c2d565b602082019050919050565b60006020820190508181036000830152614c9281614c56565b9050919050565b7f4e6f206d6f726520737570706c792c20636865636b206f6e207365636f6e646160008201527f7279000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cf56022836138cf565b9150614d0082614c99565b604082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f4d617820706572207472616e73616374696f6e20657863656564656400000000600082015250565b6000614d61601c836138cf565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564000000000000000000600082015250565b6000614dcd6017836138cf565b9150614dd882614d97565b602082019050919050565b60006020820190508181036000830152614dfc81614dc0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614e657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e28565b614e6f8683614e28565b95508019841693508086168417925050509392505050565b6000614ea2614e9d614e9884613890565b613b53565b613890565b9050919050565b6000819050919050565b614ebc83614e87565b614ed0614ec882614ea9565b848454614e35565b825550505050565b600090565b614ee5614ed8565b614ef0818484614eb3565b505050565b5b81811015614f1457614f09600082614edd565b600181019050614ef6565b5050565b601f821115614f5957614f2a81614e03565b614f3384614e18565b81016020851015614f42578190505b614f56614f4e85614e18565b830182614ef5565b50505b505050565b600082821c905092915050565b6000614f7c60001984600802614f5e565b1980831691505092915050565b6000614f958383614f6b565b9150826002028217905092915050565b614fae826138c4565b67ffffffffffffffff811115614fc757614fc6613e65565b5b614fd18254614567565b614fdc828285614f18565b600060209050601f83116001811461500f5760008415614ffd578287015190505b6150078582614f89565b86555061506f565b601f19841661501d86614e03565b60005b8281101561504557848901518255600182019150602085019450602081019050615020565b86831015615062578489015161505e601f891682614f6b565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061508d826138c4565b6150978185615077565b93506150a78185602086016138e0565b80840191505092915050565b60006150bf8285615082565b91506150cb8284615082565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151336026836138cf565b915061513e826150d7565b604082019050919050565b6000602082019050818103600083015261516281615126565b9050919050565b600060408201905061517e6000830185613a01565b61518b6020830184613a01565b9392505050565b6000815190506151a1816142f8565b92915050565b6000602082840312156151bd576151bc6137cb565b5b60006151cb84828501615192565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061520a6020836138cf565b9150615215826151d4565b602082019050919050565b60006020820190508181036000830152615239816151fd565b9050919050565b600061524b82613890565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361527d5761527c614598565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60006152af82615288565b6152b98185615293565b93506152c98185602086016138e0565b6152d28161390a565b840191505092915050565b60006080820190506152f26000830187613a01565b6152ff6020830186613a01565b61530c604083018561389a565b818103606083015261531e81846152a4565b905095945050505050565b60008151905061533881613801565b92915050565b600060208284031215615354576153536137cb565b5b600061536284828501615329565b9150509291505056fea26469706673582212206d70c4eea415f7b07c1fea5919de1b390b4e2bab49f008e43054b14b025062ad64736f6c63430008120033

Deployed Bytecode Sourcemap

90700:5925:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96403:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91249:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92133:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41537:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48028:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95585:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90943:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91939:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37288:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95769:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17432:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;91120:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92874:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92235:173;;;;;;;;;;;;;:::i;:::-;;91382:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87420:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95959:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91729:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91086:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94981:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91357:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75184:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93870:1105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42930:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92043:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92596:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91223:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90892:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38472:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12497:103;;;;;;;;;;;;;:::i;:::-;;91158:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91625:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92690:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91822:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79060:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11856:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92512:77;;;;;;;;;;;;;:::i;:::-;;41713:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95105:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76100:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91053:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90973:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93227:633;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91531:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95372:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91010:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91318:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90790:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96157:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74597:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91443:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41923:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92782:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48977:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90843:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91191:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12755:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92416:88;;;;;;;;;;;;;:::i;:::-;;96403:219;96516:4;96536:38;96562:11;96536:25;:38::i;:::-;:80;;;;96578:38;96604:11;96578:25;:38::i;:::-;96536:80;96529:87;;96403:219;;;:::o;91249:28::-;;;;:::o;92133:94::-;92181:7;92208:11;;92201:18;;92133:94;:::o;41537:100::-;41591:13;41624:5;41617:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41537:100;:::o;48028:218::-;48104:7;48129:16;48137:7;48129;:16::i;:::-;48124:64;;48154:34;;;;;;;;;;;;;;48124:64;48208:15;:24;48224:7;48208:24;;;;;;;;;;;:30;;;;;;;;;;;;48201:37;;48028:218;;;:::o;95585:178::-;95708:8;89202:30;89223:8;89202:20;:30::i;:::-;95725:32:::1;95739:8;95749:7;95725:13;:32::i;:::-;95585:178:::0;;;:::o;90943:25::-;;;;:::o;91939:96::-;11742:13;:11;:13::i;:::-;92022:5:::1;92008:11;:19;;;;91939:96:::0;:::o;37288:323::-;37349:7;37577:15;:13;:15::i;:::-;37562:12;;37546:13;;:28;:46;37539:53;;37288:323;:::o;95769:184::-;95897:4;88936:10;88928:18;;:4;:18;;;88924:83;;88963:32;88984:10;88963:20;:32::i;:::-;88924:83;95910:37:::1;95929:4;95935:2;95939:7;95910:18;:37::i;:::-;95769:184:::0;;;;:::o;17432:438::-;17527:7;17536;17556:26;17585:17;:26;17603:7;17585:26;;;;;;;;;;;17556:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17656:1;17628:30;;:7;:16;;;:30;;;17624:92;;17685:19;17675:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17624:92;17728:21;17792:17;:15;:17::i;:::-;17752:57;;17765:7;:23;;;17753:35;;:9;:35;;;;:::i;:::-;17752:57;;;;:::i;:::-;17728:81;;17830:7;:16;;;17848:13;17822:40;;;;;;17432:438;;;;;:::o;91120:33::-;;;;:::o;92874:345::-;11742:13;:11;:13::i;:::-;92942:18:::1;92963:13;;92942:34;;93022:6;;93013:5;92997:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:31;;92989:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;93080:5;93066:10;:19;;93058:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;93158:5;93145:10;:18;;;;:::i;:::-;93129:13;:34;;;;93174:28;93184:10;93196:5;93174:9;:28::i;:::-;92931:288;92874:345:::0;:::o;92235:173::-;11742:13;:11;:13::i;:::-;92286:12:::1;92304:10;:15;;92327:21;92304:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92285:68;;;92372:7;92364:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;92274:134;92235:173::o:0;91382:24::-;;;;;;;;;;;;;:::o;87420:143::-;86316:42;87420:143;:::o;95959:192::-;96091:4;88936:10;88928:18;;:4;:18;;;88924:83;;88963:32;88984:10;88963:20;:32::i;:::-;88924:83;96104:41:::1;96127:4;96133:2;96137:7;96104:22;:41::i;:::-;95959:192:::0;;;;:::o;91729:85::-;11742:13;:11;:13::i;:::-;91800:6:::1;91792:5;:14;;;;91729:85:::0;:::o;91086:29::-;;;;:::o;94981:118::-;95034:7;95084;95067:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;95057:36;;;;;;95050:43;;94981:118;;;:::o;91357:20::-;;;;;;;;;;;;;:::o;75184:528::-;75328:23;75394:22;75419:8;;:15;;75394:40;;75449:34;75507:14;75486:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75449:73;;75542:9;75537:125;75558:14;75553:1;:19;75537:125;;75614:32;75634:8;;75643:1;75634:11;;;;;;;:::i;:::-;;;;;;;;75614:19;:32::i;:::-;75598:10;75609:1;75598:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;75574:3;;;;;75537:125;;;;75683:10;75676:17;;;;75184:528;;;;:::o;93870:1105::-;94009:9;;93995:11;;93986:6;;:20;;;;:::i;:::-;:32;;;;:::i;:::-;93975:5;93959:13;:11;:13::i;:::-;:21;;;;:::i;:::-;93958:61;;93949:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;94083:8;;;;;;;;;;;94075:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;94129:54;94137:17;94143:10;94137:5;:17::i;:::-;94156:19;;94177:5;94129:7;:54::i;:::-;94121:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;94246:6;;94236:5;94220:13;:11;:13::i;:::-;:21;;;;:::i;:::-;94219:33;;94210:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;94343:8;;94334:5;94311:8;:20;94320:10;94311:20;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:40;;94303:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;94421:9;;94397;:21;94407:10;94397:21;;;;;;;;;;;;;;;;:33;94393:504;;;94473:9;:21;94483:10;94473:21;;;;;;;;;;;;;;;;94461:9;;:33;;;;:::i;:::-;94451:5;:44;94448:321;;94604:5;;94579:9;:21;94589:10;94579:21;;;;;;;;;;;;;;;;94567:9;;:33;;;;:::i;:::-;94566:43;;;;:::i;:::-;94556:5;;94548;:13;;;;:::i;:::-;94547:63;;;;:::i;:::-;94534:9;:76;;94526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;94669:9;;94645;:21;94655:10;94645:21;;;;;;;;;;;;;;;:33;;;;94707:9;;94694;;:22;;;;;;;:::i;:::-;;;;;;;;94748:5;94732:12;;:21;;;;;;;:::i;:::-;;;;;;;;94448:321;94393:504;;;94833:5;;94825;:13;;;;:::i;:::-;94812:9;:26;;94804:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;94884:5;94868:12;;:21;;;;;;;:::i;:::-;;;;;;;;94393:504;94929:5;94905:8;:20;94914:10;94905:20;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;94941:28;94951:10;94963:5;94941:9;:28::i;:::-;93870:1105;;:::o;42930:152::-;43002:7;43045:27;43064:7;43045:18;:27::i;:::-;43022:52;;42930:152;;;:::o;92043:82::-;92085:7;92112:5;;92105:12;;92043:82;:::o;92596:87::-;11742:13;:11;:13::i;:::-;92671:5:::1;92659:9;:17;;;;92596:87:::0;:::o;91223:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;90892:44::-;;;;;;;;;;;;;;;;;:::o;38472:233::-;38544:7;38585:1;38568:19;;:5;:19;;;38564:60;;38596:28;;;;;;;;;;;;;;38564:60;32631:13;38642:18;:25;38661:5;38642:25;;;;;;;;;;;;;;;;:55;38635:62;;38472:233;;;:::o;12497:103::-;11742:13;:11;:13::i;:::-;12562:30:::1;12589:1;12562:18;:30::i;:::-;12497:103::o:0;91158:28::-;;;;:::o;91625:97::-;11742:13;:11;:13::i;:::-;91710:4:::1;91688:19;:26;;;;91625:97:::0;:::o;92690:85::-;11742:13;:11;:13::i;:::-;92763:5:::1;92752:8;:16;;;;92690:85:::0;:::o;91822:109::-;11742:13;:11;:13::i;:::-;91911:12:::1;91897:11;:26;;;;91822:109:::0;:::o;79060:900::-;79138:16;79192:19;79226:25;79266:22;79291:16;79301:5;79291:9;:16::i;:::-;79266:41;;79322:25;79364:14;79350:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79322:57;;79394:31;;:::i;:::-;79445:9;79457:15;:13;:15::i;:::-;79445:27;;79440:472;79489:14;79474:11;:29;79440:472;;79541:15;79554:1;79541:12;:15::i;:::-;79529:27;;79579:9;:16;;;79620:8;79575:73;79696:1;79670:28;;:9;:14;;;:28;;;79666:111;;79743:9;:14;;;79723:34;;79666:111;79820:5;79799:26;;:17;:26;;;79795:102;;79876:1;79850:8;79859:13;;;;;;79850:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;79795:102;79440:472;79505:3;;;;;79440:472;;;;79933:8;79926:15;;;;;;;79060:900;;;:::o;11856:87::-;11902:7;11929:6;;;;;;;;;;;11922:13;;11856:87;:::o;92512:77::-;11742:13;:11;:13::i;:::-;92573:8:::1;;;;;;;;;;;92572:9;92561:8;;:20;;;;;;;;;;;;;;;;;;92512:77::o:0;41713:104::-;41769:13;41802:7;41795:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41713:104;:::o;95105:153::-;95195:4;95215:37;95234:5;95241:4;95247;95215:18;:37::i;:::-;95208:44;;95105:153;;;;;:::o;76100:2513::-;76243:16;76310:4;76301:5;:13;76297:45;;76323:19;;;;;;;;;;;;;;76297:45;76357:19;76391:17;76411:14;:12;:14::i;:::-;76391:34;;76511:15;:13;:15::i;:::-;76503:5;:23;76499:87;;;76555:15;:13;:15::i;:::-;76547:23;;76499:87;76662:9;76655:4;:16;76651:73;;;76699:9;76692:16;;76651:73;76738:25;76766:16;76776:5;76766:9;:16::i;:::-;76738:44;;76960:4;76952:5;:12;76948:278;;;76985:19;77014:5;77007:4;:12;76985:34;;77056:17;77042:11;:31;77038:111;;;77118:11;77098:31;;77038:111;76966:198;76948:278;;;77209:1;77189:21;;76948:278;77240:25;77282:17;77268:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77240:60;;77340:1;77319:17;:22;77315:78;;77369:8;77362:15;;;;;;;;77315:78;77537:31;77571:26;77591:5;77571:19;:26::i;:::-;77537:60;;77612:25;77857:9;:16;;;77852:92;;77914:9;:14;;;77894:34;;77852:92;77963:9;77975:5;77963:17;;77958:478;77987:4;77982:1;:9;;:45;;;;;78010:17;77995:11;:32;;77982:45;77958:478;;;78065:15;78078:1;78065:12;:15::i;:::-;78053:27;;78103:9;:16;;;78144:8;78099:73;78220:1;78194:28;;:9;:14;;;:28;;;78190:111;;78267:9;:14;;;78247:34;;78190:111;78344:5;78323:26;;:17;:26;;;78319:102;;78400:1;78374:8;78383:13;;;;;;78374:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;78319:102;77958:478;78029:3;;;;;77958:478;;;;78538:11;78528:8;78521:29;78586:8;78579:15;;;;;;;;76100:2513;;;;;;:::o;91053:28::-;;;;:::o;90973:32::-;;;;:::o;93227:633::-;93288:12;;;;;;;;;;;93280:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;93387:9;;93373:11;;93364:6;;:20;;;;:::i;:::-;:32;;;;:::i;:::-;93353:5;93337:13;:11;:13::i;:::-;:21;;;;:::i;:::-;93336:61;;93327:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;93482:11;;93474:5;:19;;;;:::i;:::-;93461:9;:32;;93453:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;93560:6;;93550:5;93534:13;:11;:13::i;:::-;:21;;;;:::i;:::-;93533:33;;93524:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;93632:8;;93623:5;:17;;93613:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;93730:12;;93720:5;93692:13;:25;93706:10;93692:25;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;93691:51;;93681:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;93813:5;93784:13;:25;93798:10;93784:25;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;93825:28;93835:10;93847:5;93825:9;:28::i;:::-;93227:633;:::o;91531:87::-;11742:13;:11;:13::i;:::-;91607:4:::1;91597:7;:14;;;;;;:::i;:::-;;91531:87:::0;:::o;95372:207::-;95510:8;89202:30;89223:8;89202:20;:30::i;:::-;95530:43:::1;95554:8;95564;95530:23;:43::i;:::-;95372:207:::0;;;:::o;91010:38::-;;;;:::o;91318:34::-;;;;:::o;90790:48::-;;;;;;;;;;;;;;;;;:::o;96157:240::-;96328:4;88936:10;88928:18;;:4;:18;;;88924:83;;88963:32;88984:10;88963:20;:32::i;:::-;88924:83;96344:47:::1;96367:4;96373:2;96377:7;96386:4;96344:22;:47::i;:::-;96157:240:::0;;;;;:::o;74597:428::-;74681:21;;:::i;:::-;74715:31;;:::i;:::-;74771:15;:13;:15::i;:::-;74761:7;:25;:54;;;;74801:14;:12;:14::i;:::-;74790:7;:25;;74761:54;74757:103;;;74839:9;74832:16;;;;;74757:103;74882:21;74895:7;74882:12;:21::i;:::-;74870:33;;74918:9;:16;;;74914:65;;;74958:9;74951:16;;;;;74914:65;74996:21;75009:7;74996:12;:21::i;:::-;74989:28;;;74597:428;;;;:::o;91443:28::-;;;;:::o;41923:318::-;41996:13;42027:16;42035:7;42027;:16::i;:::-;42022:59;;42052:29;;;;;;;;;;;;;;42022:59;42094:21;42118:10;:8;:10::i;:::-;42094:34;;42171:1;42152:7;42146:21;:26;:87;;;;;;;;;;;;;;;;;42199:7;42208:18;42218:7;42208:9;:18::i;:::-;42182:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42146:87;42139:94;;;41923:318;;;:::o;92782:85::-;11742:13;:11;:13::i;:::-;92855:5:::1;92844:8;:16;;;;92782:85:::0;:::o;48977:164::-;49074:4;49098:18;:25;49117:5;49098:25;;;;;;;;;;;;;;;:35;49124:8;49098:35;;;;;;;;;;;;;;;;;;;;;;;;;49091:42;;48977:164;;;;:::o;90843:44::-;;;;;;;;;;;;;;;;;:::o;91191:27::-;;;;:::o;12755:201::-;11742:13;:11;:13::i;:::-;12864:1:::1;12844:22;;:8;:22;;::::0;12836:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;12920:28;12939:8;12920:18;:28::i;:::-;12755:201:::0;:::o;92416:88::-;11742:13;:11;:13::i;:::-;92485:12:::1;;;;;;;;;;;92484:13;92469:12;;:28;;;;;;;;;;;;;;;;;;92416:88::o:0;40635:639::-;40720:4;41059:10;41044:25;;:11;:25;;;;:102;;;;41136:10;41121:25;;:11;:25;;;;41044:102;:179;;;;41213:10;41198:25;;:11;:25;;;;41044:179;41024:199;;40635:639;;;:::o;17162:215::-;17264:4;17303:26;17288:41;;;:11;:41;;;;:81;;;;17333:36;17357:11;17333:23;:36::i;:::-;17288:81;17281:88;;17162:215;;;:::o;49399:282::-;49464:4;49520:7;49501:15;:13;:15::i;:::-;:26;;:66;;;;;49554:13;;49544:7;:23;49501:66;:153;;;;;49653:1;33407:8;49605:17;:26;49623:7;49605:26;;;;;;;;;;;;:44;:49;49501:153;49481:173;;49399:282;;;:::o;89345:647::-;89584:1;86316:42;89536:45;;;:49;89532:453;;;86316:42;89835;;;89886:4;89893:8;89835:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89830:144;;89949:8;89930:28;;;;;;;;;;;:::i;:::-;;;;;;;;89830:144;89532:453;89345:647;:::o;47461:408::-;47550:13;47566:16;47574:7;47566;:16::i;:::-;47550:32;;47622:5;47599:28;;:19;:17;:19::i;:::-;:28;;;47595:175;;47647:44;47664:5;47671:19;:17;:19::i;:::-;47647:16;:44::i;:::-;47642:128;;47719:35;;;;;;;;;;;;;;47642:128;47595:175;47815:2;47782:15;:24;47798:7;47782:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47853:7;47849:2;47833:28;;47842:5;47833:28;;;;;;;;;;;;47539:330;47461:408;;:::o;12021:132::-;12096:12;:10;:12::i;:::-;12085:23;;:7;:5;:7::i;:::-;:23;;;12077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12021:132::o;36804:92::-;36860:7;36804:92;:::o;51667:2825::-;51809:27;51839;51858:7;51839:18;:27::i;:::-;51809:57;;51924:4;51883:45;;51899:19;51883:45;;;51879:86;;51937:28;;;;;;;;;;;;;;51879:86;51979:27;52008:23;52035:35;52062:7;52035:26;:35::i;:::-;51978:92;;;;52170:68;52195:15;52212:4;52218:19;:17;:19::i;:::-;52170:24;:68::i;:::-;52165:180;;52258:43;52275:4;52281:19;:17;:19::i;:::-;52258:16;:43::i;:::-;52253:92;;52310:35;;;;;;;;;;;;;;52253:92;52165:180;52376:1;52362:16;;:2;:16;;;52358:52;;52387:23;;;;;;;;;;;;;;52358:52;52423:43;52445:4;52451:2;52455:7;52464:1;52423:21;:43::i;:::-;52559:15;52556:160;;;52699:1;52678:19;52671:30;52556:160;53096:18;:24;53115:4;53096:24;;;;;;;;;;;;;;;;53094:26;;;;;;;;;;;;53165:18;:22;53184:2;53165:22;;;;;;;;;;;;;;;;53163:24;;;;;;;;;;;53487:146;53524:2;53573:45;53588:4;53594:2;53598:19;53573:14;:45::i;:::-;33687:8;53545:73;53487:18;:146::i;:::-;53458:17;:26;53476:7;53458:26;;;;;;;;;;;:175;;;;53804:1;33687:8;53753:19;:47;:52;53749:627;;53826:19;53858:1;53848:7;:11;53826:33;;54015:1;53981:17;:30;53999:11;53981:30;;;;;;;;;;;;:35;53977:384;;54119:13;;54104:11;:28;54100:242;;54299:19;54266:17;:30;54284:11;54266:30;;;;;;;;;;;:52;;;;54100:242;53977:384;53807:569;53749:627;54423:7;54419:2;54404:27;;54413:4;54404:27;;;;;;;;;;;;54442:42;54463:4;54469:2;54473:7;54482:1;54442:20;:42::i;:::-;51798:2694;;;51667:2825;;;:::o;18152:97::-;18210:6;18236:5;18229:12;;18152:97;:::o;65539:112::-;65616:27;65626:2;65630:8;65616:27;;;;;;;;;;;;:9;:27::i;:::-;65539:112;;:::o;54588:193::-;54734:39;54751:4;54757:2;54761:7;54734:39;;;;;;;;;;;;:16;:39::i;:::-;54588:193;;;:::o;44085:1275::-;44152:7;44172:12;44187:7;44172:22;;44255:4;44236:15;:13;:15::i;:::-;:23;44232:1061;;44289:13;;44282:4;:20;44278:1015;;;44327:14;44344:17;:23;44362:4;44344:23;;;;;;;;;;;;44327:40;;44461:1;33407:8;44433:6;:24;:29;44429:845;;45098:113;45115:1;45105:6;:11;45098:113;;45158:17;:25;45176:6;;;;;;;45158:25;;;;;;;;;;;;45149:34;;45098:113;;;45244:6;45237:13;;;;;;44429:845;44304:989;44278:1015;44232:1061;45321:31;;;;;;;;;;;;;;44085:1275;;;;:::o;13116:191::-;13190:16;13209:6;;;;;;;;;;;13190:25;;13235:8;13226:6;;:17;;;;;;;;;;;;;;;;;;13290:8;13259:40;;13280:8;13259:40;;;;;;;;;;;;13179:128;13116:191;:::o;43533:161::-;43601:21;;:::i;:::-;43642:44;43661:17;:24;43679:5;43661:24;;;;;;;;;;;;43642:18;:44::i;:::-;43635:51;;43533:161;;;:::o;1228:156::-;1319:4;1372;1343:25;1356:5;1363:4;1343:12;:25::i;:::-;:33;1336:40;;1228:156;;;;;:::o;36975:103::-;37030:7;37057:13;;37050:20;;36975:103;:::o;48586:234::-;48733:8;48681:18;:39;48700:19;:17;:19::i;:::-;48681:39;;;;;;;;;;;;;;;:49;48721:8;48681:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;48793:8;48757:55;;48772:19;:17;:19::i;:::-;48757:55;;;48803:8;48757:55;;;;;;:::i;:::-;;;;;;;;48586:234;;:::o;55379:407::-;55554:31;55567:4;55573:2;55577:7;55554:12;:31::i;:::-;55618:1;55600:2;:14;;;:19;55596:183;;55639:56;55670:4;55676:2;55680:7;55689:5;55639:30;:56::i;:::-;55634:145;;55723:40;;;;;;;;;;;;;;55634:145;55596:183;55379:407;;;;:::o;43271:166::-;43341:21;;:::i;:::-;43382:47;43401:27;43420:7;43401:18;:27::i;:::-;43382:18;:47::i;:::-;43375:54;;43271:166;;;:::o;95264:102::-;95324:13;95353:7;95346:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95264:102;:::o;71914:1745::-;71979:17;72413:4;72406;72400:11;72396:22;72505:1;72499:4;72492:15;72580:4;72577:1;72573:12;72566:19;;72662:1;72657:3;72650:14;72766:3;73005:5;72987:428;73013:1;72987:428;;;73053:1;73048:3;73044:11;73037:18;;73224:2;73218:4;73214:13;73210:2;73206:22;73201:3;73193:36;73318:2;73312:4;73308:13;73300:21;;73385:4;72987:428;73375:25;72987:428;72991:21;73454:3;73449;73445:13;73569:4;73564:3;73560:14;73553:21;;73634:6;73629:3;73622:19;72018:1634;;;71914:1745;;;:::o;15784:157::-;15869:4;15908:25;15893:40;;;:11;:40;;;;15886:47;;15784:157;;;:::o;71707:105::-;71767:7;71794:10;71787:17;;71707:105;:::o;10565:98::-;10618:7;10645:10;10638:17;;10565:98;:::o;50562:485::-;50664:27;50693:23;50734:38;50775:15;:24;50791:7;50775:24;;;;;;;;;;;50734:65;;50952:18;50929:41;;51009:19;51003:26;50984:45;;50914:126;50562:485;;;:::o;49790:659::-;49939:11;50104:16;50097:5;50093:28;50084:37;;50264:16;50253:9;50249:32;50236:45;;50414:15;50403:9;50400:30;50392:5;50381:9;50378:20;50375:56;50365:66;;49790:659;;;;;:::o;56448:159::-;;;;;:::o;71016:311::-;71151:7;71171:16;33811:3;71197:19;:41;;71171:68;;33811:3;71265:31;71276:4;71282:2;71286:9;71265:10;:31::i;:::-;71257:40;;:62;;71250:69;;;71016:311;;;;;:::o;45908:450::-;45988:14;46156:16;46149:5;46145:28;46136:37;;46333:5;46319:11;46294:23;46290:41;46287:52;46280:5;46277:63;46267:73;;45908:450;;;;:::o;57272:158::-;;;;;:::o;64766:689::-;64897:19;64903:2;64907:8;64897:5;:19::i;:::-;64976:1;64958:2;:14;;;:19;64954:483;;64998:11;65012:13;;64998:27;;65044:13;65066:8;65060:3;:14;65044:30;;65093:233;65124:62;65163:1;65167:2;65171:7;;;;;;65180:5;65124:30;:62::i;:::-;65119:167;;65222:40;;;;;;;;;;;;;;65119:167;65321:3;65313:5;:11;65093:233;;65408:3;65391:13;;:20;65387:34;;65413:8;;;65387:34;64979:458;;64954:483;64766:689;;;:::o;45459:366::-;45525:31;;:::i;:::-;45602:6;45569:9;:14;;:41;;;;;;;;;;;33290:3;45655:6;:33;;45621:9;:24;;:68;;;;;;;;;;;45747:1;33407:8;45719:6;:24;:29;;45700:9;:16;;:48;;;;;;;;;;;33811:3;45788:6;:28;;45759:9;:19;;:58;;;;;;;;;;;45459:366;;;:::o;2027:296::-;2110:7;2130:20;2153:4;2130:27;;2173:9;2168:118;2192:5;:12;2188:1;:16;2168:118;;;2241:33;2251:12;2265:5;2271:1;2265:8;;;;;;;;:::i;:::-;;;;;;;;2241:9;:33::i;:::-;2226:48;;2206:3;;;;;:::i;:::-;;;;2168:118;;;;2303:12;2296:19;;;2027:296;;;;:::o;57870:716::-;58033:4;58079:2;58054:45;;;58100:19;:17;:19::i;:::-;58121:4;58127:7;58136:5;58054:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58050:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58354:1;58337:6;:13;:18;58333:235;;58383:40;;;;;;;;;;;;;;58333:235;58526:6;58520:13;58511:6;58507:2;58503:15;58496:38;58050:529;58223:54;;;58213:64;;;:6;:64;;;;58206:71;;;57870:716;;;;;;:::o;70717:147::-;70854:6;70717:147;;;;;:::o;59048:2966::-;59121:20;59144:13;;59121:36;;59184:1;59172:8;:13;59168:44;;59194:18;;;;;;;;;;;;;;59168:44;59225:61;59255:1;59259:2;59263:12;59277:8;59225:21;:61::i;:::-;59769:1;32769:2;59739:1;:26;;59738:32;59726:8;:45;59700:18;:22;59719:2;59700:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;60048:139;60085:2;60139:33;60162:1;60166:2;60170:1;60139:14;:33::i;:::-;60106:30;60127:8;60106:20;:30::i;:::-;:66;60048:18;:139::i;:::-;60014:17;:31;60032:12;60014:31;;;;;;;;;;;:173;;;;60204:16;60235:11;60264:8;60249:12;:23;60235:37;;60785:16;60781:2;60777:25;60765:37;;61157:12;61117:8;61076:1;61014:25;60955:1;60894;60867:335;61528:1;61514:12;61510:20;61468:346;61569:3;61560:7;61557:16;61468:346;;61787:7;61777:8;61774:1;61747:25;61744:1;61741;61736:59;61622:1;61613:7;61609:15;61598:26;;61468:346;;;61472:77;61859:1;61847:8;:13;61843:45;;61869:19;;;;;;;;;;;;;;61843:45;61921:3;61905:13;:19;;;;59474:2462;;61946:60;61975:1;61979:2;61983:12;61997:8;61946:20;:60::i;:::-;59110:2904;59048:2966;;:::o;9465:149::-;9528:7;9559:1;9555;:5;:51;;9586:20;9601:1;9604;9586:14;:20::i;:::-;9555:51;;;9563:20;9578:1;9581;9563:14;:20::i;:::-;9555:51;9548:58;;9465:149;;;;:::o;46460:324::-;46530:14;46763:1;46753:8;46750:15;46724:24;46720:46;46710:56;;46460:324;;;:::o;9622:268::-;9690:13;9797:1;9791:4;9784:15;9826:1;9820:4;9813:15;9867:4;9861;9851:21;9842:30;;9622:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:60::-;6713:3;6734:5;6727:12;;6685:60;;;:::o;6751:142::-;6801:9;6834:53;6852:34;6861:24;6879:5;6861:24;:::i;:::-;6852:34;:::i;:::-;6834:53;:::i;:::-;6821:66;;6751:142;;;:::o;6899:126::-;6949:9;6982:37;7013:5;6982:37;:::i;:::-;6969:50;;6899:126;;;:::o;7031:158::-;7113:9;7146:37;7177:5;7146:37;:::i;:::-;7133:50;;7031:158;;;:::o;7195:195::-;7314:69;7377:5;7314:69;:::i;:::-;7309:3;7302:82;7195:195;;:::o;7396:286::-;7521:4;7559:2;7548:9;7544:18;7536:26;;7572:103;7672:1;7661:9;7657:17;7648:6;7572:103;:::i;:::-;7396:286;;;;:::o;7688:329::-;7747:6;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7922:1;7947:53;7992:7;7983:6;7972:9;7968:22;7947:53;:::i;:::-;7937:63;;7893:117;7688:329;;;;:::o;8023:77::-;8060:7;8089:5;8078:16;;8023:77;;;:::o;8106:118::-;8193:24;8211:5;8193:24;:::i;:::-;8188:3;8181:37;8106:118;;:::o;8230:222::-;8323:4;8361:2;8350:9;8346:18;8338:26;;8374:71;8442:1;8431:9;8427:17;8418:6;8374:71;:::i;:::-;8230:222;;;;:::o;8458:117::-;8567:1;8564;8557:12;8581:117;8690:1;8687;8680:12;8704:117;8813:1;8810;8803:12;8844:568;8917:8;8927:6;8977:3;8970:4;8962:6;8958:17;8954:27;8944:122;;8985:79;;:::i;:::-;8944:122;9098:6;9085:20;9075:30;;9128:18;9120:6;9117:30;9114:117;;;9150:79;;:::i;:::-;9114:117;9264:4;9256:6;9252:17;9240:29;;9318:3;9310:4;9302:6;9298:17;9288:8;9284:32;9281:41;9278:128;;;9325:79;;:::i;:::-;9278:128;8844:568;;;;;:::o;9418:559::-;9504:6;9512;9561:2;9549:9;9540:7;9536:23;9532:32;9529:119;;;9567:79;;:::i;:::-;9529:119;9715:1;9704:9;9700:17;9687:31;9745:18;9737:6;9734:30;9731:117;;;9767:79;;:::i;:::-;9731:117;9880:80;9952:7;9943:6;9932:9;9928:22;9880:80;:::i;:::-;9862:98;;;;9658:312;9418:559;;;;;:::o;9983:145::-;10081:6;10115:5;10109:12;10099:22;;9983:145;;;:::o;10134:215::-;10264:11;10298:6;10293:3;10286:19;10338:4;10333:3;10329:14;10314:29;;10134:215;;;;:::o;10355:163::-;10453:4;10476:3;10468:11;;10506:4;10501:3;10497:14;10489:22;;10355:163;;;:::o;10524:108::-;10601:24;10619:5;10601:24;:::i;:::-;10596:3;10589:37;10524:108;;:::o;10638:101::-;10674:7;10714:18;10707:5;10703:30;10692:41;;10638:101;;;:::o;10745:105::-;10820:23;10837:5;10820:23;:::i;:::-;10815:3;10808:36;10745:105;;:::o;10856:99::-;10927:21;10942:5;10927:21;:::i;:::-;10922:3;10915:34;10856:99;;:::o;10961:91::-;10997:7;11037:8;11030:5;11026:20;11015:31;;10961:91;;;:::o;11058:105::-;11133:23;11150:5;11133:23;:::i;:::-;11128:3;11121:36;11058:105;;:::o;11241:864::-;11390:4;11385:3;11381:14;11477:4;11470:5;11466:16;11460:23;11496:63;11553:4;11548:3;11544:14;11530:12;11496:63;:::i;:::-;11405:164;11661:4;11654:5;11650:16;11644:23;11680:61;11735:4;11730:3;11726:14;11712:12;11680:61;:::i;:::-;11579:172;11835:4;11828:5;11824:16;11818:23;11854:57;11905:4;11900:3;11896:14;11882:12;11854:57;:::i;:::-;11761:160;12008:4;12001:5;11997:16;11991:23;12027:61;12082:4;12077:3;12073:14;12059:12;12027:61;:::i;:::-;11931:167;11359:746;11241:864;;:::o;12111:303::-;12242:10;12263:108;12367:3;12359:6;12263:108;:::i;:::-;12403:4;12398:3;12394:14;12380:28;;12111:303;;;;:::o;12420:144::-;12521:4;12553;12548:3;12544:14;12536:22;;12420:144;;;:::o;12646:980::-;12827:3;12856:85;12935:5;12856:85;:::i;:::-;12957:117;13067:6;13062:3;12957:117;:::i;:::-;12950:124;;13098:87;13179:5;13098:87;:::i;:::-;13208:7;13239:1;13224:377;13249:6;13246:1;13243:13;13224:377;;;13325:6;13319:13;13352:125;13473:3;13458:13;13352:125;:::i;:::-;13345:132;;13500:91;13584:6;13500:91;:::i;:::-;13490:101;;13284:317;13271:1;13268;13264:9;13259:14;;13224:377;;;13228:14;13617:3;13610:10;;12832:794;;;12646:980;;;;:::o;13632:497::-;13837:4;13875:2;13864:9;13860:18;13852:26;;13924:9;13918:4;13914:20;13910:1;13899:9;13895:17;13888:47;13952:170;14117:4;14108:6;13952:170;:::i;:::-;13944:178;;13632:497;;;;:::o;14135:180::-;14183:77;14180:1;14173:88;14280:4;14277:1;14270:15;14304:4;14301:1;14294:15;14321:281;14404:27;14426:4;14404:27;:::i;:::-;14396:6;14392:40;14534:6;14522:10;14519:22;14498:18;14486:10;14483:34;14480:62;14477:88;;;14545:18;;:::i;:::-;14477:88;14585:10;14581:2;14574:22;14364:238;14321:281;;:::o;14608:129::-;14642:6;14669:20;;:::i;:::-;14659:30;;14698:33;14726:4;14718:6;14698:33;:::i;:::-;14608:129;;;:::o;14743:311::-;14820:4;14910:18;14902:6;14899:30;14896:56;;;14932:18;;:::i;:::-;14896:56;14982:4;14974:6;14970:17;14962:25;;15042:4;15036;15032:15;15024:23;;14743:311;;;:::o;15060:122::-;15133:24;15151:5;15133:24;:::i;:::-;15126:5;15123:35;15113:63;;15172:1;15169;15162:12;15113:63;15060:122;:::o;15188:139::-;15234:5;15272:6;15259:20;15250:29;;15288:33;15315:5;15288:33;:::i;:::-;15188:139;;;;:::o;15350:710::-;15446:5;15471:81;15487:64;15544:6;15487:64;:::i;:::-;15471:81;:::i;:::-;15462:90;;15572:5;15601:6;15594:5;15587:21;15635:4;15628:5;15624:16;15617:23;;15688:4;15680:6;15676:17;15668:6;15664:30;15717:3;15709:6;15706:15;15703:122;;;15736:79;;:::i;:::-;15703:122;15851:6;15834:220;15868:6;15863:3;15860:15;15834:220;;;15943:3;15972:37;16005:3;15993:10;15972:37;:::i;:::-;15967:3;15960:50;16039:4;16034:3;16030:14;16023:21;;15910:144;15894:4;15889:3;15885:14;15878:21;;15834:220;;;15838:21;15452:608;;15350:710;;;;;:::o;16083:370::-;16154:5;16203:3;16196:4;16188:6;16184:17;16180:27;16170:122;;16211:79;;:::i;:::-;16170:122;16328:6;16315:20;16353:94;16443:3;16435:6;16428:4;16420:6;16416:17;16353:94;:::i;:::-;16344:103;;16160:293;16083:370;;;;:::o;16459:684::-;16552:6;16560;16609:2;16597:9;16588:7;16584:23;16580:32;16577:119;;;16615:79;;:::i;:::-;16577:119;16735:1;16760:53;16805:7;16796:6;16785:9;16781:22;16760:53;:::i;:::-;16750:63;;16706:117;16890:2;16879:9;16875:18;16862:32;16921:18;16913:6;16910:30;16907:117;;;16943:79;;:::i;:::-;16907:117;17048:78;17118:7;17109:6;17098:9;17094:22;17048:78;:::i;:::-;17038:88;;16833:303;16459:684;;;;;:::o;17149:329::-;17208:6;17257:2;17245:9;17236:7;17232:23;17228:32;17225:119;;;17263:79;;:::i;:::-;17225:119;17383:1;17408:53;17453:7;17444:6;17433:9;17429:22;17408:53;:::i;:::-;17398:63;;17354:117;17149:329;;;;:::o;17484:114::-;17551:6;17585:5;17579:12;17569:22;;17484:114;;;:::o;17604:184::-;17703:11;17737:6;17732:3;17725:19;17777:4;17772:3;17768:14;17753:29;;17604:184;;;;:::o;17794:132::-;17861:4;17884:3;17876:11;;17914:4;17909:3;17905:14;17897:22;;17794:132;;;:::o;17932:108::-;18009:24;18027:5;18009:24;:::i;:::-;18004:3;17997:37;17932:108;;:::o;18046:179::-;18115:10;18136:46;18178:3;18170:6;18136:46;:::i;:::-;18214:4;18209:3;18205:14;18191:28;;18046:179;;;;:::o;18231:113::-;18301:4;18333;18328:3;18324:14;18316:22;;18231:113;;;:::o;18380:732::-;18499:3;18528:54;18576:5;18528:54;:::i;:::-;18598:86;18677:6;18672:3;18598:86;:::i;:::-;18591:93;;18708:56;18758:5;18708:56;:::i;:::-;18787:7;18818:1;18803:284;18828:6;18825:1;18822:13;18803:284;;;18904:6;18898:13;18931:63;18990:3;18975:13;18931:63;:::i;:::-;18924:70;;19017:60;19070:6;19017:60;:::i;:::-;19007:70;;18863:224;18850:1;18847;18843:9;18838:14;;18803:284;;;18807:14;19103:3;19096:10;;18504:608;;;18380:732;;;;:::o;19118:373::-;19261:4;19299:2;19288:9;19284:18;19276:26;;19348:9;19342:4;19338:20;19334:1;19323:9;19319:17;19312:47;19376:108;19479:4;19470:6;19376:108;:::i;:::-;19368:116;;19118:373;;;;:::o;19497:829::-;19599:6;19607;19615;19664:2;19652:9;19643:7;19639:23;19635:32;19632:119;;;19670:79;;:::i;:::-;19632:119;19790:1;19815:53;19860:7;19851:6;19840:9;19836:22;19815:53;:::i;:::-;19805:63;;19761:117;19917:2;19943:53;19988:7;19979:6;19968:9;19964:22;19943:53;:::i;:::-;19933:63;;19888:118;20073:2;20062:9;20058:18;20045:32;20104:18;20096:6;20093:30;20090:117;;;20126:79;;:::i;:::-;20090:117;20231:78;20301:7;20292:6;20281:9;20277:22;20231:78;:::i;:::-;20221:88;;20016:303;19497:829;;;;;:::o;20332:619::-;20409:6;20417;20425;20474:2;20462:9;20453:7;20449:23;20445:32;20442:119;;;20480:79;;:::i;:::-;20442:119;20600:1;20625:53;20670:7;20661:6;20650:9;20646:22;20625:53;:::i;:::-;20615:63;;20571:117;20727:2;20753:53;20798:7;20789:6;20778:9;20774:22;20753:53;:::i;:::-;20743:63;;20698:118;20855:2;20881:53;20926:7;20917:6;20906:9;20902:22;20881:53;:::i;:::-;20871:63;;20826:118;20332:619;;;;;:::o;20957:117::-;21066:1;21063;21056:12;21080:308;21142:4;21232:18;21224:6;21221:30;21218:56;;;21254:18;;:::i;:::-;21218:56;21292:29;21314:6;21292:29;:::i;:::-;21284:37;;21376:4;21370;21366:15;21358:23;;21080:308;;;:::o;21394:146::-;21491:6;21486:3;21481;21468:30;21532:1;21523:6;21518:3;21514:16;21507:27;21394:146;;;:::o;21546:425::-;21624:5;21649:66;21665:49;21707:6;21665:49;:::i;:::-;21649:66;:::i;:::-;21640:75;;21738:6;21731:5;21724:21;21776:4;21769:5;21765:16;21814:3;21805:6;21800:3;21796:16;21793:25;21790:112;;;21821:79;;:::i;:::-;21790:112;21911:54;21958:6;21953:3;21948;21911:54;:::i;:::-;21630:341;21546:425;;;;;:::o;21991:340::-;22047:5;22096:3;22089:4;22081:6;22077:17;22073:27;22063:122;;22104:79;;:::i;:::-;22063:122;22221:6;22208:20;22246:79;22321:3;22313:6;22306:4;22298:6;22294:17;22246:79;:::i;:::-;22237:88;;22053:278;21991:340;;;;:::o;22337:509::-;22406:6;22455:2;22443:9;22434:7;22430:23;22426:32;22423:119;;;22461:79;;:::i;:::-;22423:119;22609:1;22598:9;22594:17;22581:31;22639:18;22631:6;22628:30;22625:117;;;22661:79;;:::i;:::-;22625:117;22766:63;22821:7;22812:6;22801:9;22797:22;22766:63;:::i;:::-;22756:73;;22552:287;22337:509;;;;:::o;22852:116::-;22922:21;22937:5;22922:21;:::i;:::-;22915:5;22912:32;22902:60;;22958:1;22955;22948:12;22902:60;22852:116;:::o;22974:133::-;23017:5;23055:6;23042:20;23033:29;;23071:30;23095:5;23071:30;:::i;:::-;22974:133;;;;:::o;23113:468::-;23178:6;23186;23235:2;23223:9;23214:7;23210:23;23206:32;23203:119;;;23241:79;;:::i;:::-;23203:119;23361:1;23386:53;23431:7;23422:6;23411:9;23407:22;23386:53;:::i;:::-;23376:63;;23332:117;23488:2;23514:50;23556:7;23547:6;23536:9;23532:22;23514:50;:::i;:::-;23504:60;;23459:115;23113:468;;;;;:::o;23587:307::-;23648:4;23738:18;23730:6;23727:30;23724:56;;;23760:18;;:::i;:::-;23724:56;23798:29;23820:6;23798:29;:::i;:::-;23790:37;;23882:4;23876;23872:15;23864:23;;23587:307;;;:::o;23900:423::-;23977:5;24002:65;24018:48;24059:6;24018:48;:::i;:::-;24002:65;:::i;:::-;23993:74;;24090:6;24083:5;24076:21;24128:4;24121:5;24117:16;24166:3;24157:6;24152:3;24148:16;24145:25;24142:112;;;24173:79;;:::i;:::-;24142:112;24263:54;24310:6;24305:3;24300;24263:54;:::i;:::-;23983:340;23900:423;;;;;:::o;24342:338::-;24397:5;24446:3;24439:4;24431:6;24427:17;24423:27;24413:122;;24454:79;;:::i;:::-;24413:122;24571:6;24558:20;24596:78;24670:3;24662:6;24655:4;24647:6;24643:17;24596:78;:::i;:::-;24587:87;;24403:277;24342:338;;;;:::o;24686:943::-;24781:6;24789;24797;24805;24854:3;24842:9;24833:7;24829:23;24825:33;24822:120;;;24861:79;;:::i;:::-;24822:120;24981:1;25006:53;25051:7;25042:6;25031:9;25027:22;25006:53;:::i;:::-;24996:63;;24952:117;25108:2;25134:53;25179:7;25170:6;25159:9;25155:22;25134:53;:::i;:::-;25124:63;;25079:118;25236:2;25262:53;25307:7;25298:6;25287:9;25283:22;25262:53;:::i;:::-;25252:63;;25207:118;25392:2;25381:9;25377:18;25364:32;25423:18;25415:6;25412:30;25409:117;;;25445:79;;:::i;:::-;25409:117;25550:62;25604:7;25595:6;25584:9;25580:22;25550:62;:::i;:::-;25540:72;;25335:287;24686:943;;;;;;;:::o;25707:874::-;25866:4;25861:3;25857:14;25953:4;25946:5;25942:16;25936:23;25972:63;26029:4;26024:3;26020:14;26006:12;25972:63;:::i;:::-;25881:164;26137:4;26130:5;26126:16;26120:23;26156:61;26211:4;26206:3;26202:14;26188:12;26156:61;:::i;:::-;26055:172;26311:4;26304:5;26300:16;26294:23;26330:57;26381:4;26376:3;26372:14;26358:12;26330:57;:::i;:::-;26237:160;26484:4;26477:5;26473:16;26467:23;26503:61;26558:4;26553:3;26549:14;26535:12;26503:61;:::i;:::-;26407:167;25835:746;25707:874;;:::o;26587:347::-;26742:4;26780:3;26769:9;26765:19;26757:27;;26794:133;26924:1;26913:9;26909:17;26900:6;26794:133;:::i;:::-;26587:347;;;;:::o;26940:474::-;27008:6;27016;27065:2;27053:9;27044:7;27040:23;27036:32;27033:119;;;27071:79;;:::i;:::-;27033:119;27191:1;27216:53;27261:7;27252:6;27241:9;27237:22;27216:53;:::i;:::-;27206:63;;27162:117;27318:2;27344:53;27389:7;27380:6;27369:9;27365:22;27344:53;:::i;:::-;27334:63;;27289:118;26940:474;;;;;:::o;27420:180::-;27468:77;27465:1;27458:88;27565:4;27562:1;27555:15;27589:4;27586:1;27579:15;27606:320;27650:6;27687:1;27681:4;27677:12;27667:22;;27734:1;27728:4;27724:12;27755:18;27745:81;;27811:4;27803:6;27799:17;27789:27;;27745:81;27873:2;27865:6;27862:14;27842:18;27839:38;27836:84;;27892:18;;:::i;:::-;27836:84;27657:269;27606:320;;;:::o;27932:180::-;27980:77;27977:1;27970:88;28077:4;28074:1;28067:15;28101:4;28098:1;28091:15;28118:410;28158:7;28181:20;28199:1;28181:20;:::i;:::-;28176:25;;28215:20;28233:1;28215:20;:::i;:::-;28210:25;;28270:1;28267;28263:9;28292:30;28310:11;28292:30;:::i;:::-;28281:41;;28471:1;28462:7;28458:15;28455:1;28452:22;28432:1;28425:9;28405:83;28382:139;;28501:18;;:::i;:::-;28382:139;28166:362;28118:410;;;;:::o;28534:180::-;28582:77;28579:1;28572:88;28679:4;28676:1;28669:15;28703:4;28700:1;28693:15;28720:185;28760:1;28777:20;28795:1;28777:20;:::i;:::-;28772:25;;28811:20;28829:1;28811:20;:::i;:::-;28806:25;;28850:1;28840:35;;28855:18;;:::i;:::-;28840:35;28897:1;28894;28890:9;28885:14;;28720:185;;;;:::o;28911:191::-;28951:3;28970:20;28988:1;28970:20;:::i;:::-;28965:25;;29004:20;29022:1;29004:20;:::i;:::-;28999:25;;29047:1;29044;29040:9;29033:16;;29068:3;29065:1;29062:10;29059:36;;;29075:18;;:::i;:::-;29059:36;28911:191;;;;:::o;29108:164::-;29248:16;29244:1;29236:6;29232:14;29225:40;29108:164;:::o;29278:366::-;29420:3;29441:67;29505:2;29500:3;29441:67;:::i;:::-;29434:74;;29517:93;29606:3;29517:93;:::i;:::-;29635:2;29630:3;29626:12;29619:19;;29278:366;;;:::o;29650:419::-;29816:4;29854:2;29843:9;29839:18;29831:26;;29903:9;29897:4;29893:20;29889:1;29878:9;29874:17;29867:47;29931:131;30057:4;29931:131;:::i;:::-;29923:139;;29650:419;;;:::o;30075:172::-;30215:24;30211:1;30203:6;30199:14;30192:48;30075:172;:::o;30253:366::-;30395:3;30416:67;30480:2;30475:3;30416:67;:::i;:::-;30409:74;;30492:93;30581:3;30492:93;:::i;:::-;30610:2;30605:3;30601:12;30594:19;;30253:366;;;:::o;30625:419::-;30791:4;30829:2;30818:9;30814:18;30806:26;;30878:9;30872:4;30868:20;30864:1;30853:9;30849:17;30842:47;30906:131;31032:4;30906:131;:::i;:::-;30898:139;;30625:419;;;:::o;31050:194::-;31090:4;31110:20;31128:1;31110:20;:::i;:::-;31105:25;;31144:20;31162:1;31144:20;:::i;:::-;31139:25;;31188:1;31185;31181:9;31173:17;;31212:1;31206:4;31203:11;31200:37;;;31217:18;;:::i;:::-;31200:37;31050:194;;;;:::o;31250:147::-;31351:11;31388:3;31373:18;;31250:147;;;;:::o;31403:114::-;;:::o;31523:398::-;31682:3;31703:83;31784:1;31779:3;31703:83;:::i;:::-;31696:90;;31795:93;31884:3;31795:93;:::i;:::-;31913:1;31908:3;31904:11;31897:18;;31523:398;;;:::o;31927:379::-;32111:3;32133:147;32276:3;32133:147;:::i;:::-;32126:154;;32297:3;32290:10;;31927:379;;;:::o;32312:166::-;32452:18;32448:1;32440:6;32436:14;32429:42;32312:166;:::o;32484:366::-;32626:3;32647:67;32711:2;32706:3;32647:67;:::i;:::-;32640:74;;32723:93;32812:3;32723:93;:::i;:::-;32841:2;32836:3;32832:12;32825:19;;32484:366;;;:::o;32856:419::-;33022:4;33060:2;33049:9;33045:18;33037:26;;33109:9;33103:4;33099:20;33095:1;33084:9;33080:17;33073:47;33137:131;33263:4;33137:131;:::i;:::-;33129:139;;32856:419;;;:::o;33281:94::-;33314:8;33362:5;33358:2;33354:14;33333:35;;33281:94;;;:::o;33381:::-;33420:7;33449:20;33463:5;33449:20;:::i;:::-;33438:31;;33381:94;;;:::o;33481:100::-;33520:7;33549:26;33569:5;33549:26;:::i;:::-;33538:37;;33481:100;;;:::o;33587:157::-;33692:45;33712:24;33730:5;33712:24;:::i;:::-;33692:45;:::i;:::-;33687:3;33680:58;33587:157;;:::o;33750:256::-;33862:3;33877:75;33948:3;33939:6;33877:75;:::i;:::-;33977:2;33972:3;33968:12;33961:19;;33997:3;33990:10;;33750:256;;;;:::o;34012:180::-;34060:77;34057:1;34050:88;34157:4;34154:1;34147:15;34181:4;34178:1;34171:15;34198:230;34338:34;34334:1;34326:6;34322:14;34315:58;34407:13;34402:2;34394:6;34390:15;34383:38;34198:230;:::o;34434:366::-;34576:3;34597:67;34661:2;34656:3;34597:67;:::i;:::-;34590:74;;34673:93;34762:3;34673:93;:::i;:::-;34791:2;34786:3;34782:12;34775:19;;34434:366;;;:::o;34806:419::-;34972:4;35010:2;34999:9;34995:18;34987:26;;35059:9;35053:4;35049:20;35045:1;35034:9;35030:17;35023:47;35087:131;35213:4;35087:131;:::i;:::-;35079:139;;34806:419;;;:::o;35231:168::-;35371:20;35367:1;35359:6;35355:14;35348:44;35231:168;:::o;35405:366::-;35547:3;35568:67;35632:2;35627:3;35568:67;:::i;:::-;35561:74;;35644:93;35733:3;35644:93;:::i;:::-;35762:2;35757:3;35753:12;35746:19;;35405:366;;;:::o;35777:419::-;35943:4;35981:2;35970:9;35966:18;35958:26;;36030:9;36024:4;36020:20;36016:1;36005:9;36001:17;35994:47;36058:131;36184:4;36058:131;:::i;:::-;36050:139;;35777:419;;;:::o;36202:165::-;36342:17;36338:1;36330:6;36326:14;36319:41;36202:165;:::o;36373:366::-;36515:3;36536:67;36600:2;36595:3;36536:67;:::i;:::-;36529:74;;36612:93;36701:3;36612:93;:::i;:::-;36730:2;36725:3;36721:12;36714:19;;36373:366;;;:::o;36745:419::-;36911:4;36949:2;36938:9;36934:18;36926:26;;36998:9;36992:4;36988:20;36984:1;36973:9;36969:17;36962:47;37026:131;37152:4;37026:131;:::i;:::-;37018:139;;36745:419;;;:::o;37170:225::-;37310:34;37306:1;37298:6;37294:14;37287:58;37379:8;37374:2;37366:6;37362:15;37355:33;37170:225;:::o;37401:366::-;37543:3;37564:67;37628:2;37623:3;37564:67;:::i;:::-;37557:74;;37640:93;37729:3;37640:93;:::i;:::-;37758:2;37753:3;37749:12;37742:19;;37401:366;;;:::o;37773:419::-;37939:4;37977:2;37966:9;37962:18;37954:26;;38026:9;38020:4;38016:20;38012:1;38001:9;37997:17;37990:47;38054:131;38180:4;38054:131;:::i;:::-;38046:139;;37773:419;;;:::o;38198:171::-;38338:23;38334:1;38326:6;38322:14;38315:47;38198:171;:::o;38375:366::-;38517:3;38538:67;38602:2;38597:3;38538:67;:::i;:::-;38531:74;;38614:93;38703:3;38614:93;:::i;:::-;38732:2;38727:3;38723:12;38716:19;;38375:366;;;:::o;38747:419::-;38913:4;38951:2;38940:9;38936:18;38928:26;;39000:9;38994:4;38990:20;38986:1;38975:9;38971:17;38964:47;39028:131;39154:4;39028:131;:::i;:::-;39020:139;;38747:419;;;:::o;39172:164::-;39312:16;39308:1;39300:6;39296:14;39289:40;39172:164;:::o;39342:366::-;39484:3;39505:67;39569:2;39564:3;39505:67;:::i;:::-;39498:74;;39581:93;39670:3;39581:93;:::i;:::-;39699:2;39694:3;39690:12;39683:19;;39342:366;;;:::o;39714:419::-;39880:4;39918:2;39907:9;39903:18;39895:26;;39967:9;39961:4;39957:20;39953:1;39942:9;39938:17;39931:47;39995:131;40121:4;39995:131;:::i;:::-;39987:139;;39714:419;;;:::o;40139:165::-;40279:17;40275:1;40267:6;40263:14;40256:41;40139:165;:::o;40310:366::-;40452:3;40473:67;40537:2;40532:3;40473:67;:::i;:::-;40466:74;;40549:93;40638:3;40549:93;:::i;:::-;40667:2;40662:3;40658:12;40651:19;;40310:366;;;:::o;40682:419::-;40848:4;40886:2;40875:9;40871:18;40863:26;;40935:9;40929:4;40925:20;40921:1;40910:9;40906:17;40899:47;40963:131;41089:4;40963:131;:::i;:::-;40955:139;;40682:419;;;:::o;41107:169::-;41247:21;41243:1;41235:6;41231:14;41224:45;41107:169;:::o;41282:366::-;41424:3;41445:67;41509:2;41504:3;41445:67;:::i;:::-;41438:74;;41521:93;41610:3;41521:93;:::i;:::-;41639:2;41634:3;41630:12;41623:19;;41282:366;;;:::o;41654:419::-;41820:4;41858:2;41847:9;41843:18;41835:26;;41907:9;41901:4;41897:20;41893:1;41882:9;41878:17;41871:47;41935:131;42061:4;41935:131;:::i;:::-;41927:139;;41654:419;;;:::o;42079:221::-;42219:34;42215:1;42207:6;42203:14;42196:58;42288:4;42283:2;42275:6;42271:15;42264:29;42079:221;:::o;42306:366::-;42448:3;42469:67;42533:2;42528:3;42469:67;:::i;:::-;42462:74;;42545:93;42634:3;42545:93;:::i;:::-;42663:2;42658:3;42654:12;42647:19;;42306:366;;;:::o;42678:419::-;42844:4;42882:2;42871:9;42867:18;42859:26;;42931:9;42925:4;42921:20;42917:1;42906:9;42902:17;42895:47;42959:131;43085:4;42959:131;:::i;:::-;42951:139;;42678:419;;;:::o;43103:178::-;43243:30;43239:1;43231:6;43227:14;43220:54;43103:178;:::o;43287:366::-;43429:3;43450:67;43514:2;43509:3;43450:67;:::i;:::-;43443:74;;43526:93;43615:3;43526:93;:::i;:::-;43644:2;43639:3;43635:12;43628:19;;43287:366;;;:::o;43659:419::-;43825:4;43863:2;43852:9;43848:18;43840:26;;43912:9;43906:4;43902:20;43898:1;43887:9;43883:17;43876:47;43940:131;44066:4;43940:131;:::i;:::-;43932:139;;43659:419;;;:::o;44084:173::-;44224:25;44220:1;44212:6;44208:14;44201:49;44084:173;:::o;44263:366::-;44405:3;44426:67;44490:2;44485:3;44426:67;:::i;:::-;44419:74;;44502:93;44591:3;44502:93;:::i;:::-;44620:2;44615:3;44611:12;44604:19;;44263:366;;;:::o;44635:419::-;44801:4;44839:2;44828:9;44824:18;44816:26;;44888:9;44882:4;44878:20;44874:1;44863:9;44859:17;44852:47;44916:131;45042:4;44916:131;:::i;:::-;44908:139;;44635:419;;;:::o;45060:141::-;45109:4;45132:3;45124:11;;45155:3;45152:1;45145:14;45189:4;45186:1;45176:18;45168:26;;45060:141;;;:::o;45207:93::-;45244:6;45291:2;45286;45279:5;45275:14;45271:23;45261:33;;45207:93;;;:::o;45306:107::-;45350:8;45400:5;45394:4;45390:16;45369:37;;45306:107;;;;:::o;45419:393::-;45488:6;45538:1;45526:10;45522:18;45561:97;45591:66;45580:9;45561:97;:::i;:::-;45679:39;45709:8;45698:9;45679:39;:::i;:::-;45667:51;;45751:4;45747:9;45740:5;45736:21;45727:30;;45800:4;45790:8;45786:19;45779:5;45776:30;45766:40;;45495:317;;45419:393;;;;;:::o;45818:142::-;45868:9;45901:53;45919:34;45928:24;45946:5;45928:24;:::i;:::-;45919:34;:::i;:::-;45901:53;:::i;:::-;45888:66;;45818:142;;;:::o;45966:75::-;46009:3;46030:5;46023:12;;45966:75;;;:::o;46047:269::-;46157:39;46188:7;46157:39;:::i;:::-;46218:91;46267:41;46291:16;46267:41;:::i;:::-;46259:6;46252:4;46246:11;46218:91;:::i;:::-;46212:4;46205:105;46123:193;46047:269;;;:::o;46322:73::-;46367:3;46322:73;:::o;46401:189::-;46478:32;;:::i;:::-;46519:65;46577:6;46569;46563:4;46519:65;:::i;:::-;46454:136;46401:189;;:::o;46596:186::-;46656:120;46673:3;46666:5;46663:14;46656:120;;;46727:39;46764:1;46757:5;46727:39;:::i;:::-;46700:1;46693:5;46689:13;46680:22;;46656:120;;;46596:186;;:::o;46788:543::-;46889:2;46884:3;46881:11;46878:446;;;46923:38;46955:5;46923:38;:::i;:::-;47007:29;47025:10;47007:29;:::i;:::-;46997:8;46993:44;47190:2;47178:10;47175:18;47172:49;;;47211:8;47196:23;;47172:49;47234:80;47290:22;47308:3;47290:22;:::i;:::-;47280:8;47276:37;47263:11;47234:80;:::i;:::-;46893:431;;46878:446;46788:543;;;:::o;47337:117::-;47391:8;47441:5;47435:4;47431:16;47410:37;;47337:117;;;;:::o;47460:169::-;47504:6;47537:51;47585:1;47581:6;47573:5;47570:1;47566:13;47537:51;:::i;:::-;47533:56;47618:4;47612;47608:15;47598:25;;47511:118;47460:169;;;;:::o;47634:295::-;47710:4;47856:29;47881:3;47875:4;47856:29;:::i;:::-;47848:37;;47918:3;47915:1;47911:11;47905:4;47902:21;47894:29;;47634:295;;;;:::o;47934:1395::-;48051:37;48084:3;48051:37;:::i;:::-;48153:18;48145:6;48142:30;48139:56;;;48175:18;;:::i;:::-;48139:56;48219:38;48251:4;48245:11;48219:38;:::i;:::-;48304:67;48364:6;48356;48350:4;48304:67;:::i;:::-;48398:1;48422:4;48409:17;;48454:2;48446:6;48443:14;48471:1;48466:618;;;;49128:1;49145:6;49142:77;;;49194:9;49189:3;49185:19;49179:26;49170:35;;49142:77;49245:67;49305:6;49298:5;49245:67;:::i;:::-;49239:4;49232:81;49101:222;48436:887;;48466:618;48518:4;48514:9;48506:6;48502:22;48552:37;48584:4;48552:37;:::i;:::-;48611:1;48625:208;48639:7;48636:1;48633:14;48625:208;;;48718:9;48713:3;48709:19;48703:26;48695:6;48688:42;48769:1;48761:6;48757:14;48747:24;;48816:2;48805:9;48801:18;48788:31;;48662:4;48659:1;48655:12;48650:17;;48625:208;;;48861:6;48852:7;48849:19;48846:179;;;48919:9;48914:3;48910:19;48904:26;48962:48;49004:4;48996:6;48992:17;48981:9;48962:48;:::i;:::-;48954:6;48947:64;48869:156;48846:179;49071:1;49067;49059:6;49055:14;49051:22;49045:4;49038:36;48473:611;;;48436:887;;48026:1303;;;47934:1395;;:::o;49335:148::-;49437:11;49474:3;49459:18;;49335:148;;;;:::o;49489:390::-;49595:3;49623:39;49656:5;49623:39;:::i;:::-;49678:89;49760:6;49755:3;49678:89;:::i;:::-;49671:96;;49776:65;49834:6;49829:3;49822:4;49815:5;49811:16;49776:65;:::i;:::-;49866:6;49861:3;49857:16;49850:23;;49599:280;49489:390;;;;:::o;49885:435::-;50065:3;50087:95;50178:3;50169:6;50087:95;:::i;:::-;50080:102;;50199:95;50290:3;50281:6;50199:95;:::i;:::-;50192:102;;50311:3;50304:10;;49885:435;;;;;:::o;50326:225::-;50466:34;50462:1;50454:6;50450:14;50443:58;50535:8;50530:2;50522:6;50518:15;50511:33;50326:225;:::o;50557:366::-;50699:3;50720:67;50784:2;50779:3;50720:67;:::i;:::-;50713:74;;50796:93;50885:3;50796:93;:::i;:::-;50914:2;50909:3;50905:12;50898:19;;50557:366;;;:::o;50929:419::-;51095:4;51133:2;51122:9;51118:18;51110:26;;51182:9;51176:4;51172:20;51168:1;51157:9;51153:17;51146:47;51210:131;51336:4;51210:131;:::i;:::-;51202:139;;50929:419;;;:::o;51354:332::-;51475:4;51513:2;51502:9;51498:18;51490:26;;51526:71;51594:1;51583:9;51579:17;51570:6;51526:71;:::i;:::-;51607:72;51675:2;51664:9;51660:18;51651:6;51607:72;:::i;:::-;51354:332;;;;;:::o;51692:137::-;51746:5;51777:6;51771:13;51762:22;;51793:30;51817:5;51793:30;:::i;:::-;51692:137;;;;:::o;51835:345::-;51902:6;51951:2;51939:9;51930:7;51926:23;51922:32;51919:119;;;51957:79;;:::i;:::-;51919:119;52077:1;52102:61;52155:7;52146:6;52135:9;52131:22;52102:61;:::i;:::-;52092:71;;52048:125;51835:345;;;;:::o;52186:182::-;52326:34;52322:1;52314:6;52310:14;52303:58;52186:182;:::o;52374:366::-;52516:3;52537:67;52601:2;52596:3;52537:67;:::i;:::-;52530:74;;52613:93;52702:3;52613:93;:::i;:::-;52731:2;52726:3;52722:12;52715:19;;52374:366;;;:::o;52746:419::-;52912:4;52950:2;52939:9;52935:18;52927:26;;52999:9;52993:4;52989:20;52985:1;52974:9;52970:17;52963:47;53027:131;53153:4;53027:131;:::i;:::-;53019:139;;52746:419;;;:::o;53171:233::-;53210:3;53233:24;53251:5;53233:24;:::i;:::-;53224:33;;53279:66;53272:5;53269:77;53266:103;;53349:18;;:::i;:::-;53266:103;53396:1;53389:5;53385:13;53378:20;;53171:233;;;:::o;53410:98::-;53461:6;53495:5;53489:12;53479:22;;53410:98;;;:::o;53514:168::-;53597:11;53631:6;53626:3;53619:19;53671:4;53666:3;53662:14;53647:29;;53514:168;;;;:::o;53688:373::-;53774:3;53802:38;53834:5;53802:38;:::i;:::-;53856:70;53919:6;53914:3;53856:70;:::i;:::-;53849:77;;53935:65;53993:6;53988:3;53981:4;53974:5;53970:16;53935:65;:::i;:::-;54025:29;54047:6;54025:29;:::i;:::-;54020:3;54016:39;54009:46;;53778:283;53688:373;;;;:::o;54067:640::-;54262:4;54300:3;54289:9;54285:19;54277:27;;54314:71;54382:1;54371:9;54367:17;54358:6;54314:71;:::i;:::-;54395:72;54463:2;54452:9;54448:18;54439:6;54395:72;:::i;:::-;54477;54545:2;54534:9;54530:18;54521:6;54477:72;:::i;:::-;54596:9;54590:4;54586:20;54581:2;54570:9;54566:18;54559:48;54624:76;54695:4;54686:6;54624:76;:::i;:::-;54616:84;;54067:640;;;;;;;:::o;54713:141::-;54769:5;54800:6;54794:13;54785:22;;54816:32;54842:5;54816:32;:::i;:::-;54713:141;;;;:::o;54860:349::-;54929:6;54978:2;54966:9;54957:7;54953:23;54949:32;54946:119;;;54984:79;;:::i;:::-;54946:119;55104:1;55129:63;55184:7;55175:6;55164:9;55160:22;55129:63;:::i;:::-;55119:73;;55075:127;54860:349;;;;:::o

Swarm Source

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