ETH Price: $3,509.44 (+2.78%)
Gas: 5 Gwei

Token

Space (SPACE)
 

Overview

Max Total Supply

0 SPACE

Holders

260

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
stressed.eth
Balance
1 SPACE
0x11ae60b9f14c516b9c1a7250c79397e29d09ec57
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:
MonaverseV2

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-07-05
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// 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/security/Pausable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// 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 (last updated v4.6.0) (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 `IERC721Receiver.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/interfaces/IERC2981.sol


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

pragma solidity ^0.8.0;


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

// 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 (last updated v4.6.0) (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`.
     *
     * 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;

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

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

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

// 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: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @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 {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/MonaverseV2.sol


pragma solidity ^0.8.0;






contract MonaverseV2 is ERC721, Ownable, Pausable {
    // Original Monaverse contract, to be used for migration.
    ERC721 monaV1;

    // Mona Wallet for royalty payments and emergency withdrawals.
    address monaWallet;

    // Next token ID to be minted.
    uint256 private nextTokenId;

    // Can creators update the URIs of their tokens?
    bool creatorURIUpdatesPaused;

    // For EIP 2981, royalty rate out of 10,000.
    // For example, 10% royalties: royaltyRate = 1000.
    uint256 royaltyRate;
    uint256 constant royaltyRateDivisor = 10_000;

    // token id => uri
    mapping(uint256 => string) private _tokenURIs;

    // uri => used (has this URI been used before?)
    mapping(string => bool) private _tokenURIUsed;

    // token id => creator (who has permission to update this token's URI and get paid royalties?)
    mapping(uint256 => address) private _creators;

    // Prefix that all token URIs must begin with. Enforced when token URI is set to prevent typosquatting.
    string public uriPrefix;

    // @param: _name: The name of the ERC721 token.
    // @param: _symbol: The symbol of the ERC721 token.
    // @param: _royaltyRate: The rate (out of 10,000) EIP 2981 royalties should be paid at.
    // @param: _monaV1Address: The address of the original Mona contract to be used for migration.
    // @param: _monaWallet: The address where Mona royalties should be paid out (also used for emergency withdrawals).
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _royaltyRate,
        address _monaV1Address,
        address _monaWallet,
        string memory _uriPrefix
    ) ERC721(_name, _symbol) {
        royaltyRate = _royaltyRate;
        monaV1 = ERC721(_monaV1Address);
        monaWallet = _monaWallet;
        uriPrefix = _uriPrefix;
    }

    // MODIFIERS //

    // Is this URI allowed to be used? Only yes if it's unused
    modifier tokenURIAllowed(string memory _tokenURI) {
        require(!_tokenURIUsed[_tokenURI], "token uri already used");
        _tokenURIPrefixed(_tokenURI);
        _;
    }

    // Is this user allowed to update the URI of a given token?
    // Only yes if it's the creator and creator updates are unpaused, or admin.
    modifier allowedToUpdateURI(uint256 _tokenId) {
        _allowedToUpdateURI(_tokenId);
        _;
    }

    // Bulk allowedToUpdateURI check
    modifier allowedToUpdateURIs(uint256[] calldata _tokenIds) {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            _allowedToUpdateURI(_tokenIds[i]);
        }
        _;
    }

    function _allowedToUpdateURI(uint256 _tokenId) internal view {
        require(
            msg.sender == owner() ||
                (msg.sender == _creators[_tokenId] && !creatorURIUpdatesPaused),
            "not allowed to update token uri"
        );
    }

    // Does the provided tokenURI have the correct prefix?
    function _tokenURIPrefixed(string memory _tokenURI) internal view {
        bytes memory newURIBytes = bytes(_tokenURI);
        uint256 prefixLength = bytes(uriPrefix).length;
        // New token URI must be longer than prefix, else bail early to prevent overflow.
        require(newURIBytes.length > prefixLength, "Incorrect URI prefix length");
        bytes memory resultPrefix = new bytes(prefixLength);
        // Slice prefixLength bytes from _tokenURI to compare.
        for (uint256 i; i < prefixLength; ) {
            resultPrefix[i] = newURIBytes[i];
            unchecked {
                ++i;
            }
        }
        require(
            keccak256(resultPrefix) == keccak256(bytes(uriPrefix)),
            "Incorrect URI prefix"
        );
    }

    // MINTING & BURNING //

    // @notice: Mints a new token and assigns URI specific variables.
    // @notice: Once a creator claims are URI it cannot be used again to mint tokens.
    // @notice: If a creator wants to mint multiple copies of a space, they must use bulkMint.
    // @param: _tokenURI: URI of the new token.
    function mintToken(string memory _tokenURI)
        public
        whenNotPaused
        tokenURIAllowed(_tokenURI)
    {
        _tokenURIs[nextTokenId] = _tokenURI;
        _tokenURIUsed[_tokenURI] = true;
        _creators[nextTokenId] = msg.sender;
        _mint(msg.sender, nextTokenId++);
    }

    // @notice: Mints a number of new tokens with the same URI.
    // @notice: Subsequent mints with the same tokenURI will fail, ensure total supply is generated in 1 bulkMint call.
    // @param: _tokenURI: URI of the new tokens.
    // @param: _quantity: The number of tokens to mint.
    function bulkMintTokens(string memory _tokenURI, uint256 _quantity)
        external
        whenNotPaused
        tokenURIAllowed(_tokenURI)
    {
        _tokenURIUsed[_tokenURI] = true;
        for (uint256 i = 0; i < _quantity; i++) {
            _tokenURIs[nextTokenId] = _tokenURI;
            _creators[nextTokenId] = msg.sender;
            _mint(msg.sender, nextTokenId++);
        }
    }

    // @notice: Burns a given token, removing it from circulation.
    // @param: _tokenId: ID of the token to burn.
    function burn(uint256 _tokenId) public onlyOwner {
        _burn(_tokenId);
    }

    // TOKEN URI FUNCTIONS //

    // @notice: Updates the URI of a given token to a new URI.
    // @notice: Requires that the new URI is unused, and that sender is this token's creator or admin.
    // @param: _tokenId: ID of the token to update.
    // @param: _tokenURI: New URI to assign to the token.
    function updateTokenURI(uint256 _tokenId, string calldata _tokenURI)
        public
        tokenURIAllowed(_tokenURI)
        allowedToUpdateURI(_tokenId)
    {
        _tokenURIs[_tokenId] = _tokenURI;
        _tokenURIUsed[_tokenURI] = true;
    }

    // @notice: Updates a number of tokens to the same new URI.
    // @notice: Requires that the new URI is unused, and that sender is this token's creator or admin.
    // @param: _tokenIds: An array of the IDs of the tokens to update.
    // @param: _tokenURI: New URI to assign to the tokens.
    function bulkUpdateTokenURIs(
        uint256[] calldata _tokenIds,
        string calldata _tokenURI
    ) public tokenURIAllowed(_tokenURI) allowedToUpdateURIs(_tokenIds) {
        _tokenURIUsed[_tokenURI] = true;
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            _tokenURIs[_tokenIds[i]] = _tokenURI;
        }
    }

    // @notice: Returns the URI of a given token.
    // @param: _tokenId: ID of the token to get the URI of.
    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "nonexistant token");
        return _tokenURIs[_tokenId];
    }

    // CREATOR & URI OWNER //

    // @notice: Update the creator of a given token.
    // @notice: Only the creator of the token or the admin can update the creator.
    // @param: _tokenId: ID of the token to update.
    // @param: _newCreator: The address of the new creator to assign to the token.
    function updateCreator(uint256 _tokenId, address _newCreator) public {
        require(
            msg.sender == _creators[_tokenId] || msg.sender == owner(),
            "only creator"
        );
        _creators[_tokenId] = _newCreator;
    }

    // @notice: Returns the creator of a given token.
    // @param: _tokenId: ID of the token to get the creator of.
    function creatorOf(uint256 _tokenId) public view returns (address) {
        require(_exists(_tokenId), "nonexistant token");
        return _creators[_tokenId];
    }

    // @notice: Allows admin to update the enforce URI prefix.
    // @param: _uriPrefix: Prefix expected in URI updates
    function updateURIPrefix(string calldata _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    // PAUSE AND UNPAUSE //

    // @notice: Pauses minting of tokens.
    // @notice: Only the admin can pause minting.
    // @notice: Uses the _pause() function from the Pausable OZ import.
    function pauseMinting() public onlyOwner {
        _pause();
    }

    // @notice: Unpauses minting of tokens.
    // @notice: Only the admin can unpause minting.
    // @notice: Uses the _unpause() function from the Pausable OZ import.
    function unpauseMinting() public onlyOwner {
        _unpause();
    }

    // @notice: Turns OFF permission for creators to update URIs of their tokens.
    // @notice: Only the admin can pause creator URI updates.
    function pauseCreatorURIUpdates() public onlyOwner {
        creatorURIUpdatesPaused = true;
    }

    // @notice: Turns ON permission for creators to update URIs of their tokens.
    // @notice: Only the admin can unpause creator URI updates.
    function unpauseCreatorURIUpdates() public onlyOwner {
        creatorURIUpdatesPaused = false;
    }

    // ROYALTY INFO //

    // @notice: EIP 165 compliance to let marketplaces know we implement EIP 2981 for royalty info.
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    // @notice: Royalty info function, as specified in EIP 2981.
    // @notice: Returns the address to pay royalties to, and the amount to pay out.
    // @notice: monaWallet is set to receive royalties, but admin can set address to 0 and royalties will flow straight to creators.
    // @param: _tokenId: ID of the token to get royalty info for.
    // @param: _salePrice: How much the token sold for, to use in royalty calculations.
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(_tokenId), "nonexistant token");
        uint256 amountToPay = (_salePrice * royaltyRate) / royaltyRateDivisor;
        return (
            monaWallet == address(0) ? _creators[_tokenId] : monaWallet,
            amountToPay
        );
    }

    // @notice: Update the address of the Mona Wallet, to collect EIP 2981 royalties or do emergency withdrawals.
    // @notice: Only the admin can update the Mona Wallet.
    // @param: _newMonaWallet: The address of the new Mona Wallet.
    function updateMonaWallet(address _newMonaWallet) public onlyOwner {
        monaWallet = _newMonaWallet;
    }

    // @notice: Update the royalty rate for EIP 2981 compliant marketplaces.
    // @notice: Only the admin can update the royalty rate.
    // @param: _rate: The new royalty rate, calculated as x / 10,000. For example, 10% royalties = 1000.
    function updateRoyaltyRate(uint256 _rate) public onlyOwner {
        royaltyRate = _rate;
    }

    // EMERGENCY WITHDRAWALS //

    // @notice: Emergency withdraw any Eth in this contract to the Mona Wallet.
    function withdrawEth() public onlyOwner {
        payable(monaWallet).transfer(address(this).balance);
    }

    // @notice: Emergency withdraw any ERC20 tokens in this contract to the Mona Wallet.
    // @param: amount: The amount of tokens to withdraw.
    // @param: token: The ERC20 token to withdraw.
    function withdrawERC20(uint256 amount, address token) public onlyOwner {
        IERC20(token).transfer(monaWallet, amount);
    }

    // MIGRATION FROM V1 //

    // @notice: Migration function to move all tokens over from V1.
    // @param: tokensToMigrate: An array of tokenIds to migration from V1.
    // @param: oldTokenCreators: An array containing the creators of each of the tokens to migrate.
    function migrateTokens(
        uint256[] calldata tokensToMigrate,
        address[] calldata oldTokenCreators
    ) public onlyOwner {
        require(
            tokensToMigrate.length == oldTokenCreators.length,
            "tokenIds and creators must be the same length"
        );
        for (uint256 i = 0; i < tokensToMigrate.length; i++) {
            string memory oldTokenURI = monaV1.tokenURI(tokensToMigrate[i]);

            _tokenURIs[nextTokenId] = oldTokenURI;
            _tokenURIUsed[oldTokenURI] = true;
            _creators[nextTokenId] = oldTokenCreators[i];

            address oldTokenOwner = monaV1.ownerOf(tokensToMigrate[i]);
            _mint(oldTokenOwner, nextTokenId++);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_royaltyRate","type":"uint256"},{"internalType":"address","name":"_monaV1Address","type":"address"},{"internalType":"address","name":"_monaWallet","type":"address"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":"string","name":"_tokenURI","type":"string"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"bulkMintTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"bulkUpdateTokenURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"creatorOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokensToMigrate","type":"uint256[]"},{"internalType":"address[]","name":"oldTokenCreators","type":"address[]"}],"name":"migrateTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mintToken","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":"pauseCreatorURIUpdates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"unpauseCreatorURIUpdates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_newCreator","type":"address"}],"name":"updateCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMonaWallet","type":"address"}],"name":"updateMonaWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"updateRoyaltyRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"updateURIPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200579e3803806200579e833981810160405281019062000037919062000380565b858581600090805190602001906200005192919062000224565b5080600190805190602001906200006a92919062000224565b5050506200008d620000816200015660201b60201c565b6200015e60201b60201c565b6000600660146101000a81548160ff02191690831515021790555083600b8190555082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f90805190602001906200014992919062000224565b505050505050506200066f565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000232906200054c565b90600052602060002090601f016020900481019282620002565760008555620002a2565b82601f106200027157805160ff1916838001178555620002a2565b82800160010185558215620002a2579182015b82811115620002a157825182559160200191906001019062000284565b5b509050620002b19190620002b5565b5090565b5b80821115620002d0576000816000905550600101620002b6565b5090565b6000620002eb620002e584620004a2565b62000479565b9050828152602081018484840111156200030a57620003096200061b565b5b6200031784828562000516565b509392505050565b60008151905062000330816200063b565b92915050565b600082601f8301126200034e576200034d62000616565b5b815162000360848260208601620002d4565b91505092915050565b6000815190506200037a8162000655565b92915050565b60008060008060008060c08789031215620003a0576200039f62000625565b5b600087015167ffffffffffffffff811115620003c157620003c062000620565b5b620003cf89828a0162000336565b965050602087015167ffffffffffffffff811115620003f357620003f262000620565b5b6200040189828a0162000336565b95505060406200041489828a0162000369565b94505060606200042789828a016200031f565b93505060806200043a89828a016200031f565b92505060a087015167ffffffffffffffff8111156200045e576200045d62000620565b5b6200046c89828a0162000336565b9150509295509295509295565b60006200048562000498565b905062000493828262000582565b919050565b6000604051905090565b600067ffffffffffffffff821115620004c057620004bf620005e7565b5b620004cb826200062a565b9050602081019050919050565b6000620004e582620004ec565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200053657808201518184015260208101905062000519565b8381111562000546576000848401525b50505050565b600060028204905060018216806200056557607f821691505b602082108114156200057c576200057b620005b8565b5b50919050565b6200058d826200062a565b810181811067ffffffffffffffff82111715620005af57620005ae620005e7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200064681620004d8565b81146200065257600080fd5b50565b62000660816200050c565b81146200066c57600080fd5b50565b61511f806200067f6000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80638da5cb5b11610125578063bceb2a22116100ad578063da8fbf2a1161007c578063da8fbf2a146105c2578063e1ee5c83146105cc578063e985e9c5146105e8578063f2fde38b14610618578063f8361bab146106345761021c565b8063bceb2a2214610550578063c20938e01461056c578063c87b56dd14610588578063da304499146105b85761021c565b8063a22cb465116100f4578063a22cb465146104e8578063ae20032214610504578063b0e25d1f1461050e578063b2cfad281461052a578063b88d4fde146105345761021c565b80638da5cb5b1461048657806395d89b41146104a457806398df857c146104c2578063a0ef91df146104de5761021c565b806342966c68116101a85780635c975abb116101775780635c975abb146103e057806362b99ad4146103fe5780636352211e1461041c57806370a082311461044c578063715018a61461047c5761021c565b806342966c681461035c578063484cb6ae146103785780634f669ee214610394578063589a1743146103b05761021c565b806318e97fd1116101ef57806318e97fd1146102bb57806323b872dd146102d75780632a55205a146102f357806333eba49a1461032457806342842e0e146103405761021c565b806301ffc9a71461022157806306fdde0314610251578063081812fc1461026f578063095ea7b31461029f575b600080fd5b61023b60048036038101906102369190613ae5565b610650565b604051610248919061431a565b60405180910390f35b6102596106ca565b6040516102669190614335565b60405180910390f35b61028960048036038101906102849190613c7a565b61075c565b604051610296919061428a565b60405180910390f35b6102b960048036038101906102b49190613976565b6107e1565b005b6102d560048036038101906102d09190613ce7565b6108f9565b005b6102f160048036038101906102ec9190613860565b610a20565b005b61030d60048036038101906103089190613d47565b610a80565b60405161031b9291906142f1565b60405180910390f35b61033e60048036038101906103399190613b8c565b610baa565b005b61035a60048036038101906103559190613860565b610d41565b005b61037660048036038101906103719190613c7a565b610d61565b005b610392600480360381019061038d9190613a37565b610de9565b005b6103ae60048036038101906103a99190613c1e565b610f89565b005b6103ca60048036038101906103c59190613c7a565b611140565b6040516103d7919061428a565b60405180910390f35b6103e86111c5565b6040516103f5919061431a565b60405180910390f35b6104066111dc565b6040516104139190614335565b60405180910390f35b61043660048036038101906104319190613c7a565b61126a565b604051610443919061428a565b60405180910390f35b610466600480360381019061046191906137c6565b61131c565b6040516104739190614657565b60405180910390f35b6104846113d4565b005b61048e61145c565b60405161049b919061428a565b60405180910390f35b6104ac611486565b6040516104b99190614335565b60405180910390f35b6104dc60048036038101906104d791906137c6565b611518565b005b6104e66115d8565b005b61050260048036038101906104fd9190613936565b6116bf565b005b61050c6116d5565b005b610528600480360381019061052391906139b6565b61175b565b005b610532611ada565b005b61054e600480360381019061054991906138b3565b611b73565b005b61056a60048036038101906105659190613b3f565b611bd5565b005b61058660048036038101906105819190613ca7565b611c67565b005b6105a2600480360381019061059d9190613c7a565b611d97565b6040516105af9190614335565b60405180910390f35b6105c0611e84565b005b6105ca611f1d565b005b6105e660048036038101906105e19190613c7a565b611fa3565b005b61060260048036038101906105fd9190613820565b612029565b60405161060f919061431a565b60405180910390f35b610632600480360381019061062d91906137c6565b6120bd565b005b61064e60048036038101906106499190613ca7565b6121b5565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c357506106c2826122e9565b5b9050919050565b6060600080546106d990614927565b80601f016020809104026020016040519081016040528092919081815260200182805461070590614927565b80156107525780601f1061072757610100808354040283529160200191610752565b820191906000526020600020905b81548152906001019060200180831161073557829003601f168201915b5050505050905090565b6000610767826123cb565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d90614597565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ec8261126a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610854906145d7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087c612437565b73ffffffffffffffffffffffffffffffffffffffff1614806108ab57506108aa816108a5612437565b612029565b5b6108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e1906144f7565b60405180910390fd5b6108f4838361243f565b505050565b81818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600d8160405161094e9190614273565b908152602001604051809103902060009054906101000a900460ff16156109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a190614557565b60405180910390fd5b6109b3816124f8565b836109bd81612680565b8383600c600088815260200190815260200160002091906109df9291906133b8565b506001600d85856040516109f492919061425a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050505050565b610a31610a2b612437565b8261277a565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906145f7565b60405180910390fd5b610a7b838383612858565b505050565b600080610a8c846123cb565b610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac290614637565b60405180910390fd5b6000612710600b5485610ade91906147e3565b610ae891906147b2565b9050600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b6857600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610b9d565b600e600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b8192509250509250929050565b610bb26111c5565b15610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be9906144d7565b60405180910390fd5b80600d81604051610c039190614273565b908152602001604051809103902060009054906101000a900460ff1615610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5690614557565b60405180910390fd5b610c68816124f8565b81600c600060095481526020019081526020016000209080519060200190610c9192919061343e565b506001600d83604051610ca49190614273565b908152602001604051809103902060006101000a81548160ff02191690831515021790555033600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d3d3360096000815480929190610d349061498a565b91905055612abf565b5050565b610d5c83838360405180602001604052806000815250611b73565b505050565b610d69612437565b73ffffffffffffffffffffffffffffffffffffffff16610d8761145c565b73ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd4906145b7565b60405180910390fd5b610de681612c99565b50565b81818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600d81604051610e3e9190614273565b908152602001604051809103902060009054906101000a900460ff1615610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190614557565b60405180910390fd5b610ea3816124f8565b848460005b82829050811015610ee857610ed5838383818110610ec957610ec8614a60565b5b90506020020135612680565b8080610ee09061498a565b915050610ea8565b506001600d8686604051610efd92919061425a565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060005b87879050811015610f7f578585600c60008b8b86818110610f4957610f48614a60565b5b9050602002013581526020019081526020016000209190610f6b9291906133b8565b508080610f779061498a565b915050610f25565b5050505050505050565b610f916111c5565b15610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc8906144d7565b60405180910390fd5b81600d81604051610fe29190614273565b908152602001604051809103902060009054906101000a900460ff161561103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614557565b60405180910390fd5b611047816124f8565b6001600d846040516110599190614273565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060005b8281101561113a5783600c6000600954815260200190815260200160002090805190602001906110b292919061343e565b5033600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611127336009600081548092919061111e9061498a565b91905055612abf565b80806111329061498a565b915050611081565b50505050565b600061114b826123cb565b61118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190614637565b60405180910390fd5b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660149054906101000a900460ff16905090565b600f80546111e990614927565b80601f016020809104026020016040519081016040528092919081815260200182805461121590614927565b80156112625780601f1061123757610100808354040283529160200191611262565b820191906000526020600020905b81548152906001019060200180831161124557829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90614537565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138490614517565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113dc612437565b73ffffffffffffffffffffffffffffffffffffffff166113fa61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611447906145b7565b60405180910390fd5b61145a6000612db6565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461149590614927565b80601f01602080910402602001604051908101604052809291908181526020018280546114c190614927565b801561150e5780601f106114e35761010080835404028352916020019161150e565b820191906000526020600020905b8154815290600101906020018083116114f157829003601f168201915b5050505050905090565b611520612437565b73ffffffffffffffffffffffffffffffffffffffff1661153e61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b906145b7565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115e0612437565b73ffffffffffffffffffffffffffffffffffffffff166115fe61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b906145b7565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156116bc573d6000803e3d6000fd5b50565b6116d16116ca612437565b8383612e7c565b5050565b6116dd612437565b73ffffffffffffffffffffffffffffffffffffffff166116fb61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611748906145b7565b60405180910390fd5b611759612fe9565b565b611763612437565b73ffffffffffffffffffffffffffffffffffffffff1661178161145c565b73ffffffffffffffffffffffffffffffffffffffff16146117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906145b7565b60405180910390fd5b81819050848490501461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614497565b60405180910390fd5b60005b84849050811015611ad3576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd8787858181106118805761187f614a60565b5b905060200201356040518263ffffffff1660e01b81526004016118a39190614657565b60006040518083038186803b1580156118bb57600080fd5b505afa1580156118cf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118f89190613bd5565b905080600c60006009548152602001908152602001600020908051906020019061192392919061343e565b506001600d826040516119369190614273565b908152602001604051809103902060006101000a81548160ff02191690831515021790555083838381811061196e5761196d614a60565b5b905060200201602081019061198391906137c6565b600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e888886818110611a2957611a28614a60565b5b905060200201356040518263ffffffff1660e01b8152600401611a4c9190614657565b60206040518083038186803b158015611a6457600080fd5b505afa158015611a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9c91906137f3565b9050611abe8160096000815480929190611ab59061498a565b91905055612abf565b50508080611acb9061498a565b915050611822565b5050505050565b611ae2612437565b73ffffffffffffffffffffffffffffffffffffffff16611b0061145c565b73ffffffffffffffffffffffffffffffffffffffff1614611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906145b7565b60405180910390fd5b6000600a60006101000a81548160ff021916908315150217905550565b611b84611b7e612437565b8361277a565b611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906145f7565b60405180910390fd5b611bcf8484848461308b565b50505050565b611bdd612437565b73ffffffffffffffffffffffffffffffffffffffff16611bfb61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c48906145b7565b60405180910390fd5b8181600f9190611c629291906133b8565b505050565b611c6f612437565b73ffffffffffffffffffffffffffffffffffffffff16611c8d61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda906145b7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611d409291906142f1565b602060405180830381600087803b158015611d5a57600080fd5b505af1158015611d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d929190613ab8565b505050565b6060611da2826123cb565b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614637565b60405180910390fd5b600c60008381526020019081526020016000208054611dff90614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2b90614927565b8015611e785780601f10611e4d57610100808354040283529160200191611e78565b820191906000526020600020905b815481529060010190602001808311611e5b57829003601f168201915b50505050509050919050565b611e8c612437565b73ffffffffffffffffffffffffffffffffffffffff16611eaa61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906145b7565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b611f25612437565b73ffffffffffffffffffffffffffffffffffffffff16611f4361145c565b73ffffffffffffffffffffffffffffffffffffffff1614611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f90906145b7565b60405180910390fd5b611fa16130e7565b565b611fab612437565b73ffffffffffffffffffffffffffffffffffffffff16611fc961145c565b73ffffffffffffffffffffffffffffffffffffffff161461201f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612016906145b7565b60405180910390fd5b80600b8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120c5612437565b73ffffffffffffffffffffffffffffffffffffffff166120e361145c565b73ffffffffffffffffffffffffffffffffffffffff1614612139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612130906145b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614397565b60405180910390fd5b6121b281612db6565b50565b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612254575061222561145c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228a906144b7565b60405180910390fd5b80600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123c457506123c38261318a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124b28361126a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008190506000600f805461250c90614927565b9050905080825111612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a90614437565b60405180910390fd5b60008167ffffffffffffffff81111561256f5761256e614a8f565b5b6040519080825280601f01601f1916602001820160405280156125a15781602001600182028036833780820191505090505b50905060005b8281101561261a578381815181106125c2576125c1614a60565b5b602001015160f81c60f81b8282815181106125e0576125df614a60565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060010190506125a7565b50600f60405161262a9190614243565b604051809103902081805190602001201461267a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267190614477565b60405180910390fd5b50505050565b61268861145c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127385750600e600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156127375750600a60009054906101000a900460ff16155b5b612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276e90614617565b60405180910390fd5b50565b6000612785826123cb565b6127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90614457565b60405180910390fd5b60006127cf8361126a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281157506128108185612029565b5b8061284f57508373ffffffffffffffffffffffffffffffffffffffff166128378461075c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128788261126a565b73ffffffffffffffffffffffffffffffffffffffff16146128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c5906143b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612935906143f7565b60405180910390fd5b6129498383836131f4565b61295460008261243f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129a4919061483d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129fb919061475c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aba8383836131f9565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2690614577565b60405180910390fd5b612b38816123cb565b15612b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6f906143d7565b60405180910390fd5b612b84600083836131f4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bd4919061475c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c95600083836131f9565b5050565b6000612ca48261126a565b9050612cb2816000846131f4565b612cbd60008361243f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d0d919061483d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612db2816000846131f9565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee290614417565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fdc919061431a565b60405180910390a3505050565b612ff16111c5565b613030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302790614357565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613074612437565b604051613081919061428a565b60405180910390a1565b613096848484612858565b6130a2848484846131fe565b6130e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d890614377565b60405180910390fd5b50505050565b6130ef6111c5565b1561312f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613126906144d7565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613173612437565b604051613180919061428a565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b505050565b600061321f8473ffffffffffffffffffffffffffffffffffffffff16613395565b15613388578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613248612437565b8786866040518563ffffffff1660e01b815260040161326a94939291906142a5565b602060405180830381600087803b15801561328457600080fd5b505af19250505080156132b557506040513d601f19601f820116820180604052508101906132b29190613b12565b60015b613338573d80600081146132e5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ea565b606091505b50600081511415613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332790614377565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061338d565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546133c490614927565b90600052602060002090601f0160209004810192826133e6576000855561342d565b82601f106133ff57803560ff191683800117855561342d565b8280016001018555821561342d579182015b8281111561342c578235825591602001919060010190613411565b5b50905061343a91906134c4565b5090565b82805461344a90614927565b90600052602060002090601f01602090048101928261346c57600085556134b3565b82601f1061348557805160ff19168380011785556134b3565b828001600101855582156134b3579182015b828111156134b2578251825591602001919060010190613497565b5b5090506134c091906134c4565b5090565b5b808211156134dd5760008160009055506001016134c5565b5090565b60006134f46134ef84614697565b614672565b9050828152602081018484840111156135105761350f614acd565b5b61351b8482856148e5565b509392505050565b6000613536613531846146c8565b614672565b90508281526020810184848401111561355257613551614acd565b5b61355d8482856148e5565b509392505050565b6000613578613573846146c8565b614672565b90508281526020810184848401111561359457613593614acd565b5b61359f8482856148f4565b509392505050565b6000813590506135b68161508d565b92915050565b6000815190506135cb8161508d565b92915050565b60008083601f8401126135e7576135e6614ac3565b5b8235905067ffffffffffffffff81111561360457613603614abe565b5b6020830191508360208202830111156136205761361f614ac8565b5b9250929050565b60008083601f84011261363d5761363c614ac3565b5b8235905067ffffffffffffffff81111561365a57613659614abe565b5b60208301915083602082028301111561367657613675614ac8565b5b9250929050565b60008135905061368c816150a4565b92915050565b6000815190506136a1816150a4565b92915050565b6000813590506136b6816150bb565b92915050565b6000815190506136cb816150bb565b92915050565b600082601f8301126136e6576136e5614ac3565b5b81356136f68482602086016134e1565b91505092915050565b60008083601f84011261371557613714614ac3565b5b8235905067ffffffffffffffff81111561373257613731614abe565b5b60208301915083600182028301111561374e5761374d614ac8565b5b9250929050565b600082601f83011261376a57613769614ac3565b5b813561377a848260208601613523565b91505092915050565b600082601f83011261379857613797614ac3565b5b81516137a8848260208601613565565b91505092915050565b6000813590506137c0816150d2565b92915050565b6000602082840312156137dc576137db614ad7565b5b60006137ea848285016135a7565b91505092915050565b60006020828403121561380957613808614ad7565b5b6000613817848285016135bc565b91505092915050565b6000806040838503121561383757613836614ad7565b5b6000613845858286016135a7565b9250506020613856858286016135a7565b9150509250929050565b60008060006060848603121561387957613878614ad7565b5b6000613887868287016135a7565b9350506020613898868287016135a7565b92505060406138a9868287016137b1565b9150509250925092565b600080600080608085870312156138cd576138cc614ad7565b5b60006138db878288016135a7565b94505060206138ec878288016135a7565b93505060406138fd878288016137b1565b925050606085013567ffffffffffffffff81111561391e5761391d614ad2565b5b61392a878288016136d1565b91505092959194509250565b6000806040838503121561394d5761394c614ad7565b5b600061395b858286016135a7565b925050602061396c8582860161367d565b9150509250929050565b6000806040838503121561398d5761398c614ad7565b5b600061399b858286016135a7565b92505060206139ac858286016137b1565b9150509250929050565b600080600080604085870312156139d0576139cf614ad7565b5b600085013567ffffffffffffffff8111156139ee576139ed614ad2565b5b6139fa87828801613627565b9450945050602085013567ffffffffffffffff811115613a1d57613a1c614ad2565b5b613a29878288016135d1565b925092505092959194509250565b60008060008060408587031215613a5157613a50614ad7565b5b600085013567ffffffffffffffff811115613a6f57613a6e614ad2565b5b613a7b87828801613627565b9450945050602085013567ffffffffffffffff811115613a9e57613a9d614ad2565b5b613aaa878288016136ff565b925092505092959194509250565b600060208284031215613ace57613acd614ad7565b5b6000613adc84828501613692565b91505092915050565b600060208284031215613afb57613afa614ad7565b5b6000613b09848285016136a7565b91505092915050565b600060208284031215613b2857613b27614ad7565b5b6000613b36848285016136bc565b91505092915050565b60008060208385031215613b5657613b55614ad7565b5b600083013567ffffffffffffffff811115613b7457613b73614ad2565b5b613b80858286016136ff565b92509250509250929050565b600060208284031215613ba257613ba1614ad7565b5b600082013567ffffffffffffffff811115613bc057613bbf614ad2565b5b613bcc84828501613755565b91505092915050565b600060208284031215613beb57613bea614ad7565b5b600082015167ffffffffffffffff811115613c0957613c08614ad2565b5b613c1584828501613783565b91505092915050565b60008060408385031215613c3557613c34614ad7565b5b600083013567ffffffffffffffff811115613c5357613c52614ad2565b5b613c5f85828601613755565b9250506020613c70858286016137b1565b9150509250929050565b600060208284031215613c9057613c8f614ad7565b5b6000613c9e848285016137b1565b91505092915050565b60008060408385031215613cbe57613cbd614ad7565b5b6000613ccc858286016137b1565b9250506020613cdd858286016135a7565b9150509250929050565b600080600060408486031215613d0057613cff614ad7565b5b6000613d0e868287016137b1565b935050602084013567ffffffffffffffff811115613d2f57613d2e614ad2565b5b613d3b868287016136ff565b92509250509250925092565b60008060408385031215613d5e57613d5d614ad7565b5b6000613d6c858286016137b1565b9250506020613d7d858286016137b1565b9150509250929050565b613d9081614871565b82525050565b613d9f81614883565b82525050565b6000613db08261470e565b613dba8185614724565b9350613dca8185602086016148f4565b613dd381614adc565b840191505092915050565b60008154613deb81614927565b613df58186614735565b94506001821660008114613e105760018114613e2157613e54565b60ff19831686528186019350613e54565b613e2a856146f9565b60005b83811015613e4c57815481890152600182019150602081019050613e2d565b838801955050505b50505092915050565b6000613e698385614751565b9350613e768385846148e5565b82840190509392505050565b6000613e8d82614719565b613e978185614740565b9350613ea78185602086016148f4565b613eb081614adc565b840191505092915050565b6000613ec682614719565b613ed08185614751565b9350613ee08185602086016148f4565b80840191505092915050565b6000613ef9601483614740565b9150613f0482614aed565b602082019050919050565b6000613f1c603283614740565b9150613f2782614b16565b604082019050919050565b6000613f3f602683614740565b9150613f4a82614b65565b604082019050919050565b6000613f62602583614740565b9150613f6d82614bb4565b604082019050919050565b6000613f85601c83614740565b9150613f9082614c03565b602082019050919050565b6000613fa8602483614740565b9150613fb382614c2c565b604082019050919050565b6000613fcb601983614740565b9150613fd682614c7b565b602082019050919050565b6000613fee601b83614740565b9150613ff982614ca4565b602082019050919050565b6000614011602c83614740565b915061401c82614ccd565b604082019050919050565b6000614034601483614740565b915061403f82614d1c565b602082019050919050565b6000614057602d83614740565b915061406282614d45565b604082019050919050565b600061407a600c83614740565b915061408582614d94565b602082019050919050565b600061409d601083614740565b91506140a882614dbd565b602082019050919050565b60006140c0603883614740565b91506140cb82614de6565b604082019050919050565b60006140e3602a83614740565b91506140ee82614e35565b604082019050919050565b6000614106602983614740565b915061411182614e84565b604082019050919050565b6000614129601683614740565b915061413482614ed3565b602082019050919050565b600061414c602083614740565b915061415782614efc565b602082019050919050565b600061416f602c83614740565b915061417a82614f25565b604082019050919050565b6000614192602083614740565b915061419d82614f74565b602082019050919050565b60006141b5602183614740565b91506141c082614f9d565b604082019050919050565b60006141d8603183614740565b91506141e382614fec565b604082019050919050565b60006141fb601f83614740565b91506142068261503b565b602082019050919050565b600061421e601183614740565b915061422982615064565b602082019050919050565b61423d816148db565b82525050565b600061424f8284613dde565b915081905092915050565b6000614267828486613e5d565b91508190509392505050565b600061427f8284613ebb565b915081905092915050565b600060208201905061429f6000830184613d87565b92915050565b60006080820190506142ba6000830187613d87565b6142c76020830186613d87565b6142d46040830185614234565b81810360608301526142e68184613da5565b905095945050505050565b60006040820190506143066000830185613d87565b6143136020830184614234565b9392505050565b600060208201905061432f6000830184613d96565b92915050565b6000602082019050818103600083015261434f8184613e82565b905092915050565b6000602082019050818103600083015261437081613eec565b9050919050565b6000602082019050818103600083015261439081613f0f565b9050919050565b600060208201905081810360008301526143b081613f32565b9050919050565b600060208201905081810360008301526143d081613f55565b9050919050565b600060208201905081810360008301526143f081613f78565b9050919050565b6000602082019050818103600083015261441081613f9b565b9050919050565b6000602082019050818103600083015261443081613fbe565b9050919050565b6000602082019050818103600083015261445081613fe1565b9050919050565b6000602082019050818103600083015261447081614004565b9050919050565b6000602082019050818103600083015261449081614027565b9050919050565b600060208201905081810360008301526144b08161404a565b9050919050565b600060208201905081810360008301526144d08161406d565b9050919050565b600060208201905081810360008301526144f081614090565b9050919050565b60006020820190508181036000830152614510816140b3565b9050919050565b60006020820190508181036000830152614530816140d6565b9050919050565b60006020820190508181036000830152614550816140f9565b9050919050565b600060208201905081810360008301526145708161411c565b9050919050565b600060208201905081810360008301526145908161413f565b9050919050565b600060208201905081810360008301526145b081614162565b9050919050565b600060208201905081810360008301526145d081614185565b9050919050565b600060208201905081810360008301526145f0816141a8565b9050919050565b60006020820190508181036000830152614610816141cb565b9050919050565b60006020820190508181036000830152614630816141ee565b9050919050565b6000602082019050818103600083015261465081614211565b9050919050565b600060208201905061466c6000830184614234565b92915050565b600061467c61468d565b90506146888282614959565b919050565b6000604051905090565b600067ffffffffffffffff8211156146b2576146b1614a8f565b5b6146bb82614adc565b9050602081019050919050565b600067ffffffffffffffff8211156146e3576146e2614a8f565b5b6146ec82614adc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614767826148db565b9150614772836148db565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a7576147a66149d3565b5b828201905092915050565b60006147bd826148db565b91506147c8836148db565b9250826147d8576147d7614a02565b5b828204905092915050565b60006147ee826148db565b91506147f9836148db565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614832576148316149d3565b5b828202905092915050565b6000614848826148db565b9150614853836148db565b925082821015614866576148656149d3565b5b828203905092915050565b600061487c826148bb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149125780820151818401526020810190506148f7565b83811115614921576000848401525b50505050565b6000600282049050600182168061493f57607f821691505b6020821081141561495357614952614a31565b5b50919050565b61496282614adc565b810181811067ffffffffffffffff8211171561498157614980614a8f565b5b80604052505050565b6000614995826148db565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c8576149c76149d3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e636f72726563742055524920707265666978206c656e6774680000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e636f72726563742055524920707265666978000000000000000000000000600082015250565b7f746f6b656e49647320616e642063726561746f7273206d75737420626520746860008201527f652073616d65206c656e67746800000000000000000000000000000000000000602082015250565b7f6f6e6c792063726561746f720000000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f746f6b656e2075726920616c7265616479207573656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6e6f7420616c6c6f77656420746f2075706461746520746f6b656e2075726900600082015250565b7f6e6f6e6578697374616e7420746f6b656e000000000000000000000000000000600082015250565b61509681614871565b81146150a157600080fd5b50565b6150ad81614883565b81146150b857600080fd5b50565b6150c48161488f565b81146150cf57600080fd5b50565b6150db816148db565b81146150e657600080fd5b5056fea264697066735822122092031cb337cab3eb244bf211eb57aa1987719cb46d16402ee51d55fc44534eac64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000004ef107a154cb7580c686c239ed9f92597a42b9610000000000000000000000003433361e17d06fce4adbc596995cce73cc241bab000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000055370616365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553504143450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80638da5cb5b11610125578063bceb2a22116100ad578063da8fbf2a1161007c578063da8fbf2a146105c2578063e1ee5c83146105cc578063e985e9c5146105e8578063f2fde38b14610618578063f8361bab146106345761021c565b8063bceb2a2214610550578063c20938e01461056c578063c87b56dd14610588578063da304499146105b85761021c565b8063a22cb465116100f4578063a22cb465146104e8578063ae20032214610504578063b0e25d1f1461050e578063b2cfad281461052a578063b88d4fde146105345761021c565b80638da5cb5b1461048657806395d89b41146104a457806398df857c146104c2578063a0ef91df146104de5761021c565b806342966c68116101a85780635c975abb116101775780635c975abb146103e057806362b99ad4146103fe5780636352211e1461041c57806370a082311461044c578063715018a61461047c5761021c565b806342966c681461035c578063484cb6ae146103785780634f669ee214610394578063589a1743146103b05761021c565b806318e97fd1116101ef57806318e97fd1146102bb57806323b872dd146102d75780632a55205a146102f357806333eba49a1461032457806342842e0e146103405761021c565b806301ffc9a71461022157806306fdde0314610251578063081812fc1461026f578063095ea7b31461029f575b600080fd5b61023b60048036038101906102369190613ae5565b610650565b604051610248919061431a565b60405180910390f35b6102596106ca565b6040516102669190614335565b60405180910390f35b61028960048036038101906102849190613c7a565b61075c565b604051610296919061428a565b60405180910390f35b6102b960048036038101906102b49190613976565b6107e1565b005b6102d560048036038101906102d09190613ce7565b6108f9565b005b6102f160048036038101906102ec9190613860565b610a20565b005b61030d60048036038101906103089190613d47565b610a80565b60405161031b9291906142f1565b60405180910390f35b61033e60048036038101906103399190613b8c565b610baa565b005b61035a60048036038101906103559190613860565b610d41565b005b61037660048036038101906103719190613c7a565b610d61565b005b610392600480360381019061038d9190613a37565b610de9565b005b6103ae60048036038101906103a99190613c1e565b610f89565b005b6103ca60048036038101906103c59190613c7a565b611140565b6040516103d7919061428a565b60405180910390f35b6103e86111c5565b6040516103f5919061431a565b60405180910390f35b6104066111dc565b6040516104139190614335565b60405180910390f35b61043660048036038101906104319190613c7a565b61126a565b604051610443919061428a565b60405180910390f35b610466600480360381019061046191906137c6565b61131c565b6040516104739190614657565b60405180910390f35b6104846113d4565b005b61048e61145c565b60405161049b919061428a565b60405180910390f35b6104ac611486565b6040516104b99190614335565b60405180910390f35b6104dc60048036038101906104d791906137c6565b611518565b005b6104e66115d8565b005b61050260048036038101906104fd9190613936565b6116bf565b005b61050c6116d5565b005b610528600480360381019061052391906139b6565b61175b565b005b610532611ada565b005b61054e600480360381019061054991906138b3565b611b73565b005b61056a60048036038101906105659190613b3f565b611bd5565b005b61058660048036038101906105819190613ca7565b611c67565b005b6105a2600480360381019061059d9190613c7a565b611d97565b6040516105af9190614335565b60405180910390f35b6105c0611e84565b005b6105ca611f1d565b005b6105e660048036038101906105e19190613c7a565b611fa3565b005b61060260048036038101906105fd9190613820565b612029565b60405161060f919061431a565b60405180910390f35b610632600480360381019061062d91906137c6565b6120bd565b005b61064e60048036038101906106499190613ca7565b6121b5565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c357506106c2826122e9565b5b9050919050565b6060600080546106d990614927565b80601f016020809104026020016040519081016040528092919081815260200182805461070590614927565b80156107525780601f1061072757610100808354040283529160200191610752565b820191906000526020600020905b81548152906001019060200180831161073557829003601f168201915b5050505050905090565b6000610767826123cb565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d90614597565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ec8261126a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610854906145d7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087c612437565b73ffffffffffffffffffffffffffffffffffffffff1614806108ab57506108aa816108a5612437565b612029565b5b6108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e1906144f7565b60405180910390fd5b6108f4838361243f565b505050565b81818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600d8160405161094e9190614273565b908152602001604051809103902060009054906101000a900460ff16156109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a190614557565b60405180910390fd5b6109b3816124f8565b836109bd81612680565b8383600c600088815260200190815260200160002091906109df9291906133b8565b506001600d85856040516109f492919061425a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050505050565b610a31610a2b612437565b8261277a565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906145f7565b60405180910390fd5b610a7b838383612858565b505050565b600080610a8c846123cb565b610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac290614637565b60405180910390fd5b6000612710600b5485610ade91906147e3565b610ae891906147b2565b9050600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b6857600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610b9d565b600e600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b8192509250509250929050565b610bb26111c5565b15610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be9906144d7565b60405180910390fd5b80600d81604051610c039190614273565b908152602001604051809103902060009054906101000a900460ff1615610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5690614557565b60405180910390fd5b610c68816124f8565b81600c600060095481526020019081526020016000209080519060200190610c9192919061343e565b506001600d83604051610ca49190614273565b908152602001604051809103902060006101000a81548160ff02191690831515021790555033600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d3d3360096000815480929190610d349061498a565b91905055612abf565b5050565b610d5c83838360405180602001604052806000815250611b73565b505050565b610d69612437565b73ffffffffffffffffffffffffffffffffffffffff16610d8761145c565b73ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd4906145b7565b60405180910390fd5b610de681612c99565b50565b81818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600d81604051610e3e9190614273565b908152602001604051809103902060009054906101000a900460ff1615610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190614557565b60405180910390fd5b610ea3816124f8565b848460005b82829050811015610ee857610ed5838383818110610ec957610ec8614a60565b5b90506020020135612680565b8080610ee09061498a565b915050610ea8565b506001600d8686604051610efd92919061425a565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060005b87879050811015610f7f578585600c60008b8b86818110610f4957610f48614a60565b5b9050602002013581526020019081526020016000209190610f6b9291906133b8565b508080610f779061498a565b915050610f25565b5050505050505050565b610f916111c5565b15610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc8906144d7565b60405180910390fd5b81600d81604051610fe29190614273565b908152602001604051809103902060009054906101000a900460ff161561103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614557565b60405180910390fd5b611047816124f8565b6001600d846040516110599190614273565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060005b8281101561113a5783600c6000600954815260200190815260200160002090805190602001906110b292919061343e565b5033600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611127336009600081548092919061111e9061498a565b91905055612abf565b80806111329061498a565b915050611081565b50505050565b600061114b826123cb565b61118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190614637565b60405180910390fd5b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660149054906101000a900460ff16905090565b600f80546111e990614927565b80601f016020809104026020016040519081016040528092919081815260200182805461121590614927565b80156112625780601f1061123757610100808354040283529160200191611262565b820191906000526020600020905b81548152906001019060200180831161124557829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90614537565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138490614517565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113dc612437565b73ffffffffffffffffffffffffffffffffffffffff166113fa61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611447906145b7565b60405180910390fd5b61145a6000612db6565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461149590614927565b80601f01602080910402602001604051908101604052809291908181526020018280546114c190614927565b801561150e5780601f106114e35761010080835404028352916020019161150e565b820191906000526020600020905b8154815290600101906020018083116114f157829003601f168201915b5050505050905090565b611520612437565b73ffffffffffffffffffffffffffffffffffffffff1661153e61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b906145b7565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115e0612437565b73ffffffffffffffffffffffffffffffffffffffff166115fe61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b906145b7565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156116bc573d6000803e3d6000fd5b50565b6116d16116ca612437565b8383612e7c565b5050565b6116dd612437565b73ffffffffffffffffffffffffffffffffffffffff166116fb61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611748906145b7565b60405180910390fd5b611759612fe9565b565b611763612437565b73ffffffffffffffffffffffffffffffffffffffff1661178161145c565b73ffffffffffffffffffffffffffffffffffffffff16146117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906145b7565b60405180910390fd5b81819050848490501461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614497565b60405180910390fd5b60005b84849050811015611ad3576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd8787858181106118805761187f614a60565b5b905060200201356040518263ffffffff1660e01b81526004016118a39190614657565b60006040518083038186803b1580156118bb57600080fd5b505afa1580156118cf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118f89190613bd5565b905080600c60006009548152602001908152602001600020908051906020019061192392919061343e565b506001600d826040516119369190614273565b908152602001604051809103902060006101000a81548160ff02191690831515021790555083838381811061196e5761196d614a60565b5b905060200201602081019061198391906137c6565b600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e888886818110611a2957611a28614a60565b5b905060200201356040518263ffffffff1660e01b8152600401611a4c9190614657565b60206040518083038186803b158015611a6457600080fd5b505afa158015611a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9c91906137f3565b9050611abe8160096000815480929190611ab59061498a565b91905055612abf565b50508080611acb9061498a565b915050611822565b5050505050565b611ae2612437565b73ffffffffffffffffffffffffffffffffffffffff16611b0061145c565b73ffffffffffffffffffffffffffffffffffffffff1614611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906145b7565b60405180910390fd5b6000600a60006101000a81548160ff021916908315150217905550565b611b84611b7e612437565b8361277a565b611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906145f7565b60405180910390fd5b611bcf8484848461308b565b50505050565b611bdd612437565b73ffffffffffffffffffffffffffffffffffffffff16611bfb61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c48906145b7565b60405180910390fd5b8181600f9190611c629291906133b8565b505050565b611c6f612437565b73ffffffffffffffffffffffffffffffffffffffff16611c8d61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda906145b7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611d409291906142f1565b602060405180830381600087803b158015611d5a57600080fd5b505af1158015611d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d929190613ab8565b505050565b6060611da2826123cb565b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614637565b60405180910390fd5b600c60008381526020019081526020016000208054611dff90614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2b90614927565b8015611e785780601f10611e4d57610100808354040283529160200191611e78565b820191906000526020600020905b815481529060010190602001808311611e5b57829003601f168201915b50505050509050919050565b611e8c612437565b73ffffffffffffffffffffffffffffffffffffffff16611eaa61145c565b73ffffffffffffffffffffffffffffffffffffffff1614611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906145b7565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b611f25612437565b73ffffffffffffffffffffffffffffffffffffffff16611f4361145c565b73ffffffffffffffffffffffffffffffffffffffff1614611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f90906145b7565b60405180910390fd5b611fa16130e7565b565b611fab612437565b73ffffffffffffffffffffffffffffffffffffffff16611fc961145c565b73ffffffffffffffffffffffffffffffffffffffff161461201f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612016906145b7565b60405180910390fd5b80600b8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120c5612437565b73ffffffffffffffffffffffffffffffffffffffff166120e361145c565b73ffffffffffffffffffffffffffffffffffffffff1614612139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612130906145b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614397565b60405180910390fd5b6121b281612db6565b50565b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612254575061222561145c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228a906144b7565b60405180910390fd5b80600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123c457506123c38261318a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124b28361126a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008190506000600f805461250c90614927565b9050905080825111612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a90614437565b60405180910390fd5b60008167ffffffffffffffff81111561256f5761256e614a8f565b5b6040519080825280601f01601f1916602001820160405280156125a15781602001600182028036833780820191505090505b50905060005b8281101561261a578381815181106125c2576125c1614a60565b5b602001015160f81c60f81b8282815181106125e0576125df614a60565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060010190506125a7565b50600f60405161262a9190614243565b604051809103902081805190602001201461267a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267190614477565b60405180910390fd5b50505050565b61268861145c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127385750600e600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156127375750600a60009054906101000a900460ff16155b5b612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276e90614617565b60405180910390fd5b50565b6000612785826123cb565b6127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90614457565b60405180910390fd5b60006127cf8361126a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281157506128108185612029565b5b8061284f57508373ffffffffffffffffffffffffffffffffffffffff166128378461075c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128788261126a565b73ffffffffffffffffffffffffffffffffffffffff16146128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c5906143b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612935906143f7565b60405180910390fd5b6129498383836131f4565b61295460008261243f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129a4919061483d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129fb919061475c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aba8383836131f9565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2690614577565b60405180910390fd5b612b38816123cb565b15612b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6f906143d7565b60405180910390fd5b612b84600083836131f4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bd4919061475c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c95600083836131f9565b5050565b6000612ca48261126a565b9050612cb2816000846131f4565b612cbd60008361243f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d0d919061483d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612db2816000846131f9565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee290614417565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fdc919061431a565b60405180910390a3505050565b612ff16111c5565b613030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302790614357565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613074612437565b604051613081919061428a565b60405180910390a1565b613096848484612858565b6130a2848484846131fe565b6130e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d890614377565b60405180910390fd5b50505050565b6130ef6111c5565b1561312f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613126906144d7565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613173612437565b604051613180919061428a565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b505050565b600061321f8473ffffffffffffffffffffffffffffffffffffffff16613395565b15613388578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613248612437565b8786866040518563ffffffff1660e01b815260040161326a94939291906142a5565b602060405180830381600087803b15801561328457600080fd5b505af19250505080156132b557506040513d601f19601f820116820180604052508101906132b29190613b12565b60015b613338573d80600081146132e5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ea565b606091505b50600081511415613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332790614377565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061338d565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546133c490614927565b90600052602060002090601f0160209004810192826133e6576000855561342d565b82601f106133ff57803560ff191683800117855561342d565b8280016001018555821561342d579182015b8281111561342c578235825591602001919060010190613411565b5b50905061343a91906134c4565b5090565b82805461344a90614927565b90600052602060002090601f01602090048101928261346c57600085556134b3565b82601f1061348557805160ff19168380011785556134b3565b828001600101855582156134b3579182015b828111156134b2578251825591602001919060010190613497565b5b5090506134c091906134c4565b5090565b5b808211156134dd5760008160009055506001016134c5565b5090565b60006134f46134ef84614697565b614672565b9050828152602081018484840111156135105761350f614acd565b5b61351b8482856148e5565b509392505050565b6000613536613531846146c8565b614672565b90508281526020810184848401111561355257613551614acd565b5b61355d8482856148e5565b509392505050565b6000613578613573846146c8565b614672565b90508281526020810184848401111561359457613593614acd565b5b61359f8482856148f4565b509392505050565b6000813590506135b68161508d565b92915050565b6000815190506135cb8161508d565b92915050565b60008083601f8401126135e7576135e6614ac3565b5b8235905067ffffffffffffffff81111561360457613603614abe565b5b6020830191508360208202830111156136205761361f614ac8565b5b9250929050565b60008083601f84011261363d5761363c614ac3565b5b8235905067ffffffffffffffff81111561365a57613659614abe565b5b60208301915083602082028301111561367657613675614ac8565b5b9250929050565b60008135905061368c816150a4565b92915050565b6000815190506136a1816150a4565b92915050565b6000813590506136b6816150bb565b92915050565b6000815190506136cb816150bb565b92915050565b600082601f8301126136e6576136e5614ac3565b5b81356136f68482602086016134e1565b91505092915050565b60008083601f84011261371557613714614ac3565b5b8235905067ffffffffffffffff81111561373257613731614abe565b5b60208301915083600182028301111561374e5761374d614ac8565b5b9250929050565b600082601f83011261376a57613769614ac3565b5b813561377a848260208601613523565b91505092915050565b600082601f83011261379857613797614ac3565b5b81516137a8848260208601613565565b91505092915050565b6000813590506137c0816150d2565b92915050565b6000602082840312156137dc576137db614ad7565b5b60006137ea848285016135a7565b91505092915050565b60006020828403121561380957613808614ad7565b5b6000613817848285016135bc565b91505092915050565b6000806040838503121561383757613836614ad7565b5b6000613845858286016135a7565b9250506020613856858286016135a7565b9150509250929050565b60008060006060848603121561387957613878614ad7565b5b6000613887868287016135a7565b9350506020613898868287016135a7565b92505060406138a9868287016137b1565b9150509250925092565b600080600080608085870312156138cd576138cc614ad7565b5b60006138db878288016135a7565b94505060206138ec878288016135a7565b93505060406138fd878288016137b1565b925050606085013567ffffffffffffffff81111561391e5761391d614ad2565b5b61392a878288016136d1565b91505092959194509250565b6000806040838503121561394d5761394c614ad7565b5b600061395b858286016135a7565b925050602061396c8582860161367d565b9150509250929050565b6000806040838503121561398d5761398c614ad7565b5b600061399b858286016135a7565b92505060206139ac858286016137b1565b9150509250929050565b600080600080604085870312156139d0576139cf614ad7565b5b600085013567ffffffffffffffff8111156139ee576139ed614ad2565b5b6139fa87828801613627565b9450945050602085013567ffffffffffffffff811115613a1d57613a1c614ad2565b5b613a29878288016135d1565b925092505092959194509250565b60008060008060408587031215613a5157613a50614ad7565b5b600085013567ffffffffffffffff811115613a6f57613a6e614ad2565b5b613a7b87828801613627565b9450945050602085013567ffffffffffffffff811115613a9e57613a9d614ad2565b5b613aaa878288016136ff565b925092505092959194509250565b600060208284031215613ace57613acd614ad7565b5b6000613adc84828501613692565b91505092915050565b600060208284031215613afb57613afa614ad7565b5b6000613b09848285016136a7565b91505092915050565b600060208284031215613b2857613b27614ad7565b5b6000613b36848285016136bc565b91505092915050565b60008060208385031215613b5657613b55614ad7565b5b600083013567ffffffffffffffff811115613b7457613b73614ad2565b5b613b80858286016136ff565b92509250509250929050565b600060208284031215613ba257613ba1614ad7565b5b600082013567ffffffffffffffff811115613bc057613bbf614ad2565b5b613bcc84828501613755565b91505092915050565b600060208284031215613beb57613bea614ad7565b5b600082015167ffffffffffffffff811115613c0957613c08614ad2565b5b613c1584828501613783565b91505092915050565b60008060408385031215613c3557613c34614ad7565b5b600083013567ffffffffffffffff811115613c5357613c52614ad2565b5b613c5f85828601613755565b9250506020613c70858286016137b1565b9150509250929050565b600060208284031215613c9057613c8f614ad7565b5b6000613c9e848285016137b1565b91505092915050565b60008060408385031215613cbe57613cbd614ad7565b5b6000613ccc858286016137b1565b9250506020613cdd858286016135a7565b9150509250929050565b600080600060408486031215613d0057613cff614ad7565b5b6000613d0e868287016137b1565b935050602084013567ffffffffffffffff811115613d2f57613d2e614ad2565b5b613d3b868287016136ff565b92509250509250925092565b60008060408385031215613d5e57613d5d614ad7565b5b6000613d6c858286016137b1565b9250506020613d7d858286016137b1565b9150509250929050565b613d9081614871565b82525050565b613d9f81614883565b82525050565b6000613db08261470e565b613dba8185614724565b9350613dca8185602086016148f4565b613dd381614adc565b840191505092915050565b60008154613deb81614927565b613df58186614735565b94506001821660008114613e105760018114613e2157613e54565b60ff19831686528186019350613e54565b613e2a856146f9565b60005b83811015613e4c57815481890152600182019150602081019050613e2d565b838801955050505b50505092915050565b6000613e698385614751565b9350613e768385846148e5565b82840190509392505050565b6000613e8d82614719565b613e978185614740565b9350613ea78185602086016148f4565b613eb081614adc565b840191505092915050565b6000613ec682614719565b613ed08185614751565b9350613ee08185602086016148f4565b80840191505092915050565b6000613ef9601483614740565b9150613f0482614aed565b602082019050919050565b6000613f1c603283614740565b9150613f2782614b16565b604082019050919050565b6000613f3f602683614740565b9150613f4a82614b65565b604082019050919050565b6000613f62602583614740565b9150613f6d82614bb4565b604082019050919050565b6000613f85601c83614740565b9150613f9082614c03565b602082019050919050565b6000613fa8602483614740565b9150613fb382614c2c565b604082019050919050565b6000613fcb601983614740565b9150613fd682614c7b565b602082019050919050565b6000613fee601b83614740565b9150613ff982614ca4565b602082019050919050565b6000614011602c83614740565b915061401c82614ccd565b604082019050919050565b6000614034601483614740565b915061403f82614d1c565b602082019050919050565b6000614057602d83614740565b915061406282614d45565b604082019050919050565b600061407a600c83614740565b915061408582614d94565b602082019050919050565b600061409d601083614740565b91506140a882614dbd565b602082019050919050565b60006140c0603883614740565b91506140cb82614de6565b604082019050919050565b60006140e3602a83614740565b91506140ee82614e35565b604082019050919050565b6000614106602983614740565b915061411182614e84565b604082019050919050565b6000614129601683614740565b915061413482614ed3565b602082019050919050565b600061414c602083614740565b915061415782614efc565b602082019050919050565b600061416f602c83614740565b915061417a82614f25565b604082019050919050565b6000614192602083614740565b915061419d82614f74565b602082019050919050565b60006141b5602183614740565b91506141c082614f9d565b604082019050919050565b60006141d8603183614740565b91506141e382614fec565b604082019050919050565b60006141fb601f83614740565b91506142068261503b565b602082019050919050565b600061421e601183614740565b915061422982615064565b602082019050919050565b61423d816148db565b82525050565b600061424f8284613dde565b915081905092915050565b6000614267828486613e5d565b91508190509392505050565b600061427f8284613ebb565b915081905092915050565b600060208201905061429f6000830184613d87565b92915050565b60006080820190506142ba6000830187613d87565b6142c76020830186613d87565b6142d46040830185614234565b81810360608301526142e68184613da5565b905095945050505050565b60006040820190506143066000830185613d87565b6143136020830184614234565b9392505050565b600060208201905061432f6000830184613d96565b92915050565b6000602082019050818103600083015261434f8184613e82565b905092915050565b6000602082019050818103600083015261437081613eec565b9050919050565b6000602082019050818103600083015261439081613f0f565b9050919050565b600060208201905081810360008301526143b081613f32565b9050919050565b600060208201905081810360008301526143d081613f55565b9050919050565b600060208201905081810360008301526143f081613f78565b9050919050565b6000602082019050818103600083015261441081613f9b565b9050919050565b6000602082019050818103600083015261443081613fbe565b9050919050565b6000602082019050818103600083015261445081613fe1565b9050919050565b6000602082019050818103600083015261447081614004565b9050919050565b6000602082019050818103600083015261449081614027565b9050919050565b600060208201905081810360008301526144b08161404a565b9050919050565b600060208201905081810360008301526144d08161406d565b9050919050565b600060208201905081810360008301526144f081614090565b9050919050565b60006020820190508181036000830152614510816140b3565b9050919050565b60006020820190508181036000830152614530816140d6565b9050919050565b60006020820190508181036000830152614550816140f9565b9050919050565b600060208201905081810360008301526145708161411c565b9050919050565b600060208201905081810360008301526145908161413f565b9050919050565b600060208201905081810360008301526145b081614162565b9050919050565b600060208201905081810360008301526145d081614185565b9050919050565b600060208201905081810360008301526145f0816141a8565b9050919050565b60006020820190508181036000830152614610816141cb565b9050919050565b60006020820190508181036000830152614630816141ee565b9050919050565b6000602082019050818103600083015261465081614211565b9050919050565b600060208201905061466c6000830184614234565b92915050565b600061467c61468d565b90506146888282614959565b919050565b6000604051905090565b600067ffffffffffffffff8211156146b2576146b1614a8f565b5b6146bb82614adc565b9050602081019050919050565b600067ffffffffffffffff8211156146e3576146e2614a8f565b5b6146ec82614adc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614767826148db565b9150614772836148db565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a7576147a66149d3565b5b828201905092915050565b60006147bd826148db565b91506147c8836148db565b9250826147d8576147d7614a02565b5b828204905092915050565b60006147ee826148db565b91506147f9836148db565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614832576148316149d3565b5b828202905092915050565b6000614848826148db565b9150614853836148db565b925082821015614866576148656149d3565b5b828203905092915050565b600061487c826148bb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149125780820151818401526020810190506148f7565b83811115614921576000848401525b50505050565b6000600282049050600182168061493f57607f821691505b6020821081141561495357614952614a31565b5b50919050565b61496282614adc565b810181811067ffffffffffffffff8211171561498157614980614a8f565b5b80604052505050565b6000614995826148db565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c8576149c76149d3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e636f72726563742055524920707265666978206c656e6774680000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e636f72726563742055524920707265666978000000000000000000000000600082015250565b7f746f6b656e49647320616e642063726561746f7273206d75737420626520746860008201527f652073616d65206c656e67746800000000000000000000000000000000000000602082015250565b7f6f6e6c792063726561746f720000000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f746f6b656e2075726920616c7265616479207573656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6e6f7420616c6c6f77656420746f2075706461746520746f6b656e2075726900600082015250565b7f6e6f6e6578697374616e7420746f6b656e000000000000000000000000000000600082015250565b61509681614871565b81146150a157600080fd5b50565b6150ad81614883565b81146150b857600080fd5b50565b6150c48161488f565b81146150cf57600080fd5b50565b6150db816148db565b81146150e657600080fd5b5056fea264697066735822122092031cb337cab3eb244bf211eb57aa1987719cb46d16402ee51d55fc44534eac64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000004ef107a154cb7580c686c239ed9f92597a42b9610000000000000000000000003433361e17d06fce4adbc596995cce73cc241bab000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000055370616365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553504143450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Space
Arg [1] : _symbol (string): SPACE
Arg [2] : _royaltyRate (uint256): 1500
Arg [3] : _monaV1Address (address): 0x4ef107a154CB7580c686C239Ed9F92597A42b961
Arg [4] : _monaWallet (address): 0x3433361e17D06fCe4AdBC596995cCE73CC241baB
Arg [5] : _uriPrefix (string): ipfs://

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [3] : 0000000000000000000000004ef107a154cb7580c686c239ed9f92597a42b961
Arg [4] : 0000000000000000000000003433361e17d06fce4adbc596995cce73cc241bab
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 5370616365000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 5350414345000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [11] : 697066733a2f2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

43434:12709:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52666:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31187:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32747:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32270:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49109:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33497:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53397:430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;47559:309;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33907:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48705:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49675:346;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48169:409;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51080:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7028:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44467:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30881:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30611:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9927:103;;;:::i;:::-;;9276:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31356:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54078:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54665:110;;;:::i;:::-;;33040:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51947:72;;;:::i;:::-;;55400:740;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52428:103;;;:::i;:::-;;34163:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51381:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54983:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50141:243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52173:100;;;:::i;:::-;;51698:68;;;:::i;:::-;;54444:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33266:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10185:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50700:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52666:282;52804:4;52861:26;52846:41;;;:11;:41;;;;:94;;;;52904:36;52928:11;52904:23;:36::i;:::-;52846:94;52826:114;;52666:282;;;:::o;31187:100::-;31241:13;31274:5;31267:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31187:100;:::o;32747:221::-;32823:7;32851:16;32859:7;32851;:16::i;:::-;32843:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32936:15;:24;32952:7;32936:24;;;;;;;;;;;;;;;;;;;;;32929:31;;32747:221;;;:::o;32270:411::-;32351:13;32367:23;32382:7;32367:14;:23::i;:::-;32351:39;;32415:5;32409:11;;:2;:11;;;;32401:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32509:5;32493:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32518:37;32535:5;32542:12;:10;:12::i;:::-;32518:16;:37::i;:::-;32493:62;32471:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32652:21;32661:2;32665:7;32652:8;:21::i;:::-;32340:341;32270:411;;:::o;49109:257::-;49219:9;;45405:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45475:13;45489:9;45475:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45474:25;45466:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45537:28;45555:9;45537:17;:28::i;:::-;49258:8:::1;45796:29;45816:8;45796:19;:29::i;:::-;49307:9:::2;;49284:10;:20;49295:8;49284:20;;;;;;;;;;;:32;;;;;;;:::i;:::-;;49354:4;49327:13;49341:9;;49327:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;45576:1:::1;49109:257:::0;;;;:::o;33497:339::-;33692:41;33711:12;:10;:12::i;:::-;33725:7;33692:18;:41::i;:::-;33684:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33800:28;33810:4;33816:2;33820:7;33800:9;:28::i;:::-;33497:339;;;:::o;53397:430::-;53506:16;53524:21;53571:17;53579:8;53571:7;:17::i;:::-;53563:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;53621:19;44004:6;53657:11;;53644:10;:24;;;;:::i;:::-;53643:47;;;;:::i;:::-;53621:69;;53745:1;53723:24;;:10;;;;;;;;;;;:24;;;:59;;53772:10;;;;;;;;;;;53723:59;;;53750:9;:19;53760:8;53750:19;;;;;;;;;;;;;;;;;;;;;53723:59;53797:11;53701:118;;;;;53397:430;;;;;:::o;47559:309::-;7354:8;:6;:8::i;:::-;7353:9;7345:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;47667:9:::1;45475:13;45489:9;45475:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45474:25;45466:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45537:28;45555:9;45537:17;:28::i;:::-;47720:9:::2;47694:10;:23;47705:11;;47694:23;;;;;;;;;;;:35;;;;;;;;;;;;:::i;:::-;;47767:4;47740:13;47754:9;47740:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;47807:10;47782:9;:22;47792:11;;47782:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;47828:32;47834:10;47846:11;;:13;;;;;;;;;:::i;:::-;;;;;47828:5;:32::i;:::-;7394:1:::1;47559:309:::0;:::o;33907:185::-;34045:39;34062:4;34068:2;34072:7;34045:39;;;;;;;;;;;;:16;:39::i;:::-;33907:185;;;:::o;48705:83::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48765:15:::1;48771:8;48765:5;:15::i;:::-;48705:83:::0;:::o;49675:346::-;49809:9;;45405:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45475:13;45489:9;45475:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45474:25;45466:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45537:28;45555:9;45537:17;:28::i;:::-;49840:9:::1;;45966;45961:107;45985:9;;:16;;45981:1;:20;45961:107;;;46023:33;46043:9;;46053:1;46043:12;;;;;;;:::i;:::-;;;;;;;;46023:19;:33::i;:::-;46003:3;;;;;:::i;:::-;;;;45961:107;;;;49889:4:::2;49862:13;49876:9;;49862:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;49909:9;49904:110;49928:9;;:16;;49924:1;:20;49904:110;;;49993:9;;49966:10;:24;49977:9;;49987:1;49977:12;;;;;;;:::i;:::-;;;;;;;;49966:24;;;;;;;;;;;:36;;;;;;;:::i;:::-;;49946:3;;;;;:::i;:::-;;;;49904:110;;;;45576:1:::1;;49675:346:::0;;;;;:::o;48169:409::-;7354:8;:6;:8::i;:::-;7353:9;7345:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48303:9:::1;45475:13;45489:9;45475:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45474:25;45466:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45537:28;45555:9;45537:17;:28::i;:::-;48357:4:::2;48330:13;48344:9;48330:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;48377:9;48372:199;48396:9;48392:1;:13;48372:199;;;48453:9;48427:10;:23;48438:11;;48427:23;;;;;;;;;;;:35;;;;;;;;;;;;:::i;:::-;;48502:10;48477:9;:22;48487:11;;48477:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;48527:32;48533:10;48545:11;;:13;;;;;;;;;:::i;:::-;;;;;48527:5;:32::i;:::-;48407:3;;;;;:::i;:::-;;;;48372:199;;;;7394:1:::1;48169:409:::0;;:::o;51080:170::-;51138:7;51166:17;51174:8;51166:7;:17::i;:::-;51158:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;51223:9;:19;51233:8;51223:19;;;;;;;;;;;;;;;;;;;;;51216:26;;51080:170;;;:::o;7028:86::-;7075:4;7099:7;;;;;;;;;;;7092:14;;7028:86;:::o;44467:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30881:239::-;30953:7;30973:13;30989:7;:16;30997:7;30989:16;;;;;;;;;;;;;;;;;;;;;30973:32;;31041:1;31024:19;;:5;:19;;;;31016:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31107:5;31100:12;;;30881:239;;;:::o;30611:208::-;30683:7;30728:1;30711:19;;:5;:19;;;;30703:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30795:9;:16;30805:5;30795:16;;;;;;;;;;;;;;;;30788:23;;30611:208;;;:::o;9927:103::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9992:30:::1;10019:1;9992:18;:30::i;:::-;9927:103::o:0;9276:87::-;9322:7;9349:6;;;;;;;;;;;9342:13;;9276:87;:::o;31356:104::-;31412:13;31445:7;31438:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31356:104;:::o;54078:113::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54169:14:::1;54156:10;;:27;;;;;;;;;;;;;;;;;;54078:113:::0;:::o;54665:110::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54724:10:::1;;;;;;;;;;;54716:28;;:51;54745:21;54716:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54665:110::o:0;33040:155::-;33135:52;33154:12;:10;:12::i;:::-;33168:8;33178;33135:18;:52::i;:::-;33040:155;;:::o;51947:72::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52001:10:::1;:8;:10::i;:::-;51947:72::o:0;55400:740::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55597:16:::1;;:23;;55571:15;;:22;;:49;55549:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;55709:9;55704:429;55728:15;;:22;;55724:1;:26;55704:429;;;55772:25;55800:6;;;;;;;;;;;:15;;;55816;;55832:1;55816:18;;;;;;;:::i;:::-;;;;;;;;55800:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55772:63;;55878:11;55852:10;:23;55863:11;;55852:23;;;;;;;;;;;:37;;;;;;;;;;;;:::i;:::-;;55933:4;55904:13;55918:11;55904:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;55977:16;;55994:1;55977:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55952:9;:22;55962:11;;55952:22;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;56013:21;56037:6;;;;;;;;;;;:14;;;56052:15;;56068:1;56052:18;;;;;;;:::i;:::-;;;;;;;;56037:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56013:58;;56086:35;56092:13;56107:11;;:13;;;;;;;;;:::i;:::-;;;;;56086:5;:35::i;:::-;55757:376;;55752:3;;;;;:::i;:::-;;;;55704:429;;;;55400:740:::0;;;;:::o;52428:103::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52518:5:::1;52492:23;;:31;;;;;;;;;;;;;;;;;;52428:103::o:0;34163:328::-;34338:41;34357:12;:10;:12::i;:::-;34371:7;34338:18;:41::i;:::-;34330:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34444:39;34458:4;34464:2;34468:7;34477:5;34444:13;:39::i;:::-;34163:328;;;;:::o;51381:111::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51474:10:::1;;51462:9;:22;;;;;;;:::i;:::-;;51381:111:::0;;:::o;54983:132::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55072:5:::1;55065:22;;;55088:10;;;;;;;;;;;55100:6;55065:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54983:132:::0;;:::o;50141:243::-;50260:13;50299:17;50307:8;50299:7;:17::i;:::-;50291:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;50356:10;:20;50367:8;50356:20;;;;;;;;;;;50349:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50141:243;;;:::o;52173:100::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52261:4:::1;52235:23;;:30;;;;;;;;;;;;;;;;;;52173:100::o:0;51698:68::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51750:8:::1;:6;:8::i;:::-;51698:68::o:0;54444:97::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54528:5:::1;54514:11;:19;;;;54444:97:::0;:::o;33266:164::-;33363:4;33387:18;:25;33406:5;33387:25;;;;;;;;;;;;;;;:35;33413:8;33387:35;;;;;;;;;;;;;;;;;;;;;;;;;33380:42;;33266:164;;;;:::o;10185:201::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10294:1:::1;10274:22;;:8;:22;;;;10266:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10350:28;10369:8;10350:18;:28::i;:::-;10185:201:::0;:::o;50700:252::-;50816:9;:19;50826:8;50816:19;;;;;;;;;;;;;;;;;;;;;50802:33;;:10;:33;;;:58;;;;50853:7;:5;:7::i;:::-;50839:21;;:10;:21;;;50802:58;50780:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;50933:11;50911:9;:19;50921:8;50911:19;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;50700:252;;:::o;30242:305::-;30344:4;30396:25;30381:40;;;:11;:40;;;;:105;;;;30453:33;30438:48;;;:11;:48;;;;30381:105;:158;;;;30503:36;30527:11;30503:23;:36::i;:::-;30381:158;30361:178;;30242:305;;;:::o;36001:127::-;36066:4;36118:1;36090:30;;:7;:16;36098:7;36090:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36083:37;;36001:127;;;:::o;5682:98::-;5735:7;5762:10;5755:17;;5682:98;:::o;40147:174::-;40249:2;40222:15;:24;40238:7;40222:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40305:7;40301:2;40267:46;;40276:23;40291:7;40276:14;:23::i;:::-;40267:46;;;;;;;;;;;;40147:174;;:::o;46429:788::-;46506:24;46539:9;46506:43;;46560:20;46589:9;46583:23;;;;;:::i;:::-;;;46560:46;;46737:12;46716:11;:18;:33;46708:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46792:25;46830:12;46820:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46792:51;;46923:9;46918:157;46938:12;46934:1;:16;46918:157;;;46987:11;46999:1;46987:14;;;;;;;;:::i;:::-;;;;;;;;;;46969:12;46982:1;46969:15;;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;47045:3;;;;;46918:157;;;;47150:9;47134:27;;;;;;:::i;:::-;;;;;;;;47117:12;47107:23;;;;;;:54;47085:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;46495:722;;;46429:788;:::o;46095:266::-;46203:7;:5;:7::i;:::-;46189:21;;:10;:21;;;:105;;;;46246:9;:19;46256:8;46246:19;;;;;;;;;;;;;;;;;;;;;46232:33;;:10;:33;;;:61;;;;;46270:23;;;;;;;;;;;46269:24;46232:61;46189:105;46167:186;;;;;;;;;;;;:::i;:::-;;;;;;;;;46095:266;:::o;36295:348::-;36388:4;36413:16;36421:7;36413;:16::i;:::-;36405:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36489:13;36505:23;36520:7;36505:14;:23::i;:::-;36489:39;;36558:5;36547:16;;:7;:16;;;:52;;;;36567:32;36584:5;36591:7;36567:16;:32::i;:::-;36547:52;:87;;;;36627:7;36603:31;;:20;36615:7;36603:11;:20::i;:::-;:31;;;36547:87;36539:96;;;36295:348;;;;:::o;39404:625::-;39563:4;39536:31;;:23;39551:7;39536:14;:23::i;:::-;:31;;;39528:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39642:1;39628:16;;:2;:16;;;;39620:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39698:39;39719:4;39725:2;39729:7;39698:20;:39::i;:::-;39802:29;39819:1;39823:7;39802:8;:29::i;:::-;39863:1;39844:9;:15;39854:4;39844:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39892:1;39875:9;:13;39885:2;39875:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39923:2;39904:7;:16;39912:7;39904:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39962:7;39958:2;39943:27;;39952:4;39943:27;;;;;;;;;;;;39983:38;40003:4;40009:2;40013:7;39983:19;:38::i;:::-;39404:625;;;:::o;37979:439::-;38073:1;38059:16;;:2;:16;;;;38051:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38132:16;38140:7;38132;:16::i;:::-;38131:17;38123:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38194:45;38223:1;38227:2;38231:7;38194:20;:45::i;:::-;38269:1;38252:9;:13;38262:2;38252:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38300:2;38281:7;:16;38289:7;38281:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38345:7;38341:2;38320:33;;38337:1;38320:33;;;;;;;;;;;;38366:44;38394:1;38398:2;38402:7;38366:19;:44::i;:::-;37979:439;;:::o;38647:420::-;38707:13;38723:23;38738:7;38723:14;:23::i;:::-;38707:39;;38759:48;38780:5;38795:1;38799:7;38759:20;:48::i;:::-;38848:29;38865:1;38869:7;38848:8;:29::i;:::-;38910:1;38890:9;:16;38900:5;38890:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38929:7;:16;38937:7;38929:16;;;;;;;;;;;;38922:23;;;;;;;;;;;38991:7;38987:1;38963:36;;38972:5;38963:36;;;;;;;;;;;;39012:47;39032:5;39047:1;39051:7;39012:19;:47::i;:::-;38696:371;38647:420;:::o;10546:191::-;10620:16;10639:6;;;;;;;;;;;10620:25;;10665:8;10656:6;;:17;;;;;;;;;;;;;;;;;;10720:8;10689:40;;10710:8;10689:40;;;;;;;;;;;;10609:128;10546:191;:::o;40463:315::-;40618:8;40609:17;;:5;:17;;;;40601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40705:8;40667:18;:25;40686:5;40667:25;;;;;;;;;;;;;;;:35;40693:8;40667:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40751:8;40729:41;;40744:5;40729:41;;;40761:8;40729:41;;;;;;:::i;:::-;;;;;;;;40463:315;;;:::o;8087:120::-;7631:8;:6;:8::i;:::-;7623:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;8156:5:::1;8146:7;;:15;;;;;;;;;;;;;;;;;;8177:22;8186:12;:10;:12::i;:::-;8177:22;;;;;;:::i;:::-;;;;;;;;8087:120::o:0;35373:315::-;35530:28;35540:4;35546:2;35550:7;35530:9;:28::i;:::-;35577:48;35600:4;35606:2;35610:7;35619:5;35577:22;:48::i;:::-;35569:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35373:315;;;;:::o;7828:118::-;7354:8;:6;:8::i;:::-;7353:9;7345:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;7898:4:::1;7888:7;;:14;;;;;;;;;;;;;;;;;;7918:20;7925:12;:10;:12::i;:::-;7918:20;;;;;;:::i;:::-;;;;;;;;7828:118::o:0;22981:157::-;23066:4;23105:25;23090:40;;;:11;:40;;;;23083:47;;22981:157;;;:::o;42714:126::-;;;;:::o;43225:125::-;;;;:::o;41343:799::-;41498:4;41519:15;:2;:13;;;:15::i;:::-;41515:620;;;41571:2;41555:36;;;41592:12;:10;:12::i;:::-;41606:4;41612:7;41621:5;41555:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41551:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41814:1;41797:6;:13;:18;41793:272;;;41840:60;;;;;;;;;;:::i;:::-;;;;;;;;41793:272;42015:6;42009:13;42000:6;41996:2;41992:15;41985:38;41551:529;41688:41;;;41678:51;;;:6;:51;;;;41671:58;;;;;41515:620;42119:4;42112:11;;41343:799;;;;;;;:::o;11977:326::-;12037:4;12294:1;12272:7;:19;;;:23;12265:30;;11977:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:421::-;930:5;955:66;971:49;1013:6;971:49;:::i;:::-;955:66;:::i;:::-;946:75;;1044:6;1037:5;1030:21;1082:4;1075:5;1071:16;1120:3;1111:6;1106:3;1102:16;1099:25;1096:112;;;1127:79;;:::i;:::-;1096:112;1217:39;1249:6;1244:3;1239;1217:39;:::i;:::-;936:326;841:421;;;;;:::o;1268:139::-;1314:5;1352:6;1339:20;1330:29;;1368:33;1395:5;1368:33;:::i;:::-;1268:139;;;;:::o;1413:143::-;1470:5;1501:6;1495:13;1486:22;;1517:33;1544:5;1517:33;:::i;:::-;1413:143;;;;:::o;1579:568::-;1652:8;1662:6;1712:3;1705:4;1697:6;1693:17;1689:27;1679:122;;1720:79;;:::i;:::-;1679:122;1833:6;1820:20;1810:30;;1863:18;1855:6;1852:30;1849:117;;;1885:79;;:::i;:::-;1849:117;1999:4;1991:6;1987:17;1975:29;;2053:3;2045:4;2037:6;2033:17;2023:8;2019:32;2016:41;2013:128;;;2060:79;;:::i;:::-;2013:128;1579:568;;;;;:::o;2170:::-;2243:8;2253:6;2303:3;2296:4;2288:6;2284:17;2280:27;2270:122;;2311:79;;:::i;:::-;2270:122;2424:6;2411:20;2401:30;;2454:18;2446:6;2443:30;2440:117;;;2476:79;;:::i;:::-;2440:117;2590:4;2582:6;2578:17;2566:29;;2644:3;2636:4;2628:6;2624:17;2614:8;2610:32;2607:41;2604:128;;;2651:79;;:::i;:::-;2604:128;2170:568;;;;;:::o;2744:133::-;2787:5;2825:6;2812:20;2803:29;;2841:30;2865:5;2841:30;:::i;:::-;2744:133;;;;:::o;2883:137::-;2937:5;2968:6;2962:13;2953:22;;2984:30;3008:5;2984:30;:::i;:::-;2883:137;;;;:::o;3026:::-;3071:5;3109:6;3096:20;3087:29;;3125:32;3151:5;3125:32;:::i;:::-;3026:137;;;;:::o;3169:141::-;3225:5;3256:6;3250:13;3241:22;;3272:32;3298:5;3272:32;:::i;:::-;3169:141;;;;:::o;3329:338::-;3384:5;3433:3;3426:4;3418:6;3414:17;3410:27;3400:122;;3441:79;;:::i;:::-;3400:122;3558:6;3545:20;3583:78;3657:3;3649:6;3642:4;3634:6;3630:17;3583:78;:::i;:::-;3574:87;;3390:277;3329:338;;;;:::o;3687:553::-;3745:8;3755:6;3805:3;3798:4;3790:6;3786:17;3782:27;3772:122;;3813:79;;:::i;:::-;3772:122;3926:6;3913:20;3903:30;;3956:18;3948:6;3945:30;3942:117;;;3978:79;;:::i;:::-;3942:117;4092:4;4084:6;4080:17;4068:29;;4146:3;4138:4;4130:6;4126:17;4116:8;4112:32;4109:41;4106:128;;;4153:79;;:::i;:::-;4106:128;3687:553;;;;;:::o;4260:340::-;4316:5;4365:3;4358:4;4350:6;4346:17;4342:27;4332:122;;4373:79;;:::i;:::-;4332:122;4490:6;4477:20;4515:79;4590:3;4582:6;4575:4;4567:6;4563:17;4515:79;:::i;:::-;4506:88;;4322:278;4260:340;;;;:::o;4620:355::-;4687:5;4736:3;4729:4;4721:6;4717:17;4713:27;4703:122;;4744:79;;:::i;:::-;4703:122;4854:6;4848:13;4879:90;4965:3;4957:6;4950:4;4942:6;4938:17;4879:90;:::i;:::-;4870:99;;4693:282;4620:355;;;;:::o;4981:139::-;5027:5;5065:6;5052:20;5043:29;;5081:33;5108:5;5081:33;:::i;:::-;4981:139;;;;:::o;5126:329::-;5185:6;5234:2;5222:9;5213:7;5209:23;5205:32;5202:119;;;5240:79;;:::i;:::-;5202:119;5360:1;5385:53;5430:7;5421:6;5410:9;5406:22;5385:53;:::i;:::-;5375:63;;5331:117;5126:329;;;;:::o;5461:351::-;5531:6;5580:2;5568:9;5559:7;5555:23;5551:32;5548:119;;;5586:79;;:::i;:::-;5548:119;5706:1;5731:64;5787:7;5778:6;5767:9;5763:22;5731:64;:::i;:::-;5721:74;;5677:128;5461:351;;;;:::o;5818:474::-;5886:6;5894;5943:2;5931:9;5922:7;5918:23;5914:32;5911:119;;;5949:79;;:::i;:::-;5911:119;6069:1;6094:53;6139:7;6130:6;6119:9;6115:22;6094:53;:::i;:::-;6084:63;;6040:117;6196:2;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6167:118;5818:474;;;;;:::o;6298:619::-;6375:6;6383;6391;6440:2;6428:9;6419:7;6415:23;6411:32;6408:119;;;6446:79;;:::i;:::-;6408:119;6566:1;6591:53;6636:7;6627:6;6616:9;6612:22;6591:53;:::i;:::-;6581:63;;6537:117;6693:2;6719:53;6764:7;6755:6;6744:9;6740:22;6719:53;:::i;:::-;6709:63;;6664:118;6821:2;6847:53;6892:7;6883:6;6872:9;6868:22;6847:53;:::i;:::-;6837:63;;6792:118;6298:619;;;;;:::o;6923:943::-;7018:6;7026;7034;7042;7091:3;7079:9;7070:7;7066:23;7062:33;7059:120;;;7098:79;;:::i;:::-;7059:120;7218:1;7243:53;7288:7;7279:6;7268:9;7264:22;7243:53;:::i;:::-;7233:63;;7189:117;7345:2;7371:53;7416:7;7407:6;7396:9;7392:22;7371:53;:::i;:::-;7361:63;;7316:118;7473:2;7499:53;7544:7;7535:6;7524:9;7520:22;7499:53;:::i;:::-;7489:63;;7444:118;7629:2;7618:9;7614:18;7601:32;7660:18;7652:6;7649:30;7646:117;;;7682:79;;:::i;:::-;7646:117;7787:62;7841:7;7832:6;7821:9;7817:22;7787:62;:::i;:::-;7777:72;;7572:287;6923:943;;;;;;;:::o;7872:468::-;7937:6;7945;7994:2;7982:9;7973:7;7969:23;7965:32;7962:119;;;8000:79;;:::i;:::-;7962:119;8120:1;8145:53;8190:7;8181:6;8170:9;8166:22;8145:53;:::i;:::-;8135:63;;8091:117;8247:2;8273:50;8315:7;8306:6;8295:9;8291:22;8273:50;:::i;:::-;8263:60;;8218:115;7872:468;;;;;:::o;8346:474::-;8414:6;8422;8471:2;8459:9;8450:7;8446:23;8442:32;8439:119;;;8477:79;;:::i;:::-;8439:119;8597:1;8622:53;8667:7;8658:6;8647:9;8643:22;8622:53;:::i;:::-;8612:63;;8568:117;8724:2;8750:53;8795:7;8786:6;8775:9;8771:22;8750:53;:::i;:::-;8740:63;;8695:118;8346:474;;;;;:::o;8826:934::-;8948:6;8956;8964;8972;9021:2;9009:9;9000:7;8996:23;8992:32;8989:119;;;9027:79;;:::i;:::-;8989:119;9175:1;9164:9;9160:17;9147:31;9205:18;9197:6;9194:30;9191:117;;;9227:79;;:::i;:::-;9191:117;9340:80;9412:7;9403:6;9392:9;9388:22;9340:80;:::i;:::-;9322:98;;;;9118:312;9497:2;9486:9;9482:18;9469:32;9528:18;9520:6;9517:30;9514:117;;;9550:79;;:::i;:::-;9514:117;9663:80;9735:7;9726:6;9715:9;9711:22;9663:80;:::i;:::-;9645:98;;;;9440:313;8826:934;;;;;;;:::o;9766:904::-;9873:6;9881;9889;9897;9946:2;9934:9;9925:7;9921:23;9917:32;9914:119;;;9952:79;;:::i;:::-;9914:119;10100:1;10089:9;10085:17;10072:31;10130:18;10122:6;10119:30;10116:117;;;10152:79;;:::i;:::-;10116:117;10265:80;10337:7;10328:6;10317:9;10313:22;10265:80;:::i;:::-;10247:98;;;;10043:312;10422:2;10411:9;10407:18;10394:32;10453:18;10445:6;10442:30;10439:117;;;10475:79;;:::i;:::-;10439:117;10588:65;10645:7;10636:6;10625:9;10621:22;10588:65;:::i;:::-;10570:83;;;;10365:298;9766:904;;;;;;;:::o;10676:345::-;10743:6;10792:2;10780:9;10771:7;10767:23;10763:32;10760:119;;;10798:79;;:::i;:::-;10760:119;10918:1;10943:61;10996:7;10987:6;10976:9;10972:22;10943:61;:::i;:::-;10933:71;;10889:125;10676:345;;;;:::o;11027:327::-;11085:6;11134:2;11122:9;11113:7;11109:23;11105:32;11102:119;;;11140:79;;:::i;:::-;11102:119;11260:1;11285:52;11329:7;11320:6;11309:9;11305:22;11285:52;:::i;:::-;11275:62;;11231:116;11027:327;;;;:::o;11360:349::-;11429:6;11478:2;11466:9;11457:7;11453:23;11449:32;11446:119;;;11484:79;;:::i;:::-;11446:119;11604:1;11629:63;11684:7;11675:6;11664:9;11660:22;11629:63;:::i;:::-;11619:73;;11575:127;11360:349;;;;:::o;11715:529::-;11786:6;11794;11843:2;11831:9;11822:7;11818:23;11814:32;11811:119;;;11849:79;;:::i;:::-;11811:119;11997:1;11986:9;11982:17;11969:31;12027:18;12019:6;12016:30;12013:117;;;12049:79;;:::i;:::-;12013:117;12162:65;12219:7;12210:6;12199:9;12195:22;12162:65;:::i;:::-;12144:83;;;;11940:297;11715:529;;;;;:::o;12250:509::-;12319:6;12368:2;12356:9;12347:7;12343:23;12339:32;12336:119;;;12374:79;;:::i;:::-;12336:119;12522:1;12511:9;12507:17;12494:31;12552:18;12544:6;12541:30;12538:117;;;12574:79;;:::i;:::-;12538:117;12679:63;12734:7;12725:6;12714:9;12710:22;12679:63;:::i;:::-;12669:73;;12465:287;12250:509;;;;:::o;12765:524::-;12845:6;12894:2;12882:9;12873:7;12869:23;12865:32;12862:119;;;12900:79;;:::i;:::-;12862:119;13041:1;13030:9;13026:17;13020:24;13071:18;13063:6;13060:30;13057:117;;;13093:79;;:::i;:::-;13057:117;13198:74;13264:7;13255:6;13244:9;13240:22;13198:74;:::i;:::-;13188:84;;12991:291;12765:524;;;;:::o;13295:654::-;13373:6;13381;13430:2;13418:9;13409:7;13405:23;13401:32;13398:119;;;13436:79;;:::i;:::-;13398:119;13584:1;13573:9;13569:17;13556:31;13614:18;13606:6;13603:30;13600:117;;;13636:79;;:::i;:::-;13600:117;13741:63;13796:7;13787:6;13776:9;13772:22;13741:63;:::i;:::-;13731:73;;13527:287;13853:2;13879:53;13924:7;13915:6;13904:9;13900:22;13879:53;:::i;:::-;13869:63;;13824:118;13295:654;;;;;:::o;13955:329::-;14014:6;14063:2;14051:9;14042:7;14038:23;14034:32;14031:119;;;14069:79;;:::i;:::-;14031:119;14189:1;14214:53;14259:7;14250:6;14239:9;14235:22;14214:53;:::i;:::-;14204:63;;14160:117;13955:329;;;;:::o;14290:474::-;14358:6;14366;14415:2;14403:9;14394:7;14390:23;14386:32;14383:119;;;14421:79;;:::i;:::-;14383:119;14541:1;14566:53;14611:7;14602:6;14591:9;14587:22;14566:53;:::i;:::-;14556:63;;14512:117;14668:2;14694:53;14739:7;14730:6;14719:9;14715:22;14694:53;:::i;:::-;14684:63;;14639:118;14290:474;;;;;:::o;14770:674::-;14850:6;14858;14866;14915:2;14903:9;14894:7;14890:23;14886:32;14883:119;;;14921:79;;:::i;:::-;14883:119;15041:1;15066:53;15111:7;15102:6;15091:9;15087:22;15066:53;:::i;:::-;15056:63;;15012:117;15196:2;15185:9;15181:18;15168:32;15227:18;15219:6;15216:30;15213:117;;;15249:79;;:::i;:::-;15213:117;15362:65;15419:7;15410:6;15399:9;15395:22;15362:65;:::i;:::-;15344:83;;;;15139:298;14770:674;;;;;:::o;15450:474::-;15518:6;15526;15575:2;15563:9;15554:7;15550:23;15546:32;15543:119;;;15581:79;;:::i;:::-;15543:119;15701:1;15726:53;15771:7;15762:6;15751:9;15747:22;15726:53;:::i;:::-;15716:63;;15672:117;15828:2;15854:53;15899:7;15890:6;15879:9;15875:22;15854:53;:::i;:::-;15844:63;;15799:118;15450:474;;;;;:::o;15930:118::-;16017:24;16035:5;16017:24;:::i;:::-;16012:3;16005:37;15930:118;;:::o;16054:109::-;16135:21;16150:5;16135:21;:::i;:::-;16130:3;16123:34;16054:109;;:::o;16169:360::-;16255:3;16283:38;16315:5;16283:38;:::i;:::-;16337:70;16400:6;16395:3;16337:70;:::i;:::-;16330:77;;16416:52;16461:6;16456:3;16449:4;16442:5;16438:16;16416:52;:::i;:::-;16493:29;16515:6;16493:29;:::i;:::-;16488:3;16484:39;16477:46;;16259:270;16169:360;;;;:::o;16557:849::-;16662:3;16699:5;16693:12;16728:36;16754:9;16728:36;:::i;:::-;16780:88;16861:6;16856:3;16780:88;:::i;:::-;16773:95;;16899:1;16888:9;16884:17;16915:1;16910:137;;;;17061:1;17056:344;;;;16877:523;;16910:137;16994:4;16990:9;16979;16975:25;16970:3;16963:38;17030:6;17025:3;17021:16;17014:23;;16910:137;;17056:344;17123:41;17158:5;17123:41;:::i;:::-;17186:1;17200:154;17214:6;17211:1;17208:13;17200:154;;;17288:7;17282:14;17278:1;17273:3;17269:11;17262:35;17338:1;17329:7;17325:15;17314:26;;17236:4;17233:1;17229:12;17224:17;;17200:154;;;17383:6;17378:3;17374:16;17367:23;;17063:337;;16877:523;;16666:740;;16557:849;;;;:::o;17436:317::-;17552:3;17573:89;17655:6;17650:3;17573:89;:::i;:::-;17566:96;;17672:43;17708:6;17703:3;17696:5;17672:43;:::i;:::-;17740:6;17735:3;17731:16;17724:23;;17436:317;;;;;:::o;17759:364::-;17847:3;17875:39;17908:5;17875:39;:::i;:::-;17930:71;17994:6;17989:3;17930:71;:::i;:::-;17923:78;;18010:52;18055:6;18050:3;18043:4;18036:5;18032:16;18010:52;:::i;:::-;18087:29;18109:6;18087:29;:::i;:::-;18082:3;18078:39;18071:46;;17851:272;17759:364;;;;:::o;18129:377::-;18235:3;18263:39;18296:5;18263:39;:::i;:::-;18318:89;18400:6;18395:3;18318:89;:::i;:::-;18311:96;;18416:52;18461:6;18456:3;18449:4;18442:5;18438:16;18416:52;:::i;:::-;18493:6;18488:3;18484:16;18477:23;;18239:267;18129:377;;;;:::o;18512:366::-;18654:3;18675:67;18739:2;18734:3;18675:67;:::i;:::-;18668:74;;18751:93;18840:3;18751:93;:::i;:::-;18869:2;18864:3;18860:12;18853:19;;18512:366;;;:::o;18884:::-;19026:3;19047:67;19111:2;19106:3;19047:67;:::i;:::-;19040:74;;19123:93;19212:3;19123:93;:::i;:::-;19241:2;19236:3;19232:12;19225:19;;18884:366;;;:::o;19256:::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19256:366;;;:::o;19628:::-;19770:3;19791:67;19855:2;19850:3;19791:67;:::i;:::-;19784:74;;19867:93;19956:3;19867:93;:::i;:::-;19985:2;19980:3;19976:12;19969:19;;19628:366;;;:::o;20000:::-;20142:3;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20239:93;20328:3;20239:93;:::i;:::-;20357:2;20352:3;20348:12;20341:19;;20000:366;;;:::o;20372:::-;20514:3;20535:67;20599:2;20594:3;20535:67;:::i;:::-;20528:74;;20611:93;20700:3;20611:93;:::i;:::-;20729:2;20724:3;20720:12;20713:19;;20372:366;;;:::o;20744:::-;20886:3;20907:67;20971:2;20966:3;20907:67;:::i;:::-;20900:74;;20983:93;21072:3;20983:93;:::i;:::-;21101:2;21096:3;21092:12;21085:19;;20744:366;;;:::o;21116:::-;21258:3;21279:67;21343:2;21338:3;21279:67;:::i;:::-;21272:74;;21355:93;21444:3;21355:93;:::i;:::-;21473:2;21468:3;21464:12;21457:19;;21116:366;;;:::o;21488:::-;21630:3;21651:67;21715:2;21710:3;21651:67;:::i;:::-;21644:74;;21727:93;21816:3;21727:93;:::i;:::-;21845:2;21840:3;21836:12;21829:19;;21488:366;;;:::o;21860:::-;22002:3;22023:67;22087:2;22082:3;22023:67;:::i;:::-;22016:74;;22099:93;22188:3;22099:93;:::i;:::-;22217:2;22212:3;22208:12;22201:19;;21860:366;;;:::o;22232:::-;22374:3;22395:67;22459:2;22454:3;22395:67;:::i;:::-;22388:74;;22471:93;22560:3;22471:93;:::i;:::-;22589:2;22584:3;22580:12;22573:19;;22232:366;;;:::o;22604:::-;22746:3;22767:67;22831:2;22826:3;22767:67;:::i;:::-;22760:74;;22843:93;22932:3;22843:93;:::i;:::-;22961:2;22956:3;22952:12;22945:19;;22604:366;;;:::o;22976:::-;23118:3;23139:67;23203:2;23198:3;23139:67;:::i;:::-;23132:74;;23215:93;23304:3;23215:93;:::i;:::-;23333:2;23328:3;23324:12;23317:19;;22976:366;;;:::o;23348:::-;23490:3;23511:67;23575:2;23570:3;23511:67;:::i;:::-;23504:74;;23587:93;23676:3;23587:93;:::i;:::-;23705:2;23700:3;23696:12;23689:19;;23348:366;;;:::o;23720:::-;23862:3;23883:67;23947:2;23942:3;23883:67;:::i;:::-;23876:74;;23959:93;24048:3;23959:93;:::i;:::-;24077:2;24072:3;24068:12;24061:19;;23720:366;;;:::o;24092:::-;24234:3;24255:67;24319:2;24314:3;24255:67;:::i;:::-;24248:74;;24331:93;24420:3;24331:93;:::i;:::-;24449:2;24444:3;24440:12;24433:19;;24092:366;;;:::o;24464:::-;24606:3;24627:67;24691:2;24686:3;24627:67;:::i;:::-;24620:74;;24703:93;24792:3;24703:93;:::i;:::-;24821:2;24816:3;24812:12;24805:19;;24464:366;;;:::o;24836:::-;24978:3;24999:67;25063:2;25058:3;24999:67;:::i;:::-;24992:74;;25075:93;25164:3;25075:93;:::i;:::-;25193:2;25188:3;25184:12;25177:19;;24836:366;;;:::o;25208:::-;25350:3;25371:67;25435:2;25430:3;25371:67;:::i;:::-;25364:74;;25447:93;25536:3;25447:93;:::i;:::-;25565:2;25560:3;25556:12;25549:19;;25208:366;;;:::o;25580:::-;25722:3;25743:67;25807:2;25802:3;25743:67;:::i;:::-;25736:74;;25819:93;25908:3;25819:93;:::i;:::-;25937:2;25932:3;25928:12;25921:19;;25580:366;;;:::o;25952:::-;26094:3;26115:67;26179:2;26174:3;26115:67;:::i;:::-;26108:74;;26191:93;26280:3;26191:93;:::i;:::-;26309:2;26304:3;26300:12;26293:19;;25952:366;;;:::o;26324:::-;26466:3;26487:67;26551:2;26546:3;26487:67;:::i;:::-;26480:74;;26563:93;26652:3;26563:93;:::i;:::-;26681:2;26676:3;26672:12;26665:19;;26324:366;;;:::o;26696:::-;26838:3;26859:67;26923:2;26918:3;26859:67;:::i;:::-;26852:74;;26935:93;27024:3;26935:93;:::i;:::-;27053:2;27048:3;27044:12;27037:19;;26696:366;;;:::o;27068:::-;27210:3;27231:67;27295:2;27290:3;27231:67;:::i;:::-;27224:74;;27307:93;27396:3;27307:93;:::i;:::-;27425:2;27420:3;27416:12;27409:19;;27068:366;;;:::o;27440:118::-;27527:24;27545:5;27527:24;:::i;:::-;27522:3;27515:37;27440:118;;:::o;27564:273::-;27695:3;27717:94;27807:3;27798:6;27717:94;:::i;:::-;27710:101;;27828:3;27821:10;;27564:273;;;;:::o;27843:295::-;27985:3;28007:105;28108:3;28099:6;28091;28007:105;:::i;:::-;28000:112;;28129:3;28122:10;;27843:295;;;;;:::o;28144:275::-;28276:3;28298:95;28389:3;28380:6;28298:95;:::i;:::-;28291:102;;28410:3;28403:10;;28144:275;;;;:::o;28425:222::-;28518:4;28556:2;28545:9;28541:18;28533:26;;28569:71;28637:1;28626:9;28622:17;28613:6;28569:71;:::i;:::-;28425:222;;;;:::o;28653:640::-;28848:4;28886:3;28875:9;28871:19;28863:27;;28900:71;28968:1;28957:9;28953:17;28944:6;28900:71;:::i;:::-;28981:72;29049:2;29038:9;29034:18;29025:6;28981:72;:::i;:::-;29063;29131:2;29120:9;29116:18;29107:6;29063:72;:::i;:::-;29182:9;29176:4;29172:20;29167:2;29156:9;29152:18;29145:48;29210:76;29281:4;29272:6;29210:76;:::i;:::-;29202:84;;28653:640;;;;;;;:::o;29299:332::-;29420:4;29458:2;29447:9;29443:18;29435:26;;29471:71;29539:1;29528:9;29524:17;29515:6;29471:71;:::i;:::-;29552:72;29620:2;29609:9;29605:18;29596:6;29552:72;:::i;:::-;29299:332;;;;;:::o;29637:210::-;29724:4;29762:2;29751:9;29747:18;29739:26;;29775:65;29837:1;29826:9;29822:17;29813:6;29775:65;:::i;:::-;29637:210;;;;:::o;29853:313::-;29966:4;30004:2;29993:9;29989:18;29981:26;;30053:9;30047:4;30043:20;30039:1;30028:9;30024:17;30017:47;30081:78;30154:4;30145:6;30081:78;:::i;:::-;30073:86;;29853:313;;;;:::o;30172:419::-;30338:4;30376:2;30365:9;30361:18;30353:26;;30425:9;30419:4;30415:20;30411:1;30400:9;30396:17;30389:47;30453:131;30579:4;30453:131;:::i;:::-;30445:139;;30172:419;;;:::o;30597:::-;30763:4;30801:2;30790:9;30786:18;30778:26;;30850:9;30844:4;30840:20;30836:1;30825:9;30821:17;30814:47;30878:131;31004:4;30878:131;:::i;:::-;30870:139;;30597:419;;;:::o;31022:::-;31188:4;31226:2;31215:9;31211:18;31203:26;;31275:9;31269:4;31265:20;31261:1;31250:9;31246:17;31239:47;31303:131;31429:4;31303:131;:::i;:::-;31295:139;;31022:419;;;:::o;31447:::-;31613:4;31651:2;31640:9;31636:18;31628:26;;31700:9;31694:4;31690:20;31686:1;31675:9;31671:17;31664:47;31728:131;31854:4;31728:131;:::i;:::-;31720:139;;31447:419;;;:::o;31872:::-;32038:4;32076:2;32065:9;32061:18;32053:26;;32125:9;32119:4;32115:20;32111:1;32100:9;32096:17;32089:47;32153:131;32279:4;32153:131;:::i;:::-;32145:139;;31872:419;;;:::o;32297:::-;32463:4;32501:2;32490:9;32486:18;32478:26;;32550:9;32544:4;32540:20;32536:1;32525:9;32521:17;32514:47;32578:131;32704:4;32578:131;:::i;:::-;32570:139;;32297:419;;;:::o;32722:::-;32888:4;32926:2;32915:9;32911:18;32903:26;;32975:9;32969:4;32965:20;32961:1;32950:9;32946:17;32939:47;33003:131;33129:4;33003:131;:::i;:::-;32995:139;;32722:419;;;:::o;33147:::-;33313:4;33351:2;33340:9;33336:18;33328:26;;33400:9;33394:4;33390:20;33386:1;33375:9;33371:17;33364:47;33428:131;33554:4;33428:131;:::i;:::-;33420:139;;33147:419;;;:::o;33572:::-;33738:4;33776:2;33765:9;33761:18;33753:26;;33825:9;33819:4;33815:20;33811:1;33800:9;33796:17;33789:47;33853:131;33979:4;33853:131;:::i;:::-;33845:139;;33572:419;;;:::o;33997:::-;34163:4;34201:2;34190:9;34186:18;34178:26;;34250:9;34244:4;34240:20;34236:1;34225:9;34221:17;34214:47;34278:131;34404:4;34278:131;:::i;:::-;34270:139;;33997:419;;;:::o;34422:::-;34588:4;34626:2;34615:9;34611:18;34603:26;;34675:9;34669:4;34665:20;34661:1;34650:9;34646:17;34639:47;34703:131;34829:4;34703:131;:::i;:::-;34695:139;;34422:419;;;:::o;34847:::-;35013:4;35051:2;35040:9;35036:18;35028:26;;35100:9;35094:4;35090:20;35086:1;35075:9;35071:17;35064:47;35128:131;35254:4;35128:131;:::i;:::-;35120:139;;34847:419;;;:::o;35272:::-;35438:4;35476:2;35465:9;35461:18;35453:26;;35525:9;35519:4;35515:20;35511:1;35500:9;35496:17;35489:47;35553:131;35679:4;35553:131;:::i;:::-;35545:139;;35272:419;;;:::o;35697:::-;35863:4;35901:2;35890:9;35886:18;35878:26;;35950:9;35944:4;35940:20;35936:1;35925:9;35921:17;35914:47;35978:131;36104:4;35978:131;:::i;:::-;35970:139;;35697:419;;;:::o;36122:::-;36288:4;36326:2;36315:9;36311:18;36303:26;;36375:9;36369:4;36365:20;36361:1;36350:9;36346:17;36339:47;36403:131;36529:4;36403:131;:::i;:::-;36395:139;;36122:419;;;:::o;36547:::-;36713:4;36751:2;36740:9;36736:18;36728:26;;36800:9;36794:4;36790:20;36786:1;36775:9;36771:17;36764:47;36828:131;36954:4;36828:131;:::i;:::-;36820:139;;36547:419;;;:::o;36972:::-;37138:4;37176:2;37165:9;37161:18;37153:26;;37225:9;37219:4;37215:20;37211:1;37200:9;37196:17;37189:47;37253:131;37379:4;37253:131;:::i;:::-;37245:139;;36972:419;;;:::o;37397:::-;37563:4;37601:2;37590:9;37586:18;37578:26;;37650:9;37644:4;37640:20;37636:1;37625:9;37621:17;37614:47;37678:131;37804:4;37678:131;:::i;:::-;37670:139;;37397:419;;;:::o;37822:::-;37988:4;38026:2;38015:9;38011:18;38003:26;;38075:9;38069:4;38065:20;38061:1;38050:9;38046:17;38039:47;38103:131;38229:4;38103:131;:::i;:::-;38095:139;;37822:419;;;:::o;38247:::-;38413:4;38451:2;38440:9;38436:18;38428:26;;38500:9;38494:4;38490:20;38486:1;38475:9;38471:17;38464:47;38528:131;38654:4;38528:131;:::i;:::-;38520:139;;38247:419;;;:::o;38672:::-;38838:4;38876:2;38865:9;38861:18;38853:26;;38925:9;38919:4;38915:20;38911:1;38900:9;38896:17;38889:47;38953:131;39079:4;38953:131;:::i;:::-;38945:139;;38672:419;;;:::o;39097:::-;39263:4;39301:2;39290:9;39286:18;39278:26;;39350:9;39344:4;39340:20;39336:1;39325:9;39321:17;39314:47;39378:131;39504:4;39378:131;:::i;:::-;39370:139;;39097:419;;;:::o;39522:::-;39688:4;39726:2;39715:9;39711:18;39703:26;;39775:9;39769:4;39765:20;39761:1;39750:9;39746:17;39739:47;39803:131;39929:4;39803:131;:::i;:::-;39795:139;;39522:419;;;:::o;39947:::-;40113:4;40151:2;40140:9;40136:18;40128:26;;40200:9;40194:4;40190:20;40186:1;40175:9;40171:17;40164:47;40228:131;40354:4;40228:131;:::i;:::-;40220:139;;39947:419;;;:::o;40372:222::-;40465:4;40503:2;40492:9;40488:18;40480:26;;40516:71;40584:1;40573:9;40569:17;40560:6;40516:71;:::i;:::-;40372:222;;;;:::o;40600:129::-;40634:6;40661:20;;:::i;:::-;40651:30;;40690:33;40718:4;40710:6;40690:33;:::i;:::-;40600:129;;;:::o;40735:75::-;40768:6;40801:2;40795:9;40785:19;;40735:75;:::o;40816:307::-;40877:4;40967:18;40959:6;40956:30;40953:56;;;40989:18;;:::i;:::-;40953:56;41027:29;41049:6;41027:29;:::i;:::-;41019:37;;41111:4;41105;41101:15;41093:23;;40816:307;;;:::o;41129:308::-;41191:4;41281:18;41273:6;41270:30;41267:56;;;41303:18;;:::i;:::-;41267:56;41341:29;41363:6;41341:29;:::i;:::-;41333:37;;41425:4;41419;41415:15;41407:23;;41129:308;;;:::o;41443:144::-;41495:4;41518:3;41510:11;;41541:3;41538:1;41531:14;41575:4;41572:1;41562:18;41554:26;;41443:144;;;:::o;41593:98::-;41644:6;41678:5;41672:12;41662:22;;41593:98;;;:::o;41697:99::-;41749:6;41783:5;41777:12;41767:22;;41697:99;;;:::o;41802:168::-;41885:11;41919:6;41914:3;41907:19;41959:4;41954:3;41950:14;41935:29;;41802:168;;;;:::o;41976:147::-;42077:11;42114:3;42099:18;;41976:147;;;;:::o;42129:169::-;42213:11;42247:6;42242:3;42235:19;42287:4;42282:3;42278:14;42263:29;;42129:169;;;;:::o;42304:148::-;42406:11;42443:3;42428:18;;42304:148;;;;:::o;42458:305::-;42498:3;42517:20;42535:1;42517:20;:::i;:::-;42512:25;;42551:20;42569:1;42551:20;:::i;:::-;42546:25;;42705:1;42637:66;42633:74;42630:1;42627:81;42624:107;;;42711:18;;:::i;:::-;42624:107;42755:1;42752;42748:9;42741:16;;42458:305;;;;:::o;42769:185::-;42809:1;42826:20;42844:1;42826:20;:::i;:::-;42821:25;;42860:20;42878:1;42860:20;:::i;:::-;42855:25;;42899:1;42889:35;;42904:18;;:::i;:::-;42889:35;42946:1;42943;42939:9;42934:14;;42769:185;;;;:::o;42960:348::-;43000:7;43023:20;43041:1;43023:20;:::i;:::-;43018:25;;43057:20;43075:1;43057:20;:::i;:::-;43052:25;;43245:1;43177:66;43173:74;43170:1;43167:81;43162:1;43155:9;43148:17;43144:105;43141:131;;;43252:18;;:::i;:::-;43141:131;43300:1;43297;43293:9;43282:20;;42960:348;;;;:::o;43314:191::-;43354:4;43374:20;43392:1;43374:20;:::i;:::-;43369:25;;43408:20;43426:1;43408:20;:::i;:::-;43403:25;;43447:1;43444;43441:8;43438:34;;;43452:18;;:::i;:::-;43438:34;43497:1;43494;43490:9;43482:17;;43314:191;;;;:::o;43511:96::-;43548:7;43577:24;43595:5;43577:24;:::i;:::-;43566:35;;43511:96;;;:::o;43613:90::-;43647:7;43690:5;43683:13;43676:21;43665:32;;43613:90;;;:::o;43709:149::-;43745:7;43785:66;43778:5;43774:78;43763:89;;43709:149;;;:::o;43864:126::-;43901:7;43941:42;43934:5;43930:54;43919:65;;43864:126;;;:::o;43996:77::-;44033:7;44062:5;44051:16;;43996:77;;;:::o;44079:154::-;44163:6;44158:3;44153;44140:30;44225:1;44216:6;44211:3;44207:16;44200:27;44079:154;;;:::o;44239:307::-;44307:1;44317:113;44331:6;44328:1;44325:13;44317:113;;;44416:1;44411:3;44407:11;44401:18;44397:1;44392:3;44388:11;44381:39;44353:2;44350:1;44346:10;44341:15;;44317:113;;;44448:6;44445:1;44442:13;44439:101;;;44528:1;44519:6;44514:3;44510:16;44503:27;44439:101;44288:258;44239:307;;;:::o;44552:320::-;44596:6;44633:1;44627:4;44623:12;44613:22;;44680:1;44674:4;44670:12;44701:18;44691:81;;44757:4;44749:6;44745:17;44735:27;;44691:81;44819:2;44811:6;44808:14;44788:18;44785:38;44782:84;;;44838:18;;:::i;:::-;44782:84;44603:269;44552:320;;;:::o;44878:281::-;44961:27;44983:4;44961:27;:::i;:::-;44953:6;44949:40;45091:6;45079:10;45076:22;45055:18;45043:10;45040:34;45037:62;45034:88;;;45102:18;;:::i;:::-;45034:88;45142:10;45138:2;45131:22;44921:238;44878:281;;:::o;45165:233::-;45204:3;45227:24;45245:5;45227:24;:::i;:::-;45218:33;;45273:66;45266:5;45263:77;45260:103;;;45343:18;;:::i;:::-;45260:103;45390:1;45383:5;45379:13;45372:20;;45165:233;;;:::o;45404:180::-;45452:77;45449:1;45442:88;45549:4;45546:1;45539:15;45573:4;45570:1;45563:15;45590:180;45638:77;45635:1;45628:88;45735:4;45732:1;45725:15;45759:4;45756:1;45749:15;45776:180;45824:77;45821:1;45814:88;45921:4;45918:1;45911:15;45945:4;45942:1;45935:15;45962:180;46010:77;46007:1;46000:88;46107:4;46104:1;46097:15;46131:4;46128:1;46121:15;46148:180;46196:77;46193:1;46186:88;46293:4;46290:1;46283:15;46317:4;46314:1;46307:15;46334:117;46443:1;46440;46433:12;46457:117;46566:1;46563;46556:12;46580:117;46689:1;46686;46679:12;46703:117;46812:1;46809;46802:12;46826:117;46935:1;46932;46925:12;46949:117;47058:1;47055;47048:12;47072:102;47113:6;47164:2;47160:7;47155:2;47148:5;47144:14;47140:28;47130:38;;47072:102;;;:::o;47180:170::-;47320:22;47316:1;47308:6;47304:14;47297:46;47180:170;:::o;47356:237::-;47496:34;47492:1;47484:6;47480:14;47473:58;47565:20;47560:2;47552:6;47548:15;47541:45;47356:237;:::o;47599:225::-;47739:34;47735:1;47727:6;47723:14;47716:58;47808:8;47803:2;47795:6;47791:15;47784:33;47599:225;:::o;47830:224::-;47970:34;47966:1;47958:6;47954:14;47947:58;48039:7;48034:2;48026:6;48022:15;48015:32;47830:224;:::o;48060:178::-;48200:30;48196:1;48188:6;48184:14;48177:54;48060:178;:::o;48244:223::-;48384:34;48380:1;48372:6;48368:14;48361:58;48453:6;48448:2;48440:6;48436:15;48429:31;48244:223;:::o;48473:175::-;48613:27;48609:1;48601:6;48597:14;48590:51;48473:175;:::o;48654:177::-;48794:29;48790:1;48782:6;48778:14;48771:53;48654:177;:::o;48837:231::-;48977:34;48973:1;48965:6;48961:14;48954:58;49046:14;49041:2;49033:6;49029:15;49022:39;48837:231;:::o;49074:170::-;49214:22;49210:1;49202:6;49198:14;49191:46;49074:170;:::o;49250:232::-;49390:34;49386:1;49378:6;49374:14;49367:58;49459:15;49454:2;49446:6;49442:15;49435:40;49250:232;:::o;49488:162::-;49628:14;49624:1;49616:6;49612:14;49605:38;49488:162;:::o;49656:166::-;49796:18;49792:1;49784:6;49780:14;49773:42;49656:166;:::o;49828:243::-;49968:34;49964:1;49956:6;49952:14;49945:58;50037:26;50032:2;50024:6;50020:15;50013:51;49828:243;:::o;50077:229::-;50217:34;50213:1;50205:6;50201:14;50194:58;50286:12;50281:2;50273:6;50269:15;50262:37;50077:229;:::o;50312:228::-;50452:34;50448:1;50440:6;50436:14;50429:58;50521:11;50516:2;50508:6;50504:15;50497:36;50312:228;:::o;50546:172::-;50686:24;50682:1;50674:6;50670:14;50663:48;50546:172;:::o;50724:182::-;50864:34;50860:1;50852:6;50848:14;50841:58;50724:182;:::o;50912:231::-;51052:34;51048:1;51040:6;51036:14;51029:58;51121:14;51116:2;51108:6;51104:15;51097:39;50912:231;:::o;51149:182::-;51289:34;51285:1;51277:6;51273:14;51266:58;51149:182;:::o;51337:220::-;51477:34;51473:1;51465:6;51461:14;51454:58;51546:3;51541:2;51533:6;51529:15;51522:28;51337:220;:::o;51563:236::-;51703:34;51699:1;51691:6;51687:14;51680:58;51772:19;51767:2;51759:6;51755:15;51748:44;51563:236;:::o;51805:181::-;51945:33;51941:1;51933:6;51929:14;51922:57;51805:181;:::o;51992:167::-;52132:19;52128:1;52120:6;52116:14;52109:43;51992:167;:::o;52165:122::-;52238:24;52256:5;52238:24;:::i;:::-;52231:5;52228:35;52218:63;;52277:1;52274;52267:12;52218:63;52165:122;:::o;52293:116::-;52363:21;52378:5;52363:21;:::i;:::-;52356:5;52353:32;52343:60;;52399:1;52396;52389:12;52343:60;52293:116;:::o;52415:120::-;52487:23;52504:5;52487:23;:::i;:::-;52480:5;52477:34;52467:62;;52525:1;52522;52515:12;52467:62;52415:120;:::o;52541:122::-;52614:24;52632:5;52614:24;:::i;:::-;52607:5;52604:35;52594:63;;52653:1;52650;52643:12;52594:63;52541:122;:::o

Swarm Source

ipfs://92031cb337cab3eb244bf211eb57aa1987719cb46d16402ee51d55fc44534eac
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.