ETH Price: $3,122.37 (+0.06%)

Token

The Devious Dead Official (TDD)
 

Overview

Max Total Supply

6,666 TDD

Holders

2,069

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TDD
0x544bddf50a167e7eeeb23b258a908366528c36aa
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:
The_Devious_Dead_NFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-29
*/

// File: The Devious Dead NFT.sol
// Developer - TTibbs
// SPDX-License-Identifier: GPL-3.0

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * 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.
 */
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 proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _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}
     *
     * _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 the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild 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 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 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 for 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) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild 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 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 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 for 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) {
            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)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    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 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 {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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]`.
        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 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 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 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.
            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`.
                )

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

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

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

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

// File: contracts/dead.sol

// File: The Devious Dead NFT.sol
// Developer - TTibbs

pragma solidity ^0.8.0;





contract The_Devious_Dead_NFT is ERC721A, Ownable, ReentrancyGuard {

  using Strings for uint256;
  
  // Merkletree root hash (create merkleroot.js and add roothash from it)
  bytes32 public merkleRoot;
  bytes32 public ogmerkleRoot;
  
  // Reveal URI (set to blank if you want it sniper proof and update before minting)
  string public uri;
  string public uriSuffix = ".json";

  // Hidden URI (add your hidden metadata CID here)
  string public hiddenMetadataUri = "ipfs://QmWwPjoWzh8oGjzKkevkS4b9GrFbpRhKmq12vXzbqsc6QM/hidden.json";

  // Set the prices for each phase of minting
  uint256 public price = 0.065 ether;
  uint256 public wlprice = 0.04 ether;
  uint256 public ogprice = 0 ether;

  // Replace with your total supply here
  uint256 public supplyLimit = 3333;

  // Set the max per transaction for each phase of minting
  uint256 public maxMintAmountPerTx = 10;
  uint256 public wlmaxMintAmountPerTx = 4;
  uint256 public ogmaxMintAmountPerTx = 2;

  // Set the max per wallet for each phase of minting
  uint256 public maxLimitPerWallet = 20;
  uint256 public wlmaxLimitPerWallet = 8;
  uint256 public ogmaxLimitPerWallet = 2;

  // enable/disable minting phases
  bool public whitelistSale = false;
  bool public publicSale = false;
  bool public ogSale = false;

  // Reveal NFTs (set to false if you have want hidden metadata then change to true to reveal)
  bool public revealed = false;

  // Collection name and symbol, don't forget to change this
  constructor() ERC721A("The Devious Dead Official", "TDD")  {}

  // Minting functions 
  function OgMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable {

    // Verify og requirements
    require(ogSale, 'The OgSale is paused!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, ogmerkleRoot, leaf), 'Invalid proof!');


    // Normal requirements 
    require(_mintAmount > 0 && _mintAmount <= ogmaxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    require(balanceOf(msg.sender) + _mintAmount <= ogmaxLimitPerWallet, 'Max mint per wallet exceeded!');
    require(msg.value >= ogprice * _mintAmount, 'Insufficient funds!');
     
    // Mint
     _safeMint(_msgSender(), _mintAmount);
  }

  function WlMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable {

    // Verify wl requirements
    require(whitelistSale, 'The WlSale is paused!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!');


    // Normal requirements 
    require(_mintAmount > 0 && _mintAmount <= wlmaxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    require(balanceOf(msg.sender) + _mintAmount <= wlmaxLimitPerWallet, 'Max mint per wallet exceeded!');
    require(msg.value >= wlprice * _mintAmount, 'Insufficient funds!');
     
    // Mint
     _safeMint(_msgSender(), _mintAmount);
  }

  function PublicMint(uint256 _mintAmount) public payable {
    
    // Normal requirements 
    require(publicSale, 'The PublicSale is paused!');
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    require(balanceOf(msg.sender) + _mintAmount <= maxLimitPerWallet, 'Max mint per wallet exceeded!');
    require(msg.value >= price * _mintAmount, 'Insufficient funds!');
     
    // Mint
     _safeMint(_msgSender(), _mintAmount);
  }  
  // Airdrops to given addresses
  function Airdrop(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    _safeMint(_receiver, _mintAmount);
  }

  // Changes the revealed state of your contract
  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  // Changes the URI you have set for the metadata
  function seturi(string memory _uri) public onlyOwner {
    uri = _uri;
  }
  // Changes the URI suffix for the metadata (Most will be .json)
  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }
  // Changes the hidden metadata CID
  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  // Toggles the sale settings for each phase of minting
  function setpublicSale(bool _publicSale) public onlyOwner {
    publicSale = _publicSale;
  }

  function setwlSale(bool _whitelistSale) public onlyOwner {
    whitelistSale = _whitelistSale;
  }

  function setogSale(bool _ogSale) public onlyOwner {
    ogSale = _ogSale;
  }

  // Sets the root hash from merkletree.js for each WL phase
  function setwlMerkleRootHash(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function setogMerkleRootHash(bytes32 _ogmerkleRoot) public onlyOwner {
    ogmerkleRoot = _ogmerkleRoot;
  }  

  // Sets the max mint amount for each phase of minting
  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setwlmaxMintAmountPerTx(uint256 _wlmaxMintAmountPerTx) public onlyOwner {
    wlmaxMintAmountPerTx = _wlmaxMintAmountPerTx;
  }

  function setogmaxMintAmountPerTx(uint256 _ogmaxMintAmountPerTx) public onlyOwner {
    ogmaxMintAmountPerTx = _ogmaxMintAmountPerTx;
  } 

  // Sets the max amount per wallet for each phase of minting
  function setmaxLimitPerWallet(uint256 _maxLimitPerWallet) public onlyOwner {
    maxLimitPerWallet = _maxLimitPerWallet;
  }

  function setwlmaxLimitPerWallet(uint256 _wlmaxLimitPerWallet) public onlyOwner {
    wlmaxLimitPerWallet = _wlmaxLimitPerWallet;
  }  

  function setogmaxLimitPerWallet(uint256 _ogmaxLimitPerWallet) public onlyOwner {
    ogmaxLimitPerWallet = _ogmaxLimitPerWallet;
  }  

  // Sets the price per NFT for each phase of minting
  function setPrice(uint256 _price) public onlyOwner {
    price = _price;
  }

  function setwlprice(uint256 _wlprice) public onlyOwner {
    wlprice = _wlprice;
  }  

  function setogprice(uint256 _ogprice) public onlyOwner {
    ogprice = _ogprice;
  }  

  // Changes the supply limit, use this when you want to mint for each phase and update as you go along
  function setsupplyLimit(uint256 _supplyLimit) public onlyOwner {
    supplyLimit = _supplyLimit;
  }
  // Do not remove this function or you will not be able to withdraw funds being held on the contract
  function withdraw() public onlyOwner nonReentrant {
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
  }
  // Reads and returns the token IDs owned by a wallet
  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
      uint256 ownerTokenCount = balanceOf(_owner);
      uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
      uint256 currentTokenId = 1;
      uint256 ownedTokenIndex = 0;

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

        if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;

            ownedTokenIndex++;
        }
        currentTokenId++;
      }
      return ownedTokenIds;
    }
  // Sets the first minted NFT to #1 instead of #0
  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }
  // Returns the URI for the metadata of given token IDs
  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }
  // Returns the metadata baseURI for the collection itself
  function _baseURI() internal view virtual override returns (string memory) {
    return uri;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"OgMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"WlMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogmaxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogmaxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogmerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLimitPerWallet","type":"uint256"}],"name":"setmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ogmerkleRoot","type":"bytes32"}],"name":"setogMerkleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_ogSale","type":"bool"}],"name":"setogSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogmaxLimitPerWallet","type":"uint256"}],"name":"setogmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogmaxMintAmountPerTx","type":"uint256"}],"name":"setogmaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogprice","type":"uint256"}],"name":"setogprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"setpublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyLimit","type":"uint256"}],"name":"setsupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setwlMerkleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelistSale","type":"bool"}],"name":"setwlSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlmaxLimitPerWallet","type":"uint256"}],"name":"setwlmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlmaxMintAmountPerTx","type":"uint256"}],"name":"setwlmaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlprice","type":"uint256"}],"name":"setwlprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlmaxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlmaxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620002f8565b50604051806080016040528060418152602001620049b260419139600e908051906020019062000083929190620002f8565b5066e6ed27d6668000600f55668e1bc9bf0400006010556000601155610d05601255600a601355600460145560026015556014601655600860175560026018556000601960006101000a81548160ff0219169083151502179055506000601960016101000a81548160ff0219169083151502179055506000601960026101000a81548160ff0219169083151502179055506000601960036101000a81548160ff0219169083151502179055503480156200013c57600080fd5b506040518060400160405280601981526020017f54686520446576696f75732044656164204f6666696369616c000000000000008152506040518060400160405280600381526020017f54444400000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001c1929190620002f8565b508060039080519060200190620001da929190620002f8565b50620001eb6200022160201b60201c565b600081905550505062000213620002076200022a60201b60201c565b6200023260201b60201c565b60016009819055506200040d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200030690620003a8565b90600052602060002090601f0160209004810192826200032a576000855562000376565b82601f106200034557805160ff191683800117855562000376565b8280016001018555821562000376579182015b828111156200037557825182559160200191906001019062000358565b5b50905062000385919062000389565b5090565b5b80821115620003a45760008160009055506001016200038a565b5090565b60006002820490506001821680620003c157607f821691505b60208210811415620003d857620003d7620003de565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614595806200041d6000396000f3fe6080604052600436106103a15760003560e01c8063865aaff9116101e7578063b88d4fde1161010d578063dc544ca7116100a0578063ecd993081161006f578063ecd9930814610d32578063f2cd579614610d5d578063f2fde38b14610d88578063f648498014610db1576103a1565b8063dc544ca714610c76578063e0a8085314610ca1578063e985e9c514610cca578063eac989f814610d07576103a1565b8063d19fdec4116100dc578063d19fdec414610bd0578063d39c785014610bfb578063d610da9814610c24578063d9f0a67114610c4d576103a1565b8063b88d4fde14610b18578063c7173fb014610b41578063c87b56dd14610b6a578063ce9ce09d14610ba7576103a1565b80639cb257d011610185578063a28b56f211610154578063a28b56f214610a72578063a45ba8e714610a9b578063abe37a9414610ac6578063b071401b14610aef576103a1565b80639cb257d0146109d95780639fb17e3414610a02578063a035b1fe14610a1e578063a22cb46514610a49576103a1565b80638da5cb5b116101c15780638da5cb5b1461092f57806391b7f5ed1461095a57806394354fd01461098357806395d89b41146109ae576103a1565b8063865aaff9146108b0578063869194ac146108d957806388b71fc014610904576103a1565b80633f527490116102cc5780635a0b8b231161026a5780636352211e116102395780636352211e146107f657806370a0823114610833578063715018a6146108705780637871e15414610887576103a1565b80635a0b8b231461076a5780635b06f47f146107955780635c22abd2146107b157806361efde22146107da576103a1565b8063454bb2a8116102a6578063454bb2a8146106c25780634fdd43cb146106eb57806351830227146107145780635503a0e81461073f576103a1565b80633f5274901461063157806342842e0e1461065c578063438b630014610685576103a1565b806318160ddd116103445780632eb4a7ab116103135780632eb4a7ab1461059957806331ffd6f1146105c457806333bc1c5c146105ef5780633ccfd60b1461061a576103a1565b806318160ddd146104ef57806319d1997a1461051a5780631b4fa8b71461054557806323b872dd14610570576103a1565b8063081812fc11610380578063081812fc14610437578063095ea7b3146104745780630f0a56a91461049d57806316ba10e0146104c6576103a1565b806275770a146103a657806301ffc9a7146103cf57806306fdde031461040c575b600080fd5b3480156103b257600080fd5b506103cd60048036038101906103c89190613683565b610dda565b005b3480156103db57600080fd5b506103f660048036038101906103f191906135f0565b610dec565b6040516104039190613beb565b60405180910390f35b34801561041857600080fd5b50610421610e7e565b60405161042e9190613c21565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613683565b610f10565b60405161046b9190613b62565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613562565b610f8f565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190613683565b6110d3565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613642565b6110e5565b005b3480156104fb57600080fd5b50610504611107565b6040516105119190613dc3565b60405180910390f35b34801561052657600080fd5b5061052f61111e565b60405161053c9190613dc3565b60405180910390f35b34801561055157600080fd5b5061055a611124565b6040516105679190613c06565b60405180910390f35b34801561057c57600080fd5b506105976004803603810190610592919061345c565b61112a565b005b3480156105a557600080fd5b506105ae61144f565b6040516105bb9190613c06565b60405180910390f35b3480156105d057600080fd5b506105d9611455565b6040516105e69190613beb565b60405180910390f35b3480156105fb57600080fd5b50610604611468565b6040516106119190613beb565b60405180910390f35b34801561062657600080fd5b5061062f61147b565b005b34801561063d57600080fd5b50610646611559565b6040516106539190613dc3565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061345c565b61155f565b005b34801561069157600080fd5b506106ac60048036038101906106a791906133f7565b61157f565b6040516106b99190613bc9565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e49190613683565b6116d6565b005b3480156106f757600080fd5b50610712600480360381019061070d9190613642565b6116e8565b005b34801561072057600080fd5b5061072961170a565b6040516107369190613beb565b60405180910390f35b34801561074b57600080fd5b5061075461171d565b6040516107619190613c21565b60405180910390f35b34801561077657600080fd5b5061077f6117ab565b60405161078c9190613dc3565b60405180910390f35b6107af60048036038101906107aa91906136e8565b6117b1565b005b3480156107bd57600080fd5b506107d860048036038101906107d3919061359e565b611a26565b005b6107f460048036038101906107ef91906136e8565b611a4b565b005b34801561080257600080fd5b5061081d60048036038101906108189190613683565b611cc0565b60405161082a9190613b62565b60405180910390f35b34801561083f57600080fd5b5061085a600480360381019061085591906133f7565b611cd2565b6040516108679190613dc3565b60405180910390f35b34801561087c57600080fd5b50610885611d8b565b005b34801561089357600080fd5b506108ae60048036038101906108a991906136ac565b611d9f565b005b3480156108bc57600080fd5b506108d760048036038101906108d2919061359e565b611e0c565b005b3480156108e557600080fd5b506108ee611e31565b6040516108fb9190613dc3565b60405180910390f35b34801561091057600080fd5b50610919611e37565b6040516109269190613beb565b60405180910390f35b34801561093b57600080fd5b50610944611e4a565b6040516109519190613b62565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c9190613683565b611e74565b005b34801561098f57600080fd5b50610998611e86565b6040516109a59190613dc3565b60405180910390f35b3480156109ba57600080fd5b506109c3611e8c565b6040516109d09190613c21565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb919061359e565b611f1e565b005b610a1c6004803603810190610a179190613683565b611f43565b005b348015610a2a57600080fd5b50610a336120f6565b604051610a409190613dc3565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b9190613526565b6120fc565b005b348015610a7e57600080fd5b50610a996004803603810190610a9491906135c7565b612274565b005b348015610aa757600080fd5b50610ab0612286565b604051610abd9190613c21565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190613683565b612314565b005b348015610afb57600080fd5b50610b166004803603810190610b119190613683565b612326565b005b348015610b2457600080fd5b50610b3f6004803603810190610b3a91906134ab565b612338565b005b348015610b4d57600080fd5b50610b686004803603810190610b6391906135c7565b6123ab565b005b348015610b7657600080fd5b50610b916004803603810190610b8c9190613683565b6123bd565b604051610b9e9190613c21565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc99190613683565b612516565b005b348015610bdc57600080fd5b50610be5612528565b604051610bf29190613dc3565b60405180910390f35b348015610c0757600080fd5b50610c226004803603810190610c1d9190613683565b61252e565b005b348015610c3057600080fd5b50610c4b6004803603810190610c469190613683565b612540565b005b348015610c5957600080fd5b50610c746004803603810190610c6f9190613683565b612552565b005b348015610c8257600080fd5b50610c8b612564565b604051610c989190613dc3565b60405180910390f35b348015610cad57600080fd5b50610cc86004803603810190610cc3919061359e565b61256a565b005b348015610cd657600080fd5b50610cf16004803603810190610cec9190613420565b61258f565b604051610cfe9190613beb565b60405180910390f35b348015610d1357600080fd5b50610d1c612623565b604051610d299190613c21565b60405180910390f35b348015610d3e57600080fd5b50610d476126b1565b604051610d549190613dc3565b60405180910390f35b348015610d6957600080fd5b50610d726126b7565b604051610d7f9190613dc3565b60405180910390f35b348015610d9457600080fd5b50610daf6004803603810190610daa91906133f7565b6126bd565b005b348015610dbd57600080fd5b50610dd86004803603810190610dd39190613642565b612741565b005b610de2612763565b8060128190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e775750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610e8d906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb9906140d6565b8015610f065780601f10610edb57610100808354040283529160200191610f06565b820191906000526020600020905b815481529060010190602001808311610ee957829003601f168201915b5050505050905090565b6000610f1b826127e1565b610f51576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f9a82611cc0565b90508073ffffffffffffffffffffffffffffffffffffffff16610fbb612840565b73ffffffffffffffffffffffffffffffffffffffff161461101e57610fe781610fe2612840565b61258f565b61101d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6110db612763565b8060118190555050565b6110ed612763565b80600d90805190602001906111039291906131bc565b5050565b6000611111612848565b6001546000540303905090565b60125481565b600b5481565b600061113582612851565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461119c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111a88461291f565b915091506111be81876111b9612840565b612946565b61120a576111d3866111ce612840565b61258f565b611209576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611271576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61127e868686600161298a565b801561128957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061135785611333888887612990565b7c0200000000000000000000000000000000000000000000000000000000176129b8565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156113df5760006001850190506000600460008381526020019081526020016000205414156113dd5760005481146113dc578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461144786868660016129e3565b505050505050565b600a5481565b601960009054906101000a900460ff1681565b601960019054906101000a900460ff1681565b611483612763565b600260095414156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613d83565b60405180910390fd5b600260098190555060006114db611e4a565b73ffffffffffffffffffffffffffffffffffffffff16476040516114fe90613b4d565b60006040518083038185875af1925050503d806000811461153b576040519150601f19603f3d011682016040523d82523d6000602084013e611540565b606091505b505090508061154e57600080fd5b506001600981905550565b60185481565b61157a83838360405180602001604052806000815250612338565b505050565b6060600061158c83611cd2565b905060008167ffffffffffffffff8111156115d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115fe5781602001602082028036833780820191505090505b50905060006001905060005b838110801561161b57506012548211155b156116ca57600061162b83611cc0565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116b6578284838151811061169b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806116b290614139565b9250505b82806116c190614139565b9350505061160a565b82945050505050919050565b6116de612763565b8060178190555050565b6116f0612763565b80600e90805190602001906117069291906131bc565b5050565b601960039054906101000a900460ff1681565b600d805461172a906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611756906140d6565b80156117a35780601f10611778576101008083540402835291602001916117a3565b820191906000526020600020905b81548152906001019060200180831161178657829003601f168201915b505050505081565b60165481565b601960029054906101000a900460ff16611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613d03565b60405180910390fd5b600061180a6129e9565b60405160200161181a9190613b01565b604051602081830303815290604052805190602001209050611880838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836129f1565b6118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613c43565b60405180910390fd5b6000841180156118d157506015548411155b611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790613c83565b60405180910390fd5b6012548461191c611107565b6119269190613f01565b1115611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613d23565b60405180910390fd5b6018548461197433611cd2565b61197e9190613f01565b11156119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613ca3565b60405180910390fd5b836011546119cd9190613f88565b341015611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690613da3565b60405180910390fd5b611a20611a1a6129e9565b85612a08565b50505050565b611a2e612763565b80601960016101000a81548160ff02191690831515021790555050565b601960009054906101000a900460ff16611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190613d63565b60405180910390fd5b6000611aa46129e9565b604051602001611ab49190613b01565b604051602081830303815290604052805190602001209050611b1a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836129f1565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613c43565b60405180910390fd5b600084118015611b6b57506014548411155b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613c83565b60405180910390fd5b60125484611bb6611107565b611bc09190613f01565b1115611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890613d23565b60405180910390fd5b60175484611c0e33611cd2565b611c189190613f01565b1115611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090613ca3565b60405180910390fd5b83601054611c679190613f88565b341015611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090613da3565b60405180910390fd5b611cba611cb46129e9565b85612a08565b50505050565b6000611ccb82612851565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d93612763565b611d9d6000612a26565b565b611da7612763565b60125482611db3611107565b611dbd9190613f01565b1115611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590613d23565b60405180910390fd5b611e088183612a08565b5050565b611e14612763565b80601960026101000a81548160ff02191690831515021790555050565b60175481565b601960029054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e7c612763565b80600f8190555050565b60135481565b606060038054611e9b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec7906140d6565b8015611f145780601f10611ee957610100808354040283529160200191611f14565b820191906000526020600020905b815481529060010190602001808311611ef757829003601f168201915b5050505050905090565b611f26612763565b80601960006101000a81548160ff02191690831515021790555050565b601960019054906101000a900460ff16611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613d43565b60405180910390fd5b600081118015611fa457506013548111155b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613c83565b60405180910390fd5b60125481611fef611107565b611ff99190613f01565b111561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613d23565b60405180910390fd5b6016548161204733611cd2565b6120519190613f01565b1115612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613ca3565b60405180910390fd5b80600f546120a09190613f88565b3410156120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990613da3565b60405180910390fd5b6120f36120ed6129e9565b82612a08565b50565b600f5481565b612104612840565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612169576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612176612840565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612223612840565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122689190613beb565b60405180910390a35050565b61227c612763565b80600a8190555050565b600e8054612293906140d6565b80601f01602080910402602001604051908101604052809291908181526020018280546122bf906140d6565b801561230c5780601f106122e15761010080835404028352916020019161230c565b820191906000526020600020905b8154815290600101906020018083116122ef57829003601f168201915b505050505081565b61231c612763565b8060148190555050565b61232e612763565b8060138190555050565b61234384848461112a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123a55761236e84848484612aec565b6123a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6123b3612763565b80600b8190555050565b60606123c8826127e1565b612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe90613ce3565b60405180910390fd5b60001515601960039054906101000a900460ff16151514156124b557600e8054612430906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461245c906140d6565b80156124a95780601f1061247e576101008083540402835291602001916124a9565b820191906000526020600020905b81548152906001019060200180831161248c57829003601f168201915b50505050509050612511565b60006124bf612c4c565b905060008151116124df576040518060200160405280600081525061250d565b806124e984612cde565b600d6040516020016124fd93929190613b1c565b6040516020818303038152906040525b9150505b919050565b61251e612763565b8060188190555050565b60155481565b612536612763565b8060108190555050565b612548612763565b8060158190555050565b61255a612763565b8060168190555050565b60105481565b612572612763565b80601960036101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c8054612630906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461265c906140d6565b80156126a95780601f1061267e576101008083540402835291602001916126a9565b820191906000526020600020905b81548152906001019060200180831161268c57829003601f168201915b505050505081565b60115481565b60145481565b6126c5612763565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90613c63565b60405180910390fd5b61273e81612a26565b50565b612749612763565b80600c908051906020019061275f9291906131bc565b5050565b61276b6129e9565b73ffffffffffffffffffffffffffffffffffffffff16612789611e4a565b73ffffffffffffffffffffffffffffffffffffffff16146127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d690613cc3565b60405180910390fd5b565b6000816127ec612848565b111580156127fb575060005482105b8015612839575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612860612848565b116128e8576000548110156128e75760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156128e5575b60008114156128db5760046000836001900393508381526020019081526020016000205490506128b0565b809250505061291a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129a7868684612e8b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000826129fe8584612e94565b1490509392505050565b612a22828260405180602001604052806000815250612f10565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b12612840565b8786866040518563ffffffff1660e01b8152600401612b349493929190613b7d565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7f57506040513d601f19601f82011682018060405250810190612b7c9190613619565b60015b612bf9573d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b50600081511415612bf1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612c5b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612c87906140d6565b8015612cd45780601f10612ca957610100808354040283529160200191612cd4565b820191906000526020600020905b815481529060010190602001808311612cb757829003601f168201915b5050505050905090565b60606000821415612d26576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e86565b600082905060005b60008214612d58578080612d4190614139565b915050600a82612d519190613f57565b9150612d2e565b60008167ffffffffffffffff811115612d9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dcc5781602001600182028036833780820191505090505b5090505b60008514612e7f57600182612de59190613fe2565b9150600a85612df491906141a6565b6030612e009190613f01565b60f81b818381518110612e3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e789190613f57565b9450612dd0565b8093505050505b919050565b60009392505050565b60008082905060005b8451811015612f0557612ef082868381518110612ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612fad565b91508080612efd90614139565b915050612e9d565b508091505092915050565b612f1a8383612fd8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612fa857600080549050600083820390505b612f5a6000868380600101945086612aec565b612f90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f47578160005414612fa557600080fd5b50505b505050565b6000818310612fc557612fc08284613195565b612fd0565b612fcf8383613195565b5b905092915050565b6000805490506000821415613019576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613026600084838561298a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061309d8361308e6000866000612990565b613097856131ac565b176129b8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461313e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613103565b50600082141561317a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061319060008483856129e3565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131c8906140d6565b90600052602060002090601f0160209004810192826131ea5760008555613231565b82601f1061320357805160ff1916838001178555613231565b82800160010185558215613231579182015b82811115613230578251825591602001919060010190613215565b5b50905061323e9190613242565b5090565b5b8082111561325b576000816000905550600101613243565b5090565b600061327261326d84613e03565b613dde565b90508281526020810184848401111561328a57600080fd5b613295848285614094565b509392505050565b60006132b06132ab84613e34565b613dde565b9050828152602081018484840111156132c857600080fd5b6132d3848285614094565b509392505050565b6000813590506132ea816144ec565b92915050565b60008083601f84011261330257600080fd5b8235905067ffffffffffffffff81111561331b57600080fd5b60208301915083602082028301111561333357600080fd5b9250929050565b60008135905061334981614503565b92915050565b60008135905061335e8161451a565b92915050565b60008135905061337381614531565b92915050565b60008151905061338881614531565b92915050565b600082601f83011261339f57600080fd5b81356133af84826020860161325f565b91505092915050565b600082601f8301126133c957600080fd5b81356133d984826020860161329d565b91505092915050565b6000813590506133f181614548565b92915050565b60006020828403121561340957600080fd5b6000613417848285016132db565b91505092915050565b6000806040838503121561343357600080fd5b6000613441858286016132db565b9250506020613452858286016132db565b9150509250929050565b60008060006060848603121561347157600080fd5b600061347f868287016132db565b9350506020613490868287016132db565b92505060406134a1868287016133e2565b9150509250925092565b600080600080608085870312156134c157600080fd5b60006134cf878288016132db565b94505060206134e0878288016132db565b93505060406134f1878288016133e2565b925050606085013567ffffffffffffffff81111561350e57600080fd5b61351a8782880161338e565b91505092959194509250565b6000806040838503121561353957600080fd5b6000613547858286016132db565b92505060206135588582860161333a565b9150509250929050565b6000806040838503121561357557600080fd5b6000613583858286016132db565b9250506020613594858286016133e2565b9150509250929050565b6000602082840312156135b057600080fd5b60006135be8482850161333a565b91505092915050565b6000602082840312156135d957600080fd5b60006135e78482850161334f565b91505092915050565b60006020828403121561360257600080fd5b600061361084828501613364565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613379565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133b8565b91505092915050565b60006020828403121561369557600080fd5b60006136a3848285016133e2565b91505092915050565b600080604083850312156136bf57600080fd5b60006136cd858286016133e2565b92505060206136de858286016132db565b9150509250929050565b6000806000604084860312156136fd57600080fd5b600061370b868287016133e2565b935050602084013567ffffffffffffffff81111561372857600080fd5b613734868287016132f0565b92509250509250925092565b600061374c8383613ae3565b60208301905092915050565b61376181614016565b82525050565b61377861377382614016565b614182565b82525050565b600061378982613e8a565b6137938185613eb8565b935061379e83613e65565b8060005b838110156137cf5781516137b68882613740565b97506137c183613eab565b9250506001810190506137a2565b5085935050505092915050565b6137e581614028565b82525050565b6137f481614034565b82525050565b600061380582613e95565b61380f8185613ec9565b935061381f8185602086016140a3565b61382881614293565b840191505092915050565b600061383e82613ea0565b6138488185613ee5565b93506138588185602086016140a3565b61386181614293565b840191505092915050565b600061387782613ea0565b6138818185613ef6565b93506138918185602086016140a3565b80840191505092915050565b600081546138aa816140d6565b6138b48186613ef6565b945060018216600081146138cf57600181146138e057613913565b60ff19831686528186019350613913565b6138e985613e75565b60005b8381101561390b578154818901526001820191506020810190506138ec565b838801955050505b50505092915050565b6000613929600e83613ee5565b9150613934826142b1565b602082019050919050565b600061394c602683613ee5565b9150613957826142da565b604082019050919050565b600061396f601483613ee5565b915061397a82614329565b602082019050919050565b6000613992601d83613ee5565b915061399d82614352565b602082019050919050565b60006139b5602083613ee5565b91506139c08261437b565b602082019050919050565b60006139d8602f83613ee5565b91506139e3826143a4565b604082019050919050565b60006139fb601583613ee5565b9150613a06826143f3565b602082019050919050565b6000613a1e600083613eda565b9150613a298261441c565b600082019050919050565b6000613a41601483613ee5565b9150613a4c8261441f565b602082019050919050565b6000613a64601983613ee5565b9150613a6f82614448565b602082019050919050565b6000613a87601583613ee5565b9150613a9282614471565b602082019050919050565b6000613aaa601f83613ee5565b9150613ab58261449a565b602082019050919050565b6000613acd601383613ee5565b9150613ad8826144c3565b602082019050919050565b613aec8161408a565b82525050565b613afb8161408a565b82525050565b6000613b0d8284613767565b60148201915081905092915050565b6000613b28828661386c565b9150613b34828561386c565b9150613b40828461389d565b9150819050949350505050565b6000613b5882613a11565b9150819050919050565b6000602082019050613b776000830184613758565b92915050565b6000608082019050613b926000830187613758565b613b9f6020830186613758565b613bac6040830185613af2565b8181036060830152613bbe81846137fa565b905095945050505050565b60006020820190508181036000830152613be3818461377e565b905092915050565b6000602082019050613c0060008301846137dc565b92915050565b6000602082019050613c1b60008301846137eb565b92915050565b60006020820190508181036000830152613c3b8184613833565b905092915050565b60006020820190508181036000830152613c5c8161391c565b9050919050565b60006020820190508181036000830152613c7c8161393f565b9050919050565b60006020820190508181036000830152613c9c81613962565b9050919050565b60006020820190508181036000830152613cbc81613985565b9050919050565b60006020820190508181036000830152613cdc816139a8565b9050919050565b60006020820190508181036000830152613cfc816139cb565b9050919050565b60006020820190508181036000830152613d1c816139ee565b9050919050565b60006020820190508181036000830152613d3c81613a34565b9050919050565b60006020820190508181036000830152613d5c81613a57565b9050919050565b60006020820190508181036000830152613d7c81613a7a565b9050919050565b60006020820190508181036000830152613d9c81613a9d565b9050919050565b60006020820190508181036000830152613dbc81613ac0565b9050919050565b6000602082019050613dd86000830184613af2565b92915050565b6000613de8613df9565b9050613df48282614108565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1e57613e1d614264565b5b613e2782614293565b9050602081019050919050565b600067ffffffffffffffff821115613e4f57613e4e614264565b5b613e5882614293565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f0c8261408a565b9150613f178361408a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f4c57613f4b6141d7565b5b828201905092915050565b6000613f628261408a565b9150613f6d8361408a565b925082613f7d57613f7c614206565b5b828204905092915050565b6000613f938261408a565b9150613f9e8361408a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fd757613fd66141d7565b5b828202905092915050565b6000613fed8261408a565b9150613ff88361408a565b92508282101561400b5761400a6141d7565b5b828203905092915050565b60006140218261406a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140c15780820151818401526020810190506140a6565b838111156140d0576000848401525b50505050565b600060028204905060018216806140ee57607f821691505b6020821081141561410257614101614235565b5b50919050565b61411182614293565b810181811067ffffffffffffffff821117156141305761412f614264565b5b80604052505050565b60006141448261408a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614177576141766141d7565b5b600182019050919050565b600061418d82614194565b9050919050565b600061419f826142a4565b9050919050565b60006141b18261408a565b91506141bc8361408a565b9250826141cc576141cb614206565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546865204f6753616c6520697320706175736564210000000000000000000000600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f546865205075626c696353616c65206973207061757365642100000000000000600082015250565b7f54686520576c53616c6520697320706175736564210000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6144f581614016565b811461450057600080fd5b50565b61450c81614028565b811461451757600080fd5b50565b61452381614034565b811461452e57600080fd5b50565b61453a8161403e565b811461454557600080fd5b50565b6145518161408a565b811461455c57600080fd5b5056fea26469706673582212200cb1cc2f0ad17f0c3b1b2e2c4cd4ffeb77f94c31d3bc65edc3dec43ad008a18464736f6c63430008040033697066733a2f2f516d5777506a6f577a68386f476a7a4b6b65766b53346239477246627052684b6d71313276587a6271736336514d2f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106103a15760003560e01c8063865aaff9116101e7578063b88d4fde1161010d578063dc544ca7116100a0578063ecd993081161006f578063ecd9930814610d32578063f2cd579614610d5d578063f2fde38b14610d88578063f648498014610db1576103a1565b8063dc544ca714610c76578063e0a8085314610ca1578063e985e9c514610cca578063eac989f814610d07576103a1565b8063d19fdec4116100dc578063d19fdec414610bd0578063d39c785014610bfb578063d610da9814610c24578063d9f0a67114610c4d576103a1565b8063b88d4fde14610b18578063c7173fb014610b41578063c87b56dd14610b6a578063ce9ce09d14610ba7576103a1565b80639cb257d011610185578063a28b56f211610154578063a28b56f214610a72578063a45ba8e714610a9b578063abe37a9414610ac6578063b071401b14610aef576103a1565b80639cb257d0146109d95780639fb17e3414610a02578063a035b1fe14610a1e578063a22cb46514610a49576103a1565b80638da5cb5b116101c15780638da5cb5b1461092f57806391b7f5ed1461095a57806394354fd01461098357806395d89b41146109ae576103a1565b8063865aaff9146108b0578063869194ac146108d957806388b71fc014610904576103a1565b80633f527490116102cc5780635a0b8b231161026a5780636352211e116102395780636352211e146107f657806370a0823114610833578063715018a6146108705780637871e15414610887576103a1565b80635a0b8b231461076a5780635b06f47f146107955780635c22abd2146107b157806361efde22146107da576103a1565b8063454bb2a8116102a6578063454bb2a8146106c25780634fdd43cb146106eb57806351830227146107145780635503a0e81461073f576103a1565b80633f5274901461063157806342842e0e1461065c578063438b630014610685576103a1565b806318160ddd116103445780632eb4a7ab116103135780632eb4a7ab1461059957806331ffd6f1146105c457806333bc1c5c146105ef5780633ccfd60b1461061a576103a1565b806318160ddd146104ef57806319d1997a1461051a5780631b4fa8b71461054557806323b872dd14610570576103a1565b8063081812fc11610380578063081812fc14610437578063095ea7b3146104745780630f0a56a91461049d57806316ba10e0146104c6576103a1565b806275770a146103a657806301ffc9a7146103cf57806306fdde031461040c575b600080fd5b3480156103b257600080fd5b506103cd60048036038101906103c89190613683565b610dda565b005b3480156103db57600080fd5b506103f660048036038101906103f191906135f0565b610dec565b6040516104039190613beb565b60405180910390f35b34801561041857600080fd5b50610421610e7e565b60405161042e9190613c21565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613683565b610f10565b60405161046b9190613b62565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613562565b610f8f565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190613683565b6110d3565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613642565b6110e5565b005b3480156104fb57600080fd5b50610504611107565b6040516105119190613dc3565b60405180910390f35b34801561052657600080fd5b5061052f61111e565b60405161053c9190613dc3565b60405180910390f35b34801561055157600080fd5b5061055a611124565b6040516105679190613c06565b60405180910390f35b34801561057c57600080fd5b506105976004803603810190610592919061345c565b61112a565b005b3480156105a557600080fd5b506105ae61144f565b6040516105bb9190613c06565b60405180910390f35b3480156105d057600080fd5b506105d9611455565b6040516105e69190613beb565b60405180910390f35b3480156105fb57600080fd5b50610604611468565b6040516106119190613beb565b60405180910390f35b34801561062657600080fd5b5061062f61147b565b005b34801561063d57600080fd5b50610646611559565b6040516106539190613dc3565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061345c565b61155f565b005b34801561069157600080fd5b506106ac60048036038101906106a791906133f7565b61157f565b6040516106b99190613bc9565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e49190613683565b6116d6565b005b3480156106f757600080fd5b50610712600480360381019061070d9190613642565b6116e8565b005b34801561072057600080fd5b5061072961170a565b6040516107369190613beb565b60405180910390f35b34801561074b57600080fd5b5061075461171d565b6040516107619190613c21565b60405180910390f35b34801561077657600080fd5b5061077f6117ab565b60405161078c9190613dc3565b60405180910390f35b6107af60048036038101906107aa91906136e8565b6117b1565b005b3480156107bd57600080fd5b506107d860048036038101906107d3919061359e565b611a26565b005b6107f460048036038101906107ef91906136e8565b611a4b565b005b34801561080257600080fd5b5061081d60048036038101906108189190613683565b611cc0565b60405161082a9190613b62565b60405180910390f35b34801561083f57600080fd5b5061085a600480360381019061085591906133f7565b611cd2565b6040516108679190613dc3565b60405180910390f35b34801561087c57600080fd5b50610885611d8b565b005b34801561089357600080fd5b506108ae60048036038101906108a991906136ac565b611d9f565b005b3480156108bc57600080fd5b506108d760048036038101906108d2919061359e565b611e0c565b005b3480156108e557600080fd5b506108ee611e31565b6040516108fb9190613dc3565b60405180910390f35b34801561091057600080fd5b50610919611e37565b6040516109269190613beb565b60405180910390f35b34801561093b57600080fd5b50610944611e4a565b6040516109519190613b62565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c9190613683565b611e74565b005b34801561098f57600080fd5b50610998611e86565b6040516109a59190613dc3565b60405180910390f35b3480156109ba57600080fd5b506109c3611e8c565b6040516109d09190613c21565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb919061359e565b611f1e565b005b610a1c6004803603810190610a179190613683565b611f43565b005b348015610a2a57600080fd5b50610a336120f6565b604051610a409190613dc3565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b9190613526565b6120fc565b005b348015610a7e57600080fd5b50610a996004803603810190610a9491906135c7565b612274565b005b348015610aa757600080fd5b50610ab0612286565b604051610abd9190613c21565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190613683565b612314565b005b348015610afb57600080fd5b50610b166004803603810190610b119190613683565b612326565b005b348015610b2457600080fd5b50610b3f6004803603810190610b3a91906134ab565b612338565b005b348015610b4d57600080fd5b50610b686004803603810190610b6391906135c7565b6123ab565b005b348015610b7657600080fd5b50610b916004803603810190610b8c9190613683565b6123bd565b604051610b9e9190613c21565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc99190613683565b612516565b005b348015610bdc57600080fd5b50610be5612528565b604051610bf29190613dc3565b60405180910390f35b348015610c0757600080fd5b50610c226004803603810190610c1d9190613683565b61252e565b005b348015610c3057600080fd5b50610c4b6004803603810190610c469190613683565b612540565b005b348015610c5957600080fd5b50610c746004803603810190610c6f9190613683565b612552565b005b348015610c8257600080fd5b50610c8b612564565b604051610c989190613dc3565b60405180910390f35b348015610cad57600080fd5b50610cc86004803603810190610cc3919061359e565b61256a565b005b348015610cd657600080fd5b50610cf16004803603810190610cec9190613420565b61258f565b604051610cfe9190613beb565b60405180910390f35b348015610d1357600080fd5b50610d1c612623565b604051610d299190613c21565b60405180910390f35b348015610d3e57600080fd5b50610d476126b1565b604051610d549190613dc3565b60405180910390f35b348015610d6957600080fd5b50610d726126b7565b604051610d7f9190613dc3565b60405180910390f35b348015610d9457600080fd5b50610daf6004803603810190610daa91906133f7565b6126bd565b005b348015610dbd57600080fd5b50610dd86004803603810190610dd39190613642565b612741565b005b610de2612763565b8060128190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e775750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610e8d906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb9906140d6565b8015610f065780601f10610edb57610100808354040283529160200191610f06565b820191906000526020600020905b815481529060010190602001808311610ee957829003601f168201915b5050505050905090565b6000610f1b826127e1565b610f51576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f9a82611cc0565b90508073ffffffffffffffffffffffffffffffffffffffff16610fbb612840565b73ffffffffffffffffffffffffffffffffffffffff161461101e57610fe781610fe2612840565b61258f565b61101d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6110db612763565b8060118190555050565b6110ed612763565b80600d90805190602001906111039291906131bc565b5050565b6000611111612848565b6001546000540303905090565b60125481565b600b5481565b600061113582612851565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461119c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111a88461291f565b915091506111be81876111b9612840565b612946565b61120a576111d3866111ce612840565b61258f565b611209576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611271576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61127e868686600161298a565b801561128957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061135785611333888887612990565b7c0200000000000000000000000000000000000000000000000000000000176129b8565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156113df5760006001850190506000600460008381526020019081526020016000205414156113dd5760005481146113dc578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461144786868660016129e3565b505050505050565b600a5481565b601960009054906101000a900460ff1681565b601960019054906101000a900460ff1681565b611483612763565b600260095414156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613d83565b60405180910390fd5b600260098190555060006114db611e4a565b73ffffffffffffffffffffffffffffffffffffffff16476040516114fe90613b4d565b60006040518083038185875af1925050503d806000811461153b576040519150601f19603f3d011682016040523d82523d6000602084013e611540565b606091505b505090508061154e57600080fd5b506001600981905550565b60185481565b61157a83838360405180602001604052806000815250612338565b505050565b6060600061158c83611cd2565b905060008167ffffffffffffffff8111156115d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115fe5781602001602082028036833780820191505090505b50905060006001905060005b838110801561161b57506012548211155b156116ca57600061162b83611cc0565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116b6578284838151811061169b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806116b290614139565b9250505b82806116c190614139565b9350505061160a565b82945050505050919050565b6116de612763565b8060178190555050565b6116f0612763565b80600e90805190602001906117069291906131bc565b5050565b601960039054906101000a900460ff1681565b600d805461172a906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611756906140d6565b80156117a35780601f10611778576101008083540402835291602001916117a3565b820191906000526020600020905b81548152906001019060200180831161178657829003601f168201915b505050505081565b60165481565b601960029054906101000a900460ff16611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613d03565b60405180910390fd5b600061180a6129e9565b60405160200161181a9190613b01565b604051602081830303815290604052805190602001209050611880838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54836129f1565b6118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613c43565b60405180910390fd5b6000841180156118d157506015548411155b611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790613c83565b60405180910390fd5b6012548461191c611107565b6119269190613f01565b1115611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613d23565b60405180910390fd5b6018548461197433611cd2565b61197e9190613f01565b11156119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613ca3565b60405180910390fd5b836011546119cd9190613f88565b341015611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690613da3565b60405180910390fd5b611a20611a1a6129e9565b85612a08565b50505050565b611a2e612763565b80601960016101000a81548160ff02191690831515021790555050565b601960009054906101000a900460ff16611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190613d63565b60405180910390fd5b6000611aa46129e9565b604051602001611ab49190613b01565b604051602081830303815290604052805190602001209050611b1a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836129f1565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613c43565b60405180910390fd5b600084118015611b6b57506014548411155b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613c83565b60405180910390fd5b60125484611bb6611107565b611bc09190613f01565b1115611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890613d23565b60405180910390fd5b60175484611c0e33611cd2565b611c189190613f01565b1115611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090613ca3565b60405180910390fd5b83601054611c679190613f88565b341015611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090613da3565b60405180910390fd5b611cba611cb46129e9565b85612a08565b50505050565b6000611ccb82612851565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d93612763565b611d9d6000612a26565b565b611da7612763565b60125482611db3611107565b611dbd9190613f01565b1115611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590613d23565b60405180910390fd5b611e088183612a08565b5050565b611e14612763565b80601960026101000a81548160ff02191690831515021790555050565b60175481565b601960029054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e7c612763565b80600f8190555050565b60135481565b606060038054611e9b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec7906140d6565b8015611f145780601f10611ee957610100808354040283529160200191611f14565b820191906000526020600020905b815481529060010190602001808311611ef757829003601f168201915b5050505050905090565b611f26612763565b80601960006101000a81548160ff02191690831515021790555050565b601960019054906101000a900460ff16611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613d43565b60405180910390fd5b600081118015611fa457506013548111155b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613c83565b60405180910390fd5b60125481611fef611107565b611ff99190613f01565b111561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613d23565b60405180910390fd5b6016548161204733611cd2565b6120519190613f01565b1115612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613ca3565b60405180910390fd5b80600f546120a09190613f88565b3410156120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990613da3565b60405180910390fd5b6120f36120ed6129e9565b82612a08565b50565b600f5481565b612104612840565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612169576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612176612840565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612223612840565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122689190613beb565b60405180910390a35050565b61227c612763565b80600a8190555050565b600e8054612293906140d6565b80601f01602080910402602001604051908101604052809291908181526020018280546122bf906140d6565b801561230c5780601f106122e15761010080835404028352916020019161230c565b820191906000526020600020905b8154815290600101906020018083116122ef57829003601f168201915b505050505081565b61231c612763565b8060148190555050565b61232e612763565b8060138190555050565b61234384848461112a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123a55761236e84848484612aec565b6123a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6123b3612763565b80600b8190555050565b60606123c8826127e1565b612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe90613ce3565b60405180910390fd5b60001515601960039054906101000a900460ff16151514156124b557600e8054612430906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461245c906140d6565b80156124a95780601f1061247e576101008083540402835291602001916124a9565b820191906000526020600020905b81548152906001019060200180831161248c57829003601f168201915b50505050509050612511565b60006124bf612c4c565b905060008151116124df576040518060200160405280600081525061250d565b806124e984612cde565b600d6040516020016124fd93929190613b1c565b6040516020818303038152906040525b9150505b919050565b61251e612763565b8060188190555050565b60155481565b612536612763565b8060108190555050565b612548612763565b8060158190555050565b61255a612763565b8060168190555050565b60105481565b612572612763565b80601960036101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c8054612630906140d6565b80601f016020809104026020016040519081016040528092919081815260200182805461265c906140d6565b80156126a95780601f1061267e576101008083540402835291602001916126a9565b820191906000526020600020905b81548152906001019060200180831161268c57829003601f168201915b505050505081565b60115481565b60145481565b6126c5612763565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90613c63565b60405180910390fd5b61273e81612a26565b50565b612749612763565b80600c908051906020019061275f9291906131bc565b5050565b61276b6129e9565b73ffffffffffffffffffffffffffffffffffffffff16612789611e4a565b73ffffffffffffffffffffffffffffffffffffffff16146127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d690613cc3565b60405180910390fd5b565b6000816127ec612848565b111580156127fb575060005482105b8015612839575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612860612848565b116128e8576000548110156128e75760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156128e5575b60008114156128db5760046000836001900393508381526020019081526020016000205490506128b0565b809250505061291a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129a7868684612e8b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000826129fe8584612e94565b1490509392505050565b612a22828260405180602001604052806000815250612f10565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b12612840565b8786866040518563ffffffff1660e01b8152600401612b349493929190613b7d565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7f57506040513d601f19601f82011682018060405250810190612b7c9190613619565b60015b612bf9573d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b50600081511415612bf1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612c5b906140d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612c87906140d6565b8015612cd45780601f10612ca957610100808354040283529160200191612cd4565b820191906000526020600020905b815481529060010190602001808311612cb757829003601f168201915b5050505050905090565b60606000821415612d26576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e86565b600082905060005b60008214612d58578080612d4190614139565b915050600a82612d519190613f57565b9150612d2e565b60008167ffffffffffffffff811115612d9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dcc5781602001600182028036833780820191505090505b5090505b60008514612e7f57600182612de59190613fe2565b9150600a85612df491906141a6565b6030612e009190613f01565b60f81b818381518110612e3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e789190613f57565b9450612dd0565b8093505050505b919050565b60009392505050565b60008082905060005b8451811015612f0557612ef082868381518110612ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612fad565b91508080612efd90614139565b915050612e9d565b508091505092915050565b612f1a8383612fd8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612fa857600080549050600083820390505b612f5a6000868380600101945086612aec565b612f90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f47578160005414612fa557600080fd5b50505b505050565b6000818310612fc557612fc08284613195565b612fd0565b612fcf8383613195565b5b905092915050565b6000805490506000821415613019576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613026600084838561298a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061309d8361308e6000866000612990565b613097856131ac565b176129b8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461313e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613103565b50600082141561317a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061319060008483856129e3565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131c8906140d6565b90600052602060002090601f0160209004810192826131ea5760008555613231565b82601f1061320357805160ff1916838001178555613231565b82800160010185558215613231579182015b82811115613230578251825591602001919060010190613215565b5b50905061323e9190613242565b5090565b5b8082111561325b576000816000905550600101613243565b5090565b600061327261326d84613e03565b613dde565b90508281526020810184848401111561328a57600080fd5b613295848285614094565b509392505050565b60006132b06132ab84613e34565b613dde565b9050828152602081018484840111156132c857600080fd5b6132d3848285614094565b509392505050565b6000813590506132ea816144ec565b92915050565b60008083601f84011261330257600080fd5b8235905067ffffffffffffffff81111561331b57600080fd5b60208301915083602082028301111561333357600080fd5b9250929050565b60008135905061334981614503565b92915050565b60008135905061335e8161451a565b92915050565b60008135905061337381614531565b92915050565b60008151905061338881614531565b92915050565b600082601f83011261339f57600080fd5b81356133af84826020860161325f565b91505092915050565b600082601f8301126133c957600080fd5b81356133d984826020860161329d565b91505092915050565b6000813590506133f181614548565b92915050565b60006020828403121561340957600080fd5b6000613417848285016132db565b91505092915050565b6000806040838503121561343357600080fd5b6000613441858286016132db565b9250506020613452858286016132db565b9150509250929050565b60008060006060848603121561347157600080fd5b600061347f868287016132db565b9350506020613490868287016132db565b92505060406134a1868287016133e2565b9150509250925092565b600080600080608085870312156134c157600080fd5b60006134cf878288016132db565b94505060206134e0878288016132db565b93505060406134f1878288016133e2565b925050606085013567ffffffffffffffff81111561350e57600080fd5b61351a8782880161338e565b91505092959194509250565b6000806040838503121561353957600080fd5b6000613547858286016132db565b92505060206135588582860161333a565b9150509250929050565b6000806040838503121561357557600080fd5b6000613583858286016132db565b9250506020613594858286016133e2565b9150509250929050565b6000602082840312156135b057600080fd5b60006135be8482850161333a565b91505092915050565b6000602082840312156135d957600080fd5b60006135e78482850161334f565b91505092915050565b60006020828403121561360257600080fd5b600061361084828501613364565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613379565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133b8565b91505092915050565b60006020828403121561369557600080fd5b60006136a3848285016133e2565b91505092915050565b600080604083850312156136bf57600080fd5b60006136cd858286016133e2565b92505060206136de858286016132db565b9150509250929050565b6000806000604084860312156136fd57600080fd5b600061370b868287016133e2565b935050602084013567ffffffffffffffff81111561372857600080fd5b613734868287016132f0565b92509250509250925092565b600061374c8383613ae3565b60208301905092915050565b61376181614016565b82525050565b61377861377382614016565b614182565b82525050565b600061378982613e8a565b6137938185613eb8565b935061379e83613e65565b8060005b838110156137cf5781516137b68882613740565b97506137c183613eab565b9250506001810190506137a2565b5085935050505092915050565b6137e581614028565b82525050565b6137f481614034565b82525050565b600061380582613e95565b61380f8185613ec9565b935061381f8185602086016140a3565b61382881614293565b840191505092915050565b600061383e82613ea0565b6138488185613ee5565b93506138588185602086016140a3565b61386181614293565b840191505092915050565b600061387782613ea0565b6138818185613ef6565b93506138918185602086016140a3565b80840191505092915050565b600081546138aa816140d6565b6138b48186613ef6565b945060018216600081146138cf57600181146138e057613913565b60ff19831686528186019350613913565b6138e985613e75565b60005b8381101561390b578154818901526001820191506020810190506138ec565b838801955050505b50505092915050565b6000613929600e83613ee5565b9150613934826142b1565b602082019050919050565b600061394c602683613ee5565b9150613957826142da565b604082019050919050565b600061396f601483613ee5565b915061397a82614329565b602082019050919050565b6000613992601d83613ee5565b915061399d82614352565b602082019050919050565b60006139b5602083613ee5565b91506139c08261437b565b602082019050919050565b60006139d8602f83613ee5565b91506139e3826143a4565b604082019050919050565b60006139fb601583613ee5565b9150613a06826143f3565b602082019050919050565b6000613a1e600083613eda565b9150613a298261441c565b600082019050919050565b6000613a41601483613ee5565b9150613a4c8261441f565b602082019050919050565b6000613a64601983613ee5565b9150613a6f82614448565b602082019050919050565b6000613a87601583613ee5565b9150613a9282614471565b602082019050919050565b6000613aaa601f83613ee5565b9150613ab58261449a565b602082019050919050565b6000613acd601383613ee5565b9150613ad8826144c3565b602082019050919050565b613aec8161408a565b82525050565b613afb8161408a565b82525050565b6000613b0d8284613767565b60148201915081905092915050565b6000613b28828661386c565b9150613b34828561386c565b9150613b40828461389d565b9150819050949350505050565b6000613b5882613a11565b9150819050919050565b6000602082019050613b776000830184613758565b92915050565b6000608082019050613b926000830187613758565b613b9f6020830186613758565b613bac6040830185613af2565b8181036060830152613bbe81846137fa565b905095945050505050565b60006020820190508181036000830152613be3818461377e565b905092915050565b6000602082019050613c0060008301846137dc565b92915050565b6000602082019050613c1b60008301846137eb565b92915050565b60006020820190508181036000830152613c3b8184613833565b905092915050565b60006020820190508181036000830152613c5c8161391c565b9050919050565b60006020820190508181036000830152613c7c8161393f565b9050919050565b60006020820190508181036000830152613c9c81613962565b9050919050565b60006020820190508181036000830152613cbc81613985565b9050919050565b60006020820190508181036000830152613cdc816139a8565b9050919050565b60006020820190508181036000830152613cfc816139cb565b9050919050565b60006020820190508181036000830152613d1c816139ee565b9050919050565b60006020820190508181036000830152613d3c81613a34565b9050919050565b60006020820190508181036000830152613d5c81613a57565b9050919050565b60006020820190508181036000830152613d7c81613a7a565b9050919050565b60006020820190508181036000830152613d9c81613a9d565b9050919050565b60006020820190508181036000830152613dbc81613ac0565b9050919050565b6000602082019050613dd86000830184613af2565b92915050565b6000613de8613df9565b9050613df48282614108565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1e57613e1d614264565b5b613e2782614293565b9050602081019050919050565b600067ffffffffffffffff821115613e4f57613e4e614264565b5b613e5882614293565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f0c8261408a565b9150613f178361408a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f4c57613f4b6141d7565b5b828201905092915050565b6000613f628261408a565b9150613f6d8361408a565b925082613f7d57613f7c614206565b5b828204905092915050565b6000613f938261408a565b9150613f9e8361408a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fd757613fd66141d7565b5b828202905092915050565b6000613fed8261408a565b9150613ff88361408a565b92508282101561400b5761400a6141d7565b5b828203905092915050565b60006140218261406a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140c15780820151818401526020810190506140a6565b838111156140d0576000848401525b50505050565b600060028204905060018216806140ee57607f821691505b6020821081141561410257614101614235565b5b50919050565b61411182614293565b810181811067ffffffffffffffff821117156141305761412f614264565b5b80604052505050565b60006141448261408a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614177576141766141d7565b5b600182019050919050565b600061418d82614194565b9050919050565b600061419f826142a4565b9050919050565b60006141b18261408a565b91506141bc8361408a565b9250826141cc576141cb614206565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546865204f6753616c6520697320706175736564210000000000000000000000600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f546865205075626c696353616c65206973207061757365642100000000000000600082015250565b7f54686520576c53616c6520697320706175736564210000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6144f581614016565b811461450057600080fd5b50565b61450c81614028565b811461451757600080fd5b50565b61452381614034565b811461452e57600080fd5b50565b61453a8161403e565b811461454557600080fd5b50565b6145518161408a565b811461455c57600080fd5b5056fea26469706673582212200cb1cc2f0ad17f0c3b1b2e2c4cd4ffeb77f94c31d3bc65edc3dec43ad008a18464736f6c63430008040033

Deployed Bytecode Sourcemap

69044:8526:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75680:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36106:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37008:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43491:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42932:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75481:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73367:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32759:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69809:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69257:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47198:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69227:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70263:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70301:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75889:150;;;;;;;;;;;;;:::i;:::-;;70182:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50111:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76099:647;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74964:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73509:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70465:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69401:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70097:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70654:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73705:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71433:778;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38401:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33943:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14357:103;;;;;;;;;;;;;:::i;:::-;;72823:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73912:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70139:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70336:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13709:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75303:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69909:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37184:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73806:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72217:566;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69649:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44049:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74059:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69494:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74480:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74344:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50894:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74169:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76959:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75106:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69996:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75387:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74624:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74832:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69688:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73081:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44514:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69379:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69728:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69952:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14615:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73220:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75680:102;13595:13;:11;:13::i;:::-;75764:12:::1;75750:11;:26;;;;75680:102:::0;:::o;36106:639::-;36191:4;36530:10;36515:25;;:11;:25;;;;:102;;;;36607:10;36592:25;;:11;:25;;;;36515:102;:179;;;;36684:10;36669:25;;:11;:25;;;;36515:179;36495:199;;36106:639;;;:::o;37008:100::-;37062:13;37095:5;37088:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37008:100;:::o;43491:218::-;43567:7;43592:16;43600:7;43592;:16::i;:::-;43587:64;;43617:34;;;;;;;;;;;;;;43587:64;43671:15;:24;43687:7;43671:24;;;;;;;;;;;:30;;;;;;;;;;;;43664:37;;43491:218;;;:::o;42932:400::-;43013:13;43029:16;43037:7;43029;:16::i;:::-;43013:32;;43085:5;43062:28;;:19;:17;:19::i;:::-;:28;;;43058:175;;43110:44;43127:5;43134:19;:17;:19::i;:::-;43110:16;:44::i;:::-;43105:128;;43182:35;;;;;;;;;;;;;;43105:128;43058:175;43278:2;43245:15;:24;43261:7;43245:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43316:7;43312:2;43296:28;;43305:5;43296:28;;;;;;;;;;;;42932:400;;;:::o;75481:86::-;13595:13;:11;:13::i;:::-;75553:8:::1;75543:7;:18;;;;75481:86:::0;:::o;73367:100::-;13595:13;:11;:13::i;:::-;73451:10:::1;73439:9;:22;;;;;;;;;;;;:::i;:::-;;73367:100:::0;:::o;32759:323::-;32820:7;33048:15;:13;:15::i;:::-;33033:12;;33017:13;;:28;:46;33010:53;;32759:323;:::o;69809:33::-;;;;:::o;69257:27::-;;;;:::o;47198:2817::-;47332:27;47362;47381:7;47362:18;:27::i;:::-;47332:57;;47447:4;47406:45;;47422:19;47406:45;;;47402:86;;47460:28;;;;;;;;;;;;;;47402:86;47502:27;47531:23;47558:35;47585:7;47558:26;:35::i;:::-;47501:92;;;;47693:68;47718:15;47735:4;47741:19;:17;:19::i;:::-;47693:24;:68::i;:::-;47688:180;;47781:43;47798:4;47804:19;:17;:19::i;:::-;47781:16;:43::i;:::-;47776:92;;47833:35;;;;;;;;;;;;;;47776:92;47688:180;47899:1;47885:16;;:2;:16;;;47881:52;;;47910:23;;;;;;;;;;;;;;47881:52;47946:43;47968:4;47974:2;47978:7;47987:1;47946:21;:43::i;:::-;48082:15;48079:2;;;48222:1;48201:19;48194:30;48079:2;48619:18;:24;48638:4;48619:24;;;;;;;;;;;;;;;;48617:26;;;;;;;;;;;;48688:18;:22;48707:2;48688:22;;;;;;;;;;;;;;;;48686:24;;;;;;;;;;;49010:146;49047:2;49096:45;49111:4;49117:2;49121:19;49096:14;:45::i;:::-;29158:8;49068:73;49010:18;:146::i;:::-;48981:17;:26;48999:7;48981:26;;;;;;;;;;;:175;;;;49327:1;29158:8;49276:19;:47;:52;49272:627;;;49349:19;49381:1;49371:7;:11;49349:33;;49538:1;49504:17;:30;49522:11;49504:30;;;;;;;;;;;;:35;49500:384;;;49642:13;;49627:11;:28;49623:242;;49822:19;49789:17;:30;49807:11;49789:30;;;;;;;;;;;:52;;;;49623:242;49500:384;49272:627;;49946:7;49942:2;49927:27;;49936:4;49927:27;;;;;;;;;;;;49965:42;49986:4;49992:2;49996:7;50005:1;49965:20;:42::i;:::-;47198:2817;;;;;;:::o;69227:25::-;;;;:::o;70263:33::-;;;;;;;;;;;;;:::o;70301:30::-;;;;;;;;;;;;;:::o;75889:150::-;13595:13;:11;:13::i;:::-;1909:1:::1;2507:7;;:19;;2499:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1909:1;2640:7;:18;;;;75947:7:::2;75968;:5;:7::i;:::-;75960:21;;75989;75960:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75946:69;;;76030:2;76022:11;;;::::0;::::2;;2671:1;1865::::1;2819:7;:22;;;;75889:150::o:0;70182:38::-;;;;:::o;50111:185::-;50249:39;50266:4;50272:2;50276:7;50249:39;;;;;;;;;;;;:16;:39::i;:::-;50111:185;;;:::o;76099:647::-;76159:16;76186:23;76212:17;76222:6;76212:9;:17::i;:::-;76186:43;;76238:30;76285:15;76271:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76238:63;;76310:22;76335:1;76310:26;;76345:23;76383:327;76408:15;76390;:33;:66;;;;;76445:11;;76427:14;:29;;76390:66;76383:327;;;76469:25;76497:23;76505:14;76497:7;:23::i;:::-;76469:51;;76558:6;76537:27;;:17;:27;;;76533:141;;;76614:14;76581:13;76595:15;76581:30;;;;;;;;;;;;;;;;;;;;;:47;;;;;76645:17;;;;;:::i;:::-;;;;76533:141;76684:16;;;;;:::i;:::-;;;;76383:327;;;;76725:13;76718:20;;;;;;76099:647;;;:::o;74964:134::-;13595:13;:11;:13::i;:::-;75072:20:::1;75050:19;:42;;;;74964:134:::0;:::o;73509:132::-;13595:13;:11;:13::i;:::-;73617:18:::1;73597:17;:38;;;;;;;;;;;;:::i;:::-;;73509:132:::0;:::o;70465:28::-;;;;;;;;;;;;;:::o;69401:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70097:37::-;;;;:::o;70654:773::-;70787:6;;;;;;;;;;;70779:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;70826:12;70868;:10;:12::i;:::-;70851:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;70841:41;;;;;;70826:56;;70897:52;70916:12;;70897:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70930:12;;70944:4;70897:18;:52::i;:::-;70889:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;71030:1;71016:11;:15;:54;;;;;71050:20;;71035:11;:35;;71016:54;71008:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71141:11;;71126;71110:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;71102:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;71231:19;;71216:11;71192:21;71202:10;71192:9;:21::i;:::-;:35;;;;:::i;:::-;:58;;71184:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;71322:11;71312:7;;:21;;;;:::i;:::-;71299:9;:34;;71291:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71385:36;71395:12;:10;:12::i;:::-;71409:11;71385:9;:36::i;:::-;70654:773;;;;:::o;73705:95::-;13595:13;:11;:13::i;:::-;73783:11:::1;73770:10;;:24;;;;;;;;;;;;;;;;;;73705:95:::0;:::o;71433:778::-;71566:13;;;;;;;;;;;71558:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;71612:12;71654;:10;:12::i;:::-;71637:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;71627:41;;;;;;71612:56;;71683:50;71702:12;;71683:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71716:10;;71728:4;71683:18;:50::i;:::-;71675:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;71814:1;71800:11;:15;:54;;;;;71834:20;;71819:11;:35;;71800:54;71792:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71925:11;;71910;71894:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;71886:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;72015:19;;72000:11;71976:21;71986:10;71976:9;:21::i;:::-;:35;;;;:::i;:::-;:58;;71968:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;72106:11;72096:7;;:21;;;;:::i;:::-;72083:9;:34;;72075:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;72169:36;72179:12;:10;:12::i;:::-;72193:11;72169:9;:36::i;:::-;71433:778;;;;:::o;38401:152::-;38473:7;38516:27;38535:7;38516:18;:27::i;:::-;38493:52;;38401:152;;;:::o;33943:233::-;34015:7;34056:1;34039:19;;:5;:19;;;34035:60;;;34067:28;;;;;;;;;;;;;;34035:60;28102:13;34113:18;:25;34132:5;34113:25;;;;;;;;;;;;;;;;:55;34106:62;;33943:233;;;:::o;14357:103::-;13595:13;:11;:13::i;:::-;14422:30:::1;14449:1;14422:18;:30::i;:::-;14357:103::o:0;72823:202::-;13595:13;:11;:13::i;:::-;72943:11:::1;;72928;72912:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;72904:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;72986:33;72996:9;73007:11;72986:9;:33::i;:::-;72823:202:::0;;:::o;73912:79::-;13595:13;:11;:13::i;:::-;73978:7:::1;73969:6;;:16;;;;;;;;;;;;;;;;;;73912:79:::0;:::o;70139:38::-;;;;:::o;70336:26::-;;;;;;;;;;;;;:::o;13709:87::-;13755:7;13782:6;;;;;;;;;;;13775:13;;13709:87;:::o;75303:78::-;13595:13;:11;:13::i;:::-;75369:6:::1;75361:5;:14;;;;75303:78:::0;:::o;69909:38::-;;;;:::o;37184:104::-;37240:13;37273:7;37266:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37184:104;:::o;73806:100::-;13595:13;:11;:13::i;:::-;73886:14:::1;73870:13;;:30;;;;;;;;;;;;;;;;;;73806:100:::0;:::o;72217:566::-;72323:10;;;;;;;;;;;72315:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;72392:1;72378:11;:15;:52;;;;;72412:18;;72397:11;:33;;72378:52;72370:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;72501:11;;72486;72470:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;72462:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;72591:17;;72576:11;72552:21;72562:10;72552:9;:21::i;:::-;:35;;;;:::i;:::-;:56;;72544:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;72678:11;72670:5;;:19;;;;:::i;:::-;72657:9;:32;;72649:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;72741:36;72751:12;:10;:12::i;:::-;72765:11;72741:9;:36::i;:::-;72217:566;:::o;69649:34::-;;;;:::o;44049:308::-;44160:19;:17;:19::i;:::-;44148:31;;:8;:31;;;44144:61;;;44188:17;;;;;;;;;;;;;;44144:61;44270:8;44218:18;:39;44237:19;:17;:19::i;:::-;44218:39;;;;;;;;;;;;;;;:49;44258:8;44218:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;44330:8;44294:55;;44309:19;:17;:19::i;:::-;44294:55;;;44340:8;44294:55;;;;;;:::i;:::-;;;;;;;;44049:308;;:::o;74059:104::-;13595:13;:11;:13::i;:::-;74146:11:::1;74133:10;:24;;;;74059:104:::0;:::o;69494:101::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74480:138::-;13595:13;:11;:13::i;:::-;74591:21:::1;74568:20;:44;;;;74480:138:::0;:::o;74344:130::-;13595:13;:11;:13::i;:::-;74449:19:::1;74428:18;:40;;;;74344:130:::0;:::o;50894:399::-;51061:31;51074:4;51080:2;51084:7;51061:12;:31::i;:::-;51125:1;51107:2;:14;;;:19;51103:183;;51146:56;51177:4;51183:2;51187:7;51196:5;51146:30;:56::i;:::-;51141:145;;51230:40;;;;;;;;;;;;;;51141:145;51103:183;50894:399;;;;:::o;74169:110::-;13595:13;:11;:13::i;:::-;74260::::1;74245:12;:28;;;;74169:110:::0;:::o;76959:445::-;77033:13;77063:17;77071:8;77063:7;:17::i;:::-;77055:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;77157:5;77145:17;;:8;;;;;;;;;;;:17;;;77141:64;;;77180:17;77173:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77141:64;77213:28;77244:10;:8;:10::i;:::-;77213:41;;77299:1;77274:14;77268:28;:32;:130;;;;;;;;;;;;;;;;;77336:14;77352:19;:8;:17;:19::i;:::-;77373:9;77319:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77268:130;77261:137;;;76959:445;;;;:::o;75106:134::-;13595:13;:11;:13::i;:::-;75214:20:::1;75192:19;:42;;;;75106:134:::0;:::o;69996:39::-;;;;:::o;75387:86::-;13595:13;:11;:13::i;:::-;75459:8:::1;75449:7;:18;;;;75387:86:::0;:::o;74624:138::-;13595:13;:11;:13::i;:::-;74735:21:::1;74712:20;:44;;;;74624:138:::0;:::o;74832:126::-;13595:13;:11;:13::i;:::-;74934:18:::1;74914:17;:38;;;;74832:126:::0;:::o;69688:35::-;;;;:::o;73081:81::-;13595:13;:11;:13::i;:::-;73150:6:::1;73139:8;;:17;;;;;;;;;;;;;;;;;;73081:81:::0;:::o;44514:164::-;44611:4;44635:18;:25;44654:5;44635:25;;;;;;;;;;;;;;;:35;44661:8;44635:35;;;;;;;;;;;;;;;;;;;;;;;;;44628:42;;44514:164;;;;:::o;69379:17::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69728:32::-;;;;:::o;69952:39::-;;;;:::o;14615:201::-;13595:13;:11;:13::i;:::-;14724:1:::1;14704:22;;:8;:22;;;;14696:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14780:28;14799:8;14780:18;:28::i;:::-;14615:201:::0;:::o;73220:76::-;13595:13;:11;:13::i;:::-;73286:4:::1;73280:3;:10;;;;;;;;;;;;:::i;:::-;;73220:76:::0;:::o;13874:132::-;13949:12;:10;:12::i;:::-;13938:23;;:7;:5;:7::i;:::-;:23;;;13930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13874:132::o;44936:282::-;45001:4;45057:7;45038:15;:13;:15::i;:::-;:26;;:66;;;;;45091:13;;45081:7;:23;45038:66;:153;;;;;45190:1;28878:8;45142:17;:26;45160:7;45142:26;;;;;;;;;;;;:44;:49;45038:153;45018:173;;44936:282;;;:::o;66702:105::-;66762:7;66789:10;66782:17;;66702:105;:::o;76802:95::-;76867:7;76890:1;76883:8;;76802:95;:::o;39556:1275::-;39623:7;39643:12;39658:7;39643:22;;39726:4;39707:15;:13;:15::i;:::-;:23;39703:1061;;39760:13;;39753:4;:20;39749:1015;;;39798:14;39815:17;:23;39833:4;39815:23;;;;;;;;;;;;39798:40;;39932:1;28878:8;39904:6;:24;:29;39900:845;;;40569:113;40586:1;40576:6;:11;40569:113;;;40629:17;:25;40647:6;;;;;;;40629:25;;;;;;;;;;;;40620:34;;40569:113;;;40715:6;40708:13;;;;;;39900:845;39749:1015;;39703:1061;40792:31;;;;;;;;;;;;;;39556:1275;;;;:::o;46099:479::-;46201:27;46230:23;46271:38;46312:15;:24;46328:7;46312:24;;;;;;;;;;;46271:65;;46483:18;46460:41;;46540:19;46534:26;46515:45;;46445:126;;;;:::o;45327:659::-;45476:11;45641:16;45634:5;45630:28;45621:37;;45801:16;45790:9;45786:32;45773:45;;45951:15;45940:9;45937:30;45929:5;45918:9;45915:20;45912:56;45902:66;;45509:470;;;;;:::o;51955:159::-;;;;;:::o;66011:311::-;66146:7;66166:16;29282:3;66192:19;:41;;66166:68;;29282:3;66260:31;66271:4;66277:2;66281:9;66260:10;:31::i;:::-;66252:40;;:62;;66245:69;;;66011:311;;;;;:::o;41379:450::-;41459:14;41627:16;41620:5;41616:28;41607:37;;41804:5;41790:11;41765:23;41761:41;41758:52;41751:5;41748:63;41738:73;;41495:327;;;;:::o;52779:158::-;;;;;:::o;12260:98::-;12313:7;12340:10;12333:17;;12260:98;:::o;4075:190::-;4200:4;4253;4224:25;4237:5;4244:4;4224:12;:25::i;:::-;:33;4217:40;;4075:190;;;;;:::o;60534:112::-;60611:27;60621:2;60625:8;60611:27;;;;;;;;;;;;:9;:27::i;:::-;60534:112;;:::o;14976:191::-;15050:16;15069:6;;;;;;;;;;;15050:25;;15095:8;15086:6;;:17;;;;;;;;;;;;;;;;;;15150:8;15119:40;;15140:8;15119:40;;;;;;;;;;;;14976:191;;:::o;53377:716::-;53540:4;53586:2;53561:45;;;53607:19;:17;:19::i;:::-;53628:4;53634:7;53643:5;53561:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53557:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53861:1;53844:6;:13;:18;53840:235;;;53890:40;;;;;;;;;;;;;;53840:235;54033:6;54027:13;54018:6;54014:2;54010:15;54003:38;53557:529;53730:54;;;53720:64;;;:6;:64;;;;53713:71;;;53377:716;;;;;;:::o;77469:98::-;77529:13;77558:3;77551:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77469:98;:::o;15604:723::-;15660:13;15890:1;15881:5;:10;15877:53;;;15908:10;;;;;;;;;;;;;;;;;;;;;15877:53;15940:12;15955:5;15940:20;;15971:14;15996:78;16011:1;16003:4;:9;15996:78;;16029:8;;;;;:::i;:::-;;;;16060:2;16052:10;;;;;:::i;:::-;;;15996:78;;;16084:19;16116:6;16106:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16084:39;;16134:154;16150:1;16141:5;:10;16134:154;;16178:1;16168:11;;;;;:::i;:::-;;;16245:2;16237:5;:10;;;;:::i;:::-;16224:2;:24;;;;:::i;:::-;16211:39;;16194:6;16201;16194:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16274:2;16265:11;;;;;:::i;:::-;;;16134:154;;;16312:6;16298:21;;;;;15604:723;;;;:::o;65712:147::-;65849:6;65712:147;;;;;:::o;4942:296::-;5025:7;5045:20;5068:4;5045:27;;5088:9;5083:118;5107:5;:12;5103:1;:16;5083:118;;;5156:33;5166:12;5180:5;5186:1;5180:8;;;;;;;;;;;;;;;;;;;;;;5156:9;:33::i;:::-;5141:48;;5121:3;;;;;:::i;:::-;;;;5083:118;;;;5218:12;5211:19;;;4942:296;;;;:::o;59761:689::-;59892:19;59898:2;59902:8;59892:5;:19::i;:::-;59971:1;59953:2;:14;;;:19;59949:483;;59993:11;60007:13;;59993:27;;60039:13;60061:8;60055:3;:14;60039:30;;60088:233;60119:62;60158:1;60162:2;60166:7;;;;;;60175:5;60119:30;:62::i;:::-;60114:167;;60217:40;;;;;;;;;;;;;;60114:167;60316:3;60308:5;:11;60088:233;;60403:3;60386:13;;:20;60382:34;;60408:8;;;60382:34;59949:483;;;59761:689;;;:::o;11149:149::-;11212:7;11243:1;11239;:5;:51;;11270:20;11285:1;11288;11270:14;:20::i;:::-;11239:51;;;11247:20;11262:1;11265;11247:14;:20::i;:::-;11239:51;11232:58;;11149:149;;;;:::o;54555:2454::-;54628:20;54651:13;;54628:36;;54691:1;54679:8;:13;54675:44;;;54701:18;;;;;;;;;;;;;;54675:44;54732:61;54762:1;54766:2;54770:12;54784:8;54732:21;:61::i;:::-;55276:1;28240:2;55246:1;:26;;55245:32;55233:8;:45;55207:18;:22;55226:2;55207:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;55555:139;55592:2;55646:33;55669:1;55673:2;55677:1;55646:14;:33::i;:::-;55613:30;55634:8;55613:20;:30::i;:::-;:66;55555:18;:139::i;:::-;55521:17;:31;55539:12;55521:31;;;;;;;;;;;:173;;;;55711:16;55742:11;55771:8;55756:12;:23;55742:37;;56026:16;56022:2;56018:25;56006:37;;56398:12;56358:8;56317:1;56255:25;56196:1;56135;56108:335;56523:1;56509:12;56505:20;56463:346;56564:3;56555:7;56552:16;56463:346;;56782:7;56772:8;56769:1;56742:25;56739:1;56736;56731:59;56617:1;56608:7;56604:15;56593:26;;56463:346;;;56467:77;56854:1;56842:8;:13;56838:45;;;56864:19;;;;;;;;;;;;;;56838:45;56916:3;56900:13;:19;;;;54555:2454;;56941:60;56970:1;56974:2;56978:12;56992:8;56941:20;:60::i;:::-;54555:2454;;;:::o;11306:268::-;11374:13;11481:1;11475:4;11468:15;11510:1;11504:4;11497:15;11551:4;11545;11535:21;11526:30;;11453:114;;;;:::o;41931:324::-;42001:14;42234:1;42224:8;42221:15;42195:24;42191:46;42181:56;;42103:145;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;2445:5;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;2603:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;2880:6;2888;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;3302:6;3310;3318;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;3878:6;3886;3894;3902;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:401::-;4663:6;4671;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4779:1;4804:53;4849:7;4840:6;4829:9;4825:22;4804:53;:::i;:::-;4794:63;;4750:117;4906:2;4932:50;4974:7;4965:6;4954:9;4950:22;4932:50;:::i;:::-;4922:60;;4877:115;4678:321;;;;;:::o;5005:407::-;5073:6;5081;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;5088:324;;;;;:::o;5418:256::-;5474:6;5523:2;5511:9;5502:7;5498:23;5494:32;5491:2;;;5539:1;5536;5529:12;5491:2;5582:1;5607:50;5649:7;5640:6;5629:9;5625:22;5607:50;:::i;:::-;5597:60;;5553:114;5481:193;;;;:::o;5680:262::-;5739:6;5788:2;5776:9;5767:7;5763:23;5759:32;5756:2;;;5804:1;5801;5794:12;5756:2;5847:1;5872:53;5917:7;5908:6;5897:9;5893:22;5872:53;:::i;:::-;5862:63;;5818:117;5746:196;;;;:::o;5948:260::-;6006:6;6055:2;6043:9;6034:7;6030:23;6026:32;6023:2;;;6071:1;6068;6061:12;6023:2;6114:1;6139:52;6183:7;6174:6;6163:9;6159:22;6139:52;:::i;:::-;6129:62;;6085:116;6013:195;;;;:::o;6214:282::-;6283:6;6332:2;6320:9;6311:7;6307:23;6303:32;6300:2;;;6348:1;6345;6338:12;6300:2;6391:1;6416:63;6471:7;6462:6;6451:9;6447:22;6416:63;:::i;:::-;6406:73;;6362:127;6290:206;;;;:::o;6502:375::-;6571:6;6620:2;6608:9;6599:7;6595:23;6591:32;6588:2;;;6636:1;6633;6626:12;6588:2;6707:1;6696:9;6692:17;6679:31;6737:18;6729:6;6726:30;6723:2;;;6769:1;6766;6759:12;6723:2;6797:63;6852:7;6843:6;6832:9;6828:22;6797:63;:::i;:::-;6787:73;;6650:220;6578:299;;;;:::o;6883:262::-;6942:6;6991:2;6979:9;6970:7;6966:23;6962:32;6959:2;;;7007:1;7004;6997:12;6959:2;7050:1;7075:53;7120:7;7111:6;7100:9;7096:22;7075:53;:::i;:::-;7065:63;;7021:117;6949:196;;;;:::o;7151:407::-;7219:6;7227;7276:2;7264:9;7255:7;7251:23;7247:32;7244:2;;;7292:1;7289;7282:12;7244:2;7335:1;7360:53;7405:7;7396:6;7385:9;7381:22;7360:53;:::i;:::-;7350:63;;7306:117;7462:2;7488:53;7533:7;7524:6;7513:9;7509:22;7488:53;:::i;:::-;7478:63;;7433:118;7234:324;;;;;:::o;7564:570::-;7659:6;7667;7675;7724:2;7712:9;7703:7;7699:23;7695:32;7692:2;;;7740:1;7737;7730:12;7692:2;7783:1;7808:53;7853:7;7844:6;7833:9;7829:22;7808:53;:::i;:::-;7798:63;;7754:117;7938:2;7927:9;7923:18;7910:32;7969:18;7961:6;7958:30;7955:2;;;8001:1;7998;7991:12;7955:2;8037:80;8109:7;8100:6;8089:9;8085:22;8037:80;:::i;:::-;8019:98;;;;7881:246;7682:452;;;;;:::o;8140:179::-;8209:10;8230:46;8272:3;8264:6;8230:46;:::i;:::-;8308:4;8303:3;8299:14;8285:28;;8220:99;;;;:::o;8325:118::-;8412:24;8430:5;8412:24;:::i;:::-;8407:3;8400:37;8390:53;;:::o;8449:157::-;8554:45;8574:24;8592:5;8574:24;:::i;:::-;8554:45;:::i;:::-;8549:3;8542:58;8532:74;;:::o;8642:732::-;8761:3;8790:54;8838:5;8790:54;:::i;:::-;8860:86;8939:6;8934:3;8860:86;:::i;:::-;8853:93;;8970:56;9020:5;8970:56;:::i;:::-;9049:7;9080:1;9065:284;9090:6;9087:1;9084:13;9065:284;;;9166:6;9160:13;9193:63;9252:3;9237:13;9193:63;:::i;:::-;9186:70;;9279:60;9332:6;9279:60;:::i;:::-;9269:70;;9125:224;9112:1;9109;9105:9;9100:14;;9065:284;;;9069:14;9365:3;9358:10;;8766:608;;;;;;;:::o;9380:109::-;9461:21;9476:5;9461:21;:::i;:::-;9456:3;9449:34;9439:50;;:::o;9495:118::-;9582:24;9600:5;9582:24;:::i;:::-;9577:3;9570:37;9560:53;;:::o;9619:360::-;9705:3;9733:38;9765:5;9733:38;:::i;:::-;9787:70;9850:6;9845:3;9787:70;:::i;:::-;9780:77;;9866:52;9911:6;9906:3;9899:4;9892:5;9888:16;9866:52;:::i;:::-;9943:29;9965:6;9943:29;:::i;:::-;9938:3;9934:39;9927:46;;9709:270;;;;;:::o;9985:364::-;10073:3;10101:39;10134:5;10101:39;:::i;:::-;10156:71;10220:6;10215:3;10156:71;:::i;:::-;10149:78;;10236:52;10281:6;10276:3;10269:4;10262:5;10258:16;10236:52;:::i;:::-;10313:29;10335:6;10313:29;:::i;:::-;10308:3;10304:39;10297:46;;10077:272;;;;;:::o;10355:377::-;10461:3;10489:39;10522:5;10489:39;:::i;:::-;10544:89;10626:6;10621:3;10544:89;:::i;:::-;10537:96;;10642:52;10687:6;10682:3;10675:4;10668:5;10664:16;10642:52;:::i;:::-;10719:6;10714:3;10710:16;10703:23;;10465:267;;;;;:::o;10762:845::-;10865:3;10902:5;10896:12;10931:36;10957:9;10931:36;:::i;:::-;10983:89;11065:6;11060:3;10983:89;:::i;:::-;10976:96;;11103:1;11092:9;11088:17;11119:1;11114:137;;;;11265:1;11260:341;;;;11081:520;;11114:137;11198:4;11194:9;11183;11179:25;11174:3;11167:38;11234:6;11229:3;11225:16;11218:23;;11114:137;;11260:341;11327:38;11359:5;11327:38;:::i;:::-;11387:1;11401:154;11415:6;11412:1;11409:13;11401:154;;;11489:7;11483:14;11479:1;11474:3;11470:11;11463:35;11539:1;11530:7;11526:15;11515:26;;11437:4;11434:1;11430:12;11425:17;;11401:154;;;11584:6;11579:3;11575:16;11568:23;;11267:334;;11081:520;;10869:738;;;;;;:::o;11613:366::-;11755:3;11776:67;11840:2;11835:3;11776:67;:::i;:::-;11769:74;;11852:93;11941:3;11852:93;:::i;:::-;11970:2;11965:3;11961:12;11954:19;;11759:220;;;:::o;11985:366::-;12127:3;12148:67;12212:2;12207:3;12148:67;:::i;:::-;12141:74;;12224:93;12313:3;12224:93;:::i;:::-;12342:2;12337:3;12333:12;12326:19;;12131:220;;;:::o;12357:366::-;12499:3;12520:67;12584:2;12579:3;12520:67;:::i;:::-;12513:74;;12596:93;12685:3;12596:93;:::i;:::-;12714:2;12709:3;12705:12;12698:19;;12503:220;;;:::o;12729:366::-;12871:3;12892:67;12956:2;12951:3;12892:67;:::i;:::-;12885:74;;12968:93;13057:3;12968:93;:::i;:::-;13086:2;13081:3;13077:12;13070:19;;12875:220;;;:::o;13101:366::-;13243:3;13264:67;13328:2;13323:3;13264:67;:::i;:::-;13257:74;;13340:93;13429:3;13340:93;:::i;:::-;13458:2;13453:3;13449:12;13442:19;;13247:220;;;:::o;13473:366::-;13615:3;13636:67;13700:2;13695:3;13636:67;:::i;:::-;13629:74;;13712:93;13801:3;13712:93;:::i;:::-;13830:2;13825:3;13821:12;13814:19;;13619:220;;;:::o;13845:366::-;13987:3;14008:67;14072:2;14067:3;14008:67;:::i;:::-;14001:74;;14084:93;14173:3;14084:93;:::i;:::-;14202:2;14197:3;14193:12;14186:19;;13991:220;;;:::o;14217:398::-;14376:3;14397:83;14478:1;14473:3;14397:83;:::i;:::-;14390:90;;14489:93;14578:3;14489:93;:::i;:::-;14607:1;14602:3;14598:11;14591:18;;14380:235;;;:::o;14621:366::-;14763:3;14784:67;14848:2;14843:3;14784:67;:::i;:::-;14777:74;;14860:93;14949:3;14860:93;:::i;:::-;14978:2;14973:3;14969:12;14962:19;;14767:220;;;:::o;14993:366::-;15135:3;15156:67;15220:2;15215:3;15156:67;:::i;:::-;15149:74;;15232:93;15321:3;15232:93;:::i;:::-;15350:2;15345:3;15341:12;15334:19;;15139:220;;;:::o;15365:366::-;15507:3;15528:67;15592:2;15587:3;15528:67;:::i;:::-;15521:74;;15604:93;15693:3;15604:93;:::i;:::-;15722:2;15717:3;15713:12;15706:19;;15511:220;;;:::o;15737:366::-;15879:3;15900:67;15964:2;15959:3;15900:67;:::i;:::-;15893:74;;15976:93;16065:3;15976:93;:::i;:::-;16094:2;16089:3;16085:12;16078:19;;15883:220;;;:::o;16109:366::-;16251:3;16272:67;16336:2;16331:3;16272:67;:::i;:::-;16265:74;;16348:93;16437:3;16348:93;:::i;:::-;16466:2;16461:3;16457:12;16450:19;;16255:220;;;:::o;16481:108::-;16558:24;16576:5;16558:24;:::i;:::-;16553:3;16546:37;16536:53;;:::o;16595:118::-;16682:24;16700:5;16682:24;:::i;:::-;16677:3;16670:37;16660:53;;:::o;16719:256::-;16831:3;16846:75;16917:3;16908:6;16846:75;:::i;:::-;16946:2;16941:3;16937:12;16930:19;;16966:3;16959:10;;16835:140;;;;:::o;16981:589::-;17206:3;17228:95;17319:3;17310:6;17228:95;:::i;:::-;17221:102;;17340:95;17431:3;17422:6;17340:95;:::i;:::-;17333:102;;17452:92;17540:3;17531:6;17452:92;:::i;:::-;17445:99;;17561:3;17554:10;;17210:360;;;;;;:::o;17576:379::-;17760:3;17782:147;17925:3;17782:147;:::i;:::-;17775:154;;17946:3;17939:10;;17764:191;;;:::o;17961:222::-;18054:4;18092:2;18081:9;18077:18;18069:26;;18105:71;18173:1;18162:9;18158:17;18149:6;18105:71;:::i;:::-;18059:124;;;;:::o;18189:640::-;18384:4;18422:3;18411:9;18407:19;18399:27;;18436:71;18504:1;18493:9;18489:17;18480:6;18436:71;:::i;:::-;18517:72;18585:2;18574:9;18570:18;18561:6;18517:72;:::i;:::-;18599;18667:2;18656:9;18652:18;18643:6;18599:72;:::i;:::-;18718:9;18712:4;18708:20;18703:2;18692:9;18688:18;18681:48;18746:76;18817:4;18808:6;18746:76;:::i;:::-;18738:84;;18389:440;;;;;;;:::o;18835:373::-;18978:4;19016:2;19005:9;19001:18;18993:26;;19065:9;19059:4;19055:20;19051:1;19040:9;19036:17;19029:47;19093:108;19196:4;19187:6;19093:108;:::i;:::-;19085:116;;18983:225;;;;:::o;19214:210::-;19301:4;19339:2;19328:9;19324:18;19316:26;;19352:65;19414:1;19403:9;19399:17;19390:6;19352:65;:::i;:::-;19306:118;;;;:::o;19430:222::-;19523:4;19561:2;19550:9;19546:18;19538:26;;19574:71;19642:1;19631:9;19627:17;19618:6;19574:71;:::i;:::-;19528:124;;;;:::o;19658:313::-;19771:4;19809:2;19798:9;19794:18;19786:26;;19858:9;19852:4;19848:20;19844:1;19833:9;19829:17;19822:47;19886:78;19959:4;19950:6;19886:78;:::i;:::-;19878:86;;19776:195;;;;:::o;19977:419::-;20143:4;20181:2;20170:9;20166:18;20158:26;;20230:9;20224:4;20220:20;20216:1;20205:9;20201:17;20194:47;20258:131;20384:4;20258:131;:::i;:::-;20250:139;;20148:248;;;:::o;20402:419::-;20568:4;20606:2;20595:9;20591:18;20583:26;;20655:9;20649:4;20645:20;20641:1;20630:9;20626:17;20619:47;20683:131;20809:4;20683:131;:::i;:::-;20675:139;;20573:248;;;:::o;20827:419::-;20993:4;21031:2;21020:9;21016:18;21008:26;;21080:9;21074:4;21070:20;21066:1;21055:9;21051:17;21044:47;21108:131;21234:4;21108:131;:::i;:::-;21100:139;;20998:248;;;:::o;21252:419::-;21418:4;21456:2;21445:9;21441:18;21433:26;;21505:9;21499:4;21495:20;21491:1;21480:9;21476:17;21469:47;21533:131;21659:4;21533:131;:::i;:::-;21525:139;;21423:248;;;:::o;21677:419::-;21843:4;21881:2;21870:9;21866:18;21858:26;;21930:9;21924:4;21920:20;21916:1;21905:9;21901:17;21894:47;21958:131;22084:4;21958:131;:::i;:::-;21950:139;;21848:248;;;:::o;22102:419::-;22268:4;22306:2;22295:9;22291:18;22283:26;;22355:9;22349:4;22345:20;22341:1;22330:9;22326:17;22319:47;22383:131;22509:4;22383:131;:::i;:::-;22375:139;;22273:248;;;:::o;22527:419::-;22693:4;22731:2;22720:9;22716:18;22708:26;;22780:9;22774:4;22770:20;22766:1;22755:9;22751:17;22744:47;22808:131;22934:4;22808:131;:::i;:::-;22800:139;;22698:248;;;:::o;22952:419::-;23118:4;23156:2;23145:9;23141:18;23133:26;;23205:9;23199:4;23195:20;23191:1;23180:9;23176:17;23169:47;23233:131;23359:4;23233:131;:::i;:::-;23225:139;;23123:248;;;:::o;23377:419::-;23543:4;23581:2;23570:9;23566:18;23558:26;;23630:9;23624:4;23620:20;23616:1;23605:9;23601:17;23594:47;23658:131;23784:4;23658:131;:::i;:::-;23650:139;;23548:248;;;:::o;23802:419::-;23968:4;24006:2;23995:9;23991:18;23983:26;;24055:9;24049:4;24045:20;24041:1;24030:9;24026:17;24019:47;24083:131;24209:4;24083:131;:::i;:::-;24075:139;;23973:248;;;:::o;24227:419::-;24393:4;24431:2;24420:9;24416:18;24408:26;;24480:9;24474:4;24470:20;24466:1;24455:9;24451:17;24444:47;24508:131;24634:4;24508:131;:::i;:::-;24500:139;;24398:248;;;:::o;24652:419::-;24818:4;24856:2;24845:9;24841:18;24833:26;;24905:9;24899:4;24895:20;24891:1;24880:9;24876:17;24869:47;24933:131;25059:4;24933:131;:::i;:::-;24925:139;;24823:248;;;:::o;25077:222::-;25170:4;25208:2;25197:9;25193:18;25185:26;;25221:71;25289:1;25278:9;25274:17;25265:6;25221:71;:::i;:::-;25175:124;;;;:::o;25305:129::-;25339:6;25366:20;;:::i;:::-;25356:30;;25395:33;25423:4;25415:6;25395:33;:::i;:::-;25346:88;;;:::o;25440:75::-;25473:6;25506:2;25500:9;25490:19;;25480:35;:::o;25521:307::-;25582:4;25672:18;25664:6;25661:30;25658:2;;;25694:18;;:::i;:::-;25658:2;25732:29;25754:6;25732:29;:::i;:::-;25724:37;;25816:4;25810;25806:15;25798:23;;25587:241;;;:::o;25834:308::-;25896:4;25986:18;25978:6;25975:30;25972:2;;;26008:18;;:::i;:::-;25972:2;26046:29;26068:6;26046:29;:::i;:::-;26038:37;;26130:4;26124;26120:15;26112:23;;25901:241;;;:::o;26148:132::-;26215:4;26238:3;26230:11;;26268:4;26263:3;26259:14;26251:22;;26220:60;;;:::o;26286:141::-;26335:4;26358:3;26350:11;;26381:3;26378:1;26371:14;26415:4;26412:1;26402:18;26394:26;;26340:87;;;:::o;26433:114::-;26500:6;26534:5;26528:12;26518:22;;26507:40;;;:::o;26553:98::-;26604:6;26638:5;26632:12;26622:22;;26611:40;;;:::o;26657:99::-;26709:6;26743:5;26737:12;26727:22;;26716:40;;;:::o;26762:113::-;26832:4;26864;26859:3;26855:14;26847:22;;26837:38;;;:::o;26881:184::-;26980:11;27014:6;27009:3;27002:19;27054:4;27049:3;27045:14;27030:29;;26992:73;;;;:::o;27071:168::-;27154:11;27188:6;27183:3;27176:19;27228:4;27223:3;27219:14;27204:29;;27166:73;;;;:::o;27245:147::-;27346:11;27383:3;27368:18;;27358:34;;;;:::o;27398:169::-;27482:11;27516:6;27511:3;27504:19;27556:4;27551:3;27547:14;27532:29;;27494:73;;;;:::o;27573:148::-;27675:11;27712:3;27697:18;;27687:34;;;;:::o;27727:305::-;27767:3;27786:20;27804:1;27786:20;:::i;:::-;27781:25;;27820:20;27838:1;27820:20;:::i;:::-;27815:25;;27974:1;27906:66;27902:74;27899:1;27896:81;27893:2;;;27980:18;;:::i;:::-;27893:2;28024:1;28021;28017:9;28010:16;;27771:261;;;;:::o;28038:185::-;28078:1;28095:20;28113:1;28095:20;:::i;:::-;28090:25;;28129:20;28147:1;28129:20;:::i;:::-;28124:25;;28168:1;28158:2;;28173:18;;:::i;:::-;28158:2;28215:1;28212;28208:9;28203:14;;28080:143;;;;:::o;28229:348::-;28269:7;28292:20;28310:1;28292:20;:::i;:::-;28287:25;;28326:20;28344:1;28326:20;:::i;:::-;28321:25;;28514:1;28446:66;28442:74;28439:1;28436:81;28431:1;28424:9;28417:17;28413:105;28410:2;;;28521:18;;:::i;:::-;28410:2;28569:1;28566;28562:9;28551:20;;28277:300;;;;:::o;28583:191::-;28623:4;28643:20;28661:1;28643:20;:::i;:::-;28638:25;;28677:20;28695:1;28677:20;:::i;:::-;28672:25;;28716:1;28713;28710:8;28707:2;;;28721:18;;:::i;:::-;28707:2;28766:1;28763;28759:9;28751:17;;28628:146;;;;:::o;28780:96::-;28817:7;28846:24;28864:5;28846:24;:::i;:::-;28835:35;;28825:51;;;:::o;28882:90::-;28916:7;28959:5;28952:13;28945:21;28934:32;;28924:48;;;:::o;28978:77::-;29015:7;29044:5;29033:16;;29023:32;;;:::o;29061:149::-;29097:7;29137:66;29130:5;29126:78;29115:89;;29105:105;;;:::o;29216:126::-;29253:7;29293:42;29286:5;29282:54;29271:65;;29261:81;;;:::o;29348:77::-;29385:7;29414:5;29403:16;;29393:32;;;:::o;29431:154::-;29515:6;29510:3;29505;29492:30;29577:1;29568:6;29563:3;29559:16;29552:27;29482:103;;;:::o;29591:307::-;29659:1;29669:113;29683:6;29680:1;29677:13;29669:113;;;29768:1;29763:3;29759:11;29753:18;29749:1;29744:3;29740:11;29733:39;29705:2;29702:1;29698:10;29693:15;;29669:113;;;29800:6;29797:1;29794:13;29791:2;;;29880:1;29871:6;29866:3;29862:16;29855:27;29791:2;29640:258;;;;:::o;29904:320::-;29948:6;29985:1;29979:4;29975:12;29965:22;;30032:1;30026:4;30022:12;30053:18;30043:2;;30109:4;30101:6;30097:17;30087:27;;30043:2;30171;30163:6;30160:14;30140:18;30137:38;30134:2;;;30190:18;;:::i;:::-;30134:2;29955:269;;;;:::o;30230:281::-;30313:27;30335:4;30313:27;:::i;:::-;30305:6;30301:40;30443:6;30431:10;30428:22;30407:18;30395:10;30392:34;30389:62;30386:2;;;30454:18;;:::i;:::-;30386:2;30494:10;30490:2;30483:22;30273:238;;;:::o;30517:233::-;30556:3;30579:24;30597:5;30579:24;:::i;:::-;30570:33;;30625:66;30618:5;30615:77;30612:2;;;30695:18;;:::i;:::-;30612:2;30742:1;30735:5;30731:13;30724:20;;30560:190;;;:::o;30756:100::-;30795:7;30824:26;30844:5;30824:26;:::i;:::-;30813:37;;30803:53;;;:::o;30862:94::-;30901:7;30930:20;30944:5;30930:20;:::i;:::-;30919:31;;30909:47;;;:::o;30962:176::-;30994:1;31011:20;31029:1;31011:20;:::i;:::-;31006:25;;31045:20;31063:1;31045:20;:::i;:::-;31040:25;;31084:1;31074:2;;31089:18;;:::i;:::-;31074:2;31130:1;31127;31123:9;31118:14;;30996:142;;;;:::o;31144:180::-;31192:77;31189:1;31182:88;31289:4;31286:1;31279:15;31313:4;31310:1;31303:15;31330:180;31378:77;31375:1;31368:88;31475:4;31472:1;31465:15;31499:4;31496:1;31489:15;31516:180;31564:77;31561:1;31554:88;31661:4;31658:1;31651:15;31685:4;31682:1;31675:15;31702:180;31750:77;31747:1;31740:88;31847:4;31844:1;31837:15;31871:4;31868:1;31861:15;31888:102;31929:6;31980:2;31976:7;31971:2;31964:5;31960:14;31956:28;31946:38;;31936:54;;;:::o;31996:94::-;32029:8;32077:5;32073:2;32069:14;32048:35;;32038:52;;;:::o;32096:164::-;32236:16;32232:1;32224:6;32220:14;32213:40;32202:58;:::o;32266:225::-;32406:34;32402:1;32394:6;32390:14;32383:58;32475:8;32470:2;32462:6;32458:15;32451:33;32372:119;:::o;32497:170::-;32637:22;32633:1;32625:6;32621:14;32614:46;32603:64;:::o;32673:179::-;32813:31;32809:1;32801:6;32797:14;32790:55;32779:73;:::o;32858:182::-;32998:34;32994:1;32986:6;32982:14;32975:58;32964:76;:::o;33046:234::-;33186:34;33182:1;33174:6;33170:14;33163:58;33255:17;33250:2;33242:6;33238:15;33231:42;33152:128;:::o;33286:171::-;33426:23;33422:1;33414:6;33410:14;33403:47;33392:65;:::o;33463:114::-;33569:8;:::o;33583:170::-;33723:22;33719:1;33711:6;33707:14;33700:46;33689:64;:::o;33759:175::-;33899:27;33895:1;33887:6;33883:14;33876:51;33865:69;:::o;33940:171::-;34080:23;34076:1;34068:6;34064:14;34057:47;34046:65;:::o;34117:181::-;34257:33;34253:1;34245:6;34241:14;34234:57;34223:75;:::o;34304:169::-;34444:21;34440:1;34432:6;34428:14;34421:45;34410:63;:::o;34479:122::-;34552:24;34570:5;34552:24;:::i;:::-;34545:5;34542:35;34532:2;;34591:1;34588;34581:12;34532:2;34522:79;:::o;34607:116::-;34677:21;34692:5;34677:21;:::i;:::-;34670:5;34667:32;34657:2;;34713:1;34710;34703:12;34657:2;34647:76;:::o;34729:122::-;34802:24;34820:5;34802:24;:::i;:::-;34795:5;34792:35;34782:2;;34841:1;34838;34831:12;34782:2;34772:79;:::o;34857:120::-;34929:23;34946:5;34929:23;:::i;:::-;34922:5;34919:34;34909:2;;34967:1;34964;34957:12;34909:2;34899:78;:::o;34983:122::-;35056:24;35074:5;35056:24;:::i;:::-;35049:5;35046:35;35036:2;;35095:1;35092;35085:12;35036:2;35026:79;:::o

Swarm Source

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