ETH Price: $2,612.90 (-0.71%)

Token

Crypto College (CC)
 

Overview

Max Total Supply

168 CC

Holders

164

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 CC
0x12AEaa309995ae134d7b610256F9d269b9B40e69
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

300 access tokens to Crypto College by Greg Isenberg. A breakthrough educational course covering NFTs, tokenized communities & DAOs. 1 pass = access to the course Nov 2021 and lifetime membership.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoCollege

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-21
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/CryptoCollege.sol


pragma solidity ^0.8.2;




contract CryptoCollege is ERC721, ERC721Enumerable, Ownable {
    using Strings for uint256;

    string private _baseTokenURI;
    address public vault;
    uint256 public constant MAX_SUPPLY = 300;
    uint256 private _reserveCount = 12;
    bool public paused = true;

    constructor(string memory _tokenUri, uint256 reserveCount, address _newVault) ERC721("Crypto College", "CC") {
      // reserve number can't be changed after it's deployed
      _reserveCount = reserveCount;

      // setting vault from the beginning
      setVault(_newVault);

      // setting based uri after deployment
      setBaseURI(_tokenUri);
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        _baseTokenURI = _newBaseURI;
    }

    function baseURI() public view returns (string memory) {
        return _baseTokenURI;
    }

    function pause() public onlyOwner {
        paused = true;
    }

    function unpause() public onlyOwner {
        paused = false;
    }

    function calculatePrice() public view returns (uint256) {
        uint256 currentSupply = totalSupply();

        if (currentSupply >= 171) {
            return 1500000000000000000; // 161-288 : 1.5 ETH
        } else if (currentSupply >= 141) {
            return 1250000000000000000; // 130 - 160 : 1.25 ETH
        } else if (currentSupply >= 111) {
            return 900000000000000000; // 101 - 130 : 0.9 ETH
        } else if (currentSupply >= 61) {
            return 600000000000000000; // 51 - 100 : 0.6 ETH
        } else if (currentSupply >= 41) {
            return 300000000000000000; // 30-50 : 0.3 ETH
        } else {
            return 150000000000000000; // 1 - 29 : 0.15 ETH
        }
    }

    function mint() public payable {
        require(paused == false, 'Sales is paused.');
        require(totalSupply() + 1 <= MAX_SUPPLY, 'Everything has been minted.');
        require(balanceOf(msg.sender) == 0, 'You can only mint 1');
        require(
            msg.value >= calculatePrice(),
            "Ether value sent is below the price"
        );

        uint256 mintIndex = totalSupply() + 1;
        _safeMint(msg.sender, mintIndex);
    }

    // setting vault to withdraw to
    function setVault(address _newVaultAddress) public onlyOwner {
        vault = _newVaultAddress;
    }

    // withdraw balance
    function withdraw(uint256 _amount) public onlyOwner {
        require(address(vault) != address(0), 'no vault');
        require(payable(vault).send(_amount));
    }

    // withdraw all balance
    function withdrawAll() public onlyOwner {
        require(address(vault) != address(0), 'no vault');
        require(payable(vault).send(address(this).balance));
    }

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

        return bytes(_baseTokenURI).length > 0 ? string(abi.encodePacked(_baseTokenURI, tokenId.toString(), ".json")) : "";
    }

    function reserve(uint256 num) public onlyOwner {
        uint256 currentSupply = totalSupply() + 1;
        require(num <= _reserveCount, 'Exceeded reserved supply');
        require(totalSupply() + num <= MAX_SUPPLY, 'Everything has been minted.');

        uint256 index;
        for (index = 0; index < num; index++) {
            _safeMint(owner(), currentSupply + index);
        }
    }

    // The following functions are overrides required by Solidity.
    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":"string","name":"_tokenUri","type":"string"},{"internalType":"uint256","name":"reserveCount","type":"uint256"},{"internalType":"address","name":"_newVault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newVaultAddress","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600c600d556001600e60006101000a81548160ff0219169083151502179055503480156200003157600080fd5b5060405162004cf638038062004cf683398181016040528101906200005791906200051b565b6040518060400160405280600e81526020017f43727970746f20436f6c6c6567650000000000000000000000000000000000008152506040518060400160405280600281526020017f43430000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000db929190620003bf565b508060019080519060200190620000f4929190620003bf565b505050620001176200010b6200014960201b60201c565b6200015160201b60201c565b81600d819055506200012f816200021760201b60201c565b6200014083620002ea60201b60201c565b5050506200080f565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002276200014960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024d6200039560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029d90620005bd565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620002fa6200014960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003206200039560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000379576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037090620005bd565b60405180910390fd5b80600b908051906020019062000391929190620003bf565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003cd90620006c3565b90600052602060002090601f016020900481019282620003f157600085556200043d565b82601f106200040c57805160ff19168380011785556200043d565b828001600101855582156200043d579182015b828111156200043c5782518255916020019190600101906200041f565b5b5090506200044c919062000450565b5090565b5b808211156200046b57600081600090555060010162000451565b5090565b600062000486620004808462000608565b620005df565b905082815260208101848484011115620004a557620004a462000792565b5b620004b28482856200068d565b509392505050565b600081519050620004cb81620007db565b92915050565b600082601f830112620004e957620004e86200078d565b5b8151620004fb8482602086016200046f565b91505092915050565b6000815190506200051581620007f5565b92915050565b6000806000606084860312156200053757620005366200079c565b5b600084015167ffffffffffffffff81111562000558576200055762000797565b5b6200056686828701620004d1565b9350506020620005798682870162000504565b92505060406200058c86828701620004ba565b9150509250925092565b6000620005a56020836200063e565b9150620005b282620007b2565b602082019050919050565b60006020820190508181036000830152620005d88162000596565b9050919050565b6000620005eb620005fe565b9050620005f98282620006f9565b919050565b6000604051905090565b600067ffffffffffffffff8211156200062657620006256200075e565b5b6200063182620007a1565b9050602081019050919050565b600082825260208201905092915050565b60006200065c8262000663565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620006ad57808201518184015260208101905062000690565b83811115620006bd576000848401525b50505050565b60006002820490506001821680620006dc57607f821691505b60208210811415620006f357620006f26200072f565b5b50919050565b6200070482620007a1565b810181811067ffffffffffffffff821117156200072657620007256200075e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620007e6816200064f565b8114620007f257600080fd5b50565b620008008162000683565b81146200080c57600080fd5b50565b6144d7806200081f6000396000f3fe6080604052600436106101e35760003560e01c80636817031b1161010257806395d89b4111610095578063d348b40911610064578063d348b40914610697578063e985e9c5146106c2578063f2fde38b146106ff578063fbfa77cf14610728576101e3565b806395d89b41146105dd578063a22cb46514610608578063b88d4fde14610631578063c87b56dd1461065a576101e3565b8063819b25ba116100d1578063819b25ba1461055b5780638456cb5914610584578063853828b61461059b5780638da5cb5b146105b2576101e3565b80636817031b146104b35780636c0360eb146104dc57806370a0823114610507578063715018a614610544576101e3565b80632f745c591161017a5780634f6ccce7116101495780634f6ccce7146103e557806355f804b3146104225780635c975abb1461044b5780636352211e14610476576101e3565b80632f745c591461033d57806332cb6b0c1461037a5780633f4ba83a146103a557806342842e0e146103bc576101e3565b80631249c58b116101b65780631249c58b146102b657806318160ddd146102c057806323b872dd146102eb5780632e1a7d4d14610314576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613026565b610753565b60405161021c9190613646565b60405180910390f35b34801561023157600080fd5b5061023a610765565b6040516102479190613661565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906130c9565b6107f7565b60405161028491906135df565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612fe6565b61087c565b005b6102be610994565b005b3480156102cc57600080fd5b506102d5610afc565b6040516102e29190613983565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612ed0565b610b09565b005b34801561032057600080fd5b5061033b600480360381019061033691906130c9565b610b69565b005b34801561034957600080fd5b50610364600480360381019061035f9190612fe6565b610cda565b6040516103719190613983565b60405180910390f35b34801561038657600080fd5b5061038f610d7f565b60405161039c9190613983565b60405180910390f35b3480156103b157600080fd5b506103ba610d85565b005b3480156103c857600080fd5b506103e360048036038101906103de9190612ed0565b610e1e565b005b3480156103f157600080fd5b5061040c600480360381019061040791906130c9565b610e3e565b6040516104199190613983565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190613080565b610eaf565b005b34801561045757600080fd5b50610460610f45565b60405161046d9190613646565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906130c9565b610f58565b6040516104aa91906135df565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612e63565b61100a565b005b3480156104e857600080fd5b506104f16110ca565b6040516104fe9190613661565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190612e63565b61115c565b60405161053b9190613983565b60405180910390f35b34801561055057600080fd5b50610559611214565b005b34801561056757600080fd5b50610582600480360381019061057d91906130c9565b61129c565b005b34801561059057600080fd5b5061059961140b565b005b3480156105a757600080fd5b506105b06114a4565b005b3480156105be57600080fd5b506105c7611614565b6040516105d491906135df565b60405180910390f35b3480156105e957600080fd5b506105f261163e565b6040516105ff9190613661565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190612fa6565b6116d0565b005b34801561063d57600080fd5b5061065860048036038101906106539190612f23565b611851565b005b34801561066657600080fd5b50610681600480360381019061067c91906130c9565b6118b3565b60405161068e9190613661565b60405180910390f35b3480156106a357600080fd5b506106ac61195b565b6040516106b99190613983565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e49190612e90565b6119f5565b6040516106f69190613646565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190612e63565b611a89565b005b34801561073457600080fd5b5061073d611b81565b60405161074a91906135df565b60405180910390f35b600061075e82611ba7565b9050919050565b60606000805461077490613bee565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090613bee565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b5050505050905090565b600061080282611c21565b610841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083890613863565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088782610f58565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef906138e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610917611c8d565b73ffffffffffffffffffffffffffffffffffffffff161480610946575061094581610940611c8d565b6119f5565b5b610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90613783565b60405180910390fd5b61098f8383611c95565b505050565b60001515600e60009054906101000a900460ff161515146109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613903565b60405180910390fd5b61012c60016109f7610afc565b610a019190613a7d565b1115610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3990613963565b60405180910390fd5b6000610a4d3361115c565b14610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613823565b60405180910390fd5b610a9561195b565b341015610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace906137e3565b60405180910390fd5b60006001610ae3610afc565b610aed9190613a7d565b9050610af93382611d4e565b50565b6000600880549050905090565b610b1a610b14611c8d565b82611d6c565b610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090613923565b60405180910390fd5b610b64838383611e4a565b505050565b610b71611c8d565b73ffffffffffffffffffffffffffffffffffffffff16610b8f611614565b73ffffffffffffffffffffffffffffffffffffffff1614610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613843565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610cd757600080fd5b50565b6000610ce58361115c565b8210610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d906136a3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61012c81565b610d8d611c8d565b73ffffffffffffffffffffffffffffffffffffffff16610dab611614565b73ffffffffffffffffffffffffffffffffffffffff1614610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890613883565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b610e3983838360405180602001604052806000815250611851565b505050565b6000610e48610afc565b8210610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090613943565b60405180910390fd5b60088281548110610e9d57610e9c613d87565b5b90600052602060002001549050919050565b610eb7611c8d565b73ffffffffffffffffffffffffffffffffffffffff16610ed5611614565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2290613883565b60405180910390fd5b80600b9080519060200190610f41929190612c77565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff8906137c3565b60405180910390fd5b80915050919050565b611012611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611030611614565b73ffffffffffffffffffffffffffffffffffffffff1614611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90613883565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600b80546110d990613bee565b80601f016020809104026020016040519081016040528092919081815260200182805461110590613bee565b80156111525780601f1061112757610100808354040283529160200191611152565b820191906000526020600020905b81548152906001019060200180831161113557829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906137a3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61121c611c8d565b73ffffffffffffffffffffffffffffffffffffffff1661123a611614565b73ffffffffffffffffffffffffffffffffffffffff1614611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790613883565b60405180910390fd5b61129a60006120a6565b565b6112a4611c8d565b73ffffffffffffffffffffffffffffffffffffffff166112c2611614565b73ffffffffffffffffffffffffffffffffffffffff1614611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90613883565b60405180910390fd5b60006001611324610afc565b61132e9190613a7d565b9050600d54821115611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613683565b60405180910390fd5b61012c82611381610afc565b61138b9190613a7d565b11156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390613963565b60405180910390fd5b60005b82811015611406576113f36113e2611614565b82846113ee9190613a7d565b611d4e565b80806113fe90613c51565b9150506113cf565b505050565b611413611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611431611614565b73ffffffffffffffffffffffffffffffffffffffff1614611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90613883565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b6114ac611c8d565b73ffffffffffffffffffffffffffffffffffffffff166114ca611614565b73ffffffffffffffffffffffffffffffffffffffff1614611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990613843565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061161257600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461164d90613bee565b80601f016020809104026020016040519081016040528092919081815260200182805461167990613bee565b80156116c65780601f1061169b576101008083540402835291602001916116c6565b820191906000526020600020905b8154815290600101906020018083116116a957829003601f168201915b5050505050905090565b6116d8611c8d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90613743565b60405180910390fd5b8060056000611753611c8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611800611c8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118459190613646565b60405180910390a35050565b61186261185c611c8d565b83611d6c565b6118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890613923565b60405180910390fd5b6118ad8484848461216c565b50505050565b60606118be82611c21565b6118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f4906138c3565b60405180910390fd5b6000600b805461190c90613bee565b9050116119285760405180602001604052806000815250611954565b600b611933836121c8565b6040516020016119449291906135b0565b6040516020818303038152906040525b9050919050565b600080611966610afc565b905060ab8110611981576714d1120d7b1600009150506119f2565b608d811061199a57671158e460913d00009150506119f2565b606f81106119b357670c7d713b49da00009150506119f2565b603d81106119cc57670853a0d2313c00009150506119f2565b602981106119e557670429d069189e00009150506119f2565b670214e8348c4f00009150505b90565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a91611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611aaf611614565b73ffffffffffffffffffffffffffffffffffffffff1614611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c906136e3565b60405180910390fd5b611b7e816120a6565b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c1a5750611c1982612329565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d0883610f58565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611d6882826040518060200160405280600081525061240b565b5050565b6000611d7782611c21565b611db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dad90613763565b60405180910390fd5b6000611dc183610f58565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e3057508373ffffffffffffffffffffffffffffffffffffffff16611e18846107f7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e415750611e4081856119f5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e6a82610f58565b73ffffffffffffffffffffffffffffffffffffffff1614611ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb7906138a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790613723565b60405180910390fd5b611f3b838383612466565b611f46600082611c95565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f969190613b04565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fed9190613a7d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612177848484611e4a565b61218384848484612476565b6121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b9906136c3565b60405180910390fd5b50505050565b60606000821415612210576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612324565b600082905060005b6000821461224257808061222b90613c51565b915050600a8261223b9190613ad3565b9150612218565b60008167ffffffffffffffff81111561225e5761225d613db6565b5b6040519080825280601f01601f1916602001820160405280156122905781602001600182028036833780820191505090505b5090505b6000851461231d576001826122a99190613b04565b9150600a856122b89190613c9a565b60306122c49190613a7d565b60f81b8183815181106122da576122d9613d87565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123169190613ad3565b9450612294565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123f457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061240457506124038261260d565b5b9050919050565b6124158383612677565b6124226000848484612476565b612461576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612458906136c3565b60405180910390fd5b505050565b612471838383612845565b505050565b60006124978473ffffffffffffffffffffffffffffffffffffffff16612959565b15612600578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124c0611c8d565b8786866040518563ffffffff1660e01b81526004016124e294939291906135fa565b602060405180830381600087803b1580156124fc57600080fd5b505af192505050801561252d57506040513d601f19601f8201168201806040525081019061252a9190613053565b60015b6125b0573d806000811461255d576040519150601f19603f3d011682016040523d82523d6000602084013e612562565b606091505b506000815114156125a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259f906136c3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612605565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126de90613803565b60405180910390fd5b6126f081611c21565b15612730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272790613703565b60405180910390fd5b61273c60008383612466565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461278c9190613a7d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61285083838361296c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128935761288e81612971565b6128d2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128d1576128d083826129ba565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129155761291081612b27565b612954565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612953576129528282612bf8565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129c78461115c565b6129d19190613b04565b9050600060076000848152602001908152602001600020549050818114612ab6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b3b9190613b04565b9050600060096000848152602001908152602001600020549050600060088381548110612b6b57612b6a613d87565b5b906000526020600020015490508060088381548110612b8d57612b8c613d87565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bdc57612bdb613d58565b5b6001900381819060005260206000200160009055905550505050565b6000612c038361115c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612c8390613bee565b90600052602060002090601f016020900481019282612ca55760008555612cec565b82601f10612cbe57805160ff1916838001178555612cec565b82800160010185558215612cec579182015b82811115612ceb578251825591602001919060010190612cd0565b5b509050612cf99190612cfd565b5090565b5b80821115612d16576000816000905550600101612cfe565b5090565b6000612d2d612d28846139c3565b61399e565b905082815260208101848484011115612d4957612d48613dea565b5b612d54848285613bac565b509392505050565b6000612d6f612d6a846139f4565b61399e565b905082815260208101848484011115612d8b57612d8a613dea565b5b612d96848285613bac565b509392505050565b600081359050612dad81614445565b92915050565b600081359050612dc28161445c565b92915050565b600081359050612dd781614473565b92915050565b600081519050612dec81614473565b92915050565b600082601f830112612e0757612e06613de5565b5b8135612e17848260208601612d1a565b91505092915050565b600082601f830112612e3557612e34613de5565b5b8135612e45848260208601612d5c565b91505092915050565b600081359050612e5d8161448a565b92915050565b600060208284031215612e7957612e78613df4565b5b6000612e8784828501612d9e565b91505092915050565b60008060408385031215612ea757612ea6613df4565b5b6000612eb585828601612d9e565b9250506020612ec685828601612d9e565b9150509250929050565b600080600060608486031215612ee957612ee8613df4565b5b6000612ef786828701612d9e565b9350506020612f0886828701612d9e565b9250506040612f1986828701612e4e565b9150509250925092565b60008060008060808587031215612f3d57612f3c613df4565b5b6000612f4b87828801612d9e565b9450506020612f5c87828801612d9e565b9350506040612f6d87828801612e4e565b925050606085013567ffffffffffffffff811115612f8e57612f8d613def565b5b612f9a87828801612df2565b91505092959194509250565b60008060408385031215612fbd57612fbc613df4565b5b6000612fcb85828601612d9e565b9250506020612fdc85828601612db3565b9150509250929050565b60008060408385031215612ffd57612ffc613df4565b5b600061300b85828601612d9e565b925050602061301c85828601612e4e565b9150509250929050565b60006020828403121561303c5761303b613df4565b5b600061304a84828501612dc8565b91505092915050565b60006020828403121561306957613068613df4565b5b600061307784828501612ddd565b91505092915050565b60006020828403121561309657613095613df4565b5b600082013567ffffffffffffffff8111156130b4576130b3613def565b5b6130c084828501612e20565b91505092915050565b6000602082840312156130df576130de613df4565b5b60006130ed84828501612e4e565b91505092915050565b6130ff81613b38565b82525050565b61310e81613b4a565b82525050565b600061311f82613a3a565b6131298185613a50565b9350613139818560208601613bbb565b61314281613df9565b840191505092915050565b600061315882613a45565b6131628185613a61565b9350613172818560208601613bbb565b61317b81613df9565b840191505092915050565b600061319182613a45565b61319b8185613a72565b93506131ab818560208601613bbb565b80840191505092915050565b600081546131c481613bee565b6131ce8186613a72565b945060018216600081146131e957600181146131fa5761322d565b60ff1983168652818601935061322d565b61320385613a25565b60005b8381101561322557815481890152600182019150602081019050613206565b838801955050505b50505092915050565b6000613243601883613a61565b915061324e82613e0a565b602082019050919050565b6000613266602b83613a61565b915061327182613e33565b604082019050919050565b6000613289603283613a61565b915061329482613e82565b604082019050919050565b60006132ac602683613a61565b91506132b782613ed1565b604082019050919050565b60006132cf601c83613a61565b91506132da82613f20565b602082019050919050565b60006132f2602483613a61565b91506132fd82613f49565b604082019050919050565b6000613315601983613a61565b915061332082613f98565b602082019050919050565b6000613338602c83613a61565b915061334382613fc1565b604082019050919050565b600061335b603883613a61565b915061336682614010565b604082019050919050565b600061337e602a83613a61565b91506133898261405f565b604082019050919050565b60006133a1602983613a61565b91506133ac826140ae565b604082019050919050565b60006133c4602383613a61565b91506133cf826140fd565b604082019050919050565b60006133e7602083613a61565b91506133f28261414c565b602082019050919050565b600061340a601383613a61565b915061341582614175565b602082019050919050565b600061342d600883613a61565b91506134388261419e565b602082019050919050565b6000613450602c83613a61565b915061345b826141c7565b604082019050919050565b6000613473600583613a72565b915061347e82614216565b600582019050919050565b6000613496602083613a61565b91506134a18261423f565b602082019050919050565b60006134b9602983613a61565b91506134c482614268565b604082019050919050565b60006134dc602f83613a61565b91506134e7826142b7565b604082019050919050565b60006134ff602183613a61565b915061350a82614306565b604082019050919050565b6000613522601083613a61565b915061352d82614355565b602082019050919050565b6000613545603183613a61565b91506135508261437e565b604082019050919050565b6000613568602c83613a61565b9150613573826143cd565b604082019050919050565b600061358b601b83613a61565b91506135968261441c565b602082019050919050565b6135aa81613ba2565b82525050565b60006135bc82856131b7565b91506135c88284613186565b91506135d382613466565b91508190509392505050565b60006020820190506135f460008301846130f6565b92915050565b600060808201905061360f60008301876130f6565b61361c60208301866130f6565b61362960408301856135a1565b818103606083015261363b8184613114565b905095945050505050565b600060208201905061365b6000830184613105565b92915050565b6000602082019050818103600083015261367b818461314d565b905092915050565b6000602082019050818103600083015261369c81613236565b9050919050565b600060208201905081810360008301526136bc81613259565b9050919050565b600060208201905081810360008301526136dc8161327c565b9050919050565b600060208201905081810360008301526136fc8161329f565b9050919050565b6000602082019050818103600083015261371c816132c2565b9050919050565b6000602082019050818103600083015261373c816132e5565b9050919050565b6000602082019050818103600083015261375c81613308565b9050919050565b6000602082019050818103600083015261377c8161332b565b9050919050565b6000602082019050818103600083015261379c8161334e565b9050919050565b600060208201905081810360008301526137bc81613371565b9050919050565b600060208201905081810360008301526137dc81613394565b9050919050565b600060208201905081810360008301526137fc816133b7565b9050919050565b6000602082019050818103600083015261381c816133da565b9050919050565b6000602082019050818103600083015261383c816133fd565b9050919050565b6000602082019050818103600083015261385c81613420565b9050919050565b6000602082019050818103600083015261387c81613443565b9050919050565b6000602082019050818103600083015261389c81613489565b9050919050565b600060208201905081810360008301526138bc816134ac565b9050919050565b600060208201905081810360008301526138dc816134cf565b9050919050565b600060208201905081810360008301526138fc816134f2565b9050919050565b6000602082019050818103600083015261391c81613515565b9050919050565b6000602082019050818103600083015261393c81613538565b9050919050565b6000602082019050818103600083015261395c8161355b565b9050919050565b6000602082019050818103600083015261397c8161357e565b9050919050565b600060208201905061399860008301846135a1565b92915050565b60006139a86139b9565b90506139b48282613c20565b919050565b6000604051905090565b600067ffffffffffffffff8211156139de576139dd613db6565b5b6139e782613df9565b9050602081019050919050565b600067ffffffffffffffff821115613a0f57613a0e613db6565b5b613a1882613df9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a8882613ba2565b9150613a9383613ba2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ac857613ac7613ccb565b5b828201905092915050565b6000613ade82613ba2565b9150613ae983613ba2565b925082613af957613af8613cfa565b5b828204905092915050565b6000613b0f82613ba2565b9150613b1a83613ba2565b925082821015613b2d57613b2c613ccb565b5b828203905092915050565b6000613b4382613b82565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bd9578082015181840152602081019050613bbe565b83811115613be8576000848401525b50505050565b60006002820490506001821680613c0657607f821691505b60208210811415613c1a57613c19613d29565b5b50919050565b613c2982613df9565b810181811067ffffffffffffffff82111715613c4857613c47613db6565b5b80604052505050565b6000613c5c82613ba2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8f57613c8e613ccb565b5b600182019050919050565b6000613ca582613ba2565b9150613cb083613ba2565b925082613cc057613cbf613cfa565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f457863656564656420726573657276656420737570706c790000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f752063616e206f6e6c79206d696e74203100000000000000000000000000600082015250565b7f6e6f207661756c74000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206973207061757365642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f45766572797468696e6720686173206265656e206d696e7465642e0000000000600082015250565b61444e81613b38565b811461445957600080fd5b50565b61446581613b4a565b811461447057600080fd5b50565b61447c81613b56565b811461448757600080fd5b50565b61449381613ba2565b811461449e57600080fd5b5056fea2646970667358221220b1a9097bbbba1d2d5da0b347af0efa2c1363980888f48ee58a0b159b8114820a64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000009f836913343c0b46771206de4018fcdd0d76a2710000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d664b5263316e384b7138316948515247567272784878344d544c4d52444e6a796a344c7157683533456731762f00000000000000000000

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636817031b1161010257806395d89b4111610095578063d348b40911610064578063d348b40914610697578063e985e9c5146106c2578063f2fde38b146106ff578063fbfa77cf14610728576101e3565b806395d89b41146105dd578063a22cb46514610608578063b88d4fde14610631578063c87b56dd1461065a576101e3565b8063819b25ba116100d1578063819b25ba1461055b5780638456cb5914610584578063853828b61461059b5780638da5cb5b146105b2576101e3565b80636817031b146104b35780636c0360eb146104dc57806370a0823114610507578063715018a614610544576101e3565b80632f745c591161017a5780634f6ccce7116101495780634f6ccce7146103e557806355f804b3146104225780635c975abb1461044b5780636352211e14610476576101e3565b80632f745c591461033d57806332cb6b0c1461037a5780633f4ba83a146103a557806342842e0e146103bc576101e3565b80631249c58b116101b65780631249c58b146102b657806318160ddd146102c057806323b872dd146102eb5780632e1a7d4d14610314576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613026565b610753565b60405161021c9190613646565b60405180910390f35b34801561023157600080fd5b5061023a610765565b6040516102479190613661565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906130c9565b6107f7565b60405161028491906135df565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612fe6565b61087c565b005b6102be610994565b005b3480156102cc57600080fd5b506102d5610afc565b6040516102e29190613983565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612ed0565b610b09565b005b34801561032057600080fd5b5061033b600480360381019061033691906130c9565b610b69565b005b34801561034957600080fd5b50610364600480360381019061035f9190612fe6565b610cda565b6040516103719190613983565b60405180910390f35b34801561038657600080fd5b5061038f610d7f565b60405161039c9190613983565b60405180910390f35b3480156103b157600080fd5b506103ba610d85565b005b3480156103c857600080fd5b506103e360048036038101906103de9190612ed0565b610e1e565b005b3480156103f157600080fd5b5061040c600480360381019061040791906130c9565b610e3e565b6040516104199190613983565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190613080565b610eaf565b005b34801561045757600080fd5b50610460610f45565b60405161046d9190613646565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906130c9565b610f58565b6040516104aa91906135df565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612e63565b61100a565b005b3480156104e857600080fd5b506104f16110ca565b6040516104fe9190613661565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190612e63565b61115c565b60405161053b9190613983565b60405180910390f35b34801561055057600080fd5b50610559611214565b005b34801561056757600080fd5b50610582600480360381019061057d91906130c9565b61129c565b005b34801561059057600080fd5b5061059961140b565b005b3480156105a757600080fd5b506105b06114a4565b005b3480156105be57600080fd5b506105c7611614565b6040516105d491906135df565b60405180910390f35b3480156105e957600080fd5b506105f261163e565b6040516105ff9190613661565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190612fa6565b6116d0565b005b34801561063d57600080fd5b5061065860048036038101906106539190612f23565b611851565b005b34801561066657600080fd5b50610681600480360381019061067c91906130c9565b6118b3565b60405161068e9190613661565b60405180910390f35b3480156106a357600080fd5b506106ac61195b565b6040516106b99190613983565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e49190612e90565b6119f5565b6040516106f69190613646565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190612e63565b611a89565b005b34801561073457600080fd5b5061073d611b81565b60405161074a91906135df565b60405180910390f35b600061075e82611ba7565b9050919050565b60606000805461077490613bee565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090613bee565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b5050505050905090565b600061080282611c21565b610841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083890613863565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088782610f58565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef906138e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610917611c8d565b73ffffffffffffffffffffffffffffffffffffffff161480610946575061094581610940611c8d565b6119f5565b5b610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90613783565b60405180910390fd5b61098f8383611c95565b505050565b60001515600e60009054906101000a900460ff161515146109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613903565b60405180910390fd5b61012c60016109f7610afc565b610a019190613a7d565b1115610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3990613963565b60405180910390fd5b6000610a4d3361115c565b14610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613823565b60405180910390fd5b610a9561195b565b341015610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace906137e3565b60405180910390fd5b60006001610ae3610afc565b610aed9190613a7d565b9050610af93382611d4e565b50565b6000600880549050905090565b610b1a610b14611c8d565b82611d6c565b610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090613923565b60405180910390fd5b610b64838383611e4a565b505050565b610b71611c8d565b73ffffffffffffffffffffffffffffffffffffffff16610b8f611614565b73ffffffffffffffffffffffffffffffffffffffff1614610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613843565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610cd757600080fd5b50565b6000610ce58361115c565b8210610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d906136a3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61012c81565b610d8d611c8d565b73ffffffffffffffffffffffffffffffffffffffff16610dab611614565b73ffffffffffffffffffffffffffffffffffffffff1614610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890613883565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b610e3983838360405180602001604052806000815250611851565b505050565b6000610e48610afc565b8210610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090613943565b60405180910390fd5b60088281548110610e9d57610e9c613d87565b5b90600052602060002001549050919050565b610eb7611c8d565b73ffffffffffffffffffffffffffffffffffffffff16610ed5611614565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2290613883565b60405180910390fd5b80600b9080519060200190610f41929190612c77565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff8906137c3565b60405180910390fd5b80915050919050565b611012611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611030611614565b73ffffffffffffffffffffffffffffffffffffffff1614611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90613883565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600b80546110d990613bee565b80601f016020809104026020016040519081016040528092919081815260200182805461110590613bee565b80156111525780601f1061112757610100808354040283529160200191611152565b820191906000526020600020905b81548152906001019060200180831161113557829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906137a3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61121c611c8d565b73ffffffffffffffffffffffffffffffffffffffff1661123a611614565b73ffffffffffffffffffffffffffffffffffffffff1614611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790613883565b60405180910390fd5b61129a60006120a6565b565b6112a4611c8d565b73ffffffffffffffffffffffffffffffffffffffff166112c2611614565b73ffffffffffffffffffffffffffffffffffffffff1614611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90613883565b60405180910390fd5b60006001611324610afc565b61132e9190613a7d565b9050600d54821115611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613683565b60405180910390fd5b61012c82611381610afc565b61138b9190613a7d565b11156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390613963565b60405180910390fd5b60005b82811015611406576113f36113e2611614565b82846113ee9190613a7d565b611d4e565b80806113fe90613c51565b9150506113cf565b505050565b611413611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611431611614565b73ffffffffffffffffffffffffffffffffffffffff1614611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90613883565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b6114ac611c8d565b73ffffffffffffffffffffffffffffffffffffffff166114ca611614565b73ffffffffffffffffffffffffffffffffffffffff1614611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990613843565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061161257600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461164d90613bee565b80601f016020809104026020016040519081016040528092919081815260200182805461167990613bee565b80156116c65780601f1061169b576101008083540402835291602001916116c6565b820191906000526020600020905b8154815290600101906020018083116116a957829003601f168201915b5050505050905090565b6116d8611c8d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90613743565b60405180910390fd5b8060056000611753611c8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611800611c8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118459190613646565b60405180910390a35050565b61186261185c611c8d565b83611d6c565b6118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890613923565b60405180910390fd5b6118ad8484848461216c565b50505050565b60606118be82611c21565b6118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f4906138c3565b60405180910390fd5b6000600b805461190c90613bee565b9050116119285760405180602001604052806000815250611954565b600b611933836121c8565b6040516020016119449291906135b0565b6040516020818303038152906040525b9050919050565b600080611966610afc565b905060ab8110611981576714d1120d7b1600009150506119f2565b608d811061199a57671158e460913d00009150506119f2565b606f81106119b357670c7d713b49da00009150506119f2565b603d81106119cc57670853a0d2313c00009150506119f2565b602981106119e557670429d069189e00009150506119f2565b670214e8348c4f00009150505b90565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a91611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611aaf611614565b73ffffffffffffffffffffffffffffffffffffffff1614611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c906136e3565b60405180910390fd5b611b7e816120a6565b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c1a5750611c1982612329565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d0883610f58565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611d6882826040518060200160405280600081525061240b565b5050565b6000611d7782611c21565b611db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dad90613763565b60405180910390fd5b6000611dc183610f58565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e3057508373ffffffffffffffffffffffffffffffffffffffff16611e18846107f7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e415750611e4081856119f5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e6a82610f58565b73ffffffffffffffffffffffffffffffffffffffff1614611ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb7906138a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790613723565b60405180910390fd5b611f3b838383612466565b611f46600082611c95565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f969190613b04565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fed9190613a7d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612177848484611e4a565b61218384848484612476565b6121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b9906136c3565b60405180910390fd5b50505050565b60606000821415612210576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612324565b600082905060005b6000821461224257808061222b90613c51565b915050600a8261223b9190613ad3565b9150612218565b60008167ffffffffffffffff81111561225e5761225d613db6565b5b6040519080825280601f01601f1916602001820160405280156122905781602001600182028036833780820191505090505b5090505b6000851461231d576001826122a99190613b04565b9150600a856122b89190613c9a565b60306122c49190613a7d565b60f81b8183815181106122da576122d9613d87565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123169190613ad3565b9450612294565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123f457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061240457506124038261260d565b5b9050919050565b6124158383612677565b6124226000848484612476565b612461576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612458906136c3565b60405180910390fd5b505050565b612471838383612845565b505050565b60006124978473ffffffffffffffffffffffffffffffffffffffff16612959565b15612600578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124c0611c8d565b8786866040518563ffffffff1660e01b81526004016124e294939291906135fa565b602060405180830381600087803b1580156124fc57600080fd5b505af192505050801561252d57506040513d601f19601f8201168201806040525081019061252a9190613053565b60015b6125b0573d806000811461255d576040519150601f19603f3d011682016040523d82523d6000602084013e612562565b606091505b506000815114156125a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259f906136c3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612605565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126de90613803565b60405180910390fd5b6126f081611c21565b15612730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272790613703565b60405180910390fd5b61273c60008383612466565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461278c9190613a7d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61285083838361296c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128935761288e81612971565b6128d2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128d1576128d083826129ba565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129155761291081612b27565b612954565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612953576129528282612bf8565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129c78461115c565b6129d19190613b04565b9050600060076000848152602001908152602001600020549050818114612ab6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b3b9190613b04565b9050600060096000848152602001908152602001600020549050600060088381548110612b6b57612b6a613d87565b5b906000526020600020015490508060088381548110612b8d57612b8c613d87565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bdc57612bdb613d58565b5b6001900381819060005260206000200160009055905550505050565b6000612c038361115c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612c8390613bee565b90600052602060002090601f016020900481019282612ca55760008555612cec565b82601f10612cbe57805160ff1916838001178555612cec565b82800160010185558215612cec579182015b82811115612ceb578251825591602001919060010190612cd0565b5b509050612cf99190612cfd565b5090565b5b80821115612d16576000816000905550600101612cfe565b5090565b6000612d2d612d28846139c3565b61399e565b905082815260208101848484011115612d4957612d48613dea565b5b612d54848285613bac565b509392505050565b6000612d6f612d6a846139f4565b61399e565b905082815260208101848484011115612d8b57612d8a613dea565b5b612d96848285613bac565b509392505050565b600081359050612dad81614445565b92915050565b600081359050612dc28161445c565b92915050565b600081359050612dd781614473565b92915050565b600081519050612dec81614473565b92915050565b600082601f830112612e0757612e06613de5565b5b8135612e17848260208601612d1a565b91505092915050565b600082601f830112612e3557612e34613de5565b5b8135612e45848260208601612d5c565b91505092915050565b600081359050612e5d8161448a565b92915050565b600060208284031215612e7957612e78613df4565b5b6000612e8784828501612d9e565b91505092915050565b60008060408385031215612ea757612ea6613df4565b5b6000612eb585828601612d9e565b9250506020612ec685828601612d9e565b9150509250929050565b600080600060608486031215612ee957612ee8613df4565b5b6000612ef786828701612d9e565b9350506020612f0886828701612d9e565b9250506040612f1986828701612e4e565b9150509250925092565b60008060008060808587031215612f3d57612f3c613df4565b5b6000612f4b87828801612d9e565b9450506020612f5c87828801612d9e565b9350506040612f6d87828801612e4e565b925050606085013567ffffffffffffffff811115612f8e57612f8d613def565b5b612f9a87828801612df2565b91505092959194509250565b60008060408385031215612fbd57612fbc613df4565b5b6000612fcb85828601612d9e565b9250506020612fdc85828601612db3565b9150509250929050565b60008060408385031215612ffd57612ffc613df4565b5b600061300b85828601612d9e565b925050602061301c85828601612e4e565b9150509250929050565b60006020828403121561303c5761303b613df4565b5b600061304a84828501612dc8565b91505092915050565b60006020828403121561306957613068613df4565b5b600061307784828501612ddd565b91505092915050565b60006020828403121561309657613095613df4565b5b600082013567ffffffffffffffff8111156130b4576130b3613def565b5b6130c084828501612e20565b91505092915050565b6000602082840312156130df576130de613df4565b5b60006130ed84828501612e4e565b91505092915050565b6130ff81613b38565b82525050565b61310e81613b4a565b82525050565b600061311f82613a3a565b6131298185613a50565b9350613139818560208601613bbb565b61314281613df9565b840191505092915050565b600061315882613a45565b6131628185613a61565b9350613172818560208601613bbb565b61317b81613df9565b840191505092915050565b600061319182613a45565b61319b8185613a72565b93506131ab818560208601613bbb565b80840191505092915050565b600081546131c481613bee565b6131ce8186613a72565b945060018216600081146131e957600181146131fa5761322d565b60ff1983168652818601935061322d565b61320385613a25565b60005b8381101561322557815481890152600182019150602081019050613206565b838801955050505b50505092915050565b6000613243601883613a61565b915061324e82613e0a565b602082019050919050565b6000613266602b83613a61565b915061327182613e33565b604082019050919050565b6000613289603283613a61565b915061329482613e82565b604082019050919050565b60006132ac602683613a61565b91506132b782613ed1565b604082019050919050565b60006132cf601c83613a61565b91506132da82613f20565b602082019050919050565b60006132f2602483613a61565b91506132fd82613f49565b604082019050919050565b6000613315601983613a61565b915061332082613f98565b602082019050919050565b6000613338602c83613a61565b915061334382613fc1565b604082019050919050565b600061335b603883613a61565b915061336682614010565b604082019050919050565b600061337e602a83613a61565b91506133898261405f565b604082019050919050565b60006133a1602983613a61565b91506133ac826140ae565b604082019050919050565b60006133c4602383613a61565b91506133cf826140fd565b604082019050919050565b60006133e7602083613a61565b91506133f28261414c565b602082019050919050565b600061340a601383613a61565b915061341582614175565b602082019050919050565b600061342d600883613a61565b91506134388261419e565b602082019050919050565b6000613450602c83613a61565b915061345b826141c7565b604082019050919050565b6000613473600583613a72565b915061347e82614216565b600582019050919050565b6000613496602083613a61565b91506134a18261423f565b602082019050919050565b60006134b9602983613a61565b91506134c482614268565b604082019050919050565b60006134dc602f83613a61565b91506134e7826142b7565b604082019050919050565b60006134ff602183613a61565b915061350a82614306565b604082019050919050565b6000613522601083613a61565b915061352d82614355565b602082019050919050565b6000613545603183613a61565b91506135508261437e565b604082019050919050565b6000613568602c83613a61565b9150613573826143cd565b604082019050919050565b600061358b601b83613a61565b91506135968261441c565b602082019050919050565b6135aa81613ba2565b82525050565b60006135bc82856131b7565b91506135c88284613186565b91506135d382613466565b91508190509392505050565b60006020820190506135f460008301846130f6565b92915050565b600060808201905061360f60008301876130f6565b61361c60208301866130f6565b61362960408301856135a1565b818103606083015261363b8184613114565b905095945050505050565b600060208201905061365b6000830184613105565b92915050565b6000602082019050818103600083015261367b818461314d565b905092915050565b6000602082019050818103600083015261369c81613236565b9050919050565b600060208201905081810360008301526136bc81613259565b9050919050565b600060208201905081810360008301526136dc8161327c565b9050919050565b600060208201905081810360008301526136fc8161329f565b9050919050565b6000602082019050818103600083015261371c816132c2565b9050919050565b6000602082019050818103600083015261373c816132e5565b9050919050565b6000602082019050818103600083015261375c81613308565b9050919050565b6000602082019050818103600083015261377c8161332b565b9050919050565b6000602082019050818103600083015261379c8161334e565b9050919050565b600060208201905081810360008301526137bc81613371565b9050919050565b600060208201905081810360008301526137dc81613394565b9050919050565b600060208201905081810360008301526137fc816133b7565b9050919050565b6000602082019050818103600083015261381c816133da565b9050919050565b6000602082019050818103600083015261383c816133fd565b9050919050565b6000602082019050818103600083015261385c81613420565b9050919050565b6000602082019050818103600083015261387c81613443565b9050919050565b6000602082019050818103600083015261389c81613489565b9050919050565b600060208201905081810360008301526138bc816134ac565b9050919050565b600060208201905081810360008301526138dc816134cf565b9050919050565b600060208201905081810360008301526138fc816134f2565b9050919050565b6000602082019050818103600083015261391c81613515565b9050919050565b6000602082019050818103600083015261393c81613538565b9050919050565b6000602082019050818103600083015261395c8161355b565b9050919050565b6000602082019050818103600083015261397c8161357e565b9050919050565b600060208201905061399860008301846135a1565b92915050565b60006139a86139b9565b90506139b48282613c20565b919050565b6000604051905090565b600067ffffffffffffffff8211156139de576139dd613db6565b5b6139e782613df9565b9050602081019050919050565b600067ffffffffffffffff821115613a0f57613a0e613db6565b5b613a1882613df9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a8882613ba2565b9150613a9383613ba2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ac857613ac7613ccb565b5b828201905092915050565b6000613ade82613ba2565b9150613ae983613ba2565b925082613af957613af8613cfa565b5b828204905092915050565b6000613b0f82613ba2565b9150613b1a83613ba2565b925082821015613b2d57613b2c613ccb565b5b828203905092915050565b6000613b4382613b82565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bd9578082015181840152602081019050613bbe565b83811115613be8576000848401525b50505050565b60006002820490506001821680613c0657607f821691505b60208210811415613c1a57613c19613d29565b5b50919050565b613c2982613df9565b810181811067ffffffffffffffff82111715613c4857613c47613db6565b5b80604052505050565b6000613c5c82613ba2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8f57613c8e613ccb565b5b600182019050919050565b6000613ca582613ba2565b9150613cb083613ba2565b925082613cc057613cbf613cfa565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f457863656564656420726573657276656420737570706c790000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f752063616e206f6e6c79206d696e74203100000000000000000000000000600082015250565b7f6e6f207661756c74000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206973207061757365642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f45766572797468696e6720686173206265656e206d696e7465642e0000000000600082015250565b61444e81613b38565b811461445957600080fd5b50565b61446581613b4a565b811461447057600080fd5b50565b61447c81613b56565b811461448757600080fd5b50565b61449381613ba2565b811461449e57600080fd5b5056fea2646970667358221220b1a9097bbbba1d2d5da0b347af0efa2c1363980888f48ee58a0b159b8114820a64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000009f836913343c0b46771206de4018fcdd0d76a2710000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d664b5263316e384b7138316948515247567272784878344d544c4d52444e6a796a344c7157683533456731762f00000000000000000000

-----Decoded View---------------
Arg [0] : _tokenUri (string): ipfs://QmfKRc1n8Kq81iHQRGVrrxHx4MTLMRDNjyj4LqWh53Eg1v/
Arg [1] : reserveCount (uint256): 12
Arg [2] : _newVault (address): 0x9F836913343C0B46771206De4018Fcdd0D76A271

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [2] : 0000000000000000000000009f836913343c0b46771206de4018fcdd0d76a271
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d664b5263316e384b713831694851524756727278487834
Arg [5] : 4d544c4d52444e6a796a344c7157683533456731762f00000000000000000000


Deployed Bytecode Sourcemap

43302:4084:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47171:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21683:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23242:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22765:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45066:463;;;:::i;:::-;;37718:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24132:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45711:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37386:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43465:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44255:69;;;;;;;;;;;;;:::i;:::-;;24542:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37908:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43961:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43553:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21377:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45574:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44079:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21107:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34516:94;;;;;;;;;;;;;:::i;:::-;;46482:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44181:66;;;;;;;;;;;;;:::i;:::-;;45916:170;;;;;;;;;;;;;:::i;:::-;;33865:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21852:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23535:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24798:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46094:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44332:726;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23901:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34765:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43438:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47171:212;47310:4;47339:36;47363:11;47339:23;:36::i;:::-;47332:43;;47171:212;;;:::o;21683:100::-;21737:13;21770:5;21763:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21683:100;:::o;23242:221::-;23318:7;23346:16;23354:7;23346;:16::i;:::-;23338:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23431:15;:24;23447:7;23431:24;;;;;;;;;;;;;;;;;;;;;23424:31;;23242:221;;;:::o;22765:411::-;22846:13;22862:23;22877:7;22862:14;:23::i;:::-;22846:39;;22910:5;22904:11;;:2;:11;;;;22896:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23004:5;22988:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23013:37;23030:5;23037:12;:10;:12::i;:::-;23013:16;:37::i;:::-;22988:62;22966:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23147:21;23156:2;23160:7;23147:8;:21::i;:::-;22835:341;22765:411;;:::o;45066:463::-;45126:5;45116:15;;:6;;;;;;;;;;;:15;;;45108:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;43502:3;45187:1;45171:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;45163:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45278:1;45253:21;45263:10;45253:9;:21::i;:::-;:26;45245:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45349:16;:14;:16::i;:::-;45336:9;:29;;45314:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;45441:17;45477:1;45461:13;:11;:13::i;:::-;:17;;;;:::i;:::-;45441:37;;45489:32;45499:10;45511:9;45489;:32::i;:::-;45097:432;45066:463::o;37718:113::-;37779:7;37806:10;:17;;;;37799:24;;37718:113;:::o;24132:339::-;24327:41;24346:12;:10;:12::i;:::-;24360:7;24327:18;:41::i;:::-;24319:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24435:28;24445:4;24451:2;24455:7;24435:9;:28::i;:::-;24132:339;;;:::o;45711:168::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45808:1:::1;45782:28;;45790:5;;;;;;;;;;;45782:28;;;;45774:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;45850:5;;;;;;;;;;;45842:19;;:28;45862:7;45842:28;;;;;;;;;;;;;;;;;;;;;;;45834:37;;;::::0;::::1;;45711:168:::0;:::o;37386:256::-;37483:7;37519:23;37536:5;37519:16;:23::i;:::-;37511:5;:31;37503:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37608:12;:19;37621:5;37608:19;;;;;;;;;;;;;;;:26;37628:5;37608:26;;;;;;;;;;;;37601:33;;37386:256;;;;:::o;43465:40::-;43502:3;43465:40;:::o;44255:69::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44311:5:::1;44302:6;;:14;;;;;;;;;;;;;;;;;;44255:69::o:0;24542:185::-;24680:39;24697:4;24703:2;24707:7;24680:39;;;;;;;;;;;;:16;:39::i;:::-;24542:185;;;:::o;37908:233::-;37983:7;38019:30;:28;:30::i;:::-;38011:5;:38;38003:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38116:10;38127:5;38116:17;;;;;;;;:::i;:::-;;;;;;;;;;38109:24;;37908:233;;;:::o;43961:110::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44052:11:::1;44036:13;:27;;;;;;;;;;;;:::i;:::-;;43961:110:::0;:::o;43553:25::-;;;;;;;;;;;;;:::o;21377:239::-;21449:7;21469:13;21485:7;:16;21493:7;21485:16;;;;;;;;;;;;;;;;;;;;;21469:32;;21537:1;21520:19;;:5;:19;;;;21512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21603:5;21596:12;;;21377:239;;;:::o;45574:104::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45654:16:::1;45646:5;;:24;;;;;;;;;;;;;;;;;;45574:104:::0;:::o;44079:94::-;44119:13;44152;44145:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44079:94;:::o;21107:208::-;21179:7;21224:1;21207:19;;:5;:19;;;;21199:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21291:9;:16;21301:5;21291:16;;;;;;;;;;;;;;;;21284:23;;21107:208;;;:::o;34516:94::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34581:21:::1;34599:1;34581:9;:21::i;:::-;34516:94::o:0;46482:401::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46540:21:::1;46580:1;46564:13;:11;:13::i;:::-;:17;;;;:::i;:::-;46540:41;;46607:13;;46600:3;:20;;46592:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43502:3;46684;46668:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:33;;46660:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46746:13;46770:106;46794:3;46786:5;:11;46770:106;;;46823:41;46833:7;:5;:7::i;:::-;46858:5;46842:13;:21;;;;:::i;:::-;46823:9;:41::i;:::-;46799:7;;;;;:::i;:::-;;;;46770:106;;;46529:354;;46482:401:::0;:::o;44181:66::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44235:4:::1;44226:6;;:13;;;;;;;;;;;;;;;;;;44181:66::o:0;45916:170::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46001:1:::1;45975:28;;45983:5;;;;;;;;;;;45975:28;;;;45967:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;46043:5;;;;;;;;;;;46035:19;;:42;46055:21;46035:42;;;;;;;;;;;;;;;;;;;;;;;46027:51;;;::::0;::::1;;45916:170::o:0;33865:87::-;33911:7;33938:6;;;;;;;;;;;33931:13;;33865:87;:::o;21852:104::-;21908:13;21941:7;21934:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21852:104;:::o;23535:295::-;23650:12;:10;:12::i;:::-;23638:24;;:8;:24;;;;23630:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23750:8;23705:18;:32;23724:12;:10;:12::i;:::-;23705:32;;;;;;;;;;;;;;;:42;23738:8;23705:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23803:8;23774:48;;23789:12;:10;:12::i;:::-;23774:48;;;23813:8;23774:48;;;;;;:::i;:::-;;;;;;;;23535:295;;:::o;24798:328::-;24973:41;24992:12;:10;:12::i;:::-;25006:7;24973:18;:41::i;:::-;24965:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25079:39;25093:4;25099:2;25103:7;25112:5;25079:13;:39::i;:::-;24798:328;;;;:::o;46094:380::-;46195:13;46248:16;46256:7;46248;:16::i;:::-;46226:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46389:1;46365:13;46359:27;;;;;:::i;:::-;;;:31;:107;;;;;;;;;;;;;;;;;46417:13;46432:18;:7;:16;:18::i;:::-;46400:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46359:107;46352:114;;46094:380;;;:::o;44332:726::-;44379:7;44399:21;44423:13;:11;:13::i;:::-;44399:37;;44470:3;44453:13;:20;44449:602;;44497:19;44490:26;;;;;44449:602;44576:3;44559:13;:20;44555:496;;44603:19;44596:26;;;;;44555:496;44685:3;44668:13;:20;44664:387;;44712:18;44705:25;;;;;44664:387;44792:2;44775:13;:19;44771:280;;44818:18;44811:25;;;;;44771:280;44897:2;44880:13;:19;44876:175;;44923:18;44916:25;;;;;44876:175;45000:18;44993:25;;;44332:726;;:::o;23901:164::-;23998:4;24022:18;:25;24041:5;24022:25;;;;;;;;;;;;;;;:35;24048:8;24022:35;;;;;;;;;;;;;;;;;;;;;;;;;24015:42;;23901:164;;;;:::o;34765:192::-;34096:12;:10;:12::i;:::-;34085:23;;:7;:5;:7::i;:::-;:23;;;34077:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34874:1:::1;34854:22;;:8;:22;;;;34846:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34930:19;34940:8;34930:9;:19::i;:::-;34765:192:::0;:::o;43438:20::-;;;;;;;;;;;;;:::o;37078:224::-;37180:4;37219:35;37204:50;;;:11;:50;;;;:90;;;;37258:36;37282:11;37258:23;:36::i;:::-;37204:90;37197:97;;37078:224;;;:::o;26636:127::-;26701:4;26753:1;26725:30;;:7;:16;26733:7;26725:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26718:37;;26636:127;;;:::o;16140:98::-;16193:7;16220:10;16213:17;;16140:98;:::o;30618:174::-;30720:2;30693:15;:24;30709:7;30693:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30776:7;30772:2;30738:46;;30747:23;30762:7;30747:14;:23::i;:::-;30738:46;;;;;;;;;;;;30618:174;;:::o;27620:110::-;27696:26;27706:2;27710:7;27696:26;;;;;;;;;;;;:9;:26::i;:::-;27620:110;;:::o;26930:348::-;27023:4;27048:16;27056:7;27048;:16::i;:::-;27040:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27124:13;27140:23;27155:7;27140:14;:23::i;:::-;27124:39;;27193:5;27182:16;;:7;:16;;;:51;;;;27226:7;27202:31;;:20;27214:7;27202:11;:20::i;:::-;:31;;;27182:51;:87;;;;27237:32;27254:5;27261:7;27237:16;:32::i;:::-;27182:87;27174:96;;;26930:348;;;;:::o;29922:578::-;30081:4;30054:31;;:23;30069:7;30054:14;:23::i;:::-;:31;;;30046:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30164:1;30150:16;;:2;:16;;;;30142:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30220:39;30241:4;30247:2;30251:7;30220:20;:39::i;:::-;30324:29;30341:1;30345:7;30324:8;:29::i;:::-;30385:1;30366:9;:15;30376:4;30366:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30414:1;30397:9;:13;30407:2;30397:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30445:2;30426:7;:16;30434:7;30426:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30484:7;30480:2;30465:27;;30474:4;30465:27;;;;;;;;;;;;29922:578;;;:::o;34965:173::-;35021:16;35040:6;;;;;;;;;;;35021:25;;35066:8;35057:6;;:17;;;;;;;;;;;;;;;;;;35121:8;35090:40;;35111:8;35090:40;;;;;;;;;;;;35010:128;34965:173;:::o;26008:315::-;26165:28;26175:4;26181:2;26185:7;26165:9;:28::i;:::-;26212:48;26235:4;26241:2;26245:7;26254:5;26212:22;:48::i;:::-;26204:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26008:315;;;;:::o;16673:723::-;16729:13;16959:1;16950:5;:10;16946:53;;;16977:10;;;;;;;;;;;;;;;;;;;;;16946:53;17009:12;17024:5;17009:20;;17040:14;17065:78;17080:1;17072:4;:9;17065:78;;17098:8;;;;;:::i;:::-;;;;17129:2;17121:10;;;;;:::i;:::-;;;17065:78;;;17153:19;17185:6;17175:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17153:39;;17203:154;17219:1;17210:5;:10;17203:154;;17247:1;17237:11;;;;;:::i;:::-;;;17314:2;17306:5;:10;;;;:::i;:::-;17293:2;:24;;;;:::i;:::-;17280:39;;17263:6;17270;17263:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17343:2;17334:11;;;;;:::i;:::-;;;17203:154;;;17381:6;17367:21;;;;;16673:723;;;;:::o;20738:305::-;20840:4;20892:25;20877:40;;;:11;:40;;;;:105;;;;20949:33;20934:48;;;:11;:48;;;;20877:105;:158;;;;20999:36;21023:11;20999:23;:36::i;:::-;20877:158;20857:178;;20738:305;;;:::o;27957:321::-;28087:18;28093:2;28097:7;28087:5;:18::i;:::-;28138:54;28169:1;28173:2;28177:7;28186:5;28138:22;:54::i;:::-;28116:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27957:321;;;:::o;46959:204::-;47110:45;47137:4;47143:2;47147:7;47110:26;:45::i;:::-;46959:204;;;:::o;31357:799::-;31512:4;31533:15;:2;:13;;;:15::i;:::-;31529:620;;;31585:2;31569:36;;;31606:12;:10;:12::i;:::-;31620:4;31626:7;31635:5;31569:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31565:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31828:1;31811:6;:13;:18;31807:272;;;31854:60;;;;;;;;;;:::i;:::-;;;;;;;;31807:272;32029:6;32023:13;32014:6;32010:2;32006:15;31999:38;31565:529;31702:41;;;31692:51;;;:6;:51;;;;31685:58;;;;;31529:620;32133:4;32126:11;;31357:799;;;;;;;:::o;19236:157::-;19321:4;19360:25;19345:40;;;:11;:40;;;;19338:47;;19236:157;;;:::o;28614:382::-;28708:1;28694:16;;:2;:16;;;;28686:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28767:16;28775:7;28767;:16::i;:::-;28766:17;28758:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28829:45;28858:1;28862:2;28866:7;28829:20;:45::i;:::-;28904:1;28887:9;:13;28897:2;28887:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28935:2;28916:7;:16;28924:7;28916:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28980:7;28976:2;28955:33;;28972:1;28955:33;;;;;;;;;;;;28614:382;;:::o;38754:589::-;38898:45;38925:4;38931:2;38935:7;38898:26;:45::i;:::-;38976:1;38960:18;;:4;:18;;;38956:187;;;38995:40;39027:7;38995:31;:40::i;:::-;38956:187;;;39065:2;39057:10;;:4;:10;;;39053:90;;39084:47;39117:4;39123:7;39084:32;:47::i;:::-;39053:90;38956:187;39171:1;39157:16;;:2;:16;;;39153:183;;;39190:45;39227:7;39190:36;:45::i;:::-;39153:183;;;39263:4;39257:10;;:2;:10;;;39253:83;;39284:40;39312:2;39316:7;39284:27;:40::i;:::-;39253:83;39153:183;38754:589;;;:::o;8176:387::-;8236:4;8444:12;8511:7;8499:20;8491:28;;8554:1;8547:4;:8;8540:15;;;8176:387;;;:::o;32728:126::-;;;;:::o;40066:164::-;40170:10;:17;;;;40143:15;:24;40159:7;40143:24;;;;;;;;;;;:44;;;;40198:10;40214:7;40198:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40066:164;:::o;40857:988::-;41123:22;41173:1;41148:22;41165:4;41148:16;:22::i;:::-;:26;;;;:::i;:::-;41123:51;;41185:18;41206:17;:26;41224:7;41206:26;;;;;;;;;;;;41185:47;;41353:14;41339:10;:28;41335:328;;41384:19;41406:12;:18;41419:4;41406:18;;;;;;;;;;;;;;;:34;41425:14;41406:34;;;;;;;;;;;;41384:56;;41490:11;41457:12;:18;41470:4;41457:18;;;;;;;;;;;;;;;:30;41476:10;41457:30;;;;;;;;;;;:44;;;;41607:10;41574:17;:30;41592:11;41574:30;;;;;;;;;;;:43;;;;41369:294;41335:328;41759:17;:26;41777:7;41759:26;;;;;;;;;;;41752:33;;;41803:12;:18;41816:4;41803:18;;;;;;;;;;;;;;;:34;41822:14;41803:34;;;;;;;;;;;41796:41;;;40938:907;;40857:988;;:::o;42140:1079::-;42393:22;42438:1;42418:10;:17;;;;:21;;;;:::i;:::-;42393:46;;42450:18;42471:15;:24;42487:7;42471:24;;;;;;;;;;;;42450:45;;42822:19;42844:10;42855:14;42844:26;;;;;;;;:::i;:::-;;;;;;;;;;42822:48;;42908:11;42883:10;42894;42883:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43019:10;42988:15;:28;43004:11;42988:28;;;;;;;;;;;:41;;;;43160:15;:24;43176:7;43160:24;;;;;;;;;;;43153:31;;;43195:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42211:1008;;;42140:1079;:::o;39644:221::-;39729:14;39746:20;39763:2;39746:16;:20::i;:::-;39729:37;;39804:7;39777:12;:16;39790:2;39777:16;;;;;;;;;;;;;;;:24;39794:6;39777:24;;;;;;;;;;;:34;;;;39851:6;39822:17;:26;39840:7;39822:26;;;;;;;;;;;:35;;;;39718:147;39644:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:::-;11021:3;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11118:93;11207:3;11118:93;:::i;:::-;11236:2;11231:3;11227:12;11220:19;;10879:366;;;:::o;11251:::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11251:366;;;:::o;11623:::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11623:366;;;:::o;11995:::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;11995:366;;;:::o;12367:::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12367:366;;;:::o;12739:::-;12881:3;12902:67;12966:2;12961:3;12902:67;:::i;:::-;12895:74;;12978:93;13067:3;12978:93;:::i;:::-;13096:2;13091:3;13087:12;13080:19;;12739:366;;;:::o;13111:::-;13253:3;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13350:93;13439:3;13350:93;:::i;:::-;13468:2;13463:3;13459:12;13452:19;;13111:366;;;:::o;13483:::-;13625:3;13646:67;13710:2;13705:3;13646:67;:::i;:::-;13639:74;;13722:93;13811:3;13722:93;:::i;:::-;13840:2;13835:3;13831:12;13824:19;;13483:366;;;:::o;13855:::-;13997:3;14018:67;14082:2;14077:3;14018:67;:::i;:::-;14011:74;;14094:93;14183:3;14094:93;:::i;:::-;14212:2;14207:3;14203:12;14196:19;;13855:366;;;:::o;14227:::-;14369:3;14390:67;14454:2;14449:3;14390:67;:::i;:::-;14383:74;;14466:93;14555:3;14466:93;:::i;:::-;14584:2;14579:3;14575:12;14568:19;;14227:366;;;:::o;14599:365::-;14741:3;14762:66;14826:1;14821:3;14762:66;:::i;:::-;14755:73;;14837:93;14926:3;14837:93;:::i;:::-;14955:2;14950:3;14946:12;14939:19;;14599:365;;;:::o;14970:366::-;15112:3;15133:67;15197:2;15192:3;15133:67;:::i;:::-;15126:74;;15209:93;15298:3;15209:93;:::i;:::-;15327:2;15322:3;15318:12;15311:19;;14970:366;;;:::o;15342:400::-;15502:3;15523:84;15605:1;15600:3;15523:84;:::i;:::-;15516:91;;15616:93;15705:3;15616:93;:::i;:::-;15734:1;15729:3;15725:11;15718:18;;15342:400;;;:::o;15748:366::-;15890:3;15911:67;15975:2;15970:3;15911:67;:::i;:::-;15904:74;;15987:93;16076:3;15987:93;:::i;:::-;16105:2;16100:3;16096:12;16089:19;;15748:366;;;:::o;16120:::-;16262:3;16283:67;16347:2;16342:3;16283:67;:::i;:::-;16276:74;;16359:93;16448:3;16359:93;:::i;:::-;16477:2;16472:3;16468:12;16461:19;;16120:366;;;:::o;16492:::-;16634:3;16655:67;16719:2;16714:3;16655:67;:::i;:::-;16648:74;;16731:93;16820:3;16731:93;:::i;:::-;16849:2;16844:3;16840:12;16833:19;;16492:366;;;:::o;16864:::-;17006:3;17027:67;17091:2;17086:3;17027:67;:::i;:::-;17020:74;;17103:93;17192:3;17103:93;:::i;:::-;17221:2;17216:3;17212:12;17205:19;;16864:366;;;:::o;17236:::-;17378:3;17399:67;17463:2;17458:3;17399:67;:::i;:::-;17392:74;;17475:93;17564:3;17475:93;:::i;:::-;17593:2;17588:3;17584:12;17577:19;;17236:366;;;:::o;17608:::-;17750:3;17771:67;17835:2;17830:3;17771:67;:::i;:::-;17764:74;;17847:93;17936:3;17847:93;:::i;:::-;17965:2;17960:3;17956:12;17949:19;;17608:366;;;:::o;17980:::-;18122:3;18143:67;18207:2;18202:3;18143:67;:::i;:::-;18136:74;;18219:93;18308:3;18219:93;:::i;:::-;18337:2;18332:3;18328:12;18321:19;;17980:366;;;:::o;18352:::-;18494:3;18515:67;18579:2;18574:3;18515:67;:::i;:::-;18508:74;;18591:93;18680:3;18591:93;:::i;:::-;18709:2;18704:3;18700:12;18693:19;;18352:366;;;:::o;18724:118::-;18811:24;18829:5;18811:24;:::i;:::-;18806:3;18799:37;18724:118;;:::o;18848:695::-;19126:3;19148:92;19236:3;19227:6;19148:92;:::i;:::-;19141:99;;19257:95;19348:3;19339:6;19257:95;:::i;:::-;19250:102;;19369:148;19513:3;19369:148;:::i;:::-;19362:155;;19534:3;19527:10;;18848:695;;;;;:::o;19549:222::-;19642:4;19680:2;19669:9;19665:18;19657:26;;19693:71;19761:1;19750:9;19746:17;19737:6;19693:71;:::i;:::-;19549:222;;;;:::o;19777:640::-;19972:4;20010:3;19999:9;19995:19;19987:27;;20024:71;20092:1;20081:9;20077:17;20068:6;20024:71;:::i;:::-;20105:72;20173:2;20162:9;20158:18;20149:6;20105:72;:::i;:::-;20187;20255:2;20244:9;20240:18;20231:6;20187:72;:::i;:::-;20306:9;20300:4;20296:20;20291:2;20280:9;20276:18;20269:48;20334:76;20405:4;20396:6;20334:76;:::i;:::-;20326:84;;19777:640;;;;;;;:::o;20423:210::-;20510:4;20548:2;20537:9;20533:18;20525:26;;20561:65;20623:1;20612:9;20608:17;20599:6;20561:65;:::i;:::-;20423:210;;;;:::o;20639:313::-;20752:4;20790:2;20779:9;20775:18;20767:26;;20839:9;20833:4;20829:20;20825:1;20814:9;20810:17;20803:47;20867:78;20940:4;20931:6;20867:78;:::i;:::-;20859:86;;20639:313;;;;:::o;20958:419::-;21124:4;21162:2;21151:9;21147:18;21139:26;;21211:9;21205:4;21201:20;21197:1;21186:9;21182:17;21175:47;21239:131;21365:4;21239:131;:::i;:::-;21231:139;;20958:419;;;:::o;21383:::-;21549:4;21587:2;21576:9;21572:18;21564:26;;21636:9;21630:4;21626:20;21622:1;21611:9;21607:17;21600:47;21664:131;21790:4;21664:131;:::i;:::-;21656:139;;21383:419;;;:::o;21808:::-;21974:4;22012:2;22001:9;21997:18;21989:26;;22061:9;22055:4;22051:20;22047:1;22036:9;22032:17;22025:47;22089:131;22215:4;22089:131;:::i;:::-;22081:139;;21808:419;;;:::o;22233:::-;22399:4;22437:2;22426:9;22422:18;22414:26;;22486:9;22480:4;22476:20;22472:1;22461:9;22457:17;22450:47;22514:131;22640:4;22514:131;:::i;:::-;22506:139;;22233:419;;;:::o;22658:::-;22824:4;22862:2;22851:9;22847:18;22839:26;;22911:9;22905:4;22901:20;22897:1;22886:9;22882:17;22875:47;22939:131;23065:4;22939:131;:::i;:::-;22931:139;;22658:419;;;:::o;23083:::-;23249:4;23287:2;23276:9;23272:18;23264:26;;23336:9;23330:4;23326:20;23322:1;23311:9;23307:17;23300:47;23364:131;23490:4;23364:131;:::i;:::-;23356:139;;23083:419;;;:::o;23508:::-;23674:4;23712:2;23701:9;23697:18;23689:26;;23761:9;23755:4;23751:20;23747:1;23736:9;23732:17;23725:47;23789:131;23915:4;23789:131;:::i;:::-;23781:139;;23508:419;;;:::o;23933:::-;24099:4;24137:2;24126:9;24122:18;24114:26;;24186:9;24180:4;24176:20;24172:1;24161:9;24157:17;24150:47;24214:131;24340:4;24214:131;:::i;:::-;24206:139;;23933:419;;;:::o;24358:::-;24524:4;24562:2;24551:9;24547:18;24539:26;;24611:9;24605:4;24601:20;24597:1;24586:9;24582:17;24575:47;24639:131;24765:4;24639:131;:::i;:::-;24631:139;;24358:419;;;:::o;24783:::-;24949:4;24987:2;24976:9;24972:18;24964:26;;25036:9;25030:4;25026:20;25022:1;25011:9;25007:17;25000:47;25064:131;25190:4;25064:131;:::i;:::-;25056:139;;24783:419;;;:::o;25208:::-;25374:4;25412:2;25401:9;25397:18;25389:26;;25461:9;25455:4;25451:20;25447:1;25436:9;25432:17;25425:47;25489:131;25615:4;25489:131;:::i;:::-;25481:139;;25208:419;;;:::o;25633:::-;25799:4;25837:2;25826:9;25822:18;25814:26;;25886:9;25880:4;25876:20;25872:1;25861:9;25857:17;25850:47;25914:131;26040:4;25914:131;:::i;:::-;25906:139;;25633:419;;;:::o;26058:::-;26224:4;26262:2;26251:9;26247:18;26239:26;;26311:9;26305:4;26301:20;26297:1;26286:9;26282:17;26275:47;26339:131;26465:4;26339:131;:::i;:::-;26331:139;;26058:419;;;:::o;26483:::-;26649:4;26687:2;26676:9;26672:18;26664:26;;26736:9;26730:4;26726:20;26722:1;26711:9;26707:17;26700:47;26764:131;26890:4;26764:131;:::i;:::-;26756:139;;26483:419;;;:::o;26908:::-;27074:4;27112:2;27101:9;27097:18;27089:26;;27161:9;27155:4;27151:20;27147:1;27136:9;27132:17;27125:47;27189:131;27315:4;27189:131;:::i;:::-;27181:139;;26908:419;;;:::o;27333:::-;27499:4;27537:2;27526:9;27522:18;27514:26;;27586:9;27580:4;27576:20;27572:1;27561:9;27557:17;27550:47;27614:131;27740:4;27614:131;:::i;:::-;27606:139;;27333:419;;;:::o;27758:::-;27924:4;27962:2;27951:9;27947:18;27939:26;;28011:9;28005:4;28001:20;27997:1;27986:9;27982:17;27975:47;28039:131;28165:4;28039:131;:::i;:::-;28031:139;;27758:419;;;:::o;28183:::-;28349:4;28387:2;28376:9;28372:18;28364:26;;28436:9;28430:4;28426:20;28422:1;28411:9;28407:17;28400:47;28464:131;28590:4;28464:131;:::i;:::-;28456:139;;28183:419;;;:::o;28608:::-;28774:4;28812:2;28801:9;28797:18;28789:26;;28861:9;28855:4;28851:20;28847:1;28836:9;28832:17;28825:47;28889:131;29015:4;28889:131;:::i;:::-;28881:139;;28608:419;;;:::o;29033:::-;29199:4;29237:2;29226:9;29222:18;29214:26;;29286:9;29280:4;29276:20;29272:1;29261:9;29257:17;29250:47;29314:131;29440:4;29314:131;:::i;:::-;29306:139;;29033:419;;;:::o;29458:::-;29624:4;29662:2;29651:9;29647:18;29639:26;;29711:9;29705:4;29701:20;29697:1;29686:9;29682:17;29675:47;29739:131;29865:4;29739:131;:::i;:::-;29731:139;;29458:419;;;:::o;29883:::-;30049:4;30087:2;30076:9;30072:18;30064:26;;30136:9;30130:4;30126:20;30122:1;30111:9;30107:17;30100:47;30164:131;30290:4;30164:131;:::i;:::-;30156:139;;29883:419;;;:::o;30308:::-;30474:4;30512:2;30501:9;30497:18;30489:26;;30561:9;30555:4;30551:20;30547:1;30536:9;30532:17;30525:47;30589:131;30715:4;30589:131;:::i;:::-;30581:139;;30308:419;;;:::o;30733:::-;30899:4;30937:2;30926:9;30922:18;30914:26;;30986:9;30980:4;30976:20;30972:1;30961:9;30957:17;30950:47;31014:131;31140:4;31014:131;:::i;:::-;31006:139;;30733:419;;;:::o;31158:222::-;31251:4;31289:2;31278:9;31274:18;31266:26;;31302:71;31370:1;31359:9;31355:17;31346:6;31302:71;:::i;:::-;31158:222;;;;:::o;31386:129::-;31420:6;31447:20;;:::i;:::-;31437:30;;31476:33;31504:4;31496:6;31476:33;:::i;:::-;31386:129;;;:::o;31521:75::-;31554:6;31587:2;31581:9;31571:19;;31521:75;:::o;31602:307::-;31663:4;31753:18;31745:6;31742:30;31739:56;;;31775:18;;:::i;:::-;31739:56;31813:29;31835:6;31813:29;:::i;:::-;31805:37;;31897:4;31891;31887:15;31879:23;;31602:307;;;:::o;31915:308::-;31977:4;32067:18;32059:6;32056:30;32053:56;;;32089:18;;:::i;:::-;32053:56;32127:29;32149:6;32127:29;:::i;:::-;32119:37;;32211:4;32205;32201:15;32193:23;;31915:308;;;:::o;32229:141::-;32278:4;32301:3;32293:11;;32324:3;32321:1;32314:14;32358:4;32355:1;32345:18;32337:26;;32229:141;;;:::o;32376:98::-;32427:6;32461:5;32455:12;32445:22;;32376:98;;;:::o;32480:99::-;32532:6;32566:5;32560:12;32550:22;;32480:99;;;:::o;32585:168::-;32668:11;32702:6;32697:3;32690:19;32742:4;32737:3;32733:14;32718:29;;32585:168;;;;:::o;32759:169::-;32843:11;32877:6;32872:3;32865:19;32917:4;32912:3;32908:14;32893:29;;32759:169;;;;:::o;32934:148::-;33036:11;33073:3;33058:18;;32934:148;;;;:::o;33088:305::-;33128:3;33147:20;33165:1;33147:20;:::i;:::-;33142:25;;33181:20;33199:1;33181:20;:::i;:::-;33176:25;;33335:1;33267:66;33263:74;33260:1;33257:81;33254:107;;;33341:18;;:::i;:::-;33254:107;33385:1;33382;33378:9;33371:16;;33088:305;;;;:::o;33399:185::-;33439:1;33456:20;33474:1;33456:20;:::i;:::-;33451:25;;33490:20;33508:1;33490:20;:::i;:::-;33485:25;;33529:1;33519:35;;33534:18;;:::i;:::-;33519:35;33576:1;33573;33569:9;33564:14;;33399:185;;;;:::o;33590:191::-;33630:4;33650:20;33668:1;33650:20;:::i;:::-;33645:25;;33684:20;33702:1;33684:20;:::i;:::-;33679:25;;33723:1;33720;33717:8;33714:34;;;33728:18;;:::i;:::-;33714:34;33773:1;33770;33766:9;33758:17;;33590:191;;;;:::o;33787:96::-;33824:7;33853:24;33871:5;33853:24;:::i;:::-;33842:35;;33787:96;;;:::o;33889:90::-;33923:7;33966:5;33959:13;33952:21;33941:32;;33889:90;;;:::o;33985:149::-;34021:7;34061:66;34054:5;34050:78;34039:89;;33985:149;;;:::o;34140:126::-;34177:7;34217:42;34210:5;34206:54;34195:65;;34140:126;;;:::o;34272:77::-;34309:7;34338:5;34327:16;;34272:77;;;:::o;34355:154::-;34439:6;34434:3;34429;34416:30;34501:1;34492:6;34487:3;34483:16;34476:27;34355:154;;;:::o;34515:307::-;34583:1;34593:113;34607:6;34604:1;34601:13;34593:113;;;34692:1;34687:3;34683:11;34677:18;34673:1;34668:3;34664:11;34657:39;34629:2;34626:1;34622:10;34617:15;;34593:113;;;34724:6;34721:1;34718:13;34715:101;;;34804:1;34795:6;34790:3;34786:16;34779:27;34715:101;34564:258;34515:307;;;:::o;34828:320::-;34872:6;34909:1;34903:4;34899:12;34889:22;;34956:1;34950:4;34946:12;34977:18;34967:81;;35033:4;35025:6;35021:17;35011:27;;34967:81;35095:2;35087:6;35084:14;35064:18;35061:38;35058:84;;;35114:18;;:::i;:::-;35058:84;34879:269;34828:320;;;:::o;35154:281::-;35237:27;35259:4;35237:27;:::i;:::-;35229:6;35225:40;35367:6;35355:10;35352:22;35331:18;35319:10;35316:34;35313:62;35310:88;;;35378:18;;:::i;:::-;35310:88;35418:10;35414:2;35407:22;35197:238;35154:281;;:::o;35441:233::-;35480:3;35503:24;35521:5;35503:24;:::i;:::-;35494:33;;35549:66;35542:5;35539:77;35536:103;;;35619:18;;:::i;:::-;35536:103;35666:1;35659:5;35655:13;35648:20;;35441:233;;;:::o;35680:176::-;35712:1;35729:20;35747:1;35729:20;:::i;:::-;35724:25;;35763:20;35781:1;35763:20;:::i;:::-;35758:25;;35802:1;35792:35;;35807:18;;:::i;:::-;35792:35;35848:1;35845;35841:9;35836:14;;35680:176;;;;:::o;35862:180::-;35910:77;35907:1;35900:88;36007:4;36004:1;35997:15;36031:4;36028:1;36021:15;36048:180;36096:77;36093:1;36086:88;36193:4;36190:1;36183:15;36217:4;36214:1;36207:15;36234:180;36282:77;36279:1;36272:88;36379:4;36376:1;36369:15;36403:4;36400:1;36393:15;36420:180;36468:77;36465:1;36458:88;36565:4;36562:1;36555:15;36589:4;36586:1;36579:15;36606:180;36654:77;36651:1;36644:88;36751:4;36748:1;36741:15;36775:4;36772:1;36765:15;36792:180;36840:77;36837:1;36830:88;36937:4;36934:1;36927:15;36961:4;36958:1;36951:15;36978:117;37087:1;37084;37077:12;37101:117;37210:1;37207;37200:12;37224:117;37333:1;37330;37323:12;37347:117;37456:1;37453;37446:12;37470:102;37511:6;37562:2;37558:7;37553:2;37546:5;37542:14;37538:28;37528:38;;37470:102;;;:::o;37578:174::-;37718:26;37714:1;37706:6;37702:14;37695:50;37578:174;:::o;37758:230::-;37898:34;37894:1;37886:6;37882:14;37875:58;37967:13;37962:2;37954:6;37950:15;37943:38;37758:230;:::o;37994:237::-;38134:34;38130:1;38122:6;38118:14;38111:58;38203:20;38198:2;38190:6;38186:15;38179:45;37994:237;:::o;38237:225::-;38377:34;38373:1;38365:6;38361:14;38354:58;38446:8;38441:2;38433:6;38429:15;38422:33;38237:225;:::o;38468:178::-;38608:30;38604:1;38596:6;38592:14;38585:54;38468:178;:::o;38652:223::-;38792:34;38788:1;38780:6;38776:14;38769:58;38861:6;38856:2;38848:6;38844:15;38837:31;38652:223;:::o;38881:175::-;39021:27;39017:1;39009:6;39005:14;38998:51;38881:175;:::o;39062:231::-;39202:34;39198:1;39190:6;39186:14;39179:58;39271:14;39266:2;39258:6;39254:15;39247:39;39062:231;:::o;39299:243::-;39439:34;39435:1;39427:6;39423:14;39416:58;39508:26;39503:2;39495:6;39491:15;39484:51;39299:243;:::o;39548:229::-;39688:34;39684:1;39676:6;39672:14;39665:58;39757:12;39752:2;39744:6;39740:15;39733:37;39548:229;:::o;39783:228::-;39923:34;39919:1;39911:6;39907:14;39900:58;39992:11;39987:2;39979:6;39975:15;39968:36;39783:228;:::o;40017:222::-;40157:34;40153:1;40145:6;40141:14;40134:58;40226:5;40221:2;40213:6;40209:15;40202:30;40017:222;:::o;40245:182::-;40385:34;40381:1;40373:6;40369:14;40362:58;40245:182;:::o;40433:169::-;40573:21;40569:1;40561:6;40557:14;40550:45;40433:169;:::o;40608:158::-;40748:10;40744:1;40736:6;40732:14;40725:34;40608:158;:::o;40772:231::-;40912:34;40908:1;40900:6;40896:14;40889:58;40981:14;40976:2;40968:6;40964:15;40957:39;40772:231;:::o;41009:155::-;41149:7;41145:1;41137:6;41133:14;41126:31;41009:155;:::o;41170:182::-;41310:34;41306:1;41298:6;41294:14;41287:58;41170:182;:::o;41358:228::-;41498:34;41494:1;41486:6;41482:14;41475:58;41567:11;41562:2;41554:6;41550:15;41543:36;41358:228;:::o;41592:234::-;41732:34;41728:1;41720:6;41716:14;41709:58;41801:17;41796:2;41788:6;41784:15;41777:42;41592:234;:::o;41832:220::-;41972:34;41968:1;41960:6;41956:14;41949:58;42041:3;42036:2;42028:6;42024:15;42017:28;41832:220;:::o;42058:166::-;42198:18;42194:1;42186:6;42182:14;42175:42;42058:166;:::o;42230:236::-;42370:34;42366:1;42358:6;42354:14;42347:58;42439:19;42434:2;42426:6;42422:15;42415:44;42230:236;:::o;42472:231::-;42612:34;42608:1;42600:6;42596:14;42589:58;42681:14;42676:2;42668:6;42664:15;42657:39;42472:231;:::o;42709:177::-;42849:29;42845:1;42837:6;42833:14;42826:53;42709:177;:::o;42892:122::-;42965:24;42983:5;42965:24;:::i;:::-;42958:5;42955:35;42945:63;;43004:1;43001;42994:12;42945:63;42892:122;:::o;43020:116::-;43090:21;43105:5;43090:21;:::i;:::-;43083:5;43080:32;43070:60;;43126:1;43123;43116:12;43070:60;43020:116;:::o;43142:120::-;43214:23;43231:5;43214:23;:::i;:::-;43207:5;43204:34;43194:62;;43252:1;43249;43242:12;43194:62;43142:120;:::o;43268:122::-;43341:24;43359:5;43341:24;:::i;:::-;43334:5;43331:35;43321:63;;43380:1;43377;43370:12;43321:63;43268:122;:::o

Swarm Source

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