ETH Price: $3,460.42 (+2.14%)
Gas: 8 Gwei

Token

Moon Maggies (MAGGIE)
 

Overview

Max Total Supply

2,166 MAGGIE

Holders

272

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 MAGGIE
0xf369c94dfc04de177900d639749781e84ceb1304
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:
MoonMaggies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-16
*/

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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
    ) external;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _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 ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // 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**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // 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**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// File: contracts/maggies.sol



//shoutout to Daniel Dil for his Square Bears video - i borrowed most the contract off of that. 
//Also shoutout to Azuki for the ERC721A contract
//magpie season is approaching. cunts are gonna swoop on ya soon. watch ya head.
pragma solidity ^0.8.4;




contract MoonMaggies is ERC721A, Ownable, ReentrancyGuard{
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 4000;
    uint256 public constant MAX_PUBLIC_MINT = 10;
    uint256 public PUBLIC_SALE_PRICE = .02 ether;


    string private  baseTokenUri;
    string public   placeholderTokenUri;

    //deploy smart contract, toggle publicSale 
    bool public isRevealed;
    bool public publicSale;
    bool public pause;
    bool public teamMinted;


    mapping(address => uint256) public totalPublicMint;

    constructor() ERC721A("Moon Maggies", "MAGGIE"){

    }
    //ensure minting is only called by a user and not a contract
    modifier callerIsUser() {
        require(tx.origin == msg.sender, "Moon Maggies :: Cannot be called by a contract");
        _;
    }
    //public mint function. Checks if user is a user and not contract. Max user mint is 4. 
    function mint(uint256 _quantity) external payable callerIsUser{
        require(publicSale, "Sale Not Yet Active.");
        require((totalSupply() + _quantity) <= MAX_SUPPLY, "Beyond Max Supply");
        require((totalPublicMint[msg.sender] +_quantity) <= MAX_PUBLIC_MINT, "Already minted 4 times!");
        require(msg.value >= (PUBLIC_SALE_PRICE * _quantity), "Mint amount below cost price");

        totalPublicMint[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }
    //function to allow team to mint before public sale for marketing purposes or to dump on plebs - only 5 allocated to the team
    function teamMint() external onlyOwner{
        require(!teamMinted, "Moon Maggies :: Team already minted");
        teamMinted = true;
        _safeMint(msg.sender, 5);
    }

        /// @notice Airdrop for a single a wallet.
    function mintForAddress(uint256 _mintAmount, address _receiver) external onlyOwner {
        _safeMint(_receiver, _mintAmount);
    }

    /// @notice Airdrops to multiple wallets.
    function batchMintForAddress(address[] calldata addresses, uint256[] calldata quantities) external onlyOwner {
        uint32 i;
        for (i=0; i < addresses.length; ++i) {
            _safeMint(addresses[i], quantities[i]);
        }
    }

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

    //return uri for certain token - public function to call URI for a specific token. Ensure project is revealed first before giving away URI
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        uint256 trueId = tokenId + 1;

        if(!isRevealed){
            return placeholderTokenUri;
        }
        //string memory baseURI = _baseURI();
        return bytes(baseTokenUri).length > 0 ? string(abi.encodePacked(baseTokenUri, trueId.toString(), ".json")) : "";
    }
    //Setters
    function setTokenUri(string memory _baseTokenUri) external onlyOwner{
        baseTokenUri = _baseTokenUri;
    }
    function setPlaceHolderUri(string memory _placeholderTokenUri) external onlyOwner{
        placeholderTokenUri = _placeholderTokenUri;
    }

    function togglePause() external onlyOwner{
        pause = !pause;
    }

    function setSalePrice(uint256 _price) public onlyOwner{
        PUBLIC_SALE_PRICE = _price;
    }

    function togglePublicSale() external onlyOwner{
        publicSale = !publicSale;
    }

    function toggleReveal() external onlyOwner{
        isRevealed = !isRevealed;
    }
    //withdrawl
    function withdraw() external onlyOwner nonReentrant{
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"batchMintForAddress","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholderTokenUri","type":"string"}],"name":"setPlaceHolderUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266470de4df8200006009553480156200001c57600080fd5b506040518060400160405280600c81526020017f4d6f6f6e204d61676769657300000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d414747494500000000000000000000000000000000000000000000000000008152508160019080519060200190620000a1929190620001b9565b508060029080519060200190620000ba929190620001b9565b505050620000dd620000d1620000eb60201b60201c565b620000f360201b60201c565b6001600881905550620002ce565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c79062000269565b90600052602060002090601f016020900481019282620001eb576000855562000237565b82601f106200020657805160ff191683800117855562000237565b8280016001018555821562000237579182015b828111156200023657825182559160200191906001019062000219565b5b5090506200024691906200024a565b5090565b5b80821115620002655760008160009055506001016200024b565b5090565b600060028204905060018216806200028257607f821691505b602082108114156200029957620002986200029f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61459c80620002de6000396000f3fe6080604052600436106102305760003560e01c80636352211e1161012e578063b88d4fde116100ab578063e222c7f91161006f578063e222c7f9146107f6578063e8b5498d1461080d578063e985e9c514610838578063efbd73f414610875578063f2fde38b1461089e57610230565b8063b88d4fde14610739578063ba7a86b814610762578063c4ae316814610779578063c87b56dd14610790578063de30dd34146107cd57610230565b80638da5cb5b116100f25780638da5cb5b1461067557806395d89b41146106a0578063a0712d68146106cb578063a22cb465146106e7578063b0962c531461071057610230565b80636352211e1461058e57806365f13097146105cb57806370a08231146105f6578063715018a6146106335780638456cb591461064a57610230565b806323b872dd116101bc57806342842e0e1161018057806342842e0e146104bb5780634cf5f7a4146104e45780634f6ccce71461050f57806354214f691461054c5780635b8ad4291461057757610230565b806323b872dd146103e85780632f745c591461041157806332cb6b0c1461044e57806333bc1c5c146104795780633ccfd60b146104a457610230565b8063081812fc11610203578063081812fc146102f1578063095ea7b31461032e57806318160ddd146103575780631919fed7146103825780631c16521c146103ab57610230565b806301ffc9a7146102355780630675b7c61461027257806306fdde031461029b57806307e89ec0146102c6575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906137c3565b6108c7565b6040516102699190613c39565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061381d565b610a11565b005b3480156102a757600080fd5b506102b0610aa7565b6040516102bd9190613c54565b60405180910390f35b3480156102d257600080fd5b506102db610b39565b6040516102e89190613db6565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190613866565b610b3f565b6040516103259190613bd2565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613702565b610bbb565b005b34801561036357600080fd5b5061036c610cc6565b6040516103799190613db6565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613866565b610d1b565b005b3480156103b757600080fd5b506103d260048036038101906103cd919061357f565b610da1565b6040516103df9190613db6565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906135ec565b610db9565b005b34801561041d57600080fd5b5061043860048036038101906104339190613702565b610dc9565b6040516104459190613db6565b60405180910390f35b34801561045a57600080fd5b50610463610fd0565b6040516104709190613db6565b60405180910390f35b34801561048557600080fd5b5061048e610fd6565b60405161049b9190613c39565b60405180910390f35b3480156104b057600080fd5b506104b9610fe9565b005b3480156104c757600080fd5b506104e260048036038101906104dd91906135ec565b61110a565b005b3480156104f057600080fd5b506104f961112a565b6040516105069190613c54565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613866565b6111b8565b6040516105439190613db6565b60405180910390f35b34801561055857600080fd5b50610561611329565b60405161056e9190613c39565b60405180910390f35b34801561058357600080fd5b5061058c61133c565b005b34801561059a57600080fd5b506105b560048036038101906105b09190613866565b6113e4565b6040516105c29190613bd2565b60405180910390f35b3480156105d757600080fd5b506105e06113fa565b6040516105ed9190613db6565b60405180910390f35b34801561060257600080fd5b5061061d6004803603810190610618919061357f565b6113ff565b60405161062a9190613db6565b60405180910390f35b34801561063f57600080fd5b506106486114cf565b005b34801561065657600080fd5b5061065f611557565b60405161066c9190613c39565b60405180910390f35b34801561068157600080fd5b5061068a61156a565b6040516106979190613bd2565b60405180910390f35b3480156106ac57600080fd5b506106b5611594565b6040516106c29190613c54565b60405180910390f35b6106e560048036038101906106e09190613866565b611626565b005b3480156106f357600080fd5b5061070e600480360381019061070991906136c2565b61187b565b005b34801561071c57600080fd5b506107376004803603810190610732919061381d565b6119f3565b005b34801561074557600080fd5b50610760600480360381019061075b919061363f565b611a89565b005b34801561076e57600080fd5b50610777611adc565b005b34801561078557600080fd5b5061078e611bd0565b005b34801561079c57600080fd5b506107b760048036038101906107b29190613866565b611c78565b6040516107c49190613c54565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613742565b611dda565b005b34801561080257600080fd5b5061080b611ed8565b005b34801561081957600080fd5b50610822611f80565b60405161082f9190613c39565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a91906135ac565b611f93565b60405161086c9190613c39565b60405180910390f35b34801561088157600080fd5b5061089c60048036038101906108979190613893565b612027565b005b3480156108aa57600080fd5b506108c560048036038101906108c0919061357f565b6120b1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fa57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0a5750610a09826121a9565b5b9050919050565b610a19612213565b73ffffffffffffffffffffffffffffffffffffffff16610a3761156a565b73ffffffffffffffffffffffffffffffffffffffff1614610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613cd6565b60405180910390fd5b80600a9080519060200190610aa39291906132a4565b5050565b606060018054610ab69061408b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae29061408b565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b60095481565b6000610b4a8261221b565b610b80576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bc6826113e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c2e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4d612213565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c7f5750610c7d81610c78612213565b611f93565b155b15610cb6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc1838383612283565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610d23612213565b73ffffffffffffffffffffffffffffffffffffffff16610d4161156a565b73ffffffffffffffffffffffffffffffffffffffff1614610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613cd6565b60405180910390fd5b8060098190555050565b600d6020528060005260406000206000915090505481565b610dc4838383612335565b505050565b6000610dd4836113ff565b8210610e0c576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610fc4576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f235750610fb7565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f6357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fb55786841415610fac578195505050505050610fca565b83806001019450505b505b8080600101915050610e46565b50600080fd5b92915050565b610fa081565b600c60019054906101000a900460ff1681565b610ff1612213565b73ffffffffffffffffffffffffffffffffffffffff1661100f61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90613cd6565b60405180910390fd5b600260085414156110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613d76565b60405180910390fd5b600260088190555060004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110fe573d6000803e3d6000fd5b50506001600881905550565b61112583838360405180602001604052806000815250611a89565b505050565b600b80546111379061408b565b80601f01602080910402602001604051908101604052809291908181526020018280546111639061408b565b80156111b05780601f10611185576101008083540402835291602001916111b0565b820191906000526020600020905b81548152906001019060200180831161119357829003601f168201915b505050505081565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b828110156112f1576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516112e357858314156112da5781945050505050611324565b82806001019350505b5080806001019150506111f0565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600c60009054906101000a900460ff1681565b611344612213565b73ffffffffffffffffffffffffffffffffffffffff1661136261156a565b73ffffffffffffffffffffffffffffffffffffffff16146113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613cd6565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b60006113ef82612852565b600001519050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611467576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114d7612213565b73ffffffffffffffffffffffffffffffffffffffff166114f561156a565b73ffffffffffffffffffffffffffffffffffffffff161461154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290613cd6565b60405180910390fd5b6115556000612afa565b565b600c60029054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115a39061408b565b80601f01602080910402602001604051908101604052809291908181526020018280546115cf9061408b565b801561161c5780601f106115f15761010080835404028352916020019161161c565b820191906000526020600020905b8154815290600101906020018083116115ff57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90613c96565b60405180910390fd5b600c60019054906101000a900460ff166116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90613d96565b60405180910390fd5b610fa0816116ef610cc6565b6116f99190613eb0565b111561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613d56565b60405180910390fd5b600a81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117879190613eb0565b11156117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90613d36565b60405180910390fd5b806009546117d69190613f37565b341015611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90613d16565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118679190613eb0565b925050819055506118783382612bc0565b50565b611883612213565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006118f5612213565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119a2612213565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119e79190613c39565b60405180910390a35050565b6119fb612213565b73ffffffffffffffffffffffffffffffffffffffff16611a1961156a565b73ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690613cd6565b60405180910390fd5b80600b9080519060200190611a859291906132a4565b5050565b611a94848484612335565b611aa084848484612bde565b611ad6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ae4612213565b73ffffffffffffffffffffffffffffffffffffffff16611b0261156a565b73ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90613cd6565b60405180910390fd5b600c60039054906101000a900460ff1615611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90613cb6565b60405180910390fd5b6001600c60036101000a81548160ff021916908315150217905550611bce336005612bc0565b565b611bd8612213565b73ffffffffffffffffffffffffffffffffffffffff16611bf661156a565b73ffffffffffffffffffffffffffffffffffffffff1614611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390613cd6565b60405180910390fd5b600c60029054906101000a900460ff1615600c60026101000a81548160ff021916908315150217905550565b6060611c838261221b565b611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb990613cf6565b60405180910390fd5b6000600183611cd19190613eb0565b9050600c60009054906101000a900460ff16611d7a57600b8054611cf49061408b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d209061408b565b8015611d6d5780601f10611d4257610100808354040283529160200191611d6d565b820191906000526020600020905b815481529060010190602001808311611d5057829003601f168201915b5050505050915050611dd5565b6000600a8054611d899061408b565b905011611da55760405180602001604052806000815250611dd1565b600a611db082612d6c565b604051602001611dc1929190613ba3565b6040516020818303038152906040525b9150505b919050565b611de2612213565b73ffffffffffffffffffffffffffffffffffffffff16611e0061156a565b73ffffffffffffffffffffffffffffffffffffffff1614611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90613cd6565b60405180910390fd5b60005b848490508163ffffffff161015611ed157611ec085858363ffffffff16818110611e8657611e85614222565b5b9050602002016020810190611e9b919061357f565b84848463ffffffff16818110611eb457611eb3614222565b5b90506020020135612bc0565b80611eca90614137565b9050611e59565b5050505050565b611ee0612213565b73ffffffffffffffffffffffffffffffffffffffff16611efe61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90613cd6565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600c60039054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61202f612213565b73ffffffffffffffffffffffffffffffffffffffff1661204d61156a565b73ffffffffffffffffffffffffffffffffffffffff16146120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a90613cd6565b60405180910390fd5b6120ad8183612bc0565b5050565b6120b9612213565b73ffffffffffffffffffffffffffffffffffffffff166120d761156a565b73ffffffffffffffffffffffffffffffffffffffff161461212d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212490613cd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561219d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219490613c76565b60405180910390fd5b6121a681612afa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168210801561227c575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061234082612852565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612367612213565b73ffffffffffffffffffffffffffffffffffffffff16148061239a57506123998260000151612394612213565b611f93565b5b806123df57506123a8612213565b73ffffffffffffffffffffffffffffffffffffffff166123c784610b3f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612418576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612481576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124e8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f58585856001612ecd565b6125056000848460000151612283565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127e25760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156127e15782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461284b8585856001612ed3565b5050505050565b61285a61332a565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612ac3576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612ac157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129a5578092505050612af5565b5b600115612ac057818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612abb578092505050612af5565b6129a6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bda828260405180602001604052806000815250612ed9565b5050565b6000612bff8473ffffffffffffffffffffffffffffffffffffffff16612eeb565b15612d5f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c28612213565b8786866040518563ffffffff1660e01b8152600401612c4a9493929190613bed565b602060405180830381600087803b158015612c6457600080fd5b505af1925050508015612c9557506040513d601f19601f82011682018060405250810190612c9291906137f0565b60015b612d0f573d8060008114612cc5576040519150601f19603f3d011682016040523d82523d6000602084013e612cca565b606091505b50600081511415612d07576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d64565b600190505b949350505050565b60606000821415612db4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ec8565b600082905060005b60008214612de6578080612dcf906140ee565b915050600a82612ddf9190613f06565b9150612dbc565b60008167ffffffffffffffff811115612e0257612e01614251565b5b6040519080825280601f01601f191660200182016040528015612e345781602001600182028036833780820191505090505b5090505b60008514612ec157600182612e4d9190613f91565b9150600a85612e5c9190614164565b6030612e689190613eb0565b60f81b818381518110612e7e57612e7d614222565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612eba9190613f06565b9450612e38565b8093505050505b919050565b50505050565b50505050565b612ee68383836001612f0e565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612fa9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612fe4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ff16000868387612ecd565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561325657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561320a57506132086000888488612bde565b155b15613241576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061318f565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505061329d6000868387612ed3565b5050505050565b8280546132b09061408b565b90600052602060002090601f0160209004810192826132d25760008555613319565b82601f106132eb57805160ff1916838001178555613319565b82800160010185558215613319579182015b828111156133185782518255916020019190600101906132fd565b5b509050613326919061336d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561338657600081600090555060010161336e565b5090565b600061339d61339884613df6565b613dd1565b9050828152602081018484840111156133b9576133b861428f565b5b6133c4848285614049565b509392505050565b60006133df6133da84613e27565b613dd1565b9050828152602081018484840111156133fb576133fa61428f565b5b613406848285614049565b509392505050565b60008135905061341d8161450a565b92915050565b60008083601f84011261343957613438614285565b5b8235905067ffffffffffffffff81111561345657613455614280565b5b6020830191508360208202830111156134725761347161428a565b5b9250929050565b60008083601f84011261348f5761348e614285565b5b8235905067ffffffffffffffff8111156134ac576134ab614280565b5b6020830191508360208202830111156134c8576134c761428a565b5b9250929050565b6000813590506134de81614521565b92915050565b6000813590506134f381614538565b92915050565b60008151905061350881614538565b92915050565b600082601f83011261352357613522614285565b5b813561353384826020860161338a565b91505092915050565b600082601f83011261355157613550614285565b5b81356135618482602086016133cc565b91505092915050565b6000813590506135798161454f565b92915050565b60006020828403121561359557613594614299565b5b60006135a38482850161340e565b91505092915050565b600080604083850312156135c3576135c2614299565b5b60006135d18582860161340e565b92505060206135e28582860161340e565b9150509250929050565b60008060006060848603121561360557613604614299565b5b60006136138682870161340e565b93505060206136248682870161340e565b92505060406136358682870161356a565b9150509250925092565b6000806000806080858703121561365957613658614299565b5b60006136678782880161340e565b94505060206136788782880161340e565b93505060406136898782880161356a565b925050606085013567ffffffffffffffff8111156136aa576136a9614294565b5b6136b68782880161350e565b91505092959194509250565b600080604083850312156136d9576136d8614299565b5b60006136e78582860161340e565b92505060206136f8858286016134cf565b9150509250929050565b6000806040838503121561371957613718614299565b5b60006137278582860161340e565b92505060206137388582860161356a565b9150509250929050565b6000806000806040858703121561375c5761375b614299565b5b600085013567ffffffffffffffff81111561377a57613779614294565b5b61378687828801613423565b9450945050602085013567ffffffffffffffff8111156137a9576137a8614294565b5b6137b587828801613479565b925092505092959194509250565b6000602082840312156137d9576137d8614299565b5b60006137e7848285016134e4565b91505092915050565b60006020828403121561380657613805614299565b5b6000613814848285016134f9565b91505092915050565b60006020828403121561383357613832614299565b5b600082013567ffffffffffffffff81111561385157613850614294565b5b61385d8482850161353c565b91505092915050565b60006020828403121561387c5761387b614299565b5b600061388a8482850161356a565b91505092915050565b600080604083850312156138aa576138a9614299565b5b60006138b88582860161356a565b92505060206138c98582860161340e565b9150509250929050565b6138dc81613fc5565b82525050565b6138eb81613fd7565b82525050565b60006138fc82613e6d565b6139068185613e83565b9350613916818560208601614058565b61391f8161429e565b840191505092915050565b600061393582613e78565b61393f8185613e94565b935061394f818560208601614058565b6139588161429e565b840191505092915050565b600061396e82613e78565b6139788185613ea5565b9350613988818560208601614058565b80840191505092915050565b600081546139a18161408b565b6139ab8186613ea5565b945060018216600081146139c657600181146139d757613a0a565b60ff19831686528186019350613a0a565b6139e085613e58565b60005b83811015613a02578154818901526001820191506020810190506139e3565b838801955050505b50505092915050565b6000613a20602683613e94565b9150613a2b826142af565b604082019050919050565b6000613a43602e83613e94565b9150613a4e826142fe565b604082019050919050565b6000613a66600583613ea5565b9150613a718261434d565b600582019050919050565b6000613a89602383613e94565b9150613a9482614376565b604082019050919050565b6000613aac602083613e94565b9150613ab7826143c5565b602082019050919050565b6000613acf602f83613e94565b9150613ada826143ee565b604082019050919050565b6000613af2601c83613e94565b9150613afd8261443d565b602082019050919050565b6000613b15601783613e94565b9150613b2082614466565b602082019050919050565b6000613b38601183613e94565b9150613b438261448f565b602082019050919050565b6000613b5b601f83613e94565b9150613b66826144b8565b602082019050919050565b6000613b7e601483613e94565b9150613b89826144e1565b602082019050919050565b613b9d8161402f565b82525050565b6000613baf8285613994565b9150613bbb8284613963565b9150613bc682613a59565b91508190509392505050565b6000602082019050613be760008301846138d3565b92915050565b6000608082019050613c0260008301876138d3565b613c0f60208301866138d3565b613c1c6040830185613b94565b8181036060830152613c2e81846138f1565b905095945050505050565b6000602082019050613c4e60008301846138e2565b92915050565b60006020820190508181036000830152613c6e818461392a565b905092915050565b60006020820190508181036000830152613c8f81613a13565b9050919050565b60006020820190508181036000830152613caf81613a36565b9050919050565b60006020820190508181036000830152613ccf81613a7c565b9050919050565b60006020820190508181036000830152613cef81613a9f565b9050919050565b60006020820190508181036000830152613d0f81613ac2565b9050919050565b60006020820190508181036000830152613d2f81613ae5565b9050919050565b60006020820190508181036000830152613d4f81613b08565b9050919050565b60006020820190508181036000830152613d6f81613b2b565b9050919050565b60006020820190508181036000830152613d8f81613b4e565b9050919050565b60006020820190508181036000830152613daf81613b71565b9050919050565b6000602082019050613dcb6000830184613b94565b92915050565b6000613ddb613dec565b9050613de782826140bd565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1157613e10614251565b5b613e1a8261429e565b9050602081019050919050565b600067ffffffffffffffff821115613e4257613e41614251565b5b613e4b8261429e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ebb8261402f565b9150613ec68361402f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613efb57613efa614195565b5b828201905092915050565b6000613f118261402f565b9150613f1c8361402f565b925082613f2c57613f2b6141c4565b5b828204905092915050565b6000613f428261402f565b9150613f4d8361402f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8657613f85614195565b5b828202905092915050565b6000613f9c8261402f565b9150613fa78361402f565b925082821015613fba57613fb9614195565b5b828203905092915050565b6000613fd08261400f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561407657808201518184015260208101905061405b565b83811115614085576000848401525b50505050565b600060028204905060018216806140a357607f821691505b602082108114156140b7576140b66141f3565b5b50919050565b6140c68261429e565b810181811067ffffffffffffffff821117156140e5576140e4614251565b5b80604052505050565b60006140f98261402f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561412c5761412b614195565b5b600182019050919050565b600061414282614039565b915063ffffffff82141561415957614158614195565b5b600182019050919050565b600061416f8261402f565b915061417a8361402f565b92508261418a576141896141c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f6f6e204d616767696573203a3a2043616e6e6f742062652063616c6c656460008201527f206279206120636f6e7472616374000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4d6f6f6e204d616767696573203a3a205465616d20616c7265616479206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742062656c6f7720636f737420707269636500000000600082015250565b7f416c7265616479206d696e74656420342074696d657321000000000000000000600082015250565b7f4265796f6e64204d617820537570706c79000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f53616c65204e6f7420596574204163746976652e000000000000000000000000600082015250565b61451381613fc5565b811461451e57600080fd5b50565b61452a81613fd7565b811461453557600080fd5b50565b61454181613fe3565b811461454c57600080fd5b50565b6145588161402f565b811461456357600080fd5b5056fea2646970667358221220ec98a3819c3a6112978a6a9b9a971f901d9b4a1d0c1934cdea82a1125ecacbb764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80636352211e1161012e578063b88d4fde116100ab578063e222c7f91161006f578063e222c7f9146107f6578063e8b5498d1461080d578063e985e9c514610838578063efbd73f414610875578063f2fde38b1461089e57610230565b8063b88d4fde14610739578063ba7a86b814610762578063c4ae316814610779578063c87b56dd14610790578063de30dd34146107cd57610230565b80638da5cb5b116100f25780638da5cb5b1461067557806395d89b41146106a0578063a0712d68146106cb578063a22cb465146106e7578063b0962c531461071057610230565b80636352211e1461058e57806365f13097146105cb57806370a08231146105f6578063715018a6146106335780638456cb591461064a57610230565b806323b872dd116101bc57806342842e0e1161018057806342842e0e146104bb5780634cf5f7a4146104e45780634f6ccce71461050f57806354214f691461054c5780635b8ad4291461057757610230565b806323b872dd146103e85780632f745c591461041157806332cb6b0c1461044e57806333bc1c5c146104795780633ccfd60b146104a457610230565b8063081812fc11610203578063081812fc146102f1578063095ea7b31461032e57806318160ddd146103575780631919fed7146103825780631c16521c146103ab57610230565b806301ffc9a7146102355780630675b7c61461027257806306fdde031461029b57806307e89ec0146102c6575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906137c3565b6108c7565b6040516102699190613c39565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061381d565b610a11565b005b3480156102a757600080fd5b506102b0610aa7565b6040516102bd9190613c54565b60405180910390f35b3480156102d257600080fd5b506102db610b39565b6040516102e89190613db6565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190613866565b610b3f565b6040516103259190613bd2565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613702565b610bbb565b005b34801561036357600080fd5b5061036c610cc6565b6040516103799190613db6565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613866565b610d1b565b005b3480156103b757600080fd5b506103d260048036038101906103cd919061357f565b610da1565b6040516103df9190613db6565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906135ec565b610db9565b005b34801561041d57600080fd5b5061043860048036038101906104339190613702565b610dc9565b6040516104459190613db6565b60405180910390f35b34801561045a57600080fd5b50610463610fd0565b6040516104709190613db6565b60405180910390f35b34801561048557600080fd5b5061048e610fd6565b60405161049b9190613c39565b60405180910390f35b3480156104b057600080fd5b506104b9610fe9565b005b3480156104c757600080fd5b506104e260048036038101906104dd91906135ec565b61110a565b005b3480156104f057600080fd5b506104f961112a565b6040516105069190613c54565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613866565b6111b8565b6040516105439190613db6565b60405180910390f35b34801561055857600080fd5b50610561611329565b60405161056e9190613c39565b60405180910390f35b34801561058357600080fd5b5061058c61133c565b005b34801561059a57600080fd5b506105b560048036038101906105b09190613866565b6113e4565b6040516105c29190613bd2565b60405180910390f35b3480156105d757600080fd5b506105e06113fa565b6040516105ed9190613db6565b60405180910390f35b34801561060257600080fd5b5061061d6004803603810190610618919061357f565b6113ff565b60405161062a9190613db6565b60405180910390f35b34801561063f57600080fd5b506106486114cf565b005b34801561065657600080fd5b5061065f611557565b60405161066c9190613c39565b60405180910390f35b34801561068157600080fd5b5061068a61156a565b6040516106979190613bd2565b60405180910390f35b3480156106ac57600080fd5b506106b5611594565b6040516106c29190613c54565b60405180910390f35b6106e560048036038101906106e09190613866565b611626565b005b3480156106f357600080fd5b5061070e600480360381019061070991906136c2565b61187b565b005b34801561071c57600080fd5b506107376004803603810190610732919061381d565b6119f3565b005b34801561074557600080fd5b50610760600480360381019061075b919061363f565b611a89565b005b34801561076e57600080fd5b50610777611adc565b005b34801561078557600080fd5b5061078e611bd0565b005b34801561079c57600080fd5b506107b760048036038101906107b29190613866565b611c78565b6040516107c49190613c54565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613742565b611dda565b005b34801561080257600080fd5b5061080b611ed8565b005b34801561081957600080fd5b50610822611f80565b60405161082f9190613c39565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a91906135ac565b611f93565b60405161086c9190613c39565b60405180910390f35b34801561088157600080fd5b5061089c60048036038101906108979190613893565b612027565b005b3480156108aa57600080fd5b506108c560048036038101906108c0919061357f565b6120b1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fa57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0a5750610a09826121a9565b5b9050919050565b610a19612213565b73ffffffffffffffffffffffffffffffffffffffff16610a3761156a565b73ffffffffffffffffffffffffffffffffffffffff1614610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613cd6565b60405180910390fd5b80600a9080519060200190610aa39291906132a4565b5050565b606060018054610ab69061408b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae29061408b565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b60095481565b6000610b4a8261221b565b610b80576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bc6826113e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c2e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4d612213565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c7f5750610c7d81610c78612213565b611f93565b155b15610cb6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc1838383612283565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610d23612213565b73ffffffffffffffffffffffffffffffffffffffff16610d4161156a565b73ffffffffffffffffffffffffffffffffffffffff1614610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613cd6565b60405180910390fd5b8060098190555050565b600d6020528060005260406000206000915090505481565b610dc4838383612335565b505050565b6000610dd4836113ff565b8210610e0c576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610fc4576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f235750610fb7565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f6357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fb55786841415610fac578195505050505050610fca565b83806001019450505b505b8080600101915050610e46565b50600080fd5b92915050565b610fa081565b600c60019054906101000a900460ff1681565b610ff1612213565b73ffffffffffffffffffffffffffffffffffffffff1661100f61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90613cd6565b60405180910390fd5b600260085414156110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613d76565b60405180910390fd5b600260088190555060004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110fe573d6000803e3d6000fd5b50506001600881905550565b61112583838360405180602001604052806000815250611a89565b505050565b600b80546111379061408b565b80601f01602080910402602001604051908101604052809291908181526020018280546111639061408b565b80156111b05780601f10611185576101008083540402835291602001916111b0565b820191906000526020600020905b81548152906001019060200180831161119357829003601f168201915b505050505081565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b828110156112f1576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516112e357858314156112da5781945050505050611324565b82806001019350505b5080806001019150506111f0565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600c60009054906101000a900460ff1681565b611344612213565b73ffffffffffffffffffffffffffffffffffffffff1661136261156a565b73ffffffffffffffffffffffffffffffffffffffff16146113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613cd6565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b60006113ef82612852565b600001519050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611467576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114d7612213565b73ffffffffffffffffffffffffffffffffffffffff166114f561156a565b73ffffffffffffffffffffffffffffffffffffffff161461154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290613cd6565b60405180910390fd5b6115556000612afa565b565b600c60029054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115a39061408b565b80601f01602080910402602001604051908101604052809291908181526020018280546115cf9061408b565b801561161c5780601f106115f15761010080835404028352916020019161161c565b820191906000526020600020905b8154815290600101906020018083116115ff57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90613c96565b60405180910390fd5b600c60019054906101000a900460ff166116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90613d96565b60405180910390fd5b610fa0816116ef610cc6565b6116f99190613eb0565b111561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613d56565b60405180910390fd5b600a81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117879190613eb0565b11156117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90613d36565b60405180910390fd5b806009546117d69190613f37565b341015611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90613d16565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118679190613eb0565b925050819055506118783382612bc0565b50565b611883612213565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006118f5612213565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119a2612213565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119e79190613c39565b60405180910390a35050565b6119fb612213565b73ffffffffffffffffffffffffffffffffffffffff16611a1961156a565b73ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690613cd6565b60405180910390fd5b80600b9080519060200190611a859291906132a4565b5050565b611a94848484612335565b611aa084848484612bde565b611ad6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ae4612213565b73ffffffffffffffffffffffffffffffffffffffff16611b0261156a565b73ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90613cd6565b60405180910390fd5b600c60039054906101000a900460ff1615611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90613cb6565b60405180910390fd5b6001600c60036101000a81548160ff021916908315150217905550611bce336005612bc0565b565b611bd8612213565b73ffffffffffffffffffffffffffffffffffffffff16611bf661156a565b73ffffffffffffffffffffffffffffffffffffffff1614611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390613cd6565b60405180910390fd5b600c60029054906101000a900460ff1615600c60026101000a81548160ff021916908315150217905550565b6060611c838261221b565b611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb990613cf6565b60405180910390fd5b6000600183611cd19190613eb0565b9050600c60009054906101000a900460ff16611d7a57600b8054611cf49061408b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d209061408b565b8015611d6d5780601f10611d4257610100808354040283529160200191611d6d565b820191906000526020600020905b815481529060010190602001808311611d5057829003601f168201915b5050505050915050611dd5565b6000600a8054611d899061408b565b905011611da55760405180602001604052806000815250611dd1565b600a611db082612d6c565b604051602001611dc1929190613ba3565b6040516020818303038152906040525b9150505b919050565b611de2612213565b73ffffffffffffffffffffffffffffffffffffffff16611e0061156a565b73ffffffffffffffffffffffffffffffffffffffff1614611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90613cd6565b60405180910390fd5b60005b848490508163ffffffff161015611ed157611ec085858363ffffffff16818110611e8657611e85614222565b5b9050602002016020810190611e9b919061357f565b84848463ffffffff16818110611eb457611eb3614222565b5b90506020020135612bc0565b80611eca90614137565b9050611e59565b5050505050565b611ee0612213565b73ffffffffffffffffffffffffffffffffffffffff16611efe61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90613cd6565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600c60039054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61202f612213565b73ffffffffffffffffffffffffffffffffffffffff1661204d61156a565b73ffffffffffffffffffffffffffffffffffffffff16146120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a90613cd6565b60405180910390fd5b6120ad8183612bc0565b5050565b6120b9612213565b73ffffffffffffffffffffffffffffffffffffffff166120d761156a565b73ffffffffffffffffffffffffffffffffffffffff161461212d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212490613cd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561219d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219490613c76565b60405180910390fd5b6121a681612afa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168210801561227c575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061234082612852565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612367612213565b73ffffffffffffffffffffffffffffffffffffffff16148061239a57506123998260000151612394612213565b611f93565b5b806123df57506123a8612213565b73ffffffffffffffffffffffffffffffffffffffff166123c784610b3f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612418576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612481576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124e8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f58585856001612ecd565b6125056000848460000151612283565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127e25760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156127e15782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461284b8585856001612ed3565b5050505050565b61285a61332a565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612ac3576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612ac157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129a5578092505050612af5565b5b600115612ac057818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612abb578092505050612af5565b6129a6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bda828260405180602001604052806000815250612ed9565b5050565b6000612bff8473ffffffffffffffffffffffffffffffffffffffff16612eeb565b15612d5f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c28612213565b8786866040518563ffffffff1660e01b8152600401612c4a9493929190613bed565b602060405180830381600087803b158015612c6457600080fd5b505af1925050508015612c9557506040513d601f19601f82011682018060405250810190612c9291906137f0565b60015b612d0f573d8060008114612cc5576040519150601f19603f3d011682016040523d82523d6000602084013e612cca565b606091505b50600081511415612d07576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d64565b600190505b949350505050565b60606000821415612db4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ec8565b600082905060005b60008214612de6578080612dcf906140ee565b915050600a82612ddf9190613f06565b9150612dbc565b60008167ffffffffffffffff811115612e0257612e01614251565b5b6040519080825280601f01601f191660200182016040528015612e345781602001600182028036833780820191505090505b5090505b60008514612ec157600182612e4d9190613f91565b9150600a85612e5c9190614164565b6030612e689190613eb0565b60f81b818381518110612e7e57612e7d614222565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612eba9190613f06565b9450612e38565b8093505050505b919050565b50505050565b50505050565b612ee68383836001612f0e565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612fa9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612fe4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ff16000868387612ecd565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561325657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561320a57506132086000888488612bde565b155b15613241576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061318f565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505061329d6000868387612ed3565b5050505050565b8280546132b09061408b565b90600052602060002090601f0160209004810192826132d25760008555613319565b82601f106132eb57805160ff1916838001178555613319565b82800160010185558215613319579182015b828111156133185782518255916020019190600101906132fd565b5b509050613326919061336d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561338657600081600090555060010161336e565b5090565b600061339d61339884613df6565b613dd1565b9050828152602081018484840111156133b9576133b861428f565b5b6133c4848285614049565b509392505050565b60006133df6133da84613e27565b613dd1565b9050828152602081018484840111156133fb576133fa61428f565b5b613406848285614049565b509392505050565b60008135905061341d8161450a565b92915050565b60008083601f84011261343957613438614285565b5b8235905067ffffffffffffffff81111561345657613455614280565b5b6020830191508360208202830111156134725761347161428a565b5b9250929050565b60008083601f84011261348f5761348e614285565b5b8235905067ffffffffffffffff8111156134ac576134ab614280565b5b6020830191508360208202830111156134c8576134c761428a565b5b9250929050565b6000813590506134de81614521565b92915050565b6000813590506134f381614538565b92915050565b60008151905061350881614538565b92915050565b600082601f83011261352357613522614285565b5b813561353384826020860161338a565b91505092915050565b600082601f83011261355157613550614285565b5b81356135618482602086016133cc565b91505092915050565b6000813590506135798161454f565b92915050565b60006020828403121561359557613594614299565b5b60006135a38482850161340e565b91505092915050565b600080604083850312156135c3576135c2614299565b5b60006135d18582860161340e565b92505060206135e28582860161340e565b9150509250929050565b60008060006060848603121561360557613604614299565b5b60006136138682870161340e565b93505060206136248682870161340e565b92505060406136358682870161356a565b9150509250925092565b6000806000806080858703121561365957613658614299565b5b60006136678782880161340e565b94505060206136788782880161340e565b93505060406136898782880161356a565b925050606085013567ffffffffffffffff8111156136aa576136a9614294565b5b6136b68782880161350e565b91505092959194509250565b600080604083850312156136d9576136d8614299565b5b60006136e78582860161340e565b92505060206136f8858286016134cf565b9150509250929050565b6000806040838503121561371957613718614299565b5b60006137278582860161340e565b92505060206137388582860161356a565b9150509250929050565b6000806000806040858703121561375c5761375b614299565b5b600085013567ffffffffffffffff81111561377a57613779614294565b5b61378687828801613423565b9450945050602085013567ffffffffffffffff8111156137a9576137a8614294565b5b6137b587828801613479565b925092505092959194509250565b6000602082840312156137d9576137d8614299565b5b60006137e7848285016134e4565b91505092915050565b60006020828403121561380657613805614299565b5b6000613814848285016134f9565b91505092915050565b60006020828403121561383357613832614299565b5b600082013567ffffffffffffffff81111561385157613850614294565b5b61385d8482850161353c565b91505092915050565b60006020828403121561387c5761387b614299565b5b600061388a8482850161356a565b91505092915050565b600080604083850312156138aa576138a9614299565b5b60006138b88582860161356a565b92505060206138c98582860161340e565b9150509250929050565b6138dc81613fc5565b82525050565b6138eb81613fd7565b82525050565b60006138fc82613e6d565b6139068185613e83565b9350613916818560208601614058565b61391f8161429e565b840191505092915050565b600061393582613e78565b61393f8185613e94565b935061394f818560208601614058565b6139588161429e565b840191505092915050565b600061396e82613e78565b6139788185613ea5565b9350613988818560208601614058565b80840191505092915050565b600081546139a18161408b565b6139ab8186613ea5565b945060018216600081146139c657600181146139d757613a0a565b60ff19831686528186019350613a0a565b6139e085613e58565b60005b83811015613a02578154818901526001820191506020810190506139e3565b838801955050505b50505092915050565b6000613a20602683613e94565b9150613a2b826142af565b604082019050919050565b6000613a43602e83613e94565b9150613a4e826142fe565b604082019050919050565b6000613a66600583613ea5565b9150613a718261434d565b600582019050919050565b6000613a89602383613e94565b9150613a9482614376565b604082019050919050565b6000613aac602083613e94565b9150613ab7826143c5565b602082019050919050565b6000613acf602f83613e94565b9150613ada826143ee565b604082019050919050565b6000613af2601c83613e94565b9150613afd8261443d565b602082019050919050565b6000613b15601783613e94565b9150613b2082614466565b602082019050919050565b6000613b38601183613e94565b9150613b438261448f565b602082019050919050565b6000613b5b601f83613e94565b9150613b66826144b8565b602082019050919050565b6000613b7e601483613e94565b9150613b89826144e1565b602082019050919050565b613b9d8161402f565b82525050565b6000613baf8285613994565b9150613bbb8284613963565b9150613bc682613a59565b91508190509392505050565b6000602082019050613be760008301846138d3565b92915050565b6000608082019050613c0260008301876138d3565b613c0f60208301866138d3565b613c1c6040830185613b94565b8181036060830152613c2e81846138f1565b905095945050505050565b6000602082019050613c4e60008301846138e2565b92915050565b60006020820190508181036000830152613c6e818461392a565b905092915050565b60006020820190508181036000830152613c8f81613a13565b9050919050565b60006020820190508181036000830152613caf81613a36565b9050919050565b60006020820190508181036000830152613ccf81613a7c565b9050919050565b60006020820190508181036000830152613cef81613a9f565b9050919050565b60006020820190508181036000830152613d0f81613ac2565b9050919050565b60006020820190508181036000830152613d2f81613ae5565b9050919050565b60006020820190508181036000830152613d4f81613b08565b9050919050565b60006020820190508181036000830152613d6f81613b2b565b9050919050565b60006020820190508181036000830152613d8f81613b4e565b9050919050565b60006020820190508181036000830152613daf81613b71565b9050919050565b6000602082019050613dcb6000830184613b94565b92915050565b6000613ddb613dec565b9050613de782826140bd565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1157613e10614251565b5b613e1a8261429e565b9050602081019050919050565b600067ffffffffffffffff821115613e4257613e41614251565b5b613e4b8261429e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ebb8261402f565b9150613ec68361402f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613efb57613efa614195565b5b828201905092915050565b6000613f118261402f565b9150613f1c8361402f565b925082613f2c57613f2b6141c4565b5b828204905092915050565b6000613f428261402f565b9150613f4d8361402f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8657613f85614195565b5b828202905092915050565b6000613f9c8261402f565b9150613fa78361402f565b925082821015613fba57613fb9614195565b5b828203905092915050565b6000613fd08261400f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561407657808201518184015260208101905061405b565b83811115614085576000848401525b50505050565b600060028204905060018216806140a357607f821691505b602082108114156140b7576140b66141f3565b5b50919050565b6140c68261429e565b810181811067ffffffffffffffff821117156140e5576140e4614251565b5b80604052505050565b60006140f98261402f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561412c5761412b614195565b5b600182019050919050565b600061414282614039565b915063ffffffff82141561415957614158614195565b5b600182019050919050565b600061416f8261402f565b915061417a8361402f565b92508261418a576141896141c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f6f6e204d616767696573203a3a2043616e6e6f742062652063616c6c656460008201527f206279206120636f6e7472616374000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4d6f6f6e204d616767696573203a3a205465616d20616c7265616479206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742062656c6f7720636f737420707269636500000000600082015250565b7f416c7265616479206d696e74656420342074696d657321000000000000000000600082015250565b7f4265796f6e64204d617820537570706c79000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f53616c65204e6f7420596574204163746976652e000000000000000000000000600082015250565b61451381613fc5565b811461451e57600080fd5b50565b61452a81613fd7565b811461453557600080fd5b50565b61454181613fe3565b811461454c57600080fd5b50565b6145588161402f565b811461456357600080fd5b5056fea2646970667358221220ec98a3819c3a6112978a6a9b9a971f901d9b4a1d0c1934cdea82a1125ecacbb764736f6c63430008070033

Deployed Bytecode Sourcemap

49324:3829:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32560:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52328:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35170:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49521:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36673:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36236:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29797:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52681:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49819:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37530:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31383:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49422:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49733:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52993:157;;;;;;;;;;;;;:::i;:::-;;37771:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49611:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30370:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49704:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52885:85;;;;;;;;;;;;;:::i;:::-;;34979:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49470:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32996:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7489:103;;;;;;;;;;;;;:::i;:::-;;49762:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6838:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35339:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50243:504;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36949:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52449:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38027:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50884:179;;;;;;;;;;;;;:::i;:::-;;52599:74;;;;;;;;;;;;;:::i;:::-;;51834:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51313:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52788:89;;;;;;;;;;;;;:::i;:::-;;49786:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37299:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51123:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7747:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32560:372;32662:4;32714:25;32699:40;;;:11;:40;;;;:105;;;;32771:33;32756:48;;;:11;:48;;;;32699:105;:172;;;;32836:35;32821:50;;;:11;:50;;;;32699:172;:225;;;;32888:36;32912:11;32888:23;:36::i;:::-;32699:225;32679:245;;32560:372;;;:::o;52328:115::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52422:13:::1;52407:12;:28;;;;;;;;;;;;:::i;:::-;;52328:115:::0;:::o;35170:100::-;35224:13;35257:5;35250:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35170:100;:::o;49521:44::-;;;;:::o;36673:204::-;36741:7;36766:16;36774:7;36766;:16::i;:::-;36761:64;;36791:34;;;;;;;;;;;;;;36761:64;36845:15;:24;36861:7;36845:24;;;;;;;;;;;;;;;;;;;;;36838:31;;36673:204;;;:::o;36236:371::-;36309:13;36325:24;36341:7;36325:15;:24::i;:::-;36309:40;;36370:5;36364:11;;:2;:11;;;36360:48;;;36384:24;;;;;;;;;;;;;;36360:48;36441:5;36425:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36451:37;36468:5;36475:12;:10;:12::i;:::-;36451:16;:37::i;:::-;36450:38;36425:63;36421:138;;;36512:35;;;;;;;;;;;;;;36421:138;36571:28;36580:2;36584:7;36593:5;36571:8;:28::i;:::-;36298:309;36236:371;;:::o;29797:280::-;29850:7;30042:12;;;;;;;;;;;30026:13;;;;;;;;;;:28;30019:35;;;;29797:280;:::o;52681:99::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52766:6:::1;52746:17;:26;;;;52681:99:::0;:::o;49819:50::-;;;;;;;;;;;;;;;;;:::o;37530:170::-;37664:28;37674:4;37680:2;37684:7;37664:9;:28::i;:::-;37530:170;;;:::o;31383:1105::-;31472:7;31505:16;31515:5;31505:9;:16::i;:::-;31496:5;:25;31492:61;;31530:23;;;;;;;;;;;;;;31492:61;31564:22;31589:13;;;;;;;;;;;31564:38;;;;31613:19;31643:25;31844:9;31839:557;31859:14;31855:1;:18;31839:557;;;31899:31;31933:11;:14;31945:1;31933:14;;;;;;;;;;;31899:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31970:9;:16;;;31966:73;;;32011:8;;;31966:73;32087:1;32061:28;;:9;:14;;;:28;;;32057:111;;32134:9;:14;;;32114:34;;32057:111;32211:5;32190:26;;:17;:26;;;32186:195;;;32260:5;32245:11;:20;32241:85;;;32301:1;32294:8;;;;;;;;;32241:85;32348:13;;;;;;;32186:195;31880:516;31839:557;31875:3;;;;;;;31839:557;;;;32472:8;;;31383:1105;;;;;:::o;49422:41::-;49459:4;49422:41;:::o;49733:22::-;;;;;;;;;;;;;:::o;52993:157::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;53055:15:::2;53073:21;53055:39;;53113:10;53105:28;;:37;53134:7;53105:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;53044:106;1768:1:::1;2722:7;:22;;;;52993:157::o:0;37771:185::-;37909:39;37926:4;37932:2;37936:7;37909:39;;;;;;;;;;;;:16;:39::i;:::-;37771:185;;;:::o;49611:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30370:713::-;30437:7;30457:22;30482:13;;;;;;;;;;30457:38;;;;30506:19;30701:9;30696:328;30716:14;30712:1;:18;30696:328;;;30756:31;30790:11;:14;30802:1;30790:14;;;;;;;;;;;30756:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30828:9;:16;;;30823:186;;30888:5;30873:11;:20;30869:85;;;30929:1;30922:8;;;;;;;;30869:85;30976:13;;;;;;;30823:186;30737:287;30732:3;;;;;;;30696:328;;;;31052:23;;;;;;;;;;;;;;30370:713;;;;:::o;49704:22::-;;;;;;;;;;;;;:::o;52885:85::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52952:10:::1;;;;;;;;;;;52951:11;52938:10;;:24;;;;;;;;;;;;;;;;;;52885:85::o:0;34979:124::-;35043:7;35070:20;35082:7;35070:11;:20::i;:::-;:25;;;35063:32;;34979:124;;;:::o;49470:44::-;49512:2;49470:44;:::o;32996:206::-;33060:7;33101:1;33084:19;;:5;:19;;;33080:60;;;33112:28;;;;;;;;;;;;;;33080:60;33166:12;:19;33179:5;33166:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;33158:36;;33151:43;;32996:206;;;:::o;7489:103::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30:::1;7581:1;7554:18;:30::i;:::-;7489:103::o:0;49762:17::-;;;;;;;;;;;;;:::o;6838:87::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6838:87;:::o;35339:104::-;35395:13;35428:7;35421:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35339:104;:::o;50243:504::-;50063:10;50050:23;;:9;:23;;;50042:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50324:10:::1;;;;;;;;;;;50316:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49459:4;50395:9;50379:13;:11;:13::i;:::-;:25;;;;:::i;:::-;50378:41;;50370:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49512:2;50490:9;50461:15;:27;50477:10;50461:27;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;50460:59;;50452:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;50600:9;50580:17;;:29;;;;:::i;:::-;50566:9;:44;;50558:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50687:9;50656:15;:27;50672:10;50656:27;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;50707:32;50717:10;50729:9;50707;:32::i;:::-;50243:504:::0;:::o;36949:279::-;37052:12;:10;:12::i;:::-;37040:24;;:8;:24;;;37036:54;;;37073:17;;;;;;;;;;;;;;37036:54;37148:8;37103:18;:32;37122:12;:10;:12::i;:::-;37103:32;;;;;;;;;;;;;;;:42;37136:8;37103:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37201:8;37172:48;;37187:12;:10;:12::i;:::-;37172:48;;;37211:8;37172:48;;;;;;:::i;:::-;;;;;;;;36949:279;;:::o;52449:142::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52563:20:::1;52541:19;:42;;;;;;;;;;;;:::i;:::-;;52449:142:::0;:::o;38027:342::-;38194:28;38204:4;38210:2;38214:7;38194:9;:28::i;:::-;38238:48;38261:4;38267:2;38271:7;38280:5;38238:22;:48::i;:::-;38233:129;;38310:40;;;;;;;;;;;;;;38233:129;38027:342;;;;:::o;50884:179::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50942:10:::1;;;;;;;;;;;50941:11;50933:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51016:4;51003:10;;:17;;;;;;;;;;;;;;;;;;51031:24;51041:10;51053:1;51031:9;:24::i;:::-;50884:179::o:0;52599:74::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52660:5:::1;;;;;;;;;;;52659:6;52651:5;;:14;;;;;;;;;;;;;;;;;;52599:74::o:0;51834:473::-;51907:13;51941:16;51949:7;51941;:16::i;:::-;51933:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52022:14;52049:1;52039:7;:11;;;;:::i;:::-;52022:28;;52067:10;;;;;;;;;;;52063:68;;52100:19;52093:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52063:68;52224:1;52201:12;52195:26;;;;;:::i;:::-;;;:30;:104;;;;;;;;;;;;;;;;;52252:12;52266:17;:6;:15;:17::i;:::-;52235:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52195:104;52188:111;;;51834:473;;;;:::o;51313:248::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51433:8:::1;51452:102;51466:9;;:16;;51462:1;:20;;;51452:102;;;51504:38;51514:9;;51524:1;51514:12;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51528:10;;51539:1;51528:13;;;;;;;;;:::i;:::-;;;;;;;;51504:9;:38::i;:::-;51484:3;;;;:::i;:::-;;;51452:102;;;51422:139;51313:248:::0;;;;:::o;52788:89::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52859:10:::1;;;;;;;;;;;52858:11;52845:10;;:24;;;;;;;;;;;;;;;;;;52788:89::o:0;49786:22::-;;;;;;;;;;;;;:::o;37299:164::-;37396:4;37420:18;:25;37439:5;37420:25;;;;;;;;;;;;;;;:35;37446:8;37420:35;;;;;;;;;;;;;;;;;;;;;;;;;37413:42;;37299:164;;;;:::o;51123:135::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51217:33:::1;51227:9;51238:11;51217:9;:33::i;:::-;51123:135:::0;;:::o;7747:201::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7856:1:::1;7836:22;;:8;:22;;;;7828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;19622:157::-;19707:4;19746:25;19731:40;;;:11;:40;;;;19724:47;;19622:157;;;:::o;5562:98::-;5615:7;5642:10;5635:17;;5562:98;:::o;38624:144::-;38681:4;38715:13;;;;;;;;;;;38705:23;;:7;:23;:55;;;;;38733:11;:20;38745:7;38733:20;;;;;;;;;;;:27;;;;;;;;;;;;38732:28;38705:55;38698:62;;38624:144;;;:::o;45840:196::-;45982:2;45955:15;:24;45971:7;45955:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46020:7;46016:2;46000:28;;46009:5;46000:28;;;;;;;;;;;;45840:196;;;:::o;41341:2112::-;41456:35;41494:20;41506:7;41494:11;:20::i;:::-;41456:58;;41527:22;41569:13;:18;;;41553:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41604:50;41621:13;:18;;;41641:12;:10;:12::i;:::-;41604:16;:50::i;:::-;41553:101;:154;;;;41695:12;:10;:12::i;:::-;41671:36;;:20;41683:7;41671:11;:20::i;:::-;:36;;;41553:154;41527:181;;41726:17;41721:66;;41752:35;;;;;;;;;;;;;;41721:66;41824:4;41802:26;;:13;:18;;;:26;;;41798:67;;41837:28;;;;;;;;;;;;;;41798:67;41894:1;41880:16;;:2;:16;;;41876:52;;;41905:23;;;;;;;;;;;;;;41876:52;41941:43;41963:4;41969:2;41973:7;41982:1;41941:21;:43::i;:::-;42049:49;42066:1;42070:7;42079:13;:18;;;42049:8;:49::i;:::-;42424:1;42394:12;:18;42407:4;42394:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42468:1;42440:12;:16;42453:2;42440:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42514:2;42486:11;:20;42498:7;42486:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42576:15;42531:11;:20;42543:7;42531:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42844:19;42876:1;42866:7;:11;42844:33;;42937:1;42896:43;;:11;:24;42908:11;42896:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42892:445;;;43121:13;;;;;;;;;;43107:27;;:11;:27;43103:219;;;43191:13;:18;;;43159:11;:24;43171:11;43159:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;43274:13;:28;;;43232:11;:24;43244:11;43232:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;43103:219;42892:445;42369:979;43384:7;43380:2;43365:27;;43374:4;43365:27;;;;;;;;;;;;43403:42;43424:4;43430:2;43434:7;43443:1;43403:20;:42::i;:::-;41445:2008;;41341:2112;;;:::o;33834:1083::-;33895:21;;:::i;:::-;33929:12;33944:7;33929:22;;34000:13;;;;;;;;;;33993:20;;:4;:20;33989:861;;;34034:31;34068:11;:17;34080:4;34068:17;;;;;;;;;;;34034:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34109:9;:16;;;34104:731;;34180:1;34154:28;;:9;:14;;;:28;;;34150:101;;34218:9;34211:16;;;;;;34150:101;34555:261;34562:4;34555:261;;;34595:6;;;;;;;;34640:11;:17;34652:4;34640:17;;;;;;;;;;;34628:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34714:1;34688:28;;:9;:14;;;:28;;;34684:109;;34756:9;34749:16;;;;;;34684:109;34555:261;;;34104:731;34015:835;33989:861;34878:31;;;;;;;;;;;;;;33834:1083;;;;:::o;8108:191::-;8182:16;8201:6;;;;;;;;;;;8182:25;;8227:8;8218:6;;:17;;;;;;;;;;;;;;;;;;8282:8;8251:40;;8272:8;8251:40;;;;;;;;;;;;8171:128;8108:191;:::o;38776:104::-;38845:27;38855:2;38859:8;38845:27;;;;;;;;;;;;:9;:27::i;:::-;38776:104;;:::o;46601:790::-;46756:4;46777:15;:2;:13;;;:15::i;:::-;46773:611;;;46829:2;46813:36;;;46850:12;:10;:12::i;:::-;46864:4;46870:7;46879:5;46813:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46809:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47076:1;47059:6;:13;:18;47055:259;;;47109:40;;;;;;;;;;;;;;47055:259;47264:6;47258:13;47249:6;47245:2;47241:15;47234:38;46809:520;46946:45;;;46936:55;;;:6;:55;;;;46929:62;;;;;46773:611;47368:4;47361:11;;46601:790;;;;;;;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;48039:159::-;;;;;:::o;48857:158::-;;;;;:::o;39243:163::-;39366:32;39372:2;39376:8;39386:5;39393:4;39366:5;:32::i;:::-;39243:163;;;:::o;9539:326::-;9599:4;9856:1;9834:7;:19;;;:23;9827:30;;9539:326;;;:::o;39665:1422::-;39804:20;39827:13;;;;;;;;;;;39804:36;;;;39869:1;39855:16;;:2;:16;;;39851:48;;;39880:19;;;;;;;;;;;;;;39851:48;39926:1;39914:8;:13;39910:44;;;39936:18;;;;;;;;;;;;;;39910:44;39967:61;39997:1;40001:2;40005:12;40019:8;39967:21;:61::i;:::-;40341:8;40306:12;:16;40319:2;40306:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40405:8;40365:12;:16;40378:2;40365:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40464:2;40431:11;:25;40443:12;40431:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40531:15;40481:11;:25;40493:12;40481:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40564:20;40587:12;40564:35;;40621:9;40616:328;40636:8;40632:1;:12;40616:328;;;40700:12;40696:2;40675:38;;40692:1;40675:38;;;;;;;;;;;;40736:4;:68;;;;;40745:59;40776:1;40780:2;40784:12;40798:5;40745:22;:59::i;:::-;40744:60;40736:68;40732:164;;;40836:40;;;;;;;;;;;;;;40732:164;40914:14;;;;;;;40646:3;;;;;;;40616:328;;;;40984:12;40960:13;;:37;;;;;;;;;;;;;;;;;;40281:728;41019:60;41048:1;41052:2;41056:12;41070:8;41019:20;:60::i;:::-;39793:1294;39665:1422;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:934::-;6924:6;6932;6940;6948;6997:2;6985:9;6976:7;6972:23;6968:32;6965:119;;;7003:79;;:::i;:::-;6965:119;7151:1;7140:9;7136:17;7123:31;7181:18;7173:6;7170:30;7167:117;;;7203:79;;:::i;:::-;7167:117;7316:80;7388:7;7379:6;7368:9;7364:22;7316:80;:::i;:::-;7298:98;;;;7094:312;7473:2;7462:9;7458:18;7445:32;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:80;7711:7;7702:6;7691:9;7687:22;7639:80;:::i;:::-;7621:98;;;;7416:313;6802:934;;;;;;;:::o;7742:327::-;7800:6;7849:2;7837:9;7828:7;7824:23;7820:32;7817:119;;;7855:79;;:::i;:::-;7817:119;7975:1;8000:52;8044:7;8035:6;8024:9;8020:22;8000:52;:::i;:::-;7990:62;;7946:116;7742:327;;;;:::o;8075:349::-;8144:6;8193:2;8181:9;8172:7;8168:23;8164:32;8161:119;;;8199:79;;:::i;:::-;8161:119;8319:1;8344:63;8399:7;8390:6;8379:9;8375:22;8344:63;:::i;:::-;8334:73;;8290:127;8075:349;;;;:::o;8430:509::-;8499:6;8548:2;8536:9;8527:7;8523:23;8519:32;8516:119;;;8554:79;;:::i;:::-;8516:119;8702:1;8691:9;8687:17;8674:31;8732:18;8724:6;8721:30;8718:117;;;8754:79;;:::i;:::-;8718:117;8859:63;8914:7;8905:6;8894:9;8890:22;8859:63;:::i;:::-;8849:73;;8645:287;8430:509;;;;:::o;8945:329::-;9004:6;9053:2;9041:9;9032:7;9028:23;9024:32;9021:119;;;9059:79;;:::i;:::-;9021:119;9179:1;9204:53;9249:7;9240:6;9229:9;9225:22;9204:53;:::i;:::-;9194:63;;9150:117;8945:329;;;;:::o;9280:474::-;9348:6;9356;9405:2;9393:9;9384:7;9380:23;9376:32;9373:119;;;9411:79;;:::i;:::-;9373:119;9531:1;9556:53;9601:7;9592:6;9581:9;9577:22;9556:53;:::i;:::-;9546:63;;9502:117;9658:2;9684:53;9729:7;9720:6;9709:9;9705:22;9684:53;:::i;:::-;9674:63;;9629:118;9280:474;;;;;:::o;9760:118::-;9847:24;9865:5;9847:24;:::i;:::-;9842:3;9835:37;9760:118;;:::o;9884:109::-;9965:21;9980:5;9965:21;:::i;:::-;9960:3;9953:34;9884:109;;:::o;9999:360::-;10085:3;10113:38;10145:5;10113:38;:::i;:::-;10167:70;10230:6;10225:3;10167:70;:::i;:::-;10160:77;;10246:52;10291:6;10286:3;10279:4;10272:5;10268:16;10246:52;:::i;:::-;10323:29;10345:6;10323:29;:::i;:::-;10318:3;10314:39;10307:46;;10089:270;9999:360;;;;:::o;10365:364::-;10453:3;10481:39;10514:5;10481:39;:::i;:::-;10536:71;10600:6;10595:3;10536:71;:::i;:::-;10529:78;;10616:52;10661:6;10656:3;10649:4;10642:5;10638:16;10616:52;:::i;:::-;10693:29;10715:6;10693:29;:::i;:::-;10688:3;10684:39;10677:46;;10457:272;10365:364;;;;:::o;10735:377::-;10841:3;10869:39;10902:5;10869:39;:::i;:::-;10924:89;11006:6;11001:3;10924:89;:::i;:::-;10917:96;;11022:52;11067:6;11062:3;11055:4;11048:5;11044:16;11022:52;:::i;:::-;11099:6;11094:3;11090:16;11083:23;;10845:267;10735:377;;;;:::o;11142:845::-;11245:3;11282:5;11276:12;11311:36;11337:9;11311:36;:::i;:::-;11363:89;11445:6;11440:3;11363:89;:::i;:::-;11356:96;;11483:1;11472:9;11468:17;11499:1;11494:137;;;;11645:1;11640:341;;;;11461:520;;11494:137;11578:4;11574:9;11563;11559:25;11554:3;11547:38;11614:6;11609:3;11605:16;11598:23;;11494:137;;11640:341;11707:38;11739:5;11707:38;:::i;:::-;11767:1;11781:154;11795:6;11792:1;11789:13;11781:154;;;11869:7;11863:14;11859:1;11854:3;11850:11;11843:35;11919:1;11910:7;11906:15;11895:26;;11817:4;11814:1;11810:12;11805:17;;11781:154;;;11964:6;11959:3;11955:16;11948:23;;11647:334;;11461:520;;11249:738;;11142:845;;;;:::o;11993:366::-;12135:3;12156:67;12220:2;12215:3;12156:67;:::i;:::-;12149:74;;12232:93;12321:3;12232:93;:::i;:::-;12350:2;12345:3;12341:12;12334:19;;11993:366;;;:::o;12365:::-;12507:3;12528:67;12592:2;12587:3;12528:67;:::i;:::-;12521:74;;12604:93;12693:3;12604:93;:::i;:::-;12722:2;12717:3;12713:12;12706:19;;12365:366;;;:::o;12737:400::-;12897:3;12918:84;13000:1;12995:3;12918:84;:::i;:::-;12911:91;;13011:93;13100:3;13011:93;:::i;:::-;13129:1;13124:3;13120:11;13113:18;;12737:400;;;:::o;13143:366::-;13285:3;13306:67;13370:2;13365:3;13306:67;:::i;:::-;13299:74;;13382:93;13471:3;13382:93;:::i;:::-;13500:2;13495:3;13491:12;13484:19;;13143:366;;;:::o;13515:::-;13657:3;13678:67;13742:2;13737:3;13678:67;:::i;:::-;13671:74;;13754:93;13843:3;13754:93;:::i;:::-;13872:2;13867:3;13863:12;13856:19;;13515:366;;;:::o;13887:::-;14029:3;14050:67;14114:2;14109:3;14050:67;:::i;:::-;14043:74;;14126:93;14215:3;14126:93;:::i;:::-;14244:2;14239:3;14235:12;14228:19;;13887:366;;;:::o;14259:::-;14401:3;14422:67;14486:2;14481:3;14422:67;:::i;:::-;14415:74;;14498:93;14587:3;14498:93;:::i;:::-;14616:2;14611:3;14607:12;14600:19;;14259:366;;;:::o;14631:::-;14773:3;14794:67;14858:2;14853:3;14794:67;:::i;:::-;14787:74;;14870:93;14959:3;14870:93;:::i;:::-;14988:2;14983:3;14979:12;14972:19;;14631:366;;;:::o;15003:::-;15145:3;15166:67;15230:2;15225:3;15166:67;:::i;:::-;15159:74;;15242:93;15331:3;15242:93;:::i;:::-;15360:2;15355:3;15351:12;15344:19;;15003:366;;;:::o;15375:::-;15517:3;15538:67;15602:2;15597:3;15538:67;:::i;:::-;15531:74;;15614:93;15703:3;15614:93;:::i;:::-;15732:2;15727:3;15723:12;15716:19;;15375:366;;;:::o;15747:::-;15889:3;15910:67;15974:2;15969:3;15910:67;:::i;:::-;15903:74;;15986:93;16075:3;15986:93;:::i;:::-;16104:2;16099:3;16095:12;16088:19;;15747:366;;;:::o;16119:118::-;16206:24;16224:5;16206:24;:::i;:::-;16201:3;16194:37;16119:118;;:::o;16243:695::-;16521:3;16543:92;16631:3;16622:6;16543:92;:::i;:::-;16536:99;;16652:95;16743:3;16734:6;16652:95;:::i;:::-;16645:102;;16764:148;16908:3;16764:148;:::i;:::-;16757:155;;16929:3;16922:10;;16243:695;;;;;:::o;16944:222::-;17037:4;17075:2;17064:9;17060:18;17052:26;;17088:71;17156:1;17145:9;17141:17;17132:6;17088:71;:::i;:::-;16944:222;;;;:::o;17172:640::-;17367:4;17405:3;17394:9;17390:19;17382:27;;17419:71;17487:1;17476:9;17472:17;17463:6;17419:71;:::i;:::-;17500:72;17568:2;17557:9;17553:18;17544:6;17500:72;:::i;:::-;17582;17650:2;17639:9;17635:18;17626:6;17582:72;:::i;:::-;17701:9;17695:4;17691:20;17686:2;17675:9;17671:18;17664:48;17729:76;17800:4;17791:6;17729:76;:::i;:::-;17721:84;;17172:640;;;;;;;:::o;17818:210::-;17905:4;17943:2;17932:9;17928:18;17920:26;;17956:65;18018:1;18007:9;18003:17;17994:6;17956:65;:::i;:::-;17818:210;;;;:::o;18034:313::-;18147:4;18185:2;18174:9;18170:18;18162:26;;18234:9;18228:4;18224:20;18220:1;18209:9;18205:17;18198:47;18262:78;18335:4;18326:6;18262:78;:::i;:::-;18254:86;;18034:313;;;;:::o;18353:419::-;18519:4;18557:2;18546:9;18542:18;18534:26;;18606:9;18600:4;18596:20;18592:1;18581:9;18577:17;18570:47;18634:131;18760:4;18634:131;:::i;:::-;18626:139;;18353:419;;;:::o;18778:::-;18944:4;18982:2;18971:9;18967:18;18959:26;;19031:9;19025:4;19021:20;19017:1;19006:9;19002:17;18995:47;19059:131;19185:4;19059:131;:::i;:::-;19051:139;;18778:419;;;:::o;19203:::-;19369:4;19407:2;19396:9;19392:18;19384:26;;19456:9;19450:4;19446:20;19442:1;19431:9;19427:17;19420:47;19484:131;19610:4;19484:131;:::i;:::-;19476:139;;19203:419;;;:::o;19628:::-;19794:4;19832:2;19821:9;19817:18;19809:26;;19881:9;19875:4;19871:20;19867:1;19856:9;19852:17;19845:47;19909:131;20035:4;19909:131;:::i;:::-;19901:139;;19628:419;;;:::o;20053:::-;20219:4;20257:2;20246:9;20242:18;20234:26;;20306:9;20300:4;20296:20;20292:1;20281:9;20277:17;20270:47;20334:131;20460:4;20334:131;:::i;:::-;20326:139;;20053:419;;;:::o;20478:::-;20644:4;20682:2;20671:9;20667:18;20659:26;;20731:9;20725:4;20721:20;20717:1;20706:9;20702:17;20695:47;20759:131;20885:4;20759:131;:::i;:::-;20751:139;;20478:419;;;:::o;20903:::-;21069:4;21107:2;21096:9;21092:18;21084:26;;21156:9;21150:4;21146:20;21142:1;21131:9;21127:17;21120:47;21184:131;21310:4;21184:131;:::i;:::-;21176:139;;20903:419;;;:::o;21328:::-;21494:4;21532:2;21521:9;21517:18;21509:26;;21581:9;21575:4;21571:20;21567:1;21556:9;21552:17;21545:47;21609:131;21735:4;21609:131;:::i;:::-;21601:139;;21328:419;;;:::o;21753:::-;21919:4;21957:2;21946:9;21942:18;21934:26;;22006:9;22000:4;21996:20;21992:1;21981:9;21977:17;21970:47;22034:131;22160:4;22034:131;:::i;:::-;22026:139;;21753:419;;;:::o;22178:::-;22344:4;22382:2;22371:9;22367:18;22359:26;;22431:9;22425:4;22421:20;22417:1;22406:9;22402:17;22395:47;22459:131;22585:4;22459:131;:::i;:::-;22451:139;;22178:419;;;:::o;22603:222::-;22696:4;22734:2;22723:9;22719:18;22711:26;;22747:71;22815:1;22804:9;22800:17;22791:6;22747:71;:::i;:::-;22603:222;;;;:::o;22831:129::-;22865:6;22892:20;;:::i;:::-;22882:30;;22921:33;22949:4;22941:6;22921:33;:::i;:::-;22831:129;;;:::o;22966:75::-;22999:6;23032:2;23026:9;23016:19;;22966:75;:::o;23047:307::-;23108:4;23198:18;23190:6;23187:30;23184:56;;;23220:18;;:::i;:::-;23184:56;23258:29;23280:6;23258:29;:::i;:::-;23250:37;;23342:4;23336;23332:15;23324:23;;23047:307;;;:::o;23360:308::-;23422:4;23512:18;23504:6;23501:30;23498:56;;;23534:18;;:::i;:::-;23498:56;23572:29;23594:6;23572:29;:::i;:::-;23564:37;;23656:4;23650;23646:15;23638:23;;23360:308;;;:::o;23674:141::-;23723:4;23746:3;23738:11;;23769:3;23766:1;23759:14;23803:4;23800:1;23790:18;23782:26;;23674:141;;;:::o;23821:98::-;23872:6;23906:5;23900:12;23890:22;;23821:98;;;:::o;23925:99::-;23977:6;24011:5;24005:12;23995:22;;23925:99;;;:::o;24030:168::-;24113:11;24147:6;24142:3;24135:19;24187:4;24182:3;24178:14;24163:29;;24030:168;;;;:::o;24204:169::-;24288:11;24322:6;24317:3;24310:19;24362:4;24357:3;24353:14;24338:29;;24204:169;;;;:::o;24379:148::-;24481:11;24518:3;24503:18;;24379:148;;;;:::o;24533:305::-;24573:3;24592:20;24610:1;24592:20;:::i;:::-;24587:25;;24626:20;24644:1;24626:20;:::i;:::-;24621:25;;24780:1;24712:66;24708:74;24705:1;24702:81;24699:107;;;24786:18;;:::i;:::-;24699:107;24830:1;24827;24823:9;24816:16;;24533:305;;;;:::o;24844:185::-;24884:1;24901:20;24919:1;24901:20;:::i;:::-;24896:25;;24935:20;24953:1;24935:20;:::i;:::-;24930:25;;24974:1;24964:35;;24979:18;;:::i;:::-;24964:35;25021:1;25018;25014:9;25009:14;;24844:185;;;;:::o;25035:348::-;25075:7;25098:20;25116:1;25098:20;:::i;:::-;25093:25;;25132:20;25150:1;25132:20;:::i;:::-;25127:25;;25320:1;25252:66;25248:74;25245:1;25242:81;25237:1;25230:9;25223:17;25219:105;25216:131;;;25327:18;;:::i;:::-;25216:131;25375:1;25372;25368:9;25357:20;;25035:348;;;;:::o;25389:191::-;25429:4;25449:20;25467:1;25449:20;:::i;:::-;25444:25;;25483:20;25501:1;25483:20;:::i;:::-;25478:25;;25522:1;25519;25516:8;25513:34;;;25527:18;;:::i;:::-;25513:34;25572:1;25569;25565:9;25557:17;;25389:191;;;;:::o;25586:96::-;25623:7;25652:24;25670:5;25652:24;:::i;:::-;25641:35;;25586:96;;;:::o;25688:90::-;25722:7;25765:5;25758:13;25751:21;25740:32;;25688:90;;;:::o;25784:149::-;25820:7;25860:66;25853:5;25849:78;25838:89;;25784:149;;;:::o;25939:126::-;25976:7;26016:42;26009:5;26005:54;25994:65;;25939:126;;;:::o;26071:77::-;26108:7;26137:5;26126:16;;26071:77;;;:::o;26154:93::-;26190:7;26230:10;26223:5;26219:22;26208:33;;26154:93;;;:::o;26253:154::-;26337:6;26332:3;26327;26314:30;26399:1;26390:6;26385:3;26381:16;26374:27;26253:154;;;:::o;26413:307::-;26481:1;26491:113;26505:6;26502:1;26499:13;26491:113;;;26590:1;26585:3;26581:11;26575:18;26571:1;26566:3;26562:11;26555:39;26527:2;26524:1;26520:10;26515:15;;26491:113;;;26622:6;26619:1;26616:13;26613:101;;;26702:1;26693:6;26688:3;26684:16;26677:27;26613:101;26462:258;26413:307;;;:::o;26726:320::-;26770:6;26807:1;26801:4;26797:12;26787:22;;26854:1;26848:4;26844:12;26875:18;26865:81;;26931:4;26923:6;26919:17;26909:27;;26865:81;26993:2;26985:6;26982:14;26962:18;26959:38;26956:84;;;27012:18;;:::i;:::-;26956:84;26777:269;26726:320;;;:::o;27052:281::-;27135:27;27157:4;27135:27;:::i;:::-;27127:6;27123:40;27265:6;27253:10;27250:22;27229:18;27217:10;27214:34;27211:62;27208:88;;;27276:18;;:::i;:::-;27208:88;27316:10;27312:2;27305:22;27095:238;27052:281;;:::o;27339:233::-;27378:3;27401:24;27419:5;27401:24;:::i;:::-;27392:33;;27447:66;27440:5;27437:77;27434:103;;;27517:18;;:::i;:::-;27434:103;27564:1;27557:5;27553:13;27546:20;;27339:233;;;:::o;27578:175::-;27616:3;27639:23;27656:5;27639:23;:::i;:::-;27630:32;;27684:10;27677:5;27674:21;27671:47;;;27698:18;;:::i;:::-;27671:47;27745:1;27738:5;27734:13;27727:20;;27578:175;;;:::o;27759:176::-;27791:1;27808:20;27826:1;27808:20;:::i;:::-;27803:25;;27842:20;27860:1;27842:20;:::i;:::-;27837:25;;27881:1;27871:35;;27886:18;;:::i;:::-;27871:35;27927:1;27924;27920:9;27915:14;;27759:176;;;;:::o;27941:180::-;27989:77;27986:1;27979:88;28086:4;28083:1;28076:15;28110:4;28107:1;28100:15;28127:180;28175:77;28172:1;28165:88;28272:4;28269:1;28262:15;28296:4;28293:1;28286:15;28313:180;28361:77;28358:1;28351:88;28458:4;28455:1;28448:15;28482:4;28479:1;28472:15;28499:180;28547:77;28544:1;28537:88;28644:4;28641:1;28634:15;28668:4;28665:1;28658:15;28685:180;28733:77;28730:1;28723:88;28830:4;28827:1;28820:15;28854:4;28851:1;28844:15;28871:117;28980:1;28977;28970:12;28994:117;29103:1;29100;29093:12;29117:117;29226:1;29223;29216:12;29240:117;29349:1;29346;29339:12;29363:117;29472:1;29469;29462:12;29486:117;29595:1;29592;29585:12;29609:102;29650:6;29701:2;29697:7;29692:2;29685:5;29681:14;29677:28;29667:38;;29609:102;;;:::o;29717:225::-;29857:34;29853:1;29845:6;29841:14;29834:58;29926:8;29921:2;29913:6;29909:15;29902:33;29717:225;:::o;29948:233::-;30088:34;30084:1;30076:6;30072:14;30065:58;30157:16;30152:2;30144:6;30140:15;30133:41;29948:233;:::o;30187:155::-;30327:7;30323:1;30315:6;30311:14;30304:31;30187:155;:::o;30348:222::-;30488:34;30484:1;30476:6;30472:14;30465:58;30557:5;30552:2;30544:6;30540:15;30533:30;30348:222;:::o;30576:182::-;30716:34;30712:1;30704:6;30700:14;30693:58;30576:182;:::o;30764:234::-;30904:34;30900:1;30892:6;30888:14;30881:58;30973:17;30968:2;30960:6;30956:15;30949:42;30764:234;:::o;31004:178::-;31144:30;31140:1;31132:6;31128:14;31121:54;31004:178;:::o;31188:173::-;31328:25;31324:1;31316:6;31312:14;31305:49;31188:173;:::o;31367:167::-;31507:19;31503:1;31495:6;31491:14;31484:43;31367:167;:::o;31540:181::-;31680:33;31676:1;31668:6;31664:14;31657:57;31540:181;:::o;31727:170::-;31867:22;31863:1;31855:6;31851:14;31844:46;31727:170;:::o;31903:122::-;31976:24;31994:5;31976:24;:::i;:::-;31969:5;31966:35;31956:63;;32015:1;32012;32005:12;31956:63;31903:122;:::o;32031:116::-;32101:21;32116:5;32101:21;:::i;:::-;32094:5;32091:32;32081:60;;32137:1;32134;32127:12;32081:60;32031:116;:::o;32153:120::-;32225:23;32242:5;32225:23;:::i;:::-;32218:5;32215:34;32205:62;;32263:1;32260;32253:12;32205:62;32153:120;:::o;32279:122::-;32352:24;32370:5;32352:24;:::i;:::-;32345:5;32342:35;32332:63;;32391:1;32388;32381:12;32332:63;32279:122;:::o

Swarm Source

ipfs://ec98a3819c3a6112978a6a9b9a971f901d9b4a1d0c1934cdea82a1125ecacbb7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.