ETH Price: $3,462.93 (+0.89%)
Gas: 14 Gwei

Token

RiseAngle Membership Gen 2 (RAM2)
 

Overview

Max Total Supply

300 RAM2

Holders

168

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 RAM2
0xa6d9107e7c6394141806217dc207ebf3813b7443
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RiseAngleMembershipGen2

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.5 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.9;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.9;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.9;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.9;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.9;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.9;

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.9;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.9;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.9;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.9;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.9;

/**
 * @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 contracts/RiseAngle.sol


pragma solidity ^0.8.9;

interface RAM2PreBuy {
    function _preBuyStopped() external returns (bool);
    function _totalPreBuyNFTs() external returns (uint8);
    function getPreBuyBatchUsersNFTs(uint8 _batchNum, address _user) external view returns(uint8);
    function getPreBuyBatchUsersMintStatus(uint8 _batchNum, address _user) external view returns(bool);
    function setUserMintStatus(uint8 _batchNum, address _user) external;
}

contract RiseAngleMembershipGen2 is ERC721, ERC721Enumerable, Ownable {

    uint256 public MAX_RAMS = 1000;

    uint256 public PRE_SALE_PRICE = 0.08 ether;

    uint256 public PUBLIC_SALE_PRICE = 0.15 ether;

    uint256 public MAX_RAMS_WALLET = 20;

    uint256 public numPreBuyMinted;
    uint256 public numRamsMinted;

    string public baseTokenURI;

    bool public publicSaleStarted;
    bool public presaleStarted;

    address private _fundReceiver;

    RAM2PreBuy private preBuy;

    mapping(address => bool) private _presaleEligible;
    mapping(address => uint256) private _totalClaimed;

    event BaseURIChanged(string baseURI);
    event PreBuyMint(address minter, uint256 amountOfRams);
    event PresaleMint(address minter, uint256 amountOfRams);
    event PublicSaleMint(address minter, uint256 amountOfRams);

    function whenPreBuyStopped() private {
        require(preBuy._preBuyStopped(), "prebuy is active");
    }
    
    function whenPublicSaleStarted() private view {
        require(publicSaleStarted, "Public sale has not started");
    }

    /**
     * @dev pass RAM2PreBuy contract address as argument
     */
    constructor(address _preBuyContract) ERC721("RiseAngle Membership Gen 2", "RAM2") {
        baseTokenURI = "https://ipfs.io/ipfs/QmNzE3qP1w7ZHLkzLHXLdBR94fdR7Sa79tCzGV2xD3DjCg";
        preBuy = RAM2PreBuy(_preBuyContract);
        _fundReceiver = owner();
    }

    fallback() external {}

    receive() external payable {}

    function internalClaim(address user) private {
        uint256 tokenId = preBuy._totalPreBuyNFTs() + numRamsMinted + 1;
        _safeMint(user, tokenId);
        numRamsMinted += 1;
    }

    function internalMint(address user) private {
        internalClaim(user);
        _totalClaimed[user] += 1;
    }

    function internalPreBuyMint(address user) private {
        uint256 tokenId = numPreBuyMinted + 1;
        _safeMint(user, tokenId);
        _totalClaimed[user] += 1;
        numPreBuyMinted += 1;
    }

    function claimReserved(address recipient, uint256 amount) external onlyOwner {
        whenPreBuyStopped();
        require(recipient != address(0), "Cannot add null address");
        require(totalSupply() < MAX_RAMS, "All tokens have been minted");
        require(totalSupply() + amount <= MAX_RAMS, "Minting would exceed max supply");

        for (uint256 i = 0; i < amount; i++) {
            internalClaim(recipient);
        }
    }

    function addToPresale(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add null address");

            _presaleEligible[addresses[i]] = true;

            _totalClaimed[addresses[i]] > 0 ? _totalClaimed[addresses[i]] : 0;
        }
    }

    function removeFromPresale(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add null address");

            _presaleEligible[addresses[i]] = false;

            _totalClaimed[addresses[i]] > 0 ? _totalClaimed[addresses[i]] : 0;
        }
    }

    /**
     * @dev This method is used to set pre buy price.
     * @param _newFundReceiver new fund receiver
     */
    function setNewFundReceiver(address _newFundReceiver) external onlyOwner {
        _fundReceiver = _newFundReceiver;
    }

    function checkPresaleEligiblity(address addr) external view returns (bool) {
        return _presaleEligible[addr];
    }

    function amountClaimedBy(address owner) external view returns (uint256) {
        return _totalClaimed[owner];
    }

    function mintPreBuy(uint8 _batchNum) external {
        whenPublicSaleStarted();

        uint8 numOfNFTs = preBuy.getPreBuyBatchUsersNFTs(_batchNum, msg.sender);

        require(numOfNFTs != 0, "not registered for this batch");
        require(!preBuy.getPreBuyBatchUsersMintStatus(_batchNum, msg.sender), "already minted");

        for (uint256 i = 0; i < numOfNFTs; i++) {
            internalPreBuyMint(msg.sender);
        }
        preBuy.setUserMintStatus(_batchNum, msg.sender);
        emit PreBuyMint(msg.sender, numOfNFTs);
    }

    function mintPresale() external payable {
        require(presaleStarted, "Presale has not started");
        require(_presaleEligible[msg.sender], "You are not eligible for the presale");
        require(totalSupply() + 1 <= MAX_RAMS, "Minting would exceed max supply");
        require(PRE_SALE_PRICE == msg.value, "ETH amount is incorrect");
        require(_totalClaimed[msg.sender] < 3, "Pre-Sale Purchase exceeds max allowed per wallet");

        internalMint(msg.sender);
        payable(_fundReceiver).transfer(msg.value);
        emit PresaleMint(msg.sender, 1);
    }

    function mint(uint256 amountOfRams) external payable {
        whenPublicSaleStarted();
        require(totalSupply() + amountOfRams <= MAX_RAMS, "Minting would exceed max supply");
        require(amountOfRams > 0, "Must mint at least one");
        require(_totalClaimed[msg.sender] + amountOfRams <= MAX_RAMS_WALLET, "Purchase exceeds max allowed per wallet");
        require(PUBLIC_SALE_PRICE * amountOfRams == msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfRams; i++) {
            internalMint(msg.sender);
        }
        payable(_fundReceiver).transfer(msg.value);
        emit PublicSaleMint(msg.sender, amountOfRams);
    }

    function togglePresaleStarted() external onlyOwner {
        whenPreBuyStopped();
        presaleStarted = !presaleStarted;
    }

    function togglePublicSaleStarted() external onlyOwner {
        whenPreBuyStopped();
        publicSaleStarted = !publicSaleStarted;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
        emit BaseURIChanged(baseURI);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return _baseURI();
    }

    function setMAX_RAMS(uint256 _amount) external onlyOwner {
        MAX_RAMS = _amount;
    }

    function setPUBLIC_SALE_PRICE(uint256 _amount) external onlyOwner {
        PUBLIC_SALE_PRICE = _amount;
    }

    function setPRE_SALE_PRICE(uint256 _amount) external onlyOwner {
        PRE_SALE_PRICE = _amount;
    }

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

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_preBuyContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfRams","type":"uint256"}],"name":"PreBuyMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfRams","type":"uint256"}],"name":"PresaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfRams","type":"uint256"}],"name":"PublicSaleMint","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"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"MAX_RAMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RAMS_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"amountClaimedBy","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkPresaleEligiblity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfRams","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_batchNum","type":"uint8"}],"name":"mintPreBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numPreBuyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numRamsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMAX_RAMS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFundReceiver","type":"address"}],"name":"setNewFundReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPRE_SALE_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPUBLIC_SALE_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"},{"stateMutability":"payable","type":"receive"}]

60806040526103e8600b5567011c37937e080000600c55670214e8348c4f0000600d556014600e553480156200003457600080fd5b506040516200324238038062003242833981016040819052620000579162000273565b604080518082018252601a81527f52697365416e676c65204d656d626572736869702047656e20320000000000006020808301918252835180850190945260048452632920a69960e11b908401528151919291620000b891600091620001cd565b508051620000ce906001906020840190620001cd565b505050620000eb620000e56200017760201b60201c565b6200017b565b604051806080016040528060438152602001620031ff6043913980516200011b91601191602090910190620001cd565b50601380546001600160a01b0319166001600160a01b0383161790556200014a600a546001600160a01b031690565b601260026101000a8154816001600160a01b0302191690836001600160a01b0316021790555050620002e2565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001db90620002a5565b90600052602060002090601f016020900481019282620001ff57600085556200024a565b82601f106200021a57805160ff19168380011785556200024a565b828001600101855582156200024a579182015b828111156200024a5782518255916020019190600101906200022d565b50620002589291506200025c565b5090565b5b808211156200025857600081556001016200025d565b6000602082840312156200028657600080fd5b81516001600160a01b03811681146200029e57600080fd5b9392505050565b600181811c90821680620002ba57607f821691505b60208210811415620002dc57634e487b7160e01b600052602260045260246000fd5b50919050565b612f0d80620002f26000396000f3fe6080604052600436106102605760003560e01c8063715018a611610144578063c87b56dd116100b6578063ed1fc2a21161007a578063ed1fc2a214610720578063ed426efa14610735578063f2fde38b1461074b578063f3cedb8a1461076b578063f59604e01461078b578063fe47fbf3146107ab57610267565b8063c87b56dd14610684578063ccab2fd0146106a4578063d547cfb7146106ba578063db599698146106cf578063e985e9c5146106d757610267565b8063a22cb46511610108578063a22cb465146105ca578063a2e91477146105ea578063aef6ee1f14610604578063b123b11b14610624578063b1b59e6e14610644578063b88d4fde1461066457610267565b8063715018a61461054f5780638da5cb5b1461056457806395d89b41146105825780639c81695514610597578063a0712d68146105b757610267565b80631b5757f2116101dd57806345a506f9116101a157806345a506f9146104995780634f6ccce7146104af57806355f804b3146104cf5780636352211e146104ef5780636f13a0371461050f57806370a082311461052f57610267565b80631b5757f21461040457806323b872dd146104245780632f745c59146104445780632f8145751461046457806342842e0e1461047957610267565b8063095ea7b311610224578063095ea7b31461034857806318160ddd1461036a578063191f65ac1461037f578063193402bb146103b85780631978f469146103ce57610267565b806301ffc9a71461027657806304549d6f146102ab57806306fdde03146102ca57806307e89ec0146102ec578063081812fc1461031057610267565b3661026757005b34801561027357600080fd5b50005b34801561028257600080fd5b50610296610291366004612873565b6107c1565b60405190151581526020015b60405180910390f35b3480156102b757600080fd5b5060125461029690610100900460ff1681565b3480156102d657600080fd5b506102df6107d2565b6040516102a291906128e4565b3480156102f857600080fd5b50610302600d5481565b6040519081526020016102a2565b34801561031c57600080fd5b5061033061032b3660046128f7565b610864565b6040516001600160a01b0390911681526020016102a2565b34801561035457600080fd5b5061036861036336600461292c565b6108fe565b005b34801561037657600080fd5b50600854610302565b34801561038b57600080fd5b5061029661039a366004612956565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156103c457600080fd5b50610302600c5481565b3480156103da57600080fd5b506103026103e9366004612956565b6001600160a01b031660009081526015602052604090205490565b34801561041057600080fd5b5061036861041f36600461292c565b610a14565b34801561043057600080fd5b5061036861043f366004612971565b610b1a565b34801561045057600080fd5b5061030261045f36600461292c565b610b4b565b34801561047057600080fd5b50610368610be1565b34801561048557600080fd5b50610368610494366004612971565b610c27565b3480156104a557600080fd5b50610302600b5481565b3480156104bb57600080fd5b506103026104ca3660046128f7565b610c42565b3480156104db57600080fd5b506103686104ea366004612a39565b610cd5565b3480156104fb57600080fd5b5061033061050a3660046128f7565b610d4d565b34801561051b57600080fd5b5061036861052a366004612a91565b610dc4565b34801561053b57600080fd5b5061030261054a366004612956565b611035565b34801561055b57600080fd5b506103686110bc565b34801561057057600080fd5b50600a546001600160a01b0316610330565b34801561058e57600080fd5b506102df6110f2565b3480156105a357600080fd5b506103686105b2366004612aae565b611101565b6103686105c53660046128f7565b611295565b3480156105d657600080fd5b506103686105e5366004612b31565b61148c565b3480156105f657600080fd5b506012546102969060ff1681565b34801561061057600080fd5b5061036861061f366004612aae565b611551565b34801561063057600080fd5b5061036861063f3660046128f7565b6116e5565b34801561065057600080fd5b5061036861065f3660046128f7565b611714565b34801561067057600080fd5b5061036861067f366004612b68565b611743565b34801561069057600080fd5b506102df61069f3660046128f7565b61177b565b3480156106b057600080fd5b50610302600f5481565b3480156106c657600080fd5b506102df611802565b610368611890565b3480156106e357600080fd5b506102966106f2366004612be4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561072c57600080fd5b50610368611aca565b34801561074157600080fd5b50610302600e5481565b34801561075757600080fd5b50610368610766366004612956565b611b19565b34801561077757600080fd5b506103686107863660046128f7565b611bb4565b34801561079757600080fd5b506103686107a6366004612956565b611be3565b3480156107b757600080fd5b5061030260105481565b60006107cc82611c37565b92915050565b6060600080546107e190612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461080d90612c17565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108e25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061090982610d4d565b9050806001600160a01b0316836001600160a01b031614156109775760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108d9565b336001600160a01b0382161480610993575061099381336106f2565b610a055760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108d9565b610a0f8383611c5c565b505050565b600a546001600160a01b03163314610a3e5760405162461bcd60e51b81526004016108d990612c52565b610a46611cca565b6001600160a01b038216610a6c5760405162461bcd60e51b81526004016108d990612c87565b600b5460085410610abf5760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e746564000000000060448201526064016108d9565b600b5481610acc60085490565b610ad69190612cd4565b1115610af45760405162461bcd60e51b81526004016108d990612cec565b60005b81811015610a0f57610b0883611d91565b80610b1281612d23565b915050610af7565b610b243382611e53565b610b405760405162461bcd60e51b81526004016108d990612d3e565b610a0f838383611f4a565b6000610b5683611035565b8210610bb85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108d9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c0b5760405162461bcd60e51b81526004016108d990612c52565b610c13611cca565b6012805460ff19811660ff90911615179055565b610a0f83838360405180602001604052806000815250611743565b6000610c4d60085490565b8210610cb05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108d9565b60088281548110610cc357610cc3612d8f565b90600052602060002001549050919050565b600a546001600160a01b03163314610cff5760405162461bcd60e51b81526004016108d990612c52565b8051610d129060119060208401906127c4565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610d4291906128e4565b60405180910390a150565b6000818152600260205260408120546001600160a01b0316806107cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108d9565b610dcc6120f5565b601354604051631654d8fd60e21b815260ff831660048201523360248201526000916001600160a01b03169063595363f49060440160206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e519190612da5565b905060ff8116610ea35760405162461bcd60e51b815260206004820152601d60248201527f6e6f74207265676973746572656420666f72207468697320626174636800000060448201526064016108d9565b6013546040516356b7a7db60e11b815260ff841660048201523360248201526001600160a01b039091169063ad6f4fb69060440160206040518083038186803b158015610eef57600080fd5b505afa158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f279190612dc2565b15610f655760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b60448201526064016108d9565b60005b8160ff16811015610f8e57610f7c33612147565b80610f8681612d23565b915050610f68565b50601354604051637e547c7d60e11b815260ff841660048201523360248201526001600160a01b039091169063fca8f8fa90604401600060405180830381600087803b158015610fdd57600080fd5b505af1158015610ff1573d6000803e3d6000fd5b50506040805133815260ff851660208201527f33afabf6b31e4e33f56058ac3cd3594bf197b1b7efbaff729184d117a21a3ab5935001905060405180910390a15050565b60006001600160a01b0382166110a05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108d9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110e65760405162461bcd60e51b81526004016108d990612c52565b6110f060006121a7565b565b6060600180546107e190612c17565b600a546001600160a01b0316331461112b5760405162461bcd60e51b81526004016108d990612c52565b60005b81811015610a0f57600083838381811061114a5761114a612d8f565b905060200201602081019061115f9190612956565b6001600160a01b031614156111865760405162461bcd60e51b81526004016108d990612c87565b60006014600085858581811061119e5761119e612d8f565b90506020020160208101906111b39190612956565b6001600160a01b0316815260208101919091526040016000908120805460ff1916921515929092179091556015818585858181106111f3576111f3612d8f565b90506020020160208101906112089190612956565b6001600160a01b03166001600160a01b031681526020019081526020016000205411611235576000611282565b6015600084848481811061124b5761124b612d8f565b90506020020160208101906112609190612956565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b508061128d81612d23565b91505061112e565b61129d6120f5565b600b54816112aa60085490565b6112b49190612cd4565b11156112d25760405162461bcd60e51b81526004016108d990612cec565b6000811161131b5760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b60448201526064016108d9565b600e5433600090815260156020526040902054611339908390612cd4565b11156113975760405162461bcd60e51b815260206004820152602760248201527f50757263686173652065786365656473206d617820616c6c6f77656420706572604482015266081dd85b1b195d60ca1b60648201526084016108d9565b3481600d546113a69190612ddf565b146113ed5760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5cc81a5b98dbdc9c9958dd604a1b60448201526064016108d9565b60005b8181101561141357611401336121f9565b8061140b81612d23565b9150506113f0565b506012546040516001600160a01b036201000090920491909116903480156108fc02916000818181858888f19350505050158015611455573d6000803e3d6000fd5b5060408051338152602081018390527f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b59101610d42565b6001600160a01b0382163314156114e55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108d9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461157b5760405162461bcd60e51b81526004016108d990612c52565b60005b81811015610a0f57600083838381811061159a5761159a612d8f565b90506020020160208101906115af9190612956565b6001600160a01b031614156115d65760405162461bcd60e51b81526004016108d990612c87565b6001601460008585858181106115ee576115ee612d8f565b90506020020160208101906116039190612956565b6001600160a01b0316815260208101919091526040016000908120805460ff19169215159290921790915560158185858581811061164357611643612d8f565b90506020020160208101906116589190612956565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116116855760006116d2565b6015600084848481811061169b5761169b612d8f565b90506020020160208101906116b09190612956565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b50806116dd81612d23565b91505061157e565b600a546001600160a01b0316331461170f5760405162461bcd60e51b81526004016108d990612c52565b600b55565b600a546001600160a01b0316331461173e5760405162461bcd60e51b81526004016108d990612c52565b600c55565b61174d3383611e53565b6117695760405162461bcd60e51b81526004016108d990612d3e565b61177584848484612233565b50505050565b6000818152600260205260409020546060906001600160a01b03166117fa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108d9565b6107cc612266565b6011805461180f90612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461183b90612c17565b80156118885780601f1061185d57610100808354040283529160200191611888565b820191906000526020600020905b81548152906001019060200180831161186b57829003601f168201915b505050505081565b601254610100900460ff166118e75760405162461bcd60e51b815260206004820152601760248201527f50726573616c6520686173206e6f74207374617274656400000000000000000060448201526064016108d9565b3360009081526014602052604090205460ff166119525760405162461bcd60e51b8152602060048201526024808201527f596f7520617265206e6f7420656c696769626c6520666f72207468652070726560448201526373616c6560e01b60648201526084016108d9565b600b54600854611963906001612cd4565b11156119815760405162461bcd60e51b81526004016108d990612cec565b34600c54146119cc5760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5cc81a5b98dbdc9c9958dd604a1b60448201526064016108d9565b33600090815260156020526040902054600311611a445760405162461bcd60e51b815260206004820152603060248201527f5072652d53616c652050757263686173652065786365656473206d617820616c60448201526f1b1bddd959081c195c881dd85b1b195d60821b60648201526084016108d9565b611a4d336121f9565b6012546040516001600160a01b036201000090920491909116903480156108fc02916000818181858888f19350505050158015611a8e573d6000803e3d6000fd5b5060408051338152600160208201527ff5df7d07fef0d8ac7581015ebd1a3b7b7760da84b12f0c8174ae0dcd639cb6a3910160405180910390a1565b600a546001600160a01b03163314611af45760405162461bcd60e51b81526004016108d990612c52565b611afc611cca565b6012805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314611b435760405162461bcd60e51b81526004016108d990612c52565b6001600160a01b038116611ba85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d9565b611bb1816121a7565b50565b600a546001600160a01b03163314611bde5760405162461bcd60e51b81526004016108d990612c52565b600d55565b600a546001600160a01b03163314611c0d5760405162461bcd60e51b81526004016108d990612c52565b601280546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006001600160e01b0319821663780e9d6360e01b14806107cc57506107cc82612275565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c9182610d4d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b601360009054906101000a90046001600160a01b03166001600160a01b031663f8f7404f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d1a57600080fd5b505af1158015611d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d529190612dc2565b6110f05760405162461bcd60e51b815260206004820152601060248201526f7072656275792069732061637469766560801b60448201526064016108d9565b601054601354604080516312111e5560e11b81529051600093926001600160a01b0316916324223caa91600480830192602092919082900301818887803b158015611ddb57600080fd5b505af1158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190612da5565b60ff16611e209190612cd4565b611e2b906001612cd4565b9050611e3782826122c5565b600160106000828254611e4a9190612cd4565b90915550505050565b6000818152600260205260408120546001600160a01b0316611ecc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108d9565b6000611ed783610d4d565b9050806001600160a01b0316846001600160a01b03161480611f125750836001600160a01b0316611f0784610864565b6001600160a01b0316145b80611f4257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f5d82610d4d565b6001600160a01b031614611fc55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108d9565b6001600160a01b0382166120275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108d9565b6120328383836122e3565b61203d600082611c5c565b6001600160a01b0383166000908152600360205260408120805460019290612066908490612dfe565b90915550506001600160a01b0382166000908152600360205260408120805460019290612094908490612cd4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60125460ff166110f05760405162461bcd60e51b815260206004820152601b60248201527f5075626c69632073616c6520686173206e6f742073746172746564000000000060448201526064016108d9565b6000600f5460016121589190612cd4565b905061216482826122c5565b6001600160a01b038216600090815260156020526040812080546001929061218d908490612cd4565b925050819055506001600f6000828254611e4a9190612cd4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61220281611d91565b6001600160a01b038116600090815260156020526040812080546001929061222b908490612cd4565b909155505050565b61223e848484611f4a565b61224a848484846122ee565b6117755760405162461bcd60e51b81526004016108d990612e15565b6060601180546107e190612c17565b60006001600160e01b031982166380ac58cd60e01b14806122a657506001600160e01b03198216635b5e139f60e01b145b806107cc57506301ffc9a760e01b6001600160e01b03198316146107cc565b6122df8282604051806020016040528060008152506123fb565b5050565b610a0f83838361242e565b60006001600160a01b0384163b156123f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612332903390899088908890600401612e67565b602060405180830381600087803b15801561234c57600080fd5b505af192505050801561237c575060408051601f3d908101601f1916820190925261237991810190612ea4565b60015b6123d6573d8080156123aa576040519150601f19603f3d011682016040523d82523d6000602084013e6123af565b606091505b5080516123ce5760405162461bcd60e51b81526004016108d990612e15565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f42565b506001949350505050565b61240583836124e6565b61241260008484846122ee565b610a0f5760405162461bcd60e51b81526004016108d990612e15565b6001600160a01b0383166124895761248481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6124ac565b816001600160a01b0316836001600160a01b0316146124ac576124ac8382612634565b6001600160a01b0382166124c357610a0f816126d1565b826001600160a01b0316826001600160a01b031614610a0f57610a0f8282612780565b6001600160a01b03821661253c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108d9565b6000818152600260205260409020546001600160a01b0316156125a15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108d9565b6125ad600083836122e3565b6001600160a01b03821660009081526003602052604081208054600192906125d6908490612cd4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161264184611035565b61264b9190612dfe565b60008381526007602052604090205490915080821461269e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126e390600190612dfe565b6000838152600960205260408120546008805493945090928490811061270b5761270b612d8f565b90600052602060002001549050806008838154811061272c5761272c612d8f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061276457612764612ec1565b6001900381819060005260206000200160009055905550505050565b600061278b83611035565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546127d090612c17565b90600052602060002090601f0160209004810192826127f25760008555612838565b82601f1061280b57805160ff1916838001178555612838565b82800160010185558215612838579182015b8281111561283857825182559160200191906001019061281d565b50612844929150612848565b5090565b5b808211156128445760008155600101612849565b6001600160e01b031981168114611bb157600080fd5b60006020828403121561288557600080fd5b81356128908161285d565b9392505050565b6000815180845260005b818110156128bd576020818501810151868301820152016128a1565b818111156128cf576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006128906020830184612897565b60006020828403121561290957600080fd5b5035919050565b80356001600160a01b038116811461292757600080fd5b919050565b6000806040838503121561293f57600080fd5b61294883612910565b946020939093013593505050565b60006020828403121561296857600080fd5b61289082612910565b60008060006060848603121561298657600080fd5b61298f84612910565b925061299d60208501612910565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156129de576129de6129ad565b604051601f8501601f19908116603f01168101908282118183101715612a0657612a066129ad565b81604052809350858152868686011115612a1f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a4b57600080fd5b813567ffffffffffffffff811115612a6257600080fd5b8201601f81018413612a7357600080fd5b611f42848235602084016129c3565b60ff81168114611bb157600080fd5b600060208284031215612aa357600080fd5b813561289081612a82565b60008060208385031215612ac157600080fd5b823567ffffffffffffffff80821115612ad957600080fd5b818501915085601f830112612aed57600080fd5b813581811115612afc57600080fd5b8660208260051b8501011115612b1157600080fd5b60209290920196919550909350505050565b8015158114611bb157600080fd5b60008060408385031215612b4457600080fd5b612b4d83612910565b91506020830135612b5d81612b23565b809150509250929050565b60008060008060808587031215612b7e57600080fd5b612b8785612910565b9350612b9560208601612910565b925060408501359150606085013567ffffffffffffffff811115612bb857600080fd5b8501601f81018713612bc957600080fd5b612bd8878235602084016129c3565b91505092959194509250565b60008060408385031215612bf757600080fd5b612c0083612910565b9150612c0e60208401612910565b90509250929050565b600181811c90821680612c2b57607f821691505b60208210811415612c4c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ce757612ce7612cbe565b500190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6000600019821415612d3757612d37612cbe565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612db757600080fd5b815161289081612a82565b600060208284031215612dd457600080fd5b815161289081612b23565b6000816000190483118215151615612df957612df9612cbe565b500290565b600082821015612e1057612e10612cbe565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e9a90830184612897565b9695505050505050565b600060208284031215612eb657600080fd5b81516128908161285d565b634e487b7160e01b600052603160045260246000fdfea264697066735822122006f5a04dadbce6cc1dfc95bb9e65ae457001a07c9528e8d39969e365a583e36a64736f6c6343000809003368747470733a2f2f697066732e696f2f697066732f516d4e7a453371503177375a484c6b7a4c48584c6442523934666452375361373974437a475632784433446a436700000000000000000000000067bc91d7e3ac0ccccbf6075f6485bd0e7ad2ca1b

Deployed Bytecode

0x6080604052600436106102605760003560e01c8063715018a611610144578063c87b56dd116100b6578063ed1fc2a21161007a578063ed1fc2a214610720578063ed426efa14610735578063f2fde38b1461074b578063f3cedb8a1461076b578063f59604e01461078b578063fe47fbf3146107ab57610267565b8063c87b56dd14610684578063ccab2fd0146106a4578063d547cfb7146106ba578063db599698146106cf578063e985e9c5146106d757610267565b8063a22cb46511610108578063a22cb465146105ca578063a2e91477146105ea578063aef6ee1f14610604578063b123b11b14610624578063b1b59e6e14610644578063b88d4fde1461066457610267565b8063715018a61461054f5780638da5cb5b1461056457806395d89b41146105825780639c81695514610597578063a0712d68146105b757610267565b80631b5757f2116101dd57806345a506f9116101a157806345a506f9146104995780634f6ccce7146104af57806355f804b3146104cf5780636352211e146104ef5780636f13a0371461050f57806370a082311461052f57610267565b80631b5757f21461040457806323b872dd146104245780632f745c59146104445780632f8145751461046457806342842e0e1461047957610267565b8063095ea7b311610224578063095ea7b31461034857806318160ddd1461036a578063191f65ac1461037f578063193402bb146103b85780631978f469146103ce57610267565b806301ffc9a71461027657806304549d6f146102ab57806306fdde03146102ca57806307e89ec0146102ec578063081812fc1461031057610267565b3661026757005b34801561027357600080fd5b50005b34801561028257600080fd5b50610296610291366004612873565b6107c1565b60405190151581526020015b60405180910390f35b3480156102b757600080fd5b5060125461029690610100900460ff1681565b3480156102d657600080fd5b506102df6107d2565b6040516102a291906128e4565b3480156102f857600080fd5b50610302600d5481565b6040519081526020016102a2565b34801561031c57600080fd5b5061033061032b3660046128f7565b610864565b6040516001600160a01b0390911681526020016102a2565b34801561035457600080fd5b5061036861036336600461292c565b6108fe565b005b34801561037657600080fd5b50600854610302565b34801561038b57600080fd5b5061029661039a366004612956565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156103c457600080fd5b50610302600c5481565b3480156103da57600080fd5b506103026103e9366004612956565b6001600160a01b031660009081526015602052604090205490565b34801561041057600080fd5b5061036861041f36600461292c565b610a14565b34801561043057600080fd5b5061036861043f366004612971565b610b1a565b34801561045057600080fd5b5061030261045f36600461292c565b610b4b565b34801561047057600080fd5b50610368610be1565b34801561048557600080fd5b50610368610494366004612971565b610c27565b3480156104a557600080fd5b50610302600b5481565b3480156104bb57600080fd5b506103026104ca3660046128f7565b610c42565b3480156104db57600080fd5b506103686104ea366004612a39565b610cd5565b3480156104fb57600080fd5b5061033061050a3660046128f7565b610d4d565b34801561051b57600080fd5b5061036861052a366004612a91565b610dc4565b34801561053b57600080fd5b5061030261054a366004612956565b611035565b34801561055b57600080fd5b506103686110bc565b34801561057057600080fd5b50600a546001600160a01b0316610330565b34801561058e57600080fd5b506102df6110f2565b3480156105a357600080fd5b506103686105b2366004612aae565b611101565b6103686105c53660046128f7565b611295565b3480156105d657600080fd5b506103686105e5366004612b31565b61148c565b3480156105f657600080fd5b506012546102969060ff1681565b34801561061057600080fd5b5061036861061f366004612aae565b611551565b34801561063057600080fd5b5061036861063f3660046128f7565b6116e5565b34801561065057600080fd5b5061036861065f3660046128f7565b611714565b34801561067057600080fd5b5061036861067f366004612b68565b611743565b34801561069057600080fd5b506102df61069f3660046128f7565b61177b565b3480156106b057600080fd5b50610302600f5481565b3480156106c657600080fd5b506102df611802565b610368611890565b3480156106e357600080fd5b506102966106f2366004612be4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561072c57600080fd5b50610368611aca565b34801561074157600080fd5b50610302600e5481565b34801561075757600080fd5b50610368610766366004612956565b611b19565b34801561077757600080fd5b506103686107863660046128f7565b611bb4565b34801561079757600080fd5b506103686107a6366004612956565b611be3565b3480156107b757600080fd5b5061030260105481565b60006107cc82611c37565b92915050565b6060600080546107e190612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461080d90612c17565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108e25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061090982610d4d565b9050806001600160a01b0316836001600160a01b031614156109775760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108d9565b336001600160a01b0382161480610993575061099381336106f2565b610a055760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108d9565b610a0f8383611c5c565b505050565b600a546001600160a01b03163314610a3e5760405162461bcd60e51b81526004016108d990612c52565b610a46611cca565b6001600160a01b038216610a6c5760405162461bcd60e51b81526004016108d990612c87565b600b5460085410610abf5760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e746564000000000060448201526064016108d9565b600b5481610acc60085490565b610ad69190612cd4565b1115610af45760405162461bcd60e51b81526004016108d990612cec565b60005b81811015610a0f57610b0883611d91565b80610b1281612d23565b915050610af7565b610b243382611e53565b610b405760405162461bcd60e51b81526004016108d990612d3e565b610a0f838383611f4a565b6000610b5683611035565b8210610bb85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108d9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c0b5760405162461bcd60e51b81526004016108d990612c52565b610c13611cca565b6012805460ff19811660ff90911615179055565b610a0f83838360405180602001604052806000815250611743565b6000610c4d60085490565b8210610cb05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108d9565b60088281548110610cc357610cc3612d8f565b90600052602060002001549050919050565b600a546001600160a01b03163314610cff5760405162461bcd60e51b81526004016108d990612c52565b8051610d129060119060208401906127c4565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610d4291906128e4565b60405180910390a150565b6000818152600260205260408120546001600160a01b0316806107cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108d9565b610dcc6120f5565b601354604051631654d8fd60e21b815260ff831660048201523360248201526000916001600160a01b03169063595363f49060440160206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e519190612da5565b905060ff8116610ea35760405162461bcd60e51b815260206004820152601d60248201527f6e6f74207265676973746572656420666f72207468697320626174636800000060448201526064016108d9565b6013546040516356b7a7db60e11b815260ff841660048201523360248201526001600160a01b039091169063ad6f4fb69060440160206040518083038186803b158015610eef57600080fd5b505afa158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f279190612dc2565b15610f655760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b60448201526064016108d9565b60005b8160ff16811015610f8e57610f7c33612147565b80610f8681612d23565b915050610f68565b50601354604051637e547c7d60e11b815260ff841660048201523360248201526001600160a01b039091169063fca8f8fa90604401600060405180830381600087803b158015610fdd57600080fd5b505af1158015610ff1573d6000803e3d6000fd5b50506040805133815260ff851660208201527f33afabf6b31e4e33f56058ac3cd3594bf197b1b7efbaff729184d117a21a3ab5935001905060405180910390a15050565b60006001600160a01b0382166110a05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108d9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110e65760405162461bcd60e51b81526004016108d990612c52565b6110f060006121a7565b565b6060600180546107e190612c17565b600a546001600160a01b0316331461112b5760405162461bcd60e51b81526004016108d990612c52565b60005b81811015610a0f57600083838381811061114a5761114a612d8f565b905060200201602081019061115f9190612956565b6001600160a01b031614156111865760405162461bcd60e51b81526004016108d990612c87565b60006014600085858581811061119e5761119e612d8f565b90506020020160208101906111b39190612956565b6001600160a01b0316815260208101919091526040016000908120805460ff1916921515929092179091556015818585858181106111f3576111f3612d8f565b90506020020160208101906112089190612956565b6001600160a01b03166001600160a01b031681526020019081526020016000205411611235576000611282565b6015600084848481811061124b5761124b612d8f565b90506020020160208101906112609190612956565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b508061128d81612d23565b91505061112e565b61129d6120f5565b600b54816112aa60085490565b6112b49190612cd4565b11156112d25760405162461bcd60e51b81526004016108d990612cec565b6000811161131b5760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b60448201526064016108d9565b600e5433600090815260156020526040902054611339908390612cd4565b11156113975760405162461bcd60e51b815260206004820152602760248201527f50757263686173652065786365656473206d617820616c6c6f77656420706572604482015266081dd85b1b195d60ca1b60648201526084016108d9565b3481600d546113a69190612ddf565b146113ed5760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5cc81a5b98dbdc9c9958dd604a1b60448201526064016108d9565b60005b8181101561141357611401336121f9565b8061140b81612d23565b9150506113f0565b506012546040516001600160a01b036201000090920491909116903480156108fc02916000818181858888f19350505050158015611455573d6000803e3d6000fd5b5060408051338152602081018390527f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b59101610d42565b6001600160a01b0382163314156114e55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108d9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461157b5760405162461bcd60e51b81526004016108d990612c52565b60005b81811015610a0f57600083838381811061159a5761159a612d8f565b90506020020160208101906115af9190612956565b6001600160a01b031614156115d65760405162461bcd60e51b81526004016108d990612c87565b6001601460008585858181106115ee576115ee612d8f565b90506020020160208101906116039190612956565b6001600160a01b0316815260208101919091526040016000908120805460ff19169215159290921790915560158185858581811061164357611643612d8f565b90506020020160208101906116589190612956565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116116855760006116d2565b6015600084848481811061169b5761169b612d8f565b90506020020160208101906116b09190612956565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b50806116dd81612d23565b91505061157e565b600a546001600160a01b0316331461170f5760405162461bcd60e51b81526004016108d990612c52565b600b55565b600a546001600160a01b0316331461173e5760405162461bcd60e51b81526004016108d990612c52565b600c55565b61174d3383611e53565b6117695760405162461bcd60e51b81526004016108d990612d3e565b61177584848484612233565b50505050565b6000818152600260205260409020546060906001600160a01b03166117fa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108d9565b6107cc612266565b6011805461180f90612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461183b90612c17565b80156118885780601f1061185d57610100808354040283529160200191611888565b820191906000526020600020905b81548152906001019060200180831161186b57829003601f168201915b505050505081565b601254610100900460ff166118e75760405162461bcd60e51b815260206004820152601760248201527f50726573616c6520686173206e6f74207374617274656400000000000000000060448201526064016108d9565b3360009081526014602052604090205460ff166119525760405162461bcd60e51b8152602060048201526024808201527f596f7520617265206e6f7420656c696769626c6520666f72207468652070726560448201526373616c6560e01b60648201526084016108d9565b600b54600854611963906001612cd4565b11156119815760405162461bcd60e51b81526004016108d990612cec565b34600c54146119cc5760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5cc81a5b98dbdc9c9958dd604a1b60448201526064016108d9565b33600090815260156020526040902054600311611a445760405162461bcd60e51b815260206004820152603060248201527f5072652d53616c652050757263686173652065786365656473206d617820616c60448201526f1b1bddd959081c195c881dd85b1b195d60821b60648201526084016108d9565b611a4d336121f9565b6012546040516001600160a01b036201000090920491909116903480156108fc02916000818181858888f19350505050158015611a8e573d6000803e3d6000fd5b5060408051338152600160208201527ff5df7d07fef0d8ac7581015ebd1a3b7b7760da84b12f0c8174ae0dcd639cb6a3910160405180910390a1565b600a546001600160a01b03163314611af45760405162461bcd60e51b81526004016108d990612c52565b611afc611cca565b6012805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314611b435760405162461bcd60e51b81526004016108d990612c52565b6001600160a01b038116611ba85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d9565b611bb1816121a7565b50565b600a546001600160a01b03163314611bde5760405162461bcd60e51b81526004016108d990612c52565b600d55565b600a546001600160a01b03163314611c0d5760405162461bcd60e51b81526004016108d990612c52565b601280546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006001600160e01b0319821663780e9d6360e01b14806107cc57506107cc82612275565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c9182610d4d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b601360009054906101000a90046001600160a01b03166001600160a01b031663f8f7404f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d1a57600080fd5b505af1158015611d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d529190612dc2565b6110f05760405162461bcd60e51b815260206004820152601060248201526f7072656275792069732061637469766560801b60448201526064016108d9565b601054601354604080516312111e5560e11b81529051600093926001600160a01b0316916324223caa91600480830192602092919082900301818887803b158015611ddb57600080fd5b505af1158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190612da5565b60ff16611e209190612cd4565b611e2b906001612cd4565b9050611e3782826122c5565b600160106000828254611e4a9190612cd4565b90915550505050565b6000818152600260205260408120546001600160a01b0316611ecc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108d9565b6000611ed783610d4d565b9050806001600160a01b0316846001600160a01b03161480611f125750836001600160a01b0316611f0784610864565b6001600160a01b0316145b80611f4257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f5d82610d4d565b6001600160a01b031614611fc55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108d9565b6001600160a01b0382166120275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108d9565b6120328383836122e3565b61203d600082611c5c565b6001600160a01b0383166000908152600360205260408120805460019290612066908490612dfe565b90915550506001600160a01b0382166000908152600360205260408120805460019290612094908490612cd4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60125460ff166110f05760405162461bcd60e51b815260206004820152601b60248201527f5075626c69632073616c6520686173206e6f742073746172746564000000000060448201526064016108d9565b6000600f5460016121589190612cd4565b905061216482826122c5565b6001600160a01b038216600090815260156020526040812080546001929061218d908490612cd4565b925050819055506001600f6000828254611e4a9190612cd4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61220281611d91565b6001600160a01b038116600090815260156020526040812080546001929061222b908490612cd4565b909155505050565b61223e848484611f4a565b61224a848484846122ee565b6117755760405162461bcd60e51b81526004016108d990612e15565b6060601180546107e190612c17565b60006001600160e01b031982166380ac58cd60e01b14806122a657506001600160e01b03198216635b5e139f60e01b145b806107cc57506301ffc9a760e01b6001600160e01b03198316146107cc565b6122df8282604051806020016040528060008152506123fb565b5050565b610a0f83838361242e565b60006001600160a01b0384163b156123f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612332903390899088908890600401612e67565b602060405180830381600087803b15801561234c57600080fd5b505af192505050801561237c575060408051601f3d908101601f1916820190925261237991810190612ea4565b60015b6123d6573d8080156123aa576040519150601f19603f3d011682016040523d82523d6000602084013e6123af565b606091505b5080516123ce5760405162461bcd60e51b81526004016108d990612e15565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f42565b506001949350505050565b61240583836124e6565b61241260008484846122ee565b610a0f5760405162461bcd60e51b81526004016108d990612e15565b6001600160a01b0383166124895761248481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6124ac565b816001600160a01b0316836001600160a01b0316146124ac576124ac8382612634565b6001600160a01b0382166124c357610a0f816126d1565b826001600160a01b0316826001600160a01b031614610a0f57610a0f8282612780565b6001600160a01b03821661253c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108d9565b6000818152600260205260409020546001600160a01b0316156125a15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108d9565b6125ad600083836122e3565b6001600160a01b03821660009081526003602052604081208054600192906125d6908490612cd4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161264184611035565b61264b9190612dfe565b60008381526007602052604090205490915080821461269e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126e390600190612dfe565b6000838152600960205260408120546008805493945090928490811061270b5761270b612d8f565b90600052602060002001549050806008838154811061272c5761272c612d8f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061276457612764612ec1565b6001900381819060005260206000200160009055905550505050565b600061278b83611035565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546127d090612c17565b90600052602060002090601f0160209004810192826127f25760008555612838565b82601f1061280b57805160ff1916838001178555612838565b82800160010185558215612838579182015b8281111561283857825182559160200191906001019061281d565b50612844929150612848565b5090565b5b808211156128445760008155600101612849565b6001600160e01b031981168114611bb157600080fd5b60006020828403121561288557600080fd5b81356128908161285d565b9392505050565b6000815180845260005b818110156128bd576020818501810151868301820152016128a1565b818111156128cf576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006128906020830184612897565b60006020828403121561290957600080fd5b5035919050565b80356001600160a01b038116811461292757600080fd5b919050565b6000806040838503121561293f57600080fd5b61294883612910565b946020939093013593505050565b60006020828403121561296857600080fd5b61289082612910565b60008060006060848603121561298657600080fd5b61298f84612910565b925061299d60208501612910565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156129de576129de6129ad565b604051601f8501601f19908116603f01168101908282118183101715612a0657612a066129ad565b81604052809350858152868686011115612a1f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a4b57600080fd5b813567ffffffffffffffff811115612a6257600080fd5b8201601f81018413612a7357600080fd5b611f42848235602084016129c3565b60ff81168114611bb157600080fd5b600060208284031215612aa357600080fd5b813561289081612a82565b60008060208385031215612ac157600080fd5b823567ffffffffffffffff80821115612ad957600080fd5b818501915085601f830112612aed57600080fd5b813581811115612afc57600080fd5b8660208260051b8501011115612b1157600080fd5b60209290920196919550909350505050565b8015158114611bb157600080fd5b60008060408385031215612b4457600080fd5b612b4d83612910565b91506020830135612b5d81612b23565b809150509250929050565b60008060008060808587031215612b7e57600080fd5b612b8785612910565b9350612b9560208601612910565b925060408501359150606085013567ffffffffffffffff811115612bb857600080fd5b8501601f81018713612bc957600080fd5b612bd8878235602084016129c3565b91505092959194509250565b60008060408385031215612bf757600080fd5b612c0083612910565b9150612c0e60208401612910565b90509250929050565b600181811c90821680612c2b57607f821691505b60208210811415612c4c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ce757612ce7612cbe565b500190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6000600019821415612d3757612d37612cbe565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612db757600080fd5b815161289081612a82565b600060208284031215612dd457600080fd5b815161289081612b23565b6000816000190483118215151615612df957612df9612cbe565b500290565b600082821015612e1057612e10612cbe565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e9a90830184612897565b9695505050505050565b600060208284031215612eb657600080fd5b81516128908161285d565b634e487b7160e01b600052603160045260246000fdfea264697066735822122006f5a04dadbce6cc1dfc95bb9e65ae457001a07c9528e8d39969e365a583e36a64736f6c63430008090033

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

00000000000000000000000067bc91d7e3ac0ccccbf6075f6485bd0e7ad2ca1b

-----Decoded View---------------
Arg [0] : _preBuyContract (address): 0x67Bc91D7E3Ac0cCccbf6075F6485bd0E7ad2Ca1B

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000067bc91d7e3ac0ccccbf6075f6485bd0e7ad2ca1b


Deployed Bytecode Sourcemap

43783:7173:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50741:212;;;;;;;;;;-1:-1:-1;50741:212:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;50741:212:0;;;;;;;;44195:26;;;;;;;;;;-1:-1:-1;44195:26:0;;;;;;;;;;;21751:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43952:45::-;;;;;;;;;;;;;;;;;;;1440:25:1;;;1428:2;1413:18;43952:45:0;1294:177:1;23310:221:0;;;;;;;;;;-1:-1:-1;23310:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1825:32:1;;;1807:51;;1795:2;1780:18;23310:221:0;1661:203:1;22833:411:0;;;;;;;;;;-1:-1:-1;22833:411:0;;;;;:::i;:::-;;:::i;:::-;;35502:113;;;;;;;;;;-1:-1:-1;35590:10:0;:17;35502:113;;47311:123;;;;;;;;;;-1:-1:-1;47311:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;47404:22:0;47380:4;47404:22;;;:16;:22;;;;;;;;;47311:123;43901:42;;;;;;;;;;;;;;;;47442:118;;;;;;;;;;-1:-1:-1;47442:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;47532:20:0;47505:7;47532:20;;;:13;:20;;;;;;;47442:118;45855:449;;;;;;;;;;-1:-1:-1;45855:449:0;;;;;:::i;:::-;;:::i;24200:339::-;;;;;;;;;;-1:-1:-1;24200:339:0;;;;;:::i;:::-;;:::i;35170:256::-;;;;;;;;;;-1:-1:-1;35170:256:0;;;;;:::i;:::-;;:::i;49556:141::-;;;;;;;;;;;;;:::i;24610:185::-;;;;;;;;;;-1:-1:-1;24610:185:0;;;;;:::i;:::-;;:::i;43862:30::-;;;;;;;;;;;;;;;;35692:233;;;;;;;;;;-1:-1:-1;35692:233:0;;;;;:::i;:::-;;:::i;49705:140::-;;;;;;;;;;-1:-1:-1;49705:140:0;;;;;:::i;:::-;;:::i;21445:239::-;;;;;;;;;;-1:-1:-1;21445:239:0;;;;;:::i;:::-;;:::i;47568:555::-;;;;;;;;;;-1:-1:-1;47568:555:0;;;;;:::i;:::-;;:::i;21175:208::-;;;;;;;;;;-1:-1:-1;21175:208:0;;;;;:::i;:::-;;:::i;42665:94::-;;;;;;;;;;;;;:::i;42014:87::-;;;;;;;;;;-1:-1:-1;42087:6:0;;-1:-1:-1;;;;;42087:6:0;42014:87;;21920:104;;;;;;;;;;;;;:::i;46681:367::-;;;;;;;;;;-1:-1:-1;46681:367:0;;;;;:::i;:::-;;:::i;48727:681::-;;;;;;:::i;:::-;;:::i;23603:295::-;;;;;;;;;;-1:-1:-1;23603:295:0;;;;;:::i;:::-;;:::i;44159:29::-;;;;;;;;;;-1:-1:-1;44159:29:0;;;;;;;;46312:361;;;;;;;;;;-1:-1:-1;46312:361:0;;;;;:::i;:::-;;:::i;50072:94::-;;;;;;;;;;-1:-1:-1;50072:94:0;;;;;:::i;:::-;;:::i;50294:106::-;;;;;;;;;;-1:-1:-1;50294:106:0;;;;;:::i;:::-;;:::i;24866:328::-;;;;;;;;;;-1:-1:-1;24866:328:0;;;;;:::i;:::-;;:::i;49853:211::-;;;;;;;;;;-1:-1:-1;49853:211:0;;;;;:::i;:::-;;:::i;44050:30::-;;;;;;;;;;;;;;;;44124:26;;;;;;;;;;;;;:::i;48131:588::-;;;:::i;23969:164::-;;;;;;;;;;-1:-1:-1;23969:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24090:25:0;;;24066:4;24090:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23969:164;49416:132;;;;;;;;;;;;;:::i;44006:35::-;;;;;;;;;;;;;;;;42914:192;;;;;;;;;;-1:-1:-1;42914:192:0;;;;;:::i;:::-;;:::i;50174:112::-;;;;;;;;;;-1:-1:-1;50174:112:0;;;;;:::i;:::-;;:::i;47179:124::-;;;;;;;;;;-1:-1:-1;47179:124:0;;;;;:::i;:::-;;:::i;44087:28::-;;;;;;;;;;;;;;;;50741:212;50880:4;50909:36;50933:11;50909:23;:36::i;:::-;50902:43;50741:212;-1:-1:-1;;50741:212:0:o;21751:100::-;21805:13;21838:5;21831:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21751:100;:::o;23310:221::-;23386:7;26793:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26793:16:0;23406:73;;;;-1:-1:-1;;;23406:73:0;;7009:2:1;23406:73:0;;;6991:21:1;7048:2;7028:18;;;7021:30;7087:34;7067:18;;;7060:62;-1:-1:-1;;;7138:18:1;;;7131:42;7190:19;;23406:73:0;;;;;;;;;-1:-1:-1;23499:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23499:24:0;;23310:221::o;22833:411::-;22914:13;22930:23;22945:7;22930:14;:23::i;:::-;22914:39;;22978:5;-1:-1:-1;;;;;22972:11:0;:2;-1:-1:-1;;;;;22972:11:0;;;22964:57;;;;-1:-1:-1;;;22964:57:0;;7422:2:1;22964:57:0;;;7404:21:1;7461:2;7441:18;;;7434:30;7500:34;7480:18;;;7473:62;-1:-1:-1;;;7551:18:1;;;7544:31;7592:19;;22964:57:0;7220:397:1;22964:57:0;16288:10;-1:-1:-1;;;;;23056:21:0;;;;:62;;-1:-1:-1;23081:37:0;23098:5;16288:10;23969:164;:::i;23081:37::-;23034:168;;;;-1:-1:-1;;;23034:168:0;;7824:2:1;23034:168:0;;;7806:21:1;7863:2;7843:18;;;7836:30;7902:34;7882:18;;;7875:62;7973:26;7953:18;;;7946:54;8017:19;;23034:168:0;7622:420:1;23034:168:0;23215:21;23224:2;23228:7;23215:8;:21::i;:::-;22903:341;22833:411;;:::o;45855:449::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;45943:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;45981:23:0;::::1;45973:59;;;;-1:-1:-1::0;;;45973:59:0::1;;;;;;;:::i;:::-;46067:8;::::0;35590:10;:17;46051:24:::1;46043:64;;;::::0;-1:-1:-1;;;46043:64:0;;8962:2:1;46043:64:0::1;::::0;::::1;8944:21:1::0;9001:2;8981:18;;;8974:30;9040:29;9020:18;;;9013:57;9087:18;;46043:64:0::1;8760:351:1::0;46043:64:0::1;46152:8;;46142:6;46126:13;35590:10:::0;:17;;35502:113;46126:13:::1;:22;;;;:::i;:::-;:34;;46118:78;;;;-1:-1:-1::0;;;46118:78:0::1;;;;;;;:::i;:::-;46214:9;46209:88;46233:6;46229:1;:10;46209:88;;;46261:24;46275:9;46261:13;:24::i;:::-;46241:3:::0;::::1;::::0;::::1;:::i;:::-;;;;46209:88;;24200:339:::0;24395:41;16288:10;24428:7;24395:18;:41::i;:::-;24387:103;;;;-1:-1:-1;;;24387:103:0;;;;;;;:::i;:::-;24503:28;24513:4;24519:2;24523:7;24503:9;:28::i;35170:256::-;35267:7;35303:23;35320:5;35303:16;:23::i;:::-;35295:5;:31;35287:87;;;;-1:-1:-1;;;35287:87:0;;10501:2:1;35287:87:0;;;10483:21:1;10540:2;10520:18;;;10513:30;10579:34;10559:18;;;10552:62;-1:-1:-1;;;10630:18:1;;;10623:41;10681:19;;35287:87:0;10299:407:1;35287:87:0;-1:-1:-1;;;;;;35392:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35170:256::o;49556:141::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;49621:19:::1;:17;:19::i;:::-;49672:17;::::0;;-1:-1:-1;;49651:38:0;::::1;49672:17;::::0;;::::1;49671:18;49651:38;::::0;;49556:141::o;24610:185::-;24748:39;24765:4;24771:2;24775:7;24748:39;;;;;;;;;;;;:16;:39::i;35692:233::-;35767:7;35803:30;35590:10;:17;;35502:113;35803:30;35795:5;:38;35787:95;;;;-1:-1:-1;;;35787:95:0;;10913:2:1;35787:95:0;;;10895:21:1;10952:2;10932:18;;;10925:30;10991:34;10971:18;;;10964:62;-1:-1:-1;;;11042:18:1;;;11035:42;11094:19;;35787:95:0;10711:408:1;35787:95:0;35900:10;35911:5;35900:17;;;;;;;;:::i;:::-;;;;;;;;;35893:24;;35692:233;;;:::o;49705:140::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;49776:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49814:23;49829:7;49814:23;;;;;;:::i;:::-;;;;;;;;49705:140:::0;:::o;21445:239::-;21517:7;21553:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21553:16:0;21588:19;21580:73;;;;-1:-1:-1;;;21580:73:0;;11458:2:1;21580:73:0;;;11440:21:1;11497:2;11477:18;;;11470:30;11536:34;11516:18;;;11509:62;-1:-1:-1;;;11587:18:1;;;11580:39;11636:19;;21580:73:0;11256:405:1;47568:555:0;47625:23;:21;:23::i;:::-;47679:6;;:53;;-1:-1:-1;;;47679:53:0;;11866:4:1;11854:17;;47679:53:0;;;11836:36:1;47721:10:0;11888:18:1;;;11881:60;47661:15:0;;-1:-1:-1;;;;;47679:6:0;;:30;;11809:18:1;;47679:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47661:71;-1:-1:-1;47753:14:0;;;47745:56;;;;-1:-1:-1;;;47745:56:0;;12406:2:1;47745:56:0;;;12388:21:1;12445:2;12425:18;;;12418:30;12484:31;12464:18;;;12457:59;12533:18;;47745:56:0;12204:353:1;47745:56:0;47821:6;;:59;;-1:-1:-1;;;47821:59:0;;11866:4:1;11854:17;;47821:59:0;;;11836:36:1;47869:10:0;11888:18:1;;;11881:60;-1:-1:-1;;;;;47821:6:0;;;;:36;;11809:18:1;;47821:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47820:60;47812:87;;;;-1:-1:-1;;;47812:87:0;;13014:2:1;47812:87:0;;;12996:21:1;13053:2;13033:18;;;13026:30;-1:-1:-1;;;13072:18:1;;;13065:44;13126:18;;47812:87:0;12812:338:1;47812:87:0;47917:9;47912:97;47936:9;47932:13;;:1;:13;47912:97;;;47967:30;47986:10;47967:18;:30::i;:::-;47947:3;;;;:::i;:::-;;;;47912:97;;;-1:-1:-1;48019:6:0;;:47;;-1:-1:-1;;;48019:47:0;;11866:4:1;11854:17;;48019:47:0;;;11836:36:1;48055:10:0;11888:18:1;;;11881:60;-1:-1:-1;;;;;48019:6:0;;;;:24;;11809:18:1;;48019:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48082:33:0;;;48093:10;13327:51:1;;13426:4;13414:17;;13409:2;13394:18;;13387:45;48082:33:0;;-1:-1:-1;13300:18:1;;-1:-1:-1;48082:33:0;;;;;;;47614:509;47568:555;:::o;21175:208::-;21247:7;-1:-1:-1;;;;;21275:19:0;;21267:74;;;;-1:-1:-1;;;21267:74:0;;13645:2:1;21267:74:0;;;13627:21:1;13684:2;13664:18;;;13657:30;13723:34;13703:18;;;13696:62;-1:-1:-1;;;13774:18:1;;;13767:40;13824:19;;21267:74:0;13443:406:1;21267:74:0;-1:-1:-1;;;;;;21359:16:0;;;;;:9;:16;;;;;;;21175:208::o;42665:94::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;42730:21:::1;42748:1;42730:9;:21::i;:::-;42665:94::o:0;21920:104::-;21976:13;22009:7;22002:14;;;;;:::i;46681:367::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;46773:9:::1;46768:273;46788:20:::0;;::::1;46768:273;;;46862:1;46838:9:::0;;46848:1;46838:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46838:26:0::1;;;46830:62;;;;-1:-1:-1::0;;;46830:62:0::1;;;;;;;:::i;:::-;46942:5;46909:16;:30;46926:9;;46936:1;46926:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46909:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;46909:30:0;;;:38;;-1:-1:-1;;46909:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;46964:13:::1;-1:-1:-1::0;46978:9:0;;46988:1;46978:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46964:27:0::1;-1:-1:-1::0;;;;;46964:27:0::1;;;;;;;;;;;;;:31;:65;;47028:1;46964:65;;;46998:13;:27;47012:9;;47022:1;47012:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46998:27:0::1;-1:-1:-1::0;;;;;46998:27:0::1;;;;;;;;;;;;;46964:65;-1:-1:-1::0;46810:3:0;::::1;::::0;::::1;:::i;:::-;;;;46768:273;;48727:681:::0;48791:23;:21;:23::i;:::-;48865:8;;48849:12;48833:13;35590:10;:17;;35502:113;48833:13;:28;;;;:::i;:::-;:40;;48825:84;;;;-1:-1:-1;;;48825:84:0;;;;;;;:::i;:::-;48943:1;48928:12;:16;48920:51;;;;-1:-1:-1;;;48920:51:0;;14056:2:1;48920:51:0;;;14038:21:1;14095:2;14075:18;;;14068:30;-1:-1:-1;;;14114:18:1;;;14107:52;14176:18;;48920:51:0;13854:346:1;48920:51:0;49034:15;;49004:10;48990:25;;;;:13;:25;;;;;;:40;;49018:12;;48990:40;:::i;:::-;:59;;48982:111;;;;-1:-1:-1;;;48982:111:0;;14407:2:1;48982:111:0;;;14389:21:1;14446:2;14426:18;;;14419:30;14485:34;14465:18;;;14458:62;-1:-1:-1;;;14536:18:1;;;14529:37;14583:19;;48982:111:0;14205:403:1;48982:111:0;49148:9;49132:12;49112:17;;:32;;;;:::i;:::-;:45;49104:81;;;;-1:-1:-1;;;49104:81:0;;14988:2:1;49104:81:0;;;14970:21:1;15027:2;15007:18;;;15000:30;-1:-1:-1;;;15046:18:1;;;15039:53;15109:18;;49104:81:0;14786:347:1;49104:81:0;49203:9;49198:94;49222:12;49218:1;:16;49198:94;;;49256:24;49269:10;49256:12;:24::i;:::-;49236:3;;;;:::i;:::-;;;;49198:94;;;-1:-1:-1;49310:13:0;;49302:42;;-1:-1:-1;;;;;49310:13:0;;;;;;;;;49334:9;49302:42;;;;;;;;;49334:9;49310:13;49302:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49360:40:0;;;49375:10;15312:51:1;;15394:2;15379:18;;15372:34;;;49360:40:0;;15285:18:1;49360:40:0;15138:274:1;23603:295:0;-1:-1:-1;;;;;23706:24:0;;16288:10;23706:24;;23698:62;;;;-1:-1:-1;;;23698:62:0;;15619:2:1;23698:62:0;;;15601:21:1;15658:2;15638:18;;;15631:30;15697:27;15677:18;;;15670:55;15742:18;;23698:62:0;15417:349:1;23698:62:0;16288:10;23773:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23773:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23773:53:0;;;;;;;;;;23842:48;;540:41:1;;;23773:42:0;;16288:10;23842:48;;513:18:1;23842:48:0;;;;;;;23603:295;;:::o;46312:361::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;46399:9:::1;46394:272;46414:20:::0;;::::1;46394:272;;;46488:1;46464:9:::0;;46474:1;46464:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46464:26:0::1;;;46456:62;;;;-1:-1:-1::0;;;46456:62:0::1;;;;;;;:::i;:::-;46568:4;46535:16;:30;46552:9;;46562:1;46552:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46535:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;46535:30:0;;;:37;;-1:-1:-1;;46535:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;46589:13:::1;-1:-1:-1::0;46603:9:0;;46613:1;46603:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46589:27:0::1;-1:-1:-1::0;;;;;46589:27:0::1;;;;;;;;;;;;;:31;:65;;46653:1;46589:65;;;46623:13;:27;46637:9;;46647:1;46637:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46623:27:0::1;-1:-1:-1::0;;;;;46623:27:0::1;;;;;;;;;;;;;46589:65;-1:-1:-1::0;46436:3:0;::::1;::::0;::::1;:::i;:::-;;;;46394:272;;50072:94:::0;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;50140:8:::1;:18:::0;50072:94::o;50294:106::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;50368:14:::1;:24:::0;50294:106::o;24866:328::-;25041:41;16288:10;25074:7;25041:18;:41::i;:::-;25033:103;;;;-1:-1:-1;;;25033:103:0;;;;;;;:::i;:::-;25147:39;25161:4;25167:2;25171:7;25180:5;25147:13;:39::i;:::-;24866:328;;;;:::o;49853:211::-;26769:4;26793:16;;;:7;:16;;;;;;49926:13;;-1:-1:-1;;;;;26793:16:0;49952:76;;;;-1:-1:-1;;;49952:76:0;;15973:2:1;49952:76:0;;;15955:21:1;16012:2;15992:18;;;15985:30;16051:34;16031:18;;;16024:62;-1:-1:-1;;;16102:18:1;;;16095:45;16157:19;;49952:76:0;15771:411:1;49952:76:0;50046:10;:8;:10::i;44124:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48131:588::-;48190:14;;;;;;;48182:50;;;;-1:-1:-1;;;48182:50:0;;16389:2:1;48182:50:0;;;16371:21:1;16428:2;16408:18;;;16401:30;16467:25;16447:18;;;16440:53;16510:18;;48182:50:0;16187:347:1;48182:50:0;48268:10;48251:28;;;;:16;:28;;;;;;;;48243:77;;;;-1:-1:-1;;;48243:77:0;;16741:2:1;48243:77:0;;;16723:21:1;16780:2;16760:18;;;16753:30;16819:34;16799:18;;;16792:62;-1:-1:-1;;;16870:18:1;;;16863:34;16914:19;;48243:77:0;16539:400:1;48243:77:0;48360:8;;35590:10;:17;48339;;48355:1;48339:17;:::i;:::-;:29;;48331:73;;;;-1:-1:-1;;;48331:73:0;;;;;;;:::i;:::-;48441:9;48423:14;;:27;48415:63;;;;-1:-1:-1;;;48415:63:0;;14988:2:1;48415:63:0;;;14970:21:1;15027:2;15007:18;;;15000:30;-1:-1:-1;;;15046:18:1;;;15039:53;15109:18;;48415:63:0;14786:347:1;48415:63:0;48511:10;48497:25;;;;:13;:25;;;;;;48525:1;-1:-1:-1;48489:90:0;;;;-1:-1:-1;;;48489:90:0;;17146:2:1;48489:90:0;;;17128:21:1;17185:2;17165:18;;;17158:30;17224:34;17204:18;;;17197:62;-1:-1:-1;;;17275:18:1;;;17268:46;17331:19;;48489:90:0;16944:412:1;48489:90:0;48592:24;48605:10;48592:12;:24::i;:::-;48635:13;;48627:42;;-1:-1:-1;;;;;48635:13:0;;;;;;;;;48659:9;48627:42;;;;;;;;;48659:9;48635:13;48627:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48685:26:0;;;48697:10;15312:51:1;;48709:1:0;15394:2:1;15379:18;;15372:34;48685:26:0;;15285:18:1;48685:26:0;;;;;;;48131:588::o;49416:132::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;49478:19:::1;:17;:19::i;:::-;49526:14;::::0;;-1:-1:-1;;49508:32:0;::::1;49526:14;::::0;;;::::1;;;49525:15;49508:32:::0;;::::1;;::::0;;49416:132::o;42914:192::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43003:22:0;::::1;42995:73;;;::::0;-1:-1:-1;;;42995:73:0;;17850:2:1;42995:73:0::1;::::0;::::1;17832:21:1::0;17889:2;17869:18;;;17862:30;17928:34;17908:18;;;17901:62;-1:-1:-1;;;17979:18:1;;;17972:36;18025:19;;42995:73:0::1;17648:402:1::0;42995:73:0::1;43079:19;43089:8;43079:9;:19::i;:::-;42914:192:::0;:::o;50174:112::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;50251:17:::1;:27:::0;50174:112::o;47179:124::-;42087:6;;-1:-1:-1;;;;;42087:6:0;16288:10;42234:23;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;47263:13:::1;:32:::0;;-1:-1:-1;;;;;47263:32:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;47263:32:0;;::::1;::::0;;;::::1;::::0;;47179:124::o;34862:224::-;34964:4;-1:-1:-1;;;;;;34988:50:0;;-1:-1:-1;;;34988:50:0;;:90;;;35042:36;35066:11;35042:23;:36::i;30686:174::-;30761:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30761:29:0;-1:-1:-1;;;;;30761:29:0;;;;;;;;:24;;30815:23;30761:24;30815:14;:23::i;:::-;-1:-1:-1;;;;;30806:46:0;;;;;;;;;;;30686:174;;:::o;44649:108::-;44705:6;;;;;;;;;-1:-1:-1;;;;;44705:6:0;-1:-1:-1;;;;;44705:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44697:52;;;;-1:-1:-1;;;44697:52:0;;18257:2:1;44697:52:0;;;18239:21:1;18296:2;18276:18;;;18269:30;-1:-1:-1;;;18315:18:1;;;18308:46;18371:18;;44697:52:0;18055:340:1;45316:191:0;45418:13;;45390:6;;:25;;;-1:-1:-1;;;45390:25:0;;;;45372:15;;45418:13;-1:-1:-1;;;;;45390:6:0;;:23;;:25;;;;;;;;;;;;;;45372:15;45390:6;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;;;:::i;:::-;:45;;45434:1;45390:45;:::i;:::-;45372:63;;45446:24;45456:4;45462:7;45446:9;:24::i;:::-;45498:1;45481:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;45316:191:0:o;26998:348::-;27091:4;26793:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26793:16:0;27108:73;;;;-1:-1:-1;;;27108:73:0;;18602:2:1;27108:73:0;;;18584:21:1;18641:2;18621:18;;;18614:30;18680:34;18660:18;;;18653:62;-1:-1:-1;;;18731:18:1;;;18724:42;18783:19;;27108:73:0;18400:408:1;27108:73:0;27192:13;27208:23;27223:7;27208:14;:23::i;:::-;27192:39;;27261:5;-1:-1:-1;;;;;27250:16:0;:7;-1:-1:-1;;;;;27250:16:0;;:51;;;;27294:7;-1:-1:-1;;;;;27270:31:0;:20;27282:7;27270:11;:20::i;:::-;-1:-1:-1;;;;;27270:31:0;;27250:51;:87;;;-1:-1:-1;;;;;;24090:25:0;;;24066:4;24090:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27305:32;27242:96;26998:348;-1:-1:-1;;;;26998:348:0:o;29990:578::-;30149:4;-1:-1:-1;;;;;30122:31:0;:23;30137:7;30122:14;:23::i;:::-;-1:-1:-1;;;;;30122:31:0;;30114:85;;;;-1:-1:-1;;;30114:85:0;;19015:2:1;30114:85:0;;;18997:21:1;19054:2;19034:18;;;19027:30;19093:34;19073:18;;;19066:62;-1:-1:-1;;;19144:18:1;;;19137:39;19193:19;;30114:85:0;18813:405:1;30114:85:0;-1:-1:-1;;;;;30218:16:0;;30210:65;;;;-1:-1:-1;;;30210:65:0;;19425:2:1;30210:65:0;;;19407:21:1;19464:2;19444:18;;;19437:30;19503:34;19483:18;;;19476:62;-1:-1:-1;;;19554:18:1;;;19547:34;19598:19;;30210:65:0;19223:400:1;30210:65:0;30288:39;30309:4;30315:2;30319:7;30288:20;:39::i;:::-;30392:29;30409:1;30413:7;30392:8;:29::i;:::-;-1:-1:-1;;;;;30434:15:0;;;;;;:9;:15;;;;;:20;;30453:1;;30434:15;:20;;30453:1;;30434:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30465:13:0;;;;;;:9;:13;;;;;:18;;30482:1;;30465:13;:18;;30482:1;;30465:18;:::i;:::-;;;;-1:-1:-1;;30494:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30494:21:0;-1:-1:-1;;;;;30494:21:0;;;;;;;;;30533:27;;30494:16;;30533:27;;;;;;;29990:578;;;:::o;44769:122::-;44834:17;;;;44826:57;;;;-1:-1:-1;;;44826:57:0;;19960:2:1;44826:57:0;;;19942:21:1;19999:2;19979:18;;;19972:30;20038:29;20018:18;;;20011:57;20085:18;;44826:57:0;19758:351:1;45640:207:0;45701:15;45719;;45737:1;45719:19;;;;:::i;:::-;45701:37;;45749:24;45759:4;45765:7;45749:9;:24::i;:::-;-1:-1:-1;;;;;45784:19:0;;;;;;:13;:19;;;;;:24;;45807:1;;45784:19;:24;;45807:1;;45784:24;:::i;:::-;;;;;;;;45838:1;45819:15;;:20;;;;;;;:::i;43114:173::-;43189:6;;;-1:-1:-1;;;;;43206:17:0;;;-1:-1:-1;;;;;;43206:17:0;;;;;;;43239:40;;43189:6;;;43206:17;43189:6;;43239:40;;43170:16;;43239:40;43159:128;43114:173;:::o;45515:117::-;45570:19;45584:4;45570:13;:19::i;:::-;-1:-1:-1;;;;;45600:19:0;;;;;;:13;:19;;;;;:24;;45623:1;;45600:19;:24;;45623:1;;45600:24;:::i;:::-;;;;-1:-1:-1;;;45515:117:0:o;26076:315::-;26233:28;26243:4;26249:2;26253:7;26233:9;:28::i;:::-;26280:48;26303:4;26309:2;26313:7;26322:5;26280:22;:48::i;:::-;26272:111;;;;-1:-1:-1;;;26272:111:0;;;;;;;:::i;50408:113::-;50468:13;50501:12;50494:19;;;;;:::i;20806:305::-;20908:4;-1:-1:-1;;;;;;20945:40:0;;-1:-1:-1;;;20945:40:0;;:105;;-1:-1:-1;;;;;;;21002:48:0;;-1:-1:-1;;;21002:48:0;20945:105;:158;;;-1:-1:-1;;;;;;;;;;19413:40:0;;;21067:36;19304:157;27688:110;27764:26;27774:2;27778:7;27764:26;;;;;;;;;;;;:9;:26::i;:::-;27688:110;;:::o;50529:204::-;50680:45;50707:4;50713:2;50717:7;50680:26;:45::i;31425:799::-;31580:4;-1:-1:-1;;;;;31601:13:0;;8567:20;8615:8;31597:620;;31637:72;;-1:-1:-1;;;31637:72:0;;-1:-1:-1;;;;;31637:36:0;;;;;:72;;16288:10;;31688:4;;31694:7;;31703:5;;31637:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31637:72:0;;;;;;;;-1:-1:-1;;31637:72:0;;;;;;;;;;;;:::i;:::-;;;31633:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31879:13:0;;31875:272;;31922:60;;-1:-1:-1;;;31922:60:0;;;;;;;:::i;31875:272::-;32097:6;32091:13;32082:6;32078:2;32074:15;32067:38;31633:529;-1:-1:-1;;;;;;31760:51:0;-1:-1:-1;;;31760:51:0;;-1:-1:-1;31753:58:0;;31597:620;-1:-1:-1;32201:4:0;31425:799;;;;;;:::o;28025:321::-;28155:18;28161:2;28165:7;28155:5;:18::i;:::-;28206:54;28237:1;28241:2;28245:7;28254:5;28206:22;:54::i;:::-;28184:154;;;;-1:-1:-1;;;28184:154:0;;;;;;;:::i;36538:589::-;-1:-1:-1;;;;;36744:18:0;;36740:187;;36779:40;36811:7;37954:10;:17;;37927:24;;;;:15;:24;;;;;:44;;;37982:24;;;;;;;;;;;;37850:164;36779:40;36740:187;;;36849:2;-1:-1:-1;;;;;36841:10:0;:4;-1:-1:-1;;;;;36841:10:0;;36837:90;;36868:47;36901:4;36907:7;36868:32;:47::i;:::-;-1:-1:-1;;;;;36941:16:0;;36937:183;;36974:45;37011:7;36974:36;:45::i;36937:183::-;37047:4;-1:-1:-1;;;;;37041:10:0;:2;-1:-1:-1;;;;;37041:10:0;;37037:83;;37068:40;37096:2;37100:7;37068:27;:40::i;28682:382::-;-1:-1:-1;;;;;28762:16:0;;28754:61;;;;-1:-1:-1;;;28754:61:0;;21483:2:1;28754:61:0;;;21465:21:1;;;21502:18;;;21495:30;21561:34;21541:18;;;21534:62;21613:18;;28754:61:0;21281:356:1;28754:61:0;26769:4;26793:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26793:16:0;:30;28826:58;;;;-1:-1:-1;;;28826:58:0;;21844:2:1;28826:58:0;;;21826:21:1;21883:2;21863:18;;;21856:30;21922;21902:18;;;21895:58;21970:18;;28826:58:0;21642:352:1;28826:58:0;28897:45;28926:1;28930:2;28934:7;28897:20;:45::i;:::-;-1:-1:-1;;;;;28955:13:0;;;;;;:9;:13;;;;;:18;;28972:1;;28955:13;:18;;28972:1;;28955:18;:::i;:::-;;;;-1:-1:-1;;28984:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28984:21:0;-1:-1:-1;;;;;28984:21:0;;;;;;;;29023:33;;28984:16;;;29023:33;;28984:16;;29023:33;28682:382;;:::o;38641:988::-;38907:22;38957:1;38932:22;38949:4;38932:16;:22::i;:::-;:26;;;;:::i;:::-;38969:18;38990:26;;;:17;:26;;;;;;38907:51;;-1:-1:-1;39123:28:0;;;39119:328;;-1:-1:-1;;;;;39190:18:0;;39168:19;39190:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39241:30;;;;;;:44;;;39358:30;;:17;:30;;;;;:43;;;39119:328;-1:-1:-1;39543:26:0;;;;:17;:26;;;;;;;;39536:33;;;-1:-1:-1;;;;;39587:18:0;;;;;:12;:18;;;;;:34;;;;;;;39580:41;38641:988::o;39924:1079::-;40202:10;:17;40177:22;;40202:21;;40222:1;;40202:21;:::i;:::-;40234:18;40255:24;;;:15;:24;;;;;;40628:10;:26;;40177:46;;-1:-1:-1;40255:24:0;;40177:46;;40628:26;;;;;;:::i;:::-;;;;;;;;;40606:48;;40692:11;40667:10;40678;40667:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40772:28;;;:15;:28;;;;;;;:41;;;40944:24;;;;;40937:31;40979:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39995:1008;;;39924:1079;:::o;37428:221::-;37513:14;37530:20;37547:2;37530:16;:20::i;:::-;-1:-1:-1;;;;;37561:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37606:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37428:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:472::-;634:3;672:5;666:12;699:6;694:3;687:19;724:1;734:162;748:6;745:1;742:13;734:162;;;810:4;866:13;;;862:22;;856:29;838:11;;;834:20;;827:59;763:12;734:162;;;914:6;911:1;908:13;905:87;;;980:1;973:4;964:6;959:3;955:16;951:27;944:38;905:87;-1:-1:-1;1046:2:1;1025:15;-1:-1:-1;;1021:29:1;1012:39;;;;1053:4;1008:50;;592:472;-1:-1:-1;;592:472:1:o;1069:220::-;1218:2;1207:9;1200:21;1181:4;1238:45;1279:2;1268:9;1264:18;1256:6;1238:45;:::i;1476:180::-;1535:6;1588:2;1576:9;1567:7;1563:23;1559:32;1556:52;;;1604:1;1601;1594:12;1556:52;-1:-1:-1;1627:23:1;;1476:180;-1:-1:-1;1476:180:1:o;1869:173::-;1937:20;;-1:-1:-1;;;;;1986:31:1;;1976:42;;1966:70;;2032:1;2029;2022:12;1966:70;1869:173;;;:::o;2047:254::-;2115:6;2123;2176:2;2164:9;2155:7;2151:23;2147:32;2144:52;;;2192:1;2189;2182:12;2144:52;2215:29;2234:9;2215:29;:::i;:::-;2205:39;2291:2;2276:18;;;;2263:32;;-1:-1:-1;;;2047:254:1:o;2306:186::-;2365:6;2418:2;2406:9;2397:7;2393:23;2389:32;2386:52;;;2434:1;2431;2424:12;2386:52;2457:29;2476:9;2457:29;:::i;2497:328::-;2574:6;2582;2590;2643:2;2631:9;2622:7;2618:23;2614:32;2611:52;;;2659:1;2656;2649:12;2611:52;2682:29;2701:9;2682:29;:::i;:::-;2672:39;;2730:38;2764:2;2753:9;2749:18;2730:38;:::i;:::-;2720:48;;2815:2;2804:9;2800:18;2787:32;2777:42;;2497:328;;;;;:::o;2830:127::-;2891:10;2886:3;2882:20;2879:1;2872:31;2922:4;2919:1;2912:15;2946:4;2943:1;2936:15;2962:632;3027:5;3057:18;3098:2;3090:6;3087:14;3084:40;;;3104:18;;:::i;:::-;3179:2;3173:9;3147:2;3233:15;;-1:-1:-1;;3229:24:1;;;3255:2;3225:33;3221:42;3209:55;;;3279:18;;;3299:22;;;3276:46;3273:72;;;3325:18;;:::i;:::-;3365:10;3361:2;3354:22;3394:6;3385:15;;3424:6;3416;3409:22;3464:3;3455:6;3450:3;3446:16;3443:25;3440:45;;;3481:1;3478;3471:12;3440:45;3531:6;3526:3;3519:4;3511:6;3507:17;3494:44;3586:1;3579:4;3570:6;3562;3558:19;3554:30;3547:41;;;;2962:632;;;;;:::o;3599:451::-;3668:6;3721:2;3709:9;3700:7;3696:23;3692:32;3689:52;;;3737:1;3734;3727:12;3689:52;3777:9;3764:23;3810:18;3802:6;3799:30;3796:50;;;3842:1;3839;3832:12;3796:50;3865:22;;3918:4;3910:13;;3906:27;-1:-1:-1;3896:55:1;;3947:1;3944;3937:12;3896:55;3970:74;4036:7;4031:2;4018:16;4013:2;4009;4005:11;3970:74;:::i;4055:114::-;4139:4;4132:5;4128:16;4121:5;4118:27;4108:55;;4159:1;4156;4149:12;4174:243;4231:6;4284:2;4272:9;4263:7;4259:23;4255:32;4252:52;;;4300:1;4297;4290:12;4252:52;4339:9;4326:23;4358:29;4381:5;4358:29;:::i;4422:615::-;4508:6;4516;4569:2;4557:9;4548:7;4544:23;4540:32;4537:52;;;4585:1;4582;4575:12;4537:52;4625:9;4612:23;4654:18;4695:2;4687:6;4684:14;4681:34;;;4711:1;4708;4701:12;4681:34;4749:6;4738:9;4734:22;4724:32;;4794:7;4787:4;4783:2;4779:13;4775:27;4765:55;;4816:1;4813;4806:12;4765:55;4856:2;4843:16;4882:2;4874:6;4871:14;4868:34;;;4898:1;4895;4888:12;4868:34;4951:7;4946:2;4936:6;4933:1;4929:14;4925:2;4921:23;4917:32;4914:45;4911:65;;;4972:1;4969;4962:12;4911:65;5003:2;4995:11;;;;;5025:6;;-1:-1:-1;4422:615:1;;-1:-1:-1;;;;4422:615:1:o;5042:118::-;5128:5;5121:13;5114:21;5107:5;5104:32;5094:60;;5150:1;5147;5140:12;5165:315;5230:6;5238;5291:2;5279:9;5270:7;5266:23;5262:32;5259:52;;;5307:1;5304;5297:12;5259:52;5330:29;5349:9;5330:29;:::i;:::-;5320:39;;5409:2;5398:9;5394:18;5381:32;5422:28;5444:5;5422:28;:::i;:::-;5469:5;5459:15;;;5165:315;;;;;:::o;5485:667::-;5580:6;5588;5596;5604;5657:3;5645:9;5636:7;5632:23;5628:33;5625:53;;;5674:1;5671;5664:12;5625:53;5697:29;5716:9;5697:29;:::i;:::-;5687:39;;5745:38;5779:2;5768:9;5764:18;5745:38;:::i;:::-;5735:48;;5830:2;5819:9;5815:18;5802:32;5792:42;;5885:2;5874:9;5870:18;5857:32;5912:18;5904:6;5901:30;5898:50;;;5944:1;5941;5934:12;5898:50;5967:22;;6020:4;6012:13;;6008:27;-1:-1:-1;5998:55:1;;6049:1;6046;6039:12;5998:55;6072:74;6138:7;6133:2;6120:16;6115:2;6111;6107:11;6072:74;:::i;:::-;6062:84;;;5485:667;;;;;;;:::o;6157:260::-;6225:6;6233;6286:2;6274:9;6265:7;6261:23;6257:32;6254:52;;;6302:1;6299;6292:12;6254:52;6325:29;6344:9;6325:29;:::i;:::-;6315:39;;6373:38;6407:2;6396:9;6392:18;6373:38;:::i;:::-;6363:48;;6157:260;;;;;:::o;6422:380::-;6501:1;6497:12;;;;6544;;;6565:61;;6619:4;6611:6;6607:17;6597:27;;6565:61;6672:2;6664:6;6661:14;6641:18;6638:38;6635:161;;;6718:10;6713:3;6709:20;6706:1;6699:31;6753:4;6750:1;6743:15;6781:4;6778:1;6771:15;6635:161;;6422:380;;;:::o;8047:356::-;8249:2;8231:21;;;8268:18;;;8261:30;8327:34;8322:2;8307:18;;8300:62;8394:2;8379:18;;8047:356::o;8408:347::-;8610:2;8592:21;;;8649:2;8629:18;;;8622:30;8688:25;8683:2;8668:18;;8661:53;8746:2;8731:18;;8408:347::o;9116:127::-;9177:10;9172:3;9168:20;9165:1;9158:31;9208:4;9205:1;9198:15;9232:4;9229:1;9222:15;9248:128;9288:3;9319:1;9315:6;9312:1;9309:13;9306:39;;;9325:18;;:::i;:::-;-1:-1:-1;9361:9:1;;9248:128::o;9381:355::-;9583:2;9565:21;;;9622:2;9602:18;;;9595:30;9661:33;9656:2;9641:18;;9634:61;9727:2;9712:18;;9381:355::o;9741:135::-;9780:3;-1:-1:-1;;9801:17:1;;9798:43;;;9821:18;;:::i;:::-;-1:-1:-1;9868:1:1;9857:13;;9741:135::o;9881:413::-;10083:2;10065:21;;;10122:2;10102:18;;;10095:30;10161:34;10156:2;10141:18;;10134:62;-1:-1:-1;;;10227:2:1;10212:18;;10205:47;10284:3;10269:19;;9881:413::o;11124:127::-;11185:10;11180:3;11176:20;11173:1;11166:31;11216:4;11213:1;11206:15;11240:4;11237:1;11230:15;11952:247;12020:6;12073:2;12061:9;12052:7;12048:23;12044:32;12041:52;;;12089:1;12086;12079:12;12041:52;12121:9;12115:16;12140:29;12163:5;12140:29;:::i;12562:245::-;12629:6;12682:2;12670:9;12661:7;12657:23;12653:32;12650:52;;;12698:1;12695;12688:12;12650:52;12730:9;12724:16;12749:28;12771:5;12749:28;:::i;14613:168::-;14653:7;14719:1;14715;14711:6;14707:14;14704:1;14701:21;14696:1;14689:9;14682:17;14678:45;14675:71;;;14726:18;;:::i;:::-;-1:-1:-1;14766:9:1;;14613:168::o;19628:125::-;19668:4;19696:1;19693;19690:8;19687:34;;;19701:18;;:::i;:::-;-1:-1:-1;19738:9:1;;19628:125::o;20114:414::-;20316:2;20298:21;;;20355:2;20335:18;;;20328:30;20394:34;20389:2;20374:18;;20367:62;-1:-1:-1;;;20460:2:1;20445:18;;20438:48;20518:3;20503:19;;20114:414::o;20533:489::-;-1:-1:-1;;;;;20802:15:1;;;20784:34;;20854:15;;20849:2;20834:18;;20827:43;20901:2;20886:18;;20879:34;;;20949:3;20944:2;20929:18;;20922:31;;;20727:4;;20970:46;;20996:19;;20988:6;20970:46;:::i;:::-;20962:54;20533:489;-1:-1:-1;;;;;;20533:489:1:o;21027:249::-;21096:6;21149:2;21137:9;21128:7;21124:23;21120:32;21117:52;;;21165:1;21162;21155:12;21117:52;21197:9;21191:16;21216:30;21240:5;21216:30;:::i;21999:127::-;22060:10;22055:3;22051:20;22048:1;22041:31;22091:4;22088:1;22081:15;22115:4;22112:1;22105:15

Swarm Source

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