ETH Price: $3,092.06 (-1.34%)

Token

MetaRugs (MRUG)
 

Overview

Max Total Supply

399 MRUG

Holders

44

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 MRUG
0x9fc86fA1F9C3cDA8dd94011E54e29106b676bE10
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:
MetaRugs1

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-10
*/

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.3;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 overriden 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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: CryptoRugsdummy.sol


pragma solidity ^0.8.7;






 contract CryptoRugsdummy is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public constant MAX_RUGS = 5555;
    uint256 public constant MAX_PURCHASE = 30;

    uint256 public constant PRICE_PER_RUG = 50000000000000000 wei;

    bool private _saleIsActive = false;

    string private _metaBaseUri = "https://cryptorugs.org/meta/";

    string private _provenance = "";

    constructor() ERC721("CryptoRugs", "RUG") { }

    function mint(uint16 numberOfTokens) public payable {
        require(saleIsActive(), "Sale is not active");
        require(numberOfTokens <= MAX_PURCHASE, "Can only mint 30 tokens per transaction");
        require(totalSupply().add(numberOfTokens) <= MAX_RUGS, "Insufficient supply");
        require(PRICE_PER_RUG.mul(numberOfTokens) == msg.value, "Ether value sent is incorrect");

        _mintTokens(numberOfTokens);
    }


    /* Owner functions */

    /**
     * Reserve a few rugs e.g. for giveaways
     */
    function reserve(uint16 numberOfTokens) external onlyOwner {
        require(totalSupply().add(numberOfTokens) <= MAX_RUGS, "Insufficient supply");
        _mintTokens(numberOfTokens);
    }

    function setSaleIsActive(bool active) external onlyOwner {
        _saleIsActive = active;
    }

    function setProvenance(string memory provHash) external onlyOwner {
        _provenance = provHash;
    }

    function setMetaBaseURI(string memory baseURI) external onlyOwner {
        _metaBaseUri = baseURI;
    }

    function withdraw(uint256 amount) external onlyOwner {
        require(amount <= address(this).balance, 'Insufficient balance');
        payable(msg.sender).transfer(amount);
    }

    function withdrawAll() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    /* View functions */

    function saleIsActive() public view returns (bool) {
        return _saleIsActive;
    }

    function provenanceHash() public view returns (string memory) {
        return _provenance;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(_baseURI(), "tokens/", uint256(tokenId).toString(), "/metadata.json"));
    }

    /* Internal functions */
    function _mintTokens(uint16 numberOfTokens) internal {
        for (uint16 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = totalSupply();
            _safeMint(msg.sender, tokenId);
        }
    }

    function _baseURI() override internal view returns (string memory) {
        return _metaBaseUri;
    }
}
// File: CryptoRugs.sol


pragma solidity ^0.8.11;


abstract contract CryptoRugs is CryptoRugsdummy {

}
// File: Metarugs1.sol



/// @author: aLeo
// this contract is based on CryptoRugs - 0x7685d54dB7b41dd751AD1e1b62a62f92D3cE09BE

       
       /////////////////////////////////////////////////////////////////////////////////////////   
       //                                                                                     //
       //                                                                                     //
       //                                                                                     //         
       //           ::::::::::::::::..                           .:::::::::::::::::           //        
       //          .@@@@@@@@@@@@@@@@@@@%*-                  .=*%@@@@@@@@@@@@@@@@@@@.          //        
       //          .@@@@@@@@@@@@@@@@@@@@@@@#:             -%@@@@@@@@@@@@@@@@@@@@@@@.          //        
       //          .@@@@@@@@@@@@@@@@@@@@@@@@@#.         :%@@@@@@@@@@@@@@@@@@@@@@@@@.          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@@:       =@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@@@.     -@@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@@@*     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@@@*     %@@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@@%.     :@@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@@%.       :@@@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@@+          .*@@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@%=              .+%@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@%#+-.                   .=*#%@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@-                                   -@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@*                                 +@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@%.                             .#@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@-                           -@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@*                         *@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@:                     :@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@+                   +@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@%:               :%@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@@@@@@@@@@@@@@=             =@@@@@@@@@@@@@@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@+-@@@@@@@@@@@@#.         .#@@@@@@@@@@@@-+@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@+ .#@@@@@@@@@@@@=       =@@@@@@@@@@@@#. +@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@+   =@@@@@@@@@@@@#    .#@@@@@@@@@@@@+   +@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@=    :#@@@@@@@@@@@@= =@@@@@@@@@@@@#:    =@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@=      =@@@@@@@@@@@@@@@@@@@@@@@@@=      =@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@=       .#@@@@@@@@@@@@@@@@@@@@@#.       =@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@=         =@@@@@@@@@@@@@@@@@@@=         =@@@@@@@@@@@:          //        
       //          :@@@@@@@@@@@=          .%@@@@@@@@@@@@@@@%.          =@@@@@@@@@@@:          //        
       //          .@@@@@@@@@@@=            +@@@@@@@@@@@@@+            =@@@@@@@@@@@.          //        
       //          .@@@@@@@@@@@=             :%@@@@@@@@@%:             =@@@@@@@@@@@.          //        
       //           :#@@@@@@@@@=               +@@@@@@@+               =@@@@@@@@@#:           //        
       //             -%@@@@@@@=                :%@@@%:                =@@@@@@@%-             //        
       //               -%@@@@@=                  +@+                  =@@@@@%-               //        
       //                 =%@@@=                                       =@@@%-                 //        
       //                   =@@=                                       =@@=                   //        
       //                     +-                                       -+                     //                                                              
       //                                                                                     //
       //                                                                                     //
       //                                                                                     //
       /////////////////////////////////////////////////////////////////////////////////////////

pragma solidity ^0.8.11;








    contract MetaRugs1 is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public constant MAX_RUGS = 7400;
    uint256 public constant MAX_PURCHASE = 30;
    uint16 private constant ONE_RUG = 1;
    address public constant BURNADDRESS = 0x000000000000000000000000000000000000dEaD;
    uint256 public constant PRICE_PER_RUG = 50000000000000000 wei;  
 

    bool private _saleIsActive = false;

    string private _metaBaseUri = "ipfs://bafybeiglrswghgitmyt3zpgxhzj32ltv5vnwshaogzpbnojlo7sua2z2tu/";

    CryptoRugs private immutable cryptorugs;

    string private _provenance = "C9B14C9DFA8B67BD7839BCB5D22E623F483DDBD6EB5695EDE0672F381D694362";
  
        constructor(
        address payable cryptorugsAddress
         
    ) ERC721("MetaRugs", "MRUG") {
        cryptorugs = CryptoRugs(cryptorugsAddress);
 
    }


    function mint(uint16 numberOfTokens) public payable {
        require(saleIsActive(), "Sale is not active");
        require(numberOfTokens <= MAX_PURCHASE, "Can only mint 30 tokens per transaction");
        require(totalSupply().add(numberOfTokens) <= MAX_RUGS, "Insufficient supply");
        require(PRICE_PER_RUG.mul(numberOfTokens) == msg.value, "Ether value sent is incorrect");

        _mintTokens(numberOfTokens);
    }

    function burn2mint_ONE_RUG(uint256 tokenId) public
    {
        require(saleIsActive(), "Sale is not active");
        require(cryptorugs.ownerOf(tokenId) == msg.sender, "Must own the rug you're attempting to burn");
        require(totalSupply().add(ONE_RUG) <= MAX_RUGS, "Insufficient supply");
        cryptorugs.transferFrom(msg.sender,BURNADDRESS, tokenId);
        _mintTokens(ONE_RUG);

    }

        function burn2mint_ALL_RUGS(address owner) public
    {
        require(saleIsActive(), "Sale is not active");
        require(cryptorugs.balanceOf(owner) >= ONE_RUG, "Must own at least one rug");
        require(totalSupply().add(cryptorugs.balanceOf(owner)) <= MAX_RUGS, "Insufficient supply");
        uint256 RugsAmount = (cryptorugs.balanceOf(owner));
        for (uint256 i = RugsAmount; i > 0; i--){
            uint256 rugId = cryptorugs.tokenOfOwnerByIndex(owner, i.sub(ONE_RUG));
            cryptorugs.transferFrom(msg.sender, BURNADDRESS, rugId);
        }
        _mintTokens(RugsAmount);

    }

    

    /* Owner functions */

    /**
     * Reserve a few rugs e.g. for giveaways
     */
    function reserve(uint16 numberOfTokens) external onlyOwner {
        require(totalSupply().add(numberOfTokens) <= MAX_RUGS, "Insufficient supply");
        _mintTokens(numberOfTokens);
    }

    function setSaleIsActive(bool active) external onlyOwner {
        _saleIsActive = active;
    }

    function setProvenance(string memory provHash) external onlyOwner {
        _provenance = provHash;
    }

    function setMetaBaseURI(string memory baseURI) external onlyOwner {
        _metaBaseUri = baseURI;
    }

    function withdraw(uint256 amount) external onlyOwner {
        require(amount <= address(this).balance, 'Insufficient balance');
        payable(msg.sender).transfer(amount);
    }

    function withdrawAll() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    /* View functions */
    function saleIsActive() public view returns (bool) {
        return _saleIsActive;
    }

    function provenanceHash() public view returns (string memory) {
        return _provenance;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(_baseURI(), "tokens/", uint256(tokenId).toString(), "/metadata.json"));
    }

    function CryptoRugsOwned(address owner) public view returns (uint256[] memory) {
        
        uint256[] memory RugList = new uint256[] (cryptorugs.balanceOf(owner));
        for (uint256 i=0; i < cryptorugs.balanceOf(owner); i++){
            RugList[i] = cryptorugs.tokenOfOwnerByIndex(owner, i);
        }
        return RugList;
    }

    function CryptoRugsAmount(address owner) public view returns (uint256) {
        return cryptorugs.balanceOf(owner);
        } 

    function MetaRugsOwned(address owner) public view returns (uint256[] memory) {
        
        uint256[] memory RugList = new uint256[] (balanceOf(owner));
        for (uint256 i=0; i < balanceOf(owner); i++){
            RugList[i] = tokenOfOwnerByIndex(owner, i);
        }
        return RugList;
    }

    function MetaRugsAmount(address owner) public view returns (uint256) {
        return balanceOf(owner);
        } 
    

    /* Internal functions */
    function _mintTokens(uint256 numberOfTokens) internal {
        for (uint16 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = totalSupply();
            _safeMint(msg.sender, tokenId);
        }
    }


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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"cryptorugsAddress","type":"address"}],"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"CryptoRugsAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"CryptoRugsOwned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RUGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"MetaRugsAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"MetaRugsOwned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_RUG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"burn2mint_ALL_RUGS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn2mint_ONE_RUG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberOfTokens","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberOfTokens","type":"uint16"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setMetaBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provHash","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setSaleIsActive","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526000600a60146101000a81548160ff021916908315150217905550604051806080016040528060438152602001620055f460439139600b9080519060200190620000509291906200027f565b50604051806060016040528060408152602001620055b460409139600c9080519060200190620000829291906200027f565b503480156200009057600080fd5b5060405162005637380380620056378339818101604052810190620000b6919062000399565b6040518060400160405280600881526020017f4d657461527567730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d5255470000000000000000000000000000000000000000000000000000000081525081600090805190602001906200013a9291906200027f565b508060019080519060200190620001539291906200027f565b505050620001766200016a620001b160201b60201c565b620001b960201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000430565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028d90620003fa565b90600052602060002090601f016020900481019282620002b15760008555620002fd565b82601f10620002cc57805160ff1916838001178555620002fd565b82800160010185558215620002fd579182015b82811115620002fc578251825591602001919060010190620002df565b5b5090506200030c919062000310565b5090565b5b808211156200032b57600081600090555060010162000311565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003618262000334565b9050919050565b620003738162000354565b81146200037f57600080fd5b50565b600081519050620003938162000368565b92915050565b600060208284031215620003b257620003b16200032f565b5b6000620003c28482850162000382565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200041357607f821691505b602082108114156200042a5762000429620003cb565b5b50919050565b6080516151226200049260003960008181610a7501528181610b5601528181610c4901528181610cf601528181610dab015281816119be01528181611cf201528181611dd901528181611e7a015281816120ba015261220d01526151226000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063c6ab67a3116100ab578063f2614fec1161006f578063f2614fec1461081e578063f2fde38b1461085b578063f69c47e814610884578063fc37b4c1146108c1578063ffe630b5146108ea57610225565b8063c6ab67a314610723578063c87b56dd1461074e578063e985e9c51461078b578063eb8d2444146107c8578063ed7c5f0a146107f357610225565b8063a22cb465116100f2578063a22cb4651461062c578063a532ae7714610655578063b2595bcc14610680578063b88d4fde146106bd578063c646ddc0146106e657610225565b8063715018a6146105a8578063853828b6146105bf5780638da5cb5b146105d657806395d89b411461060157610225565b80631f0808d4116101b157806342842e0e1161017557806342842e0e1461049d5780634f6ccce7146104c65780636352211e1461050357806370a08231146105405780637146bd081461057d57610225565b80631f0808d4146103c957806323b872dd146103f257806323cf0a221461041b5780632e1a7d4d146104375780632f745c591461046057610225565b8063081812fc116101f8578063081812fc146102e4578063095ea7b31461032157806313b927bb1461034a57806318160ddd1461037557806318d272eb146103a057610225565b806301ffc9a71461022a57806302c889891461026757806305c40f201461029057806306fdde03146102b9575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613707565b610913565b60405161025e919061374f565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190613796565b61098d565b005b34801561029c57600080fd5b506102b760048036038101906102b29190613821565b610a26565b005b3480156102c557600080fd5b506102ce610e5c565b6040516102db91906138e7565b60405180910390f35b3480156102f057600080fd5b5061030b6004803603810190610306919061393f565b610eee565b604051610318919061397b565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613996565b610f73565b005b34801561035657600080fd5b5061035f61108b565b60405161036c91906139e5565b60405180910390f35b34801561038157600080fd5b5061038a611096565b60405161039791906139e5565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613b35565b6110a3565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190613bb8565b611139565b005b3480156103fe57600080fd5b5061041960048036038101906104149190613be5565b611227565b005b61043560048036038101906104309190613bb8565b611287565b005b34801561044357600080fd5b5061045e6004803603810190610459919061393f565b6113e7565b005b34801561046c57600080fd5b5061048760048036038101906104829190613996565b6114f0565b60405161049491906139e5565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613be5565b611595565b005b3480156104d257600080fd5b506104ed60048036038101906104e8919061393f565b6115b5565b6040516104fa91906139e5565b60405180910390f35b34801561050f57600080fd5b5061052a6004803603810190610525919061393f565b611626565b604051610537919061397b565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613821565b6116d8565b60405161057491906139e5565b60405180910390f35b34801561058957600080fd5b50610592611790565b60405161059f91906139e5565b60405180910390f35b3480156105b457600080fd5b506105bd611795565b005b3480156105cb57600080fd5b506105d461181d565b005b3480156105e257600080fd5b506105eb6118e2565b6040516105f8919061397b565b60405180910390f35b34801561060d57600080fd5b5061061661190c565b60405161062391906138e7565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190613c38565b61199e565b005b34801561066157600080fd5b5061066a6119b4565b60405161067791906139e5565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190613821565b6119ba565b6040516106b491906139e5565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190613d19565b611a5d565b005b3480156106f257600080fd5b5061070d60048036038101906107089190613821565b611abf565b60405161071a9190613e5a565b60405180910390f35b34801561072f57600080fd5b50610738611b6f565b60405161074591906138e7565b60405180910390f35b34801561075a57600080fd5b506107756004803603810190610770919061393f565b611c01565b60405161078291906138e7565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190613e7c565b611c3b565b6040516107bf919061374f565b60405180910390f35b3480156107d457600080fd5b506107dd611ccf565b6040516107ea919061374f565b60405180910390f35b3480156107ff57600080fd5b50610808611ce6565b604051610815919061397b565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190613821565b611cec565b6040516108529190613e5a565b60405180910390f35b34801561086757600080fd5b50610882600480360381019061087d9190613821565b611f50565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613821565b612048565b6040516108b891906139e5565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e3919061393f565b61205a565b005b3480156108f657600080fd5b50610911600480360381019061090c9190613b35565b6122ad565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610986575061098582612343565b5b9050919050565b610995612425565b73ffffffffffffffffffffffffffffffffffffffff166109b36118e2565b73ffffffffffffffffffffffffffffffffffffffff1614610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613f08565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b610a2e611ccf565b610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6490613f74565b60405180910390fd5b600161ffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610acc919061397b565b602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190613fa9565b1015610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590614022565b60405180910390fd5b611ce8610c047f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610bad919061397b565b602060405180830381865afa158015610bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bee9190613fa9565b610bf6611096565b61242d90919063ffffffff16565b1115610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c9061408e565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610ca0919061397b565b602060405180830381865afa158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce19190613fa9565b905060008190505b6000811115610e4e5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632f745c5985610d49600161ffff168661244390919063ffffffff16565b6040518363ffffffff1660e01b8152600401610d669291906140ae565b602060405180830381865afa158015610d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da79190613fa9565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3361dead846040518463ffffffff1660e01b8152600401610e08939291906140d7565b600060405180830381600087803b158015610e2257600080fd5b505af1158015610e36573d6000803e3d6000fd5b50505050508080610e469061413d565b915050610ce9565b50610e5881612459565b5050565b606060008054610e6b90614196565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9790614196565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef982612496565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f9061423a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611626565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe6906142cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100e612425565b73ffffffffffffffffffffffffffffffffffffffff16148061103d575061103c81611037612425565b611c3b565b5b61107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110739061435e565b60405180910390fd5b6110868383612502565b505050565b66b1a2bc2ec5000081565b6000600880549050905090565b6110ab612425565b73ffffffffffffffffffffffffffffffffffffffff166110c96118e2565b73ffffffffffffffffffffffffffffffffffffffff161461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690613f08565b60405180910390fd5b80600b90805190602001906111359291906135f8565b5050565b611141612425565b73ffffffffffffffffffffffffffffffffffffffff1661115f6118e2565b73ffffffffffffffffffffffffffffffffffffffff16146111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90613f08565b60405180910390fd5b611ce86111d68261ffff166111c8611096565b61242d90919063ffffffff16565b1115611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e9061408e565b60405180910390fd5b6112248161ffff16612459565b50565b611238611232612425565b826125bb565b611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e906143f0565b60405180910390fd5b611282838383612699565b505050565b61128f611ccf565b6112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590613f74565b60405180910390fd5b601e8161ffff161115611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90614482565b60405180910390fd5b611ce86113378261ffff16611329611096565b61242d90919063ffffffff16565b1115611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f9061408e565b60405180910390fd5b346113978261ffff1666b1a2bc2ec500006128f590919063ffffffff16565b146113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906144ee565b60405180910390fd5b6113e48161ffff16612459565b50565b6113ef612425565b73ffffffffffffffffffffffffffffffffffffffff1661140d6118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613f08565b60405180910390fd5b478111156114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061455a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114ec573d6000803e3d6000fd5b5050565b60006114fb836116d8565b821061153c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611533906145ec565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b083838360405180602001604052806000815250611a5d565b505050565b60006115bf611096565b8210611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f79061467e565b60405180910390fd5b600882815481106116145761161361469e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c69061473f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906147d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601e81565b61179d612425565b73ffffffffffffffffffffffffffffffffffffffff166117bb6118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890613f08565b60405180910390fd5b61181b600061290b565b565b611825612425565b73ffffffffffffffffffffffffffffffffffffffff166118436118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090613f08565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156118df573d6000803e3d6000fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461191b90614196565b80601f016020809104026020016040519081016040528092919081815260200182805461194790614196565b80156119945780601f1061196957610100808354040283529160200191611994565b820191906000526020600020905b81548152906001019060200180831161197757829003601f168201915b5050505050905090565b6119b06119a9612425565b83836129d1565b5050565b611ce881565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611a15919061397b565b602060405180830381865afa158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a569190613fa9565b9050919050565b611a6e611a68612425565b836125bb565b611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa4906143f0565b60405180910390fd5b611ab984848484612b3e565b50505050565b60606000611acc836116d8565b67ffffffffffffffff811115611ae557611ae4613a0a565b5b604051908082528060200260200182016040528015611b135781602001602082028036833780820191505090505b50905060005b611b22846116d8565b811015611b6557611b3384826114f0565b828281518110611b4657611b4561469e565b5b6020026020010181815250508080611b5d906147f1565b915050611b19565b5080915050919050565b6060600c8054611b7e90614196565b80601f0160208091040260200160405190810160405280929190818152602001828054611baa90614196565b8015611bf75780601f10611bcc57610100808354040283529160200191611bf7565b820191906000526020600020905b815481529060010190602001808311611bda57829003601f168201915b5050505050905090565b6060611c0b612b9a565b611c1483612c2c565b604051602001611c2592919061490e565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600a60149054906101000a900460ff16905090565b61dead81565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611d49919061397b565b602060405180830381865afa158015611d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8a9190613fa9565b67ffffffffffffffff811115611da357611da2613a0a565b5b604051908082528060200260200182016040528015611dd15781602001602082028036833780820191505090505b50905060005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611e30919061397b565b602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190613fa9565b811015611f46577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632f745c5985836040518363ffffffff1660e01b8152600401611ed39291906140ae565b602060405180830381865afa158015611ef0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f149190613fa9565b828281518110611f2757611f2661469e565b5b6020026020010181815250508080611f3e906147f1565b915050611dd7565b5080915050919050565b611f58612425565b73ffffffffffffffffffffffffffffffffffffffff16611f766118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc390613f08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561203c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612033906149ba565b60405180910390fd5b6120458161290b565b50565b6000612053826116d8565b9050919050565b612062611ccf565b6120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890613f74565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161211191906139e5565b602060405180830381865afa15801561212e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215291906149ef565b73ffffffffffffffffffffffffffffffffffffffff16146121a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219f90614a8e565b60405180910390fd5b611ce86121ca600161ffff166121bc611096565b61242d90919063ffffffff16565b111561220b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122029061408e565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3361dead846040518463ffffffff1660e01b815260040161226a939291906140d7565b600060405180830381600087803b15801561228457600080fd5b505af1158015612298573d6000803e3d6000fd5b505050506122aa600161ffff16612459565b50565b6122b5612425565b73ffffffffffffffffffffffffffffffffffffffff166122d36118e2565b73ffffffffffffffffffffffffffffffffffffffff1614612329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232090613f08565b60405180910390fd5b80600c908051906020019061233f9291906135f8565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061241e575061241d82612d8d565b5b9050919050565b600033905090565b6000818361243b9190614aae565b905092915050565b600081836124519190614b04565b905092915050565b60005b818161ffff161015612492576000612472611096565b905061247e3382612df7565b50808061248a90614b38565b91505061245c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661257583611626565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125c682612496565b612605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fc90614bd5565b60405180910390fd5b600061261083611626565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061267f57508373ffffffffffffffffffffffffffffffffffffffff1661266784610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b80612690575061268f8185611c3b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126b982611626565b73ffffffffffffffffffffffffffffffffffffffff161461270f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270690614c67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277690614cf9565b60405180910390fd5b61278a838383612e15565b612795600082612502565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127e59190614b04565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283c9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836129039190614d19565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3790614dbf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b31919061374f565b60405180910390a3505050565b612b49848484612699565b612b5584848484612f29565b612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b90614e51565b60405180910390fd5b50505050565b6060600b8054612ba990614196565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd590614196565b8015612c225780601f10612bf757610100808354040283529160200191612c22565b820191906000526020600020905b815481529060010190602001808311612c0557829003601f168201915b5050505050905090565b60606000821415612c74576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d88565b600082905060005b60008214612ca6578080612c8f906147f1565b915050600a82612c9f9190614ea0565b9150612c7c565b60008167ffffffffffffffff811115612cc257612cc1613a0a565b5b6040519080825280601f01601f191660200182016040528015612cf45781602001600182028036833780820191505090505b5090505b60008514612d8157600182612d0d9190614b04565b9150600a85612d1c9190614ed1565b6030612d289190614aae565b60f81b818381518110612d3e57612d3d61469e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d7a9190614ea0565b9450612cf8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612e118282604051806020016040528060008152506130b1565b5050565b612e2083838361310c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e6357612e5e81613111565b612ea2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ea157612ea0838261315a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee557612ee0816132c7565b612f24565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f2357612f228282613398565b5b5b505050565b6000612f4a8473ffffffffffffffffffffffffffffffffffffffff16613417565b156130a4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f73612425565b8786866040518563ffffffff1660e01b8152600401612f959493929190614f57565b6020604051808303816000875af1925050508015612fd157506040513d601f19601f82011682018060405250810190612fce9190614fb8565b60015b613054573d8060008114613001576040519150601f19603f3d011682016040523d82523d6000602084013e613006565b606091505b5060008151141561304c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304390614e51565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130a9565b600190505b949350505050565b6130bb838361342a565b6130c86000848484612f29565b613107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fe90614e51565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613167846116d8565b6131719190614b04565b9050600060076000848152602001908152602001600020549050818114613256576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132db9190614b04565b905060006009600084815260200190815260200160002054905060006008838154811061330b5761330a61469e565b5b90600052602060002001549050806008838154811061332d5761332c61469e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061337c5761337b614fe5565b5b6001900381819060005260206000200160009055905550505050565b60006133a3836116d8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561349a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349190615060565b60405180910390fd5b6134a381612496565b156134e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134da906150cc565b60405180910390fd5b6134ef60008383612e15565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461353f9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461360490614196565b90600052602060002090601f016020900481019282613626576000855561366d565b82601f1061363f57805160ff191683800117855561366d565b8280016001018555821561366d579182015b8281111561366c578251825591602001919060010190613651565b5b50905061367a919061367e565b5090565b5b8082111561369757600081600090555060010161367f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136e4816136af565b81146136ef57600080fd5b50565b600081359050613701816136db565b92915050565b60006020828403121561371d5761371c6136a5565b5b600061372b848285016136f2565b91505092915050565b60008115159050919050565b61374981613734565b82525050565b60006020820190506137646000830184613740565b92915050565b61377381613734565b811461377e57600080fd5b50565b6000813590506137908161376a565b92915050565b6000602082840312156137ac576137ab6136a5565b5b60006137ba84828501613781565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137ee826137c3565b9050919050565b6137fe816137e3565b811461380957600080fd5b50565b60008135905061381b816137f5565b92915050565b600060208284031215613837576138366136a5565b5b60006138458482850161380c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561388857808201518184015260208101905061386d565b83811115613897576000848401525b50505050565b6000601f19601f8301169050919050565b60006138b98261384e565b6138c38185613859565b93506138d381856020860161386a565b6138dc8161389d565b840191505092915050565b6000602082019050818103600083015261390181846138ae565b905092915050565b6000819050919050565b61391c81613909565b811461392757600080fd5b50565b60008135905061393981613913565b92915050565b600060208284031215613955576139546136a5565b5b60006139638482850161392a565b91505092915050565b613975816137e3565b82525050565b6000602082019050613990600083018461396c565b92915050565b600080604083850312156139ad576139ac6136a5565b5b60006139bb8582860161380c565b92505060206139cc8582860161392a565b9150509250929050565b6139df81613909565b82525050565b60006020820190506139fa60008301846139d6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a428261389d565b810181811067ffffffffffffffff82111715613a6157613a60613a0a565b5b80604052505050565b6000613a7461369b565b9050613a808282613a39565b919050565b600067ffffffffffffffff821115613aa057613a9f613a0a565b5b613aa98261389d565b9050602081019050919050565b82818337600083830152505050565b6000613ad8613ad384613a85565b613a6a565b905082815260208101848484011115613af457613af3613a05565b5b613aff848285613ab6565b509392505050565b600082601f830112613b1c57613b1b613a00565b5b8135613b2c848260208601613ac5565b91505092915050565b600060208284031215613b4b57613b4a6136a5565b5b600082013567ffffffffffffffff811115613b6957613b686136aa565b5b613b7584828501613b07565b91505092915050565b600061ffff82169050919050565b613b9581613b7e565b8114613ba057600080fd5b50565b600081359050613bb281613b8c565b92915050565b600060208284031215613bce57613bcd6136a5565b5b6000613bdc84828501613ba3565b91505092915050565b600080600060608486031215613bfe57613bfd6136a5565b5b6000613c0c8682870161380c565b9350506020613c1d8682870161380c565b9250506040613c2e8682870161392a565b9150509250925092565b60008060408385031215613c4f57613c4e6136a5565b5b6000613c5d8582860161380c565b9250506020613c6e85828601613781565b9150509250929050565b600067ffffffffffffffff821115613c9357613c92613a0a565b5b613c9c8261389d565b9050602081019050919050565b6000613cbc613cb784613c78565b613a6a565b905082815260208101848484011115613cd857613cd7613a05565b5b613ce3848285613ab6565b509392505050565b600082601f830112613d0057613cff613a00565b5b8135613d10848260208601613ca9565b91505092915050565b60008060008060808587031215613d3357613d326136a5565b5b6000613d418782880161380c565b9450506020613d528782880161380c565b9350506040613d638782880161392a565b925050606085013567ffffffffffffffff811115613d8457613d836136aa565b5b613d9087828801613ceb565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dd181613909565b82525050565b6000613de38383613dc8565b60208301905092915050565b6000602082019050919050565b6000613e0782613d9c565b613e118185613da7565b9350613e1c83613db8565b8060005b83811015613e4d578151613e348882613dd7565b9750613e3f83613def565b925050600181019050613e20565b5085935050505092915050565b60006020820190508181036000830152613e748184613dfc565b905092915050565b60008060408385031215613e9357613e926136a5565b5b6000613ea18582860161380c565b9250506020613eb28582860161380c565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ef2602083613859565b9150613efd82613ebc565b602082019050919050565b60006020820190508181036000830152613f2181613ee5565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613f5e601283613859565b9150613f6982613f28565b602082019050919050565b60006020820190508181036000830152613f8d81613f51565b9050919050565b600081519050613fa381613913565b92915050565b600060208284031215613fbf57613fbe6136a5565b5b6000613fcd84828501613f94565b91505092915050565b7f4d757374206f776e206174206c65617374206f6e652072756700000000000000600082015250565b600061400c601983613859565b915061401782613fd6565b602082019050919050565b6000602082019050818103600083015261403b81613fff565b9050919050565b7f496e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b6000614078601383613859565b915061408382614042565b602082019050919050565b600060208201905081810360008301526140a78161406b565b9050919050565b60006040820190506140c3600083018561396c565b6140d060208301846139d6565b9392505050565b60006060820190506140ec600083018661396c565b6140f9602083018561396c565b61410660408301846139d6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061414882613909565b9150600082141561415c5761415b61410e565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141ae57607f821691505b602082108114156141c2576141c1614167565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614224602c83613859565b915061422f826141c8565b604082019050919050565b6000602082019050818103600083015261425381614217565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142b6602183613859565b91506142c18261425a565b604082019050919050565b600060208201905081810360008301526142e5816142a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614348603883613859565b9150614353826142ec565b604082019050919050565b600060208201905081810360008301526143778161433b565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006143da603183613859565b91506143e58261437e565b604082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f43616e206f6e6c79206d696e7420333020746f6b656e7320706572207472616e60008201527f73616374696f6e00000000000000000000000000000000000000000000000000602082015250565b600061446c602783613859565b915061447782614410565b604082019050919050565b6000602082019050818103600083015261449b8161445f565b9050919050565b7f45746865722076616c75652073656e7420697320696e636f7272656374000000600082015250565b60006144d8601d83613859565b91506144e3826144a2565b602082019050919050565b60006020820190508181036000830152614507816144cb565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000614544601483613859565b915061454f8261450e565b602082019050919050565b6000602082019050818103600083015261457381614537565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006145d6602b83613859565b91506145e18261457a565b604082019050919050565b60006020820190508181036000830152614605816145c9565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614668602c83613859565b91506146738261460c565b604082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614729602983613859565b9150614734826146cd565b604082019050919050565b600060208201905081810360008301526147588161471c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006147bb602a83613859565b91506147c68261475f565b604082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b60006147fc82613909565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561482f5761482e61410e565b5b600182019050919050565b600081905092915050565b60006148508261384e565b61485a818561483a565b935061486a81856020860161386a565b80840191505092915050565b7f746f6b656e732f00000000000000000000000000000000000000000000000000600082015250565b60006148ac60078361483a565b91506148b782614876565b600782019050919050565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b60006148f8600e8361483a565b9150614903826148c2565b600e82019050919050565b600061491a8285614845565b91506149258261489f565b91506149318284614845565b915061493c826148eb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149a4602683613859565b91506149af82614948565b604082019050919050565b600060208201905081810360008301526149d381614997565b9050919050565b6000815190506149e9816137f5565b92915050565b600060208284031215614a0557614a046136a5565b5b6000614a13848285016149da565b91505092915050565b7f4d757374206f776e207468652072756720796f7527726520617474656d70746960008201527f6e6720746f206275726e00000000000000000000000000000000000000000000602082015250565b6000614a78602a83613859565b9150614a8382614a1c565b604082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b6000614ab982613909565b9150614ac483613909565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614af957614af861410e565b5b828201905092915050565b6000614b0f82613909565b9150614b1a83613909565b925082821015614b2d57614b2c61410e565b5b828203905092915050565b6000614b4382613b7e565b915061ffff821415614b5857614b5761410e565b5b600182019050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bbf602c83613859565b9150614bca82614b63565b604082019050919050565b60006020820190508181036000830152614bee81614bb2565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614c51602983613859565b9150614c5c82614bf5565b604082019050919050565b60006020820190508181036000830152614c8081614c44565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ce3602483613859565b9150614cee82614c87565b604082019050919050565b60006020820190508181036000830152614d1281614cd6565b9050919050565b6000614d2482613909565b9150614d2f83613909565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d6857614d6761410e565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614da9601983613859565b9150614db482614d73565b602082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e3b603283613859565b9150614e4682614ddf565b604082019050919050565b60006020820190508181036000830152614e6a81614e2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614eab82613909565b9150614eb683613909565b925082614ec657614ec5614e71565b5b828204905092915050565b6000614edc82613909565b9150614ee783613909565b925082614ef757614ef6614e71565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f2982614f02565b614f338185614f0d565b9350614f4381856020860161386a565b614f4c8161389d565b840191505092915050565b6000608082019050614f6c600083018761396c565b614f79602083018661396c565b614f8660408301856139d6565b8181036060830152614f988184614f1e565b905095945050505050565b600081519050614fb2816136db565b92915050565b600060208284031215614fce57614fcd6136a5565b5b6000614fdc84828501614fa3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061504a602083613859565b915061505582615014565b602082019050919050565b600060208201905081810360008301526150798161503d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150b6601c83613859565b91506150c182615080565b602082019050919050565b600060208201905081810360008301526150e5816150a9565b905091905056fea2646970667358221220e23c23f1b67d81b73608d6d16b95e4e2409f8b80358b6b2a20855ec0e8bffa0564736f6c634300080b003343394231344339444641384236374244373833394243423544323245363233463438334444424436454235363935454445303637324633383144363934333632697066733a2f2f62616679626569676c72737767686769746d7974337a706778687a6a33326c747635766e777368616f677a70626e6f6a6c6f37737561327a3274752f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063715018a611610123578063c6ab67a3116100ab578063f2614fec1161006f578063f2614fec1461081e578063f2fde38b1461085b578063f69c47e814610884578063fc37b4c1146108c1578063ffe630b5146108ea57610225565b8063c6ab67a314610723578063c87b56dd1461074e578063e985e9c51461078b578063eb8d2444146107c8578063ed7c5f0a146107f357610225565b8063a22cb465116100f2578063a22cb4651461062c578063a532ae7714610655578063b2595bcc14610680578063b88d4fde146106bd578063c646ddc0146106e657610225565b8063715018a6146105a8578063853828b6146105bf5780638da5cb5b146105d657806395d89b411461060157610225565b80631f0808d4116101b157806342842e0e1161017557806342842e0e1461049d5780634f6ccce7146104c65780636352211e1461050357806370a08231146105405780637146bd081461057d57610225565b80631f0808d4146103c957806323b872dd146103f257806323cf0a221461041b5780632e1a7d4d146104375780632f745c591461046057610225565b8063081812fc116101f8578063081812fc146102e4578063095ea7b31461032157806313b927bb1461034a57806318160ddd1461037557806318d272eb146103a057610225565b806301ffc9a71461022a57806302c889891461026757806305c40f201461029057806306fdde03146102b9575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613707565b610913565b60405161025e919061374f565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190613796565b61098d565b005b34801561029c57600080fd5b506102b760048036038101906102b29190613821565b610a26565b005b3480156102c557600080fd5b506102ce610e5c565b6040516102db91906138e7565b60405180910390f35b3480156102f057600080fd5b5061030b6004803603810190610306919061393f565b610eee565b604051610318919061397b565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613996565b610f73565b005b34801561035657600080fd5b5061035f61108b565b60405161036c91906139e5565b60405180910390f35b34801561038157600080fd5b5061038a611096565b60405161039791906139e5565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613b35565b6110a3565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190613bb8565b611139565b005b3480156103fe57600080fd5b5061041960048036038101906104149190613be5565b611227565b005b61043560048036038101906104309190613bb8565b611287565b005b34801561044357600080fd5b5061045e6004803603810190610459919061393f565b6113e7565b005b34801561046c57600080fd5b5061048760048036038101906104829190613996565b6114f0565b60405161049491906139e5565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613be5565b611595565b005b3480156104d257600080fd5b506104ed60048036038101906104e8919061393f565b6115b5565b6040516104fa91906139e5565b60405180910390f35b34801561050f57600080fd5b5061052a6004803603810190610525919061393f565b611626565b604051610537919061397b565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613821565b6116d8565b60405161057491906139e5565b60405180910390f35b34801561058957600080fd5b50610592611790565b60405161059f91906139e5565b60405180910390f35b3480156105b457600080fd5b506105bd611795565b005b3480156105cb57600080fd5b506105d461181d565b005b3480156105e257600080fd5b506105eb6118e2565b6040516105f8919061397b565b60405180910390f35b34801561060d57600080fd5b5061061661190c565b60405161062391906138e7565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190613c38565b61199e565b005b34801561066157600080fd5b5061066a6119b4565b60405161067791906139e5565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190613821565b6119ba565b6040516106b491906139e5565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190613d19565b611a5d565b005b3480156106f257600080fd5b5061070d60048036038101906107089190613821565b611abf565b60405161071a9190613e5a565b60405180910390f35b34801561072f57600080fd5b50610738611b6f565b60405161074591906138e7565b60405180910390f35b34801561075a57600080fd5b506107756004803603810190610770919061393f565b611c01565b60405161078291906138e7565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190613e7c565b611c3b565b6040516107bf919061374f565b60405180910390f35b3480156107d457600080fd5b506107dd611ccf565b6040516107ea919061374f565b60405180910390f35b3480156107ff57600080fd5b50610808611ce6565b604051610815919061397b565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190613821565b611cec565b6040516108529190613e5a565b60405180910390f35b34801561086757600080fd5b50610882600480360381019061087d9190613821565b611f50565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613821565b612048565b6040516108b891906139e5565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e3919061393f565b61205a565b005b3480156108f657600080fd5b50610911600480360381019061090c9190613b35565b6122ad565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610986575061098582612343565b5b9050919050565b610995612425565b73ffffffffffffffffffffffffffffffffffffffff166109b36118e2565b73ffffffffffffffffffffffffffffffffffffffff1614610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613f08565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b610a2e611ccf565b610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6490613f74565b60405180910390fd5b600161ffff167f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610acc919061397b565b602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190613fa9565b1015610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590614022565b60405180910390fd5b611ce8610c047f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610bad919061397b565b602060405180830381865afa158015610bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bee9190613fa9565b610bf6611096565b61242d90919063ffffffff16565b1115610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c9061408e565b60405180910390fd5b60007f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610ca0919061397b565b602060405180830381865afa158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce19190613fa9565b905060008190505b6000811115610e4e5760007f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff16632f745c5985610d49600161ffff168661244390919063ffffffff16565b6040518363ffffffff1660e01b8152600401610d669291906140ae565b602060405180830381865afa158015610d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da79190613fa9565b90507f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166323b872dd3361dead846040518463ffffffff1660e01b8152600401610e08939291906140d7565b600060405180830381600087803b158015610e2257600080fd5b505af1158015610e36573d6000803e3d6000fd5b50505050508080610e469061413d565b915050610ce9565b50610e5881612459565b5050565b606060008054610e6b90614196565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9790614196565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef982612496565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f9061423a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611626565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe6906142cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100e612425565b73ffffffffffffffffffffffffffffffffffffffff16148061103d575061103c81611037612425565b611c3b565b5b61107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110739061435e565b60405180910390fd5b6110868383612502565b505050565b66b1a2bc2ec5000081565b6000600880549050905090565b6110ab612425565b73ffffffffffffffffffffffffffffffffffffffff166110c96118e2565b73ffffffffffffffffffffffffffffffffffffffff161461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690613f08565b60405180910390fd5b80600b90805190602001906111359291906135f8565b5050565b611141612425565b73ffffffffffffffffffffffffffffffffffffffff1661115f6118e2565b73ffffffffffffffffffffffffffffffffffffffff16146111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90613f08565b60405180910390fd5b611ce86111d68261ffff166111c8611096565b61242d90919063ffffffff16565b1115611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e9061408e565b60405180910390fd5b6112248161ffff16612459565b50565b611238611232612425565b826125bb565b611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e906143f0565b60405180910390fd5b611282838383612699565b505050565b61128f611ccf565b6112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590613f74565b60405180910390fd5b601e8161ffff161115611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90614482565b60405180910390fd5b611ce86113378261ffff16611329611096565b61242d90919063ffffffff16565b1115611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f9061408e565b60405180910390fd5b346113978261ffff1666b1a2bc2ec500006128f590919063ffffffff16565b146113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906144ee565b60405180910390fd5b6113e48161ffff16612459565b50565b6113ef612425565b73ffffffffffffffffffffffffffffffffffffffff1661140d6118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613f08565b60405180910390fd5b478111156114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061455a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114ec573d6000803e3d6000fd5b5050565b60006114fb836116d8565b821061153c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611533906145ec565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b083838360405180602001604052806000815250611a5d565b505050565b60006115bf611096565b8210611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f79061467e565b60405180910390fd5b600882815481106116145761161361469e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c69061473f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906147d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601e81565b61179d612425565b73ffffffffffffffffffffffffffffffffffffffff166117bb6118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890613f08565b60405180910390fd5b61181b600061290b565b565b611825612425565b73ffffffffffffffffffffffffffffffffffffffff166118436118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090613f08565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156118df573d6000803e3d6000fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461191b90614196565b80601f016020809104026020016040519081016040528092919081815260200182805461194790614196565b80156119945780601f1061196957610100808354040283529160200191611994565b820191906000526020600020905b81548152906001019060200180831161197757829003601f168201915b5050505050905090565b6119b06119a9612425565b83836129d1565b5050565b611ce881565b60007f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611a15919061397b565b602060405180830381865afa158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a569190613fa9565b9050919050565b611a6e611a68612425565b836125bb565b611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa4906143f0565b60405180910390fd5b611ab984848484612b3e565b50505050565b60606000611acc836116d8565b67ffffffffffffffff811115611ae557611ae4613a0a565b5b604051908082528060200260200182016040528015611b135781602001602082028036833780820191505090505b50905060005b611b22846116d8565b811015611b6557611b3384826114f0565b828281518110611b4657611b4561469e565b5b6020026020010181815250508080611b5d906147f1565b915050611b19565b5080915050919050565b6060600c8054611b7e90614196565b80601f0160208091040260200160405190810160405280929190818152602001828054611baa90614196565b8015611bf75780601f10611bcc57610100808354040283529160200191611bf7565b820191906000526020600020905b815481529060010190602001808311611bda57829003601f168201915b5050505050905090565b6060611c0b612b9a565b611c1483612c2c565b604051602001611c2592919061490e565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600a60149054906101000a900460ff16905090565b61dead81565b606060007f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611d49919061397b565b602060405180830381865afa158015611d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8a9190613fa9565b67ffffffffffffffff811115611da357611da2613a0a565b5b604051908082528060200260200182016040528015611dd15781602001602082028036833780820191505090505b50905060005b7f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611e30919061397b565b602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190613fa9565b811015611f46577f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff16632f745c5985836040518363ffffffff1660e01b8152600401611ed39291906140ae565b602060405180830381865afa158015611ef0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f149190613fa9565b828281518110611f2757611f2661469e565b5b6020026020010181815250508080611f3e906147f1565b915050611dd7565b5080915050919050565b611f58612425565b73ffffffffffffffffffffffffffffffffffffffff16611f766118e2565b73ffffffffffffffffffffffffffffffffffffffff1614611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc390613f08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561203c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612033906149ba565b60405180910390fd5b6120458161290b565b50565b6000612053826116d8565b9050919050565b612062611ccf565b6120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890613f74565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161211191906139e5565b602060405180830381865afa15801561212e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215291906149ef565b73ffffffffffffffffffffffffffffffffffffffff16146121a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219f90614a8e565b60405180910390fd5b611ce86121ca600161ffff166121bc611096565b61242d90919063ffffffff16565b111561220b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122029061408e565b60405180910390fd5b7f0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be73ffffffffffffffffffffffffffffffffffffffff166323b872dd3361dead846040518463ffffffff1660e01b815260040161226a939291906140d7565b600060405180830381600087803b15801561228457600080fd5b505af1158015612298573d6000803e3d6000fd5b505050506122aa600161ffff16612459565b50565b6122b5612425565b73ffffffffffffffffffffffffffffffffffffffff166122d36118e2565b73ffffffffffffffffffffffffffffffffffffffff1614612329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232090613f08565b60405180910390fd5b80600c908051906020019061233f9291906135f8565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061241e575061241d82612d8d565b5b9050919050565b600033905090565b6000818361243b9190614aae565b905092915050565b600081836124519190614b04565b905092915050565b60005b818161ffff161015612492576000612472611096565b905061247e3382612df7565b50808061248a90614b38565b91505061245c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661257583611626565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125c682612496565b612605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fc90614bd5565b60405180910390fd5b600061261083611626565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061267f57508373ffffffffffffffffffffffffffffffffffffffff1661266784610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b80612690575061268f8185611c3b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126b982611626565b73ffffffffffffffffffffffffffffffffffffffff161461270f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270690614c67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277690614cf9565b60405180910390fd5b61278a838383612e15565b612795600082612502565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127e59190614b04565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283c9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836129039190614d19565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3790614dbf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b31919061374f565b60405180910390a3505050565b612b49848484612699565b612b5584848484612f29565b612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b90614e51565b60405180910390fd5b50505050565b6060600b8054612ba990614196565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd590614196565b8015612c225780601f10612bf757610100808354040283529160200191612c22565b820191906000526020600020905b815481529060010190602001808311612c0557829003601f168201915b5050505050905090565b60606000821415612c74576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d88565b600082905060005b60008214612ca6578080612c8f906147f1565b915050600a82612c9f9190614ea0565b9150612c7c565b60008167ffffffffffffffff811115612cc257612cc1613a0a565b5b6040519080825280601f01601f191660200182016040528015612cf45781602001600182028036833780820191505090505b5090505b60008514612d8157600182612d0d9190614b04565b9150600a85612d1c9190614ed1565b6030612d289190614aae565b60f81b818381518110612d3e57612d3d61469e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d7a9190614ea0565b9450612cf8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612e118282604051806020016040528060008152506130b1565b5050565b612e2083838361310c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e6357612e5e81613111565b612ea2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ea157612ea0838261315a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee557612ee0816132c7565b612f24565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f2357612f228282613398565b5b5b505050565b6000612f4a8473ffffffffffffffffffffffffffffffffffffffff16613417565b156130a4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f73612425565b8786866040518563ffffffff1660e01b8152600401612f959493929190614f57565b6020604051808303816000875af1925050508015612fd157506040513d601f19601f82011682018060405250810190612fce9190614fb8565b60015b613054573d8060008114613001576040519150601f19603f3d011682016040523d82523d6000602084013e613006565b606091505b5060008151141561304c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304390614e51565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130a9565b600190505b949350505050565b6130bb838361342a565b6130c86000848484612f29565b613107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fe90614e51565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613167846116d8565b6131719190614b04565b9050600060076000848152602001908152602001600020549050818114613256576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132db9190614b04565b905060006009600084815260200190815260200160002054905060006008838154811061330b5761330a61469e565b5b90600052602060002001549050806008838154811061332d5761332c61469e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061337c5761337b614fe5565b5b6001900381819060005260206000200160009055905550505050565b60006133a3836116d8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561349a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349190615060565b60405180910390fd5b6134a381612496565b156134e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134da906150cc565b60405180910390fd5b6134ef60008383612e15565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461353f9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461360490614196565b90600052602060002090601f016020900481019282613626576000855561366d565b82601f1061363f57805160ff191683800117855561366d565b8280016001018555821561366d579182015b8281111561366c578251825591602001919060010190613651565b5b50905061367a919061367e565b5090565b5b8082111561369757600081600090555060010161367f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136e4816136af565b81146136ef57600080fd5b50565b600081359050613701816136db565b92915050565b60006020828403121561371d5761371c6136a5565b5b600061372b848285016136f2565b91505092915050565b60008115159050919050565b61374981613734565b82525050565b60006020820190506137646000830184613740565b92915050565b61377381613734565b811461377e57600080fd5b50565b6000813590506137908161376a565b92915050565b6000602082840312156137ac576137ab6136a5565b5b60006137ba84828501613781565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137ee826137c3565b9050919050565b6137fe816137e3565b811461380957600080fd5b50565b60008135905061381b816137f5565b92915050565b600060208284031215613837576138366136a5565b5b60006138458482850161380c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561388857808201518184015260208101905061386d565b83811115613897576000848401525b50505050565b6000601f19601f8301169050919050565b60006138b98261384e565b6138c38185613859565b93506138d381856020860161386a565b6138dc8161389d565b840191505092915050565b6000602082019050818103600083015261390181846138ae565b905092915050565b6000819050919050565b61391c81613909565b811461392757600080fd5b50565b60008135905061393981613913565b92915050565b600060208284031215613955576139546136a5565b5b60006139638482850161392a565b91505092915050565b613975816137e3565b82525050565b6000602082019050613990600083018461396c565b92915050565b600080604083850312156139ad576139ac6136a5565b5b60006139bb8582860161380c565b92505060206139cc8582860161392a565b9150509250929050565b6139df81613909565b82525050565b60006020820190506139fa60008301846139d6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a428261389d565b810181811067ffffffffffffffff82111715613a6157613a60613a0a565b5b80604052505050565b6000613a7461369b565b9050613a808282613a39565b919050565b600067ffffffffffffffff821115613aa057613a9f613a0a565b5b613aa98261389d565b9050602081019050919050565b82818337600083830152505050565b6000613ad8613ad384613a85565b613a6a565b905082815260208101848484011115613af457613af3613a05565b5b613aff848285613ab6565b509392505050565b600082601f830112613b1c57613b1b613a00565b5b8135613b2c848260208601613ac5565b91505092915050565b600060208284031215613b4b57613b4a6136a5565b5b600082013567ffffffffffffffff811115613b6957613b686136aa565b5b613b7584828501613b07565b91505092915050565b600061ffff82169050919050565b613b9581613b7e565b8114613ba057600080fd5b50565b600081359050613bb281613b8c565b92915050565b600060208284031215613bce57613bcd6136a5565b5b6000613bdc84828501613ba3565b91505092915050565b600080600060608486031215613bfe57613bfd6136a5565b5b6000613c0c8682870161380c565b9350506020613c1d8682870161380c565b9250506040613c2e8682870161392a565b9150509250925092565b60008060408385031215613c4f57613c4e6136a5565b5b6000613c5d8582860161380c565b9250506020613c6e85828601613781565b9150509250929050565b600067ffffffffffffffff821115613c9357613c92613a0a565b5b613c9c8261389d565b9050602081019050919050565b6000613cbc613cb784613c78565b613a6a565b905082815260208101848484011115613cd857613cd7613a05565b5b613ce3848285613ab6565b509392505050565b600082601f830112613d0057613cff613a00565b5b8135613d10848260208601613ca9565b91505092915050565b60008060008060808587031215613d3357613d326136a5565b5b6000613d418782880161380c565b9450506020613d528782880161380c565b9350506040613d638782880161392a565b925050606085013567ffffffffffffffff811115613d8457613d836136aa565b5b613d9087828801613ceb565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dd181613909565b82525050565b6000613de38383613dc8565b60208301905092915050565b6000602082019050919050565b6000613e0782613d9c565b613e118185613da7565b9350613e1c83613db8565b8060005b83811015613e4d578151613e348882613dd7565b9750613e3f83613def565b925050600181019050613e20565b5085935050505092915050565b60006020820190508181036000830152613e748184613dfc565b905092915050565b60008060408385031215613e9357613e926136a5565b5b6000613ea18582860161380c565b9250506020613eb28582860161380c565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ef2602083613859565b9150613efd82613ebc565b602082019050919050565b60006020820190508181036000830152613f2181613ee5565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613f5e601283613859565b9150613f6982613f28565b602082019050919050565b60006020820190508181036000830152613f8d81613f51565b9050919050565b600081519050613fa381613913565b92915050565b600060208284031215613fbf57613fbe6136a5565b5b6000613fcd84828501613f94565b91505092915050565b7f4d757374206f776e206174206c65617374206f6e652072756700000000000000600082015250565b600061400c601983613859565b915061401782613fd6565b602082019050919050565b6000602082019050818103600083015261403b81613fff565b9050919050565b7f496e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b6000614078601383613859565b915061408382614042565b602082019050919050565b600060208201905081810360008301526140a78161406b565b9050919050565b60006040820190506140c3600083018561396c565b6140d060208301846139d6565b9392505050565b60006060820190506140ec600083018661396c565b6140f9602083018561396c565b61410660408301846139d6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061414882613909565b9150600082141561415c5761415b61410e565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141ae57607f821691505b602082108114156141c2576141c1614167565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614224602c83613859565b915061422f826141c8565b604082019050919050565b6000602082019050818103600083015261425381614217565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142b6602183613859565b91506142c18261425a565b604082019050919050565b600060208201905081810360008301526142e5816142a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614348603883613859565b9150614353826142ec565b604082019050919050565b600060208201905081810360008301526143778161433b565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006143da603183613859565b91506143e58261437e565b604082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f43616e206f6e6c79206d696e7420333020746f6b656e7320706572207472616e60008201527f73616374696f6e00000000000000000000000000000000000000000000000000602082015250565b600061446c602783613859565b915061447782614410565b604082019050919050565b6000602082019050818103600083015261449b8161445f565b9050919050565b7f45746865722076616c75652073656e7420697320696e636f7272656374000000600082015250565b60006144d8601d83613859565b91506144e3826144a2565b602082019050919050565b60006020820190508181036000830152614507816144cb565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000614544601483613859565b915061454f8261450e565b602082019050919050565b6000602082019050818103600083015261457381614537565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006145d6602b83613859565b91506145e18261457a565b604082019050919050565b60006020820190508181036000830152614605816145c9565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614668602c83613859565b91506146738261460c565b604082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614729602983613859565b9150614734826146cd565b604082019050919050565b600060208201905081810360008301526147588161471c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006147bb602a83613859565b91506147c68261475f565b604082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b60006147fc82613909565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561482f5761482e61410e565b5b600182019050919050565b600081905092915050565b60006148508261384e565b61485a818561483a565b935061486a81856020860161386a565b80840191505092915050565b7f746f6b656e732f00000000000000000000000000000000000000000000000000600082015250565b60006148ac60078361483a565b91506148b782614876565b600782019050919050565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b60006148f8600e8361483a565b9150614903826148c2565b600e82019050919050565b600061491a8285614845565b91506149258261489f565b91506149318284614845565b915061493c826148eb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149a4602683613859565b91506149af82614948565b604082019050919050565b600060208201905081810360008301526149d381614997565b9050919050565b6000815190506149e9816137f5565b92915050565b600060208284031215614a0557614a046136a5565b5b6000614a13848285016149da565b91505092915050565b7f4d757374206f776e207468652072756720796f7527726520617474656d70746960008201527f6e6720746f206275726e00000000000000000000000000000000000000000000602082015250565b6000614a78602a83613859565b9150614a8382614a1c565b604082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b6000614ab982613909565b9150614ac483613909565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614af957614af861410e565b5b828201905092915050565b6000614b0f82613909565b9150614b1a83613909565b925082821015614b2d57614b2c61410e565b5b828203905092915050565b6000614b4382613b7e565b915061ffff821415614b5857614b5761410e565b5b600182019050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bbf602c83613859565b9150614bca82614b63565b604082019050919050565b60006020820190508181036000830152614bee81614bb2565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614c51602983613859565b9150614c5c82614bf5565b604082019050919050565b60006020820190508181036000830152614c8081614c44565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ce3602483613859565b9150614cee82614c87565b604082019050919050565b60006020820190508181036000830152614d1281614cd6565b9050919050565b6000614d2482613909565b9150614d2f83613909565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d6857614d6761410e565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614da9601983613859565b9150614db482614d73565b602082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e3b603283613859565b9150614e4682614ddf565b604082019050919050565b60006020820190508181036000830152614e6a81614e2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614eab82613909565b9150614eb683613909565b925082614ec657614ec5614e71565b5b828204905092915050565b6000614edc82613909565b9150614ee783613909565b925082614ef757614ef6614e71565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f2982614f02565b614f338185614f0d565b9350614f4381856020860161386a565b614f4c8161389d565b840191505092915050565b6000608082019050614f6c600083018761396c565b614f79602083018661396c565b614f8660408301856139d6565b8181036060830152614f988184614f1e565b905095945050505050565b600081519050614fb2816136db565b92915050565b600060208284031215614fce57614fcd6136a5565b5b6000614fdc84828501614fa3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061504a602083613859565b915061505582615014565b602082019050919050565b600060208201905081810360008301526150798161503d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150b6601c83613859565b91506150c182615080565b602082019050919050565b600060208201905081810360008301526150e5816150a9565b905091905056fea2646970667358221220e23c23f1b67d81b73608d6d16b95e4e2409f8b80358b6b2a20855ec0e8bffa0564736f6c634300080b0033

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

0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be

-----Decoded View---------------
Arg [0] : cryptorugsAddress (address): 0x7685d54dB7b41dd751AD1e1b62a62f92D3cE09BE

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007685d54db7b41dd751ad1e1b62a62f92d3ce09be


Deployed Bytecode Sourcemap

62364:5097:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48052:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65062:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64132:620;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35546:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37105:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36628:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62709:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48692:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65283:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64861:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37855:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63268:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65398:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48360:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38265:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48882:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35240:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34970:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62532:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14516:103;;;;;;;;;;;;;:::i;:::-;;65589:112;;;;;;;;;;;;;:::i;:::-;;13865:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35715:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37398:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62486:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66504:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38521:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66641:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65833:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65940:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37624:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65735:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62622:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66148:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14774:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66962:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63712:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65168:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48052:224;48154:4;48193:35;48178:50;;;:11;:50;;;;:90;;;;48232:36;48256:11;48232:23;:36::i;:::-;48178:90;48171:97;;48052:224;;;:::o;65062:98::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65146:6:::1;65130:13;;:22;;;;;;;;;;;;;;;;;;65062:98:::0;:::o;64132:620::-;64206:14;:12;:14::i;:::-;64198:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;62614:1;64262:38;;:10;:20;;;64283:5;64262:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;64254:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;62521:4;64349:46;64367:10;:20;;;64388:5;64367:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64349:13;:11;:13::i;:::-;:17;;:46;;;;:::i;:::-;:58;;64341:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;64442:18;64464:10;:20;;;64485:5;64464:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64442:50;;64508:9;64520:10;64508:22;;64503:206;64536:1;64532;:5;64503:206;;;64558:13;64574:10;:30;;;64605:5;64612:14;62614:1;64612:14;;:1;:5;;:14;;;;:::i;:::-;64574:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64558:69;;64642:10;:23;;;64666:10;62660:42;64691:5;64642:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64543:166;64539:3;;;;;:::i;:::-;;;;64503:206;;;;64719:23;64731:10;64719:11;:23::i;:::-;64187:565;64132:620;:::o;35546:100::-;35600:13;35633:5;35626:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35546:100;:::o;37105:221::-;37181:7;37209:16;37217:7;37209;:16::i;:::-;37201:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37294:15;:24;37310:7;37294:24;;;;;;;;;;;;;;;;;;;;;37287:31;;37105:221;;;:::o;36628:411::-;36709:13;36725:23;36740:7;36725:14;:23::i;:::-;36709:39;;36773:5;36767:11;;:2;:11;;;;36759:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36867:5;36851:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36876:37;36893:5;36900:12;:10;:12::i;:::-;36876:16;:37::i;:::-;36851:62;36829:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;37010:21;37019:2;37023:7;37010:8;:21::i;:::-;36698:341;36628:411;;:::o;62709:61::-;62749:21;62709:61;:::o;48692:113::-;48753:7;48780:10;:17;;;;48773:24;;48692:113;:::o;65283:107::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65375:7:::1;65360:12;:22;;;;;;;;;;;;:::i;:::-;;65283:107:::0;:::o;64861:193::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62521:4:::1;64939:33;64957:14;64939:33;;:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:45;;64931:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;65019:27;65031:14;65019:27;;:11;:27::i;:::-;64861:193:::0;:::o;37855:339::-;38050:41;38069:12;:10;:12::i;:::-;38083:7;38050:18;:41::i;:::-;38042:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38158:28;38168:4;38174:2;38178:7;38158:9;:28::i;:::-;37855:339;;;:::o;63268:436::-;63339:14;:12;:14::i;:::-;63331:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;62571:2;63395:14;:30;;;;63387:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;62521:4;63488:33;63506:14;63488:33;;:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:45;;63480:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63613:9;63576:33;63594:14;63576:33;;62749:21;63576:17;;:33;;;;:::i;:::-;:46;63568:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;63669:27;63681:14;63669:27;;:11;:27::i;:::-;63268:436;:::o;65398:183::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65480:21:::1;65470:6;:31;;65462:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;65545:10;65537:28;;:36;65566:6;65537:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65398:183:::0;:::o;48360:256::-;48457:7;48493:23;48510:5;48493:16;:23::i;:::-;48485:5;:31;48477:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48582:12;:19;48595:5;48582:19;;;;;;;;;;;;;;;:26;48602:5;48582:26;;;;;;;;;;;;48575:33;;48360:256;;;;:::o;38265:185::-;38403:39;38420:4;38426:2;38430:7;38403:39;;;;;;;;;;;;:16;:39::i;:::-;38265:185;;;:::o;48882:233::-;48957:7;48993:30;:28;:30::i;:::-;48985:5;:38;48977:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49090:10;49101:5;49090:17;;;;;;;;:::i;:::-;;;;;;;;;;49083:24;;48882:233;;;:::o;35240:239::-;35312:7;35332:13;35348:7;:16;35356:7;35348:16;;;;;;;;;;;;;;;;;;;;;35332:32;;35400:1;35383:19;;:5;:19;;;;35375:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35466:5;35459:12;;;35240:239;;;:::o;34970:208::-;35042:7;35087:1;35070:19;;:5;:19;;;;35062:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35154:9;:16;35164:5;35154:16;;;;;;;;;;;;;;;;35147:23;;34970:208;;;:::o;62532:41::-;62571:2;62532:41;:::o;14516:103::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14581:30:::1;14608:1;14581:18;:30::i;:::-;14516:103::o:0;65589:112::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65650:10:::1;65642:28;;:51;65671:21;65642:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65589:112::o:0;13865:87::-;13911:7;13938:6;;;;;;;;;;;13931:13;;13865:87;:::o;35715:104::-;35771:13;35804:7;35797:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35715:104;:::o;37398:155::-;37493:52;37512:12;:10;:12::i;:::-;37526:8;37536;37493:18;:52::i;:::-;37398:155;;:::o;62486:39::-;62521:4;62486:39;:::o;66504:128::-;66566:7;66593:10;:20;;;66614:5;66593:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66586:34;;66504:128;;;:::o;38521:328::-;38696:41;38715:12;:10;:12::i;:::-;38729:7;38696:18;:41::i;:::-;38688:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38802:39;38816:4;38822:2;38826:7;38835:5;38802:13;:39::i;:::-;38521:328;;;;:::o;66641:313::-;66700:16;66739:24;66781:16;66791:5;66781:9;:16::i;:::-;66766:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66739:59;;66814:9;66809:113;66831:16;66841:5;66831:9;:16::i;:::-;66827:1;:20;66809:113;;;66881:29;66901:5;66908:1;66881:19;:29::i;:::-;66868:7;66876:1;66868:10;;;;;;;;:::i;:::-;;;;;;;:42;;;;;66849:3;;;;;:::i;:::-;;;;66809:113;;;;66939:7;66932:14;;;66641:313;;;:::o;65833:99::-;65880:13;65913:11;65906:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65833:99;:::o;65940:200::-;66005:13;66062:10;:8;:10::i;:::-;66085:27;66093:7;66085:25;:27::i;:::-;66045:86;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66031:101;;65940:200;;;:::o;37624:164::-;37721:4;37745:18;:25;37764:5;37745:25;;;;;;;;;;;;;;;:35;37771:8;37745:35;;;;;;;;;;;;;;;;;;;;;;;;;37738:42;;37624:164;;;;:::o;65735:90::-;65780:4;65804:13;;;;;;;;;;;65797:20;;65735:90;:::o;62622:80::-;62660:42;62622:80;:::o;66148:348::-;66209:16;66248:24;66290:10;:20;;;66311:5;66290:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66275:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66248:70;;66334:9;66329:135;66351:10;:20;;;66372:5;66351:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66347:1;:31;66329:135;;;66412:10;:30;;;66443:5;66450:1;66412:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66399:7;66407:1;66399:10;;;;;;;;:::i;:::-;;;;;;;:53;;;;;66380:3;;;;;:::i;:::-;;;;66329:135;;;;66481:7;66474:14;;;66148:348;;;:::o;14774:201::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14883:1:::1;14863:22;;:8;:22;;;;14855:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14939:28;14958:8;14939:18;:28::i;:::-;14774:201:::0;:::o;66962:115::-;67022:7;67049:16;67059:5;67049:9;:16::i;:::-;67042:23;;66962:115;;;:::o;63712:408::-;63787:14;:12;:14::i;:::-;63779:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;63874:10;63843:41;;:10;:18;;;63862:7;63843:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;63835:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;62521:4;63950:26;62614:1;63950:26;;:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:38;;63942:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;64023:10;:23;;;64047:10;62660:42;64071:7;64023:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64090:20;62614:1;64090:20;;:11;:20::i;:::-;63712:408;:::o;65168:107::-;14096:12;:10;:12::i;:::-;14085:23;;:7;:5;:7::i;:::-;:23;;;14077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65259:8:::1;65245:11;:22;;;;;;;;;;;;:::i;:::-;;65168:107:::0;:::o;34601:305::-;34703:4;34755:25;34740:40;;;:11;:40;;;;:105;;;;34812:33;34797:48;;;:11;:48;;;;34740:105;:158;;;;34862:36;34886:11;34862:23;:36::i;:::-;34740:158;34720:178;;34601:305;;;:::o;12589:98::-;12642:7;12669:10;12662:17;;12589:98;:::o;5621:::-;5679:7;5710:1;5706;:5;;;;:::i;:::-;5699:12;;5621:98;;;;:::o;6002:::-;6060:7;6091:1;6087;:5;;;;:::i;:::-;6080:12;;6002:98;;;;:::o;67122:219::-;67192:8;67187:147;67210:14;67206:1;:18;;;67187:147;;;67246:15;67264:13;:11;:13::i;:::-;67246:31;;67292:30;67302:10;67314:7;67292:9;:30::i;:::-;67231:103;67226:3;;;;;:::i;:::-;;;;67187:147;;;;67122:219;:::o;40359:127::-;40424:4;40476:1;40448:30;;:7;:16;40456:7;40448:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40441:37;;40359:127;;;:::o;44341:174::-;44443:2;44416:15;:24;44432:7;44416:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44499:7;44495:2;44461:46;;44470:23;44485:7;44470:14;:23::i;:::-;44461:46;;;;;;;;;;;;44341:174;;:::o;40653:348::-;40746:4;40771:16;40779:7;40771;:16::i;:::-;40763:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40847:13;40863:23;40878:7;40863:14;:23::i;:::-;40847:39;;40916:5;40905:16;;:7;:16;;;:51;;;;40949:7;40925:31;;:20;40937:7;40925:11;:20::i;:::-;:31;;;40905:51;:87;;;;40960:32;40977:5;40984:7;40960:16;:32::i;:::-;40905:87;40897:96;;;40653:348;;;;:::o;43645:578::-;43804:4;43777:31;;:23;43792:7;43777:14;:23::i;:::-;:31;;;43769:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43887:1;43873:16;;:2;:16;;;;43865:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43943:39;43964:4;43970:2;43974:7;43943:20;:39::i;:::-;44047:29;44064:1;44068:7;44047:8;:29::i;:::-;44108:1;44089:9;:15;44099:4;44089:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44137:1;44120:9;:13;44130:2;44120:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44168:2;44149:7;:16;44157:7;44149:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44207:7;44203:2;44188:27;;44197:4;44188:27;;;;;;;;;;;;43645:578;;;:::o;6359:98::-;6417:7;6448:1;6444;:5;;;;:::i;:::-;6437:12;;6359:98;;;;:::o;15135:191::-;15209:16;15228:6;;;;;;;;;;;15209:25;;15254:8;15245:6;;:17;;;;;;;;;;;;;;;;;;15309:8;15278:40;;15299:8;15278:40;;;;;;;;;;;;15198:128;15135:191;:::o;44657:315::-;44812:8;44803:17;;:5;:17;;;;44795:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44899:8;44861:18;:25;44880:5;44861:25;;;;;;;;;;;;;;;:35;44887:8;44861:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44945:8;44923:41;;44938:5;44923:41;;;44955:8;44923:41;;;;;;:::i;:::-;;;;;;;;44657:315;;;:::o;39731:::-;39888:28;39898:4;39904:2;39908:7;39888:9;:28::i;:::-;39935:48;39958:4;39964:2;39968:7;39977:5;39935:22;:48::i;:::-;39927:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39731:315;;;;:::o;67351:105::-;67403:13;67436:12;67429:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67351:105;:::o;10151:723::-;10207:13;10437:1;10428:5;:10;10424:53;;;10455:10;;;;;;;;;;;;;;;;;;;;;10424:53;10487:12;10502:5;10487:20;;10518:14;10543:78;10558:1;10550:4;:9;10543:78;;10576:8;;;;;:::i;:::-;;;;10607:2;10599:10;;;;;:::i;:::-;;;10543:78;;;10631:19;10663:6;10653:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10631:39;;10681:154;10697:1;10688:5;:10;10681:154;;10725:1;10715:11;;;;;:::i;:::-;;;10792:2;10784:5;:10;;;;:::i;:::-;10771:2;:24;;;;:::i;:::-;10758:39;;10741:6;10748;10741:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;10821:2;10812:11;;;;;:::i;:::-;;;10681:154;;;10859:6;10845:21;;;;;10151:723;;;;:::o;26297:157::-;26382:4;26421:25;26406:40;;;:11;:40;;;;26399:47;;26297:157;;;:::o;41343:110::-;41419:26;41429:2;41433:7;41419:26;;;;;;;;;;;;:9;:26::i;:::-;41343:110;;:::o;49728:589::-;49872:45;49899:4;49905:2;49909:7;49872:26;:45::i;:::-;49950:1;49934:18;;:4;:18;;;49930:187;;;49969:40;50001:7;49969:31;:40::i;:::-;49930:187;;;50039:2;50031:10;;:4;:10;;;50027:90;;50058:47;50091:4;50097:7;50058:32;:47::i;:::-;50027:90;49930:187;50145:1;50131:16;;:2;:16;;;50127:183;;;50164:45;50201:7;50164:36;:45::i;:::-;50127:183;;;50237:4;50231:10;;:2;:10;;;50227:83;;50258:40;50286:2;50290:7;50258:27;:40::i;:::-;50227:83;50127:183;49728:589;;;:::o;45537:799::-;45692:4;45713:15;:2;:13;;;:15::i;:::-;45709:620;;;45765:2;45749:36;;;45786:12;:10;:12::i;:::-;45800:4;45806:7;45815:5;45749:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45745:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46008:1;45991:6;:13;:18;45987:272;;;46034:60;;;;;;;;;;:::i;:::-;;;;;;;;45987:272;46209:6;46203:13;46194:6;46190:2;46186:15;46179:38;45745:529;45882:41;;;45872:51;;;:6;:51;;;;45865:58;;;;;45709:620;46313:4;46306:11;;45537:799;;;;;;;:::o;41680:321::-;41810:18;41816:2;41820:7;41810:5;:18::i;:::-;41861:54;41892:1;41896:2;41900:7;41909:5;41861:22;:54::i;:::-;41839:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41680:321;;;:::o;46908:126::-;;;;:::o;51040:164::-;51144:10;:17;;;;51117:15;:24;51133:7;51117:24;;;;;;;;;;;:44;;;;51172:10;51188:7;51172:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51040:164;:::o;51831:988::-;52097:22;52147:1;52122:22;52139:4;52122:16;:22::i;:::-;:26;;;;:::i;:::-;52097:51;;52159:18;52180:17;:26;52198:7;52180:26;;;;;;;;;;;;52159:47;;52327:14;52313:10;:28;52309:328;;52358:19;52380:12;:18;52393:4;52380:18;;;;;;;;;;;;;;;:34;52399:14;52380:34;;;;;;;;;;;;52358:56;;52464:11;52431:12;:18;52444:4;52431:18;;;;;;;;;;;;;;;:30;52450:10;52431:30;;;;;;;;;;;:44;;;;52581:10;52548:17;:30;52566:11;52548:30;;;;;;;;;;;:43;;;;52343:294;52309:328;52733:17;:26;52751:7;52733:26;;;;;;;;;;;52726:33;;;52777:12;:18;52790:4;52777:18;;;;;;;;;;;;;;;:34;52796:14;52777:34;;;;;;;;;;;52770:41;;;51912:907;;51831:988;;:::o;53114:1079::-;53367:22;53412:1;53392:10;:17;;;;:21;;;;:::i;:::-;53367:46;;53424:18;53445:15;:24;53461:7;53445:24;;;;;;;;;;;;53424:45;;53796:19;53818:10;53829:14;53818:26;;;;;;;;:::i;:::-;;;;;;;;;;53796:48;;53882:11;53857:10;53868;53857:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53993:10;53962:15;:28;53978:11;53962:28;;;;;;;;;;;:41;;;;54134:15;:24;54150:7;54134:24;;;;;;;;;;;54127:31;;;54169:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53185:1008;;;53114:1079;:::o;50618:221::-;50703:14;50720:20;50737:2;50720:16;:20::i;:::-;50703:37;;50778:7;50751:12;:16;50764:2;50751:16;;;;;;;;;;;;;;;:24;50768:6;50751:24;;;;;;;;;;;:34;;;;50825:6;50796:17;:26;50814:7;50796:26;;;;;;;;;;;:35;;;;50692:147;50618:221;;:::o;16153:387::-;16213:4;16421:12;16488:7;16476:20;16468:28;;16531:1;16524:4;:8;16517:15;;;16153:387;;;:::o;42337:382::-;42431:1;42417:16;;:2;:16;;;;42409:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42490:16;42498:7;42490;:16::i;:::-;42489:17;42481:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42552:45;42581:1;42585:2;42589:7;42552:20;:45::i;:::-;42627:1;42610:9;:13;42620:2;42610:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42658:2;42639:7;:16;42647:7;42639:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42703:7;42699:2;42678:33;;42695:1;42678:33;;;;;;;;;;;;42337:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:126::-;2145:7;2185:42;2178:5;2174:54;2163:65;;2108:126;;;:::o;2240:96::-;2277:7;2306:24;2324:5;2306:24;:::i;:::-;2295:35;;2240:96;;;:::o;2342:122::-;2415:24;2433:5;2415:24;:::i;:::-;2408:5;2405:35;2395:63;;2454:1;2451;2444:12;2395:63;2342:122;:::o;2470:139::-;2516:5;2554:6;2541:20;2532:29;;2570:33;2597:5;2570:33;:::i;:::-;2470:139;;;;:::o;2615:329::-;2674:6;2723:2;2711:9;2702:7;2698:23;2694:32;2691:119;;;2729:79;;:::i;:::-;2691:119;2849:1;2874:53;2919:7;2910:6;2899:9;2895:22;2874:53;:::i;:::-;2864:63;;2820:117;2615:329;;;;:::o;2950:99::-;3002:6;3036:5;3030:12;3020:22;;2950:99;;;:::o;3055:169::-;3139:11;3173:6;3168:3;3161:19;3213:4;3208:3;3204:14;3189:29;;3055:169;;;;:::o;3230:307::-;3298:1;3308:113;3322:6;3319:1;3316:13;3308:113;;;3407:1;3402:3;3398:11;3392:18;3388:1;3383:3;3379:11;3372:39;3344:2;3341:1;3337:10;3332:15;;3308:113;;;3439:6;3436:1;3433:13;3430:101;;;3519:1;3510:6;3505:3;3501:16;3494:27;3430:101;3279:258;3230:307;;;:::o;3543:102::-;3584:6;3635:2;3631:7;3626:2;3619:5;3615:14;3611:28;3601:38;;3543:102;;;:::o;3651:364::-;3739:3;3767:39;3800:5;3767:39;:::i;:::-;3822:71;3886:6;3881:3;3822:71;:::i;:::-;3815:78;;3902:52;3947:6;3942:3;3935:4;3928:5;3924:16;3902:52;:::i;:::-;3979:29;4001:6;3979:29;:::i;:::-;3974:3;3970:39;3963:46;;3743:272;3651:364;;;;:::o;4021:313::-;4134:4;4172:2;4161:9;4157:18;4149:26;;4221:9;4215:4;4211:20;4207:1;4196:9;4192:17;4185:47;4249:78;4322:4;4313:6;4249:78;:::i;:::-;4241:86;;4021:313;;;;:::o;4340:77::-;4377:7;4406:5;4395:16;;4340:77;;;:::o;4423:122::-;4496:24;4514:5;4496:24;:::i;:::-;4489:5;4486:35;4476:63;;4535:1;4532;4525:12;4476:63;4423:122;:::o;4551:139::-;4597:5;4635:6;4622:20;4613:29;;4651:33;4678:5;4651:33;:::i;:::-;4551:139;;;;:::o;4696:329::-;4755:6;4804:2;4792:9;4783:7;4779:23;4775:32;4772:119;;;4810:79;;:::i;:::-;4772:119;4930:1;4955:53;5000:7;4991:6;4980:9;4976:22;4955:53;:::i;:::-;4945:63;;4901:117;4696:329;;;;:::o;5031:118::-;5118:24;5136:5;5118:24;:::i;:::-;5113:3;5106:37;5031:118;;:::o;5155:222::-;5248:4;5286:2;5275:9;5271:18;5263:26;;5299:71;5367:1;5356:9;5352:17;5343:6;5299:71;:::i;:::-;5155:222;;;;:::o;5383:474::-;5451:6;5459;5508:2;5496:9;5487:7;5483:23;5479:32;5476:119;;;5514:79;;:::i;:::-;5476:119;5634:1;5659:53;5704:7;5695:6;5684:9;5680:22;5659:53;:::i;:::-;5649:63;;5605:117;5761:2;5787:53;5832:7;5823:6;5812:9;5808:22;5787:53;:::i;:::-;5777:63;;5732:118;5383:474;;;;;:::o;5863:118::-;5950:24;5968:5;5950:24;:::i;:::-;5945:3;5938:37;5863:118;;:::o;5987:222::-;6080:4;6118:2;6107:9;6103:18;6095:26;;6131:71;6199:1;6188:9;6184:17;6175:6;6131:71;:::i;:::-;5987:222;;;;:::o;6215:117::-;6324:1;6321;6314:12;6338:117;6447:1;6444;6437:12;6461:180;6509:77;6506:1;6499:88;6606:4;6603:1;6596:15;6630:4;6627:1;6620:15;6647:281;6730:27;6752:4;6730:27;:::i;:::-;6722:6;6718:40;6860:6;6848:10;6845:22;6824:18;6812:10;6809:34;6806:62;6803:88;;;6871:18;;:::i;:::-;6803:88;6911:10;6907:2;6900:22;6690:238;6647:281;;:::o;6934:129::-;6968:6;6995:20;;:::i;:::-;6985:30;;7024:33;7052:4;7044:6;7024:33;:::i;:::-;6934:129;;;:::o;7069:308::-;7131:4;7221:18;7213:6;7210:30;7207:56;;;7243:18;;:::i;:::-;7207:56;7281:29;7303:6;7281:29;:::i;:::-;7273:37;;7365:4;7359;7355:15;7347:23;;7069:308;;;:::o;7383:154::-;7467:6;7462:3;7457;7444:30;7529:1;7520:6;7515:3;7511:16;7504:27;7383:154;;;:::o;7543:412::-;7621:5;7646:66;7662:49;7704:6;7662:49;:::i;:::-;7646:66;:::i;:::-;7637:75;;7735:6;7728:5;7721:21;7773:4;7766:5;7762:16;7811:3;7802:6;7797:3;7793:16;7790:25;7787:112;;;7818:79;;:::i;:::-;7787:112;7908:41;7942:6;7937:3;7932;7908:41;:::i;:::-;7627:328;7543:412;;;;;:::o;7975:340::-;8031:5;8080:3;8073:4;8065:6;8061:17;8057:27;8047:122;;8088:79;;:::i;:::-;8047:122;8205:6;8192:20;8230:79;8305:3;8297:6;8290:4;8282:6;8278:17;8230:79;:::i;:::-;8221:88;;8037:278;7975:340;;;;:::o;8321:509::-;8390:6;8439:2;8427:9;8418:7;8414:23;8410:32;8407:119;;;8445:79;;:::i;:::-;8407:119;8593:1;8582:9;8578:17;8565:31;8623:18;8615:6;8612:30;8609:117;;;8645:79;;:::i;:::-;8609:117;8750:63;8805:7;8796:6;8785:9;8781:22;8750:63;:::i;:::-;8740:73;;8536:287;8321:509;;;;:::o;8836:89::-;8872:7;8912:6;8905:5;8901:18;8890:29;;8836:89;;;:::o;8931:120::-;9003:23;9020:5;9003:23;:::i;:::-;8996:5;8993:34;8983:62;;9041:1;9038;9031:12;8983:62;8931:120;:::o;9057:137::-;9102:5;9140:6;9127:20;9118:29;;9156:32;9182:5;9156:32;:::i;:::-;9057:137;;;;:::o;9200:327::-;9258:6;9307:2;9295:9;9286:7;9282:23;9278:32;9275:119;;;9313:79;;:::i;:::-;9275:119;9433:1;9458:52;9502:7;9493:6;9482:9;9478:22;9458:52;:::i;:::-;9448:62;;9404:116;9200:327;;;;:::o;9533:619::-;9610:6;9618;9626;9675:2;9663:9;9654:7;9650:23;9646:32;9643:119;;;9681:79;;:::i;:::-;9643:119;9801:1;9826:53;9871:7;9862:6;9851:9;9847:22;9826:53;:::i;:::-;9816:63;;9772:117;9928:2;9954:53;9999:7;9990:6;9979:9;9975:22;9954:53;:::i;:::-;9944:63;;9899:118;10056:2;10082:53;10127:7;10118:6;10107:9;10103:22;10082:53;:::i;:::-;10072:63;;10027:118;9533:619;;;;;:::o;10158:468::-;10223:6;10231;10280:2;10268:9;10259:7;10255:23;10251:32;10248:119;;;10286:79;;:::i;:::-;10248:119;10406:1;10431:53;10476:7;10467:6;10456:9;10452:22;10431:53;:::i;:::-;10421:63;;10377:117;10533:2;10559:50;10601:7;10592:6;10581:9;10577:22;10559:50;:::i;:::-;10549:60;;10504:115;10158:468;;;;;:::o;10632:307::-;10693:4;10783:18;10775:6;10772:30;10769:56;;;10805:18;;:::i;:::-;10769:56;10843:29;10865:6;10843:29;:::i;:::-;10835:37;;10927:4;10921;10917:15;10909:23;;10632:307;;;:::o;10945:410::-;11022:5;11047:65;11063:48;11104:6;11063:48;:::i;:::-;11047:65;:::i;:::-;11038:74;;11135:6;11128:5;11121:21;11173:4;11166:5;11162:16;11211:3;11202:6;11197:3;11193:16;11190:25;11187:112;;;11218:79;;:::i;:::-;11187:112;11308:41;11342:6;11337:3;11332;11308:41;:::i;:::-;11028:327;10945:410;;;;;:::o;11374:338::-;11429:5;11478:3;11471:4;11463:6;11459:17;11455:27;11445:122;;11486:79;;:::i;:::-;11445:122;11603:6;11590:20;11628:78;11702:3;11694:6;11687:4;11679:6;11675:17;11628:78;:::i;:::-;11619:87;;11435:277;11374:338;;;;:::o;11718:943::-;11813:6;11821;11829;11837;11886:3;11874:9;11865:7;11861:23;11857:33;11854:120;;;11893:79;;:::i;:::-;11854:120;12013:1;12038:53;12083:7;12074:6;12063:9;12059:22;12038:53;:::i;:::-;12028:63;;11984:117;12140:2;12166:53;12211:7;12202:6;12191:9;12187:22;12166:53;:::i;:::-;12156:63;;12111:118;12268:2;12294:53;12339:7;12330:6;12319:9;12315:22;12294:53;:::i;:::-;12284:63;;12239:118;12424:2;12413:9;12409:18;12396:32;12455:18;12447:6;12444:30;12441:117;;;12477:79;;:::i;:::-;12441:117;12582:62;12636:7;12627:6;12616:9;12612:22;12582:62;:::i;:::-;12572:72;;12367:287;11718:943;;;;;;;:::o;12667:114::-;12734:6;12768:5;12762:12;12752:22;;12667:114;;;:::o;12787:184::-;12886:11;12920:6;12915:3;12908:19;12960:4;12955:3;12951:14;12936:29;;12787:184;;;;:::o;12977:132::-;13044:4;13067:3;13059:11;;13097:4;13092:3;13088:14;13080:22;;12977:132;;;:::o;13115:108::-;13192:24;13210:5;13192:24;:::i;:::-;13187:3;13180:37;13115:108;;:::o;13229:179::-;13298:10;13319:46;13361:3;13353:6;13319:46;:::i;:::-;13397:4;13392:3;13388:14;13374:28;;13229:179;;;;:::o;13414:113::-;13484:4;13516;13511:3;13507:14;13499:22;;13414:113;;;:::o;13563:732::-;13682:3;13711:54;13759:5;13711:54;:::i;:::-;13781:86;13860:6;13855:3;13781:86;:::i;:::-;13774:93;;13891:56;13941:5;13891:56;:::i;:::-;13970:7;14001:1;13986:284;14011:6;14008:1;14005:13;13986:284;;;14087:6;14081:13;14114:63;14173:3;14158:13;14114:63;:::i;:::-;14107:70;;14200:60;14253:6;14200:60;:::i;:::-;14190:70;;14046:224;14033:1;14030;14026:9;14021:14;;13986:284;;;13990:14;14286:3;14279:10;;13687:608;;;13563:732;;;;:::o;14301:373::-;14444:4;14482:2;14471:9;14467:18;14459:26;;14531:9;14525:4;14521:20;14517:1;14506:9;14502:17;14495:47;14559:108;14662:4;14653:6;14559:108;:::i;:::-;14551:116;;14301:373;;;;:::o;14680:474::-;14748:6;14756;14805:2;14793:9;14784:7;14780:23;14776:32;14773:119;;;14811:79;;:::i;:::-;14773:119;14931:1;14956:53;15001:7;14992:6;14981:9;14977:22;14956:53;:::i;:::-;14946:63;;14902:117;15058:2;15084:53;15129:7;15120:6;15109:9;15105:22;15084:53;:::i;:::-;15074:63;;15029:118;14680:474;;;;;:::o;15160:182::-;15300:34;15296:1;15288:6;15284:14;15277:58;15160:182;:::o;15348:366::-;15490:3;15511:67;15575:2;15570:3;15511:67;:::i;:::-;15504:74;;15587:93;15676:3;15587:93;:::i;:::-;15705:2;15700:3;15696:12;15689:19;;15348:366;;;:::o;15720:419::-;15886:4;15924:2;15913:9;15909:18;15901:26;;15973:9;15967:4;15963:20;15959:1;15948:9;15944:17;15937:47;16001:131;16127:4;16001:131;:::i;:::-;15993:139;;15720:419;;;:::o;16145:168::-;16285:20;16281:1;16273:6;16269:14;16262:44;16145:168;:::o;16319:366::-;16461:3;16482:67;16546:2;16541:3;16482:67;:::i;:::-;16475:74;;16558:93;16647:3;16558:93;:::i;:::-;16676:2;16671:3;16667:12;16660:19;;16319:366;;;:::o;16691:419::-;16857:4;16895:2;16884:9;16880:18;16872:26;;16944:9;16938:4;16934:20;16930:1;16919:9;16915:17;16908:47;16972:131;17098:4;16972:131;:::i;:::-;16964:139;;16691:419;;;:::o;17116:143::-;17173:5;17204:6;17198:13;17189:22;;17220:33;17247:5;17220:33;:::i;:::-;17116:143;;;;:::o;17265:351::-;17335:6;17384:2;17372:9;17363:7;17359:23;17355:32;17352:119;;;17390:79;;:::i;:::-;17352:119;17510:1;17535:64;17591:7;17582:6;17571:9;17567:22;17535:64;:::i;:::-;17525:74;;17481:128;17265:351;;;;:::o;17622:175::-;17762:27;17758:1;17750:6;17746:14;17739:51;17622:175;:::o;17803:366::-;17945:3;17966:67;18030:2;18025:3;17966:67;:::i;:::-;17959:74;;18042:93;18131:3;18042:93;:::i;:::-;18160:2;18155:3;18151:12;18144:19;;17803:366;;;:::o;18175:419::-;18341:4;18379:2;18368:9;18364:18;18356:26;;18428:9;18422:4;18418:20;18414:1;18403:9;18399:17;18392:47;18456:131;18582:4;18456:131;:::i;:::-;18448:139;;18175:419;;;:::o;18600:169::-;18740:21;18736:1;18728:6;18724:14;18717:45;18600:169;:::o;18775:366::-;18917:3;18938:67;19002:2;18997:3;18938:67;:::i;:::-;18931:74;;19014:93;19103:3;19014:93;:::i;:::-;19132:2;19127:3;19123:12;19116:19;;18775:366;;;:::o;19147:419::-;19313:4;19351:2;19340:9;19336:18;19328:26;;19400:9;19394:4;19390:20;19386:1;19375:9;19371:17;19364:47;19428:131;19554:4;19428:131;:::i;:::-;19420:139;;19147:419;;;:::o;19572:332::-;19693:4;19731:2;19720:9;19716:18;19708:26;;19744:71;19812:1;19801:9;19797:17;19788:6;19744:71;:::i;:::-;19825:72;19893:2;19882:9;19878:18;19869:6;19825:72;:::i;:::-;19572:332;;;;;:::o;19910:442::-;20059:4;20097:2;20086:9;20082:18;20074:26;;20110:71;20178:1;20167:9;20163:17;20154:6;20110:71;:::i;:::-;20191:72;20259:2;20248:9;20244:18;20235:6;20191:72;:::i;:::-;20273;20341:2;20330:9;20326:18;20317:6;20273:72;:::i;:::-;19910:442;;;;;;:::o;20358:180::-;20406:77;20403:1;20396:88;20503:4;20500:1;20493:15;20527:4;20524:1;20517:15;20544:171;20583:3;20606:24;20624:5;20606:24;:::i;:::-;20597:33;;20652:4;20645:5;20642:15;20639:41;;;20660:18;;:::i;:::-;20639:41;20707:1;20700:5;20696:13;20689:20;;20544:171;;;:::o;20721:180::-;20769:77;20766:1;20759:88;20866:4;20863:1;20856:15;20890:4;20887:1;20880:15;20907:320;20951:6;20988:1;20982:4;20978:12;20968:22;;21035:1;21029:4;21025:12;21056:18;21046:81;;21112:4;21104:6;21100:17;21090:27;;21046:81;21174:2;21166:6;21163:14;21143:18;21140:38;21137:84;;;21193:18;;:::i;:::-;21137:84;20958:269;20907:320;;;:::o;21233:231::-;21373:34;21369:1;21361:6;21357:14;21350:58;21442:14;21437:2;21429:6;21425:15;21418:39;21233:231;:::o;21470:366::-;21612:3;21633:67;21697:2;21692:3;21633:67;:::i;:::-;21626:74;;21709:93;21798:3;21709:93;:::i;:::-;21827:2;21822:3;21818:12;21811:19;;21470:366;;;:::o;21842:419::-;22008:4;22046:2;22035:9;22031:18;22023:26;;22095:9;22089:4;22085:20;22081:1;22070:9;22066:17;22059:47;22123:131;22249:4;22123:131;:::i;:::-;22115:139;;21842:419;;;:::o;22267:220::-;22407:34;22403:1;22395:6;22391:14;22384:58;22476:3;22471:2;22463:6;22459:15;22452:28;22267:220;:::o;22493:366::-;22635:3;22656:67;22720:2;22715:3;22656:67;:::i;:::-;22649:74;;22732:93;22821:3;22732:93;:::i;:::-;22850:2;22845:3;22841:12;22834:19;;22493:366;;;:::o;22865:419::-;23031:4;23069:2;23058:9;23054:18;23046:26;;23118:9;23112:4;23108:20;23104:1;23093:9;23089:17;23082:47;23146:131;23272:4;23146:131;:::i;:::-;23138:139;;22865:419;;;:::o;23290:243::-;23430:34;23426:1;23418:6;23414:14;23407:58;23499:26;23494:2;23486:6;23482:15;23475:51;23290:243;:::o;23539:366::-;23681:3;23702:67;23766:2;23761:3;23702:67;:::i;:::-;23695:74;;23778:93;23867:3;23778:93;:::i;:::-;23896:2;23891:3;23887:12;23880:19;;23539:366;;;:::o;23911:419::-;24077:4;24115:2;24104:9;24100:18;24092:26;;24164:9;24158:4;24154:20;24150:1;24139:9;24135:17;24128:47;24192:131;24318:4;24192:131;:::i;:::-;24184:139;;23911:419;;;:::o;24336:236::-;24476:34;24472:1;24464:6;24460:14;24453:58;24545:19;24540:2;24532:6;24528:15;24521:44;24336:236;:::o;24578:366::-;24720:3;24741:67;24805:2;24800:3;24741:67;:::i;:::-;24734:74;;24817:93;24906:3;24817:93;:::i;:::-;24935:2;24930:3;24926:12;24919:19;;24578:366;;;:::o;24950:419::-;25116:4;25154:2;25143:9;25139:18;25131:26;;25203:9;25197:4;25193:20;25189:1;25178:9;25174:17;25167:47;25231:131;25357:4;25231:131;:::i;:::-;25223:139;;24950:419;;;:::o;25375:226::-;25515:34;25511:1;25503:6;25499:14;25492:58;25584:9;25579:2;25571:6;25567:15;25560:34;25375:226;:::o;25607:366::-;25749:3;25770:67;25834:2;25829:3;25770:67;:::i;:::-;25763:74;;25846:93;25935:3;25846:93;:::i;:::-;25964:2;25959:3;25955:12;25948:19;;25607:366;;;:::o;25979:419::-;26145:4;26183:2;26172:9;26168:18;26160:26;;26232:9;26226:4;26222:20;26218:1;26207:9;26203:17;26196:47;26260:131;26386:4;26260:131;:::i;:::-;26252:139;;25979:419;;;:::o;26404:179::-;26544:31;26540:1;26532:6;26528:14;26521:55;26404:179;:::o;26589:366::-;26731:3;26752:67;26816:2;26811:3;26752:67;:::i;:::-;26745:74;;26828:93;26917:3;26828:93;:::i;:::-;26946:2;26941:3;26937:12;26930:19;;26589:366;;;:::o;26961:419::-;27127:4;27165:2;27154:9;27150:18;27142:26;;27214:9;27208:4;27204:20;27200:1;27189:9;27185:17;27178:47;27242:131;27368:4;27242:131;:::i;:::-;27234:139;;26961:419;;;:::o;27386:170::-;27526:22;27522:1;27514:6;27510:14;27503:46;27386:170;:::o;27562:366::-;27704:3;27725:67;27789:2;27784:3;27725:67;:::i;:::-;27718:74;;27801:93;27890:3;27801:93;:::i;:::-;27919:2;27914:3;27910:12;27903:19;;27562:366;;;:::o;27934:419::-;28100:4;28138:2;28127:9;28123:18;28115:26;;28187:9;28181:4;28177:20;28173:1;28162:9;28158:17;28151:47;28215:131;28341:4;28215:131;:::i;:::-;28207:139;;27934:419;;;:::o;28359:230::-;28499:34;28495:1;28487:6;28483:14;28476:58;28568:13;28563:2;28555:6;28551:15;28544:38;28359:230;:::o;28595:366::-;28737:3;28758:67;28822:2;28817:3;28758:67;:::i;:::-;28751:74;;28834:93;28923:3;28834:93;:::i;:::-;28952:2;28947:3;28943:12;28936:19;;28595:366;;;:::o;28967:419::-;29133:4;29171:2;29160:9;29156:18;29148:26;;29220:9;29214:4;29210:20;29206:1;29195:9;29191:17;29184:47;29248:131;29374:4;29248:131;:::i;:::-;29240:139;;28967:419;;;:::o;29392:231::-;29532:34;29528:1;29520:6;29516:14;29509:58;29601:14;29596:2;29588:6;29584:15;29577:39;29392:231;:::o;29629:366::-;29771:3;29792:67;29856:2;29851:3;29792:67;:::i;:::-;29785:74;;29868:93;29957:3;29868:93;:::i;:::-;29986:2;29981:3;29977:12;29970:19;;29629:366;;;:::o;30001:419::-;30167:4;30205:2;30194:9;30190:18;30182:26;;30254:9;30248:4;30244:20;30240:1;30229:9;30225:17;30218:47;30282:131;30408:4;30282:131;:::i;:::-;30274:139;;30001:419;;;:::o;30426:180::-;30474:77;30471:1;30464:88;30571:4;30568:1;30561:15;30595:4;30592:1;30585:15;30612:228;30752:34;30748:1;30740:6;30736:14;30729:58;30821:11;30816:2;30808:6;30804:15;30797:36;30612:228;:::o;30846:366::-;30988:3;31009:67;31073:2;31068:3;31009:67;:::i;:::-;31002:74;;31085:93;31174:3;31085:93;:::i;:::-;31203:2;31198:3;31194:12;31187:19;;30846:366;;;:::o;31218:419::-;31384:4;31422:2;31411:9;31407:18;31399:26;;31471:9;31465:4;31461:20;31457:1;31446:9;31442:17;31435:47;31499:131;31625:4;31499:131;:::i;:::-;31491:139;;31218:419;;;:::o;31643:229::-;31783:34;31779:1;31771:6;31767:14;31760:58;31852:12;31847:2;31839:6;31835:15;31828:37;31643:229;:::o;31878:366::-;32020:3;32041:67;32105:2;32100:3;32041:67;:::i;:::-;32034:74;;32117:93;32206:3;32117:93;:::i;:::-;32235:2;32230:3;32226:12;32219:19;;31878:366;;;:::o;32250:419::-;32416:4;32454:2;32443:9;32439:18;32431:26;;32503:9;32497:4;32493:20;32489:1;32478:9;32474:17;32467:47;32531:131;32657:4;32531:131;:::i;:::-;32523:139;;32250:419;;;:::o;32675:233::-;32714:3;32737:24;32755:5;32737:24;:::i;:::-;32728:33;;32783:66;32776:5;32773:77;32770:103;;;32853:18;;:::i;:::-;32770:103;32900:1;32893:5;32889:13;32882:20;;32675:233;;;:::o;32914:148::-;33016:11;33053:3;33038:18;;32914:148;;;;:::o;33068:377::-;33174:3;33202:39;33235:5;33202:39;:::i;:::-;33257:89;33339:6;33334:3;33257:89;:::i;:::-;33250:96;;33355:52;33400:6;33395:3;33388:4;33381:5;33377:16;33355:52;:::i;:::-;33432:6;33427:3;33423:16;33416:23;;33178:267;33068:377;;;;:::o;33451:157::-;33591:9;33587:1;33579:6;33575:14;33568:33;33451:157;:::o;33614:400::-;33774:3;33795:84;33877:1;33872:3;33795:84;:::i;:::-;33788:91;;33888:93;33977:3;33888:93;:::i;:::-;34006:1;34001:3;33997:11;33990:18;;33614:400;;;:::o;34020:164::-;34160:16;34156:1;34148:6;34144:14;34137:40;34020:164;:::o;34190:402::-;34350:3;34371:85;34453:2;34448:3;34371:85;:::i;:::-;34364:92;;34465:93;34554:3;34465:93;:::i;:::-;34583:2;34578:3;34574:12;34567:19;;34190:402;;;:::o;34598:967::-;34980:3;35002:95;35093:3;35084:6;35002:95;:::i;:::-;34995:102;;35114:148;35258:3;35114:148;:::i;:::-;35107:155;;35279:95;35370:3;35361:6;35279:95;:::i;:::-;35272:102;;35391:148;35535:3;35391:148;:::i;:::-;35384:155;;35556:3;35549:10;;34598:967;;;;;:::o;35571:225::-;35711:34;35707:1;35699:6;35695:14;35688:58;35780:8;35775:2;35767:6;35763:15;35756:33;35571:225;:::o;35802:366::-;35944:3;35965:67;36029:2;36024:3;35965:67;:::i;:::-;35958:74;;36041:93;36130:3;36041:93;:::i;:::-;36159:2;36154:3;36150:12;36143:19;;35802:366;;;:::o;36174:419::-;36340:4;36378:2;36367:9;36363:18;36355:26;;36427:9;36421:4;36417:20;36413:1;36402:9;36398:17;36391:47;36455:131;36581:4;36455:131;:::i;:::-;36447:139;;36174:419;;;:::o;36599:143::-;36656:5;36687:6;36681:13;36672:22;;36703:33;36730:5;36703:33;:::i;:::-;36599:143;;;;:::o;36748:351::-;36818:6;36867:2;36855:9;36846:7;36842:23;36838:32;36835:119;;;36873:79;;:::i;:::-;36835:119;36993:1;37018:64;37074:7;37065:6;37054:9;37050:22;37018:64;:::i;:::-;37008:74;;36964:128;36748:351;;;;:::o;37105:229::-;37245:34;37241:1;37233:6;37229:14;37222:58;37314:12;37309:2;37301:6;37297:15;37290:37;37105:229;:::o;37340:366::-;37482:3;37503:67;37567:2;37562:3;37503:67;:::i;:::-;37496:74;;37579:93;37668:3;37579:93;:::i;:::-;37697:2;37692:3;37688:12;37681:19;;37340:366;;;:::o;37712:419::-;37878:4;37916:2;37905:9;37901:18;37893:26;;37965:9;37959:4;37955:20;37951:1;37940:9;37936:17;37929:47;37993:131;38119:4;37993:131;:::i;:::-;37985:139;;37712:419;;;:::o;38137:305::-;38177:3;38196:20;38214:1;38196:20;:::i;:::-;38191:25;;38230:20;38248:1;38230:20;:::i;:::-;38225:25;;38384:1;38316:66;38312:74;38309:1;38306:81;38303:107;;;38390:18;;:::i;:::-;38303:107;38434:1;38431;38427:9;38420:16;;38137:305;;;;:::o;38448:191::-;38488:4;38508:20;38526:1;38508:20;:::i;:::-;38503:25;;38542:20;38560:1;38542:20;:::i;:::-;38537:25;;38581:1;38578;38575:8;38572:34;;;38586:18;;:::i;:::-;38572:34;38631:1;38628;38624:9;38616:17;;38448:191;;;;:::o;38645:171::-;38683:3;38706:23;38723:5;38706:23;:::i;:::-;38697:32;;38751:6;38744:5;38741:17;38738:43;;;38761:18;;:::i;:::-;38738:43;38808:1;38801:5;38797:13;38790:20;;38645:171;;;:::o;38822:231::-;38962:34;38958:1;38950:6;38946:14;38939:58;39031:14;39026:2;39018:6;39014:15;39007:39;38822:231;:::o;39059:366::-;39201:3;39222:67;39286:2;39281:3;39222:67;:::i;:::-;39215:74;;39298:93;39387:3;39298:93;:::i;:::-;39416:2;39411:3;39407:12;39400:19;;39059:366;;;:::o;39431:419::-;39597:4;39635:2;39624:9;39620:18;39612:26;;39684:9;39678:4;39674:20;39670:1;39659:9;39655:17;39648:47;39712:131;39838:4;39712:131;:::i;:::-;39704:139;;39431:419;;;:::o;39856:228::-;39996:34;39992:1;39984:6;39980:14;39973:58;40065:11;40060:2;40052:6;40048:15;40041:36;39856:228;:::o;40090:366::-;40232:3;40253:67;40317:2;40312:3;40253:67;:::i;:::-;40246:74;;40329:93;40418:3;40329:93;:::i;:::-;40447:2;40442:3;40438:12;40431:19;;40090:366;;;:::o;40462:419::-;40628:4;40666:2;40655:9;40651:18;40643:26;;40715:9;40709:4;40705:20;40701:1;40690:9;40686:17;40679:47;40743:131;40869:4;40743:131;:::i;:::-;40735:139;;40462:419;;;:::o;40887:223::-;41027:34;41023:1;41015:6;41011:14;41004:58;41096:6;41091:2;41083:6;41079:15;41072:31;40887:223;:::o;41116:366::-;41258:3;41279:67;41343:2;41338:3;41279:67;:::i;:::-;41272:74;;41355:93;41444:3;41355:93;:::i;:::-;41473:2;41468:3;41464:12;41457:19;;41116:366;;;:::o;41488:419::-;41654:4;41692:2;41681:9;41677:18;41669:26;;41741:9;41735:4;41731:20;41727:1;41716:9;41712:17;41705:47;41769:131;41895:4;41769:131;:::i;:::-;41761:139;;41488:419;;;:::o;41913:348::-;41953:7;41976:20;41994:1;41976:20;:::i;:::-;41971:25;;42010:20;42028:1;42010:20;:::i;:::-;42005:25;;42198:1;42130:66;42126:74;42123:1;42120:81;42115:1;42108:9;42101:17;42097:105;42094:131;;;42205:18;;:::i;:::-;42094:131;42253:1;42250;42246:9;42235:20;;41913:348;;;;:::o;42267:175::-;42407:27;42403:1;42395:6;42391:14;42384:51;42267:175;:::o;42448:366::-;42590:3;42611:67;42675:2;42670:3;42611:67;:::i;:::-;42604:74;;42687:93;42776:3;42687:93;:::i;:::-;42805:2;42800:3;42796:12;42789:19;;42448:366;;;:::o;42820:419::-;42986:4;43024:2;43013:9;43009:18;43001:26;;43073:9;43067:4;43063:20;43059:1;43048:9;43044:17;43037:47;43101:131;43227:4;43101:131;:::i;:::-;43093:139;;42820:419;;;:::o;43245:237::-;43385:34;43381:1;43373:6;43369:14;43362:58;43454:20;43449:2;43441:6;43437:15;43430:45;43245:237;:::o;43488:366::-;43630:3;43651:67;43715:2;43710:3;43651:67;:::i;:::-;43644:74;;43727:93;43816:3;43727:93;:::i;:::-;43845:2;43840:3;43836:12;43829:19;;43488:366;;;:::o;43860:419::-;44026:4;44064:2;44053:9;44049:18;44041:26;;44113:9;44107:4;44103:20;44099:1;44088:9;44084:17;44077:47;44141:131;44267:4;44141:131;:::i;:::-;44133:139;;43860:419;;;:::o;44285:180::-;44333:77;44330:1;44323:88;44430:4;44427:1;44420:15;44454:4;44451:1;44444:15;44471:185;44511:1;44528:20;44546:1;44528:20;:::i;:::-;44523:25;;44562:20;44580:1;44562:20;:::i;:::-;44557:25;;44601:1;44591:35;;44606:18;;:::i;:::-;44591:35;44648:1;44645;44641:9;44636:14;;44471:185;;;;:::o;44662:176::-;44694:1;44711:20;44729:1;44711:20;:::i;:::-;44706:25;;44745:20;44763:1;44745:20;:::i;:::-;44740:25;;44784:1;44774:35;;44789:18;;:::i;:::-;44774:35;44830:1;44827;44823:9;44818:14;;44662:176;;;;:::o;44844:98::-;44895:6;44929:5;44923:12;44913:22;;44844:98;;;:::o;44948:168::-;45031:11;45065:6;45060:3;45053:19;45105:4;45100:3;45096:14;45081:29;;44948:168;;;;:::o;45122:360::-;45208:3;45236:38;45268:5;45236:38;:::i;:::-;45290:70;45353:6;45348:3;45290:70;:::i;:::-;45283:77;;45369:52;45414:6;45409:3;45402:4;45395:5;45391:16;45369:52;:::i;:::-;45446:29;45468:6;45446:29;:::i;:::-;45441:3;45437:39;45430:46;;45212:270;45122:360;;;;:::o;45488:640::-;45683:4;45721:3;45710:9;45706:19;45698:27;;45735:71;45803:1;45792:9;45788:17;45779:6;45735:71;:::i;:::-;45816:72;45884:2;45873:9;45869:18;45860:6;45816:72;:::i;:::-;45898;45966:2;45955:9;45951:18;45942:6;45898:72;:::i;:::-;46017:9;46011:4;46007:20;46002:2;45991:9;45987:18;45980:48;46045:76;46116:4;46107:6;46045:76;:::i;:::-;46037:84;;45488:640;;;;;;;:::o;46134:141::-;46190:5;46221:6;46215:13;46206:22;;46237:32;46263:5;46237:32;:::i;:::-;46134:141;;;;:::o;46281:349::-;46350:6;46399:2;46387:9;46378:7;46374:23;46370:32;46367:119;;;46405:79;;:::i;:::-;46367:119;46525:1;46550:63;46605:7;46596:6;46585:9;46581:22;46550:63;:::i;:::-;46540:73;;46496:127;46281:349;;;;:::o;46636:180::-;46684:77;46681:1;46674:88;46781:4;46778:1;46771:15;46805:4;46802:1;46795:15;46822:182;46962:34;46958:1;46950:6;46946:14;46939:58;46822:182;:::o;47010:366::-;47152:3;47173:67;47237:2;47232:3;47173:67;:::i;:::-;47166:74;;47249:93;47338:3;47249:93;:::i;:::-;47367:2;47362:3;47358:12;47351:19;;47010:366;;;:::o;47382:419::-;47548:4;47586:2;47575:9;47571:18;47563:26;;47635:9;47629:4;47625:20;47621:1;47610:9;47606:17;47599:47;47663:131;47789:4;47663:131;:::i;:::-;47655:139;;47382:419;;;:::o;47807:178::-;47947:30;47943:1;47935:6;47931:14;47924:54;47807:178;:::o;47991:366::-;48133:3;48154:67;48218:2;48213:3;48154:67;:::i;:::-;48147:74;;48230:93;48319:3;48230:93;:::i;:::-;48348:2;48343:3;48339:12;48332:19;;47991:366;;;:::o;48363:419::-;48529:4;48567:2;48556:9;48552:18;48544:26;;48616:9;48610:4;48606:20;48602:1;48591:9;48587:17;48580:47;48644:131;48770:4;48644:131;:::i;:::-;48636:139;;48363:419;;;:::o

Swarm Source

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