ETH Price: $3,519.16 (+0.93%)
Gas: 2 Gwei

Token

Sora's Dreamworld: LUCID DREAMING (SDLD)
 

Overview

Max Total Supply

7,581 SDLD

Holders

506

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 SDLD
0xfddeed611d8fd5d2728732a81bc15ca3eca26fc2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Dark Machines are 8888 unique Gen 1 avatars. There are 171 assets paired with 6 traits, randomly generated on the blockchain. The permutations are endless, resulting in limitless possibilities ranked by their rarity.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SorasDreamworldLucidDreaming

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-15
*/

// SPDX-License-Identifier: MIT

// Scroll down to the bottom to find the contract of interest. 

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


pragma solidity ^0.8.0;

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


// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol


pragma solidity ^0.8.0;

// import "@openzeppelin/[email protected]/utils/introspection/IERC165.sol";

/**
 * @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/[email protected]/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/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


pragma solidity ^0.8.0;

// import "@openzeppelin/[email protected]/token/ERC721/IERC721.sol";

/**
 * @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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/utils/introspection/ERC165.sol


pragma solidity ^0.8.0;

// import "@openzeppelin/[email protected]/utils/introspection/IERC165.sol";

/**
 * @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/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


pragma solidity ^0.8.0;

// import "@openzeppelin/[email protected]/token/ERC721/IERC721.sol";

/**
 * @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/[email protected]/access/Ownable.sol


pragma solidity ^0.8.0;

// import "@openzeppelin/[email protected]/utils/Context.sol";

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: @openzeppelin/[email protected]/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 make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// File: bd/contracts/SDA.optimized.sol

pragma solidity ^0.8.0;

// import "@openzeppelin/[email protected]/token/ERC721/IERC721.sol";
// import "@openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol";
// import "@openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol";
// import "@openzeppelin/[email protected]/utils/Address.sol";
// import "@openzeppelin/[email protected]/utils/Context.sol";
// import "@openzeppelin/[email protected]/utils/Strings.sol";
// import "@openzeppelin/[email protected]/utils/introspection/ERC165.sol";

/**
 * This is a modified version of the ERC721 class, where we only store
 * the address of the minter into an _owners array upon minting.
 * 
 * While this saves on minting gas costs, it means that the the balanceOf
 * function needs to do a bruteforce search through all the tokens.
 *
 * For small amounts of tokens (e.g. 8888), RPC services like Infura
 * can still query the function. 
 *
 * It also means any future contracts that reads the balanceOf function 
 * in a non-view function will incur a gigantic gas fee. 
 */
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    
    using Address for address;
    
    string private _name;
    
    string private _symbol;
    
    address[] internal _owners;
    
    mapping(uint256 => address) private _tokenApprovals;
    
    mapping(address => mapping(address => bool)) private _operatorApprovals;     
    
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }     
    
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint n = _owners.length;
        for (uint i = 0; i < n; ++i) {
            if (owner == _owners[i]) {
                ++count;
            }
        }
        return count;
    }
    
    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;
    }
    
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    
    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);
    }
    
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    
    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);
    }
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    
    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);
    }     
    
    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");
    }
  
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
  
    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));
    }
  
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
  
    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"
        );
    }
  
    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);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
  
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
  
    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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
  
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }
  
    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;
        }
    }
  
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

// import "@openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol";

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        uint256 count = 0;
        uint256 n = _owners.length;
        for (uint256 i = 0; i < n; ++i) {
            if (owner == _owners[i]) {
                if (count == index) {
                    return i;
                } else {
                    ++count;
                }
            }
        }
        require(false, "Token not found.");
    }
    
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "Token not found.");
        return index;
    }
}

pragma solidity ^0.8.0;
pragma abicoder v2;

// import "@openzeppelin/[email protected]/access/Ownable.sol";
// import "@openzeppelin/[email protected]/security/ReentrancyGuard.sol";

contract SorasDreamworldLucidDreaming is ERC721Enumerable, Ownable, ReentrancyGuard {

    using Strings for uint;
    
    uint public constant TOKEN_PRICE = 80000000000000000; // 0.08 ETH

    uint public constant PRE_SALE_TOKEN_PRICE = 50000000000000000; // 0.05 ETH

    uint public constant MAX_TOKENS_PER_PUBLIC_MINT = 10; // Only applies during public sale.

    uint public constant MAX_TOKENS = 8888;

    address public constant GENESIS_BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    /// @dev 1: presale, 2: public sale, 3: genesis claim, 4: genesis burn, 255: closed.
    uint public saleState; 

    /// @dev A mapping of the token names.
    mapping(uint => string) public tokenNames;

    // @dev Whether the presale slot has been used. One slot per address.
    mapping(address => bool) public presaleUsed;

    /// @dev 256-bit words, each representing 256 booleans.
    mapping(uint => uint) internal genesisClaimedMap;

    /// @dev The license text/url for every token.
    string public LICENSE = "https://www.nftlicense.org"; 

    /// @dev Link to a Chainrand NFT.
    ///      This contains all the information needed to reproduce
    ///      the traits with a locked Chainlink VRF result.
    string public PROVENANCE; 

    /// @dev The base URI
    string public baseURI;

    event TokenNameChanged(address _by, uint _tokenId, string _name);

    event LicenseSet(string _license);

    event ProvenanceSet(string _provenance);

    event SaleClosed();

    event PreSaleOpened();

    event PublicSaleOpened();

    event GenesisClaimOpened();

    event GenesisBurnOpened();

    // IMPORTANT: Make sure to change this to the correct address before publishing!
    // Gen 0 mainnet address: 0x4e2781e3aD94b2DfcF34c51De0D8e9358c69F296
    IERC721 internal genesisContract = IERC721(0x4e2781e3aD94b2DfcF34c51De0D8e9358c69F296);

    constructor() 
    ERC721("Sora's Dreamworld: LUCID DREAMING", "SDLD") { 
        saleState = 255;
        baseURI = "https://sorasdreamworld.io/tokens/dark/";
    }
    
    /// @dev Withdraws Ether for the owner.    
    function withdraw() public onlyOwner {
        uint256 amount = address(this).balance;
        payable(msg.sender).transfer(amount);
    }

    /// @dev Sets the provenance.
    function setProvenance(string memory _provenance) public onlyOwner {
        PROVENANCE = _provenance;
        emit ProvenanceSet(_provenance);
    }

    /// @dev Sets base URI for all token IDs. 
    ///      e.g. https://sorasdreamworld.io/tokens/dark/
    function setBaseURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    /// @dev Open the pre-sale. 
    function openPreSale() public onlyOwner {
        saleState = 1;
        emit PreSaleOpened();
    }

    /// @dev Open the public sale. 
    function openPublicSale() public onlyOwner {
        saleState = 2;
        emit PublicSaleOpened();
    }

    /// @dev Open the claim phase. 
    function openGenesisClaim() public onlyOwner {
        saleState = 3;
        emit GenesisClaimOpened();
    }

    /// @dev Open the burn phase. 
    function openGenesisBurn() public onlyOwner {
        saleState = 4;
        emit GenesisBurnOpened();
    }

    /// @dev Close the sale.
    function closeSale() public onlyOwner {
        saleState = 255;
        emit SaleClosed();
    }

    /// @dev Mint just one NFT.
    function mintOne(address _toAddress) internal {
        uint mintIndex = totalSupply();
        require(mintIndex < MAX_TOKENS, "Sold out.");
        _safeMint(_toAddress, mintIndex);
    }

    /// @dev Force mint for the addresses. 
    //       Can be called anytime.
    //       If called right after the creation of the contract, the tokens 
    //       are assigned sequentially starting from id 0. 
    function forceMint(address[] memory _addresses) public onlyOwner { 
        for (uint i = 0; i < _addresses.length; ++i) {
            mintOne(_addresses[i]);
        }
    }
    
    /// @dev Self mint for the owner. 
    ///      Can be called anytime.
    ///      This does not require the sale to be open.
    function selfMint(uint _numTokens) public onlyOwner { 
        for (uint i = 0; i < _numTokens; ++i) {
            mintOne(msg.sender);
        }
    }
    
    /// @dev Sets the license text.
    function setLicense(string memory _license) public onlyOwner {
        LICENSE = _license;
        emit LicenseSet(_license);
    }

    /// @dev Returns the license for tokens.
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "Token not found.");
        return LICENSE;
    }
    
    /// @dev Mints tokens.
    function mint(uint _numTokens) public payable nonReentrant {
        // saleState == 1 || saleState == 2. Zero is not used.
        require(saleState < 3, "Not open."); 
        require(_numTokens > 0, "Minimum number to mint is 1.");
        
        address sender = msg.sender;

        uint effectiveTokenPrice;
        if (saleState == 1) {
            effectiveTokenPrice = PRE_SALE_TOKEN_PRICE; 
            require(_numTokens <= 1, "Number per mint exceeded.");
            require(genesisContract.balanceOf(sender) > 0, "You don't have a Dream Machine.");
            require(!presaleUsed[sender], "Presale slot already used.");
            presaleUsed[sender] = true;
        } else { // 2
            effectiveTokenPrice = TOKEN_PRICE;
            require(_numTokens <= MAX_TOKENS_PER_PUBLIC_MINT, "Number per mint exceeded.");
        }

        require(msg.value >= effectiveTokenPrice * _numTokens, "Wrong Ether value.");

        for (uint i = 0; i < _numTokens; ++i) {
            mintOne(sender);
        }
    }

    /// @dev Returns whether the genesis token has been claimed.
    function checkGenesisClaimed(uint _genesisId) public view returns(bool) {
        uint t = _genesisId;
        uint q = t >> 8;
        uint r = t & 255;
        uint m = genesisClaimedMap[q];
        return m & (1 << r) != 0;
    }

    /// @dev Returns an array of uints representing whether the token has been claimed.
    function genesisClaimed(uint[] memory _genesisIds) public view returns(bool[] memory) {
        uint n = _genesisIds.length;
        bool[] memory a = new bool[](n);
        for (uint i = 0; i < n; ++i) {
            a[i] = checkGenesisClaimed(_genesisIds[i]);
        }
        return a;
    }

    /// @dev Use the genesis tokens to claim free mints.
    function genesisClaim(uint[] memory _genesisIds) public nonReentrant {
        require(saleState == 3, "Not open.");
        uint n = _genesisIds.length;
        require(n > 0 && n % 3 == 0, "Please submit a positive multiple of 3.");
        address sender = msg.sender;
        uint qPrevInitial = 1 << 255;
        uint qPrev = qPrevInitial;
        uint m;
        for (uint i = 0; i < n; i += 3) {
            for (uint j = 0; j < 3; ++j) {
                uint t = _genesisIds[i + j];
                uint q = t >> 8;
                uint r = t & 255;
                if (q != qPrev) {
                    if (qPrev != qPrevInitial) {
                        genesisClaimedMap[qPrev] = m;
                    } 
                    m = genesisClaimedMap[q];
                } 
                qPrev = q;
                uint b = 1 << r;
                // Token must be unused and owned.
                require(m & b == 0 && genesisContract.ownerOf(t) == sender, "Invalid submission.");
                // Modifying the map and checking will ensure that there 
                // are no duplicates in _genesisIds.
                m = m | b;
            }
            mintOne(sender);
        }
        genesisClaimedMap[qPrev] = m;    
    }

    /// @dev Burns the genesis tokens for free mints.
    function genesisBurn(uint[] memory _genesisIds) public nonReentrant {
        require(saleState == 4, "Not open.");
        uint n = _genesisIds.length;
        require(n > 0 && n & 1 == 0, "Please submit a positive multiple of 2.");
        address sender = msg.sender;
        for (uint i = 0; i < n; i += 2) {
            // Transfer from requires that the token must be owned.
            // Calling it in sequence will ensure that no are no 
            // duplicates in _genesisIds.
            genesisContract.transferFrom(sender, GENESIS_BURN_ADDRESS, _genesisIds[i]);
            genesisContract.transferFrom(sender, GENESIS_BURN_ADDRESS, _genesisIds[i + 1]);
            mintOne(sender);
        }   
    }

    /// @dev Returns an array of the token ids under the owner.
    function tokensOfOwner(address _owner) external view returns (uint[] memory) {
        uint[] memory a = new uint[](balanceOf(_owner));
        uint j = 0;
        uint n = _owners.length;
        for (uint i; i < n; ++i) {
            if (_owner == _owners[i]) {
                a[j++] = i;
            }
        }
        return a;
    }
    
    /// @dev Change the token name.
    function changeTokenName(uint _id, string memory _name) public {
        require(ownerOf(_id) == msg.sender, "You do not own this token.");
        require(sha256(bytes(_name)) != sha256(bytes(tokenNames[_id])), "Name unchanged.");
        tokenNames[_id] = _name;
        emit TokenNameChanged(msg.sender, _id, _name);
    }

    /// @dev Returns the token's URI for the metadata.
    function tokenURI(uint256 _id) public view virtual override returns (string memory) {
        require(_id < totalSupply(), "Token not found.");
        return string(abi.encodePacked(baseURI, _id.toString()));
    }

    /// @dev Returns the most relevant stats in a single go to reduce RPC calls.
    function stats() external view returns (uint[] memory) {
        uint[] memory a = new uint[](4);
        a[0] = saleState; 
        a[1] = totalSupply(); 
        a[2] = genesisContract.balanceOf(GENESIS_BURN_ADDRESS);
        a[3] = saleState == 1 ? PRE_SALE_TOKEN_PRICE : TOKEN_PRICE;
        return a;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[],"name":"GenesisBurnOpened","type":"event"},{"anonymous":false,"inputs":[],"name":"GenesisClaimOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_license","type":"string"}],"name":"LicenseSet","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":[],"name":"PreSaleOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_provenance","type":"string"}],"name":"ProvenanceSet","type":"event"},{"anonymous":false,"inputs":[],"name":"PublicSaleOpened","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"TokenNameChanged","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":"GENESIS_BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeTokenName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genesisId","type":"uint256"}],"name":"checkGenesisClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"forceMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_genesisIds","type":"uint256[]"}],"name":"genesisBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_genesisIds","type":"uint256[]"}],"name":"genesisClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_genesisIds","type":"uint256[]"}],"name":"genesisClaimed","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openGenesisBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openGenesisClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"setLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stats","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601a60808190527f68747470733a2f2f7777772e6e66746c6963656e73652e6f726700000000000060a09081526200004091600b91906200018d565b50600e80546001600160a01b031916734e2781e3ad94b2dfcf34c51de0d8e9358c69f2961790553480156200007457600080fd5b50604051806060016040528060218152602001620042e1602191396040518060400160405280600481526020016314d1131160e21b8152508160009080519060200190620000c49291906200018d565b508051620000da9060019060208401906200018d565b505050620000f7620000f16200013760201b60201c565b6200013b565b600160065560ff6007556040805160608101909152602780825262004302602083013980516200013091600d916020909101906200018d565b5062000270565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019b9062000233565b90600052602060002090601f016020900481019282620001bf57600085556200020a565b82601f10620001da57805160ff19168380011785556200020a565b828001600101855582156200020a579182015b828111156200020a578251825591602001919060010190620001ed565b50620002189291506200021c565b5090565b5b808211156200021857600081556001016200021d565b600181811c908216806200024857607f821691505b602082108114156200026a57634e487b7160e01b600052602260045260246000fd5b50919050565b61406180620002806000396000f3fe6080604052600436106103295760003560e01c80636d7c82bb116101a5578063c5da5cbe116100ec578063e985e9c511610095578063f47c84c51161006f578063f47c84c5146108ed578063f7b8ad6214610903578063f84b40dc14610933578063ffe630b51461095357600080fd5b8063e985e9c514610862578063ee55efee146108b8578063f2fde38b146108cd57600080fd5b8063d80528ae116100c6578063d80528ae14610817578063d85b2ba01461082c578063d9b137b21461084257600080fd5b8063c5da5cbe146107c6578063c87b56dd146107db578063d2d8cb67146107fb57600080fd5b8063a0712d681161014e578063b585209b11610128578063b585209b14610771578063b88d4fde14610786578063b98877e2146107a657600080fd5b8063a0712d68146106fe578063a1807c2114610711578063a22cb4651461075157600080fd5b80638462151c1161017f5780638462151c146106915780638da5cb5b146106be57806395d89b41146106e957600080fd5b80636d7c82bb1461064157806370a082311461065c578063715018a61461067c57600080fd5b80632f745c59116102745780634f6ccce71161021d578063603f4d52116101f7578063603f4d52146105e15780636352211e146105f75780636373a6b1146106175780636c0360eb1461062c57600080fd5b80634f6ccce71461058157806355f804b3146105a15780635a3c7d26146105c157600080fd5b80633ccfd60b1161024e5780633ccfd60b146105375780633df5f0fa1461054c57806342842e0e1461056157600080fd5b80632f745c59146104e2578063310495ab1461050257806333bffccc1461052257600080fd5b80631053eff4116102d65780631d5afc25116102b05780631d5afc25146104755780631efb8d2e1461049557806323b872dd146104c257600080fd5b80631053eff41461042157806311b79a781461044157806318160ddd1461045657600080fd5b8063095ea7b311610307578063095ea7b3146103ca5780630a912fc4146103ec5780630d3c69b41461040157600080fd5b806301ffc9a71461032e57806306fdde0314610363578063081812fc14610385575b600080fd5b34801561033a57600080fd5b5061034e6103493660046136d1565b610973565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b506103786109cf565b60405161035a919061376b565b34801561039157600080fd5b506103a56103a036600461377e565b610a61565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161035a565b3480156103d657600080fd5b506103ea6103e53660046137b9565b610b0c565b005b3480156103f857600080fd5b50610378610c65565b34801561040d57600080fd5b506103ea61041c36600461377e565b610cf3565b34801561042d57600080fd5b506103ea61043c366004613887565b610d82565b34801561044d57600080fd5b506103ea6110b6565b34801561046257600080fd5b506002545b60405190815260200161035a565b34801561048157600080fd5b506103ea610490366004613887565b61114d565b3480156104a157600080fd5b506104b56104b0366004613887565b611457565b60405161035a919061391d565b3480156104ce57600080fd5b506103ea6104dd366004613963565b61152a565b3480156104ee57600080fd5b506104676104fd3660046137b9565b6115b1565b34801561050e57600080fd5b5061037861051d36600461377e565b611679565b34801561052e57600080fd5b506103ea611692565b34801561054357600080fd5b506103ea611729565b34801561055857600080fd5b506103ea6117bf565b34801561056d57600080fd5b506103ea61057c366004613963565b611856565b34801561058d57600080fd5b5061046761059c36600461377e565b611871565b3480156105ad57600080fd5b506103ea6105bc366004613a3a565b6118ce565b3480156105cd57600080fd5b506103ea6105dc366004613a3a565b611948565b3480156105ed57600080fd5b5061046760075481565b34801561060357600080fd5b506103a561061236600461377e565b6119fd565b34801561062357600080fd5b50610378611aaa565b34801561063857600080fd5b50610378611ab7565b34801561064d57600080fd5b5061046766b1a2bc2ec5000081565b34801561066857600080fd5b50610467610677366004613a6f565b611ac4565b34801561068857600080fd5b506103ea611bc3565b34801561069d57600080fd5b506106b16106ac366004613a6f565b611c36565b60405161035a9190613a8c565b3480156106ca57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff166103a5565b3480156106f557600080fd5b50610378611d1c565b6103ea61070c36600461377e565b611d2b565b34801561071d57600080fd5b5061034e61072c36600461377e565b600881901c6000908152600a6020526040902054600160ff9092169190911b16151590565b34801561075d57600080fd5b506103ea61076c366004613ac4565b612112565b34801561077d57600080fd5b506103ea61220f565b34801561079257600080fd5b506103ea6107a1366004613b02565b6122a6565b3480156107b257600080fd5b506103ea6107c1366004613b82565b612334565b3480156107d257600080fd5b50610467600a81565b3480156107e757600080fd5b506103786107f636600461377e565b6123d9565b34801561080757600080fd5b5061046767011c37937e08000081565b34801561082357600080fd5b506106b1612464565b34801561083857600080fd5b506103a561dead81565b34801561084e57600080fd5b5061037861085d36600461377e565b6125c4565b34801561086e57600080fd5b5061034e61087d366004613c11565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156108c457600080fd5b506103ea6126af565b3480156108d957600080fd5b506103ea6108e8366004613a6f565b612746565b3480156108f957600080fd5b506104676122b881565b34801561090f57600080fd5b5061034e61091e366004613a6f565b60096020526000908152604090205460ff1681565b34801561093f57600080fd5b506103ea61094e366004613c3f565b612842565b34801561095f57600080fd5b506103ea61096e366004613a3a565b612a0a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806109c957506109c982612ab4565b92915050565b6060600080546109de90613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90613c86565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b6000610a6c82612b97565b610ae35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b17826119fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bbb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610ada565b3373ffffffffffffffffffffffffffffffffffffffff82161480610be45750610be4813361087d565b610c565760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ada565b610c608383612bfb565b505050565b600b8054610c7290613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9e90613c86565b8015610ceb5780601f10610cc057610100808354040283529160200191610ceb565b820191906000526020600020905b815481529060010190602001808311610cce57829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d5a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60005b81811015610d7e57610d6e33612c9b565b610d7781613d09565b9050610d5d565b5050565b60026006541415610dd55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ada565b6002600655600754600314610e2c5760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f70656e2e00000000000000000000000000000000000000000000006044820152606401610ada565b80518015801590610e455750610e43600382613d71565b155b610eb75760405162461bcd60e51b815260206004820152602760248201527f506c65617365207375626d6974206120706f736974697665206d756c7469706c60448201527f65206f6620332e000000000000000000000000000000000000000000000000006064820152608401610ada565b337f8000000000000000000000000000000000000000000000000000000000000000806000805b8581101561109a5760005b600381101561107e57600088610eff8385613d85565b81518110610f0f57610f0f613d9d565b60209081029190910101519050600881901c60ff8216868214610f5757878714610f45576000878152600a602052604090208690555b6000828152600a602052604090205495505b90955085906001811b8681161580156110185750600e546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff8c8116921690636352211e90602401602060405180830381865afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190613dcc565b73ffffffffffffffffffffffffffffffffffffffff16145b6110645760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964207375626d697373696f6e2e000000000000000000000000006044820152606401610ada565b8087179650505050508061107790613d09565b9050610ee9565b5061108885612c9b565b611093600382613d85565b9050610ede565b506000918252600a602052604090912055505060016006555050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461111d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60046007556040517f6377a4a336c05e3ee518eeabaf5eaec5d85a85254b89f317400655902496cabb90600090a1565b600260065414156111a05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ada565b60026006556007546004146111f75760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f70656e2e00000000000000000000000000000000000000000000006044820152606401610ada565b80518015801590611209575060018116155b61127b5760405162461bcd60e51b815260206004820152602760248201527f506c65617365207375626d6974206120706f736974697665206d756c7469706c60448201527f65206f6620322e000000000000000000000000000000000000000000000000006064820152608401610ada565b3360005b8281101561144c57600e54845173ffffffffffffffffffffffffffffffffffffffff909116906323b872dd90849061dead908890869081106112c3576112c3613d9d565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561134257600080fd5b505af1158015611356573d6000803e3d6000fd5b5050600e5473ffffffffffffffffffffffffffffffffffffffff1691506323b872dd90508361dead8761138a866001613d85565b8151811061139a5761139a613d9d565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561141957600080fd5b505af115801561142d573d6000803e3d6000fd5b5050505061143a82612c9b565b611445600282613d85565b905061127f565b505060016006555050565b805160609060008167ffffffffffffffff811115611477576114776137e5565b6040519080825280602002602001820160405280156114a0578160200160208202803683370190505b50905060005b82811015611522576114f08582815181106114c3576114c3613d9d565b6020026020010151600881901c6000908152600a6020526040902054600160ff9092169190911b16151590565b82828151811061150257611502613d9d565b9115156020928302919091019091015261151b81613d09565b90506114a6565b509392505050565b6115343382612d03565b6115a65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610ada565b610c60838383612e3f565b6002546000908190815b8181101561163057600281815481106115d6576115d6613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8781169116141561162057848314156116145792506109c9915050565b61161d83613d09565b92505b61162981613d09565b90506115bb565b5060405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b60086020526000908152604090208054610c7290613c86565b60055473ffffffffffffffffffffffffffffffffffffffff1633146116f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60016007556040517faa7f66109fc44f83151144a97120f5d50861e58565b5fba86db13d2157273f3790600090a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146117905760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b6040514790339082156108fc029083906000818181858888f19350505050158015610d7e573d6000803e3d6000fd5b60055473ffffffffffffffffffffffffffffffffffffffff1633146118265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60036007556040517f455fea493f186fe020ff970d7666217e6e9fa5d07946109a440fc5a476e4398f90600090a1565b610c60838383604051806020016040528060008152506122a6565b600061187c60025490565b82106118ca5760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146119355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b8051610d7e90600d906020840190613613565b60055473ffffffffffffffffffffffffffffffffffffffff1633146119af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b80516119c290600b906020840190613613565b507f0c36b2588cd03c71dd3534d1649d17d37de28a093cd238454fcf722fc8165db6816040516119f2919061376b565b60405180910390a150565b60008060028381548110611a1357611a13613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050806109c95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610ada565b600c8054610c7290613c86565b600d8054610c7290613c86565b600073ffffffffffffffffffffffffffffffffffffffff8216611b4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610ada565b600254600090815b81811015611bba5760028181548110611b7257611b72613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415611baa57611ba783613d09565b92505b611bb381613d09565b9050611b57565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611c2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b611c34600061300e565b565b60606000611c4383611ac4565b67ffffffffffffffff811115611c5b57611c5b6137e5565b604051908082528060200260200182016040528015611c84578160200160208202803683370190505b50600254909150600090815b81811015611d125760028181548110611cab57611cab613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff87811691161415611d0257808484611ce381613d09565b955081518110611cf557611cf5613d9d565b6020026020010181815250505b611d0b81613d09565b9050611c90565b5091949350505050565b6060600180546109de90613c86565b60026006541415611d7e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ada565b6002600655600754600311611dd55760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f70656e2e00000000000000000000000000000000000000000000006044820152606401610ada565b60008111611e255760405162461bcd60e51b815260206004820152601c60248201527f4d696e696d756d206e756d62657220746f206d696e7420697320312e000000006044820152606401610ada565b60075433906000906001141561203a575066b1a2bc2ec500006001831115611e8f5760405162461bcd60e51b815260206004820152601960248201527f4e756d62657220706572206d696e742065786365656465642e000000000000006044820152606401610ada565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009216906370a0823190602401602060405180830381865afa158015611f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f249190613de9565b11611f715760405162461bcd60e51b815260206004820152601f60248201527f596f7520646f6e27742068617665206120447265616d204d616368696e652e006044820152606401610ada565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff1615611fe75760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6520736c6f7420616c726561647920757365642e0000000000006044820152606401610ada565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612095565b5067011c37937e080000600a8311156120955760405162461bcd60e51b815260206004820152601960248201527f4e756d62657220706572206d696e742065786365656465642e000000000000006044820152606401610ada565b61209f8382613e02565b3410156120ee5760405162461bcd60e51b815260206004820152601260248201527f57726f6e672045746865722076616c75652e00000000000000000000000000006044820152606401610ada565b60005b8381101561144c5761210283612c9b565b61210b81613d09565b90506120f1565b73ffffffffffffffffffffffffffffffffffffffff82163314156121785760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ada565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60026007556040517f66dabe1eaf0e80a2a0d527275b6044a2c4dce05b26d4cd19aaaaacc623aa714c90600090a1565b6122b03383612d03565b6123225760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610ada565b61232e84848484613085565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461239b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60005b8151811015610d7e576123c98282815181106123bc576123bc613d9d565b6020026020010151612c9b565b6123d281613d09565b905061239e565b60606123e460025490565b82106124325760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b600d61243d8361310e565b60405160200161244e929190613f0f565b6040516020818303038152906040529050919050565b60408051600480825260a082019092526060916000919060208201608080368337019050509050600754816000815181106124a1576124a1613d9d565b6020908102919091010152600254816001815181106124c2576124c2613d9d565b6020908102919091010152600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815261dead600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561253d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125619190613de9565b8160028151811061257457612574613d9d565b6020026020010181815250506007546001146125985767011c37937e0800006125a1565b66b1a2bc2ec500005b816003815181106125b4576125b4613d9d565b6020908102919091010152919050565b60606125cf60025490565b821061261d5760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b600b805461262a90613c86565b80601f016020809104026020016040519081016040528092919081815260200182805461265690613c86565b80156126a35780601f10612678576101008083540402835291602001916126a3565b820191906000526020600020905b81548152906001019060200180831161268657829003601f168201915b50505050509050919050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146127165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60ff6007556040517f4c013bd73202fde3c7cfe26ca486d0882f2c5b2fc9c761b15212f759bd2347dd90600090a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146127ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b73ffffffffffffffffffffffffffffffffffffffff81166128365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ada565b61283f8161300e565b50565b3361284c836119fd565b73ffffffffffffffffffffffffffffffffffffffff16146128af5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e2e0000000000006044820152606401610ada565b6000828152600860205260409081902090516002916128cd91613f34565b602060405180830381855afa1580156128ea573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061290d9190613de9565b60028260405161291d9190613f40565b602060405180830381855afa15801561293a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061295d9190613de9565b14156129ab5760405162461bcd60e51b815260206004820152600f60248201527f4e616d6520756e6368616e6765642e00000000000000000000000000000000006044820152606401610ada565b600082815260086020908152604090912082516129ca92840190613613565b507f8ee52ca76ee5f3a802fa7f1ca9573eafe8571546623ccf3b2aaaae2f9eb619f83383836040516129fe93929190613f5c565b60405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b8051612a8490600c906020840190613613565b507f3853b44548a85d7daef49bed60dd9561e75e717377a53afc7c8e1fc00403c03e816040516119f2919061376b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612b4757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109c957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146109c9565b600254600090821080156109c95750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110612bd157612bd1613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612c55826119fd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ca660025490565b90506122b88110612cf95760405162461bcd60e51b815260206004820152600960248201527f536f6c64206f75742e00000000000000000000000000000000000000000000006044820152606401610ada565b610d7e8282613240565b6000612d0e82612b97565b612d805760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610ada565b6000612d8b836119fd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612dfa57508373ffffffffffffffffffffffffffffffffffffffff16612de284610a61565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e37575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16612e5f826119fd565b73ffffffffffffffffffffffffffffffffffffffff1614612ee85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610ada565b73ffffffffffffffffffffffffffffffffffffffff8216612f705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ada565b612f7b600082612bfb565b8160028281548110612f8f57612f8f613d9d565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613090848484612e3f565b61309c8484848461325a565b61232e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610ada565b60608161314e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613178578061316281613d09565b91506131719050600a83613f9a565b9150613152565b60008167ffffffffffffffff811115613193576131936137e5565b6040519080825280601f01601f1916602001820160405280156131bd576020820181803683370190505b5090505b8415612e37576131d2600183613fae565b91506131df600a86613d71565b6131ea906030613d85565b60f81b8183815181106131ff576131ff613d9d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613239600a86613f9a565b94506131c1565b610d7e828260405180602001604052806000815250613430565b600073ffffffffffffffffffffffffffffffffffffffff84163b15613425576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906132d1903390899088908890600401613fc5565b6020604051808303816000875af192505050801561332a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526133279181019061400e565b60015b6133da573d808015613358576040519150601f19603f3d011682016040523d82523d6000602084013e61335d565b606091505b5080516133d25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610ada565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612e37565b506001949350505050565b61343a83836134b9565b613447600084848461325a565b610c605760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610ada565b73ffffffffffffffffffffffffffffffffffffffff821661351c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ada565b61352581612b97565b156135725760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ada565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461361f90613c86565b90600052602060002090601f0160209004810192826136415760008555613687565b82601f1061365a57805160ff1916838001178555613687565b82800160010185558215613687579182015b8281111561368757825182559160200191906001019061366c565b506118ca9291505b808211156118ca576000815560010161368f565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461283f57600080fd5b6000602082840312156136e357600080fd5b81356136ee816136a3565b9392505050565b60005b838110156137105781810151838201526020016136f8565b8381111561232e5750506000910152565b600081518084526137398160208601602086016136f5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006136ee6020830184613721565b60006020828403121561379057600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461283f57600080fd5b600080604083850312156137cc57600080fd5b82356137d781613797565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385b5761385b6137e5565b604052919050565b600067ffffffffffffffff82111561387d5761387d6137e5565b5060051b60200190565b6000602080838503121561389a57600080fd5b823567ffffffffffffffff8111156138b157600080fd5b8301601f810185136138c257600080fd5b80356138d56138d082613863565b613814565b81815260059190911b820183019083810190878311156138f457600080fd5b928401925b82841015613912578335825292840192908401906138f9565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613957578351151583529284019291840191600101613939565b50909695505050505050565b60008060006060848603121561397857600080fd5b833561398381613797565b9250602084013561399381613797565b929592945050506040919091013590565b600067ffffffffffffffff8311156139be576139be6137e5565b6139ef60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613814565b9050828152838383011115613a0357600080fd5b828260208301376000602084830101529392505050565b600082601f830112613a2b57600080fd5b6136ee838335602085016139a4565b600060208284031215613a4c57600080fd5b813567ffffffffffffffff811115613a6357600080fd5b612e3784828501613a1a565b600060208284031215613a8157600080fd5b81356136ee81613797565b6020808252825182820181905260009190848201906040850190845b8181101561395757835183529284019291840191600101613aa8565b60008060408385031215613ad757600080fd5b8235613ae281613797565b915060208301358015158114613af757600080fd5b809150509250929050565b60008060008060808587031215613b1857600080fd5b8435613b2381613797565b93506020850135613b3381613797565b925060408501359150606085013567ffffffffffffffff811115613b5657600080fd5b8501601f81018713613b6757600080fd5b613b76878235602084016139a4565b91505092959194509250565b60006020808385031215613b9557600080fd5b823567ffffffffffffffff811115613bac57600080fd5b8301601f81018513613bbd57600080fd5b8035613bcb6138d082613863565b81815260059190911b82018301908381019087831115613bea57600080fd5b928401925b82841015613912578335613c0281613797565b82529284019290840190613bef565b60008060408385031215613c2457600080fd5b8235613c2f81613797565b91506020830135613af781613797565b60008060408385031215613c5257600080fd5b82359150602083013567ffffffffffffffff811115613c7057600080fd5b613c7c85828601613a1a565b9150509250929050565b600181811c90821680613c9a57607f821691505b60208210811415613cd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d3b57613d3b613cda565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613d8057613d80613d42565b500690565b60008219821115613d9857613d98613cda565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215613dde57600080fd5b81516136ee81613797565b600060208284031215613dfb57600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3a57613e3a613cda565b500290565b8054600090600181811c9080831680613e5957607f831692505b6020808410821415613e94577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b818015613ea85760018114613ed757613f03565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613f03565b876000528160002060005b86811015613efb5781548b820152908501908301613ee2565b505084890196505b50505050505092915050565b6000613f1b8285613e3f565b8351613f2b8183602088016136f5565b01949350505050565b60006136ee8284613e3f565b60008251613f528184602087016136f5565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000613f916060830184613721565b95945050505050565b600082613fa957613fa9613d42565b500490565b600082821015613fc057613fc0613cda565b500390565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526140046080830184613721565b9695505050505050565b60006020828403121561402057600080fd5b81516136ee816136a356fea2646970667358221220cf5b394318eaf9af892695b49543dee01872443b1dafd3504d52a6130430fa0c64736f6c634300080a0033536f7261277320447265616d776f726c643a204c5543494420445245414d494e4768747470733a2f2f736f726173647265616d776f726c642e696f2f746f6b656e732f6461726b2f

Deployed Bytecode

0x6080604052600436106103295760003560e01c80636d7c82bb116101a5578063c5da5cbe116100ec578063e985e9c511610095578063f47c84c51161006f578063f47c84c5146108ed578063f7b8ad6214610903578063f84b40dc14610933578063ffe630b51461095357600080fd5b8063e985e9c514610862578063ee55efee146108b8578063f2fde38b146108cd57600080fd5b8063d80528ae116100c6578063d80528ae14610817578063d85b2ba01461082c578063d9b137b21461084257600080fd5b8063c5da5cbe146107c6578063c87b56dd146107db578063d2d8cb67146107fb57600080fd5b8063a0712d681161014e578063b585209b11610128578063b585209b14610771578063b88d4fde14610786578063b98877e2146107a657600080fd5b8063a0712d68146106fe578063a1807c2114610711578063a22cb4651461075157600080fd5b80638462151c1161017f5780638462151c146106915780638da5cb5b146106be57806395d89b41146106e957600080fd5b80636d7c82bb1461064157806370a082311461065c578063715018a61461067c57600080fd5b80632f745c59116102745780634f6ccce71161021d578063603f4d52116101f7578063603f4d52146105e15780636352211e146105f75780636373a6b1146106175780636c0360eb1461062c57600080fd5b80634f6ccce71461058157806355f804b3146105a15780635a3c7d26146105c157600080fd5b80633ccfd60b1161024e5780633ccfd60b146105375780633df5f0fa1461054c57806342842e0e1461056157600080fd5b80632f745c59146104e2578063310495ab1461050257806333bffccc1461052257600080fd5b80631053eff4116102d65780631d5afc25116102b05780631d5afc25146104755780631efb8d2e1461049557806323b872dd146104c257600080fd5b80631053eff41461042157806311b79a781461044157806318160ddd1461045657600080fd5b8063095ea7b311610307578063095ea7b3146103ca5780630a912fc4146103ec5780630d3c69b41461040157600080fd5b806301ffc9a71461032e57806306fdde0314610363578063081812fc14610385575b600080fd5b34801561033a57600080fd5b5061034e6103493660046136d1565b610973565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b506103786109cf565b60405161035a919061376b565b34801561039157600080fd5b506103a56103a036600461377e565b610a61565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161035a565b3480156103d657600080fd5b506103ea6103e53660046137b9565b610b0c565b005b3480156103f857600080fd5b50610378610c65565b34801561040d57600080fd5b506103ea61041c36600461377e565b610cf3565b34801561042d57600080fd5b506103ea61043c366004613887565b610d82565b34801561044d57600080fd5b506103ea6110b6565b34801561046257600080fd5b506002545b60405190815260200161035a565b34801561048157600080fd5b506103ea610490366004613887565b61114d565b3480156104a157600080fd5b506104b56104b0366004613887565b611457565b60405161035a919061391d565b3480156104ce57600080fd5b506103ea6104dd366004613963565b61152a565b3480156104ee57600080fd5b506104676104fd3660046137b9565b6115b1565b34801561050e57600080fd5b5061037861051d36600461377e565b611679565b34801561052e57600080fd5b506103ea611692565b34801561054357600080fd5b506103ea611729565b34801561055857600080fd5b506103ea6117bf565b34801561056d57600080fd5b506103ea61057c366004613963565b611856565b34801561058d57600080fd5b5061046761059c36600461377e565b611871565b3480156105ad57600080fd5b506103ea6105bc366004613a3a565b6118ce565b3480156105cd57600080fd5b506103ea6105dc366004613a3a565b611948565b3480156105ed57600080fd5b5061046760075481565b34801561060357600080fd5b506103a561061236600461377e565b6119fd565b34801561062357600080fd5b50610378611aaa565b34801561063857600080fd5b50610378611ab7565b34801561064d57600080fd5b5061046766b1a2bc2ec5000081565b34801561066857600080fd5b50610467610677366004613a6f565b611ac4565b34801561068857600080fd5b506103ea611bc3565b34801561069d57600080fd5b506106b16106ac366004613a6f565b611c36565b60405161035a9190613a8c565b3480156106ca57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff166103a5565b3480156106f557600080fd5b50610378611d1c565b6103ea61070c36600461377e565b611d2b565b34801561071d57600080fd5b5061034e61072c36600461377e565b600881901c6000908152600a6020526040902054600160ff9092169190911b16151590565b34801561075d57600080fd5b506103ea61076c366004613ac4565b612112565b34801561077d57600080fd5b506103ea61220f565b34801561079257600080fd5b506103ea6107a1366004613b02565b6122a6565b3480156107b257600080fd5b506103ea6107c1366004613b82565b612334565b3480156107d257600080fd5b50610467600a81565b3480156107e757600080fd5b506103786107f636600461377e565b6123d9565b34801561080757600080fd5b5061046767011c37937e08000081565b34801561082357600080fd5b506106b1612464565b34801561083857600080fd5b506103a561dead81565b34801561084e57600080fd5b5061037861085d36600461377e565b6125c4565b34801561086e57600080fd5b5061034e61087d366004613c11565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156108c457600080fd5b506103ea6126af565b3480156108d957600080fd5b506103ea6108e8366004613a6f565b612746565b3480156108f957600080fd5b506104676122b881565b34801561090f57600080fd5b5061034e61091e366004613a6f565b60096020526000908152604090205460ff1681565b34801561093f57600080fd5b506103ea61094e366004613c3f565b612842565b34801561095f57600080fd5b506103ea61096e366004613a3a565b612a0a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806109c957506109c982612ab4565b92915050565b6060600080546109de90613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90613c86565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b6000610a6c82612b97565b610ae35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b17826119fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bbb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610ada565b3373ffffffffffffffffffffffffffffffffffffffff82161480610be45750610be4813361087d565b610c565760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ada565b610c608383612bfb565b505050565b600b8054610c7290613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9e90613c86565b8015610ceb5780601f10610cc057610100808354040283529160200191610ceb565b820191906000526020600020905b815481529060010190602001808311610cce57829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d5a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60005b81811015610d7e57610d6e33612c9b565b610d7781613d09565b9050610d5d565b5050565b60026006541415610dd55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ada565b6002600655600754600314610e2c5760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f70656e2e00000000000000000000000000000000000000000000006044820152606401610ada565b80518015801590610e455750610e43600382613d71565b155b610eb75760405162461bcd60e51b815260206004820152602760248201527f506c65617365207375626d6974206120706f736974697665206d756c7469706c60448201527f65206f6620332e000000000000000000000000000000000000000000000000006064820152608401610ada565b337f8000000000000000000000000000000000000000000000000000000000000000806000805b8581101561109a5760005b600381101561107e57600088610eff8385613d85565b81518110610f0f57610f0f613d9d565b60209081029190910101519050600881901c60ff8216868214610f5757878714610f45576000878152600a602052604090208690555b6000828152600a602052604090205495505b90955085906001811b8681161580156110185750600e546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff8c8116921690636352211e90602401602060405180830381865afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190613dcc565b73ffffffffffffffffffffffffffffffffffffffff16145b6110645760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964207375626d697373696f6e2e000000000000000000000000006044820152606401610ada565b8087179650505050508061107790613d09565b9050610ee9565b5061108885612c9b565b611093600382613d85565b9050610ede565b506000918252600a602052604090912055505060016006555050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461111d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60046007556040517f6377a4a336c05e3ee518eeabaf5eaec5d85a85254b89f317400655902496cabb90600090a1565b600260065414156111a05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ada565b60026006556007546004146111f75760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f70656e2e00000000000000000000000000000000000000000000006044820152606401610ada565b80518015801590611209575060018116155b61127b5760405162461bcd60e51b815260206004820152602760248201527f506c65617365207375626d6974206120706f736974697665206d756c7469706c60448201527f65206f6620322e000000000000000000000000000000000000000000000000006064820152608401610ada565b3360005b8281101561144c57600e54845173ffffffffffffffffffffffffffffffffffffffff909116906323b872dd90849061dead908890869081106112c3576112c3613d9d565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561134257600080fd5b505af1158015611356573d6000803e3d6000fd5b5050600e5473ffffffffffffffffffffffffffffffffffffffff1691506323b872dd90508361dead8761138a866001613d85565b8151811061139a5761139a613d9d565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561141957600080fd5b505af115801561142d573d6000803e3d6000fd5b5050505061143a82612c9b565b611445600282613d85565b905061127f565b505060016006555050565b805160609060008167ffffffffffffffff811115611477576114776137e5565b6040519080825280602002602001820160405280156114a0578160200160208202803683370190505b50905060005b82811015611522576114f08582815181106114c3576114c3613d9d565b6020026020010151600881901c6000908152600a6020526040902054600160ff9092169190911b16151590565b82828151811061150257611502613d9d565b9115156020928302919091019091015261151b81613d09565b90506114a6565b509392505050565b6115343382612d03565b6115a65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610ada565b610c60838383612e3f565b6002546000908190815b8181101561163057600281815481106115d6576115d6613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8781169116141561162057848314156116145792506109c9915050565b61161d83613d09565b92505b61162981613d09565b90506115bb565b5060405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b60086020526000908152604090208054610c7290613c86565b60055473ffffffffffffffffffffffffffffffffffffffff1633146116f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60016007556040517faa7f66109fc44f83151144a97120f5d50861e58565b5fba86db13d2157273f3790600090a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146117905760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b6040514790339082156108fc029083906000818181858888f19350505050158015610d7e573d6000803e3d6000fd5b60055473ffffffffffffffffffffffffffffffffffffffff1633146118265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60036007556040517f455fea493f186fe020ff970d7666217e6e9fa5d07946109a440fc5a476e4398f90600090a1565b610c60838383604051806020016040528060008152506122a6565b600061187c60025490565b82106118ca5760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146119355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b8051610d7e90600d906020840190613613565b60055473ffffffffffffffffffffffffffffffffffffffff1633146119af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b80516119c290600b906020840190613613565b507f0c36b2588cd03c71dd3534d1649d17d37de28a093cd238454fcf722fc8165db6816040516119f2919061376b565b60405180910390a150565b60008060028381548110611a1357611a13613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050806109c95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610ada565b600c8054610c7290613c86565b600d8054610c7290613c86565b600073ffffffffffffffffffffffffffffffffffffffff8216611b4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610ada565b600254600090815b81811015611bba5760028181548110611b7257611b72613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415611baa57611ba783613d09565b92505b611bb381613d09565b9050611b57565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611c2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b611c34600061300e565b565b60606000611c4383611ac4565b67ffffffffffffffff811115611c5b57611c5b6137e5565b604051908082528060200260200182016040528015611c84578160200160208202803683370190505b50600254909150600090815b81811015611d125760028181548110611cab57611cab613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff87811691161415611d0257808484611ce381613d09565b955081518110611cf557611cf5613d9d565b6020026020010181815250505b611d0b81613d09565b9050611c90565b5091949350505050565b6060600180546109de90613c86565b60026006541415611d7e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ada565b6002600655600754600311611dd55760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f70656e2e00000000000000000000000000000000000000000000006044820152606401610ada565b60008111611e255760405162461bcd60e51b815260206004820152601c60248201527f4d696e696d756d206e756d62657220746f206d696e7420697320312e000000006044820152606401610ada565b60075433906000906001141561203a575066b1a2bc2ec500006001831115611e8f5760405162461bcd60e51b815260206004820152601960248201527f4e756d62657220706572206d696e742065786365656465642e000000000000006044820152606401610ada565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009216906370a0823190602401602060405180830381865afa158015611f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f249190613de9565b11611f715760405162461bcd60e51b815260206004820152601f60248201527f596f7520646f6e27742068617665206120447265616d204d616368696e652e006044820152606401610ada565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff1615611fe75760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6520736c6f7420616c726561647920757365642e0000000000006044820152606401610ada565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612095565b5067011c37937e080000600a8311156120955760405162461bcd60e51b815260206004820152601960248201527f4e756d62657220706572206d696e742065786365656465642e000000000000006044820152606401610ada565b61209f8382613e02565b3410156120ee5760405162461bcd60e51b815260206004820152601260248201527f57726f6e672045746865722076616c75652e00000000000000000000000000006044820152606401610ada565b60005b8381101561144c5761210283612c9b565b61210b81613d09565b90506120f1565b73ffffffffffffffffffffffffffffffffffffffff82163314156121785760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ada565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60026007556040517f66dabe1eaf0e80a2a0d527275b6044a2c4dce05b26d4cd19aaaaacc623aa714c90600090a1565b6122b03383612d03565b6123225760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610ada565b61232e84848484613085565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461239b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60005b8151811015610d7e576123c98282815181106123bc576123bc613d9d565b6020026020010151612c9b565b6123d281613d09565b905061239e565b60606123e460025490565b82106124325760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b600d61243d8361310e565b60405160200161244e929190613f0f565b6040516020818303038152906040529050919050565b60408051600480825260a082019092526060916000919060208201608080368337019050509050600754816000815181106124a1576124a1613d9d565b6020908102919091010152600254816001815181106124c2576124c2613d9d565b6020908102919091010152600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815261dead600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561253d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125619190613de9565b8160028151811061257457612574613d9d565b6020026020010181815250506007546001146125985767011c37937e0800006125a1565b66b1a2bc2ec500005b816003815181106125b4576125b4613d9d565b6020908102919091010152919050565b60606125cf60025490565b821061261d5760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f7420666f756e642e000000000000000000000000000000006044820152606401610ada565b600b805461262a90613c86565b80601f016020809104026020016040519081016040528092919081815260200182805461265690613c86565b80156126a35780601f10612678576101008083540402835291602001916126a3565b820191906000526020600020905b81548152906001019060200180831161268657829003601f168201915b50505050509050919050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146127165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60ff6007556040517f4c013bd73202fde3c7cfe26ca486d0882f2c5b2fc9c761b15212f759bd2347dd90600090a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146127ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b73ffffffffffffffffffffffffffffffffffffffff81166128365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ada565b61283f8161300e565b50565b3361284c836119fd565b73ffffffffffffffffffffffffffffffffffffffff16146128af5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e2e0000000000006044820152606401610ada565b6000828152600860205260409081902090516002916128cd91613f34565b602060405180830381855afa1580156128ea573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061290d9190613de9565b60028260405161291d9190613f40565b602060405180830381855afa15801561293a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061295d9190613de9565b14156129ab5760405162461bcd60e51b815260206004820152600f60248201527f4e616d6520756e6368616e6765642e00000000000000000000000000000000006044820152606401610ada565b600082815260086020908152604090912082516129ca92840190613613565b507f8ee52ca76ee5f3a802fa7f1ca9573eafe8571546623ccf3b2aaaae2f9eb619f83383836040516129fe93929190613f5c565b60405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b8051612a8490600c906020840190613613565b507f3853b44548a85d7daef49bed60dd9561e75e717377a53afc7c8e1fc00403c03e816040516119f2919061376b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612b4757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109c957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146109c9565b600254600090821080156109c95750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110612bd157612bd1613d9d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612c55826119fd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ca660025490565b90506122b88110612cf95760405162461bcd60e51b815260206004820152600960248201527f536f6c64206f75742e00000000000000000000000000000000000000000000006044820152606401610ada565b610d7e8282613240565b6000612d0e82612b97565b612d805760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610ada565b6000612d8b836119fd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612dfa57508373ffffffffffffffffffffffffffffffffffffffff16612de284610a61565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e37575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16612e5f826119fd565b73ffffffffffffffffffffffffffffffffffffffff1614612ee85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610ada565b73ffffffffffffffffffffffffffffffffffffffff8216612f705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ada565b612f7b600082612bfb565b8160028281548110612f8f57612f8f613d9d565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613090848484612e3f565b61309c8484848461325a565b61232e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610ada565b60608161314e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613178578061316281613d09565b91506131719050600a83613f9a565b9150613152565b60008167ffffffffffffffff811115613193576131936137e5565b6040519080825280601f01601f1916602001820160405280156131bd576020820181803683370190505b5090505b8415612e37576131d2600183613fae565b91506131df600a86613d71565b6131ea906030613d85565b60f81b8183815181106131ff576131ff613d9d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613239600a86613f9a565b94506131c1565b610d7e828260405180602001604052806000815250613430565b600073ffffffffffffffffffffffffffffffffffffffff84163b15613425576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906132d1903390899088908890600401613fc5565b6020604051808303816000875af192505050801561332a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526133279181019061400e565b60015b6133da573d808015613358576040519150601f19603f3d011682016040523d82523d6000602084013e61335d565b606091505b5080516133d25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610ada565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612e37565b506001949350505050565b61343a83836134b9565b613447600084848461325a565b610c605760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610ada565b73ffffffffffffffffffffffffffffffffffffffff821661351c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ada565b61352581612b97565b156135725760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ada565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461361f90613c86565b90600052602060002090601f0160209004810192826136415760008555613687565b82601f1061365a57805160ff1916838001178555613687565b82800160010185558215613687579182015b8281111561368757825182559160200191906001019061366c565b506118ca9291505b808211156118ca576000815560010161368f565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461283f57600080fd5b6000602082840312156136e357600080fd5b81356136ee816136a3565b9392505050565b60005b838110156137105781810151838201526020016136f8565b8381111561232e5750506000910152565b600081518084526137398160208601602086016136f5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006136ee6020830184613721565b60006020828403121561379057600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461283f57600080fd5b600080604083850312156137cc57600080fd5b82356137d781613797565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385b5761385b6137e5565b604052919050565b600067ffffffffffffffff82111561387d5761387d6137e5565b5060051b60200190565b6000602080838503121561389a57600080fd5b823567ffffffffffffffff8111156138b157600080fd5b8301601f810185136138c257600080fd5b80356138d56138d082613863565b613814565b81815260059190911b820183019083810190878311156138f457600080fd5b928401925b82841015613912578335825292840192908401906138f9565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613957578351151583529284019291840191600101613939565b50909695505050505050565b60008060006060848603121561397857600080fd5b833561398381613797565b9250602084013561399381613797565b929592945050506040919091013590565b600067ffffffffffffffff8311156139be576139be6137e5565b6139ef60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613814565b9050828152838383011115613a0357600080fd5b828260208301376000602084830101529392505050565b600082601f830112613a2b57600080fd5b6136ee838335602085016139a4565b600060208284031215613a4c57600080fd5b813567ffffffffffffffff811115613a6357600080fd5b612e3784828501613a1a565b600060208284031215613a8157600080fd5b81356136ee81613797565b6020808252825182820181905260009190848201906040850190845b8181101561395757835183529284019291840191600101613aa8565b60008060408385031215613ad757600080fd5b8235613ae281613797565b915060208301358015158114613af757600080fd5b809150509250929050565b60008060008060808587031215613b1857600080fd5b8435613b2381613797565b93506020850135613b3381613797565b925060408501359150606085013567ffffffffffffffff811115613b5657600080fd5b8501601f81018713613b6757600080fd5b613b76878235602084016139a4565b91505092959194509250565b60006020808385031215613b9557600080fd5b823567ffffffffffffffff811115613bac57600080fd5b8301601f81018513613bbd57600080fd5b8035613bcb6138d082613863565b81815260059190911b82018301908381019087831115613bea57600080fd5b928401925b82841015613912578335613c0281613797565b82529284019290840190613bef565b60008060408385031215613c2457600080fd5b8235613c2f81613797565b91506020830135613af781613797565b60008060408385031215613c5257600080fd5b82359150602083013567ffffffffffffffff811115613c7057600080fd5b613c7c85828601613a1a565b9150509250929050565b600181811c90821680613c9a57607f821691505b60208210811415613cd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d3b57613d3b613cda565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613d8057613d80613d42565b500690565b60008219821115613d9857613d98613cda565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215613dde57600080fd5b81516136ee81613797565b600060208284031215613dfb57600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3a57613e3a613cda565b500290565b8054600090600181811c9080831680613e5957607f831692505b6020808410821415613e94577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b818015613ea85760018114613ed757613f03565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613f03565b876000528160002060005b86811015613efb5781548b820152908501908301613ee2565b505084890196505b50505050505092915050565b6000613f1b8285613e3f565b8351613f2b8183602088016136f5565b01949350505050565b60006136ee8284613e3f565b60008251613f528184602087016136f5565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000613f916060830184613721565b95945050505050565b600082613fa957613fa9613d42565b500490565b600082821015613fc057613fc0613cda565b500390565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526140046080830184613721565b9695505050505050565b60006020828403121561402057600080fd5b81516136ee816136a356fea2646970667358221220cf5b394318eaf9af892695b49543dee01872443b1dafd3504d52a6130430fa0c64736f6c634300080a0033

Deployed Bytecode Sourcemap

35723:10235:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34489:224;;;;;;;;;;-1:-1:-1;34489:224:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;34489:224:0;;;;;;;;28384:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29035:221::-;;;;;;;;;;-1:-1:-1;29035:221:0;;;;;:::i;:::-;;:::i;:::-;;;1809:42:1;1797:55;;;1779:74;;1767:2;1752:18;29035:221:0;1633:226:1;28612:411:0;;;;;;;;;;-1:-1:-1;28612:411:0;;;;;:::i;:::-;;:::i;:::-;;36760:52;;;;;;;;;;;;;:::i;39974:155::-;;;;;;;;;;-1:-1:-1;39974:155:0;;;;;:::i;:::-;;:::i;42394:1278::-;;;;;;;;;;-1:-1:-1;42394:1278:0;;;;;:::i;:::-;;:::i;38938:111::-;;;;;;;;;;;;;:::i;35215:110::-;;;;;;;;;;-1:-1:-1;35303:7:0;:14;35215:110;;;4101:25:1;;;4089:2;4074:18;35215:110:0;3955:177:1;43735:729:0;;;;;;;;;;-1:-1:-1;43735:729:0;;;;;:::i;:::-;;:::i;42027:301::-;;;;;;;;;;-1:-1:-1;42027:301:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29751:339::-;;;;;;;;;;-1:-1:-1;29751:339:0;;;;;:::i;:::-;;:::i;34725:478::-;;;;;;;;;;-1:-1:-1;34725:478:0;;;;;:::i;:::-;;:::i;36413:41::-;;;;;;;;;;-1:-1:-1;36413:41:0;;;;;:::i;:::-;;:::i;38479:103::-;;;;;;;;;;;;;:::i;37888:141::-;;;;;;;;;;;;;:::i;38781:113::-;;;;;;;;;;;;;:::i;30102:185::-;;;;;;;;;;-1:-1:-1;30102:185:0;;;;;:::i;:::-;;:::i;35337:193::-;;;;;;;;;;-1:-1:-1;35337:193:0;;;;;:::i;:::-;;:::i;38339:98::-;;;;;;;;;;-1:-1:-1;38339:98:0;;;;;:::i;:::-;;:::i;40178:134::-;;;;;;;;;;-1:-1:-1;40178:134:0;;;;;:::i;:::-;;:::i;36338:21::-;;;;;;;;;;;;;;;;28133:239;;;;;;;;;;-1:-1:-1;28133:239:0;;;;;:::i;:::-;;:::i;36990:24::-;;;;;;;;;;;;;:::i;37051:21::-;;;;;;;;;;;;;:::i;35924:61::-;;;;;;;;;;;;35968:17;35924:61;;27733:388;;;;;;;;;;-1:-1:-1;27733:388:0;;;;;:::i;:::-;;:::i;22465:94::-;;;;;;;;;;;;;:::i;44537:349::-;;;;;;;;;;-1:-1:-1;44537:349:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21814:87::-;;;;;;;;;;-1:-1:-1;21887:6:0;;;;21814:87;;28496:104;;;;;;;;;;;;;:::i;40565:1053::-;;;;;;:::i;:::-;;:::i;41692:238::-;;;;;;;;;;-1:-1:-1;41692:238:0;;;;;:::i;:::-;41819:1;41814:6;;;41758:4;41867:20;;;:17;:20;;;;;;41910:1;41844:3;41840:7;;;41910:6;;;;41905:12;:17;;;41692:238;29268:295;;;;;;;;;;-1:-1:-1;29268:295:0;;;;;:::i;:::-;;:::i;38627:109::-;;;;;;;;;;;;;:::i;30299:328::-;;;;;;;;;;-1:-1:-1;30299:328:0;;;;;:::i;:::-;;:::i;39650:178::-;;;;;;;;;;-1:-1:-1;39650:178:0;;;;;:::i;:::-;;:::i;36006:52::-;;;;;;;;;;;;36056:2;36006:52;;45329:218;;;;;;;;;;-1:-1:-1;45329:218:0;;;;;:::i;:::-;;:::i;35851:52::-;;;;;;;;;;;;35886:17;35851:52;;45637:318;;;;;;;;;;;;;:::i;36150:89::-;;;;;;;;;;;;36197:42;36150:89;;40366:159;;;;;;;;;;-1:-1:-1;40366:159:0;;;;;:::i;:::-;;:::i;29575:164::-;;;;;;;;;;-1:-1:-1;29575:164:0;;;;;:::i;:::-;29696:25;;;;29672:4;29696:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29575:164;39087:100;;;;;;;;;;;;;:::i;22714:192::-;;;;;;;;;;-1:-1:-1;22714:192:0;;;;;:::i;:::-;;:::i;36103:38::-;;;;;;;;;;;;36137:4;36103:38;;36538:43;;;;;;;;;;-1:-1:-1;36538:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44935:330;;;;;;;;;;-1:-1:-1;44935:330:0;;;;;:::i;:::-;;:::i;38072:152::-;;;;;;;;;;-1:-1:-1;38072:152:0;;;;;:::i;:::-;;:::i;34489:224::-;34591:4;34615:50;;;34630:35;34615:50;;:90;;;34669:36;34693:11;34669:23;:36::i;:::-;34608:97;34489:224;-1:-1:-1;;34489:224:0:o;28384:100::-;28438:13;28471:5;28464:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28384:100;:::o;29035:221::-;29111:7;29139:16;29147:7;29139;:16::i;:::-;29131:73;;;;-1:-1:-1;;;29131:73:0;;10783:2:1;29131:73:0;;;10765:21:1;10822:2;10802:18;;;10795:30;10861:34;10841:18;;;10834:62;10932:14;10912:18;;;10905:42;10964:19;;29131:73:0;;;;;;;;;-1:-1:-1;29224:24:0;;;;:15;:24;;;;;;;;;29035:221::o;28612:411::-;28693:13;28709:23;28724:7;28709:14;:23::i;:::-;28693:39;;28757:5;28751:11;;:2;:11;;;;28743:57;;;;-1:-1:-1;;;28743:57:0;;11196:2:1;28743:57:0;;;11178:21:1;11235:2;11215:18;;;11208:30;11274:34;11254:18;;;11247:62;11345:3;11325:18;;;11318:31;11366:19;;28743:57:0;10994:397:1;28743:57:0;16428:10;28835:21;;;;;:62;;-1:-1:-1;28860:37:0;28877:5;16428:10;29575:164;:::i;28860:37::-;28813:168;;;;-1:-1:-1;;;28813:168:0;;11598:2:1;28813:168:0;;;11580:21:1;11637:2;11617:18;;;11610:30;11676:34;11656:18;;;11649:62;11747:26;11727:18;;;11720:54;11791:19;;28813:168:0;11396:420:1;28813:168:0;28994:21;29003:2;29007:7;28994:8;:21::i;:::-;28682:341;28612:411;;:::o;36760:52::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39974:155::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;40043:6:::1;40038:84;40059:10;40055:1;:14;40038:84;;;40091:19;40099:10;40091:7;:19::i;:::-;40071:3;::::0;::::1;:::i;:::-;;;40038:84;;;;39974:155:::0;:::o;42394:1278::-;24847:1;25443:7;;:19;;25435:63;;;;-1:-1:-1;;;25435:63:0;;12773:2:1;25435:63:0;;;12755:21:1;12812:2;12792:18;;;12785:30;12851:33;12831:18;;;12824:61;12902:18;;25435:63:0;12571:355:1;25435:63:0;24847:1;25576:7;:18;42482:9:::1;::::0;42495:1:::1;42482:14;42474:36;;;::::0;-1:-1:-1;;;42474:36:0;;13133:2:1;42474:36:0::1;::::0;::::1;13115:21:1::0;13172:1;13152:18;;;13145:29;13210:11;13190:18;;;13183:39;13239:18;;42474:36:0::1;12931:332:1::0;42474:36:0::1;42530:18:::0;;42567:5;;;;;:19:::1;;-1:-1:-1::0;42576:5:0::1;42580:1;42576::::0;:5:::1;:::i;:::-;:10:::0;42567:19:::1;42559:71;;;::::0;-1:-1:-1;;;42559:71:0;;13776:2:1;42559:71:0::1;::::0;::::1;13758:21:1::0;13815:2;13795:18;;;13788:30;13854:34;13834:18;;;13827:62;13925:9;13905:18;;;13898:37;13952:19;;42559:71:0::1;13574:403:1::0;42559:71:0::1;42658:10;42699:8;::::0;42641:14:::1;::::0;42771:851:::1;42792:1;42788;:5;42771:851;;;42823:6;42818:763;42839:1;42835;:5;42818:763;;;42866:6;42875:11:::0;42887:5:::1;42891:1:::0;42887;:5:::1;:::i;:::-;42875:18;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;42926:1:0::1;42921:6:::0;;::::1;42959:3;42955:7:::0;::::1;42985:10:::0;;::::1;42981:212;;43033:12;43024:5;:21;43020:106;;43074:24;::::0;;;:17:::1;:24;::::0;;;;:28;;;43020:106:::1;43153:20;::::0;;;:17:::1;:20;::::0;;;;;;-1:-1:-1;42981:212:0::1;43220:1:::0;;-1:-1:-1;43220:1:0;;43249::::1;:6:::0;::::1;43334:5:::0;;::::1;:10:::0;:50;::::1;;;-1:-1:-1::0;43348:15:0::1;::::0;:26:::1;::::0;;;;::::1;::::0;::::1;4101:25:1::0;;;43348:36:0::1;::::0;;::::1;::::0;:15:::1;::::0;:23:::1;::::0;4074:18:1;;43348:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;;43334:50;43326:82;;;::::0;-1:-1:-1;;;43326:82:0;;14762:2:1;43326:82:0::1;::::0;::::1;14744:21:1::0;14801:2;14781:18;;;14774:30;14840:21;14820:18;;;14813:49;14879:18;;43326:82:0::1;14560:343:1::0;43326:82:0::1;43564:1;43560;:5;43556:9;;42847:734;;;;42842:3;;;;:::i;:::-;;;42818:763;;;;43595:15;43603:6;43595:7;:15::i;:::-;42795:6;42800:1;42795:6:::0;::::1;:::i;:::-;;;42771:851;;;-1:-1:-1::0;43632:24:0::1;::::0;;;:17:::1;:24;::::0;;;;;:28;-1:-1:-1;;24803:1:0;25755:7;:22;-1:-1:-1;;42394:1278:0:o;38938:111::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;39005:1:::1;38993:9;:13:::0;39022:19:::1;::::0;::::1;::::0;;;::::1;38938:111::o:0;43735:729::-;24847:1;25443:7;;:19;;25435:63;;;;-1:-1:-1;;;25435:63:0;;12773:2:1;25435:63:0;;;12755:21:1;12812:2;12792:18;;;12785:30;12851:33;12831:18;;;12824:61;12902:18;;25435:63:0;12571:355:1;25435:63:0;24847:1;25576:7;:18;43822:9:::1;::::0;43835:1:::1;43822:14;43814:36;;;::::0;-1:-1:-1;;;43814:36:0;;13133:2:1;43814:36:0::1;::::0;::::1;13115:21:1::0;13172:1;13152:18;;;13145:29;13210:11;13190:18;;;13183:39;13239:18;;43814:36:0::1;12931:332:1::0;43814:36:0::1;43870:18:::0;;43907:5;;;;;:19:::1;;-1:-1:-1::0;43920:1:0::1;43916:5:::0;::::1;:10:::0;43907:19:::1;43899:71;;;::::0;-1:-1:-1;;;43899:71:0;;15110:2:1;43899:71:0::1;::::0;::::1;15092:21:1::0;15149:2;15129:18;;;15122:30;15188:34;15168:18;;;15161:62;15259:9;15239:18;;;15232:37;15286:19;;43899:71:0::1;14908:403:1::0;43899:71:0::1;43998:10;43981:14;44019:435;44040:1;44036;:5;44019:435;;;44245:15;::::0;44304:14;;44245:15:::1;::::0;;::::1;::::0;:28:::1;::::0;44274:6;;36197:42:::1;::::0;44304:11;;44316:1;;44304:14;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;44245:74:::1;::::0;;::::1;::::0;;;;;;15528:42:1;15597:15;;;44245:74:0::1;::::0;::::1;15579:34:1::0;15649:15;;;;15629:18;;;15622:43;15681:18;;;15674:34;15491:18;;44245:74:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44334:15:0::1;::::0;::::1;;::::0;-1:-1:-1;44334:28:0::1;::::0;-1:-1:-1;44363:6:0;36197:42:::1;44393:11:::0;44405:5:::1;:1:::0;44334:15;44405:5:::1;:::i;:::-;44393:18;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;44334:78:::1;::::0;;::::1;::::0;;;;;;15528:42:1;15597:15;;;44334:78:0::1;::::0;::::1;15579:34:1::0;15649:15;;;;15629:18;;;15622:43;15681:18;;;15674:34;15491:18;;44334:78:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44427:15;44435:6;44427:7;:15::i;:::-;44043:6;44048:1;44043:6:::0;::::1;:::i;:::-;;;44019:435;;;-1:-1:-1::0;;24803:1:0;25755:7;:22;-1:-1:-1;;43735:729:0:o;42027:301::-;42133:18;;42098:13;;42124:6;42133:18;42180:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42180:13:0;;42162:31;;42209:6;42204:98;42225:1;42221;:5;42204:98;;;42255:35;42275:11;42287:1;42275:14;;;;;;;;:::i;:::-;;;;;;;41819:1;41814:6;;;41758:4;41867:20;;;:17;:20;;;;;;41910:1;41844:3;41840:7;;;41910:6;;;;41905:12;:17;;;41692:238;42255:35;42248:1;42250;42248:4;;;;;;;;:::i;:::-;:42;;;:4;;;;;;;;;;;:42;42228:3;;;:::i;:::-;;;42204:98;;;-1:-1:-1;42319:1:0;42027:301;-1:-1:-1;;;42027:301:0:o;29751:339::-;29946:41;16428:10;29979:7;29946:18;:41::i;:::-;29938:103;;;;-1:-1:-1;;;29938:103:0;;15921:2:1;29938:103:0;;;15903:21:1;15960:2;15940:18;;;15933:30;15999:34;15979:18;;;15972:62;16070:19;16050:18;;;16043:47;16107:19;;29938:103:0;15719:413:1;29938:103:0;30054:28;30064:4;30070:2;30074:7;30054:9;:28::i;34725:478::-;34882:7;:14;34814:15;;;;;34907:244;34931:1;34927;:5;34907:244;;;34967:7;34975:1;34967:10;;;;;;;;:::i;:::-;;;;;;;;;;;;34958:19;;;34967:10;;34958:19;34954:186;;;35011:5;35002;:14;34998:127;;;35048:1;-1:-1:-1;35041:8:0;;-1:-1:-1;;35041:8:0;34998:127;35098:7;;;:::i;:::-;;;34998:127;34934:3;;;:::i;:::-;;;34907:244;;;-1:-1:-1;35161:34:0;;-1:-1:-1;;;35161:34:0;;16339:2:1;35161:34:0;;;16321:21:1;16378:2;16358:18;;;16351:30;16417:18;16397;;;16390:46;16453:18;;35161:34:0;16137:340:1;36413:41:0;;;;;;;;;;;;;;;;:::i;38479:103::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;38542:1:::1;38530:9;:13:::0;38559:15:::1;::::0;::::1;::::0;;;::::1;38479:103::o:0;37888:141::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;37985:36:::1;::::0;37953:21:::1;::::0;37993:10:::1;::::0;37985:36;::::1;;;::::0;37953:21;;37936:14:::1;37985:36:::0;37936:14;37985:36;37953:21;37993:10;37985:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;38781:113:::0;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;38849:1:::1;38837:9;:13:::0;38866:20:::1;::::0;::::1;::::0;;;::::1;38781:113::o:0;30102:185::-;30240:39;30257:4;30263:2;30267:7;30240:39;;;;;;;;;;;;:16;:39::i;35337:193::-;35412:7;35448:30;35303:7;:14;;35215:110;35448:30;35440:5;:38;35432:67;;;;-1:-1:-1;;;35432:67:0;;16339:2:1;35432:67:0;;;16321:21:1;16378:2;16358:18;;;16351:30;16417:18;16397;;;16390:46;16453:18;;35432:67:0;16137:340:1;35432:67:0;-1:-1:-1;35517:5:0;35337:193::o;38339:98::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;38411:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;40178:134::-:0;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;40250:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;40284:20;40295:8;40284:20;;;;;;:::i;:::-;;;;;;;;40178:134:::0;:::o;28133:239::-;28205:7;28225:13;28241:7;28249;28241:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;28276:19:0;28268:73;;;;-1:-1:-1;;;28268:73:0;;16684:2:1;28268:73:0;;;16666:21:1;16723:2;16703:18;;;16696:30;16762:34;16742:18;;;16735:62;16833:11;16813:18;;;16806:39;16862:19;;28268:73:0;16482:405:1;36990:24:0;;;;;;;:::i;37051:21::-;;;;;;;:::i;27733:388::-;27805:7;27833:19;;;27825:74;;;;-1:-1:-1;;;27825:74:0;;17094:2:1;27825:74:0;;;17076:21:1;17133:2;17113:18;;;17106:30;17172:34;17152:18;;;17145:62;17243:12;17223:18;;;17216:40;17273:19;;27825:74:0;16892:406:1;27825:74:0;27944:7;:14;27910:10;;;27969:122;27990:1;27986;:5;27969:122;;;28026:7;28034:1;28026:10;;;;;;;;:::i;:::-;;;;;;;;;;;;28017:19;;;28026:10;;28017:19;28013:67;;;28057:7;;;:::i;:::-;;;28013:67;27993:3;;;:::i;:::-;;;27969:122;;;-1:-1:-1;28108:5:0;;27733:388;-1:-1:-1;;;27733:388:0:o;22465:94::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;22530:21:::1;22548:1;22530:9;:21::i;:::-;22465:94::o:0;44537:349::-;44599:13;44625:15;44654:17;44664:6;44654:9;:17::i;:::-;44643:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44643:29:0;-1:-1:-1;44713:7:0;:14;44625:47;;-1:-1:-1;44683:6:0;;;44738:122;44755:1;44751;:5;44738:122;;;44792:7;44800:1;44792:10;;;;;;;;:::i;:::-;;;;;;;;;;;;44782:20;;;44792:10;;44782:20;44778:71;;;44832:1;44823;44825:3;;;;:::i;:::-;;;44823:6;;;;;;;;:::i;:::-;;;;;;:10;;;;;44778:71;44758:3;;;:::i;:::-;;;44738:122;;;-1:-1:-1;44877:1:0;;44537:349;-1:-1:-1;;;;44537:349:0:o;28496:104::-;28552:13;28585:7;28578:14;;;;;:::i;40565:1053::-;24847:1;25443:7;;:19;;25435:63;;;;-1:-1:-1;;;25435:63:0;;12773:2:1;25435:63:0;;;12755:21:1;12812:2;12792:18;;;12785:30;12851:33;12831:18;;;12824:61;12902:18;;25435:63:0;12571:355:1;25435:63:0;24847:1;25576:7;:18;40707:9:::1;::::0;40719:1:::1;-1:-1:-1::0;40699:35:0::1;;;::::0;-1:-1:-1;;;40699:35:0;;13133:2:1;40699:35:0::1;::::0;::::1;13115:21:1::0;13172:1;13152:18;;;13145:29;13210:11;13190:18;;;13183:39;13239:18;;40699:35:0::1;12931:332:1::0;40699:35:0::1;40767:1;40754:10;:14;40746:55;;;::::0;-1:-1:-1;;;40746:55:0;;17505:2:1;40746:55:0::1;::::0;::::1;17487:21:1::0;17544:2;17524:18;;;17517:30;17583;17563:18;;;17556:58;17631:18;;40746:55:0::1;17303:352:1::0;40746:55:0::1;40901:9;::::0;40839:10:::1;::::0;40822:14:::1;::::0;40914:1:::1;40901:14;40897:533;;;-1:-1:-1::0;35968:17:0::1;41012:1;40998:15:::0;::::1;;40990:53;;;::::0;-1:-1:-1;;;40990:53:0;;17862:2:1;40990:53:0::1;::::0;::::1;17844:21:1::0;17901:2;17881:18;;;17874:30;17940:27;17920:18;;;17913:55;17985:18;;40990:53:0::1;17660:349:1::0;40990:53:0::1;41066:15;::::0;:33:::1;::::0;;;;:15:::1;1797:55:1::0;;;41066:33:0::1;::::0;::::1;1779:74:1::0;41102:1:0::1;::::0;41066:15:::1;::::0;:25:::1;::::0;1752:18:1;;41066:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;41058:81;;;::::0;-1:-1:-1;;;41058:81:0;;18405:2:1;41058:81:0::1;::::0;::::1;18387:21:1::0;18444:2;18424:18;;;18417:30;18483:33;18463:18;;;18456:61;18534:18;;41058:81:0::1;18203:355:1::0;41058:81:0::1;41163:19;::::0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;41162:20;41154:59;;;::::0;-1:-1:-1;;;41154:59:0;;18765:2:1;41154:59:0::1;::::0;::::1;18747:21:1::0;18804:2;18784:18;;;18777:30;18843:28;18823:18;;;18816:56;18889:18;;41154:59:0::1;18563:350:1::0;41154:59:0::1;41228:19;::::0;::::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;;::::1;41250:4;41228:26;::::0;;40897:533:::1;;;-1:-1:-1::0;35886:17:0::1;36056:2;41348:40:::0;::::1;;41340:78;;;::::0;-1:-1:-1;;;41340:78:0;;17862:2:1;41340:78:0::1;::::0;::::1;17844:21:1::0;17901:2;17881:18;;;17874:30;17940:27;17920:18;;;17913:55;17985:18;;41340:78:0::1;17660:349:1::0;41340:78:0::1;41463:32;41485:10:::0;41463:19;:32:::1;:::i;:::-;41450:9;:45;;41442:76;;;::::0;-1:-1:-1;;;41442:76:0;;19353:2:1;41442:76:0::1;::::0;::::1;19335:21:1::0;19392:2;19372:18;;;19365:30;19431:20;19411:18;;;19404:48;19469:18;;41442:76:0::1;19151:342:1::0;41442:76:0::1;41536:6;41531:80;41552:10;41548:1;:14;41531:80;;;41584:15;41592:6;41584:7;:15::i;:::-;41564:3;::::0;::::1;:::i;:::-;;;41531:80;;29268:295:::0;29371:24;;;16428:10;29371:24;;29363:62;;;;-1:-1:-1;;;29363:62:0;;19700:2:1;29363:62:0;;;19682:21:1;19739:2;19719:18;;;19712:30;19778:27;19758:18;;;19751:55;19823:18;;29363:62:0;19498:349:1;29363:62:0;16428:10;29438:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;29507:48;;586:41:1;;;29438:42:0;;16428:10;29507:48;;559:18:1;29507:48:0;;;;;;;29268:295;;:::o;38627:109::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;38693:1:::1;38681:9;:13:::0;38710:18:::1;::::0;::::1;::::0;;;::::1;38627:109::o:0;30299:328::-;30474:41;16428:10;30507:7;30474:18;:41::i;:::-;30466:103;;;;-1:-1:-1;;;30466:103:0;;15921:2:1;30466:103:0;;;15903:21:1;15960:2;15940:18;;;15933:30;15999:34;15979:18;;;15972:62;16070:19;16050:18;;;16043:47;16107:19;;30466:103:0;15719:413:1;30466:103:0;30580:39;30594:4;30600:2;30604:7;30613:5;30580:13;:39::i;:::-;30299:328;;;;:::o;39650:178::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;39732:6:::1;39727:94;39748:10;:17;39744:1;:21;39727:94;;;39787:22;39795:10;39806:1;39795:13;;;;;;;;:::i;:::-;;;;;;;39787:7;:22::i;:::-;39767:3;::::0;::::1;:::i;:::-;;;39727:94;;45329:218:::0;45398:13;45438;35303:7;:14;;35215:110;45438:13;45432:3;:19;45424:48;;;;-1:-1:-1;;;45424:48:0;;16339:2:1;45424:48:0;;;16321:21:1;16378:2;16358:18;;;16351:30;16417:18;16397;;;16390:46;16453:18;;45424:48:0;16137:340:1;45424:48:0;45514:7;45523:14;:3;:12;:14::i;:::-;45497:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45483:56;;45329:218;;;:::o;45637:318::-;45721:13;;;45732:1;45721:13;;;;;;;;;45677;;45703:15;;45721:13;;;;;;;;;;;-1:-1:-1;45721:13:0;45703:31;;45752:9;;45745:1;45747;45745:4;;;;;;;;:::i;:::-;;;;;;;;;;:16;35303:7;:14;45773:1;45775;45773:4;;;;;;;;:::i;:::-;;;;;;;;;;:20;45812:15;;:47;;;;;36197:42;45812:47;;;1779:74:1;45812:15:0;;;;;:25;;1752:18:1;;45812:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45805:1;45807;45805:4;;;;;;;;:::i;:::-;;;;;;:54;;;;;45877:9;;45890:1;45877:14;:51;;35886:17;45877:51;;;35968:17;45877:51;45870:1;45872;45870:4;;;;;;;;:::i;:::-;;;;;;;;;;:58;45946:1;45637:318;-1:-1:-1;45637:318:0:o;40366:159::-;40418:13;40458;35303:7;:14;;35215:110;40458:13;40452:3;:19;40444:48;;;;-1:-1:-1;;;40444:48:0;;16339:2:1;40444:48:0;;;16321:21:1;16378:2;16358:18;;;16351:30;16417:18;16397;;;16390:46;16453:18;;40444:48:0;16137:340:1;40444:48:0;40510:7;40503:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40366:159;;;:::o;39087:100::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;39148:3:::1;39136:9;:15:::0;39167:12:::1;::::0;::::1;::::0;;;::::1;39087:100::o:0;22714:192::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;22803:22:::1;::::0;::::1;22795:73;;;::::0;-1:-1:-1;;;22795:73:0;;21537:2:1;22795:73:0::1;::::0;::::1;21519:21:1::0;21576:2;21556:18;;;21549:30;21615:34;21595:18;;;21588:62;21686:8;21666:18;;;21659:36;21712:19;;22795:73:0::1;21335:402:1::0;22795:73:0::1;22879:19;22889:8;22879:9;:19::i;:::-;22714:192:::0;:::o;44935:330::-;45033:10;45017:12;45025:3;45017:7;:12::i;:::-;:26;;;45009:65;;;;-1:-1:-1;;;45009:65:0;;21944:2:1;45009:65:0;;;21926:21:1;21983:2;21963:18;;;21956:30;22022:28;22002:18;;;21995:56;22068:18;;45009:65:0;21742:350:1;45009:65:0;45130:15;;;;:10;:15;;;;;;;45117:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45093:20;45106:5;45093:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;45085:82;;;;-1:-1:-1;;;45085:82:0;;22971:2:1;45085:82:0;;;22953:21:1;23010:2;22990:18;;;22983:30;23049:17;23029:18;;;23022:45;23084:18;;45085:82:0;22769:339:1;45085:82:0;45178:15;;;;:10;:15;;;;;;;;:23;;;;;;;;:::i;:::-;;45217:40;45234:10;45246:3;45251:5;45217:40;;;;;;;;:::i;:::-;;;;;;;;44935:330;;:::o;38072:152::-;21887:6;;22034:23;21887:6;16428:10;22034:23;22026:68;;;;-1:-1:-1;;;22026:68:0;;12023:2:1;22026:68:0;;;12005:21:1;;;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12153:18;;22026:68:0;11821:356:1;22026:68:0;38150:24;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;:::-;;38190:26;38204:11;38190:26;;;;;;:::i;27416:305::-:0;27518:4;27555:40;;;27570:25;27555:40;;:105;;-1:-1:-1;27612:48:0;;;27627:33;27612:48;27555:105;:158;;;-1:-1:-1;19642:25:0;19627:40;;;;27677:36;19518:157;30969:155;31068:7;:14;31034:4;;31058:24;;:58;;;;;31114:1;31086:30;;:7;31094;31086:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;31051:65;30969:155;-1:-1:-1;;30969:155:0:o;33167:174::-;33242:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;33296:23;33242:24;33296:14;:23::i;:::-;33287:46;;;;;;;;;;;;33167:174;;:::o;39228:193::-;39285:14;39302:13;35303:7;:14;;35215:110;39302:13;39285:30;;36137:4;39334:9;:22;39326:44;;;;-1:-1:-1;;;39326:44:0;;23731:2:1;39326:44:0;;;23713:21:1;23770:1;23750:18;;;23743:29;23808:11;23788:18;;;23781:39;23837:18;;39326:44:0;23529:332:1;39326:44:0;39381:32;39391:10;39403:9;39381;:32::i;31134:348::-;31227:4;31252:16;31260:7;31252;:16::i;:::-;31244:73;;;;-1:-1:-1;;;31244:73:0;;24068:2:1;31244:73:0;;;24050:21:1;24107:2;24087:18;;;24080:30;24146:34;24126:18;;;24119:62;24217:14;24197:18;;;24190:42;24249:19;;31244:73:0;23866:408:1;31244:73:0;31328:13;31344:23;31359:7;31344:14;:23::i;:::-;31328:39;;31397:5;31386:16;;:7;:16;;;:51;;;;31430:7;31406:31;;:20;31418:7;31406:11;:20::i;:::-;:31;;;31386:51;:87;;;-1:-1:-1;29696:25:0;;;;29672:4;29696:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31441:32;31378:96;31134:348;-1:-1:-1;;;;31134:348:0:o;32641:516::-;32800:4;32773:31;;:23;32788:7;32773:14;:23::i;:::-;:31;;;32765:85;;;;-1:-1:-1;;;32765:85:0;;24481:2:1;32765:85:0;;;24463:21:1;24520:2;24500:18;;;24493:30;24559:34;24539:18;;;24532:62;24630:11;24610:18;;;24603:39;24659:19;;32765:85:0;24279:405:1;32765:85:0;32869:16;;;32861:65;;;;-1:-1:-1;;;32861:65:0;;24891:2:1;32861:65:0;;;24873:21:1;24930:2;24910:18;;;24903:30;24969:34;24949:18;;;24942:62;25040:6;25020:18;;;25013:34;25064:19;;32861:65:0;24689:400:1;32861:65:0;33043:29;33060:1;33064:7;33043:8;:29::i;:::-;33102:2;33083:7;33091;33083:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;33122:27;;33141:7;;33122:27;;;;;;;;;;33083:16;33122:27;32641:516;;;:::o;22914:173::-;22989:6;;;;23006:17;;;;;;;;;;;23039:40;;22989:6;;;23006:17;22989:6;;23039:40;;22970:16;;23039:40;22959:128;22914:173;:::o;30644:315::-;30801:28;30811:4;30817:2;30821:7;30801:9;:28::i;:::-;30848:48;30871:4;30877:2;30881:7;30890:5;30848:22;:48::i;:::-;30840:111;;;;-1:-1:-1;;;30840:111:0;;25296:2:1;30840:111:0;;;25278:21:1;25335:2;25315:18;;;25308:30;25374:34;25354:18;;;25347:62;25445:20;25425:18;;;25418:48;25483:19;;30840:111:0;25094:414:1;16879:723:0;16935:13;17156:10;17152:53;;-1:-1:-1;;17183:10:0;;;;;;;;;;;;;;;;;;16879:723::o;17152:53::-;17230:5;17215:12;17271:78;17278:9;;17271:78;;17304:8;;;;:::i;:::-;;-1:-1:-1;17327:10:0;;-1:-1:-1;17335:2:0;17327:10;;:::i;:::-;;;17271:78;;;17359:19;17391:6;17381:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17381:17:0;;17359:39;;17409:154;17416:10;;17409:154;;17443:11;17453:1;17443:11;;:::i;:::-;;-1:-1:-1;17512:10:0;17520:2;17512:5;:10;:::i;:::-;17499:24;;:2;:24;:::i;:::-;17486:39;;17469:6;17476;17469:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;17540:11:0;17549:2;17540:11;;:::i;:::-;;;17409:154;;31492:110;31568:26;31578:2;31582:7;31568:26;;;;;;;;;;;;:9;:26::i;33351:799::-;33506:4;33527:13;;;8709:20;8757:8;33523:620;;33563:72;;;;;:36;;;;;;:72;;16428:10;;33614:4;;33620:7;;33629:5;;33563:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33563:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33559:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33805:13:0;;33801:272;;33848:60;;-1:-1:-1;;;33848:60:0;;25296:2:1;33848:60:0;;;25278:21:1;25335:2;25315:18;;;25308:30;25374:34;25354:18;;;25347:62;25445:20;25425:18;;;25418:48;25483:19;;33848:60:0;25094:414:1;33801:272:0;34023:6;34017:13;34008:6;34004:2;34000:15;33993:38;33559:529;33686:51;;33696:41;33686:51;;-1:-1:-1;33679:58:0;;33523:620;-1:-1:-1;34127:4:0;33351:799;;;;;;:::o;31612:321::-;31742:18;31748:2;31752:7;31742:5;:18::i;:::-;31793:54;31824:1;31828:2;31832:7;31841:5;31793:22;:54::i;:::-;31771:154;;;;-1:-1:-1;;;31771:154:0;;25296:2:1;31771:154:0;;;25278:21:1;25335:2;25315:18;;;25308:30;25374:34;25354:18;;;25347:62;25445:20;25425:18;;;25418:48;25483:19;;31771:154:0;25094:414:1;31943:346:0;32023:16;;;32015:61;;;;-1:-1:-1;;;32015:61:0;;26741:2:1;32015:61:0;;;26723:21:1;;;26760:18;;;26753:30;26819:34;26799:18;;;26792:62;26871:18;;32015:61:0;26539:356:1;32015:61:0;32096:16;32104:7;32096;:16::i;:::-;32095:17;32087:58;;;;-1:-1:-1;;;32087:58:0;;27102:2:1;32087:58:0;;;27084:21:1;27141:2;27121:18;;;27114:30;27180;27160:18;;;27153:58;27228:18;;32087:58:0;26900:352:1;32087:58:0;32214:7;:16;;;;;;;-1:-1:-1;32214:16:0;;;;;;;;;;;;;;;;;;32248:33;;32273:7;;-1:-1:-1;32248:33:0;;-1:-1:-1;;32248:33:0;31943:346;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:1:o;2343:184::-;2395:77;2392:1;2385:88;2492:4;2489:1;2482:15;2516:4;2513:1;2506:15;2532:334;2603:2;2597:9;2659:2;2649:13;;2664:66;2645:86;2633:99;;2762:18;2747:34;;2783:22;;;2744:62;2741:88;;;2809:18;;:::i;:::-;2845:2;2838:22;2532:334;;-1:-1:-1;2532:334:1:o;2871:183::-;2931:4;2964:18;2956:6;2953:30;2950:56;;;2986:18;;:::i;:::-;-1:-1:-1;3031:1:1;3027:14;3043:4;3023:25;;2871:183::o;3059:891::-;3143:6;3174:2;3217;3205:9;3196:7;3192:23;3188:32;3185:52;;;3233:1;3230;3223:12;3185:52;3273:9;3260:23;3306:18;3298:6;3295:30;3292:50;;;3338:1;3335;3328:12;3292:50;3361:22;;3414:4;3406:13;;3402:27;-1:-1:-1;3392:55:1;;3443:1;3440;3433:12;3392:55;3479:2;3466:16;3502:60;3518:43;3558:2;3518:43;:::i;:::-;3502:60;:::i;:::-;3596:15;;;3678:1;3674:10;;;;3666:19;;3662:28;;;3627:12;;;;3702:19;;;3699:39;;;3734:1;3731;3724:12;3699:39;3758:11;;;;3778:142;3794:6;3789:3;3786:15;3778:142;;;3860:17;;3848:30;;3811:12;;;;3898;;;;3778:142;;;3939:5;3059:891;-1:-1:-1;;;;;;;3059:891:1:o;4137:642::-;4302:2;4354:21;;;4424:13;;4327:18;;;4446:22;;;4273:4;;4302:2;4525:15;;;;4499:2;4484:18;;;4273:4;4568:185;4582:6;4579:1;4576:13;4568:185;;;4657:13;;4650:21;4643:29;4631:42;;4728:15;;;;4693:12;;;;4604:1;4597:9;4568:185;;;-1:-1:-1;4770:3:1;;4137:642;-1:-1:-1;;;;;;4137:642:1:o;4784:456::-;4861:6;4869;4877;4930:2;4918:9;4909:7;4905:23;4901:32;4898:52;;;4946:1;4943;4936:12;4898:52;4985:9;4972:23;5004:31;5029:5;5004:31;:::i;:::-;5054:5;-1:-1:-1;5111:2:1;5096:18;;5083:32;5124:33;5083:32;5124:33;:::i;:::-;4784:456;;5176:7;;-1:-1:-1;;;5230:2:1;5215:18;;;;5202:32;;4784:456::o;5245:466::-;5310:5;5344:18;5336:6;5333:30;5330:56;;;5366:18;;:::i;:::-;5404:116;5514:4;5445:66;5440:2;5432:6;5428:15;5424:88;5420:99;5404:116;:::i;:::-;5395:125;;5543:6;5536:5;5529:21;5583:3;5574:6;5569:3;5565:16;5562:25;5559:45;;;5600:1;5597;5590:12;5559:45;5649:6;5644:3;5637:4;5630:5;5626:16;5613:43;5703:1;5696:4;5687:6;5680:5;5676:18;5672:29;5665:40;5245:466;;;;;:::o;5716:222::-;5759:5;5812:3;5805:4;5797:6;5793:17;5789:27;5779:55;;5830:1;5827;5820:12;5779:55;5852:80;5928:3;5919:6;5906:20;5899:4;5891:6;5887:17;5852:80;:::i;5943:322::-;6012:6;6065:2;6053:9;6044:7;6040:23;6036:32;6033:52;;;6081:1;6078;6071:12;6033:52;6121:9;6108:23;6154:18;6146:6;6143:30;6140:50;;;6186:1;6183;6176:12;6140:50;6209;6251:7;6242:6;6231:9;6227:22;6209:50;:::i;6270:247::-;6329:6;6382:2;6370:9;6361:7;6357:23;6353:32;6350:52;;;6398:1;6395;6388:12;6350:52;6437:9;6424:23;6456:31;6481:5;6456:31;:::i;6522:632::-;6693:2;6745:21;;;6815:13;;6718:18;;;6837:22;;;6664:4;;6693:2;6916:15;;;;6890:2;6875:18;;;6664:4;6959:169;6973:6;6970:1;6967:13;6959:169;;;7034:13;;7022:26;;7103:15;;;;7068:12;;;;6995:1;6988:9;6959:169;;7159:416;7224:6;7232;7285:2;7273:9;7264:7;7260:23;7256:32;7253:52;;;7301:1;7298;7291:12;7253:52;7340:9;7327:23;7359:31;7384:5;7359:31;:::i;:::-;7409:5;-1:-1:-1;7466:2:1;7451:18;;7438:32;7508:15;;7501:23;7489:36;;7479:64;;7539:1;7536;7529:12;7479:64;7562:7;7552:17;;;7159:416;;;;;:::o;7580:795::-;7675:6;7683;7691;7699;7752:3;7740:9;7731:7;7727:23;7723:33;7720:53;;;7769:1;7766;7759:12;7720:53;7808:9;7795:23;7827:31;7852:5;7827:31;:::i;:::-;7877:5;-1:-1:-1;7934:2:1;7919:18;;7906:32;7947:33;7906:32;7947:33;:::i;:::-;7999:7;-1:-1:-1;8053:2:1;8038:18;;8025:32;;-1:-1:-1;8108:2:1;8093:18;;8080:32;8135:18;8124:30;;8121:50;;;8167:1;8164;8157:12;8121:50;8190:22;;8243:4;8235:13;;8231:27;-1:-1:-1;8221:55:1;;8272:1;8269;8262:12;8221:55;8295:74;8361:7;8356:2;8343:16;8338:2;8334;8330:11;8295:74;:::i;:::-;8285:84;;;7580:795;;;;;;;:::o;8380:966::-;8464:6;8495:2;8538;8526:9;8517:7;8513:23;8509:32;8506:52;;;8554:1;8551;8544:12;8506:52;8594:9;8581:23;8627:18;8619:6;8616:30;8613:50;;;8659:1;8656;8649:12;8613:50;8682:22;;8735:4;8727:13;;8723:27;-1:-1:-1;8713:55:1;;8764:1;8761;8754:12;8713:55;8800:2;8787:16;8823:60;8839:43;8879:2;8839:43;:::i;8823:60::-;8917:15;;;8999:1;8995:10;;;;8987:19;;8983:28;;;8948:12;;;;9023:19;;;9020:39;;;9055:1;9052;9045:12;9020:39;9079:11;;;;9099:217;9115:6;9110:3;9107:15;9099:217;;;9195:3;9182:17;9212:31;9237:5;9212:31;:::i;:::-;9256:18;;9132:12;;;;9294;;;;9099:217;;9351:388;9419:6;9427;9480:2;9468:9;9459:7;9455:23;9451:32;9448:52;;;9496:1;9493;9486:12;9448:52;9535:9;9522:23;9554:31;9579:5;9554:31;:::i;:::-;9604:5;-1:-1:-1;9661:2:1;9646:18;;9633:32;9674:33;9633:32;9674:33;:::i;9744:390::-;9822:6;9830;9883:2;9871:9;9862:7;9858:23;9854:32;9851:52;;;9899:1;9896;9889:12;9851:52;9935:9;9922:23;9912:33;;9996:2;9985:9;9981:18;9968:32;10023:18;10015:6;10012:30;10009:50;;;10055:1;10052;10045:12;10009:50;10078;10120:7;10111:6;10100:9;10096:22;10078:50;:::i;:::-;10068:60;;;9744:390;;;;;:::o;10139:437::-;10218:1;10214:12;;;;10261;;;10282:61;;10336:4;10328:6;10324:17;10314:27;;10282:61;10389:2;10381:6;10378:14;10358:18;10355:38;10352:218;;;10426:77;10423:1;10416:88;10527:4;10524:1;10517:15;10555:4;10552:1;10545:15;10352:218;;10139:437;;;:::o;12182:184::-;12234:77;12231:1;12224:88;12331:4;12328:1;12321:15;12355:4;12352:1;12345:15;12371:195;12410:3;12441:66;12434:5;12431:77;12428:103;;;12511:18;;:::i;:::-;-1:-1:-1;12558:1:1;12547:13;;12371:195::o;13268:184::-;13320:77;13317:1;13310:88;13417:4;13414:1;13407:15;13441:4;13438:1;13431:15;13457:112;13489:1;13515;13505:35;;13520:18;;:::i;:::-;-1:-1:-1;13554:9:1;;13457:112::o;13982:128::-;14022:3;14053:1;14049:6;14046:1;14043:13;14040:39;;;14059:18;;:::i;:::-;-1:-1:-1;14095:9:1;;13982:128::o;14115:184::-;14167:77;14164:1;14157:88;14264:4;14261:1;14254:15;14288:4;14285:1;14278:15;14304:251;14374:6;14427:2;14415:9;14406:7;14402:23;14398:32;14395:52;;;14443:1;14440;14433:12;14395:52;14475:9;14469:16;14494:31;14519:5;14494:31;:::i;18014:184::-;18084:6;18137:2;18125:9;18116:7;18112:23;18108:32;18105:52;;;18153:1;18150;18143:12;18105:52;-1:-1:-1;18176:16:1;;18014:184;-1:-1:-1;18014:184:1:o;18918:228::-;18958:7;19084:1;19016:66;19012:74;19009:1;19006:81;19001:1;18994:9;18987:17;18983:105;18980:131;;;19091:18;;:::i;:::-;-1:-1:-1;19131:9:1;;18918:228::o;19852:1097::-;19937:12;;19902:3;;19992:1;20012:18;;;;20065;;;;20092:61;;20146:4;20138:6;20134:17;20124:27;;20092:61;20172:2;20220;20212:6;20209:14;20189:18;20186:38;20183:218;;;20257:77;20254:1;20247:88;20358:4;20355:1;20348:15;20386:4;20383:1;20376:15;20183:218;20417:18;20444:162;;;;20620:1;20615:328;;;;20410:533;;20444:162;20492:66;20481:9;20477:82;20472:3;20465:95;20589:6;20584:3;20580:16;20573:23;;20444:162;;20615:328;20646:5;20643:1;20636:16;20693:2;20690:1;20680:16;20718:1;20732:165;20746:6;20743:1;20740:13;20732:165;;;20824:14;;20811:11;;;20804:35;20867:16;;;;20761:10;;20732:165;;;20736:3;;20926:6;20921:3;20917:16;20910:23;;20410:533;;;;;;;19852:1097;;;;:::o;20954:376::-;21130:3;21158:38;21192:3;21184:6;21158:38;:::i;:::-;21225:6;21219:13;21241:52;21286:6;21282:2;21275:4;21267:6;21263:17;21241:52;:::i;:::-;21309:15;;20954:376;-1:-1:-1;;;;20954:376:1:o;22097:199::-;22227:3;22252:38;22286:3;22278:6;22252:38;:::i;22490:274::-;22619:3;22657:6;22651:13;22673:53;22719:6;22714:3;22707:4;22699:6;22695:17;22673:53;:::i;:::-;22742:16;;;;;22490:274;-1:-1:-1;;22490:274:1:o;23113:411::-;23330:42;23322:6;23318:55;23307:9;23300:74;23410:6;23405:2;23394:9;23390:18;23383:34;23453:2;23448;23437:9;23433:18;23426:30;23281:4;23473:45;23514:2;23503:9;23499:18;23491:6;23473:45;:::i;:::-;23465:53;23113:411;-1:-1:-1;;;;;23113:411:1:o;25513:120::-;25553:1;25579;25569:35;;25584:18;;:::i;:::-;-1:-1:-1;25618:9:1;;25513:120::o;25638:125::-;25678:4;25706:1;25703;25700:8;25697:34;;;25711:18;;:::i;:::-;-1:-1:-1;25748:9:1;;25638:125::o;25768:512::-;25962:4;25991:42;26072:2;26064:6;26060:15;26049:9;26042:34;26124:2;26116:6;26112:15;26107:2;26096:9;26092:18;26085:43;;26164:6;26159:2;26148:9;26144:18;26137:34;26207:3;26202:2;26191:9;26187:18;26180:31;26228:46;26269:3;26258:9;26254:19;26246:6;26228:46;:::i;:::-;26220:54;25768:512;-1:-1:-1;;;;;;25768:512:1:o;26285:249::-;26354:6;26407:2;26395:9;26386:7;26382:23;26378:32;26375:52;;;26423:1;26420;26413:12;26375:52;26455:9;26449:16;26474:30;26498:5;26474:30;:::i

Swarm Source

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