ETH Price: $2,642.85 (+0.62%)

Morphaper (MPAPER)
 

Overview

TokenID

237

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
Morphaper

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-04
*/

// File: Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

}
// File: 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 make 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: 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
// File: 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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
// File: Constants.sol


pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// File: IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.13;



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

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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

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

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

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

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


pragma solidity ^0.8.13;



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

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


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    mapping(uint256 => TokenOwnership) private _ownerships;

    // =============================================================
    //                          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.selector);
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

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

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

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

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

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

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length != 0
                ? string(abi.encodePacked(baseURI, _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 Returns whether the ownership slot at `index` is initialized.
     * An uninitialized slot does not necessarily mean that the slot has no owner.
     */
    function _ownershipIsInitialized(
        uint256 index
    ) internal view virtual returns (bool) {
        return _packedOwnerships[index] != 0;
    }

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

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(
        uint256 tokenId
    ) private view returns (uint256 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If the data at the starting slot does not exist, start the scan.
            if (packed == 0) {
                if (tokenId >= _currentIndex)
                    _revert(OwnerQueryForNonexistentToken.selector);
                // Invariant:
                // There will always be an initialized ownership slot
                // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                // before an unintialized ownership slot
                // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                // Hence, `tokenId` will not underflow.
                //
                // We can directly compare the packed value.
                // If the address is zero, packed will be zero.
                for (;;) {
                    unchecked {
                        packed = _packedOwnerships[--tokenId];
                    }
                    if (packed == 0) continue;
                    if (packed & _BITMASK_BURNED == 0) return packed;
                    // Otherwise, the token is burned, and we must revert.
                    // This handles the case of batch burned tokens, where only the burned bit
                    // of the starting slot is set, and remaining slots are left uninitialized.
                    _revert(OwnerQueryForNonexistentToken.selector);
                }
            }
            // Otherwise, the data exists and we can skip the scan.
            // This is possible because we have already achieved the target condition.
            // This saves 2143 gas on transfers of initialized tokens.
            // If the token is not burned, return `packed`. Otherwise, revert.
            if (packed & _BITMASK_BURNED == 0) return packed;
        }
        _revert(OwnerQueryForNonexistentToken.selector);
    }

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

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(
        address to,
        uint256 tokenId
    ) public payable virtual override {
        _approve(to, tokenId, true);
    }

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

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

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

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

        // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
        from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS));

        if (address(uint160(prevOwnershipPacked)) != from)
            _revert(TransferFromIncorrectOwner.selector);

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
        uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
        assembly {
            // Emit the `Transfer` event.
            log4(
                0, // Start of data (0, since no data).
                0, // End of data (0, since no data).
                _TRANSFER_EVENT_SIGNATURE, // Signature.
                from, // `from`.
                toMasked, // `to`.
                tokenId // `tokenId`.
            )
        }
        if (toMasked == 0) _revert(TransferToZeroAddress.selector);

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) |
                    _nextExtraData(address(0), to, 0)
            );

            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;

            if (toMasked == 0) _revert(MintToZeroAddress.selector);

            uint256 end = startTokenId + quantity;
            uint256 tokenId = startTokenId;

            do {
                assembly {
                    // Emit the `Transfer` event.
                    log4(
                        0, // Start of data (0, since no data).
                        0, // End of data (0, since no data).
                        _TRANSFER_EVENT_SIGNATURE, // Signature.
                        0, // `address(0)`.
                        toMasked, // `to`.
                        tokenId // `tokenId`.
                    )
                }
                // The `!=` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
            } while (++tokenId != end);

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

        if (approvalCheck && _msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                _revert(ApprovalCallerNotOwnerNorApproved.selector);
            }

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev For more efficient reverts.
     */
    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}
// File: Project.sol



pragma solidity ^0.8.0;






contract Morphaper is
    Ownable,
    ERC721A,
    ReentrancyGuard,
    DefaultOperatorFilterer
{
    uint256 public maxSupply = 1080;
    uint256 public maxMintPerTx = 10;
    uint256 public price = 0.108 * 10 ** 18;
    bool public publicPaused = true;
    bool public revealed = false;
    string public baseURI;
    string public hiddenMetadataUri =
        "ipfs://bafkreiepo53fnc4i53rvkaies2ebiojkcj2xganowjc2yrlmhytmyqw5g4";

    mapping(address => bool) public isAllowedToMint;

    constructor() ERC721A("Morphaper", "MPAPER") {
        initializeWhitelist();
    }

    function mint(uint256 amount) external payable {
        uint256 ts = totalSupply();
        require(publicPaused == false, "Mint not open for public");
        require(ts + amount <= maxSupply, "Purchase would exceed max tokens");
        require(
            amount <= maxMintPerTx,
            "Amount should not exceed max mint number"
        );

        require(msg.value >= price * amount, "Please send the exact amount.");

        _safeMint(msg.sender, amount);
    }

    function openPublicMint(bool paused) external onlyOwner {
        publicPaused = paused;
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function whitelistStop(uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }

    function setMaxPerTx(uint256 _maxMintPerTx) external onlyOwner {
        maxMintPerTx = _maxMintPerTx;
    }

    function updateMetadata(string calldata _newMetadata) external onlyOwner {
        hiddenMetadataUri = _newMetadata;
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

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

    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, Strings.toString(_tokenId))): "";
    }

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

    function claim(uint256 tokenId) external onlyOwner {
        _burn(tokenId);
    }

    // OVERRIDDEN PUBLIC WRITE CONTRACT FUNCTIONS: OpenSea's Royalty Filterer Implementation. //

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

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

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

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

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

    // WHITELIST

        function whitelistMint(uint256 amount) public payable {
            uint256 ts = totalSupply();
            require(ts + amount <= maxSupply, "Purchase would exceed max tokens");
            require(isAllowedToMint[msg.sender], "You are not on whitelist");
            _safeMint(msg.sender, amount);
        }

        function zaddWhitelist(address _address) external onlyOwner {
            isAllowedToMint[_address] = true;
        }

        function zaddbulkWhitelist(address[] calldata _addresses) external onlyOwner {
            for (uint i = 0; i < _addresses.length; i++) {
                isAllowedToMint[_addresses[i]] = true;
            }
        }

        function initializeWhitelist() private {
            isAllowedToMint[0xB0F34fA9931021150cde7e05A18371a2d8d16ee4] = true;
            isAllowedToMint[0x506E65eD8162EC8BB35e25F89E9CB4F1AB42A7b5] = true;
            isAllowedToMint[0x3A2f7e7F8D98E677Af266e453afcdbcf321878C4] = true;
            isAllowedToMint[0xE558a7E21E954a0F550D35cc8b9d30b5d053aBd2] = true;
            isAllowedToMint[0xe8353Fd3c72bac435098753C57aE495D3f9AabE7] = true;
            isAllowedToMint[0xdd9f8b3270F4d5A3F2BB38695Db42f288C76bE90] = true;
            isAllowedToMint[0xEB6CDf616a237832aFfAE279a3fF095Eb74d0493] = true;
            isAllowedToMint[0x865D6Ed70A180d305D1af64029b52071494b4124] = true;
            isAllowedToMint[0xe6362E56A196CBFdb58c19466775641de24178a4] = true;
            isAllowedToMint[0xFB6425e85F1d34488C345Bb36Ef10cB7aA547F77] = true;
            isAllowedToMint[0xA6480938E9a5F49016d7b5D20964DeF71fb02a26] = true;
            isAllowedToMint[0x215fdD58C9462D0ae2CD4BEFd9aDa37F37B9D98a] = true;
            isAllowedToMint[0xdf1ad13F503DAD38C2bF36A00d3e1fF2052250AE] = true;
            isAllowedToMint[0xd12e49925548cDb067cb7D58453754126a4F5FAF] = true;
            isAllowedToMint[0x157b773e4123d8B06E9c6BCd802779e154e2C013] = true;
            isAllowedToMint[0xeBf474259cab0Fdad657e2968eCfc06DEe708578] = true;
            isAllowedToMint[0x03b17e52E95D4C0d82D38339526Effc2fce9FE30] = true;
            isAllowedToMint[0xBff81dd84cc15c965449B589b56c0C52B83dd4C0] = true;
            isAllowedToMint[0x772AA7bc35dB13425a84C47798EaD132604e7Cf2] = true;
            isAllowedToMint[0x3B8992681A46f7fD60fA1425d1f16C7BC2e106D0] = true;
            isAllowedToMint[0xdab7dd17FAF159e746Ac0a23c7e7FBC75379B0bA] = true;
            isAllowedToMint[0x79fc71831d6895C1F179ff52eC97694A2513bda0] = true;
            isAllowedToMint[0x049f86bA7c1137Bc112fdD3e6ad8B17900F9c716] = true;
            isAllowedToMint[0x4758546A76aB2fa9d80A12Bb90d9fd52D31a7755] = true;
            isAllowedToMint[0xC5d1188085AD7DC668a9Ba9d857FE02De0f72203] = true;
            isAllowedToMint[0x388c57B947b3B2a1205eF7798e863Cb5dAE903cf] = true;
            isAllowedToMint[0xdAceBBb38647004ADb51Fa09Ec5170B4f137CACB] = true;
            isAllowedToMint[0x63abF291fBb59bD2100F6048F312bB85DB7D3573] = true;
            isAllowedToMint[0xdbE904ce4c3b1ff071206344ce42A30E24204eCd] = true;
            isAllowedToMint[0xC72b502419F165E8CB8B6fEB6CD4Ec72c0a1d31b] = true;
            isAllowedToMint[0x110c316953A76531cC69012CD372a7f7fC73A34d] = true;
            isAllowedToMint[0x1B0D719c9d0c004eDA2444603f69c5Af02539B2C] = true;
            isAllowedToMint[0xa67Eb9c3acdF6Ec219717bf3F4a653af9fE89757] = true;
            isAllowedToMint[0x52dFCFB553C360EbFe25D6a85B2f76A89a4dc99D] = true;
            isAllowedToMint[0xa0B98AD16Ab7A630Fd12509162911F542b0112b6] = true;
            isAllowedToMint[0xF615Dd27A7B37CC656d58b22751fAeF86Eee06b8] = true;
            isAllowedToMint[0x332fb53096819A60Ade6D3FFDb2c35D1cD91536D] = true;
            isAllowedToMint[0x81CB469a5CA9488c9c2D25c36f6434623287F270] = true;
            isAllowedToMint[0x55C672aB216Db0e0d82564A3b43d752e2e6e12eA] = true;
            isAllowedToMint[0xfaff9E7B653e0D47db2b3c705753A7Af14EE0c28] = true;
            isAllowedToMint[0x8c2d49E70B1E138DC061f4B7a75B8CB19093b806] = true;
            isAllowedToMint[0x564444E2081a15bfae19373725148e9ecdC132c5] = true;
            isAllowedToMint[0x3fC150ec47Cb9c36037503A6274e7Dd27c4d49cf] = true;
            isAllowedToMint[0x5f0140273834DF84A7219b1239eDa38Fa937D520] = true;
            isAllowedToMint[0xf97111e8a5D3C54519C88b82584659c0f60eC8f0] = true;
            isAllowedToMint[0x3Bd75009AA07Fb6c09d03962096534F9DcfA00Dd] = true;
            isAllowedToMint[0xC94FD7eE86b3166230dE444222c0c248c95a5bD8] = true;
            isAllowedToMint[0x14D04441bfbc862a4C87AE2F834CfF0feccC7731] = true;
            isAllowedToMint[0xFdd0A13c2BFe5319e597153c402D45815235ba3c] = true;
            isAllowedToMint[0x18AEe7D34eA86D492d04B038d6ACEDE0578c526b] = true;
            isAllowedToMint[0x0b203324489F1d3b50C2475D41045a40894b141e] = true;
            isAllowedToMint[0x5A6f1048f6E1a8ac68fdA9D4D0e4573Edcb7384F] = true;
            isAllowedToMint[0x5160c0347F816379b82e2dA47428F15F439a44DA] = true;
            isAllowedToMint[0x71d4f87B39e71af375cFa5F611992044e687e93b] = true;
            isAllowedToMint[0xe2d9A58A02B9B747584DAbd88Af6a133F99d0fDE] = true;
            isAllowedToMint[0x4eAb8892db2347b6Ce8757278E8dC2d16Acc3a0f] = true;
            isAllowedToMint[0x02a1F706afEda8EA1E46Fc80751cB039d6d47953] = true;
            isAllowedToMint[0x0c63454106183cD052baFeA40A4ACCf7C8B38Fdd] = true;
            isAllowedToMint[0x8fb98545EEeB52B4D6c03828Fa3b4aad3C7c2F33] = true;
            isAllowedToMint[0xdD728522494Ee9F09D0429f19687256617315Fe4] = true;
            isAllowedToMint[0xd17bF978310F31ea5CBe2d4cb0AFDDA5553251D0] = true;
            isAllowedToMint[0xc785cB2ECC0EeA84be33E4e378840CDfA36991dE] = true;
            isAllowedToMint[0x7313Fec54C107959502B05007E35ba0c9A0C83e5] = true;
            isAllowedToMint[0x526f4C8D786c5ada0B6449B15c66a2deD7Ea91BA] = true;
            isAllowedToMint[0x038f7e66f441DFd5D9Af47833aDdaAf690342333] = true;
            isAllowedToMint[0xd35B84b28d3eFAfB900d118194b6Ec73b5933434] = true;
            isAllowedToMint[0x1d211a0ff2D5C3f088FD6C3bfAf0f68A8799345f] = true;
            isAllowedToMint[0x440925D63B69ce44EE51951965E89cA6e8F8446D] = true;
            isAllowedToMint[0x04D8E5fa177988D80446Bb09795F0175383dd849] = true;
            isAllowedToMint[0x3f3421232A7fde4571622C3a422A073adec4Fe7c] = true;
            isAllowedToMint[0x0bCa3066C83D0aeb00D22294eBD58C9BD94e597e] = true;
            isAllowedToMint[0xFB96F961E9AF7deD536ddE37bC945e72961270C3] = true;
            isAllowedToMint[0xc4298fB9Ec1A704a4C376E1eCac4157AD4D44155] = true;
            isAllowedToMint[0x3a3fdCA770BfE37AF85054D009552CDA3b15B7eF] = true;
            isAllowedToMint[0xF697C20a0c29B977650a285Eb0d29A62E727cD99] = true;
            isAllowedToMint[0x3cAe811cbad87E3F2Ae3Ee439Ce8693471789383] = true;
            isAllowedToMint[0x15C82731E0151c569f19e61d41FF193230254201] = true;
            isAllowedToMint[0x9148eE257614FA92C7da66923073fD75D6d67825] = true;
            isAllowedToMint[0x9Cd938813f35BC0e647C061E81De05c0d1d1d9cB] = true;
            isAllowedToMint[0x25087656A3baf82D955B78Df5a1f7a27bE315139] = true;
            isAllowedToMint[0xE5199FAe3C50951a36083b2e12265B78c70C669D] = true;
            isAllowedToMint[0x6d39616749FB4cD5E53c08a1679AaffD47D0d25E] = true;
            isAllowedToMint[0xD0CA4AF82A043ccBfAb2FFbd937E8B0A7DF92AeD] = true;
            isAllowedToMint[0x0bA9f830C14B08A5E614Ec7460882696858a973D] = true;
            isAllowedToMint[0x9D87Ad3b87d1F37aFCfdC0B154F9caDedC70c436] = true;
            isAllowedToMint[0x8aBA9AFF5623ccB345a68bF72F964C44b5391D0e] = true;
            isAllowedToMint[0x5ceF44892AEa5b09642b5a597b64EcBD325bd7b7] = true;
            isAllowedToMint[0x3Ef842E7178122b7E563a23D1aeeD88018D5348B] = true;
            isAllowedToMint[0xfAEf9bE30172128Ba72698F552DdEbc12E011fFf] = true;
            isAllowedToMint[0x709AaE6C7249BD32b061A03895D9BB3668CB6837] = true;
            isAllowedToMint[0x4c46A830e3f7DB08e98d417F134EdCe7875Db609] = true;
            isAllowedToMint[0x336D74fF2884648D3916A29cC85f9cE87eCdCAE4] = true;
            isAllowedToMint[0x5B7e23c742586C103d8bDd1B238Cd9AF4a41594e] = true;
            isAllowedToMint[0x30FbacD3eC6345476aF5C994df05a0C7EB7c2F63] = true;
            isAllowedToMint[0x5b1bA1b23a0Bab28Ac2A00b7A6EA8B1218134344] = true;
            isAllowedToMint[0x8502F4Db45cc01437174842F3531E093D0D578fF] = true;
            isAllowedToMint[0x9d5735ae2ee036fE025eD2FEeD677a3ec388181E] = true;
            isAllowedToMint[0x45D05F3D5024afec3Ef3812AbbaFd85E491dddBc] = true;
            isAllowedToMint[0xF29808BDeec7B49809E1De873EaA5CBfc77B6101] = true;
            isAllowedToMint[0xDb912CA3E9b063FE91716E04FAd89fd156331cAA] = true;
            isAllowedToMint[0xAEb9EDccA53ac5c04b59E4DFB4a77b9948fd1104] = true;
            isAllowedToMint[0xF360Ee6e028397F1b4d1b10c9d62619a73e292A2] = true;
            isAllowedToMint[0x49dB439BC461bcF02718A6031f64720Df04cE074] = true;
            isAllowedToMint[0xD4d0726ad26f12a32687B21F1Ff0bdAc18FA9223] = true;
            isAllowedToMint[0x8217Cb6d425D839FC1591Ff9661B053487db43bf] = true;
            isAllowedToMint[0xc4B4126A45a3bdA21fb1e033B54ee70d0Ba22691] = true;
            isAllowedToMint[0x3BA6BF497218bBa25216949348Ba7c42de7E1EDB] = true;
            isAllowedToMint[0xD24AC95E4DF6D36d0E75613a34E2693e60366268] = true;
            isAllowedToMint[0xcb15e4570aeB03cB8620D223876a0B3dB8E792d0] = true;
            isAllowedToMint[0x5eB19dA8b9C0665DC533fB600D9fAbe9E34bD1b5] = true;
            isAllowedToMint[0x57E2e0C1eF2fE4347205bDbEFCB232106A123cF6] = true;
            isAllowedToMint[0x6f0ceC873F47f4FD8B5F6c4fa6d0eB9E4109197B] = true;
            isAllowedToMint[0xC622005a3B9d3481877e2fAe59091B8e0Ba6Cdd7] = true;
            isAllowedToMint[0xEc47eA12030db51901FD80bea1D2E18b9fe1108b] = true;
            isAllowedToMint[0x5fcDD34E1cF573BB3605ad1d16D2B4Ef3dA9A8aa] = true;
            isAllowedToMint[0xC5BB99A5E8186A96BF8ac4e8a577935B9365Da79] = true;
            isAllowedToMint[0xc3aB35fFc756f0fA91cbFB3753DDAd6195887746] = true;
            isAllowedToMint[0xcf334d253D45891492124F9806a33c62eAEd9ab4] = true;
            isAllowedToMint[0xe86fC2678d6BC1903FE012f94a82Ff25ABc49bB3] = true;
            isAllowedToMint[0xF74AB07A3F33d4245323B54dca97896f70b48E64] = true;
            isAllowedToMint[0x7E3472415238CEbC4358E87eCDFd6F1f75488d6F] = true;
            isAllowedToMint[0xE59e5265607c9f95D360CF5851Ca2Fc6d5136670] = true;
            isAllowedToMint[0xC8ec7c11646c3C1B0f779697f7b727bd19E9e62A] = true;
            isAllowedToMint[0xbDC25D8D27878BBA39C89f80F994A21311bBb978] = true;
            isAllowedToMint[0xc64B3aF5c32628C114Caf19E15F4A63D021A2f39] = true;
            isAllowedToMint[0xb409FE7f3D9136Fbb5c2804E525E15CecDb76679] = true;
            isAllowedToMint[0xc2F3d2acD4740Fc27013d0780e570E3461CF475b] = true;
            isAllowedToMint[0x95eA6c7e000674144b34d11898DEe145E2Fad3E5] = true;
            isAllowedToMint[0x2a69F23440308a1991a16CDf52Ba5ec4890Fa283] = true;
            isAllowedToMint[0xBd10df0eac424b115bb38F24689DB55Ce5028E99] = true;
            isAllowedToMint[0xB606E082BCc3A55AaCf76761fF6992bd615a5a2e] = true;
            isAllowedToMint[0xFF802ad3Aa746AdD21e8334eD37C4Bf325a83422] = true;
            isAllowedToMint[0x29779ae8Db5B760FF7d066Ae1562054F68acb390] = true;
            isAllowedToMint[0xb6F40DeEE2fD230472D51671F8D60E117D2eE47c] = true;
            isAllowedToMint[0x7e30240FeC6f7A8eD7B73484b301a466FaDb8634] = true;
            isAllowedToMint[0xFb38939C99d445405440d4b33cCCA39227B646C1] = true;
            isAllowedToMint[0xD931BC6dFF69379b5B9e139206939B890c836fB3] = true;
            isAllowedToMint[0x957E974830E73A7c3FD881Bf63ce305a366B5f56] = true;
            isAllowedToMint[0x189bE4aEB9980BFf75A2ecf38bD68De0b47B2331] = true;
            isAllowedToMint[0x5DeF398D753dE6B5bb51684C595AA3F854Ad2548] = true;
            isAllowedToMint[0xE6C53eab5530F2933DecEd8c5d64Bc1a139D7fd6] = true;
            isAllowedToMint[0x1F753afEAa2941eC11082fE42BB8c1E9Ed499DA6] = true;
            isAllowedToMint[0xC085DC1310458ec9aCd16FF79D424906442795E6] = true;
            isAllowedToMint[0xf56281E4ED3260e49B634FA8931f60143bA7f7A9] = true;
            isAllowedToMint[0x29425C85cccff3142ac7478F848640E8A64A3362] = true;
            isAllowedToMint[0xDa5cF38324d8DD7128Bb5849b2850ffe768949FD] = true;
            isAllowedToMint[0x74e535F7e87B547Cd280bFdf851101F12aF8c43d] = true;
            isAllowedToMint[0x46bc614eafbB8FC82423d4CBCBbfC265926102D2] = true;
            isAllowedToMint[0xdFC327bb456bdFd6C03F43993af99022c26e0b16] = true;
            isAllowedToMint[0x3fD2fBA1C457FB629D0cA2C131819FB2D57AF337] = true;
            isAllowedToMint[0xd30aC531Efe0AeCDDa01e2b5a704427AaA627154] = true;
            isAllowedToMint[0x2bcFAdF248ed69836D71D5208C2BB7318E1CB3Fe] = true;
            isAllowedToMint[0x38f720bABd1fd908ACA8Cc1e04fbb764338e0D39] = true;
            isAllowedToMint[0xc08829D474bCc5BAA07Ec6c2781FA98Fe06C8b05] = true;
            isAllowedToMint[0x858114edAFCc2f7De622eA01B028876614621b3b] = true;
            isAllowedToMint[0x2B7373E33edde9a5BeCbc045e364D670790F0349] = true;
            isAllowedToMint[0xa660d57caE159b69edE8F1a4C6b955D0e006D150] = true;
            isAllowedToMint[0x287655c5b7b55c5054D2c1FBcdc7Ae637ca08e05] = true;
            isAllowedToMint[0xD22aEEADf7107b20Da8F9d6c79b3ff8E4EB75bA0] = true;
            isAllowedToMint[0xc9881C84595f4805E4effC51Ec84a157a6E4a2EB] = true;
            isAllowedToMint[0x97a1B8A62ce496Dcca4d785B7e48A51947fCAB07] = true;
            isAllowedToMint[0x14301429207726B703180269eE0923ac195e140a] = true;
            isAllowedToMint[0xa3440f2615813b2eEeCed679d99F4d284D4A6BA8] = true;
            isAllowedToMint[0x16684B55e7C2ACCF08D602ce7F6bc8D4f3F98CF4] = true;
            isAllowedToMint[0x6140e8AD7d7396B99f296f90132ecf10EFA51352] = true;
            isAllowedToMint[0x3c770bc6Ea69b20E2A3A5e54d9c2ecD037a9FA0F] = true;
            isAllowedToMint[0xd68Fcd8BFC35f9a1b76d1bf8AEC0643475e11c3E] = true;
            isAllowedToMint[0xD05Ed2296b150c4685Bca07E1db531fAcf5f55ab] = true;
            isAllowedToMint[0xD1f10F28B08257ADBe0678b28c53bfB996D99464] = true;
            isAllowedToMint[0x5716cdd4a6f41fe9cfAc0CFEfF0F797A5dc4029D] = true;
            isAllowedToMint[0x6Fdb95fF6FeF152A1024BC0923a91f55049872BD] = true;
            isAllowedToMint[0xD9386aDF8F98f13D21c6993CcF4Ca60E4c747e6e] = true;
            isAllowedToMint[0xBDd7e8543F1D4767E7d9eD9905E406DA8EE69DDf] = true;
            isAllowedToMint[0x94d6Ae094585892586719794b347B46300241EFc] = true;
            isAllowedToMint[0x1d0514011bE92974f5cBFD9Db36b37A1157492f0] = true;
            isAllowedToMint[0x837b4e84D5b6FBa8854B472Be5740beBfdd38c6e] = true;
            isAllowedToMint[0x585cf3a47b7dF092F20E64B5CFC495fCf51E3260] = true;
            isAllowedToMint[0xBF94A18C91B1dd162f3DC10A570dbcA78fD4ff07] = true;
            isAllowedToMint[0x3E4AAC5AF8EC7f1098f2d336836eC70EE9Fa3673] = true;
            isAllowedToMint[0x5Cc70E898F13dbcd8546b0E40123E1Cfed78Af70] = true;
            isAllowedToMint[0x12bFFA80c3cA3cd0fe431a60F9B5c709b8a387f1] = true;
            isAllowedToMint[0xD766b23A8CBebf2B44c6c8EEc7a45413C556fC24] = true;
            isAllowedToMint[0xBcA8920417868733e711fcD187A76Ce85036afD7] = true;
            isAllowedToMint[0x620bf65F890b569EFB9339E4C25aCe1E18f01819] = true;
            isAllowedToMint[0xb974b9Ae4178359bfdeF57097677aC5cCF4D14c9] = true;
            isAllowedToMint[0x275Ba13992bE5BFdF7835B77FaFaA896d77A2791] = true;
            isAllowedToMint[0x8Db008Fdc0FE2Fd0B076c052c5211dC666F6d918] = true;
            isAllowedToMint[0x6E0Ac17fCeaf5009435275Be342960adC6f8493f] = true;
            isAllowedToMint[0x86C0f0b48073a788a9aa232b49A1d0F7bB480EF2] = true;
            isAllowedToMint[0x47E5D62998dcB952Ab96ae8a510090Fc599606aa] = true;
            isAllowedToMint[0xa48325b0Dcbb88Ccc0f2CC8179183886A3fd3f87] = true;
            isAllowedToMint[0xD9Da2593E00d53E43bcFd8c8E29352b90c934210] = true;
            isAllowedToMint[0xbB92fB7b5284DA93AfCe4600e83F0f1A733f79eA] = true;
            isAllowedToMint[0x10ea861a5f90844607a30358580204A6883cE6e1] = true;
            isAllowedToMint[0xfc421eb806334675a9A3eD129B7df14028E22b1e] = true;
            isAllowedToMint[0x383578e2CA5521eF3704Dd325f4b788701DE7336] = true;
            isAllowedToMint[0xA49068F6c4E23711e1ec6E5bB90628CE84D0030A] = true;
            isAllowedToMint[0x36B4Eb32221f92587C016156573F17C14cF6C4c5] = true;
            isAllowedToMint[0x6E2fa073417d7C325a2762A83C22A0AEaa6BBB74] = true;
            isAllowedToMint[0x2F28aE3337028ac5B1Dac33e74dEF5a82ae7A3D9] = true;
            isAllowedToMint[0xf06dD0C468FEfD44A0797311771D6f83CBD799c8] = true;
            isAllowedToMint[0xc7F98DCF1b53420D64E1af8E836BeFB25CeEdC0C] = true;
            isAllowedToMint[0xb9f1915fC05b2d27E8F8F4088cc27e26C0796b13] = true;
            isAllowedToMint[0x2BC1d089d1627b872034A1a57f0E7f31E6726173] = true;
            isAllowedToMint[0x6283565CE531Bb4Be177f2627738c039E3f5b73a] = true;
            isAllowedToMint[0xb2581dd7082E9E89B7C41FAB99E822DC1FA2DF2F] = true;
            isAllowedToMint[0x717309D0Bf0c529A8e26Ea41CE9D3700dCE2b325] = true;
            isAllowedToMint[0x0D369f9Eb9e0e743A7f5c834344b9867ADf61265] = true;
            isAllowedToMint[0xD1b890b73f6800AFb135face70757E1D16F50539] = true;
            isAllowedToMint[0x562805cAea5f57603220Aab660dA900Cd599B40B] = true;
            isAllowedToMint[0x5621678F90c17c4cbc125B33CE47c49BFf9DB39f] = true;
            isAllowedToMint[0x470C94707244C8353a4455C52B19756624BBa2FA] = true;
            isAllowedToMint[0x8A682A0c0A49F8a768565b911304669CBF7CF6C5] = true;
            isAllowedToMint[0xD801c86518E369a48Bd1657B06e83958d11fFbaE] = true;
            isAllowedToMint[0x7aF718188874802aB54a27F5C5A38c8824e5378d] = true;
            isAllowedToMint[0x64cA6D31d886288512D1e598e6444dEd43076479] = true;
            isAllowedToMint[0xc83411e27D6982731755f2aF2F3D62A0Ae0BFB48] = true;
            isAllowedToMint[0x2284faC032eDFb17BE8c30503E1942D2b7607ff7] = true;
            isAllowedToMint[0x069752147E756CbA56C9D0d415DfFCCbc8eE3161] = true;
            isAllowedToMint[0xE2E61B64D798ba4Ff0b6A8AF35748059FD3c199B] = true;
            isAllowedToMint[0x39692F2E93EaC30654b6dF76Bf52dbdea48a6DA3] = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","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":"publicPaused","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPerTx","type":"uint256"}],"name":"setMaxPerTx","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":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newMetadata","type":"string"}],"name":"updateMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"whitelistStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"zaddWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"zaddbulkWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610438600b55600a600c5567017fb16d83be0000600d556001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506040518060800160405280604281526020016200a65660429139601090816200007b9190620063d3565b503480156200008957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f4d6f7270686170657200000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d5041504552000000000000000000000000000000000000000000000000000081525060006200011f6200040e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160039081620001ce9190620063d3565b508060049081620001e09190620063d3565b50620001f16200041660201b60201c565b60018190555050506001600a8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003f6578015620002bc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000282929190620064ff565b600060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b50505050620003f5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000376576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200033c929190620064ff565b600060405180830381600087803b1580156200035757600080fd5b505af11580156200036c573d6000803e3d6000fd5b50505050620003f4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003bf91906200652c565b600060405180830381600087803b158015620003da57600080fd5b505af1158015620003ef573d6000803e3d6000fd5b505050505b5b5b5050620004086200041b60201b60201c565b62006549565b600033905090565b600090565b60016011600073b0f34fa9931021150cde7e05a18371a2d8d16ee473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073506e65ed8162ec8bb35e25f89e9cb4f1ab42a7b573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733a2f7e7f8d98e677af266e453afcdbcf321878c473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e558a7e21e954a0f550d35cc8b9d30b5d053abd273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e8353fd3c72bac435098753c57ae495d3f9aabe773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dd9f8b3270f4d5a3f2bb38695db42f288c76be9073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073eb6cdf616a237832affae279a3ff095eb74d049373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073865d6ed70a180d305d1af64029b52071494b412473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e6362e56a196cbfdb58c19466775641de24178a473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fb6425e85f1d34488c345bb36ef10cb7aa547f7773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a6480938e9a5f49016d7b5d20964def71fb02a2673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073215fdd58c9462d0ae2cd4befd9ada37f37b9d98a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073df1ad13f503dad38c2bf36a00d3e1ff2052250ae73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d12e49925548cdb067cb7d58453754126a4f5faf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073157b773e4123d8b06e9c6bcd802779e154e2c01373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ebf474259cab0fdad657e2968ecfc06dee70857873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007303b17e52e95d4c0d82d38339526effc2fce9fe3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bff81dd84cc15c965449b589b56c0c52b83dd4c073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073772aa7bc35db13425a84c47798ead132604e7cf273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733b8992681a46f7fd60fa1425d1f16c7bc2e106d073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dab7dd17faf159e746ac0a23c7e7fbc75379b0ba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007379fc71831d6895c1f179ff52ec97694a2513bda073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073049f86ba7c1137bc112fdd3e6ad8b17900f9c71673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734758546a76ab2fa9d80a12bb90d9fd52d31a775573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c5d1188085ad7dc668a9ba9d857fe02de0f7220373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073388c57b947b3b2a1205ef7798e863cb5dae903cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dacebbb38647004adb51fa09ec5170b4f137cacb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007363abf291fbb59bd2100f6048f312bb85db7d357373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dbe904ce4c3b1ff071206344ce42a30e24204ecd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c72b502419f165e8cb8b6feb6cd4ec72c0a1d31b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073110c316953a76531cc69012cd372a7f7fc73a34d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731b0d719c9d0c004eda2444603f69c5af02539b2c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a67eb9c3acdf6ec219717bf3f4a653af9fe8975773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007352dfcfb553c360ebfe25d6a85b2f76a89a4dc99d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a0b98ad16ab7a630fd12509162911f542b0112b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f615dd27a7b37cc656d58b22751faef86eee06b873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073332fb53096819a60ade6d3ffdb2c35d1cd91536d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007381cb469a5ca9488c9c2d25c36f6434623287f27073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007355c672ab216db0e0d82564a3b43d752e2e6e12ea73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073faff9e7b653e0d47db2b3c705753a7af14ee0c2873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738c2d49e70b1e138dc061f4b7a75b8cb19093b80673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073564444e2081a15bfae19373725148e9ecdc132c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733fc150ec47cb9c36037503a6274e7dd27c4d49cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735f0140273834df84a7219b1239eda38fa937d52073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f97111e8a5d3c54519c88b82584659c0f60ec8f073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733bd75009aa07fb6c09d03962096534f9dcfa00dd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c94fd7ee86b3166230de444222c0c248c95a5bd873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007314d04441bfbc862a4c87ae2f834cff0feccc773173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fdd0a13c2bfe5319e597153c402d45815235ba3c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007318aee7d34ea86d492d04b038d6acede0578c526b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730b203324489f1d3b50c2475d41045a40894b141e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735a6f1048f6e1a8ac68fda9d4d0e4573edcb7384f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735160c0347f816379b82e2da47428f15f439a44da73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007371d4f87b39e71af375cfa5f611992044e687e93b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e2d9a58a02b9b747584dabd88af6a133f99d0fde73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734eab8892db2347b6ce8757278e8dc2d16acc3a0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007302a1f706afeda8ea1e46fc80751cb039d6d4795373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730c63454106183cd052bafea40a4accf7c8b38fdd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738fb98545eeeb52b4d6c03828fa3b4aad3c7c2f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dd728522494ee9f09d0429f19687256617315fe473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d17bf978310f31ea5cbe2d4cb0afdda5553251d073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c785cb2ecc0eea84be33e4e378840cdfa36991de73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737313fec54c107959502b05007e35ba0c9a0c83e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073526f4c8d786c5ada0b6449b15c66a2ded7ea91ba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073038f7e66f441dfd5d9af47833addaaf69034233373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d35b84b28d3efafb900d118194b6ec73b593343473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731d211a0ff2d5c3f088fd6c3bfaf0f68a8799345f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073440925d63b69ce44ee51951965e89ca6e8f8446d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007304d8e5fa177988d80446bb09795f0175383dd84973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733f3421232a7fde4571622c3a422a073adec4fe7c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730bca3066c83d0aeb00d22294ebd58c9bd94e597e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fb96f961e9af7ded536dde37bc945e72961270c373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c4298fb9ec1a704a4c376e1ecac4157ad4d4415573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733a3fdca770bfe37af85054d009552cda3b15b7ef73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f697c20a0c29b977650a285eb0d29a62e727cd9973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733cae811cbad87e3f2ae3ee439ce869347178938373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007315c82731e0151c569f19e61d41ff19323025420173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739148ee257614fa92c7da66923073fd75d6d6782573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739cd938813f35bc0e647c061e81de05c0d1d1d9cb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007325087656a3baf82d955b78df5a1f7a27be31513973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e5199fae3c50951a36083b2e12265b78c70c669d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736d39616749fb4cd5e53c08a1679aaffd47d0d25e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d0ca4af82a043ccbfab2ffbd937e8b0a7df92aed73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730ba9f830c14b08a5e614ec7460882696858a973d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739d87ad3b87d1f37afcfdc0b154f9cadedc70c43673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738aba9aff5623ccb345a68bf72f964c44b5391d0e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735cef44892aea5b09642b5a597b64ecbd325bd7b773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733ef842e7178122b7e563a23d1aeed88018d5348b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073faef9be30172128ba72698f552ddebc12e011fff73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073709aae6c7249bd32b061a03895d9bb3668cb683773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734c46a830e3f7db08e98d417f134edce7875db60973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073336d74ff2884648d3916a29cc85f9ce87ecdcae473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735b7e23c742586c103d8bdd1b238cd9af4a41594e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007330fbacd3ec6345476af5c994df05a0c7eb7c2f6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735b1ba1b23a0bab28ac2a00b7a6ea8b121813434473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738502f4db45cc01437174842f3531e093d0d578ff73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739d5735ae2ee036fe025ed2feed677a3ec388181e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007345d05f3d5024afec3ef3812abbafd85e491dddbc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f29808bdeec7b49809e1de873eaa5cbfc77b610173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073db912ca3e9b063fe91716e04fad89fd156331caa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073aeb9edcca53ac5c04b59e4dfb4a77b9948fd110473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f360ee6e028397f1b4d1b10c9d62619a73e292a273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007349db439bc461bcf02718a6031f64720df04ce07473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d4d0726ad26f12a32687b21f1ff0bdac18fa922373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738217cb6d425d839fc1591ff9661b053487db43bf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c4b4126a45a3bda21fb1e033b54ee70d0ba2269173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733ba6bf497218bba25216949348ba7c42de7e1edb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d24ac95e4df6d36d0e75613a34e2693e6036626873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cb15e4570aeb03cb8620d223876a0b3db8e792d073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735eb19da8b9c0665dc533fb600d9fabe9e34bd1b573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007357e2e0c1ef2fe4347205bdbefcb232106a123cf673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736f0cec873f47f4fd8b5f6c4fa6d0eb9e4109197b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c622005a3b9d3481877e2fae59091b8e0ba6cdd773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ec47ea12030db51901fd80bea1d2e18b9fe1108b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735fcdd34e1cf573bb3605ad1d16d2b4ef3da9a8aa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c5bb99a5e8186a96bf8ac4e8a577935b9365da7973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c3ab35ffc756f0fa91cbfb3753ddad619588774673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cf334d253d45891492124f9806a33c62eaed9ab473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e86fc2678d6bc1903fe012f94a82ff25abc49bb373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f74ab07a3f33d4245323b54dca97896f70b48e6473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737e3472415238cebc4358e87ecdfd6f1f75488d6f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e59e5265607c9f95d360cf5851ca2fc6d513667073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c8ec7c11646c3c1b0f779697f7b727bd19e9e62a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bdc25d8d27878bba39c89f80f994a21311bbb97873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c64b3af5c32628c114caf19e15f4a63d021a2f3973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b409fe7f3d9136fbb5c2804e525e15cecdb7667973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c2f3d2acd4740fc27013d0780e570e3461cf475b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007395ea6c7e000674144b34d11898dee145e2fad3e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732a69f23440308a1991a16cdf52ba5ec4890fa28373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bd10df0eac424b115bb38f24689db55ce5028e9973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b606e082bcc3a55aacf76761ff6992bd615a5a2e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ff802ad3aa746add21e8334ed37c4bf325a8342273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007329779ae8db5b760ff7d066ae1562054f68acb39073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b6f40deee2fd230472d51671f8d60e117d2ee47c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737e30240fec6f7a8ed7b73484b301a466fadb863473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fb38939c99d445405440d4b33ccca39227b646c173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d931bc6dff69379b5b9e139206939b890c836fb373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073957e974830e73a7c3fd881bf63ce305a366b5f5673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073189be4aeb9980bff75a2ecf38bd68de0b47b233173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735def398d753de6b5bb51684c595aa3f854ad254873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e6c53eab5530f2933deced8c5d64bc1a139d7fd673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731f753afeaa2941ec11082fe42bb8c1e9ed499da673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c085dc1310458ec9acd16ff79d424906442795e673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f56281e4ed3260e49b634fa8931f60143ba7f7a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007329425c85cccff3142ac7478f848640e8a64a336273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073da5cf38324d8dd7128bb5849b2850ffe768949fd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007374e535f7e87b547cd280bfdf851101f12af8c43d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007346bc614eafbb8fc82423d4cbcbbfc265926102d273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dfc327bb456bdfd6c03f43993af99022c26e0b1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733fd2fba1c457fb629d0ca2c131819fb2d57af33773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d30ac531efe0aecdda01e2b5a704427aaa62715473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732bcfadf248ed69836d71d5208c2bb7318e1cb3fe73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007338f720babd1fd908aca8cc1e04fbb764338e0d3973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c08829d474bcc5baa07ec6c2781fa98fe06c8b0573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073858114edafcc2f7de622ea01b028876614621b3b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732b7373e33edde9a5becbc045e364d670790f034973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a660d57cae159b69ede8f1a4c6b955d0e006d15073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073287655c5b7b55c5054d2c1fbcdc7ae637ca08e0573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d22aeeadf7107b20da8f9d6c79b3ff8e4eb75ba073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c9881c84595f4805e4effc51ec84a157a6e4a2eb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007397a1b8a62ce496dcca4d785b7e48a51947fcab0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007314301429207726b703180269ee0923ac195e140a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a3440f2615813b2eeeced679d99f4d284d4a6ba873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007316684b55e7c2accf08d602ce7f6bc8d4f3f98cf473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736140e8ad7d7396b99f296f90132ecf10efa5135273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733c770bc6ea69b20e2a3a5e54d9c2ecd037a9fa0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d68fcd8bfc35f9a1b76d1bf8aec0643475e11c3e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d05ed2296b150c4685bca07e1db531facf5f55ab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d1f10f28b08257adbe0678b28c53bfb996d9946473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735716cdd4a6f41fe9cfac0cfeff0f797a5dc4029d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736fdb95ff6fef152a1024bc0923a91f55049872bd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d9386adf8f98f13d21c6993ccf4ca60e4c747e6e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bdd7e8543f1d4767e7d9ed9905e406da8ee69ddf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007394d6ae094585892586719794b347b46300241efc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731d0514011be92974f5cbfd9db36b37a1157492f073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073837b4e84d5b6fba8854b472be5740bebfdd38c6e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073585cf3a47b7df092f20e64b5cfc495fcf51e326073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bf94a18c91b1dd162f3dc10a570dbca78fd4ff0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733e4aac5af8ec7f1098f2d336836ec70ee9fa367373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735cc70e898f13dbcd8546b0e40123e1cfed78af7073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007312bffa80c3ca3cd0fe431a60f9b5c709b8a387f173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d766b23a8cbebf2b44c6c8eec7a45413c556fc2473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bca8920417868733e711fcd187a76ce85036afd773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073620bf65f890b569efb9339e4c25ace1e18f0181973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b974b9ae4178359bfdef57097677ac5ccf4d14c973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073275ba13992be5bfdf7835b77fafaa896d77a279173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738db008fdc0fe2fd0b076c052c5211dc666f6d91873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736e0ac17fceaf5009435275be342960adc6f8493f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007386c0f0b48073a788a9aa232b49a1d0f7bb480ef273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007347e5d62998dcb952ab96ae8a510090fc599606aa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a48325b0dcbb88ccc0f2cc8179183886a3fd3f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d9da2593e00d53e43bcfd8c8e29352b90c93421073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bb92fb7b5284da93afce4600e83f0f1a733f79ea73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007310ea861a5f90844607a30358580204a6883ce6e173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fc421eb806334675a9a3ed129b7df14028e22b1e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073383578e2ca5521ef3704dd325f4b788701de733673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a49068f6c4e23711e1ec6e5bb90628ce84d0030a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007336b4eb32221f92587c016156573f17c14cf6c4c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736e2fa073417d7c325a2762a83c22a0aeaa6bbb7473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732f28ae3337028ac5b1dac33e74def5a82ae7a3d973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f06dd0c468fefd44a0797311771d6f83cbd799c873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c7f98dcf1b53420d64e1af8e836befb25ceedc0c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b9f1915fc05b2d27e8f8f4088cc27e26c0796b1373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732bc1d089d1627b872034a1a57f0e7f31e672617373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736283565ce531bb4be177f2627738c039e3f5b73a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b2581dd7082e9e89b7c41fab99e822dc1fa2df2f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073717309d0bf0c529a8e26ea41ce9d3700dce2b32573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730d369f9eb9e0e743a7f5c834344b9867adf6126573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d1b890b73f6800afb135face70757e1d16f5053973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073562805caea5f57603220aab660da900cd599b40b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735621678f90c17c4cbc125b33ce47c49bff9db39f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073470c94707244c8353a4455c52b19756624bba2fa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738a682a0c0a49f8a768565b911304669cbf7cf6c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d801c86518e369a48bd1657b06e83958d11ffbae73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737af718188874802ab54a27f5c5a38c8824e5378d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007364ca6d31d886288512d1e598e6444ded4307647973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c83411e27d6982731755f2af2f3d62a0ae0bfb4873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732284fac032edfb17be8c30503e1942d2b7607ff773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073069752147e756cba56c9d0d415dffccbc8ee316173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e2e61b64d798ba4ff0b6a8af35748059fd3c199b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007339692f2e93eac30654b6df76bf52dbdea48a6da373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620061db57607f821691505b602082108103620061f157620061f062006193565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200625b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200621c565b6200626786836200621c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620062b4620062ae620062a8846200627f565b62006289565b6200627f565b9050919050565b6000819050919050565b620062d08362006293565b620062e8620062df82620062bb565b84845462006229565b825550505050565b600090565b620062ff620062f0565b6200630c818484620062c5565b505050565b5b81811015620063345762006328600082620062f5565b60018101905062006312565b5050565b601f82111562006383576200634d81620061f7565b62006358846200620c565b8101602085101562006368578190505b6200638062006377856200620c565b83018262006311565b50505b505050565b600082821c905092915050565b6000620063a86000198460080262006388565b1980831691505092915050565b6000620063c3838362006395565b9150826002028217905092915050565b620063de8262006159565b67ffffffffffffffff811115620063fa57620063f962006164565b5b620064068254620061c2565b6200641382828562006338565b600060209050601f8311600181146200644b576000841562006436578287015190505b620064428582620063b5565b865550620064b2565b601f1984166200645b86620061f7565b60005b8281101562006485578489015182556001820191506020850194506020810190506200645e565b86831015620064a55784890151620064a1601f89168262006395565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620064e782620064ba565b9050919050565b620064f981620064da565b82525050565b6000604082019050620065166000830185620064ee565b620065256020830184620064ee565b9392505050565b6000602082019050620065436000830184620064ee565b92915050565b6140fd80620065596000396000f3fe6080604052600436106102305760003560e01c8063868ff4a21161012e578063b88d4fde116100ab578063de7fcb1d1161006f578063de7fcb1d146107c3578063e0a80853146107ee578063e510873c14610817578063e985e9c514610840578063f2fde38b1461087d57610230565b8063b88d4fde146106ed578063b8ca64e414610709578063c6f6f21614610732578063c87b56dd1461075b578063d5abeb011461079857610230565b8063a035b1fe116100f2578063a035b1fe14610629578063a0712d6814610654578063a22cb46514610670578063a45ba8e714610699578063af947cec146106c457610230565b8063868ff4a2146105655780638da5cb5b14610581578063918b5be1146105ac57806391b7f5ed146105d557806395d89b41146105fe57610230565b806341f43434116101bc5780636352211e116101805780636352211e1461048057806367df1952146104bd5780636c0360eb146104e657806370a0823114610511578063715018a61461054e57610230565b806341f43434146103a857806342842e0e146103d35780634813d8a6146103ef578063518302271461042c57806355f804b31461045757610230565b80630bb12bb8116102035780630bb12bb8146102f657806318160ddd1461032157806323b872dd1461034c578063379607f5146103685780633ccfd60b1461039157610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612dfd565b6108a6565b6040516102699190612e45565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190612ef0565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612f48565b6109ca565b6040516102d19190612fb6565b60405180910390f35b6102f460048036038101906102ef9190612ffd565b610a28565b005b34801561030257600080fd5b5061030b610a41565b6040516103189190612e45565b60405180910390f35b34801561032d57600080fd5b50610336610a54565b604051610343919061304c565b60405180910390f35b61036660048036038101906103619190613067565b610a6b565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612f48565b610aba565b005b34801561039d57600080fd5b506103a6610b42565b005b3480156103b457600080fd5b506103bd610cc2565b6040516103ca9190613119565b60405180910390f35b6103ed60048036038101906103e89190613067565b610cd4565b005b3480156103fb57600080fd5b5061041660048036038101906104119190613134565b610d23565b6040516104239190612e45565b60405180910390f35b34801561043857600080fd5b50610441610d43565b60405161044e9190612e45565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906131c6565b610d56565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612f48565b610de8565b6040516104b49190612fb6565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613269565b610dfa565b005b3480156104f257600080fd5b506104fb610f1b565b6040516105089190612ef0565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613134565b610fa9565b604051610545919061304c565b60405180910390f35b34801561055a57600080fd5b50610563611040565b005b61057f600480360381019061057a9190612f48565b61117a565b005b34801561058d57600080fd5b50610596611270565b6040516105a39190612fb6565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906131c6565b611299565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612f48565b61132b565b005b34801561060a57600080fd5b506106136113b1565b6040516106209190612ef0565b60405180910390f35b34801561063557600080fd5b5061063e611443565b60405161064b919061304c565b60405180910390f35b61066e60048036038101906106699190612f48565b611449565b005b34801561067c57600080fd5b50610697600480360381019061069291906132e2565b61159e565b005b3480156106a557600080fd5b506106ae6115b7565b6040516106bb9190612ef0565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190613322565b611645565b005b6107076004803603810190610702919061347f565b6116de565b005b34801561071557600080fd5b50610730600480360381019061072b9190612f48565b61172f565b005b34801561073e57600080fd5b5061075960048036038101906107549190612f48565b6117b5565b005b34801561076757600080fd5b50610782600480360381019061077d9190612f48565b61183b565b60405161078f9190612ef0565b60405180910390f35b3480156107a457600080fd5b506107ad611990565b6040516107ba919061304c565b60405180910390f35b3480156107cf57600080fd5b506107d8611996565b6040516107e5919061304c565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613322565b61199c565b005b34801561082357600080fd5b5061083e60048036038101906108399190613134565b611a35565b005b34801561084c57600080fd5b5061086760048036038101906108629190613502565b611b0c565b6040516108749190612e45565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613134565b611ba0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461094790613571565b80601f016020809104026020016040519081016040528092919081815260200182805461097390613571565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611d48565b6109ea576109e963cf4700e460e01b611dc1565b5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a3281611dcb565b610a3c8383611ec8565b505050565b600e60009054906101000a900460ff1681565b6000610a5e611ed8565b6002546001540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aa957610aa833611dcb565b5b610ab4848484611edd565b50505050565b610ac261219e565b73ffffffffffffffffffffffffffffffffffffffff16610ae0611270565b73ffffffffffffffffffffffffffffffffffffffff1614610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906135ee565b60405180910390fd5b610b3f816121a6565b50565b610b4a61219e565b73ffffffffffffffffffffffffffffffffffffffff16610b68611270565b73ffffffffffffffffffffffffffffffffffffffff1614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb5906135ee565b60405180910390fd5b6002600a5403610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa9061365a565b60405180910390fd5b6002600a8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c31906136ab565b60006040518083038185875af1925050503d8060008114610c6e576040519150601f19603f3d011682016040523d82523d6000602084013e610c73565b606091505b5050905080610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9061370c565b60405180910390fd5b506001600a81905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d1257610d1133611dcb565b5b610d1d8484846121b4565b50505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b610d5e61219e565b73ffffffffffffffffffffffffffffffffffffffff16610d7c611270565b73ffffffffffffffffffffffffffffffffffffffff1614610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc9906135ee565b60405180910390fd5b8181600f9182610de39291906138d9565b505050565b6000610df3826121d4565b9050919050565b610e0261219e565b73ffffffffffffffffffffffffffffffffffffffff16610e20611270565b73ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d906135ee565b60405180910390fd5b60005b82829050811015610f1657600160116000858585818110610e9d57610e9c6139a9565b5b9050602002016020810190610eb29190613134565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0e90613a07565b915050610e79565b505050565b600f8054610f2890613571565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5490613571565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fef57610fee638f4eb60460e01b611dc1565b5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61104861219e565b73ffffffffffffffffffffffffffffffffffffffff16611066611270565b73ffffffffffffffffffffffffffffffffffffffff16146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906135ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000611184610a54565b9050600b5482826111959190613a4f565b11156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613acf565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613b3b565b60405180910390fd5b61126c33836122c0565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112a161219e565b73ffffffffffffffffffffffffffffffffffffffff166112bf611270565b73ffffffffffffffffffffffffffffffffffffffff1614611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906135ee565b60405180910390fd5b8181601091826113269291906138d9565b505050565b61133361219e565b73ffffffffffffffffffffffffffffffffffffffff16611351611270565b73ffffffffffffffffffffffffffffffffffffffff16146113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906135ee565b60405180910390fd5b80600d8190555050565b6060600480546113c090613571565b80601f01602080910402602001604051908101604052809291908181526020018280546113ec90613571565b80156114395780601f1061140e57610100808354040283529160200191611439565b820191906000526020600020905b81548152906001019060200180831161141c57829003601f168201915b5050505050905090565b600d5481565b6000611453610a54565b905060001515600e60009054906101000a900460ff161515146114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290613ba7565b60405180910390fd5b600b5482826114ba9190613a4f565b11156114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290613acf565b60405180910390fd5b600c54821115611540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153790613c39565b60405180910390fd5b81600d5461154e9190613c59565b341015611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613ce7565b60405180910390fd5b61159a33836122c0565b5050565b816115a881611dcb565b6115b283836122de565b505050565b601080546115c490613571565b80601f01602080910402602001604051908101604052809291908181526020018280546115f090613571565b801561163d5780601f106116125761010080835404028352916020019161163d565b820191906000526020600020905b81548152906001019060200180831161162057829003601f168201915b505050505081565b61164d61219e565b73ffffffffffffffffffffffffffffffffffffffff1661166b611270565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906135ee565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461171c5761171b33611dcb565b5b611728858585856123e9565b5050505050565b61173761219e565b73ffffffffffffffffffffffffffffffffffffffff16611755611270565b73ffffffffffffffffffffffffffffffffffffffff16146117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a2906135ee565b60405180910390fd5b80600b8190555050565b6117bd61219e565b73ffffffffffffffffffffffffffffffffffffffff166117db611270565b73ffffffffffffffffffffffffffffffffffffffff1614611831576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611828906135ee565b60405180910390fd5b80600c8190555050565b606061184682611d48565b611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90613d79565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361193257601080546118ad90613571565b80601f01602080910402602001604051908101604052809291908181526020018280546118d990613571565b80156119265780601f106118fb57610100808354040283529160200191611926565b820191906000526020600020905b81548152906001019060200180831161190957829003601f168201915b5050505050905061198b565b600061193c61243b565b9050600081511161195c5760405180602001604052806000815250611987565b80611966846124cd565b604051602001611977929190613dd5565b6040516020818303038152906040525b9150505b919050565b600b5481565b600c5481565b6119a461219e565b73ffffffffffffffffffffffffffffffffffffffff166119c2611270565b73ffffffffffffffffffffffffffffffffffffffff1614611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906135ee565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b611a3d61219e565b73ffffffffffffffffffffffffffffffffffffffff16611a5b611270565b73ffffffffffffffffffffffffffffffffffffffff1614611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa8906135ee565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba861219e565b73ffffffffffffffffffffffffffffffffffffffff16611bc6611270565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906135ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290613e6b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081611d53611ed8565b11611dbc57600154821015611dbb5760005b6000600560008581526020019081526020016000205491508103611d945782611d8d90613e8b565b9250611d65565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ec5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e42929190613eb4565b602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e839190613ef2565b611ec457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ebb9190612fb6565b60405180910390fd5b5b50565b611ed48282600161262d565b5050565b600090565b6000611ee8826121d4565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f5d57611f5c63a114810060e01b611dc1565b5b600080611f698461275c565b91509150611f7f8187611f7a612783565b61278b565b611faa57611f9486611f8f612783565b611b0c565b611fa957611fa86359c896be60e01b611dc1565b5b5b611fb786868660016127cf565b8015611fc257600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506120908561206c8888876127d5565b7c0200000000000000000000000000000000000000000000000000000000176127fd565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121165760006001850190506000600560008381526020019081526020016000205403612114576001548114612113578360056000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036121885761218763ea553b3460e01b611dc1565b5b6121958787876001612828565b50505050505050565b600033905090565b6121b181600061282e565b50565b6121cf838383604051806020016040528060008152506116de565b505050565b6000816121df611ed8565b116122aa57600560008381526020019081526020016000205490506000810361228157600154821061221c5761221b63df2d9b4260e01b611dc1565b5b5b6005600083600190039350838152602001908152602001600020549050600081031561227c5760007c0100000000000000000000000000000000000000000000000000000000821603156122bb5761227b63df2d9b4260e01b611dc1565b5b61221d565b60007c0100000000000000000000000000000000000000000000000000000000821603156122bb575b6122ba63df2d9b4260e01b611dc1565b5b919050565b6122da828260405180602001604052806000815250612a5f565b5050565b80600860006122eb612783565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612398612783565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123dd9190612e45565b60405180910390a35050565b6123f4848484610a6b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124355761241f84848484612ae5565b6124345761243363d1a57ed660e01b611dc1565b5b5b50505050565b6060600f805461244a90613571565b80601f016020809104026020016040519081016040528092919081815260200182805461247690613571565b80156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b5050505050905090565b606060008203612514576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612628565b600082905060005b6000821461254657808061252f90613a07565b915050600a8261253f9190613f4e565b915061251c565b60008167ffffffffffffffff81111561256257612561613354565b5b6040519080825280601f01601f1916602001820160405280156125945781602001600182028036833780820191505090505b5090505b60008514612621576001826125ad9190613f7f565b9150600a856125bc9190613fb3565b60306125c89190613a4f565b60f81b8183815181106125de576125dd6139a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561261a9190613f4e565b9450612598565b8093505050505b919050565b600061263883610de8565b905081801561267a57508073ffffffffffffffffffffffffffffffffffffffff16612661612783565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126a6576126908161268b612783565b611b0c565b6126a5576126a463cfb3b94260e01b611dc1565b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127ec868684612c14565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612839836121d4565b9050600081905060008061284c8661275c565b915091508415612894576128688184612863612783565b61278b565b6128935761287d83612878612783565b611b0c565b612892576128916359c896be60e01b611dc1565b5b5b5b6128a28360008860016127cf565b80156128ad57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061295583612912856000886127d5565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127fd565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129db57600060018701905060006005600083815260200190815260200160002054036129d95760015481146129d8578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a45836000886001612828565b600260008154809291906001019190505550505050505050565b612a698383612c1d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ae05760006001549050600083820390505b612aaa6000868380600101945086612ae5565b612abf57612abe63d1a57ed660e01b611dc1565b5b818110612a97578160015414612add57612adc600060e01b611dc1565b5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b0b612783565b8786866040518563ffffffff1660e01b8152600401612b2d9493929190614039565b6020604051808303816000875af1925050508015612b6957506040513d601f19601f82011682018060405250810190612b66919061409a565b60015b612bc1573d8060008114612b99576040519150601f19603f3d011682016040523d82523d6000602084013e612b9e565b606091505b506000815103612bb957612bb863d1a57ed660e01b611dc1565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612c3d57612c3c63b562e8dd60e01b611dc1565b5b612c4a60008483856127cf565b612c6a83612c5b60008660006127d5565b612c6485612d81565b176127fd565b6005600083815260200190815260200160002081905550600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103612d2257612d21632e07630060e01b611dc1565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612d2f5781600181905550505050612d7c6000848385612828565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dda81612da5565b8114612de557600080fd5b50565b600081359050612df781612dd1565b92915050565b600060208284031215612e1357612e12612d9b565b5b6000612e2184828501612de8565b91505092915050565b60008115159050919050565b612e3f81612e2a565b82525050565b6000602082019050612e5a6000830184612e36565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e9a578082015181840152602081019050612e7f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ec282612e60565b612ecc8185612e6b565b9350612edc818560208601612e7c565b612ee581612ea6565b840191505092915050565b60006020820190508181036000830152612f0a8184612eb7565b905092915050565b6000819050919050565b612f2581612f12565b8114612f3057600080fd5b50565b600081359050612f4281612f1c565b92915050565b600060208284031215612f5e57612f5d612d9b565b5b6000612f6c84828501612f33565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa082612f75565b9050919050565b612fb081612f95565b82525050565b6000602082019050612fcb6000830184612fa7565b92915050565b612fda81612f95565b8114612fe557600080fd5b50565b600081359050612ff781612fd1565b92915050565b6000806040838503121561301457613013612d9b565b5b600061302285828601612fe8565b925050602061303385828601612f33565b9150509250929050565b61304681612f12565b82525050565b6000602082019050613061600083018461303d565b92915050565b6000806000606084860312156130805761307f612d9b565b5b600061308e86828701612fe8565b935050602061309f86828701612fe8565b92505060406130b086828701612f33565b9150509250925092565b6000819050919050565b60006130df6130da6130d584612f75565b6130ba565b612f75565b9050919050565b60006130f1826130c4565b9050919050565b6000613103826130e6565b9050919050565b613113816130f8565b82525050565b600060208201905061312e600083018461310a565b92915050565b60006020828403121561314a57613149612d9b565b5b600061315884828501612fe8565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261318657613185613161565b5b8235905067ffffffffffffffff8111156131a3576131a2613166565b5b6020830191508360018202830111156131bf576131be61316b565b5b9250929050565b600080602083850312156131dd576131dc612d9b565b5b600083013567ffffffffffffffff8111156131fb576131fa612da0565b5b61320785828601613170565b92509250509250929050565b60008083601f84011261322957613228613161565b5b8235905067ffffffffffffffff81111561324657613245613166565b5b6020830191508360208202830111156132625761326161316b565b5b9250929050565b600080602083850312156132805761327f612d9b565b5b600083013567ffffffffffffffff81111561329e5761329d612da0565b5b6132aa85828601613213565b92509250509250929050565b6132bf81612e2a565b81146132ca57600080fd5b50565b6000813590506132dc816132b6565b92915050565b600080604083850312156132f9576132f8612d9b565b5b600061330785828601612fe8565b9250506020613318858286016132cd565b9150509250929050565b60006020828403121561333857613337612d9b565b5b6000613346848285016132cd565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61338c82612ea6565b810181811067ffffffffffffffff821117156133ab576133aa613354565b5b80604052505050565b60006133be612d91565b90506133ca8282613383565b919050565b600067ffffffffffffffff8211156133ea576133e9613354565b5b6133f382612ea6565b9050602081019050919050565b82818337600083830152505050565b600061342261341d846133cf565b6133b4565b90508281526020810184848401111561343e5761343d61334f565b5b613449848285613400565b509392505050565b600082601f83011261346657613465613161565b5b813561347684826020860161340f565b91505092915050565b6000806000806080858703121561349957613498612d9b565b5b60006134a787828801612fe8565b94505060206134b887828801612fe8565b93505060406134c987828801612f33565b925050606085013567ffffffffffffffff8111156134ea576134e9612da0565b5b6134f687828801613451565b91505092959194509250565b6000806040838503121561351957613518612d9b565b5b600061352785828601612fe8565b925050602061353885828601612fe8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061358957607f821691505b60208210810361359c5761359b613542565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d8602083612e6b565b91506135e3826135a2565b602082019050919050565b60006020820190508181036000830152613607816135cb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613644601f83612e6b565b915061364f8261360e565b602082019050919050565b6000602082019050818103600083015261367381613637565b9050919050565b600081905092915050565b50565b600061369560008361367a565b91506136a082613685565b600082019050919050565b60006136b682613688565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136f6601083612e6b565b9150613701826136c0565b602082019050919050565b60006020820190508181036000830152613725816136e9565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261375c565b6137a3868361375c565b95508019841693508086168417925050509392505050565b60006137d66137d16137cc84612f12565b6130ba565b612f12565b9050919050565b6000819050919050565b6137f0836137bb565b6138046137fc826137dd565b848454613769565b825550505050565b600090565b61381961380c565b6138248184846137e7565b505050565b5b818110156138485761383d600082613811565b60018101905061382a565b5050565b601f82111561388d5761385e81613737565b6138678461374c565b81016020851015613876578190505b61388a6138828561374c565b830182613829565b50505b505050565b600082821c905092915050565b60006138b060001984600802613892565b1980831691505092915050565b60006138c9838361389f565b9150826002028217905092915050565b6138e3838361372c565b67ffffffffffffffff8111156138fc576138fb613354565b5b6139068254613571565b61391182828561384c565b6000601f831160018114613940576000841561392e578287013590505b61393885826138bd565b8655506139a0565b601f19841661394e86613737565b60005b8281101561397657848901358255600182019150602085019450602081019050613951565b86831015613993578489013561398f601f89168261389f565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1282612f12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a4457613a436139d8565b5b600182019050919050565b6000613a5a82612f12565b9150613a6583612f12565b9250828201905080821115613a7d57613a7c6139d8565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613ab9602083612e6b565b9150613ac482613a83565b602082019050919050565b60006020820190508181036000830152613ae881613aac565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b6000613b25601883612e6b565b9150613b3082613aef565b602082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4d696e74206e6f74206f70656e20666f72207075626c69630000000000000000600082015250565b6000613b91601883612e6b565b9150613b9c82613b5b565b602082019050919050565b60006020820190508181036000830152613bc081613b84565b9050919050565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b6000613c23602883612e6b565b9150613c2e82613bc7565b604082019050919050565b60006020820190508181036000830152613c5281613c16565b9050919050565b6000613c6482612f12565b9150613c6f83612f12565b9250828202613c7d81612f12565b91508282048414831517613c9457613c936139d8565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613cd1601d83612e6b565b9150613cdc82613c9b565b602082019050919050565b60006020820190508181036000830152613d0081613cc4565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d63602f83612e6b565b9150613d6e82613d07565b604082019050919050565b60006020820190508181036000830152613d9281613d56565b9050919050565b600081905092915050565b6000613daf82612e60565b613db98185613d99565b9350613dc9818560208601612e7c565b80840191505092915050565b6000613de18285613da4565b9150613ded8284613da4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e55602683612e6b565b9150613e6082613df9565b604082019050919050565b60006020820190508181036000830152613e8481613e48565b9050919050565b6000613e9682612f12565b915060008203613ea957613ea86139d8565b5b600182039050919050565b6000604082019050613ec96000830185612fa7565b613ed66020830184612fa7565b9392505050565b600081519050613eec816132b6565b92915050565b600060208284031215613f0857613f07612d9b565b5b6000613f1684828501613edd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f5982612f12565b9150613f6483612f12565b925082613f7457613f73613f1f565b5b828204905092915050565b6000613f8a82612f12565b9150613f9583612f12565b9250828203905081811115613fad57613fac6139d8565b5b92915050565b6000613fbe82612f12565b9150613fc983612f12565b925082613fd957613fd8613f1f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061400b82613fe4565b6140158185613fef565b9350614025818560208601612e7c565b61402e81612ea6565b840191505092915050565b600060808201905061404e6000830187612fa7565b61405b6020830186612fa7565b614068604083018561303d565b818103606083015261407a8184614000565b905095945050505050565b60008151905061409481612dd1565b92915050565b6000602082840312156140b0576140af612d9b565b5b60006140be84828501614085565b9150509291505056fea2646970667358221220dbb6db4c1f4b18073bebd7298a2120740190e456a08a32575400d62a55afa91f64736f6c63430008120033697066733a2f2f6261666b72656965706f3533666e633469353372766b61696573326562696f6a6b636a327867616e6f776a633279726c6d6879746d797177356734

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063868ff4a21161012e578063b88d4fde116100ab578063de7fcb1d1161006f578063de7fcb1d146107c3578063e0a80853146107ee578063e510873c14610817578063e985e9c514610840578063f2fde38b1461087d57610230565b8063b88d4fde146106ed578063b8ca64e414610709578063c6f6f21614610732578063c87b56dd1461075b578063d5abeb011461079857610230565b8063a035b1fe116100f2578063a035b1fe14610629578063a0712d6814610654578063a22cb46514610670578063a45ba8e714610699578063af947cec146106c457610230565b8063868ff4a2146105655780638da5cb5b14610581578063918b5be1146105ac57806391b7f5ed146105d557806395d89b41146105fe57610230565b806341f43434116101bc5780636352211e116101805780636352211e1461048057806367df1952146104bd5780636c0360eb146104e657806370a0823114610511578063715018a61461054e57610230565b806341f43434146103a857806342842e0e146103d35780634813d8a6146103ef578063518302271461042c57806355f804b31461045757610230565b80630bb12bb8116102035780630bb12bb8146102f657806318160ddd1461032157806323b872dd1461034c578063379607f5146103685780633ccfd60b1461039157610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612dfd565b6108a6565b6040516102699190612e45565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190612ef0565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612f48565b6109ca565b6040516102d19190612fb6565b60405180910390f35b6102f460048036038101906102ef9190612ffd565b610a28565b005b34801561030257600080fd5b5061030b610a41565b6040516103189190612e45565b60405180910390f35b34801561032d57600080fd5b50610336610a54565b604051610343919061304c565b60405180910390f35b61036660048036038101906103619190613067565b610a6b565b005b34801561037457600080fd5b5061038f600480360381019061038a9190612f48565b610aba565b005b34801561039d57600080fd5b506103a6610b42565b005b3480156103b457600080fd5b506103bd610cc2565b6040516103ca9190613119565b60405180910390f35b6103ed60048036038101906103e89190613067565b610cd4565b005b3480156103fb57600080fd5b5061041660048036038101906104119190613134565b610d23565b6040516104239190612e45565b60405180910390f35b34801561043857600080fd5b50610441610d43565b60405161044e9190612e45565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906131c6565b610d56565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612f48565b610de8565b6040516104b49190612fb6565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613269565b610dfa565b005b3480156104f257600080fd5b506104fb610f1b565b6040516105089190612ef0565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613134565b610fa9565b604051610545919061304c565b60405180910390f35b34801561055a57600080fd5b50610563611040565b005b61057f600480360381019061057a9190612f48565b61117a565b005b34801561058d57600080fd5b50610596611270565b6040516105a39190612fb6565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906131c6565b611299565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612f48565b61132b565b005b34801561060a57600080fd5b506106136113b1565b6040516106209190612ef0565b60405180910390f35b34801561063557600080fd5b5061063e611443565b60405161064b919061304c565b60405180910390f35b61066e60048036038101906106699190612f48565b611449565b005b34801561067c57600080fd5b50610697600480360381019061069291906132e2565b61159e565b005b3480156106a557600080fd5b506106ae6115b7565b6040516106bb9190612ef0565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190613322565b611645565b005b6107076004803603810190610702919061347f565b6116de565b005b34801561071557600080fd5b50610730600480360381019061072b9190612f48565b61172f565b005b34801561073e57600080fd5b5061075960048036038101906107549190612f48565b6117b5565b005b34801561076757600080fd5b50610782600480360381019061077d9190612f48565b61183b565b60405161078f9190612ef0565b60405180910390f35b3480156107a457600080fd5b506107ad611990565b6040516107ba919061304c565b60405180910390f35b3480156107cf57600080fd5b506107d8611996565b6040516107e5919061304c565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613322565b61199c565b005b34801561082357600080fd5b5061083e60048036038101906108399190613134565b611a35565b005b34801561084c57600080fd5b5061086760048036038101906108629190613502565b611b0c565b6040516108749190612e45565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613134565b611ba0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461094790613571565b80601f016020809104026020016040519081016040528092919081815260200182805461097390613571565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611d48565b6109ea576109e963cf4700e460e01b611dc1565b5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a3281611dcb565b610a3c8383611ec8565b505050565b600e60009054906101000a900460ff1681565b6000610a5e611ed8565b6002546001540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aa957610aa833611dcb565b5b610ab4848484611edd565b50505050565b610ac261219e565b73ffffffffffffffffffffffffffffffffffffffff16610ae0611270565b73ffffffffffffffffffffffffffffffffffffffff1614610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906135ee565b60405180910390fd5b610b3f816121a6565b50565b610b4a61219e565b73ffffffffffffffffffffffffffffffffffffffff16610b68611270565b73ffffffffffffffffffffffffffffffffffffffff1614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb5906135ee565b60405180910390fd5b6002600a5403610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa9061365a565b60405180910390fd5b6002600a8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c31906136ab565b60006040518083038185875af1925050503d8060008114610c6e576040519150601f19603f3d011682016040523d82523d6000602084013e610c73565b606091505b5050905080610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9061370c565b60405180910390fd5b506001600a81905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d1257610d1133611dcb565b5b610d1d8484846121b4565b50505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b610d5e61219e565b73ffffffffffffffffffffffffffffffffffffffff16610d7c611270565b73ffffffffffffffffffffffffffffffffffffffff1614610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc9906135ee565b60405180910390fd5b8181600f9182610de39291906138d9565b505050565b6000610df3826121d4565b9050919050565b610e0261219e565b73ffffffffffffffffffffffffffffffffffffffff16610e20611270565b73ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d906135ee565b60405180910390fd5b60005b82829050811015610f1657600160116000858585818110610e9d57610e9c6139a9565b5b9050602002016020810190610eb29190613134565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0e90613a07565b915050610e79565b505050565b600f8054610f2890613571565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5490613571565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fef57610fee638f4eb60460e01b611dc1565b5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61104861219e565b73ffffffffffffffffffffffffffffffffffffffff16611066611270565b73ffffffffffffffffffffffffffffffffffffffff16146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906135ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000611184610a54565b9050600b5482826111959190613a4f565b11156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613acf565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613b3b565b60405180910390fd5b61126c33836122c0565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112a161219e565b73ffffffffffffffffffffffffffffffffffffffff166112bf611270565b73ffffffffffffffffffffffffffffffffffffffff1614611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906135ee565b60405180910390fd5b8181601091826113269291906138d9565b505050565b61133361219e565b73ffffffffffffffffffffffffffffffffffffffff16611351611270565b73ffffffffffffffffffffffffffffffffffffffff16146113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906135ee565b60405180910390fd5b80600d8190555050565b6060600480546113c090613571565b80601f01602080910402602001604051908101604052809291908181526020018280546113ec90613571565b80156114395780601f1061140e57610100808354040283529160200191611439565b820191906000526020600020905b81548152906001019060200180831161141c57829003601f168201915b5050505050905090565b600d5481565b6000611453610a54565b905060001515600e60009054906101000a900460ff161515146114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290613ba7565b60405180910390fd5b600b5482826114ba9190613a4f565b11156114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290613acf565b60405180910390fd5b600c54821115611540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153790613c39565b60405180910390fd5b81600d5461154e9190613c59565b341015611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613ce7565b60405180910390fd5b61159a33836122c0565b5050565b816115a881611dcb565b6115b283836122de565b505050565b601080546115c490613571565b80601f01602080910402602001604051908101604052809291908181526020018280546115f090613571565b801561163d5780601f106116125761010080835404028352916020019161163d565b820191906000526020600020905b81548152906001019060200180831161162057829003601f168201915b505050505081565b61164d61219e565b73ffffffffffffffffffffffffffffffffffffffff1661166b611270565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906135ee565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461171c5761171b33611dcb565b5b611728858585856123e9565b5050505050565b61173761219e565b73ffffffffffffffffffffffffffffffffffffffff16611755611270565b73ffffffffffffffffffffffffffffffffffffffff16146117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a2906135ee565b60405180910390fd5b80600b8190555050565b6117bd61219e565b73ffffffffffffffffffffffffffffffffffffffff166117db611270565b73ffffffffffffffffffffffffffffffffffffffff1614611831576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611828906135ee565b60405180910390fd5b80600c8190555050565b606061184682611d48565b611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90613d79565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361193257601080546118ad90613571565b80601f01602080910402602001604051908101604052809291908181526020018280546118d990613571565b80156119265780601f106118fb57610100808354040283529160200191611926565b820191906000526020600020905b81548152906001019060200180831161190957829003601f168201915b5050505050905061198b565b600061193c61243b565b9050600081511161195c5760405180602001604052806000815250611987565b80611966846124cd565b604051602001611977929190613dd5565b6040516020818303038152906040525b9150505b919050565b600b5481565b600c5481565b6119a461219e565b73ffffffffffffffffffffffffffffffffffffffff166119c2611270565b73ffffffffffffffffffffffffffffffffffffffff1614611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906135ee565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b611a3d61219e565b73ffffffffffffffffffffffffffffffffffffffff16611a5b611270565b73ffffffffffffffffffffffffffffffffffffffff1614611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa8906135ee565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba861219e565b73ffffffffffffffffffffffffffffffffffffffff16611bc6611270565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906135ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290613e6b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081611d53611ed8565b11611dbc57600154821015611dbb5760005b6000600560008581526020019081526020016000205491508103611d945782611d8d90613e8b565b9250611d65565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ec5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e42929190613eb4565b602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e839190613ef2565b611ec457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ebb9190612fb6565b60405180910390fd5b5b50565b611ed48282600161262d565b5050565b600090565b6000611ee8826121d4565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f5d57611f5c63a114810060e01b611dc1565b5b600080611f698461275c565b91509150611f7f8187611f7a612783565b61278b565b611faa57611f9486611f8f612783565b611b0c565b611fa957611fa86359c896be60e01b611dc1565b5b5b611fb786868660016127cf565b8015611fc257600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506120908561206c8888876127d5565b7c0200000000000000000000000000000000000000000000000000000000176127fd565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121165760006001850190506000600560008381526020019081526020016000205403612114576001548114612113578360056000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036121885761218763ea553b3460e01b611dc1565b5b6121958787876001612828565b50505050505050565b600033905090565b6121b181600061282e565b50565b6121cf838383604051806020016040528060008152506116de565b505050565b6000816121df611ed8565b116122aa57600560008381526020019081526020016000205490506000810361228157600154821061221c5761221b63df2d9b4260e01b611dc1565b5b5b6005600083600190039350838152602001908152602001600020549050600081031561227c5760007c0100000000000000000000000000000000000000000000000000000000821603156122bb5761227b63df2d9b4260e01b611dc1565b5b61221d565b60007c0100000000000000000000000000000000000000000000000000000000821603156122bb575b6122ba63df2d9b4260e01b611dc1565b5b919050565b6122da828260405180602001604052806000815250612a5f565b5050565b80600860006122eb612783565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612398612783565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123dd9190612e45565b60405180910390a35050565b6123f4848484610a6b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124355761241f84848484612ae5565b6124345761243363d1a57ed660e01b611dc1565b5b5b50505050565b6060600f805461244a90613571565b80601f016020809104026020016040519081016040528092919081815260200182805461247690613571565b80156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b5050505050905090565b606060008203612514576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612628565b600082905060005b6000821461254657808061252f90613a07565b915050600a8261253f9190613f4e565b915061251c565b60008167ffffffffffffffff81111561256257612561613354565b5b6040519080825280601f01601f1916602001820160405280156125945781602001600182028036833780820191505090505b5090505b60008514612621576001826125ad9190613f7f565b9150600a856125bc9190613fb3565b60306125c89190613a4f565b60f81b8183815181106125de576125dd6139a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561261a9190613f4e565b9450612598565b8093505050505b919050565b600061263883610de8565b905081801561267a57508073ffffffffffffffffffffffffffffffffffffffff16612661612783565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126a6576126908161268b612783565b611b0c565b6126a5576126a463cfb3b94260e01b611dc1565b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127ec868684612c14565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612839836121d4565b9050600081905060008061284c8661275c565b915091508415612894576128688184612863612783565b61278b565b6128935761287d83612878612783565b611b0c565b612892576128916359c896be60e01b611dc1565b5b5b5b6128a28360008860016127cf565b80156128ad57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061295583612912856000886127d5565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127fd565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129db57600060018701905060006005600083815260200190815260200160002054036129d95760015481146129d8578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a45836000886001612828565b600260008154809291906001019190505550505050505050565b612a698383612c1d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ae05760006001549050600083820390505b612aaa6000868380600101945086612ae5565b612abf57612abe63d1a57ed660e01b611dc1565b5b818110612a97578160015414612add57612adc600060e01b611dc1565b5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b0b612783565b8786866040518563ffffffff1660e01b8152600401612b2d9493929190614039565b6020604051808303816000875af1925050508015612b6957506040513d601f19601f82011682018060405250810190612b66919061409a565b60015b612bc1573d8060008114612b99576040519150601f19603f3d011682016040523d82523d6000602084013e612b9e565b606091505b506000815103612bb957612bb863d1a57ed660e01b611dc1565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612c3d57612c3c63b562e8dd60e01b611dc1565b5b612c4a60008483856127cf565b612c6a83612c5b60008660006127d5565b612c6485612d81565b176127fd565b6005600083815260200190815260200160002081905550600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103612d2257612d21632e07630060e01b611dc1565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612d2f5781600181905550505050612d7c6000848385612828565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dda81612da5565b8114612de557600080fd5b50565b600081359050612df781612dd1565b92915050565b600060208284031215612e1357612e12612d9b565b5b6000612e2184828501612de8565b91505092915050565b60008115159050919050565b612e3f81612e2a565b82525050565b6000602082019050612e5a6000830184612e36565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e9a578082015181840152602081019050612e7f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ec282612e60565b612ecc8185612e6b565b9350612edc818560208601612e7c565b612ee581612ea6565b840191505092915050565b60006020820190508181036000830152612f0a8184612eb7565b905092915050565b6000819050919050565b612f2581612f12565b8114612f3057600080fd5b50565b600081359050612f4281612f1c565b92915050565b600060208284031215612f5e57612f5d612d9b565b5b6000612f6c84828501612f33565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa082612f75565b9050919050565b612fb081612f95565b82525050565b6000602082019050612fcb6000830184612fa7565b92915050565b612fda81612f95565b8114612fe557600080fd5b50565b600081359050612ff781612fd1565b92915050565b6000806040838503121561301457613013612d9b565b5b600061302285828601612fe8565b925050602061303385828601612f33565b9150509250929050565b61304681612f12565b82525050565b6000602082019050613061600083018461303d565b92915050565b6000806000606084860312156130805761307f612d9b565b5b600061308e86828701612fe8565b935050602061309f86828701612fe8565b92505060406130b086828701612f33565b9150509250925092565b6000819050919050565b60006130df6130da6130d584612f75565b6130ba565b612f75565b9050919050565b60006130f1826130c4565b9050919050565b6000613103826130e6565b9050919050565b613113816130f8565b82525050565b600060208201905061312e600083018461310a565b92915050565b60006020828403121561314a57613149612d9b565b5b600061315884828501612fe8565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261318657613185613161565b5b8235905067ffffffffffffffff8111156131a3576131a2613166565b5b6020830191508360018202830111156131bf576131be61316b565b5b9250929050565b600080602083850312156131dd576131dc612d9b565b5b600083013567ffffffffffffffff8111156131fb576131fa612da0565b5b61320785828601613170565b92509250509250929050565b60008083601f84011261322957613228613161565b5b8235905067ffffffffffffffff81111561324657613245613166565b5b6020830191508360208202830111156132625761326161316b565b5b9250929050565b600080602083850312156132805761327f612d9b565b5b600083013567ffffffffffffffff81111561329e5761329d612da0565b5b6132aa85828601613213565b92509250509250929050565b6132bf81612e2a565b81146132ca57600080fd5b50565b6000813590506132dc816132b6565b92915050565b600080604083850312156132f9576132f8612d9b565b5b600061330785828601612fe8565b9250506020613318858286016132cd565b9150509250929050565b60006020828403121561333857613337612d9b565b5b6000613346848285016132cd565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61338c82612ea6565b810181811067ffffffffffffffff821117156133ab576133aa613354565b5b80604052505050565b60006133be612d91565b90506133ca8282613383565b919050565b600067ffffffffffffffff8211156133ea576133e9613354565b5b6133f382612ea6565b9050602081019050919050565b82818337600083830152505050565b600061342261341d846133cf565b6133b4565b90508281526020810184848401111561343e5761343d61334f565b5b613449848285613400565b509392505050565b600082601f83011261346657613465613161565b5b813561347684826020860161340f565b91505092915050565b6000806000806080858703121561349957613498612d9b565b5b60006134a787828801612fe8565b94505060206134b887828801612fe8565b93505060406134c987828801612f33565b925050606085013567ffffffffffffffff8111156134ea576134e9612da0565b5b6134f687828801613451565b91505092959194509250565b6000806040838503121561351957613518612d9b565b5b600061352785828601612fe8565b925050602061353885828601612fe8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061358957607f821691505b60208210810361359c5761359b613542565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d8602083612e6b565b91506135e3826135a2565b602082019050919050565b60006020820190508181036000830152613607816135cb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613644601f83612e6b565b915061364f8261360e565b602082019050919050565b6000602082019050818103600083015261367381613637565b9050919050565b600081905092915050565b50565b600061369560008361367a565b91506136a082613685565b600082019050919050565b60006136b682613688565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136f6601083612e6b565b9150613701826136c0565b602082019050919050565b60006020820190508181036000830152613725816136e9565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261375c565b6137a3868361375c565b95508019841693508086168417925050509392505050565b60006137d66137d16137cc84612f12565b6130ba565b612f12565b9050919050565b6000819050919050565b6137f0836137bb565b6138046137fc826137dd565b848454613769565b825550505050565b600090565b61381961380c565b6138248184846137e7565b505050565b5b818110156138485761383d600082613811565b60018101905061382a565b5050565b601f82111561388d5761385e81613737565b6138678461374c565b81016020851015613876578190505b61388a6138828561374c565b830182613829565b50505b505050565b600082821c905092915050565b60006138b060001984600802613892565b1980831691505092915050565b60006138c9838361389f565b9150826002028217905092915050565b6138e3838361372c565b67ffffffffffffffff8111156138fc576138fb613354565b5b6139068254613571565b61391182828561384c565b6000601f831160018114613940576000841561392e578287013590505b61393885826138bd565b8655506139a0565b601f19841661394e86613737565b60005b8281101561397657848901358255600182019150602085019450602081019050613951565b86831015613993578489013561398f601f89168261389f565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1282612f12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a4457613a436139d8565b5b600182019050919050565b6000613a5a82612f12565b9150613a6583612f12565b9250828201905080821115613a7d57613a7c6139d8565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613ab9602083612e6b565b9150613ac482613a83565b602082019050919050565b60006020820190508181036000830152613ae881613aac565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b6000613b25601883612e6b565b9150613b3082613aef565b602082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4d696e74206e6f74206f70656e20666f72207075626c69630000000000000000600082015250565b6000613b91601883612e6b565b9150613b9c82613b5b565b602082019050919050565b60006020820190508181036000830152613bc081613b84565b9050919050565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b6000613c23602883612e6b565b9150613c2e82613bc7565b604082019050919050565b60006020820190508181036000830152613c5281613c16565b9050919050565b6000613c6482612f12565b9150613c6f83612f12565b9250828202613c7d81612f12565b91508282048414831517613c9457613c936139d8565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613cd1601d83612e6b565b9150613cdc82613c9b565b602082019050919050565b60006020820190508181036000830152613d0081613cc4565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d63602f83612e6b565b9150613d6e82613d07565b604082019050919050565b60006020820190508181036000830152613d9281613d56565b9050919050565b600081905092915050565b6000613daf82612e60565b613db98185613d99565b9350613dc9818560208601612e7c565b80840191505092915050565b6000613de18285613da4565b9150613ded8284613da4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e55602683612e6b565b9150613e6082613df9565b604082019050919050565b60006020820190508181036000830152613e8481613e48565b9050919050565b6000613e9682612f12565b915060008203613ea957613ea86139d8565b5b600182039050919050565b6000604082019050613ec96000830185612fa7565b613ed66020830184612fa7565b9392505050565b600081519050613eec816132b6565b92915050565b600060208284031215613f0857613f07612d9b565b5b6000613f1684828501613edd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f5982612f12565b9150613f6483612f12565b925082613f7457613f73613f1f565b5b828204905092915050565b6000613f8a82612f12565b9150613f9583612f12565b9250828203905081811115613fad57613fac6139d8565b5b92915050565b6000613fbe82612f12565b9150613fc983612f12565b925082613fd957613fd8613f1f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061400b82613fe4565b6140158185613fef565b9350614025818560208601612e7c565b61402e81612ea6565b840191505092915050565b600060808201905061404e6000830187612fa7565b61405b6020830186612fa7565b614068604083018561303d565b818103606083015261407a8184614000565b905095945050505050565b60008151905061409481612dd1565b92915050565b6000602082840312156140b0576140af612d9b565b5b60006140be84828501614085565b9150509291505056fea2646970667358221220dbb6db4c1f4b18073bebd7298a2120740190e456a08a32575400d62a55afa91f64736f6c63430008120033

Deployed Bytecode Sourcemap

74996:22549:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38264:655;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39182:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46511:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77785:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75228:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34814:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78668:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77593:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77399:186;;;;;;;;;;;;;:::i;:::-;;15997:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78192:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75449:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75266:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76748:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40647:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79362:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75301:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35998:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7344:148;;;;;;;;;;;;;:::i;:::-;;78905:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6693:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76521:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76198:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39358:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75182:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75598:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77983:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75329:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76094:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78413:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76292:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76403:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76970:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75105:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75143:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76653:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79231:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47523:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7647:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38264:655;38365:4;38704:10;38689:25;;:11;:25;;;;:102;;;;38781:10;38766:25;;:11;:25;;;;38689:102;:179;;;;38858:10;38843:25;;:11;:25;;;;38689:179;38669:199;;38264:655;;;:::o;39182:100::-;39236:13;39269:5;39262:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39182:100;:::o;46511:256::-;46603:7;46628:16;46636:7;46628;:16::i;:::-;46623:86;;46659:50;46667:41;;;46659:7;:50::i;:::-;46623:86;46729:15;:24;46745:7;46729:24;;;;;;;;;;;:30;;;;;;;;;;;;46722:37;;46511:256;;;:::o;77785:190::-;77914:8;17913:30;17934:8;17913:20;:30::i;:::-;77935:32:::1;77949:8;77959:7;77935:13;:32::i;:::-;77785:190:::0;;;:::o;75228:31::-;;;;;;;;;;;;;:::o;34814:323::-;34875:7;35103:15;:13;:15::i;:::-;35088:12;;35072:13;;:28;:46;35065:53;;34814:323;:::o;78668:205::-;78811:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78828:37:::1;78847:4;78853:2;78857:7;78828:18;:37::i;:::-;78668:205:::0;;;;:::o;77593:84::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77655:14:::1;77661:7;77655:5;:14::i;:::-;77593:84:::0;:::o;77399:186::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3746:1:::1;4343:7;;:19:::0;4335:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3746:1;4476:7;:18;;;;77463:12:::2;77481:10;:15;;77504:21;77481:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77462:68;;;77549:7;77541:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;77451:134;3702:1:::1;4655:7;:22;;;;77399:186::o:0;15997:143::-;8014:42;15997:143;:::o;78192:213::-;78339:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78356:41:::1;78379:4;78385:2;78389:7;78356:22;:41::i;:::-;78192:213:::0;;;;:::o;75449:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;75266:28::-;;;;;;;;;;;;;:::o;76748:106::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76836:10:::1;;76826:7;:20;;;;;;;:::i;:::-;;76748:106:::0;;:::o;40647:168::-;40735:7;40778:27;40797:7;40778:18;:27::i;:::-;40755:52;;40647:168;;;:::o;79362:220::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79459:6:::1;79454:117;79475:10;;:17;;79471:1;:21;79454:117;;;79551:4;79518:15;:30;79534:10;;79545:1;79534:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;79518:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;79494:3;;;;;:::i;:::-;;;;79454:117;;;;79362:220:::0;;:::o;75301:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35998:258::-;36086:7;36127:1;36110:19;;:5;:19;;;36106:69;;36131:44;36139:35;;;36131:7;:44::i;:::-;36106:69;30094:13;36193:18;:25;36212:5;36193:25;;;;;;;;;;;;;;;;:55;36186:62;;35998:258;;;:::o;7344:148::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7451:1:::1;7414:40;;7435:6;::::0;::::1;;;;;;;;7414:40;;;;;;;;;;;;7482:1;7465:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;7344:148::o:0;78905:314::-;78974:10;78987:13;:11;:13::i;:::-;78974:26;;79038:9;;79028:6;79023:2;:11;;;;:::i;:::-;:24;;79015:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;79107:15;:27;79123:10;79107:27;;;;;;;;;;;;;;;;;;;;;;;;;79099:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;79178:29;79188:10;79200:6;79178:9;:29::i;:::-;78959:260;78905:314;:::o;6693:87::-;6739:7;6766:6;;;;;;;;;;;6759:13;;6693:87;:::o;76521:124::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76625:12:::1;;76605:17;:32;;;;;;;:::i;:::-;;76521:124:::0;;:::o;76198:86::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76270:6:::1;76262:5;:14;;;;76198:86:::0;:::o;39358:104::-;39414:13;39447:7;39440:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39358:104;:::o;75182:39::-;;;;:::o;75598:488::-;75656:10;75669:13;:11;:13::i;:::-;75656:26;;75717:5;75701:21;;:12;;;;;;;;;;;:21;;;75693:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75785:9;;75775:6;75770:2;:11;;;;:::i;:::-;:24;;75762:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;75874:12;;75864:6;:22;;75842:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;75996:6;75988:5;;:14;;;;:::i;:::-;75975:9;:27;;75967:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76049:29;76059:10;76071:6;76049:9;:29::i;:::-;75645:441;75598:488;:::o;77983:201::-;78112:8;17913:30;17934:8;17913:20;:30::i;:::-;78133:43:::1;78157:8;78167;78133:23;:43::i;:::-;77983:201:::0;;;:::o;75329:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76094:96::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76176:6:::1;76161:12;;:21;;;;;;;;;;;;;;;;;;76094:96:::0;:::o;78413:247::-;78588:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78605:47:::1;78628:4;78634:2;78638:7;78647:4;78605:22;:47::i;:::-;78413:247:::0;;;;;:::o;76292:103::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76377:10:::1;76365:9;:22;;;;76292:103:::0;:::o;76403:110::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76492:13:::1;76477:12;:28;;;;76403:110:::0;:::o;76970:421::-;77044:13;77078:17;77086:8;77078:7;:17::i;:::-;77070:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;77173:5;77161:17;;:8;;;;;;;;;;;:17;;;77157:50;;77188:17;77181:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77157:50;77217:28;77248:10;:8;:10::i;:::-;77217:41;;77307:1;77282:14;77276:28;:32;:107;;;;;;;;;;;;;;;;;77335:14;77351:26;77368:8;77351:16;:26::i;:::-;77318:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77276:107;77269:114;;;76970:421;;;;:::o;75105:31::-;;;;:::o;75143:32::-;;;;:::o;76653:87::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76726:6:::1;76715:8;;:17;;;;;;;;;;;;;;;;;;76653:87:::0;:::o;79231:119::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79334:4:::1;79306:15;:25;79322:8;79306:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;79231:119:::0;:::o;47523:189::-;47645:4;47669:18;:25;47688:5;47669:25;;;;;;;;;;;;;;;:35;47695:8;47669:35;;;;;;;;;;;;;;;;;;;;;;;;;47662:42;;47523:189;;;;:::o;7647:244::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7756:1:::1;7736:22;;:8;:22;;::::0;7728:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7846:8;7817:38;;7838:6;::::0;::::1;;;;;;;;7817:38;;;;;;;;;;;;7875:8;7866:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;7647:244:::0;:::o;47970:384::-;48051:11;48098:7;48079:15;:13;:15::i;:::-;:26;48075:272;;48136:13;;48126:7;:23;48122:214;;;48170:14;48203:60;48251:1;48220:17;:26;48238:7;48220:26;;;;;;;;;;;;48211:35;;;48210:42;48203:60;;48254:9;;;;:::i;:::-;;;48203:60;;;48319:1;30870:8;48291:6;:24;:29;48282:38;;48151:185;48122:214;48075:272;47970:384;;;:::o;74761:165::-;74862:13;74856:4;74849:27;74903:4;74897;74890:18;18056:740;18295:1;8014:42;18247:45;;;:49;18243:546;;;8014:42;18564;;;18637:4;18665:8;18564:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18541:237;;18753:8;18734:28;;;;;;;;;;;:::i;:::-;;;;;;;;18541:237;18243:546;18056:740;:::o;46203:149::-;46317:27;46326:2;46330:7;46339:4;46317:8;:27::i;:::-;46203:149;;:::o;34330:92::-;34386:7;34330:92;:::o;50356:3701::-;50498:27;50528;50547:7;50528:18;:27::i;:::-;50498:57;;31552:14;50699:4;50683:22;;:41;50660:66;;50784:4;50743:45;;50759:19;50743:45;;;50739:108;;50803:44;50811:35;;;50803:7;:44::i;:::-;50739:108;50875:27;50917:23;50954:35;50981:7;50954:26;:35::i;:::-;50860:129;;;;51103:134;51146:15;51180:4;51203:19;:17;:19::i;:::-;51103:24;:134::i;:::-;51084:296;;51267:43;51284:4;51290:19;:17;:19::i;:::-;51267:16;:43::i;:::-;51262:118;;51329:51;51337:42;;;51329:7;:51::i;:::-;51262:118;51084:296;51393:43;51415:4;51421:2;51425:7;51434:1;51393:21;:43::i;:::-;51529:15;51526:160;;;51669:1;51648:19;51641:30;51526:160;52066:18;:24;52085:4;52066:24;;;;;;;;;;;;;;;;52064:26;;;;;;;;;;;;52135:18;:22;52154:2;52135:22;;;;;;;;;;;;;;;;52133:24;;;;;;;;;;;52457:167;52494:2;52564:45;52579:4;52585:2;52589:19;52564:14;:45::i;:::-;31150:8;52515:94;52457:18;:167::i;:::-;52428:17;:26;52446:7;52428:26;;;;;;;;;;;:196;;;;52795:1;31150:8;52744:19;:47;:52;52740:627;;52817:19;52849:1;52839:7;:11;52817:33;;53006:1;52972:17;:30;52990:11;52972:30;;;;;;;;;;;;:35;52968:384;;53110:13;;53095:11;:28;53091:242;;53290:19;53257:17;:30;53275:11;53257:30;;;;;;;;;;;:52;;;;53091:242;52968:384;52798:569;52740:627;53480:16;31552:14;53515:2;53499:20;;:39;53480:58;;53879:7;53843:8;53809:4;53751:25;53696:1;53639;53616:299;53952:1;53940:8;:13;53936:58;;53955:39;53963:30;;;53955:7;:39::i;:::-;53936:58;54007:42;54028:4;54034:2;54038:7;54047:1;54007:20;:42::i;:::-;50487:3570;;;;50356:3701;;;:::o;5284:98::-;5337:7;5364:10;5357:17;;5284:98;:::o;66700:89::-;66760:21;66766:7;66775:5;66760;:21::i;:::-;66700:89;:::o;54153:193::-;54299:39;54316:4;54322:2;54326:7;54299:39;;;;;;;;;;;;:16;:39::i;:::-;54153:193;;;:::o;42191:2049::-;42274:14;42324:7;42305:15;:13;:15::i;:::-;:26;42301:1874;;42357:17;:26;42375:7;42357:26;;;;;;;;;;;;42348:35;;42493:1;42483:6;:11;42479:1313;;42530:13;;42519:7;:24;42515:98;;42566:47;42574:38;;;42566:7;:47::i;:::-;42515:98;43170:607;43248:17;:28;43266:9;;;;;;;43248:28;;;;;;;;;;;;43239:37;;43336:1;43326:6;:11;43322:25;43339:8;43322:25;43402:1;30870:8;43374:6;:24;:29;43370:48;43405:13;43370:48;43710:47;43718:38;;;43710:7;:47::i;:::-;43170:607;;;42479:1313;44147:1;30870:8;44119:6;:24;:29;44115:48;44150:13;44115:48;42301:1874;44185:47;44193:38;;;44185:7;:47::i;:::-;42191:2049;;;;:::o;65041:112::-;65118:27;65128:2;65132:8;65118:27;;;;;;;;;;;;:9;:27::i;:::-;65041:112;;:::o;47107:259::-;47279:8;47227:18;:39;47246:19;:17;:19::i;:::-;47227:39;;;;;;;;;;;;;;;:49;47267:8;47227:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;47339:8;47303:55;;47318:19;:17;:19::i;:::-;47303:55;;;47349:8;47303:55;;;;;;:::i;:::-;;;;;;;;47107:259;;:::o;54944:416::-;55119:31;55132:4;55138:2;55142:7;55119:12;:31::i;:::-;55183:1;55165:2;:14;;;:19;55161:192;;55204:56;55235:4;55241:2;55245:7;55254:5;55204:30;:56::i;:::-;55199:154;;55281:56;55289:47;;;55281:7;:56::i;:::-;55199:154;55161:192;54944:416;;;;:::o;76862:100::-;76914:13;76947:7;76940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76862:100;:::o;277:723::-;333:13;563:1;554:5;:10;550:53;;581:10;;;;;;;;;;;;;;;;;;;;;550:53;613:12;628:5;613:20;;644:14;669:78;684:1;676:4;:9;669:78;;702:8;;;;;:::i;:::-;;;;733:2;725:10;;;;;:::i;:::-;;;669:78;;;757:19;789:6;779:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;757:39;;807:154;823:1;814:5;:10;807:154;;851:1;841:11;;;;;:::i;:::-;;;918:2;910:5;:10;;;;:::i;:::-;897:2;:24;;;;:::i;:::-;884:39;;867:6;874;867:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;947:2;938:11;;;;;:::i;:::-;;;807:154;;;985:6;971:21;;;;;277:723;;;;:::o;65959:474::-;66088:13;66104:16;66112:7;66104;:16::i;:::-;66088:32;;66137:13;:45;;;;;66177:5;66154:28;;:19;:17;:19::i;:::-;:28;;;;66137:45;66133:201;;;66202:44;66219:5;66226:19;:17;:19::i;:::-;66202:16;:44::i;:::-;66197:137;;66267:51;66275:42;;;66267:7;:51::i;:::-;66197:137;66133:201;66379:2;66346:15;:24;66362:7;66346:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;66417:7;66413:2;66397:28;;66406:5;66397:28;;;;;;;;;;;;66077:356;65959:474;;;:::o;49235:501::-;49353:27;49382:23;49423:38;49464:15;:24;49480:7;49464:24;;;;;;;;;;;49423:65;;49641:18;49618:41;;49698:19;49692:26;49673:45;;49603:126;49235:501;;;:::o;72726:105::-;72786:7;72813:10;72806:17;;72726:105;:::o;48463:659::-;48612:11;48777:16;48770:5;48766:28;48757:37;;48937:16;48926:9;48922:32;48909:45;;49087:15;49076:9;49073:30;49065:5;49054:9;49051:20;49048:56;49038:66;;48463:659;;;;;:::o;56022:159::-;;;;;:::o;72035:311::-;72170:7;72190:16;31274:3;72216:19;:41;;72190:68;;31274:3;72284:31;72295:4;72301:2;72305:9;72284:10;:31::i;:::-;72276:40;;:62;;72269:69;;;72035:311;;;;;:::o;44804:524::-;44909:14;45077:16;45070:5;45066:28;45057:37;;45289:5;45275:11;45250:23;45246:41;45243:52;45219:5;45198:112;45188:122;;44804:524;;;;:::o;56846:158::-;;;;;:::o;67018:3283::-;67098:27;67128;67147:7;67128:18;:27::i;:::-;67098:57;;67168:12;67199:19;67168:52;;67248:27;67290:23;67327:35;67354:7;67327:26;:35::i;:::-;67233:129;;;;67379:13;67375:460;;;67518:150;67565:15;67603:4;67630:19;:17;:19::i;:::-;67518:24;:150::i;:::-;67495:328;;67706:43;67723:4;67729:19;:17;:19::i;:::-;67706:16;:43::i;:::-;67701:122;;67772:51;67780:42;;;67772:7;:51::i;:::-;67701:122;67495:328;67375:460;67847:51;67869:4;67883:1;67887:7;67896:1;67847:21;:51::i;:::-;67991:15;67988:160;;;68131:1;68110:19;68103:30;67988:160;68809:1;30359:3;68779:1;:26;;68778:32;68750:18;:24;68769:4;68750:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;69077:197;69114:4;69206:53;69221:4;69235:1;69239:19;69206:14;:53::i;:::-;31150:8;30870;69138:43;69137:122;69077:18;:197::i;:::-;69048:17;:26;69066:7;69048:26;;;;;;;;;;;:226;;;;69445:1;31150:8;69394:19;:47;:52;69390:627;;69467:19;69499:1;69489:7;:11;69467:33;;69656:1;69622:17;:30;69640:11;69622:30;;;;;;;;;;;;:35;69618:384;;69760:13;;69745:11;:28;69741:242;;69940:19;69907:17;:30;69925:11;69907:30;;;;;;;;;;;:52;;;;69741:242;69618:384;69448:569;69390:627;70072:7;70068:1;70045:35;;70054:4;70045:35;;;;;;;;;;;;70091:50;70112:4;70126:1;70130:7;70139:1;70091:20;:50::i;:::-;70268:12;;:14;;;;;;;;;;;;;67087:3214;;;;67018:3283;;:::o;64002:955::-;64133:19;64139:2;64143:8;64133:5;:19::i;:::-;64212:1;64194:2;:14;;;:19;64190:749;;64234:11;64248:13;;64234:27;;64280:13;64302:8;64296:3;:14;64280:30;;64329:489;64386:205;64455:1;64488:2;64521:7;;;;;;64559:5;64386:30;:205::i;:::-;64355:423;;64642:112;64680:47;;;64642:7;:112::i;:::-;64355:423;64813:3;64805:5;:11;64329:489;;64900:3;64883:13;;:20;64879:44;;64905:18;64920:1;64913:9;;64905:7;:18::i;:::-;64879:44;64215:724;;64190:749;64002:955;;;:::o;57444:806::-;57607:4;57666:2;57641:45;;;57705:19;:17;:19::i;:::-;57743:4;57766:7;57792:5;57641:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57624:619;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58043:1;58026:6;:13;:18;58022:115;;58065:56;58073:47;;;58065:7;:56::i;:::-;58022:115;58209:6;58203:13;58194:6;58190:2;58186:15;58179:38;57624:619;57912:54;;;57885:81;;;:6;:81;;;;57861:105;;;57444:806;;;;;;:::o;71736:147::-;71873:6;71736:147;;;;;:::o;58712:2360::-;58785:20;58808:13;;58785:36;;58848:1;58836:8;:13;58832:53;;58851:34;58859:25;;;58851:7;:34::i;:::-;58832:53;58898:61;58928:1;58932:2;58936:12;58950:8;58898:21;:61::i;:::-;59432:160;59469:2;59544:33;59567:1;59571:2;59575:1;59544:14;:33::i;:::-;59490:30;59511:8;59490:20;:30::i;:::-;:87;59432:18;:160::i;:::-;59398:17;:31;59416:12;59398:31;;;;;;;;;;;:194;;;;59913:1;30232:2;59883:1;:26;;59882:32;59853:8;:62;59810:18;:22;59829:2;59810:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;60026:16;31552:14;60061:2;60045:20;;:39;60026:58;;60117:1;60105:8;:13;60101:54;;60120:35;60128:26;;;60120:7;:35::i;:::-;60101:54;60172:11;60201:8;60186:12;:23;60172:37;;60224:15;60242:12;60224:30;;60271:676;60690:7;60646:8;60601:1;60535:25;60472:1;60407;60376:358;60942:3;60929:9;;;;;;:16;60271:676;;60979:3;60963:13;:19;;;;59147:1847;;;61004:60;61033:1;61037:2;61041:12;61055:8;61004:20;:60::i;:::-;58774:2298;58712:2360;;:::o;45430:340::-;45516:14;45749:1;45739:8;45736:15;45710:24;45706:46;45696:56;;45430:340;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:60::-;5895:3;5916:5;5909:12;;5867:60;;;:::o;5933:142::-;5983:9;6016:53;6034:34;6043:24;6061:5;6043:24;:::i;:::-;6034:34;:::i;:::-;6016:53;:::i;:::-;6003:66;;5933:142;;;:::o;6081:126::-;6131:9;6164:37;6195:5;6164:37;:::i;:::-;6151:50;;6081:126;;;:::o;6213:157::-;6294:9;6327:37;6358:5;6327:37;:::i;:::-;6314:50;;6213:157;;;:::o;6376:193::-;6494:68;6556:5;6494:68;:::i;:::-;6489:3;6482:81;6376:193;;:::o;6575:284::-;6699:4;6737:2;6726:9;6722:18;6714:26;;6750:102;6849:1;6838:9;6834:17;6825:6;6750:102;:::i;:::-;6575:284;;;;:::o;6865:329::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;:::i;:::-;7114:63;;7070:117;6865:329;;;;:::o;7200:117::-;7309:1;7306;7299:12;7323:117;7432:1;7429;7422:12;7446:117;7555:1;7552;7545:12;7583:553;7641:8;7651:6;7701:3;7694:4;7686:6;7682:17;7678:27;7668:122;;7709:79;;:::i;:::-;7668:122;7822:6;7809:20;7799:30;;7852:18;7844:6;7841:30;7838:117;;;7874:79;;:::i;:::-;7838:117;7988:4;7980:6;7976:17;7964:29;;8042:3;8034:4;8026:6;8022:17;8012:8;8008:32;8005:41;8002:128;;;8049:79;;:::i;:::-;8002:128;7583:553;;;;;:::o;8142:529::-;8213:6;8221;8270:2;8258:9;8249:7;8245:23;8241:32;8238:119;;;8276:79;;:::i;:::-;8238:119;8424:1;8413:9;8409:17;8396:31;8454:18;8446:6;8443:30;8440:117;;;8476:79;;:::i;:::-;8440:117;8589:65;8646:7;8637:6;8626:9;8622:22;8589:65;:::i;:::-;8571:83;;;;8367:297;8142:529;;;;;:::o;8694:568::-;8767:8;8777:6;8827:3;8820:4;8812:6;8808:17;8804:27;8794:122;;8835:79;;:::i;:::-;8794:122;8948:6;8935:20;8925:30;;8978:18;8970:6;8967:30;8964:117;;;9000:79;;:::i;:::-;8964:117;9114:4;9106:6;9102:17;9090:29;;9168:3;9160:4;9152:6;9148:17;9138:8;9134:32;9131:41;9128:128;;;9175:79;;:::i;:::-;9128:128;8694:568;;;;;:::o;9268:559::-;9354:6;9362;9411:2;9399:9;9390:7;9386:23;9382:32;9379:119;;;9417:79;;:::i;:::-;9379:119;9565:1;9554:9;9550:17;9537:31;9595:18;9587:6;9584:30;9581:117;;;9617:79;;:::i;:::-;9581:117;9730:80;9802:7;9793:6;9782:9;9778:22;9730:80;:::i;:::-;9712:98;;;;9508:312;9268:559;;;;;:::o;9833:116::-;9903:21;9918:5;9903:21;:::i;:::-;9896:5;9893:32;9883:60;;9939:1;9936;9929:12;9883:60;9833:116;:::o;9955:133::-;9998:5;10036:6;10023:20;10014:29;;10052:30;10076:5;10052:30;:::i;:::-;9955:133;;;;:::o;10094:468::-;10159:6;10167;10216:2;10204:9;10195:7;10191:23;10187:32;10184:119;;;10222:79;;:::i;:::-;10184:119;10342:1;10367:53;10412:7;10403:6;10392:9;10388:22;10367:53;:::i;:::-;10357:63;;10313:117;10469:2;10495:50;10537:7;10528:6;10517:9;10513:22;10495:50;:::i;:::-;10485:60;;10440:115;10094:468;;;;;:::o;10568:323::-;10624:6;10673:2;10661:9;10652:7;10648:23;10644:32;10641:119;;;10679:79;;:::i;:::-;10641:119;10799:1;10824:50;10866:7;10857:6;10846:9;10842:22;10824:50;:::i;:::-;10814:60;;10770:114;10568:323;;;;:::o;10897:117::-;11006:1;11003;10996:12;11020:180;11068:77;11065:1;11058:88;11165:4;11162:1;11155:15;11189:4;11186:1;11179:15;11206:281;11289:27;11311:4;11289:27;:::i;:::-;11281:6;11277:40;11419:6;11407:10;11404:22;11383:18;11371:10;11368:34;11365:62;11362:88;;;11430:18;;:::i;:::-;11362:88;11470:10;11466:2;11459:22;11249:238;11206:281;;:::o;11493:129::-;11527:6;11554:20;;:::i;:::-;11544:30;;11583:33;11611:4;11603:6;11583:33;:::i;:::-;11493:129;;;:::o;11628:307::-;11689:4;11779:18;11771:6;11768:30;11765:56;;;11801:18;;:::i;:::-;11765:56;11839:29;11861:6;11839:29;:::i;:::-;11831:37;;11923:4;11917;11913:15;11905:23;;11628:307;;;:::o;11941:146::-;12038:6;12033:3;12028;12015:30;12079:1;12070:6;12065:3;12061:16;12054:27;11941:146;;;:::o;12093:423::-;12170:5;12195:65;12211:48;12252:6;12211:48;:::i;:::-;12195:65;:::i;:::-;12186:74;;12283:6;12276:5;12269:21;12321:4;12314:5;12310:16;12359:3;12350:6;12345:3;12341:16;12338:25;12335:112;;;12366:79;;:::i;:::-;12335:112;12456:54;12503:6;12498:3;12493;12456:54;:::i;:::-;12176:340;12093:423;;;;;:::o;12535:338::-;12590:5;12639:3;12632:4;12624:6;12620:17;12616:27;12606:122;;12647:79;;:::i;:::-;12606:122;12764:6;12751:20;12789:78;12863:3;12855:6;12848:4;12840:6;12836:17;12789:78;:::i;:::-;12780:87;;12596:277;12535:338;;;;:::o;12879:943::-;12974:6;12982;12990;12998;13047:3;13035:9;13026:7;13022:23;13018:33;13015:120;;;13054:79;;:::i;:::-;13015:120;13174:1;13199:53;13244:7;13235:6;13224:9;13220:22;13199:53;:::i;:::-;13189:63;;13145:117;13301:2;13327:53;13372:7;13363:6;13352:9;13348:22;13327:53;:::i;:::-;13317:63;;13272:118;13429:2;13455:53;13500:7;13491:6;13480:9;13476:22;13455:53;:::i;:::-;13445:63;;13400:118;13585:2;13574:9;13570:18;13557:32;13616:18;13608:6;13605:30;13602:117;;;13638:79;;:::i;:::-;13602:117;13743:62;13797:7;13788:6;13777:9;13773:22;13743:62;:::i;:::-;13733:72;;13528:287;12879:943;;;;;;;:::o;13828:474::-;13896:6;13904;13953:2;13941:9;13932:7;13928:23;13924:32;13921:119;;;13959:79;;:::i;:::-;13921:119;14079:1;14104:53;14149:7;14140:6;14129:9;14125:22;14104:53;:::i;:::-;14094:63;;14050:117;14206:2;14232:53;14277:7;14268:6;14257:9;14253:22;14232:53;:::i;:::-;14222:63;;14177:118;13828:474;;;;;:::o;14308:180::-;14356:77;14353:1;14346:88;14453:4;14450:1;14443:15;14477:4;14474:1;14467:15;14494:320;14538:6;14575:1;14569:4;14565:12;14555:22;;14622:1;14616:4;14612:12;14643:18;14633:81;;14699:4;14691:6;14687:17;14677:27;;14633:81;14761:2;14753:6;14750:14;14730:18;14727:38;14724:84;;14780:18;;:::i;:::-;14724:84;14545:269;14494:320;;;:::o;14820:182::-;14960:34;14956:1;14948:6;14944:14;14937:58;14820:182;:::o;15008:366::-;15150:3;15171:67;15235:2;15230:3;15171:67;:::i;:::-;15164:74;;15247:93;15336:3;15247:93;:::i;:::-;15365:2;15360:3;15356:12;15349:19;;15008:366;;;:::o;15380:419::-;15546:4;15584:2;15573:9;15569:18;15561:26;;15633:9;15627:4;15623:20;15619:1;15608:9;15604:17;15597:47;15661:131;15787:4;15661:131;:::i;:::-;15653:139;;15380:419;;;:::o;15805:181::-;15945:33;15941:1;15933:6;15929:14;15922:57;15805:181;:::o;15992:366::-;16134:3;16155:67;16219:2;16214:3;16155:67;:::i;:::-;16148:74;;16231:93;16320:3;16231:93;:::i;:::-;16349:2;16344:3;16340:12;16333:19;;15992:366;;;:::o;16364:419::-;16530:4;16568:2;16557:9;16553:18;16545:26;;16617:9;16611:4;16607:20;16603:1;16592:9;16588:17;16581:47;16645:131;16771:4;16645:131;:::i;:::-;16637:139;;16364:419;;;:::o;16789:147::-;16890:11;16927:3;16912:18;;16789:147;;;;:::o;16942:114::-;;:::o;17062:398::-;17221:3;17242:83;17323:1;17318:3;17242:83;:::i;:::-;17235:90;;17334:93;17423:3;17334:93;:::i;:::-;17452:1;17447:3;17443:11;17436:18;;17062:398;;;:::o;17466:379::-;17650:3;17672:147;17815:3;17672:147;:::i;:::-;17665:154;;17836:3;17829:10;;17466:379;;;:::o;17851:166::-;17991:18;17987:1;17979:6;17975:14;17968:42;17851:166;:::o;18023:366::-;18165:3;18186:67;18250:2;18245:3;18186:67;:::i;:::-;18179:74;;18262:93;18351:3;18262:93;:::i;:::-;18380:2;18375:3;18371:12;18364:19;;18023:366;;;:::o;18395:419::-;18561:4;18599:2;18588:9;18584:18;18576:26;;18648:9;18642:4;18638:20;18634:1;18623:9;18619:17;18612:47;18676:131;18802:4;18676:131;:::i;:::-;18668:139;;18395:419;;;:::o;18820:97::-;18879:6;18907:3;18897:13;;18820:97;;;;:::o;18923:141::-;18972:4;18995:3;18987:11;;19018:3;19015:1;19008:14;19052:4;19049:1;19039:18;19031:26;;18923:141;;;:::o;19070:93::-;19107:6;19154:2;19149;19142:5;19138:14;19134:23;19124:33;;19070:93;;;:::o;19169:107::-;19213:8;19263:5;19257:4;19253:16;19232:37;;19169:107;;;;:::o;19282:393::-;19351:6;19401:1;19389:10;19385:18;19424:97;19454:66;19443:9;19424:97;:::i;:::-;19542:39;19572:8;19561:9;19542:39;:::i;:::-;19530:51;;19614:4;19610:9;19603:5;19599:21;19590:30;;19663:4;19653:8;19649:19;19642:5;19639:30;19629:40;;19358:317;;19282:393;;;;;:::o;19681:142::-;19731:9;19764:53;19782:34;19791:24;19809:5;19791:24;:::i;:::-;19782:34;:::i;:::-;19764:53;:::i;:::-;19751:66;;19681:142;;;:::o;19829:75::-;19872:3;19893:5;19886:12;;19829:75;;;:::o;19910:269::-;20020:39;20051:7;20020:39;:::i;:::-;20081:91;20130:41;20154:16;20130:41;:::i;:::-;20122:6;20115:4;20109:11;20081:91;:::i;:::-;20075:4;20068:105;19986:193;19910:269;;;:::o;20185:73::-;20230:3;20185:73;:::o;20264:189::-;20341:32;;:::i;:::-;20382:65;20440:6;20432;20426:4;20382:65;:::i;:::-;20317:136;20264:189;;:::o;20459:186::-;20519:120;20536:3;20529:5;20526:14;20519:120;;;20590:39;20627:1;20620:5;20590:39;:::i;:::-;20563:1;20556:5;20552:13;20543:22;;20519:120;;;20459:186;;:::o;20651:543::-;20752:2;20747:3;20744:11;20741:446;;;20786:38;20818:5;20786:38;:::i;:::-;20870:29;20888:10;20870:29;:::i;:::-;20860:8;20856:44;21053:2;21041:10;21038:18;21035:49;;;21074:8;21059:23;;21035:49;21097:80;21153:22;21171:3;21153:22;:::i;:::-;21143:8;21139:37;21126:11;21097:80;:::i;:::-;20756:431;;20741:446;20651:543;;;:::o;21200:117::-;21254:8;21304:5;21298:4;21294:16;21273:37;;21200:117;;;;:::o;21323:169::-;21367:6;21400:51;21448:1;21444:6;21436:5;21433:1;21429:13;21400:51;:::i;:::-;21396:56;21481:4;21475;21471:15;21461:25;;21374:118;21323:169;;;;:::o;21497:295::-;21573:4;21719:29;21744:3;21738:4;21719:29;:::i;:::-;21711:37;;21781:3;21778:1;21774:11;21768:4;21765:21;21757:29;;21497:295;;;;:::o;21797:1403::-;21921:44;21961:3;21956;21921:44;:::i;:::-;22030:18;22022:6;22019:30;22016:56;;;22052:18;;:::i;:::-;22016:56;22096:38;22128:4;22122:11;22096:38;:::i;:::-;22181:67;22241:6;22233;22227:4;22181:67;:::i;:::-;22275:1;22304:2;22296:6;22293:14;22321:1;22316:632;;;;22992:1;23009:6;23006:84;;;23065:9;23060:3;23056:19;23043:33;23034:42;;23006:84;23116:67;23176:6;23169:5;23116:67;:::i;:::-;23110:4;23103:81;22965:229;22286:908;;22316:632;22368:4;22364:9;22356:6;22352:22;22402:37;22434:4;22402:37;:::i;:::-;22461:1;22475:215;22489:7;22486:1;22483:14;22475:215;;;22575:9;22570:3;22566:19;22553:33;22545:6;22538:49;22626:1;22618:6;22614:14;22604:24;;22673:2;22662:9;22658:18;22645:31;;22512:4;22509:1;22505:12;22500:17;;22475:215;;;22718:6;22709:7;22706:19;22703:186;;;22783:9;22778:3;22774:19;22761:33;22826:48;22868:4;22860:6;22856:17;22845:9;22826:48;:::i;:::-;22818:6;22811:64;22726:163;22703:186;22935:1;22931;22923:6;22919:14;22915:22;22909:4;22902:36;22323:625;;;22286:908;;21896:1304;;;21797:1403;;;:::o;23206:180::-;23254:77;23251:1;23244:88;23351:4;23348:1;23341:15;23375:4;23372:1;23365:15;23392:180;23440:77;23437:1;23430:88;23537:4;23534:1;23527:15;23561:4;23558:1;23551:15;23578:233;23617:3;23640:24;23658:5;23640:24;:::i;:::-;23631:33;;23686:66;23679:5;23676:77;23673:103;;23756:18;;:::i;:::-;23673:103;23803:1;23796:5;23792:13;23785:20;;23578:233;;;:::o;23817:191::-;23857:3;23876:20;23894:1;23876:20;:::i;:::-;23871:25;;23910:20;23928:1;23910:20;:::i;:::-;23905:25;;23953:1;23950;23946:9;23939:16;;23974:3;23971:1;23968:10;23965:36;;;23981:18;;:::i;:::-;23965:36;23817:191;;;;:::o;24014:182::-;24154:34;24150:1;24142:6;24138:14;24131:58;24014:182;:::o;24202:366::-;24344:3;24365:67;24429:2;24424:3;24365:67;:::i;:::-;24358:74;;24441:93;24530:3;24441:93;:::i;:::-;24559:2;24554:3;24550:12;24543:19;;24202:366;;;:::o;24574:419::-;24740:4;24778:2;24767:9;24763:18;24755:26;;24827:9;24821:4;24817:20;24813:1;24802:9;24798:17;24791:47;24855:131;24981:4;24855:131;:::i;:::-;24847:139;;24574:419;;;:::o;24999:174::-;25139:26;25135:1;25127:6;25123:14;25116:50;24999:174;:::o;25179:366::-;25321:3;25342:67;25406:2;25401:3;25342:67;:::i;:::-;25335:74;;25418:93;25507:3;25418:93;:::i;:::-;25536:2;25531:3;25527:12;25520:19;;25179:366;;;:::o;25551:419::-;25717:4;25755:2;25744:9;25740:18;25732:26;;25804:9;25798:4;25794:20;25790:1;25779:9;25775:17;25768:47;25832:131;25958:4;25832:131;:::i;:::-;25824:139;;25551:419;;;:::o;25976:174::-;26116:26;26112:1;26104:6;26100:14;26093:50;25976:174;:::o;26156:366::-;26298:3;26319:67;26383:2;26378:3;26319:67;:::i;:::-;26312:74;;26395:93;26484:3;26395:93;:::i;:::-;26513:2;26508:3;26504:12;26497:19;;26156:366;;;:::o;26528:419::-;26694:4;26732:2;26721:9;26717:18;26709:26;;26781:9;26775:4;26771:20;26767:1;26756:9;26752:17;26745:47;26809:131;26935:4;26809:131;:::i;:::-;26801:139;;26528:419;;;:::o;26953:227::-;27093:34;27089:1;27081:6;27077:14;27070:58;27162:10;27157:2;27149:6;27145:15;27138:35;26953:227;:::o;27186:366::-;27328:3;27349:67;27413:2;27408:3;27349:67;:::i;:::-;27342:74;;27425:93;27514:3;27425:93;:::i;:::-;27543:2;27538:3;27534:12;27527:19;;27186:366;;;:::o;27558:419::-;27724:4;27762:2;27751:9;27747:18;27739:26;;27811:9;27805:4;27801:20;27797:1;27786:9;27782:17;27775:47;27839:131;27965:4;27839:131;:::i;:::-;27831:139;;27558:419;;;:::o;27983:410::-;28023:7;28046:20;28064:1;28046:20;:::i;:::-;28041:25;;28080:20;28098:1;28080:20;:::i;:::-;28075:25;;28135:1;28132;28128:9;28157:30;28175:11;28157:30;:::i;:::-;28146:41;;28336:1;28327:7;28323:15;28320:1;28317:22;28297:1;28290:9;28270:83;28247:139;;28366:18;;:::i;:::-;28247:139;28031:362;27983:410;;;;:::o;28399:179::-;28539:31;28535:1;28527:6;28523:14;28516:55;28399:179;:::o;28584:366::-;28726:3;28747:67;28811:2;28806:3;28747:67;:::i;:::-;28740:74;;28823:93;28912:3;28823:93;:::i;:::-;28941:2;28936:3;28932:12;28925:19;;28584:366;;;:::o;28956:419::-;29122:4;29160:2;29149:9;29145:18;29137:26;;29209:9;29203:4;29199:20;29195:1;29184:9;29180:17;29173:47;29237:131;29363:4;29237:131;:::i;:::-;29229:139;;28956:419;;;:::o;29381:234::-;29521:34;29517:1;29509:6;29505:14;29498:58;29590:17;29585:2;29577:6;29573:15;29566:42;29381:234;:::o;29621:366::-;29763:3;29784:67;29848:2;29843:3;29784:67;:::i;:::-;29777:74;;29860:93;29949:3;29860:93;:::i;:::-;29978:2;29973:3;29969:12;29962:19;;29621:366;;;:::o;29993:419::-;30159:4;30197:2;30186:9;30182:18;30174:26;;30246:9;30240:4;30236:20;30232:1;30221:9;30217:17;30210:47;30274:131;30400:4;30274:131;:::i;:::-;30266:139;;29993:419;;;:::o;30418:148::-;30520:11;30557:3;30542:18;;30418:148;;;;:::o;30572:390::-;30678:3;30706:39;30739:5;30706:39;:::i;:::-;30761:89;30843:6;30838:3;30761:89;:::i;:::-;30754:96;;30859:65;30917:6;30912:3;30905:4;30898:5;30894:16;30859:65;:::i;:::-;30949:6;30944:3;30940:16;30933:23;;30682:280;30572:390;;;;:::o;30968:435::-;31148:3;31170:95;31261:3;31252:6;31170:95;:::i;:::-;31163:102;;31282:95;31373:3;31364:6;31282:95;:::i;:::-;31275:102;;31394:3;31387:10;;30968:435;;;;;:::o;31409:225::-;31549:34;31545:1;31537:6;31533:14;31526:58;31618:8;31613:2;31605:6;31601:15;31594:33;31409:225;:::o;31640:366::-;31782:3;31803:67;31867:2;31862:3;31803:67;:::i;:::-;31796:74;;31879:93;31968:3;31879:93;:::i;:::-;31997:2;31992:3;31988:12;31981:19;;31640:366;;;:::o;32012:419::-;32178:4;32216:2;32205:9;32201:18;32193:26;;32265:9;32259:4;32255:20;32251:1;32240:9;32236:17;32229:47;32293:131;32419:4;32293:131;:::i;:::-;32285:139;;32012:419;;;:::o;32437:171::-;32476:3;32499:24;32517:5;32499:24;:::i;:::-;32490:33;;32545:4;32538:5;32535:15;32532:41;;32553:18;;:::i;:::-;32532:41;32600:1;32593:5;32589:13;32582:20;;32437:171;;;:::o;32614:332::-;32735:4;32773:2;32762:9;32758:18;32750:26;;32786:71;32854:1;32843:9;32839:17;32830:6;32786:71;:::i;:::-;32867:72;32935:2;32924:9;32920:18;32911:6;32867:72;:::i;:::-;32614:332;;;;;:::o;32952:137::-;33006:5;33037:6;33031:13;33022:22;;33053:30;33077:5;33053:30;:::i;:::-;32952:137;;;;:::o;33095:345::-;33162:6;33211:2;33199:9;33190:7;33186:23;33182:32;33179:119;;;33217:79;;:::i;:::-;33179:119;33337:1;33362:61;33415:7;33406:6;33395:9;33391:22;33362:61;:::i;:::-;33352:71;;33308:125;33095:345;;;;:::o;33446:180::-;33494:77;33491:1;33484:88;33591:4;33588:1;33581:15;33615:4;33612:1;33605:15;33632:185;33672:1;33689:20;33707:1;33689:20;:::i;:::-;33684:25;;33723:20;33741:1;33723:20;:::i;:::-;33718:25;;33762:1;33752:35;;33767:18;;:::i;:::-;33752:35;33809:1;33806;33802:9;33797:14;;33632:185;;;;:::o;33823:194::-;33863:4;33883:20;33901:1;33883:20;:::i;:::-;33878:25;;33917:20;33935:1;33917:20;:::i;:::-;33912:25;;33961:1;33958;33954:9;33946:17;;33985:1;33979:4;33976:11;33973:37;;;33990:18;;:::i;:::-;33973:37;33823:194;;;;:::o;34023:176::-;34055:1;34072:20;34090:1;34072:20;:::i;:::-;34067:25;;34106:20;34124:1;34106:20;:::i;:::-;34101:25;;34145:1;34135:35;;34150:18;;:::i;:::-;34135:35;34191:1;34188;34184:9;34179:14;;34023:176;;;;:::o;34205:98::-;34256:6;34290:5;34284:12;34274:22;;34205:98;;;:::o;34309:168::-;34392:11;34426:6;34421:3;34414:19;34466:4;34461:3;34457:14;34442:29;;34309:168;;;;:::o;34483:373::-;34569:3;34597:38;34629:5;34597:38;:::i;:::-;34651:70;34714:6;34709:3;34651:70;:::i;:::-;34644:77;;34730:65;34788:6;34783:3;34776:4;34769:5;34765:16;34730:65;:::i;:::-;34820:29;34842:6;34820:29;:::i;:::-;34815:3;34811:39;34804:46;;34573:283;34483:373;;;;:::o;34862:640::-;35057:4;35095:3;35084:9;35080:19;35072:27;;35109:71;35177:1;35166:9;35162:17;35153:6;35109:71;:::i;:::-;35190:72;35258:2;35247:9;35243:18;35234:6;35190:72;:::i;:::-;35272;35340:2;35329:9;35325:18;35316:6;35272:72;:::i;:::-;35391:9;35385:4;35381:20;35376:2;35365:9;35361:18;35354:48;35419:76;35490:4;35481:6;35419:76;:::i;:::-;35411:84;;34862:640;;;;;;;:::o;35508:141::-;35564:5;35595:6;35589:13;35580:22;;35611:32;35637:5;35611:32;:::i;:::-;35508:141;;;;:::o;35655:349::-;35724:6;35773:2;35761:9;35752:7;35748:23;35744:32;35741:119;;;35779:79;;:::i;:::-;35741:119;35899:1;35924:63;35979:7;35970:6;35959:9;35955:22;35924:63;:::i;:::-;35914:73;;35870:127;35655:349;;;;:::o

Swarm Source

ipfs://dbb6db4c1f4b18073bebd7298a2120740190e456a08a32575400d62a55afa91f
Loading...
Loading
Loading...
Loading
[ 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.