ETH Price: $3,473.37 (-1.26%)
Gas: 5 Gwei

Token

Neo Tokyo Citizen (NTCTZN)
 

Overview

Max Total Supply

2,081 NTCTZN

Holders

109

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NTCTZN
0x67b1fa3ebe1da2790e92e2c01e2b195f77f087af
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ciphers decoding.... Preparing bytestream headers [/*|] Memory linked list unpacked. Welcome to the New World.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NTCitizenDeploy

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
* Generated by @Thrasher66099
* Email [email protected] for your NFT launch needs
*/

pragma solidity ^0.8.0;

interface IByteContract {
    function burn(address _from, uint256 _amount) external;
    function getReward(address _to) external;
    function updateRewardOnMint(address _user, uint256 tokenId) external;
    function updateReward(address _from, address _to, uint256 _tokenId) external;
}

interface IMintContract {
    function generateURI(uint256 citizenId) external view returns (string memory);
    function calculateRewardRate(uint256 identityId, uint256 vaultId) external view returns(uint256);
}

interface IIdentityContract {  
    function getClass(uint256 tokenId) external view returns (string memory);
}

interface IVaultContract {
    function getCreditMultiplier(uint256 tokenId) external view returns (string memory);
}

interface IBoughtIdentityContract {
    function claimIdentity(address _to) external;
}

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

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



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


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


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


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



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


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


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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}




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


/**
 * @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(to).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 {}
}



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


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

contract NTCitizenDeploy is ERC721Enumerable, IERC721Receiver, ReentrancyGuard, Ownable {

    uint256 constant SECONDS_IN_A_YEAR = 31536000;
    bool citizenMintActive;
    bool boughtIdentitiesActive;
    bool femaleActive;
    address citizenMintContract;
    address citizenAlternateMintContract;
    address public vaultContract;
    address public itemContract;
    address public identityContract;
    address public boughtIdentityContract;
    address public landContract;
    address public bytesContract;
    uint256 newestCitizen;
    uint256 public mintedIdentityCost = 2000 ether;
    uint256 public changeGenderCost = 25 ether;
    uint256 public changeSpecialMessageCost = 10 ether;
    uint256 creationTime;
    uint256 endDelta = 157680000;

    // Mapping for vault tokenIds that were used to creat a citizen
    mapping(uint256 => uint256) private _vaultDataByCitizenId;
    // Mapping for identity tokenIds that were used to creat a citizen
    mapping(uint256 => uint256) private _identityDataByCitizenId;
    // Mapping for item cache tokenIds that were used to creat a citizen
    mapping(uint256 => uint256) private _itemCacheDataByCitizenId;
    // Mapping for land deed tokenIds that were used to creat a citizen
    mapping(uint256 => uint256) private _landDeedDataByCitizenId;
    // Mapping for special messages uploaded when a citizen was created
    mapping(uint256 => string) private _specialMessageByCitizenId;
    // Mapping for reward by citizen
    mapping(uint256 => uint256) private _rewardRateByCitizenId;
    // Mapping for citizen creation date
    mapping(uint256 => uint256) private _citizenCreationTime;
    // Mapping for gender of a citizen
    mapping(uint256 => bool ) private _genderFemale;

    function getIdentityIdOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _identityDataByCitizenId[citizenId];
    }
    function getVaultIdOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _vaultDataByCitizenId[citizenId];
    }
    function getItemCacheIdOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _itemCacheDataByCitizenId[citizenId];
    }
    function getLandDeedIdOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _landDeedDataByCitizenId[citizenId];
    }
    function getSpecialMessageOfTokenId(uint256 citizenId) public view returns (string memory) {
        return _specialMessageByCitizenId[citizenId];
    }
    function getRewardRateOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _rewardRateByCitizenId[citizenId];
    }
    function getGenderOfTokenId(uint256 citizenId) public view returns (bool) {
        return _genderFemale[citizenId];
    }

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) public override pure returns (bytes4) {
        return this.onERC721Received.selector ^ 0x23b872dd;
    }

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

        if(_genderFemale[tokenId])
        {
            dataContract = IMintContract(citizenAlternateMintContract);
        }
        else
        {
            dataContract = IMintContract(citizenMintContract);
        }
        
        output = dataContract.generateURI(tokenId);

        return output;
    }

    function getRewardRate(address _user) public view returns(uint256) {
        uint256 rewardRate;
        for(uint256 index = 0; index < ERC721.balanceOf(_user); index++)
        {
            rewardRate = rewardRate + _rewardRateByCitizenId[tokenOfOwnerByIndex(_user, index)];
        }
        return rewardRate;
    }

    function getRewardsRateForTokenId(uint256 tokenId) public view returns(uint256){
        require(_exists(tokenId) || tokenId == 0, "Citizen does not exist");
        return rewardRateByTokenId(tokenId);
    }

    function rewardRateByTokenId(uint256 tokenId) internal view returns(uint256){
        require(_exists(tokenId) || tokenId == 0, "Citizen does not exist");
        if(tokenId > 0)
        {
            return _rewardRateByCitizenId[tokenId] + ((block.timestamp - _citizenCreationTime[tokenId]) / SECONDS_IN_A_YEAR);
        }
        return 0;
    }

    function getCurrentOrFinalTime() public view returns(uint256) {
        if(block.timestamp < getEnd())
        {
            return block.timestamp;
        }
        else
        {
            return getEnd();
        }
    }

    //Obsolete due to rewards mapping implementation
    function reduceRewards(uint256, address) public {}

    //Obsolete due to rewards mapping implementation
    function increaseRewards(uint256, address) public {}

    function getEnd() public view returns(uint256) {
        return creationTime + endDelta;
    }

    function calculateCitizenReward(uint256 identityId, uint256 vaultId) internal view returns(uint256){
        IMintContract dataContract = IMintContract(citizenMintContract);
        return dataContract.calculateRewardRate(identityId, vaultId);
    }

    function createCitizen(uint256 identityId, uint256 vaultId, uint256 itemCacheId, uint256 landDeedId, bool genderFemale, string memory specialMessage) public nonReentrant {
        require(citizenMintActive, "Uploading is not currently active");
        require(identityValidated(identityId), "You are not the owner of that identity");
        require(itemCacheValidated(itemCacheId), "You are not the owner of that item cache");
        require(landDeedValidated(landDeedId), "You are not the owner of that land deed");

        if(genderFemale)
        {
           require(femaleActive, "Females cannot be uploaded yet"); 
        }

        if(vaultId > 0)
        {
            require(vaultValidated(vaultId), "You are not the owner of that vault box");
        }

        _safeMint(_msgSender(), newestCitizen + 1);

        newestCitizen++;

        ERC721 _identityContract;

        if(identityId < 2300)
        {
            _identityContract = ERC721(identityContract);
        }
        else
        {
            _identityContract = ERC721(boughtIdentityContract);
        }
        _identityContract.transferFrom(_msgSender(), address(this), identityId);

        if(vaultId > 0)
        {
            ERC721 _vaultContract = ERC721(vaultContract);
            _vaultContract.transferFrom(_msgSender(), address(this), vaultId);

            _vaultDataByCitizenId[newestCitizen] = vaultId;
        }

        ERC721 _itemContract = ERC721(itemContract);
        _itemContract.transferFrom(_msgSender(), address(this), itemCacheId);

        ERC721 _landContract = ERC721(landContract);
        _landContract.transferFrom(_msgSender(), address(this), landDeedId);

        // Set the underlying component data mappings
        _identityDataByCitizenId[newestCitizen] = identityId;
        _itemCacheDataByCitizenId[newestCitizen] = itemCacheId;
        _landDeedDataByCitizenId[newestCitizen] = landDeedId;
        if(genderFemale)
        {
            _genderFemale[newestCitizen] = genderFemale;
        }
        if(bytes(specialMessage).length > 0)
        {
            _specialMessageByCitizenId[newestCitizen] = specialMessage;
        }
        _rewardRateByCitizenId[newestCitizen] = calculateCitizenReward(identityId, vaultId);

        _citizenCreationTime[newestCitizen] = block.timestamp;

        IByteContract byteToken = IByteContract(bytesContract);
        byteToken.updateRewardOnMint(_msgSender(), newestCitizen);
    }

    function disassembleCitizen(uint256 citizenId)public nonReentrant {
        require(ownerOf(citizenId) == _msgSender(), "You do not own that citizen");

        ERC721 _identityContract;

        if(_identityDataByCitizenId[citizenId] < 2300)
        {
            _identityContract = ERC721(identityContract);
        }
        else
        {
            _identityContract = ERC721(boughtIdentityContract);
        }
        _identityContract.transferFrom(address(this), _msgSender(), _identityDataByCitizenId[citizenId]);

        if(_vaultDataByCitizenId[citizenId] > 0)
        {
            ERC721 _vaultContract = ERC721(vaultContract);
            _vaultContract.transferFrom(address(this), _msgSender(), _vaultDataByCitizenId[citizenId]);
        }

        ERC721 _itemContract = ERC721(itemContract);
        _itemContract.transferFrom(address(this), _msgSender(), _itemCacheDataByCitizenId[citizenId]);

        ERC721 _landContract = ERC721(landContract);
        _landContract.transferFrom(address(this), _msgSender(), _landDeedDataByCitizenId[citizenId]);

        _burn(citizenId);

        delete _identityDataByCitizenId[citizenId];
        delete _vaultDataByCitizenId[citizenId];
        delete _itemCacheDataByCitizenId[citizenId];
        delete _landDeedDataByCitizenId[citizenId];
        delete _genderFemale[citizenId];
        delete _specialMessageByCitizenId[citizenId];
        delete _rewardRateByCitizenId[citizenId];
    }

     function changeGender(uint256 tokenId) public nonReentrant {
        require(femaleActive, "Females cannot be uploaded yet"); 
        require(ownerOf(tokenId) == _msgSender(), "You do not own that citizen");

        IByteContract iBytes = IByteContract(bytesContract);
        iBytes.burn(_msgSender(), changeGenderCost);
        _genderFemale[tokenId] = !_genderFemale[tokenId];
     }

     function changeSpecialMessage(uint256 tokenId, string memory _message) public nonReentrant {
        require(ownerOf(tokenId) == _msgSender(), "You do not own that citizen");

        IByteContract iBytes = IByteContract(bytesContract);
        iBytes.burn(_msgSender(), changeSpecialMessageCost);
        _specialMessageByCitizenId[tokenId] = _message;
     }

     function setChangeGenderCost(uint256 _cost) external onlyOwner {
         changeGenderCost = _cost;
     }

     function setChangeMessageCost(uint256 _cost) external onlyOwner {
         changeSpecialMessageCost = _cost;
     }

    function vaultValidated(uint256 vaultId) internal view returns (bool) {
        ERC721Enumerable vaultEnumerable = ERC721Enumerable(vaultContract);
        return(vaultEnumerable.ownerOf(vaultId) == _msgSender());
    }

    function identityValidated(uint256 identityId) internal view returns (bool) {
        ERC721Enumerable identityEnumerable;
        if(identityId < 2300)
        {
            identityEnumerable = ERC721Enumerable(identityContract);
        }
        else
        {
            identityEnumerable = ERC721Enumerable(boughtIdentityContract);
        }
        return(identityEnumerable.ownerOf(identityId) == _msgSender());
    }

    function itemCacheValidated(uint256 itemCacheId) internal view returns (bool) {
        ERC721Enumerable itemCacheEnumerable = ERC721Enumerable(itemContract);
        return(itemCacheEnumerable.ownerOf(itemCacheId) == _msgSender());
    }

    function landDeedValidated(uint256 landDeedId) internal view returns (bool) {
        ERC721Enumerable landDeedEnumerable = ERC721Enumerable(landContract);
        return(landDeedEnumerable.ownerOf(landDeedId) == _msgSender());
    }

    function setFemaleActive() public onlyOwner {
        femaleActive = !femaleActive;
    }

    function setCitizenMintActive() public onlyOwner {
        citizenMintActive = !citizenMintActive;
    }

    function setBoughtIdentitiesActive() public onlyOwner {
        boughtIdentitiesActive = !boughtIdentitiesActive;
    }

    function setIdentityAddress(address contractAddress) public onlyOwner {
        identityContract = contractAddress;
    }

    function setLandContract(address contractAddress) public onlyOwner {
        landContract = contractAddress;
    }

    function setItemContract(address contractAddress) public onlyOwner {
        itemContract = contractAddress;
    }

    function setVaultAddress(address contractAddress) public onlyOwner {
        vaultContract = contractAddress;
    }

    function setBytesAddress(address contractAddress) public onlyOwner {
        bytesContract = contractAddress;
    }

    function setCitizenMintContract(address contractAddress) public onlyOwner {
        citizenMintContract = contractAddress;
    }

    function setCitizenAlternateMintContract(address contractAddress) public onlyOwner {
        citizenAlternateMintContract = contractAddress;
    }

    function setMintedIdentityCost(uint256 _cost) public onlyOwner {
        mintedIdentityCost = _cost;
    }

    function mintIdentity() public
    {
        require(boughtIdentitiesActive, "Identities cannot be bought yet");
        require(address(boughtIdentityContract) != address(0), "Identity contract not set");
        IByteContract iBytes = IByteContract(bytesContract);
        iBytes.burn(_msgSender(), mintedIdentityCost);
        IBoughtIdentityContract iBoughtIdentitiesContract = IBoughtIdentityContract(boughtIdentityContract);
        iBoughtIdentitiesContract.claimIdentity(_msgSender());
    }

    function getReward() external {
        IByteContract byteToken = IByteContract(bytesContract);
        byteToken.updateReward(msg.sender, address(0), 0);
		byteToken.getReward(msg.sender);
	}

	function transferFrom(address from, address to, uint256 tokenId) public override {
		IByteContract byteToken = IByteContract(bytesContract);
        byteToken.updateReward(from, to, tokenId);
		ERC721.transferFrom(from, to, tokenId);
	}

	function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
		IByteContract byteToken = IByteContract(bytesContract);
        byteToken.updateReward(from, to, tokenId);
		ERC721.safeTransferFrom(from, to, tokenId, _data);
	}

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Neo Tokyo Citizen", "NTCTZN") Ownable() {
        creationTime = block.timestamp;
        bytesContract = 0x7d647b1A0dcD5525e9C6B3D14BE58f27674f8c95;
        vaultContract = 0xab0b0dD7e4EaB0F9e31a539074a03f1C1Be80879;
        itemContract = 0x0938E3F7AC6D7f674FeD551c93f363109bda3AF9;
        identityContract = 0x86357A19E5537A8Fba9A004E555713BC943a66C0;
        boughtIdentityContract = 0x835a60cc60B808e47825daa79A9Da6C9fF3a892E;
        landContract = 0x3C54b798b3aAD4F6089533aF3bdbD6ce233019bB;
        citizenMintContract = 0xf1F199C5a6B41231902B2f6E93e8edC59FaF507b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"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":[{"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":"boughtIdentityContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bytesContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"changeGender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeGenderCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_message","type":"string"}],"name":"changeSpecialMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeSpecialMessageCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"identityId","type":"uint256"},{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"itemCacheId","type":"uint256"},{"internalType":"uint256","name":"landDeedId","type":"uint256"},{"internalType":"bool","name":"genderFemale","type":"bool"},{"internalType":"string","name":"specialMessage","type":"string"}],"name":"createCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"disassembleCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentOrFinalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getGenderOfTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getIdentityIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getItemCacheIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getLandDeedIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getRewardRateOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRewardsRateForTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getSpecialMessageOfTokenId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getVaultIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identityContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"increaseRewards","outputs":[],"stateMutability":"nonpayable","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":"itemContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintIdentity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedIdentityCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"reduceRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBoughtIdentitiesActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setBytesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setChangeGenderCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setChangeMessageCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setCitizenAlternateMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setCitizenMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setCitizenMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFemaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setIdentityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setItemContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setLandContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMintedIdentityCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setVaultAddress","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":"vaultContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052686c6b935b8bbd40000060155568015af1d78b58c40000601655678ac7230489e8000060175563096601806019553480156200003f57600080fd5b5060408051808201825260118152702732b7902a37b5bcb79021b4ba34bd32b760791b602080830191825283518085019094526006845265272a21aa2d2760d11b9084015281519192916200009791600091620001fa565b508051620000ad906001906020840190620001fa565b50506001600a5550620000c033620001a8565b42601855601380546001600160a01b0319908116737d647b1a0dcd5525e9c6b3d14be58f27674f8c9517909155600e8054821673ab0b0dd7e4eab0f9e31a539074a03f1c1be80879179055600f80548216730938e3f7ac6d7f674fed551c93f363109bda3af91790556010805482167386357a19e5537a8fba9a004e555713bc943a66c017905560118054821673835a60cc60b808e47825daa79a9da6c9ff3a892e179055601280548216733c54b798b3aad4f6089533af3bdbd6ce233019bb179055600c805490911673f1f199c5a6b41231902b2f6e93e8edc59faf507b179055620002dd565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200020890620002a0565b90600052602060002090601f0160209004810192826200022c576000855562000277565b82601f106200024757805160ff191683800117855562000277565b8280016001018555821562000277579182015b82811115620002775782518255916020019190600101906200025a565b506200028592915062000289565b5090565b5b808211156200028557600081556001016200028a565b600181811c90821680620002b557607f821691505b60208210811415620002d757634e487b7160e01b600052602260045260246000fd5b50919050565b61385680620002ed6000396000f3fe608060405234801561001057600080fd5b50600436106103af5760003560e01c806370a08231116101f4578063b88d4fde1161011a578063e859965a116100ad578063eb4807dc1161007c578063eb4807dc1461082b578063eead4b161461083e578063f2fde38b14610851578063ffef6c071461086457600080fd5b8063e859965a146107b6578063e86dd092146107c9578063e985e9c5146107dc578063ea7cbff11461081857600080fd5b8063cbaaf86b116100e9578063cbaaf86b14610768578063d1506be41461077b578063dddec1ba1461078e578063e3df42961461079657600080fd5b8063b88d4fde14610727578063bfd58ea61461073a578063c87b56dd1461074d578063ca2882ca1461076057600080fd5b806395d89b4111610192578063a68bfa6e11610161578063a68bfa6e146106d9578063a7120433146106e1578063aa54f9b8146106f4578063b79c30241461071457600080fd5b806395d89b41146106a35780639eb936b9146106ab5780639f05a36d146106be578063a22cb465146106c657600080fd5b806385535cc5116101ce57806385535cc5146106635780638d76f940146106765780638da5cb5b1461068957806392aa8eec1461069a57600080fd5b806370a0823114610648578063715018a61461065b57806375e5ff431461054a57600080fd5b806342842e0e116102d95780635f7159bd1161027757806367031bae1161024657806367031bae146105ec57806368241af4146105ff578063695349b8146106125780636d58cb301461062557600080fd5b80635f7159bd1461059e5780636352211e146105a6578063652296f1146105b957806366ad0752146105cc57600080fd5b80634f6ccce7116102b35780634f6ccce71461055c578063552cbf331461056f57806355ed458e146105785780635d5be4fa1461058b57600080fd5b806342842e0e14610517578063438ecb351461052a5780634823e6cc1461054a57600080fd5b8063140c08a5116103515780632274346b116103205780632274346b146104d657806323b872dd146104e95780632f745c59146104fc5780633d18b9121461050f57600080fd5b8063140c08a51461047a578063150b7a021461048d5780631682c3c9146104c557806318160ddd146104ce57600080fd5b8063081812fc1161038d578063081812fc1461041c578063095ea7b31461042f5780630b633c84146104445780630d68ad5d1461047257600080fd5b806301ffc9a7146103b457806303d07340146103dc57806306fdde0314610407575b600080fd5b6103c76103c23660046132c9565b610877565b60405190151581526020015b60405180910390f35b6012546103ef906001600160a01b031681565b6040516001600160a01b0390911681526020016103d3565b61040f6108a2565b6040516103d39190613518565b6103ef61042a36600461337a565b610934565b61044261043d36600461329d565b6109c1565b005b61046461045236600461337a565b6000908152601d602052604090205490565b6040519081526020016103d3565b610442610ad7565b610442610488366004613095565b610b22565b6104ac61049b366004613149565b6336b308df60e01b95945050505050565b6040516001600160e01b031990911681526020016103d3565b61046460175481565b600854610464565b600e546103ef906001600160a01b031681565b6104426104f7366004613108565b610b6e565b61046461050a36600461329d565b610be7565b610442610c7d565b610442610525366004613108565b610d42565b61046461053836600461337a565b6000908152601a602052604090205490565b6104426105583660046133ac565b5050565b61046461056a36600461337a565b610d5d565b61046460165481565b61040f61058636600461337a565b610df0565b61046461059936600461337a565b610e92565b610442610ef4565b6103ef6105b436600461337a565b610f3f565b6104426105c736600461337a565b610fb6565b6104646105da36600461337a565b6000908152601c602052604090205490565b6010546103ef906001600160a01b031681565b61044261060d366004613095565b611101565b61044261062036600461337a565b61114d565b6103c761063336600461337a565b60009081526021602052604090205460ff1690565b610464610656366004613095565b611441565b6104426114c8565b610442610671366004613095565b6114fe565b600f546103ef906001600160a01b031681565b600b546001600160a01b03166103ef565b61046460155481565b61040f61154a565b6104426106b936600461337a565b611559565b610464611588565b6104426106d4366004613268565b61159f565b610442611664565b6104426106ef366004613095565b6117fb565b61046461070236600461337a565b6000908152601f602052604090205490565b61044261072236600461337a565b611847565b6104426107353660046131e8565b611876565b610442610748366004613095565b6118ea565b61040f61075b36600461337a565b611936565b610464611a64565b61044261077636600461337a565b611a82565b6013546103ef906001600160a01b031681565b610442611ab1565b6104646107a436600461337a565b6000908152601b602052604090205490565b6104426107c4366004613418565b611afc565b6104426107d7366004613095565b6120bf565b6103c76107ea3660046130cf565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610464610826366004613095565b61210b565b6104426108393660046133d1565b612164565b6011546103ef906001600160a01b031681565b61044261085f366004613095565b61225c565b610442610872366004613095565b6122f7565b60006001600160e01b0319821663780e9d6360e01b148061089c575061089c82612343565b92915050565b6060600080546108b190613747565b80601f01602080910402602001604051908101604052809291908181526020018280546108dd90613747565b801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b5050505050905090565b600061093f82612393565b6109a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109cc82610f3f565b9050806001600160a01b0316836001600160a01b03161415610a3a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161099c565b336001600160a01b0382161480610a565750610a5681336107ea565b610ac85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161099c565b610ad283836123b0565b505050565b600b546001600160a01b03163314610b015760405162461bcd60e51b815260040161099c9061357d565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600b546001600160a01b03163314610b4c5760405162461bcd60e51b815260040161099c9061357d565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60135460405163164746fd60e11b81526001600160a01b03909116908190632c8e8dfa90610ba4908790879087906004016134b7565b600060405180830381600087803b158015610bbe57600080fd5b505af1158015610bd2573d6000803e3d6000fd5b50505050610be184848461241e565b50505050565b6000610bf283611441565b8210610c545760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60135460405163164746fd60e11b81526001600160a01b03909116908190632c8e8dfa90610cb490339060009081906004016134b7565b600060405180830381600087803b158015610cce57600080fd5b505af1158015610ce2573d6000803e3d6000fd5b5050604051630c00007b60e41b81523360048201526001600160a01b038416925063c00007b09150602401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b5050505050565b610ad283838360405180602001604052806000815250611876565b6000610d6860085490565b8210610dcb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161099c565b60088281548110610dde57610dde6137c9565b90600052602060002001549050919050565b6000818152601e60205260409020805460609190610e0d90613747565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3990613747565b8015610e865780601f10610e5b57610100808354040283529160200191610e86565b820191906000526020600020905b815481529060010190602001808311610e6957829003601f168201915b50505050509050919050565b6000610e9d82612393565b80610ea6575081155b610eeb5760405162461bcd60e51b815260206004820152601660248201527510da5d1a5e995b88191bd95cc81b9bdd08195e1a5cdd60521b604482015260640161099c565b61089c8261244f565b600b546001600160a01b03163314610f1e5760405162461bcd60e51b815260040161099c9061357d565b600b805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b03168061089c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161099c565b6002600a541415610fd95760405162461bcd60e51b815260040161099c9061363a565b6002600a55600b54600160b01b900460ff166110375760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161099c565b3361104182610f3f565b6001600160a01b0316146110675760405162461bcd60e51b815260040161099c90613603565b6013546001600160a01b031680639dc29fac336016546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156110c357600080fd5b505af11580156110d7573d6000803e3d6000fd5b50505060009283525050602160205260409020805460ff19811660ff909116151790556001600a55565b600b546001600160a01b0316331461112b5760405162461bcd60e51b815260040161099c9061357d565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6002600a5414156111705760405162461bcd60e51b815260040161099c9061363a565b6002600a553361117f82610f3f565b6001600160a01b0316146111a55760405162461bcd60e51b815260040161099c90613603565b6000818152601b60205260408120546108fc11156111cf57506010546001600160a01b03166111dd565b506011546001600160a01b03165b6000828152601b6020526040908190205490516323b872dd60e01b81526001600160a01b038316916323b872dd9161121c9130913391906004016134b7565b600060405180830381600087803b15801561123657600080fd5b505af115801561124a573d6000803e3d6000fd5b5050506000838152601a60205260409020541590506112de57600e546001600160a01b0316806323b872dd30336000878152601a6020526040908190205490516001600160e01b031960e086901b1681526112aa939291906004016134b7565b600060405180830381600087803b1580156112c457600080fd5b505af11580156112d8573d6000803e3d6000fd5b50505050505b600f546001600160a01b0316806323b872dd30336000878152601c6020526040908190205490516001600160e01b031960e086901b168152611325939291906004016134b7565b600060405180830381600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b50506012546000868152601d6020526040908190205490516323b872dd60e01b81526001600160a01b0390921693508392506323b872dd9161139c9130913391906004016134b7565b600060405180830381600087803b1580156113b657600080fd5b505af11580156113ca573d6000803e3d6000fd5b505050506113d7846124f7565b6000848152601b60209081526040808320839055601a8252808320839055601c8252808320839055601d825280832083905560218252808320805460ff19169055601e909152812061142891612f48565b5050506000908152601f60205260408120556001600a55565b60006001600160a01b0382166114ac5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161099c565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114f25760405162461bcd60e51b815260040161099c9061357d565b6114fc600061259e565b565b600b546001600160a01b031633146115285760405162461bcd60e51b815260040161099c9061357d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600180546108b190613747565b600b546001600160a01b031633146115835760405162461bcd60e51b815260040161099c9061357d565b601755565b600060195460185461159a91906136ca565b905090565b6001600160a01b0382163314156115f85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54600160a81b900460ff166116bd5760405162461bcd60e51b815260206004820152601f60248201527f4964656e7469746965732063616e6e6f7420626520626f756768742079657400604482015260640161099c565b6011546001600160a01b03166117155760405162461bcd60e51b815260206004820152601960248201527f4964656e7469747920636f6e7472616374206e6f742073657400000000000000604482015260640161099c565b6013546001600160a01b031680639dc29fac336015546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561177157600080fd5b505af1158015611785573d6000803e3d6000fd5b50506011546001600160a01b031691508190506374570e50336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505050505050565b600b546001600160a01b031633146118255760405162461bcd60e51b815260040161099c9061357d565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146118715760405162461bcd60e51b815260040161099c9061357d565b601655565b60135460405163164746fd60e11b81526001600160a01b03909116908190632c8e8dfa906118ac908890889088906004016134b7565b600060405180830381600087803b1580156118c657600080fd5b505af11580156118da573d6000803e3d6000fd5b50505050610d3b858585856125f0565b600b546001600160a01b031633146119145760405162461bcd60e51b815260040161099c9061357d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b606061194182612393565b6119a55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161099c565b6000828152602160205260408120546060919060ff16156119d25750600d546001600160a01b03166119e0565b50600c546001600160a01b03165b60405163db790e0960e01b8152600481018590526001600160a01b0382169063db790e099060240160006040518083038186803b158015611a2057600080fd5b505afa158015611a34573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a5c9190810190613303565b949350505050565b6000611a6e611588565b421015611a7a57504290565b61159a611588565b600b546001600160a01b03163314611aac5760405162461bcd60e51b815260040161099c9061357d565b601555565b600b546001600160a01b03163314611adb5760405162461bcd60e51b815260040161099c9061357d565b600b805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6002600a541415611b1f5760405162461bcd60e51b815260040161099c9061363a565b6002600a55600b54600160a01b900460ff16611b875760405162461bcd60e51b815260206004820152602160248201527f55706c6f6164696e67206973206e6f742063757272656e746c792061637469766044820152606560f81b606482015260840161099c565b611b9086612622565b611beb5760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206964604482015265656e7469747960d01b606482015260840161099c565b611bf4846126de565b611c515760405162461bcd60e51b815260206004820152602860248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206974604482015267656d20636163686560c01b606482015260840161099c565b611c5a836126f3565b611cb65760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206c616044820152661b99081919595960ca1b606482015260840161099c565b8115611d1557600b54600160b01b900460ff16611d155760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161099c565b8415611d8057611d2485612708565b611d805760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f6620746861742076616044820152660ead8e840c4def60cb1b606482015260840161099c565b611d9733601454611d929060016136ca565b61271d565b60148054906000611da783613782565b919050555060006108fc871015611dca57506010546001600160a01b0316611dd8565b506011546001600160a01b03165b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90611e0890339030908c906004016134b7565b600060405180830381600087803b158015611e2257600080fd5b505af1158015611e36573d6000803e3d6000fd5b505050506000861115611ebe57600e546001600160a01b0316806323b872dd33308a6040518463ffffffff1660e01b8152600401611e76939291906134b7565b600060405180830381600087803b158015611e9057600080fd5b505af1158015611ea4573d6000803e3d6000fd5b50506014546000908152601a602052604090208990555050505b600f546001600160a01b0316806323b872dd3330896040518463ffffffff1660e01b8152600401611ef1939291906134b7565b600060405180830381600087803b158015611f0b57600080fd5b505af1158015611f1f573d6000803e3d6000fd5b50506012546040516323b872dd60e01b81526001600160a01b0390911692508291506323b872dd90611f5990339030908b906004016134b7565b600060405180830381600087803b158015611f7357600080fd5b505af1158015611f87573d6000803e3d6000fd5b5050601480546000908152601b602090815260408083208f905583548352601c82528083208d905592548252601d90522088905550508415611fe1576014546000908152602160205260409020805460ff19168615151790555b83511561200c576014546000908152601e60209081526040909120855161200a92870190612f82565b505b6120168989612737565b601480546000908152601f602090815260408083209490945591548152908052204290556013546001600160a01b03168063cc240c01336014546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b50506001600a55505050505050505050505050565b600b546001600160a01b031633146120e95760405162461bcd60e51b815260040161099c9061357d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60008060005b61211a84611441565b81101561215d57601f600061212f8684610be7565b8152602001908152602001600020548261214991906136ca565b91508061215581613782565b915050612111565b5092915050565b6002600a5414156121875760405162461bcd60e51b815260040161099c9061363a565b6002600a553361219683610f3f565b6001600160a01b0316146121bc5760405162461bcd60e51b815260040161099c90613603565b6013546001600160a01b031680639dc29fac336017546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561221857600080fd5b505af115801561222c573d6000803e3d6000fd5b5050506000848152601e60209081526040909120845161225193509091850190612f82565b50506001600a555050565b600b546001600160a01b031633146122865760405162461bcd60e51b815260040161099c9061357d565b6001600160a01b0381166122eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099c565b6122f48161259e565b50565b600b546001600160a01b031633146123215760405162461bcd60e51b815260040161099c9061357d565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061237457506001600160e01b03198216635b5e139f60e01b145b8061089c57506301ffc9a760e01b6001600160e01b031983161461089c565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123e582610f3f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61242833826127bd565b6124445760405162461bcd60e51b815260040161099c906135b2565b610ad28383836128a3565b600061245a82612393565b80612463575081155b6124a85760405162461bcd60e51b815260206004820152601660248201527510da5d1a5e995b88191bd95cc81b9bdd08195e1a5cdd60521b604482015260640161099c565b81156124ef5760008281526020805260409020546301e13380906124cc9042613704565b6124d691906136e2565b6000838152601f602052604090205461089c91906136ca565b506000919050565b600061250282610f3f565b905061251081600084612a4e565b61251b6000836123b0565b6001600160a01b0381166000908152600360205260408120805460019290612544908490613704565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6125fa33836127bd565b6126165760405162461bcd60e51b815260040161099c906135b2565b610be184848484612b06565b6000806108fc83101561264157506010546001600160a01b031661264f565b506011546001600160a01b03165b335b6040516331a9108f60e11b8152600481018590526001600160a01b0391821691831690636352211e9060240160206040518083038186803b15801561269557600080fd5b505afa1580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd91906130b2565b6001600160a01b0316149392505050565b600f546000906001600160a01b031633612651565b6012546000906001600160a01b031633612651565b600e546000906001600160a01b031633612651565b610558828260405180602001604052806000815250612b39565b600c5460405163938e75e160e01b815260048101849052602481018390526000916001600160a01b031690819063938e75e19060440160206040518083038186803b15801561278557600080fd5b505afa158015612799573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613393565b60006127c882612393565b6128295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161099c565b600061283483610f3f565b9050806001600160a01b0316846001600160a01b0316148061286f5750836001600160a01b031661286484610934565b6001600160a01b0316145b80611a5c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a5c565b826001600160a01b03166128b682610f3f565b6001600160a01b03161461291e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161099c565b6001600160a01b0382166129805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161099c565b61298b838383612a4e565b6129966000826123b0565b6001600160a01b03831660009081526003602052604081208054600192906129bf908490613704565b90915550506001600160a01b03821660009081526003602052604081208054600192906129ed9084906136ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038316612aa957612aa481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612acc565b816001600160a01b0316836001600160a01b031614612acc57612acc8382612b6c565b6001600160a01b038216612ae357610ad281612c09565b826001600160a01b0316826001600160a01b031614610ad257610ad28282612cb8565b612b118484846128a3565b612b1d84848484612cfc565b610be15760405162461bcd60e51b815260040161099c9061352b565b612b438383612e09565b612b506000848484612cfc565b610ad25760405162461bcd60e51b815260040161099c9061352b565b60006001612b7984611441565b612b839190613704565b600083815260076020526040902054909150808214612bd6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c1b90600190613704565b60008381526009602052604081205460088054939450909284908110612c4357612c436137c9565b906000526020600020015490508060088381548110612c6457612c646137c9565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c9c57612c9c6137b3565b6001900381819060005260206000200160009055905550505050565b6000612cc383611441565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b0384163b15612dfe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d409033908990889088906004016134db565b602060405180830381600087803b158015612d5a57600080fd5b505af1925050508015612d8a575060408051601f3d908101601f19168201909252612d87918101906132e6565b60015b612de4573d808015612db8576040519150601f19603f3d011682016040523d82523d6000602084013e612dbd565b606091505b508051612ddc5760405162461bcd60e51b815260040161099c9061352b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a5c565b506001949350505050565b6001600160a01b038216612e5f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161099c565b612e6881612393565b15612eb55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099c565b612ec160008383612a4e565b6001600160a01b0382166000908152600360205260408120805460019290612eea9084906136ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b508054612f5490613747565b6000825580601f10612f64575050565b601f0160209004906000526020600020908101906122f49190613006565b828054612f8e90613747565b90600052602060002090601f016020900481019282612fb05760008555612ff6565b82601f10612fc957805160ff1916838001178555612ff6565b82800160010185558215612ff6579182015b82811115612ff6578251825591602001919060010190612fdb565b50613002929150613006565b5090565b5b808211156130025760008155600101613007565b600061302e613029846136a2565b613671565b905082815283838301111561304257600080fd5b828260208301376000602084830101529392505050565b8035801515811461306957600080fd5b919050565b600082601f83011261307f57600080fd5b61308e8383356020850161301b565b9392505050565b6000602082840312156130a757600080fd5b813561308e816137f5565b6000602082840312156130c457600080fd5b815161308e816137f5565b600080604083850312156130e257600080fd5b82356130ed816137f5565b915060208301356130fd816137f5565b809150509250929050565b60008060006060848603121561311d57600080fd5b8335613128816137f5565b92506020840135613138816137f5565b929592945050506040919091013590565b60008060008060006080868803121561316157600080fd5b853561316c816137f5565b9450602086013561317c816137f5565b935060408601359250606086013567ffffffffffffffff808211156131a057600080fd5b818801915088601f8301126131b457600080fd5b8135818111156131c357600080fd5b8960208285010111156131d557600080fd5b9699959850939650602001949392505050565b600080600080608085870312156131fe57600080fd5b8435613209816137f5565b93506020850135613219816137f5565b925060408501359150606085013567ffffffffffffffff81111561323c57600080fd5b8501601f8101871361324d57600080fd5b61325c8782356020840161301b565b91505092959194509250565b6000806040838503121561327b57600080fd5b8235613286816137f5565b915061329460208401613059565b90509250929050565b600080604083850312156132b057600080fd5b82356132bb816137f5565b946020939093013593505050565b6000602082840312156132db57600080fd5b813561308e8161380a565b6000602082840312156132f857600080fd5b815161308e8161380a565b60006020828403121561331557600080fd5b815167ffffffffffffffff81111561332c57600080fd5b8201601f8101841361333d57600080fd5b805161334b613029826136a2565b81815285602083850101111561336057600080fd5b61337182602083016020860161371b565b95945050505050565b60006020828403121561338c57600080fd5b5035919050565b6000602082840312156133a557600080fd5b5051919050565b600080604083850312156133bf57600080fd5b8235915060208301356130fd816137f5565b600080604083850312156133e457600080fd5b82359150602083013567ffffffffffffffff81111561340257600080fd5b61340e8582860161306e565b9150509250929050565b60008060008060008060c0878903121561343157600080fd5b8635955060208701359450604087013593506060870135925061345660808801613059565b915060a087013567ffffffffffffffff81111561347257600080fd5b61347e89828a0161306e565b9150509295509295509295565b600081518084526134a381602086016020860161371b565b601f01601f19169290920160200192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061350e9083018461348b565b9695505050505050565b60208152600061308e602083018461348b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601b908201527f596f7520646f206e6f74206f776e207468617420636974697a656e0000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561369a5761369a6137df565b604052919050565b600067ffffffffffffffff8211156136bc576136bc6137df565b50601f01601f191660200190565b600082198211156136dd576136dd61379d565b500190565b6000826136ff57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156137165761371661379d565b500390565b60005b8381101561373657818101518382015260200161371e565b83811115610be15750506000910152565b600181811c9082168061375b57607f821691505b6020821081141561377c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137965761379661379d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146122f457600080fd5b6001600160e01b0319811681146122f457600080fdfea2646970667358221220020762b8a3f0e23cd4a91cf441f4738dcdb351aa36352fc42a69137a907e887e64736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103af5760003560e01c806370a08231116101f4578063b88d4fde1161011a578063e859965a116100ad578063eb4807dc1161007c578063eb4807dc1461082b578063eead4b161461083e578063f2fde38b14610851578063ffef6c071461086457600080fd5b8063e859965a146107b6578063e86dd092146107c9578063e985e9c5146107dc578063ea7cbff11461081857600080fd5b8063cbaaf86b116100e9578063cbaaf86b14610768578063d1506be41461077b578063dddec1ba1461078e578063e3df42961461079657600080fd5b8063b88d4fde14610727578063bfd58ea61461073a578063c87b56dd1461074d578063ca2882ca1461076057600080fd5b806395d89b4111610192578063a68bfa6e11610161578063a68bfa6e146106d9578063a7120433146106e1578063aa54f9b8146106f4578063b79c30241461071457600080fd5b806395d89b41146106a35780639eb936b9146106ab5780639f05a36d146106be578063a22cb465146106c657600080fd5b806385535cc5116101ce57806385535cc5146106635780638d76f940146106765780638da5cb5b1461068957806392aa8eec1461069a57600080fd5b806370a0823114610648578063715018a61461065b57806375e5ff431461054a57600080fd5b806342842e0e116102d95780635f7159bd1161027757806367031bae1161024657806367031bae146105ec57806368241af4146105ff578063695349b8146106125780636d58cb301461062557600080fd5b80635f7159bd1461059e5780636352211e146105a6578063652296f1146105b957806366ad0752146105cc57600080fd5b80634f6ccce7116102b35780634f6ccce71461055c578063552cbf331461056f57806355ed458e146105785780635d5be4fa1461058b57600080fd5b806342842e0e14610517578063438ecb351461052a5780634823e6cc1461054a57600080fd5b8063140c08a5116103515780632274346b116103205780632274346b146104d657806323b872dd146104e95780632f745c59146104fc5780633d18b9121461050f57600080fd5b8063140c08a51461047a578063150b7a021461048d5780631682c3c9146104c557806318160ddd146104ce57600080fd5b8063081812fc1161038d578063081812fc1461041c578063095ea7b31461042f5780630b633c84146104445780630d68ad5d1461047257600080fd5b806301ffc9a7146103b457806303d07340146103dc57806306fdde0314610407575b600080fd5b6103c76103c23660046132c9565b610877565b60405190151581526020015b60405180910390f35b6012546103ef906001600160a01b031681565b6040516001600160a01b0390911681526020016103d3565b61040f6108a2565b6040516103d39190613518565b6103ef61042a36600461337a565b610934565b61044261043d36600461329d565b6109c1565b005b61046461045236600461337a565b6000908152601d602052604090205490565b6040519081526020016103d3565b610442610ad7565b610442610488366004613095565b610b22565b6104ac61049b366004613149565b6336b308df60e01b95945050505050565b6040516001600160e01b031990911681526020016103d3565b61046460175481565b600854610464565b600e546103ef906001600160a01b031681565b6104426104f7366004613108565b610b6e565b61046461050a36600461329d565b610be7565b610442610c7d565b610442610525366004613108565b610d42565b61046461053836600461337a565b6000908152601a602052604090205490565b6104426105583660046133ac565b5050565b61046461056a36600461337a565b610d5d565b61046460165481565b61040f61058636600461337a565b610df0565b61046461059936600461337a565b610e92565b610442610ef4565b6103ef6105b436600461337a565b610f3f565b6104426105c736600461337a565b610fb6565b6104646105da36600461337a565b6000908152601c602052604090205490565b6010546103ef906001600160a01b031681565b61044261060d366004613095565b611101565b61044261062036600461337a565b61114d565b6103c761063336600461337a565b60009081526021602052604090205460ff1690565b610464610656366004613095565b611441565b6104426114c8565b610442610671366004613095565b6114fe565b600f546103ef906001600160a01b031681565b600b546001600160a01b03166103ef565b61046460155481565b61040f61154a565b6104426106b936600461337a565b611559565b610464611588565b6104426106d4366004613268565b61159f565b610442611664565b6104426106ef366004613095565b6117fb565b61046461070236600461337a565b6000908152601f602052604090205490565b61044261072236600461337a565b611847565b6104426107353660046131e8565b611876565b610442610748366004613095565b6118ea565b61040f61075b36600461337a565b611936565b610464611a64565b61044261077636600461337a565b611a82565b6013546103ef906001600160a01b031681565b610442611ab1565b6104646107a436600461337a565b6000908152601b602052604090205490565b6104426107c4366004613418565b611afc565b6104426107d7366004613095565b6120bf565b6103c76107ea3660046130cf565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610464610826366004613095565b61210b565b6104426108393660046133d1565b612164565b6011546103ef906001600160a01b031681565b61044261085f366004613095565b61225c565b610442610872366004613095565b6122f7565b60006001600160e01b0319821663780e9d6360e01b148061089c575061089c82612343565b92915050565b6060600080546108b190613747565b80601f01602080910402602001604051908101604052809291908181526020018280546108dd90613747565b801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b5050505050905090565b600061093f82612393565b6109a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109cc82610f3f565b9050806001600160a01b0316836001600160a01b03161415610a3a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161099c565b336001600160a01b0382161480610a565750610a5681336107ea565b610ac85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161099c565b610ad283836123b0565b505050565b600b546001600160a01b03163314610b015760405162461bcd60e51b815260040161099c9061357d565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600b546001600160a01b03163314610b4c5760405162461bcd60e51b815260040161099c9061357d565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60135460405163164746fd60e11b81526001600160a01b03909116908190632c8e8dfa90610ba4908790879087906004016134b7565b600060405180830381600087803b158015610bbe57600080fd5b505af1158015610bd2573d6000803e3d6000fd5b50505050610be184848461241e565b50505050565b6000610bf283611441565b8210610c545760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60135460405163164746fd60e11b81526001600160a01b03909116908190632c8e8dfa90610cb490339060009081906004016134b7565b600060405180830381600087803b158015610cce57600080fd5b505af1158015610ce2573d6000803e3d6000fd5b5050604051630c00007b60e41b81523360048201526001600160a01b038416925063c00007b09150602401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b5050505050565b610ad283838360405180602001604052806000815250611876565b6000610d6860085490565b8210610dcb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161099c565b60088281548110610dde57610dde6137c9565b90600052602060002001549050919050565b6000818152601e60205260409020805460609190610e0d90613747565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3990613747565b8015610e865780601f10610e5b57610100808354040283529160200191610e86565b820191906000526020600020905b815481529060010190602001808311610e6957829003601f168201915b50505050509050919050565b6000610e9d82612393565b80610ea6575081155b610eeb5760405162461bcd60e51b815260206004820152601660248201527510da5d1a5e995b88191bd95cc81b9bdd08195e1a5cdd60521b604482015260640161099c565b61089c8261244f565b600b546001600160a01b03163314610f1e5760405162461bcd60e51b815260040161099c9061357d565b600b805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b03168061089c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161099c565b6002600a541415610fd95760405162461bcd60e51b815260040161099c9061363a565b6002600a55600b54600160b01b900460ff166110375760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161099c565b3361104182610f3f565b6001600160a01b0316146110675760405162461bcd60e51b815260040161099c90613603565b6013546001600160a01b031680639dc29fac336016546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156110c357600080fd5b505af11580156110d7573d6000803e3d6000fd5b50505060009283525050602160205260409020805460ff19811660ff909116151790556001600a55565b600b546001600160a01b0316331461112b5760405162461bcd60e51b815260040161099c9061357d565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6002600a5414156111705760405162461bcd60e51b815260040161099c9061363a565b6002600a553361117f82610f3f565b6001600160a01b0316146111a55760405162461bcd60e51b815260040161099c90613603565b6000818152601b60205260408120546108fc11156111cf57506010546001600160a01b03166111dd565b506011546001600160a01b03165b6000828152601b6020526040908190205490516323b872dd60e01b81526001600160a01b038316916323b872dd9161121c9130913391906004016134b7565b600060405180830381600087803b15801561123657600080fd5b505af115801561124a573d6000803e3d6000fd5b5050506000838152601a60205260409020541590506112de57600e546001600160a01b0316806323b872dd30336000878152601a6020526040908190205490516001600160e01b031960e086901b1681526112aa939291906004016134b7565b600060405180830381600087803b1580156112c457600080fd5b505af11580156112d8573d6000803e3d6000fd5b50505050505b600f546001600160a01b0316806323b872dd30336000878152601c6020526040908190205490516001600160e01b031960e086901b168152611325939291906004016134b7565b600060405180830381600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b50506012546000868152601d6020526040908190205490516323b872dd60e01b81526001600160a01b0390921693508392506323b872dd9161139c9130913391906004016134b7565b600060405180830381600087803b1580156113b657600080fd5b505af11580156113ca573d6000803e3d6000fd5b505050506113d7846124f7565b6000848152601b60209081526040808320839055601a8252808320839055601c8252808320839055601d825280832083905560218252808320805460ff19169055601e909152812061142891612f48565b5050506000908152601f60205260408120556001600a55565b60006001600160a01b0382166114ac5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161099c565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114f25760405162461bcd60e51b815260040161099c9061357d565b6114fc600061259e565b565b600b546001600160a01b031633146115285760405162461bcd60e51b815260040161099c9061357d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600180546108b190613747565b600b546001600160a01b031633146115835760405162461bcd60e51b815260040161099c9061357d565b601755565b600060195460185461159a91906136ca565b905090565b6001600160a01b0382163314156115f85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54600160a81b900460ff166116bd5760405162461bcd60e51b815260206004820152601f60248201527f4964656e7469746965732063616e6e6f7420626520626f756768742079657400604482015260640161099c565b6011546001600160a01b03166117155760405162461bcd60e51b815260206004820152601960248201527f4964656e7469747920636f6e7472616374206e6f742073657400000000000000604482015260640161099c565b6013546001600160a01b031680639dc29fac336015546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561177157600080fd5b505af1158015611785573d6000803e3d6000fd5b50506011546001600160a01b031691508190506374570e50336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505050505050565b600b546001600160a01b031633146118255760405162461bcd60e51b815260040161099c9061357d565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146118715760405162461bcd60e51b815260040161099c9061357d565b601655565b60135460405163164746fd60e11b81526001600160a01b03909116908190632c8e8dfa906118ac908890889088906004016134b7565b600060405180830381600087803b1580156118c657600080fd5b505af11580156118da573d6000803e3d6000fd5b50505050610d3b858585856125f0565b600b546001600160a01b031633146119145760405162461bcd60e51b815260040161099c9061357d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b606061194182612393565b6119a55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161099c565b6000828152602160205260408120546060919060ff16156119d25750600d546001600160a01b03166119e0565b50600c546001600160a01b03165b60405163db790e0960e01b8152600481018590526001600160a01b0382169063db790e099060240160006040518083038186803b158015611a2057600080fd5b505afa158015611a34573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a5c9190810190613303565b949350505050565b6000611a6e611588565b421015611a7a57504290565b61159a611588565b600b546001600160a01b03163314611aac5760405162461bcd60e51b815260040161099c9061357d565b601555565b600b546001600160a01b03163314611adb5760405162461bcd60e51b815260040161099c9061357d565b600b805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6002600a541415611b1f5760405162461bcd60e51b815260040161099c9061363a565b6002600a55600b54600160a01b900460ff16611b875760405162461bcd60e51b815260206004820152602160248201527f55706c6f6164696e67206973206e6f742063757272656e746c792061637469766044820152606560f81b606482015260840161099c565b611b9086612622565b611beb5760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206964604482015265656e7469747960d01b606482015260840161099c565b611bf4846126de565b611c515760405162461bcd60e51b815260206004820152602860248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206974604482015267656d20636163686560c01b606482015260840161099c565b611c5a836126f3565b611cb65760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206c616044820152661b99081919595960ca1b606482015260840161099c565b8115611d1557600b54600160b01b900460ff16611d155760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161099c565b8415611d8057611d2485612708565b611d805760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f6620746861742076616044820152660ead8e840c4def60cb1b606482015260840161099c565b611d9733601454611d929060016136ca565b61271d565b60148054906000611da783613782565b919050555060006108fc871015611dca57506010546001600160a01b0316611dd8565b506011546001600160a01b03165b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90611e0890339030908c906004016134b7565b600060405180830381600087803b158015611e2257600080fd5b505af1158015611e36573d6000803e3d6000fd5b505050506000861115611ebe57600e546001600160a01b0316806323b872dd33308a6040518463ffffffff1660e01b8152600401611e76939291906134b7565b600060405180830381600087803b158015611e9057600080fd5b505af1158015611ea4573d6000803e3d6000fd5b50506014546000908152601a602052604090208990555050505b600f546001600160a01b0316806323b872dd3330896040518463ffffffff1660e01b8152600401611ef1939291906134b7565b600060405180830381600087803b158015611f0b57600080fd5b505af1158015611f1f573d6000803e3d6000fd5b50506012546040516323b872dd60e01b81526001600160a01b0390911692508291506323b872dd90611f5990339030908b906004016134b7565b600060405180830381600087803b158015611f7357600080fd5b505af1158015611f87573d6000803e3d6000fd5b5050601480546000908152601b602090815260408083208f905583548352601c82528083208d905592548252601d90522088905550508415611fe1576014546000908152602160205260409020805460ff19168615151790555b83511561200c576014546000908152601e60209081526040909120855161200a92870190612f82565b505b6120168989612737565b601480546000908152601f602090815260408083209490945591548152908052204290556013546001600160a01b03168063cc240c01336014546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b50506001600a55505050505050505050505050565b600b546001600160a01b031633146120e95760405162461bcd60e51b815260040161099c9061357d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60008060005b61211a84611441565b81101561215d57601f600061212f8684610be7565b8152602001908152602001600020548261214991906136ca565b91508061215581613782565b915050612111565b5092915050565b6002600a5414156121875760405162461bcd60e51b815260040161099c9061363a565b6002600a553361219683610f3f565b6001600160a01b0316146121bc5760405162461bcd60e51b815260040161099c90613603565b6013546001600160a01b031680639dc29fac336017546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561221857600080fd5b505af115801561222c573d6000803e3d6000fd5b5050506000848152601e60209081526040909120845161225193509091850190612f82565b50506001600a555050565b600b546001600160a01b031633146122865760405162461bcd60e51b815260040161099c9061357d565b6001600160a01b0381166122eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099c565b6122f48161259e565b50565b600b546001600160a01b031633146123215760405162461bcd60e51b815260040161099c9061357d565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061237457506001600160e01b03198216635b5e139f60e01b145b8061089c57506301ffc9a760e01b6001600160e01b031983161461089c565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123e582610f3f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61242833826127bd565b6124445760405162461bcd60e51b815260040161099c906135b2565b610ad28383836128a3565b600061245a82612393565b80612463575081155b6124a85760405162461bcd60e51b815260206004820152601660248201527510da5d1a5e995b88191bd95cc81b9bdd08195e1a5cdd60521b604482015260640161099c565b81156124ef5760008281526020805260409020546301e13380906124cc9042613704565b6124d691906136e2565b6000838152601f602052604090205461089c91906136ca565b506000919050565b600061250282610f3f565b905061251081600084612a4e565b61251b6000836123b0565b6001600160a01b0381166000908152600360205260408120805460019290612544908490613704565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6125fa33836127bd565b6126165760405162461bcd60e51b815260040161099c906135b2565b610be184848484612b06565b6000806108fc83101561264157506010546001600160a01b031661264f565b506011546001600160a01b03165b335b6040516331a9108f60e11b8152600481018590526001600160a01b0391821691831690636352211e9060240160206040518083038186803b15801561269557600080fd5b505afa1580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd91906130b2565b6001600160a01b0316149392505050565b600f546000906001600160a01b031633612651565b6012546000906001600160a01b031633612651565b600e546000906001600160a01b031633612651565b610558828260405180602001604052806000815250612b39565b600c5460405163938e75e160e01b815260048101849052602481018390526000916001600160a01b031690819063938e75e19060440160206040518083038186803b15801561278557600080fd5b505afa158015612799573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190613393565b60006127c882612393565b6128295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161099c565b600061283483610f3f565b9050806001600160a01b0316846001600160a01b0316148061286f5750836001600160a01b031661286484610934565b6001600160a01b0316145b80611a5c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a5c565b826001600160a01b03166128b682610f3f565b6001600160a01b03161461291e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161099c565b6001600160a01b0382166129805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161099c565b61298b838383612a4e565b6129966000826123b0565b6001600160a01b03831660009081526003602052604081208054600192906129bf908490613704565b90915550506001600160a01b03821660009081526003602052604081208054600192906129ed9084906136ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038316612aa957612aa481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612acc565b816001600160a01b0316836001600160a01b031614612acc57612acc8382612b6c565b6001600160a01b038216612ae357610ad281612c09565b826001600160a01b0316826001600160a01b031614610ad257610ad28282612cb8565b612b118484846128a3565b612b1d84848484612cfc565b610be15760405162461bcd60e51b815260040161099c9061352b565b612b438383612e09565b612b506000848484612cfc565b610ad25760405162461bcd60e51b815260040161099c9061352b565b60006001612b7984611441565b612b839190613704565b600083815260076020526040902054909150808214612bd6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c1b90600190613704565b60008381526009602052604081205460088054939450909284908110612c4357612c436137c9565b906000526020600020015490508060088381548110612c6457612c646137c9565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c9c57612c9c6137b3565b6001900381819060005260206000200160009055905550505050565b6000612cc383611441565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b0384163b15612dfe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d409033908990889088906004016134db565b602060405180830381600087803b158015612d5a57600080fd5b505af1925050508015612d8a575060408051601f3d908101601f19168201909252612d87918101906132e6565b60015b612de4573d808015612db8576040519150601f19603f3d011682016040523d82523d6000602084013e612dbd565b606091505b508051612ddc5760405162461bcd60e51b815260040161099c9061352b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a5c565b506001949350505050565b6001600160a01b038216612e5f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161099c565b612e6881612393565b15612eb55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099c565b612ec160008383612a4e565b6001600160a01b0382166000908152600360205260408120805460019290612eea9084906136ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b508054612f5490613747565b6000825580601f10612f64575050565b601f0160209004906000526020600020908101906122f49190613006565b828054612f8e90613747565b90600052602060002090601f016020900481019282612fb05760008555612ff6565b82601f10612fc957805160ff1916838001178555612ff6565b82800160010185558215612ff6579182015b82811115612ff6578251825591602001919060010190612fdb565b50613002929150613006565b5090565b5b808211156130025760008155600101613007565b600061302e613029846136a2565b613671565b905082815283838301111561304257600080fd5b828260208301376000602084830101529392505050565b8035801515811461306957600080fd5b919050565b600082601f83011261307f57600080fd5b61308e8383356020850161301b565b9392505050565b6000602082840312156130a757600080fd5b813561308e816137f5565b6000602082840312156130c457600080fd5b815161308e816137f5565b600080604083850312156130e257600080fd5b82356130ed816137f5565b915060208301356130fd816137f5565b809150509250929050565b60008060006060848603121561311d57600080fd5b8335613128816137f5565b92506020840135613138816137f5565b929592945050506040919091013590565b60008060008060006080868803121561316157600080fd5b853561316c816137f5565b9450602086013561317c816137f5565b935060408601359250606086013567ffffffffffffffff808211156131a057600080fd5b818801915088601f8301126131b457600080fd5b8135818111156131c357600080fd5b8960208285010111156131d557600080fd5b9699959850939650602001949392505050565b600080600080608085870312156131fe57600080fd5b8435613209816137f5565b93506020850135613219816137f5565b925060408501359150606085013567ffffffffffffffff81111561323c57600080fd5b8501601f8101871361324d57600080fd5b61325c8782356020840161301b565b91505092959194509250565b6000806040838503121561327b57600080fd5b8235613286816137f5565b915061329460208401613059565b90509250929050565b600080604083850312156132b057600080fd5b82356132bb816137f5565b946020939093013593505050565b6000602082840312156132db57600080fd5b813561308e8161380a565b6000602082840312156132f857600080fd5b815161308e8161380a565b60006020828403121561331557600080fd5b815167ffffffffffffffff81111561332c57600080fd5b8201601f8101841361333d57600080fd5b805161334b613029826136a2565b81815285602083850101111561336057600080fd5b61337182602083016020860161371b565b95945050505050565b60006020828403121561338c57600080fd5b5035919050565b6000602082840312156133a557600080fd5b5051919050565b600080604083850312156133bf57600080fd5b8235915060208301356130fd816137f5565b600080604083850312156133e457600080fd5b82359150602083013567ffffffffffffffff81111561340257600080fd5b61340e8582860161306e565b9150509250929050565b60008060008060008060c0878903121561343157600080fd5b8635955060208701359450604087013593506060870135925061345660808801613059565b915060a087013567ffffffffffffffff81111561347257600080fd5b61347e89828a0161306e565b9150509295509295509295565b600081518084526134a381602086016020860161371b565b601f01601f19169290920160200192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061350e9083018461348b565b9695505050505050565b60208152600061308e602083018461348b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601b908201527f596f7520646f206e6f74206f776e207468617420636974697a656e0000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561369a5761369a6137df565b604052919050565b600067ffffffffffffffff8211156136bc576136bc6137df565b50601f01601f191660200190565b600082198211156136dd576136dd61379d565b500190565b6000826136ff57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156137165761371661379d565b500390565b60005b8381101561373657818101518382015260200161371e565b83811115610be15750506000910152565b600181811c9082168061375b57607f821691505b6020821081141561377c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137965761379661379d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146122f457600080fd5b6001600160e01b0319811681146122f457600080fdfea2646970667358221220020762b8a3f0e23cd4a91cf441f4738dcdb351aa36352fc42a69137a907e887e64736f6c63430008060033

Deployed Bytecode Sourcemap

45324:15574:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39176:224;;;;;;:::i;:::-;;:::i;:::-;;;9566:14:1;;9559:22;9541:41;;9529:2;9514:18;39176:224:0;;;;;;;;45788:27;;;;;-1:-1:-1;;;;;45788:27:0;;;;;;-1:-1:-1;;;;;7817:32:1;;;7799:51;;7787:2;7772:18;45788:27:0;7754:102:1;26298:100:0;;;:::i;:::-;;;;;;;:::i;27857:221::-;;;;;;:::i;:::-;;:::i;27380:411::-;;;;;;:::i;:::-;;:::i;:::-;;47547:142;;;;;;:::i;:::-;47619:7;47646:35;;;:24;:35;;;;;;;47547:142;;;;21551:25:1;;;21539:2;21524:18;47547:142:0;21506:76:1;57032:106:0;;;:::i;57779:117::-;;;;;;:::i;:::-;;:::i;48133:246::-;;;;;;:::i;:::-;-1:-1:-1;;;48133:246:0;;;;;;;;;;;-1:-1:-1;;;;;;9755:33:1;;;9737:52;;9725:2;9710:18;48133:246:0;9692:103:1;45987:50:0;;;;;;39816:113;39904:10;:17;39816:113;;45637:28;;;;;-1:-1:-1;;;;;45637:28:0;;;59030:240;;;;;;:::i;:::-;;:::i;39484:256::-;;;;;;:::i;:::-;;:::i;58829:196::-;;;:::i;29157:185::-;;;;;;:::i;:::-;;:::i;47255:136::-;;;;;;:::i;:::-;47324:7;47351:32;;;:21;:32;;;;;;;47255:136;50295:52;;;;;;:::i;:::-;;;;40006:233;;;;;;:::i;:::-;;:::i;45938:42::-;;;;;;47695:154;;;;;;:::i;:::-;;:::i;49304:211::-;;;;;;:::i;:::-;;:::i;57146:121::-;;;:::i;25992:239::-;;;;;;:::i;:::-;;:::i;54743:395::-;;;;;;:::i;:::-;;:::i;47397:144::-;;;;;;:::i;:::-;47470:7;47497:36;;;:25;:36;;;;;;;47397:144;45706:31;;;;;-1:-1:-1;;;;;45706:31:0;;;57275:123;;;;;;:::i;:::-;;:::i;53244:1490::-;;;;;;:::i;:::-;;:::i;48001:124::-;;;;;;:::i;:::-;48069:4;48093:24;;;:13;:24;;;;;;;;;48001:124;25722:208;;;;;;:::i;:::-;;:::i;10744:94::-;;;:::i;57654:117::-;;;;;;:::i;:::-;;:::i;45672:27::-;;;;;-1:-1:-1;;;;;45672:27:0;;;10093:87;10166:6;;-1:-1:-1;;;;;10166:6:0;10093:87;;45885:46;;;;;;26467:104;;;:::i;55639:117::-;;;;;;:::i;:::-;;:::i;50355:96::-;;;:::i;28150:295::-;;;;;;:::i;:::-;;:::i;58314:507::-;;;:::i;57530:116::-;;;;;;:::i;:::-;;:::i;47855:140::-;;;;;;:::i;:::-;47927:7;47954:33;;;:22;:33;;;;;;;47855:140;55522:108;;;;;;:::i;:::-;;:::i;59275:275::-;;;;;;:::i;:::-;;:::i;58042:148::-;;;;;;:::i;:::-;;:::i;48387:575::-;;;;;;:::i;:::-;;:::i;49886:235::-;;;:::i;58198:108::-;;;;;;:::i;:::-;;:::i;45822:28::-;;;;;-1:-1:-1;;;;;45822:28:0;;;56933:91;;;:::i;47107:142::-;;;;;;:::i;:::-;47179:7;47206:35;;;:24;:35;;;;;;;47107:142;50719:2517;;;;;;:::i;:::-;;:::i;57406:116::-;;;;;;:::i;:::-;;:::i;28516:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;28637:25:0;;;28613:4;28637:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28516:164;48970:326;;;;;;:::i;:::-;;:::i;55147:366::-;;;;;;:::i;:::-;;:::i;45744:37::-;;;;;-1:-1:-1;;;;;45744:37:0;;;10993:192;;;;;;:::i;:::-;;:::i;57904:130::-;;;;;;:::i;:::-;;:::i;39176:224::-;39278:4;-1:-1:-1;;;;;;39302:50:0;;-1:-1:-1;;;39302:50:0;;:90;;;39356:36;39380:11;39356:23;:36::i;:::-;39295:97;39176:224;-1:-1:-1;;39176:224:0:o;26298:100::-;26352:13;26385:5;26378:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26298:100;:::o;27857:221::-;27933:7;27961:16;27969:7;27961;:16::i;:::-;27953:73;;;;-1:-1:-1;;;27953:73:0;;17289:2:1;27953:73:0;;;17271:21:1;17328:2;17308:18;;;17301:30;17367:34;17347:18;;;17340:62;-1:-1:-1;;;17418:18:1;;;17411:42;17470:19;;27953:73:0;;;;;;;;;-1:-1:-1;28046:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28046:24:0;;27857:221::o;27380:411::-;27461:13;27477:23;27492:7;27477:14;:23::i;:::-;27461:39;;27525:5;-1:-1:-1;;;;;27519:11:0;:2;-1:-1:-1;;;;;27519:11:0;;;27511:57;;;;-1:-1:-1;;;27511:57:0;;19298:2:1;27511:57:0;;;19280:21:1;19337:2;19317:18;;;19310:30;19376:34;19356:18;;;19349:62;-1:-1:-1;;;19427:18:1;;;19420:31;19468:19;;27511:57:0;19270:223:1;27511:57:0;9047:10;-1:-1:-1;;;;;27603:21:0;;;;:62;;-1:-1:-1;27628:37:0;27645:5;9047:10;28516:164;:::i;27628:37::-;27581:168;;;;-1:-1:-1;;;27581:168:0;;14872:2:1;27581:168:0;;;14854:21:1;14911:2;14891:18;;;14884:30;14950:34;14930:18;;;14923:62;15021:26;15001:18;;;14994:54;15065:19;;27581:168:0;14844:246:1;27581:168:0;27762:21;27771:2;27775:7;27762:8;:21::i;:::-;27450:341;27380:411;;:::o;57032:106::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57113:17:::1;::::0;;-1:-1:-1;;;;57092:38:0;::::1;-1:-1:-1::0;;;57113:17:0;;;::::1;;;57112:18;57092:38:::0;;::::1;;::::0;;57032:106::o;57779:117::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57857:13:::1;:31:::0;;-1:-1:-1;;;;;;57857:31:0::1;-1:-1:-1::0;;;;;57857:31:0;;;::::1;::::0;;;::::1;::::0;;57779:117::o;59030:240::-;59156:13;;59181:41;;-1:-1:-1;;;59181:41:0;;-1:-1:-1;;;;;59156:13:0;;;;;;59181:22;;:41;;59204:4;;59210:2;;59214:7;;59181:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59227:38;59247:4;59253:2;59257:7;59227:19;:38::i;:::-;59111:159;59030:240;;;:::o;39484:256::-;39581:7;39617:23;39634:5;39617:16;:23::i;:::-;39609:5;:31;39601:87;;;;-1:-1:-1;;;39601:87:0;;10577:2:1;39601:87:0;;;10559:21:1;10616:2;10596:18;;;10589:30;10655:34;10635:18;;;10628:62;-1:-1:-1;;;10706:18:1;;;10699:41;10757:19;;39601:87:0;10549:233:1;39601:87:0;-1:-1:-1;;;;;;39706:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39484:256::o;58829:196::-;58910:13;;58935:49;;-1:-1:-1;;;58935:49:0;;-1:-1:-1;;;;;58910:13:0;;;;;;58935:22;;:49;;58958:10;;58870:23;;;;58935:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58989:31:0;;-1:-1:-1;;;58989:31:0;;59009:10;58989:31;;;7799:51:1;-1:-1:-1;;;;;58989:19:0;;;-1:-1:-1;58989:19:0;;-1:-1:-1;7772:18:1;;58989:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58859:166;58829:196::o;29157:185::-;29295:39;29312:4;29318:2;29322:7;29295:39;;;;;;;;;;;;:16;:39::i;40006:233::-;40081:7;40117:30;39904:10;:17;;39816:113;40117:30;40109:5;:38;40101:95;;;;-1:-1:-1;;;40101:95:0;;20118:2:1;40101:95:0;;;20100:21:1;20157:2;20137:18;;;20130:30;20196:34;20176:18;;;20169:62;-1:-1:-1;;;20247:18:1;;;20240:42;20299:19;;40101:95:0;20090:234:1;40101:95:0;40214:10;40225:5;40214:17;;;;;;;;:::i;:::-;;;;;;;;;40207:24;;40006:233;;;:::o;47695:154::-;47804:37;;;;:26;:37;;;;;47797:44;;47771:13;;47804:37;47797:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47695:154;;;:::o;49304:211::-;49375:7;49402:16;49410:7;49402;:16::i;:::-;:32;;;-1:-1:-1;49422:12:0;;49402:32;49394:67;;;;-1:-1:-1;;;49394:67:0;;10226:2:1;49394:67:0;;;10208:21:1;10265:2;10245:18;;;10238:30;-1:-1:-1;;;10284:18:1;;;10277:52;10346:18;;49394:67:0;10198:172:1;49394:67:0;49479:28;49499:7;49479:19;:28::i;57146:121::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57237:22:::1;::::0;;-1:-1:-1;;;;57211:48:0;::::1;-1:-1:-1::0;;;57237:22:0;;;::::1;;;57236:23;57211:48:::0;;::::1;;::::0;;57146:121::o;25992:239::-;26064:7;26100:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26100:16:0;26135:19;26127:73;;;;-1:-1:-1;;;26127:73:0;;15708:2:1;26127:73:0;;;15690:21:1;15747:2;15727:18;;;15720:30;15786:34;15766:18;;;15759:62;-1:-1:-1;;;15837:18:1;;;15830:39;15886:19;;26127:73:0;15680:231:1;54743:395:0;13026:1;13622:7;;:19;;13614:63;;;;-1:-1:-1;;;13614:63:0;;;;;;;:::i;:::-;13026:1;13755:7;:18;54821:12:::1;::::0;-1:-1:-1;;;54821:12:0;::::1;;;54813:55;;;::::0;-1:-1:-1;;;54813:55:0;;13692:2:1;54813:55:0::1;::::0;::::1;13674:21:1::0;13731:2;13711:18;;;13704:30;13770:32;13750:18;;;13743:60;13820:18;;54813:55:0::1;13664:180:1::0;54813:55:0::1;9047:10:::0;54888:16:::1;54896:7:::0;54888::::1;:16::i;:::-;-1:-1:-1::0;;;;;54888:32:0::1;;54880:72;;;;-1:-1:-1::0;;;54880:72:0::1;;;;;;;:::i;:::-;55002:13;::::0;-1:-1:-1;;;;;55002:13:0::1;::::0;55027:11:::1;9047:10:::0;55053:16:::1;::::0;55027:43:::1;::::0;-1:-1:-1;;;;;;55027:43:0::1;::::0;;;;;;-1:-1:-1;;;;;9314:32:1;;;55027:43:0::1;::::0;::::1;9296:51:1::0;9363:18;;;9356:34;9269:18;;55027:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;55107:22:0::1;::::0;;;-1:-1:-1;;55107:13:0::1;:22;::::0;;;;;;-1:-1:-1;;55081:48:0;::::1;55107:22;::::0;;::::1;55106:23;55081:48;::::0;;55107:22;13934:7;:22;54743:395::o;57275:123::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57356:16:::1;:34:::0;;-1:-1:-1;;;;;;57356:34:0::1;-1:-1:-1::0;;;;;57356:34:0;;;::::1;::::0;;;::::1;::::0;;57275:123::o;53244:1490::-;13026:1;13622:7;;:19;;13614:63;;;;-1:-1:-1;;;13614:63:0;;;;;;;:::i;:::-;13026:1;13755:7;:18;9047:10;53329:18:::1;53337:9:::0;53329:7:::1;:18::i;:::-;-1:-1:-1::0;;;;;53329:34:0::1;;53321:74;;;;-1:-1:-1::0;;;53321:74:0::1;;;;;;;:::i;:::-;53408:24;53448:35:::0;;;:24:::1;:35;::::0;;;;;53486:4:::1;-1:-1:-1::0;53445:228:0::1;;;-1:-1:-1::0;53543:16:0::1;::::0;-1:-1:-1;;;;;53543:16:0::1;53445:228;;;-1:-1:-1::0;53638:22:0::1;::::0;-1:-1:-1;;;;;53638:22:0::1;53445:228;53743:35;::::0;;;:24:::1;:35;::::0;;;;;;;53683:96;;-1:-1:-1;;;53683:96:0;;-1:-1:-1;;;;;53683:30:0;::::1;::::0;::::1;::::0;:96:::1;::::0;53722:4:::1;::::0;9047:10;;53743:35;53683:96:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;53830:1:0::1;53795:32:::0;;;:21:::1;:32;::::0;;;;;:36;;-1:-1:-1;53792:227:0::1;;53888:13;::::0;-1:-1:-1;;;;;53888:13:0::1;::::0;53917:27:::1;53953:4;9047:10:::0;53974:32:::1;::::0;;;:21:::1;:32;::::0;;;;;;;53917:90;;-1:-1:-1;;;;;;53917:90:0::1;::::0;;;;;;::::1;::::0;;;53974:32;53917:90:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53842:177;53792:227;54061:12;::::0;-1:-1:-1;;;;;54061:12:0::1;::::0;54085:26:::1;54120:4;9047:10:::0;54141:36:::1;::::0;;;:25:::1;:36;::::0;;;;;;;54085:93;;-1:-1:-1;;;;;;54085:93:0::1;::::0;;;;;;::::1;::::0;;;54141:36;54085:93:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54221:12:0::1;::::0;54301:35:::1;::::0;;;:24:::1;:35;::::0;;;;;;;54245:92;;-1:-1:-1;;;54245:92:0;;-1:-1:-1;;;;;54221:12:0;;::::1;::::0;-1:-1:-1;54221:12:0;;-1:-1:-1;54245:26:0::1;::::0;:92:::1;::::0;54280:4:::1;::::0;9047:10;;54301:35;54245:92:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54350:16;54356:9;54350:5;:16::i;:::-;54386:35;::::0;;;:24:::1;:35;::::0;;;;;;;54379:42;;;54439:21:::1;:32:::0;;;;;54432:39;;;54489:25:::1;:36:::0;;;;;54482:43;;;54543:24:::1;:35:::0;;;;;54536:42;;;54596:13:::1;:24:::0;;;;;54589:31;;-1:-1:-1;;54589:31:0::1;::::0;;54638:26:::1;:37:::0;;;;;54631:44:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;54693:33:0::1;::::0;;;:22:::1;:33;::::0;;;;54686:40;12982:1;13934:7;:22;53244:1490::o;25722:208::-;25794:7;-1:-1:-1;;;;;25822:19:0;;25814:74;;;;-1:-1:-1;;;25814:74:0;;15297:2:1;25814:74:0;;;15279:21:1;15336:2;15316:18;;;15309:30;15375:34;15355:18;;;15348:62;-1:-1:-1;;;15426:18:1;;;15419:40;15476:19;;25814:74:0;15269:232:1;25814:74:0;-1:-1:-1;;;;;;25906:16:0;;;;;:9;:16;;;;;;;25722:208::o;10744:94::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;10809:21:::1;10827:1;10809:9;:21::i;:::-;10744:94::o:0;57654:117::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57732:13:::1;:31:::0;;-1:-1:-1;;;;;;57732:31:0::1;-1:-1:-1::0;;;;;57732:31:0;;;::::1;::::0;;;::::1;::::0;;57654:117::o;26467:104::-;26523:13;26556:7;26549:14;;;;;:::i;55639:117::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;55715:24:::1;:32:::0;55639:117::o;50355:96::-;50393:7;50435:8;;50420:12;;:23;;;;:::i;:::-;50413:30;;50355:96;:::o;28150:295::-;-1:-1:-1;;;;;28253:24:0;;9047:10;28253:24;;28245:62;;;;-1:-1:-1;;;28245:62:0;;13338:2:1;28245:62:0;;;13320:21:1;13377:2;13357:18;;;13350:30;13416:27;13396:18;;;13389:55;13461:18;;28245:62:0;13310:175:1;28245:62:0;9047:10;28320:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28320:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28320:53:0;;;;;;;;;;28389:48;;9541:41:1;;;28320:42:0;;9047:10;28389:48;;9514:18:1;28389:48:0;;;;;;;28150:295;;:::o;58314:507::-;58369:22;;-1:-1:-1;;;58369:22:0;;;;58361:66;;;;-1:-1:-1;;;58361:66:0;;20887:2:1;58361:66:0;;;20869:21:1;20926:2;20906:18;;;20899:30;20965:33;20945:18;;;20938:61;21016:18;;58361:66:0;20859:181:1;58361:66:0;58454:22;;-1:-1:-1;;;;;58454:22:0;58438:83;;;;-1:-1:-1;;;58438:83:0;;12172:2:1;58438:83:0;;;12154:21:1;12211:2;12191:18;;;12184:30;12250:27;12230:18;;;12223:55;12295:18;;58438:83:0;12144:175:1;58438:83:0;58569:13;;-1:-1:-1;;;;;58569:13:0;;58594:11;9047:10;58620:18;;58594:45;;-1:-1:-1;;;;;;58594:45:0;;;;;;;-1:-1:-1;;;;;9314:32:1;;;58594:45:0;;;9296:51:1;9363:18;;;9356:34;9269:18;;58594:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58726:22:0;;-1:-1:-1;;;;;58726:22:0;;-1:-1:-1;58726:22:0;;-1:-1:-1;58760:39:0;9047:10;58760:53;;-1:-1:-1;;;;;;58760:53:0;;;;;;;-1:-1:-1;;;;;7817:32:1;;;58760:53:0;;;7799:51:1;7772:18;;58760:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58350:471;;58314:507::o;57530:116::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57608:12:::1;:30:::0;;-1:-1:-1;;;;;;57608:30:0::1;-1:-1:-1::0;;;;;57608:30:0;;;::::1;::::0;;;::::1;::::0;;57530:116::o;55522:108::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;55597:16:::1;:24:::0;55522:108::o;59275:275::-;59425:13;;59450:41;;-1:-1:-1;;;59450:41:0;;-1:-1:-1;;;;;59425:13:0;;;;;;59450:22;;:41;;59473:4;;59479:2;;59483:7;;59450:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59496:49;59520:4;59526:2;59530:7;59539:5;59496:23;:49::i;58042:148::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;58136:28:::1;:46:::0;;-1:-1:-1;;;;;;58136:46:0::1;-1:-1:-1::0;;;;;58136:46:0;;;::::1;::::0;;;::::1;::::0;;58042:148::o;48387:575::-;48452:13;48486:16;48494:7;48486;:16::i;:::-;48478:76;;;;-1:-1:-1;;;48478:76:0;;18882:2:1;48478:76:0;;;18864:21:1;18921:2;18901:18;;;18894:30;18960:34;18940:18;;;18933:62;-1:-1:-1;;;19011:18:1;;;19004:45;19066:19;;48478:76:0;18854:237:1;48478:76:0;48606:26;48648:22;;;:13;:22;;;;;;48575:20;;48606:26;48648:22;;48645:221;;;-1:-1:-1;48725:28:0;;-1:-1:-1;;;;;48725:28:0;48645:221;;;-1:-1:-1;48834:19:0;;-1:-1:-1;;;;;48834:19:0;48645:221;48895:33;;-1:-1:-1;;;48895:33:0;;;;;21551:25:1;;;-1:-1:-1;;;;;48895:24:0;;;;;21524:18:1;;48895:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48895:33:0;;;;;;;;;;;;:::i;:::-;48886:42;48387:575;-1:-1:-1;;;;48387:575:0:o;49886:235::-;49939:7;49980:8;:6;:8::i;:::-;49962:15;:26;49959:155;;;-1:-1:-1;50021:15:0;;49886:235::o;49959:155::-;50094:8;:6;:8::i;58198:108::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;58272:18:::1;:26:::0;58198:108::o;56933:91::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57004:12:::1;::::0;;-1:-1:-1;;;;56988:28:0;::::1;-1:-1:-1::0;;;57004:12:0;;;::::1;;;57003:13;56988:28:::0;;::::1;;::::0;;56933:91::o;50719:2517::-;13026:1;13622:7;;:19;;13614:63;;;;-1:-1:-1;;;13614:63:0;;;;;;;:::i;:::-;13026:1;13755:7;:18;50908:17:::1;::::0;-1:-1:-1;;;50908:17:0;::::1;;;50900:63;;;::::0;-1:-1:-1;;;50900:63:0;;16118:2:1;50900:63:0::1;::::0;::::1;16100:21:1::0;16157:2;16137:18;;;16130:30;16196:34;16176:18;;;16169:62;-1:-1:-1;;;16247:18:1;;;16240:31;16288:19;;50900:63:0::1;16090:223:1::0;50900:63:0::1;50982:29;51000:10;50982:17;:29::i;:::-;50974:80;;;::::0;-1:-1:-1;;;50974:80:0;;12526:2:1;50974:80:0::1;::::0;::::1;12508:21:1::0;12565:2;12545:18;;;12538:30;12604:34;12584:18;;;12577:62;-1:-1:-1;;;12655:18:1;;;12648:36;12701:19;;50974:80:0::1;12498:228:1::0;50974:80:0::1;51073:31;51092:11;51073:18;:31::i;:::-;51065:84;;;::::0;-1:-1:-1;;;51065:84:0;;18473:2:1;51065:84:0::1;::::0;::::1;18455:21:1::0;18512:2;18492:18;;;18485:30;18551:34;18531:18;;;18524:62;-1:-1:-1;;;18602:18:1;;;18595:38;18650:19;;51065:84:0::1;18445:230:1::0;51065:84:0::1;51168:29;51186:10;51168:17;:29::i;:::-;51160:81;;;::::0;-1:-1:-1;;;51160:81:0;;16881:2:1;51160:81:0::1;::::0;::::1;16863:21:1::0;16920:2;16900:18;;;16893:30;16959:34;16939:18;;;16932:62;-1:-1:-1;;;17010:18:1;;;17003:37;17057:19;;51160:81:0::1;16853:229:1::0;51160:81:0::1;51257:12;51254:108;;;51302:12;::::0;-1:-1:-1;;;51302:12:0;::::1;;;51294:55;;;::::0;-1:-1:-1;;;51294:55:0;;13692:2:1;51294:55:0::1;::::0;::::1;13674:21:1::0;13731:2;13711:18;;;13704:30;13770:32;13750:18;;;13743:60;13820:18;;51294:55:0::1;13664:180:1::0;51294:55:0::1;51377:11:::0;;51374:127:::1;;51422:23;51437:7;51422:14;:23::i;:::-;51414:75;;;::::0;-1:-1:-1;;;51414:75:0;;14051:2:1;51414:75:0::1;::::0;::::1;14033:21:1::0;14090:2;14070:18;;;14063:30;14129:34;14109:18;;;14102:62;-1:-1:-1;;;14180:18:1;;;14173:37;14227:19;;51414:75:0::1;14023:229:1::0;51414:75:0::1;51513:42;9047:10:::0;51537:13:::1;::::0;:17:::1;::::0;51553:1:::1;51537:17;:::i;:::-;51513:9;:42::i;:::-;51568:13;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;51596:24;51649:4;51636:10;:17;51633:203;;;-1:-1:-1::0;51706:16:0::1;::::0;-1:-1:-1;;;;;51706:16:0::1;51633:203;;;-1:-1:-1::0;51801:22:0::1;::::0;-1:-1:-1;;;;;51801:22:0::1;51633:203;51846:71;::::0;-1:-1:-1;;;51846:71:0;;-1:-1:-1;;;;;51846:30:0;::::1;::::0;::::1;::::0;:71:::1;::::0;9047:10;;51899:4:::1;::::0;51906:10;;51846:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51943:1;51933:7;:11;51930:240;;;52001:13;::::0;-1:-1:-1;;;;;52001:13:0::1;::::0;52030:27:::1;9047:10:::0;52080:4:::1;52087:7;52030:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52134:13:0::1;::::0;52112:36:::1;::::0;;;:21:::1;:36;::::0;;;;:46;;;-1:-1:-1;;;51930:240:0::1;52212:12;::::0;-1:-1:-1;;;;;52212:12:0::1;::::0;52236:26:::1;9047:10:::0;52285:4:::1;52292:11;52236:68;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52347:12:0::1;::::0;52371:67:::1;::::0;-1:-1:-1;;;52371:67:0;;-1:-1:-1;;;;;52347:12:0;;::::1;::::0;-1:-1:-1;52347:12:0;;-1:-1:-1;52371:26:0::1;::::0;:67:::1;::::0;9047:10;;52420:4:::1;::::0;52427:10;;52371:67:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52531:13:0::1;::::0;;52506:39:::1;::::0;;;:24:::1;:39;::::0;;;;;;;:52;;;52595:13;;52569:40;;:25:::1;:40:::0;;;;;:54;;;52659:13;;52634:39;;:24:::1;:39:::0;;;:52;;;-1:-1:-1;;52697:96:0;::::1;;;52752:13;::::0;52738:28:::1;::::0;;;:13:::1;:28;::::0;;;;:43;;-1:-1:-1;;52738:43:0::1;::::0;::::1;;;::::0;;52697:96:::1;52806:28:::0;;:32;52803:131:::1;;52891:13;::::0;52864:41:::1;::::0;;;:26:::1;:41;::::0;;;;;;;:58;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;52803:131;52984:43;53007:10;53019:7;52984:22;:43::i;:::-;52967:13;::::0;;52944:37:::1;::::0;;;:22:::1;:37;::::0;;;;;;;:83;;;;53061:13;;53040:35;;;;;;53078:15:::1;53040:53:::0;;53146:13:::1;::::0;-1:-1:-1;;;;;53146:13:0::1;::::0;53171:28:::1;9047:10:::0;53214:13:::1;::::0;53171:57:::1;::::0;-1:-1:-1;;;;;;53171:57:0::1;::::0;;;;;;-1:-1:-1;;;;;9314:32:1;;;53171:57:0::1;::::0;::::1;9296:51:1::0;9363:18;;;9356:34;9269:18;;53171:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;12982:1:0;13934:7;:22;-1:-1:-1;;;;;;;;;;;;50719:2517:0:o;57406:116::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57484:12:::1;:30:::0;;-1:-1:-1;;;;;;57484:30:0::1;-1:-1:-1::0;;;;;57484:30:0;;;::::1;::::0;;;::::1;::::0;;57406:116::o;48970:326::-;49028:7;49048:18;49081:13;49077:184;49108:23;49125:5;49108:16;:23::i;:::-;49100:5;:31;49077:184;;;49192:22;:57;49215:33;49235:5;49242;49215:19;:33::i;:::-;49192:57;;;;;;;;;;;;49179:10;:70;;;;:::i;:::-;49166:83;-1:-1:-1;49133:7:0;;;;:::i;:::-;;;;49077:184;;;-1:-1:-1;49278:10:0;48970:326;-1:-1:-1;;48970:326:0:o;55147:366::-;13026:1;13622:7;;:19;;13614:63;;;;-1:-1:-1;;;13614:63:0;;;;;;;:::i;:::-;13026:1;13755:7;:18;9047:10;55257:16:::1;55265:7:::0;55257::::1;:16::i;:::-;-1:-1:-1::0;;;;;55257:32:0::1;;55249:72;;;;-1:-1:-1::0;;;55249:72:0::1;;;;;;;:::i;:::-;55371:13;::::0;-1:-1:-1;;;;;55371:13:0::1;::::0;55396:11:::1;9047:10:::0;55422:24:::1;::::0;55396:51:::1;::::0;-1:-1:-1;;;;;;55396:51:0::1;::::0;;;;;;-1:-1:-1;;;;;9314:32:1;;;55396:51:0::1;::::0;::::1;9296::1::0;9363:18;;;9356:34;9269:18;;55396:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;55458:35:0::1;::::0;;;:26:::1;:35;::::0;;;;;;;:46;;::::1;::::0;-1:-1:-1;55458:35:0;;:46;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;12982:1:0;13934:7;:22;-1:-1:-1;;55147:366:0:o;10993:192::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11082:22:0;::::1;11074:73;;;::::0;-1:-1:-1;;;11074:73:0;;11408:2:1;11074:73:0::1;::::0;::::1;11390:21:1::0;11447:2;11427:18;;;11420:30;11486:34;11466:18;;;11459:62;-1:-1:-1;;;11537:18:1;;;11530:36;11583:19;;11074:73:0::1;11380:228:1::0;11074:73:0::1;11158:19;11168:8;11158:9;:19::i;:::-;10993:192:::0;:::o;57904:130::-;10166:6;;-1:-1:-1;;;;;10166:6:0;9047:10;10313:23;10305:68;;;;-1:-1:-1;;;10305:68:0;;;;;;;:::i;:::-;57989:19:::1;:37:::0;;-1:-1:-1;;;;;;57989:37:0::1;-1:-1:-1::0;;;;;57989:37:0;;;::::1;::::0;;;::::1;::::0;;57904:130::o;25353:305::-;25455:4;-1:-1:-1;;;;;;25492:40:0;;-1:-1:-1;;;25492:40:0;;:105;;-1:-1:-1;;;;;;;25549:48:0;;-1:-1:-1;;;25549:48:0;25492:105;:158;;;-1:-1:-1;;;;;;;;;;24069:40:0;;;25614:36;23960:157;31251:127;31316:4;31340:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31340:16:0;:30;;;31251:127::o;35233:174::-;35308:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35308:29:0;-1:-1:-1;;;;;35308:29:0;;;;;;;;:24;;35362:23;35308:24;35362:14;:23::i;:::-;-1:-1:-1;;;;;35353:46:0;;;;;;;;;;;35233:174;;:::o;28747:339::-;28942:41;9047:10;28975:7;28942:18;:41::i;:::-;28934:103;;;;-1:-1:-1;;;28934:103:0;;;;;;;:::i;:::-;29050:28;29060:4;29066:2;29070:7;29050:9;:28::i;49523:355::-;49591:7;49618:16;49626:7;49618;:16::i;:::-;:32;;;-1:-1:-1;49638:12:0;;49618:32;49610:67;;;;-1:-1:-1;;;49610:67:0;;10226:2:1;49610:67:0;;;10208:21:1;10265:2;10245:18;;;10238:30;-1:-1:-1;;;10284:18:1;;;10277:52;10346:18;;49610:67:0;10198:172:1;49610:67:0;49691:11;;49688:164;;49789:29;;;;:20;:29;;;;;;45458:8;;49771:47;;:15;:47;:::i;:::-;49770:69;;;;:::i;:::-;49735:31;;;;:22;:31;;;;;;:105;;;;:::i;49688:164::-;-1:-1:-1;49869:1:0;;49523:355;-1:-1:-1;49523:355:0:o;33840:360::-;33900:13;33916:23;33931:7;33916:14;:23::i;:::-;33900:39;;33952:48;33973:5;33988:1;33992:7;33952:20;:48::i;:::-;34041:29;34058:1;34062:7;34041:8;:29::i;:::-;-1:-1:-1;;;;;34083:16:0;;;;;;:9;:16;;;;;:21;;34103:1;;34083:16;:21;;34103:1;;34083:21;:::i;:::-;;;;-1:-1:-1;;34122:16:0;;;;:7;:16;;;;;;34115:23;;-1:-1:-1;;;;;;34115:23:0;;;34156:36;34130:7;;34122:16;-1:-1:-1;;;;;34156:36:0;;;;;34122:16;;34156:36;33889:311;33840:360;:::o;11193:173::-;11268:6;;;-1:-1:-1;;;;;11285:17:0;;;-1:-1:-1;;;;;;11285:17:0;;;;;;;11318:40;;11268:6;;;11285:17;11268:6;;11318:40;;11249:16;;11318:40;11238:128;11193:173;:::o;29413:328::-;29588:41;9047:10;29621:7;29588:18;:41::i;:::-;29580:103;;;;-1:-1:-1;;;29580:103:0;;;;;;;:::i;:::-;29694:39;29708:4;29714:2;29718:7;29727:5;29694:13;:39::i;55994:438::-;56064:4;56081:35;56143:4;56130:10;:17;56127:225;;;-1:-1:-1;56211:16:0;;-1:-1:-1;;;;;56211:16:0;56127:225;;;-1:-1:-1;56317:22:0;;-1:-1:-1;;;;;56317:22:0;56127:225;9047:10;56411:12;56369:38;;-1:-1:-1;;;56369:38:0;;;;;21551:25:1;;;-1:-1:-1;;;;;56369:54:0;;;;:26;;;;;21524:18:1;;56369:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56369:54:0;;;55994:438;-1:-1:-1;;;55994:438:0:o;56440:241::-;56585:12;;56512:4;;-1:-1:-1;;;;;56585:12:0;9047:10;56660:12;8967:98;56689:236;56831:12;;56759:4;;-1:-1:-1;;;;;56831:12:0;9047:10;56904:12;8967:98;55764:222;55897:13;;55828:4;;-1:-1:-1;;;;;55897:13:0;9047:10;55965:12;8967:98;32235:110;32311:26;32321:2;32325:7;32311:26;;;;;;;;;;;;:9;:26::i;50459:252::-;50612:19;;50650:53;;-1:-1:-1;;;50650:53:0;;;;;21761:25:1;;;21802:18;;;21795:34;;;50550:7:0;;-1:-1:-1;;;;;50612:19:0;;;;50650:32;;21734:18:1;;50650:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31545:348::-;31638:4;31663:16;31671:7;31663;:16::i;:::-;31655:73;;;;-1:-1:-1;;;31655:73:0;;14459:2:1;31655:73:0;;;14441:21:1;14498:2;14478:18;;;14471:30;14537:34;14517:18;;;14510:62;-1:-1:-1;;;14588:18:1;;;14581:42;14640:19;;31655:73:0;14431:234:1;31655:73:0;31739:13;31755:23;31770:7;31755:14;:23::i;:::-;31739:39;;31808:5;-1:-1:-1;;;;;31797:16:0;:7;-1:-1:-1;;;;;31797:16:0;;:51;;;;31841:7;-1:-1:-1;;;;;31817:31:0;:20;31829:7;31817:11;:20::i;:::-;-1:-1:-1;;;;;31817:31:0;;31797:51;:87;;;-1:-1:-1;;;;;;28637:25:0;;;28613:4;28637:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31852:32;28516:164;34537:578;34696:4;-1:-1:-1;;;;;34669:31:0;:23;34684:7;34669:14;:23::i;:::-;-1:-1:-1;;;;;34669:31:0;;34661:85;;;;-1:-1:-1;;;34661:85:0;;18063:2:1;34661:85:0;;;18045:21:1;18102:2;18082:18;;;18075:30;18141:34;18121:18;;;18114:62;-1:-1:-1;;;18192:18:1;;;18185:39;18241:19;;34661:85:0;18035:231:1;34661:85:0;-1:-1:-1;;;;;34765:16:0;;34757:65;;;;-1:-1:-1;;;34757:65:0;;12933:2:1;34757:65:0;;;12915:21:1;12972:2;12952:18;;;12945:30;13011:34;12991:18;;;12984:62;-1:-1:-1;;;13062:18:1;;;13055:34;13106:19;;34757:65:0;12905:226:1;34757:65:0;34835:39;34856:4;34862:2;34866:7;34835:20;:39::i;:::-;34939:29;34956:1;34960:7;34939:8;:29::i;:::-;-1:-1:-1;;;;;34981:15:0;;;;;;:9;:15;;;;;:20;;35000:1;;34981:15;:20;;35000:1;;34981:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35012:13:0;;;;;;:9;:13;;;;;:18;;35029:1;;35012:13;:18;;35029:1;;35012:18;:::i;:::-;;;;-1:-1:-1;;35041:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35041:21:0;-1:-1:-1;;;;;35041:21:0;;;;;;;;;35080:27;;35041:16;;35080:27;;;;;;;34537:578;;;:::o;40852:589::-;-1:-1:-1;;;;;41058:18:0;;41054:187;;41093:40;41125:7;42268:10;:17;;42241:24;;;;:15;:24;;;;;:44;;;42296:24;;;;;;;;;;;;42164:164;41093:40;41054:187;;;41163:2;-1:-1:-1;;;;;41155:10:0;:4;-1:-1:-1;;;;;41155:10:0;;41151:90;;41182:47;41215:4;41221:7;41182:32;:47::i;:::-;-1:-1:-1;;;;;41255:16:0;;41251:183;;41288:45;41325:7;41288:36;:45::i;41251:183::-;41361:4;-1:-1:-1;;;;;41355:10:0;:2;-1:-1:-1;;;;;41355:10:0;;41351:83;;41382:40;41410:2;41414:7;41382:27;:40::i;30623:315::-;30780:28;30790:4;30796:2;30800:7;30780:9;:28::i;:::-;30827:48;30850:4;30856:2;30860:7;30869:5;30827:22;:48::i;:::-;30819:111;;;;-1:-1:-1;;;30819:111:0;;;;;;;:::i;32572:321::-;32702:18;32708:2;32712:7;32702:5;:18::i;:::-;32753:54;32784:1;32788:2;32792:7;32801:5;32753:22;:54::i;:::-;32731:154;;;;-1:-1:-1;;;32731:154:0;;;;;;;:::i;42955:988::-;43221:22;43271:1;43246:22;43263:4;43246:16;:22::i;:::-;:26;;;;:::i;:::-;43283:18;43304:26;;;:17;:26;;;;;;43221:51;;-1:-1:-1;43437:28:0;;;43433:328;;-1:-1:-1;;;;;43504:18:0;;43482:19;43504:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43555:30;;;;;;:44;;;43672:30;;:17;:30;;;;;:43;;;43433:328;-1:-1:-1;43857:26:0;;;;:17;:26;;;;;;;;43850:33;;;-1:-1:-1;;;;;43901:18:0;;;;;:12;:18;;;;;:34;;;;;;;43894:41;42955:988::o;44238:1079::-;44516:10;:17;44491:22;;44516:21;;44536:1;;44516:21;:::i;:::-;44548:18;44569:24;;;:15;:24;;;;;;44942:10;:26;;44491:46;;-1:-1:-1;44569:24:0;;44491:46;;44942:26;;;;;;:::i;:::-;;;;;;;;;44920:48;;45006:11;44981:10;44992;44981:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45086:28;;;:15;:28;;;;;;;:41;;;45258:24;;;;;45251:31;45293:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44309:1008;;;44238:1079;:::o;41742:221::-;41827:14;41844:20;41861:2;41844:16;:20::i;:::-;-1:-1:-1;;;;;41875:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41920:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41742:221:0:o;35972:803::-;36127:4;-1:-1:-1;;;;;36148:13:0;;16465:20;16513:8;36144:624;;36184:72;;-1:-1:-1;;;36184:72:0;;-1:-1:-1;;;;;36184:36:0;;;;;:72;;9047:10;;36235:4;;36241:7;;36250:5;;36184:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36184:72:0;;;;;;;;-1:-1:-1;;36184:72:0;;;;;;;;;;;;:::i;:::-;;;36180:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36430:13:0;;36426:272;;36473:60;;-1:-1:-1;;;36473:60:0;;;;;;;:::i;36426:272::-;36648:6;36642:13;36633:6;36629:2;36625:15;36618:38;36180:533;-1:-1:-1;;;;;;36307:55:0;-1:-1:-1;;;36307:55:0;;-1:-1:-1;36300:62:0;;36144:624;-1:-1:-1;36752:4:0;35972:803;;;;;;:::o;33229:382::-;-1:-1:-1;;;;;33309:16:0;;33301:61;;;;-1:-1:-1;;;33301:61:0;;16520:2:1;33301:61:0;;;16502:21:1;;;16539:18;;;16532:30;16598:34;16578:18;;;16571:62;16650:18;;33301:61:0;16492:182:1;33301:61:0;33382:16;33390:7;33382;:16::i;:::-;33381:17;33373:58;;;;-1:-1:-1;;;33373:58:0;;11815:2:1;33373:58:0;;;11797:21:1;11854:2;11834:18;;;11827:30;11893;11873:18;;;11866:58;11941:18;;33373:58:0;11787:178:1;33373:58:0;33444:45;33473:1;33477:2;33481:7;33444:20;:45::i;:::-;-1:-1:-1;;;;;33502:13:0;;;;;;:9;:13;;;;;:18;;33519:1;;33502:13;:18;;33519:1;;33502:18;:::i;:::-;;;;-1:-1:-1;;33531:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33531:21:0;-1:-1:-1;;;;;33531:21:0;;;;;;;;33570:33;;33531:16;;;33570:33;;33531:16;;33570:33;33229:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:2;;;239:1;236;229:12;198:2;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;88:262;;;;;:::o;355:160::-;420:20;;476:13;;469:21;459:32;;449:2;;505:1;502;495:12;449:2;401:114;;;:::o;520:221::-;563:5;616:3;609:4;601:6;597:17;593:27;583:2;;634:1;631;624:12;583:2;656:79;731:3;722:6;709:20;702:4;694:6;690:17;656:79;:::i;:::-;647:88;573:168;-1:-1:-1;;;573:168:1:o;746:247::-;805:6;858:2;846:9;837:7;833:23;829:32;826:2;;;874:1;871;864:12;826:2;913:9;900:23;932:31;957:5;932:31;:::i;998:251::-;1068:6;1121:2;1109:9;1100:7;1096:23;1092:32;1089:2;;;1137:1;1134;1127:12;1089:2;1169:9;1163:16;1188:31;1213:5;1188:31;:::i;1254:388::-;1322:6;1330;1383:2;1371:9;1362:7;1358:23;1354:32;1351:2;;;1399:1;1396;1389:12;1351:2;1438:9;1425:23;1457:31;1482:5;1457:31;:::i;:::-;1507:5;-1:-1:-1;1564:2:1;1549:18;;1536:32;1577:33;1536:32;1577:33;:::i;:::-;1629:7;1619:17;;;1341:301;;;;;:::o;1647:456::-;1724:6;1732;1740;1793:2;1781:9;1772:7;1768:23;1764:32;1761:2;;;1809:1;1806;1799:12;1761:2;1848:9;1835:23;1867:31;1892:5;1867:31;:::i;:::-;1917:5;-1:-1:-1;1974:2:1;1959:18;;1946:32;1987:33;1946:32;1987:33;:::i;:::-;1751:352;;2039:7;;-1:-1:-1;;;2093:2:1;2078:18;;;;2065:32;;1751:352::o;2108:936::-;2205:6;2213;2221;2229;2237;2290:3;2278:9;2269:7;2265:23;2261:33;2258:2;;;2307:1;2304;2297:12;2258:2;2346:9;2333:23;2365:31;2390:5;2365:31;:::i;:::-;2415:5;-1:-1:-1;2472:2:1;2457:18;;2444:32;2485:33;2444:32;2485:33;:::i;:::-;2537:7;-1:-1:-1;2591:2:1;2576:18;;2563:32;;-1:-1:-1;2646:2:1;2631:18;;2618:32;2669:18;2699:14;;;2696:2;;;2726:1;2723;2716:12;2696:2;2764:6;2753:9;2749:22;2739:32;;2809:7;2802:4;2798:2;2794:13;2790:27;2780:2;;2831:1;2828;2821:12;2780:2;2871;2858:16;2897:2;2889:6;2886:14;2883:2;;;2913:1;2910;2903:12;2883:2;2958:7;2953:2;2944:6;2940:2;2936:15;2932:24;2929:37;2926:2;;;2979:1;2976;2969:12;2926:2;2248:796;;;;-1:-1:-1;2248:796:1;;-1:-1:-1;3010:2:1;3002:11;;3032:6;2248:796;-1:-1:-1;;;2248:796:1:o;3049:794::-;3144:6;3152;3160;3168;3221:3;3209:9;3200:7;3196:23;3192:33;3189:2;;;3238:1;3235;3228:12;3189:2;3277:9;3264:23;3296:31;3321:5;3296:31;:::i;:::-;3346:5;-1:-1:-1;3403:2:1;3388:18;;3375:32;3416:33;3375:32;3416:33;:::i;:::-;3468:7;-1:-1:-1;3522:2:1;3507:18;;3494:32;;-1:-1:-1;3577:2:1;3562:18;;3549:32;3604:18;3593:30;;3590:2;;;3636:1;3633;3626:12;3590:2;3659:22;;3712:4;3704:13;;3700:27;-1:-1:-1;3690:2:1;;3741:1;3738;3731:12;3690:2;3764:73;3829:7;3824:2;3811:16;3806:2;3802;3798:11;3764:73;:::i;:::-;3754:83;;;3179:664;;;;;;;:::o;3848:315::-;3913:6;3921;3974:2;3962:9;3953:7;3949:23;3945:32;3942:2;;;3990:1;3987;3980:12;3942:2;4029:9;4016:23;4048:31;4073:5;4048:31;:::i;:::-;4098:5;-1:-1:-1;4122:35:1;4153:2;4138:18;;4122:35;:::i;:::-;4112:45;;3932:231;;;;;:::o;4168:315::-;4236:6;4244;4297:2;4285:9;4276:7;4272:23;4268:32;4265:2;;;4313:1;4310;4303:12;4265:2;4352:9;4339:23;4371:31;4396:5;4371:31;:::i;:::-;4421:5;4473:2;4458:18;;;;4445:32;;-1:-1:-1;;;4255:228:1:o;4488:245::-;4546:6;4599:2;4587:9;4578:7;4574:23;4570:32;4567:2;;;4615:1;4612;4605:12;4567:2;4654:9;4641:23;4673:30;4697:5;4673:30;:::i;4738:249::-;4807:6;4860:2;4848:9;4839:7;4835:23;4831:32;4828:2;;;4876:1;4873;4866:12;4828:2;4908:9;4902:16;4927:30;4951:5;4927:30;:::i;4992:635::-;5072:6;5125:2;5113:9;5104:7;5100:23;5096:32;5093:2;;;5141:1;5138;5131:12;5093:2;5174:9;5168:16;5207:18;5199:6;5196:30;5193:2;;;5239:1;5236;5229:12;5193:2;5262:22;;5315:4;5307:13;;5303:27;-1:-1:-1;5293:2:1;;5344:1;5341;5334:12;5293:2;5373;5367:9;5398:48;5414:31;5442:2;5414:31;:::i;5398:48::-;5469:2;5462:5;5455:17;5509:7;5504:2;5499;5495;5491:11;5487:20;5484:33;5481:2;;;5530:1;5527;5520:12;5481:2;5543:54;5594:2;5589;5582:5;5578:14;5573:2;5569;5565:11;5543:54;:::i;:::-;5616:5;5083:544;-1:-1:-1;;;;;5083:544:1:o;5632:180::-;5691:6;5744:2;5732:9;5723:7;5719:23;5715:32;5712:2;;;5760:1;5757;5750:12;5712:2;-1:-1:-1;5783:23:1;;5702:110;-1:-1:-1;5702:110:1:o;5817:184::-;5887:6;5940:2;5928:9;5919:7;5915:23;5911:32;5908:2;;;5956:1;5953;5946:12;5908:2;-1:-1:-1;5979:16:1;;5898:103;-1:-1:-1;5898:103:1:o;6006:315::-;6074:6;6082;6135:2;6123:9;6114:7;6110:23;6106:32;6103:2;;;6151:1;6148;6141:12;6103:2;6187:9;6174:23;6164:33;;6247:2;6236:9;6232:18;6219:32;6260:31;6285:5;6260:31;:::i;6326:390::-;6404:6;6412;6465:2;6453:9;6444:7;6440:23;6436:32;6433:2;;;6481:1;6478;6471:12;6433:2;6517:9;6504:23;6494:33;;6578:2;6567:9;6563:18;6550:32;6605:18;6597:6;6594:30;6591:2;;;6637:1;6634;6627:12;6591:2;6660:50;6702:7;6693:6;6682:9;6678:22;6660:50;:::i;:::-;6650:60;;;6423:293;;;;;:::o;6721:665::-;6832:6;6840;6848;6856;6864;6872;6925:3;6913:9;6904:7;6900:23;6896:33;6893:2;;;6942:1;6939;6932:12;6893:2;6978:9;6965:23;6955:33;;7035:2;7024:9;7020:18;7007:32;6997:42;;7086:2;7075:9;7071:18;7058:32;7048:42;;7137:2;7126:9;7122:18;7109:32;7099:42;;7160:36;7191:3;7180:9;7176:19;7160:36;:::i;:::-;7150:46;;7247:3;7236:9;7232:19;7219:33;7275:18;7267:6;7264:30;7261:2;;;7307:1;7304;7297:12;7261:2;7330:50;7372:7;7363:6;7352:9;7348:22;7330:50;:::i;:::-;7320:60;;;6883:503;;;;;;;;:::o;7391:257::-;7432:3;7470:5;7464:12;7497:6;7492:3;7485:19;7513:63;7569:6;7562:4;7557:3;7553:14;7546:4;7539:5;7535:16;7513:63;:::i;:::-;7630:2;7609:15;-1:-1:-1;;7605:29:1;7596:39;;;;7637:4;7592:50;;7440:208;-1:-1:-1;;7440:208:1:o;7861:383::-;-1:-1:-1;;;;;8127:15:1;;;8109:34;;8179:15;;;;8174:2;8159:18;;8152:43;8226:2;8211:18;;8204:34;;;;8059:2;8044:18;;8026:218::o;8629:488::-;-1:-1:-1;;;;;8898:15:1;;;8880:34;;8950:15;;8945:2;8930:18;;8923:43;8997:2;8982:18;;8975:34;;;9045:3;9040:2;9025:18;;9018:31;;;8823:4;;9066:45;;9091:19;;9083:6;9066:45;:::i;:::-;9058:53;8832:285;-1:-1:-1;;;;;;8832:285:1:o;9800:219::-;9949:2;9938:9;9931:21;9912:4;9969:44;10009:2;9998:9;9994:18;9986:6;9969:44;:::i;10787:414::-;10989:2;10971:21;;;11028:2;11008:18;;;11001:30;11067:34;11062:2;11047:18;;11040:62;-1:-1:-1;;;11133:2:1;11118:18;;11111:48;11191:3;11176:19;;10961:240::o;17500:356::-;17702:2;17684:21;;;17721:18;;;17714:30;17780:34;17775:2;17760:18;;17753:62;17847:2;17832:18;;17674:182::o;19498:413::-;19700:2;19682:21;;;19739:2;19719:18;;;19712:30;19778:34;19773:2;19758:18;;19751:62;-1:-1:-1;;;19844:2:1;19829:18;;19822:47;19901:3;19886:19;;19672:239::o;20329:351::-;20531:2;20513:21;;;20570:2;20550:18;;;20543:30;20609:29;20604:2;20589:18;;20582:57;20671:2;20656:18;;20503:177::o;21045:355::-;21247:2;21229:21;;;21286:2;21266:18;;;21259:30;21325:33;21320:2;21305:18;;21298:61;21391:2;21376:18;;21219:181::o;21840:275::-;21911:2;21905:9;21976:2;21957:13;;-1:-1:-1;;21953:27:1;21941:40;;22011:18;21996:34;;22032:22;;;21993:62;21990:2;;;22058:18;;:::i;:::-;22094:2;22087:22;21885:230;;-1:-1:-1;21885:230:1:o;22120:186::-;22168:4;22201:18;22193:6;22190:30;22187:2;;;22223:18;;:::i;:::-;-1:-1:-1;22289:2:1;22268:15;-1:-1:-1;;22264:29:1;22295:4;22260:40;;22177:129::o;22311:128::-;22351:3;22382:1;22378:6;22375:1;22372:13;22369:2;;;22388:18;;:::i;:::-;-1:-1:-1;22424:9:1;;22359:80::o;22444:217::-;22484:1;22510;22500:2;;22554:10;22549:3;22545:20;22542:1;22535:31;22589:4;22586:1;22579:15;22617:4;22614:1;22607:15;22500:2;-1:-1:-1;22646:9:1;;22490:171::o;22666:125::-;22706:4;22734:1;22731;22728:8;22725:2;;;22739:18;;:::i;:::-;-1:-1:-1;22776:9:1;;22715:76::o;22796:258::-;22868:1;22878:113;22892:6;22889:1;22886:13;22878:113;;;22968:11;;;22962:18;22949:11;;;22942:39;22914:2;22907:10;22878:113;;;23009:6;23006:1;23003:13;23000:2;;;-1:-1:-1;;23044:1:1;23026:16;;23019:27;22849:205::o;23059:380::-;23138:1;23134:12;;;;23181;;;23202:2;;23256:4;23248:6;23244:17;23234:27;;23202:2;23309;23301:6;23298:14;23278:18;23275:38;23272:2;;;23355:10;23350:3;23346:20;23343:1;23336:31;23390:4;23387:1;23380:15;23418:4;23415:1;23408:15;23272:2;;23114:325;;;:::o;23444:135::-;23483:3;-1:-1:-1;;23504:17:1;;23501:2;;;23524:18;;:::i;:::-;-1:-1:-1;23571:1:1;23560:13;;23491:88::o;23584:127::-;23645:10;23640:3;23636:20;23633:1;23626:31;23676:4;23673:1;23666:15;23700:4;23697:1;23690:15;23716:127;23777:10;23772:3;23768:20;23765:1;23758:31;23808:4;23805:1;23798:15;23832:4;23829:1;23822:15;23848:127;23909:10;23904:3;23900:20;23897:1;23890:31;23940:4;23937:1;23930:15;23964:4;23961:1;23954:15;23980:127;24041:10;24036:3;24032:20;24029:1;24022:31;24072:4;24069:1;24062:15;24096:4;24093:1;24086:15;24112:131;-1:-1:-1;;;;;24187:31:1;;24177:42;;24167:2;;24233:1;24230;24223:12;24248:131;-1:-1:-1;;;;;;24322:32:1;;24312:43;;24302:2;;24369:1;24366;24359:12

Swarm Source

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