ETH Price: $3,432.75 (+1.00%)

Token

Polka City 3D Asset (PC3D)
 

Overview

Max Total Supply

10,622 PC3D

Holders

1,549

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
vEmpire DDAO: Deployer
Balance
1 PC3D
0x5eFf77571184427f5A9E951597571B5259820b48
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Polka City is a new fully autonomous contract based NFT platform that allows you to invest in virtual Assets in the form of a virtual city.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-03
*/

/**
 *Submitted for verification at Etherscan.io on 2021-02-23
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


interface IERC165 {
    /**
     * @dev Returns true ifa 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);
}
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;
}
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);
}
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);
}
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);
}
abstract contract ERC165 is IERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(type(IERC165).interfaceId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}
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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits;
        temp = value;
        while (temp != 0) {
            buffer[--index] = bytes1(uint8(48 + uint256(temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }
}
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}
contract Ownable {

    address private owner;
    
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    modifier onlyOwner() {
        require(msg.sender == owner, "Caller is not owner");
        _;
    }

    constructor() {
        owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
    }


    function changeOwner(address newOwner) public onlyOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    function getOwner() external view returns (address) {
        return owner;
    }
}

contract ERC721 is ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable {
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;
    using Counters for Counters.Counter;

    // Map the selling contracts that can mint tokens
    mapping (address => bool) public minters;
    
    // Contract that calculates the stake profits
    address public profitsContract;
    
    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;
    
    struct Coin {
        address tokenAddress;
        string symbol;
        string name;
    }
    
    mapping (uint256 => Coin) public tradeCoins;
    
    struct assetType {
        uint64 maxAmount;
        uint64 mintedAmount;
        uint64 coinIndex;
        string copyright;
    }
    
    mapping (uint256 => assetType) public assetsByType;
    
    struct assetDetail {
        uint256 value;
        uint32 lastTrade;
        uint32 lastPayment;
        uint32 typeDetail;
        uint32 customDetails;
    }
    
    mapping (uint256 => assetDetail) assetsDetails;
    address public sellingContract;
    uint256 public polkaCitizens = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;
    
    Counters.Counter private _tokenIdTracker;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor () {
        _name ="Polka City 3D Asset";
        _symbol = "PC3D";
        _baseURI = "https://polkacity.app/3dnftassets/";
        
        // include ETH as coin
        
        tradeCoins[1].tokenAddress = address(0x0);
        tradeCoins[1].symbol = "ETH";
        tradeCoins[1].name = "Ethereum";
        
        // include POLC as coin
        
        tradeCoins[2].tokenAddress = 0x0daD676DA510e71e31464A765a8548b47f47bdad;
        tradeCoins[2].symbol = "POLC";
        tradeCoins[2].name = "Polka City Token";
        
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(type(IERC721).interfaceId);
        _registerInterface(type(IERC721Metadata).interfaceId);
        _registerInterface(type(IERC721Enumerable).interfaceId);
    }

    function initAssets(uint64 _assetType, uint64 _maxAmount, uint64 _coinIndex, string memory _copyright) private {
        assetsByType[_assetType].maxAmount = _maxAmount;
        assetsByType[_assetType].mintedAmount = 0;
        assetsByType[_assetType].coinIndex = _coinIndex;
        assetsByType[_assetType].copyright = _copyright;
    }
    
    /**
     * @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 _holderTokens[_owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @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 base = baseURI();
        return string(abi.encodePacked(base,( uint256(assetsDetails[tokenId].customDetails).toString())));
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[_owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return (tokenId);
    }
    
    function getTokenDetails(uint256 index) public view returns (uint32 aType, uint32 customDetails, uint32 lastTx, uint32 lastPayment, uint256 initialvalue, string memory coin) {
        uint256 coinIndex = uint256(assetsByType[(assetsDetails[index].typeDetail)].coinIndex);
        
        return ( 
        assetsDetails[index].typeDetail, 
        assetsDetails[index].customDetails, 
        assetsDetails[index].lastTrade, 
        assetsDetails[index].lastPayment,
        assetsDetails[index].value,
        tradeCoins[coinIndex].symbol
        );
    }
    

    /**
     * @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(msg.sender == _owner || ERC721.isApprovedForAll(_owner, msg.sender),
            "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 != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, 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(msg.sender, 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(msg.sender, 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 _tokenOwners.contains(tokenId);
    }

    /**
     * @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 || ERC721.isApprovedForAll(_owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(address(0), to, 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"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);
        assetsDetails[tokenId].lastTrade = uint32(block.timestamp);
        assetsDetails[tokenId].lastPayment = uint32(block.timestamp);
        checkCitizen(to, true);
        checkCitizen(from, false);

        emit Transfer(from, to, tokenId);
    }


    function setBaseURI(string memory baseURI_) public onlyOwner {
        _baseURI = baseURI_;
    }

    /**
     * @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(msg.sender, 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 {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

    /**
     * @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 { }
    
    function checkCitizen(address _citizen, bool _addAsset) private {
        uint256 citizenBalance = _holderTokens[_citizen].length();
        if (citizenBalance > 0) {
            if (_addAsset == true && citizenBalance == 1) {
                polkaCitizens++;
            }
        } else {
            polkaCitizens--;
        }
    }
    
    function mint(address to, uint32 _assetType, uint256 _value, uint32 _customDetails) public virtual returns (bool success) {
        require(minters[msg.sender] == true, "Not allowed");
        require(assetsByType[_assetType].maxAmount > assetsByType[_assetType].mintedAmount, "Max mintable amount reached for this asset" );
        uint256 curIndex = _tokenIdTracker.current();
        _mint(to, curIndex);
        assetsDetails[curIndex].typeDetail = _assetType;
        assetsDetails[curIndex].value = _value;
        assetsDetails[curIndex].lastTrade = uint32(block.timestamp);
        assetsDetails[curIndex].lastPayment = uint32(block.timestamp);
        assetsDetails[curIndex].customDetails = _customDetails;
        assetsByType[_assetType].mintedAmount += 1;
        _tokenIdTracker.increment();
        checkCitizen(to, true);
        return true;
    }
    
    function setMinter(address _minterAddress, bool _canMint) public onlyOwner {
        minters[_minterAddress] = _canMint;
    }
    
    function setProfitsContract(address _contract) public onlyOwner {
        profitsContract = _contract;
    }
    
    function setPaymentDate(uint256 _asset) public {
        require(msg.sender == profitsContract);
        assetsDetails[_asset].lastPayment = uint32(block.timestamp);
    }
    
    function addAssetType(uint64 _assetType, uint64 _maxAmount, uint64 _coinIndex, string memory _copyright) public onlyOwner {
        require(_maxAmount > 0);
        initAssets( _assetType, _maxAmount, _coinIndex, _copyright);
    }
    
    function modifyAssetType(uint64 _typeId, uint64 _maxAmount, uint64 _coinIndex, string memory _copyright) public onlyOwner {
        assetsByType[_typeId].copyright = _copyright;
        assetsByType[_typeId].maxAmount = _maxAmount;
        assetsByType[_typeId].coinIndex = _coinIndex;
    }
    
    function fixAsset(uint256 _assetId, uint32 _customDetails) public {
        require(minters[msg.sender] == true, "Not allowed");
        assetsDetails[_assetId].customDetails = _customDetails;
    }
    
    function addCoin(uint256 _coinIndex, address _tokenAddress, string memory _tokenSymbol, string memory _tokenName) public onlyOwner {
        tradeCoins[_coinIndex].tokenAddress = _tokenAddress;
        tradeCoins[_coinIndex].symbol = _tokenSymbol;
        tradeCoins[_coinIndex].name = _tokenName;
    }

    
}

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":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","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":"uint64","name":"_assetType","type":"uint64"},{"internalType":"uint64","name":"_maxAmount","type":"uint64"},{"internalType":"uint64","name":"_coinIndex","type":"uint64"},{"internalType":"string","name":"_copyright","type":"string"}],"name":"addAssetType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_coinIndex","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_tokenName","type":"string"}],"name":"addCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetsByType","outputs":[{"internalType":"uint64","name":"maxAmount","type":"uint64"},{"internalType":"uint64","name":"mintedAmount","type":"uint64"},{"internalType":"uint64","name":"coinIndex","type":"uint64"},{"internalType":"string","name":"copyright","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assetId","type":"uint256"},{"internalType":"uint32","name":"_customDetails","type":"uint32"}],"name":"fixAsset","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":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getTokenDetails","outputs":[{"internalType":"uint32","name":"aType","type":"uint32"},{"internalType":"uint32","name":"customDetails","type":"uint32"},{"internalType":"uint32","name":"lastTx","type":"uint32"},{"internalType":"uint32","name":"lastPayment","type":"uint32"},{"internalType":"uint256","name":"initialvalue","type":"uint256"},{"internalType":"string","name":"coin","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint32","name":"_assetType","type":"uint32"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint32","name":"_customDetails","type":"uint32"}],"name":"mint","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_typeId","type":"uint64"},{"internalType":"uint64","name":"_maxAmount","type":"uint64"},{"internalType":"uint64","name":"_coinIndex","type":"uint64"},{"internalType":"string","name":"_copyright","type":"string"}],"name":"modifyAssetType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"polkaCitizens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minterAddress","type":"address"},{"internalType":"bool","name":"_canMint","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_asset","type":"uint256"}],"name":"setPaymentDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setProfitsContract","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":"uint256","name":"","type":"uint256"}],"name":"tradeCoins","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"}],"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"}]

60806040526000600d553480156200001657600080fd5b50620000296301ffc9a760e01b62000336565b600180546001600160a01b0319163317908190556040516001600160a01b0391909116906000907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a36040805180820190915260138082527f506f6c6b612043697479203344204173736574000000000000000000000000006020909201918252620000bb91600e9162000391565b50604080518082019091526004808252631410ccd160e21b6020909201918252620000e991600f9162000391565b5060405180606001604052806022815260200162002ddb6022913980516200011a9160109160209091019062000391565b507f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3680546001600160a01b031916905560408051808201909152600381526208aa8960eb1b602082810191825260016000526009905290516200019f917f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a379162000391565b50604080518082019091526008815267457468657265756d60c01b60208083019182526001600052600990529051620001fa917f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a389162000391565b507f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c380546001600160a01b031916730dad676da510e71e31464a765a8548b47f47bdad179055604080518082019091526004815263504f4c4360e01b6020828101918252600260005260099052905162000296917f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c49162000391565b5060408051808201909152601081526f2837b635b09021b4ba3c902a37b5b2b760811b60208083019182526002600052600990529051620002f9917f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c59162000391565b506200030c6380ac58cd60e01b62000336565b6200031e635b5e139f60e01b62000336565b6200033063780e9d6360e01b62000336565b620004ab565b6001600160e01b031980821614156200036c5760405162461bcd60e51b8152600401620003639062000437565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b8280546200039f906200046e565b90600052602060002090601f016020900481019282620003c357600085556200040e565b82601f10620003de57805160ff19168380011785556200040e565b828001600101855582156200040e579182015b828111156200040e578251825591602001919060010190620003f1565b506200041c92915062000420565b5090565b5b808211156200041c576000815560010162000421565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6002810460018216806200048357607f821691505b60208210811415620004a557634e487b7160e01b600052602260045260246000fd5b50919050565b61292080620004bb6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80636352211e11610125578063bcd4ddf7116100ad578063c87b56dd1161007c578063c87b56dd14610473578063cea93fc314610486578063cf456ae71461048e578063e985e9c5146104a1578063f46eccc4146104b457610211565b8063bcd4ddf714610420578063bf56ee2614610433578063c1d022cf1461043b578063c1e037281461044e57610211565b806395d89b41116100f457806395d89b41146103cc578063a1cfb5ed146103d4578063a22cb465146103e7578063a6f9dae1146103fa578063b88d4fde1461040d57610211565b80636352211e146103965780636c0360eb146103a957806370a08231146103b1578063893d20e8146103c457610211565b806327c8ee26116101a857806342842e0e1161017757806342842e0e146103375780634db1be941461034a5780634efbce0a1461035d5780634f6ccce71461037057806355f804b31461038357610211565b806327c8ee26146102dc57806327ed628b146102ef5780632f745c591461030257806336ffbc771461031557610211565b80630c4192cf116101e45780630c4192cf146102895780631703b06c1461029e57806318160ddd146102c157806323b872dd146102c957610211565b806301ffc9a71461021657806306fdde031461023f578063081812fc14610254578063095ea7b314610274575b600080fd5b610229610224366004611f98565b6104c7565b60405161023691906121ec565b60405180910390f35b6102476104ea565b60405161023691906121f7565b610267610262366004612002565b61057c565b6040516102369190612165565b610287610282366004611f23565b6105c8565b005b61029161064e565b60405161023691906126cc565b6102b16102ac366004612002565b610654565b6040516102369493929190612720565b610291610719565b6102876102d7366004611e36565b61072a565b6102876102ea366004612088565b61075b565b6102296102fd366004611f4c565b6107c5565b610291610310366004611f23565b6109cc565b610328610323366004612002565b6109f7565b604051610236939291906121b6565b610287610345366004611e36565b610b34565b61028761035836600461201a565b610b4f565b61028761036b3660046120aa565b610be4565b61029161037e366004612002565b610c36565b610287610391366004611fd0565b610c4c565b6102676103a4366004612002565b610c8d565b610247610cb5565b6102916103bf366004611dea565b610cc4565b610267610d0d565b610247610d1c565b6102876103e2366004612002565b610d2b565b6102876103f5366004611ee9565b610d73565b610287610408366004611dea565b610e0b565b61028761041b366004611e71565b610e91565b61028761042e3660046120aa565b610ec3565b610267610f6b565b610287610449366004611dea565b610f7a565b61046161045c366004612002565b610fc6565b604051610236969594939291906126d5565b610247610481366004612002565b6110e7565b61026761116d565b61028761049c366004611ee9565b61117c565b6102296104af366004611e04565b6111d1565b6102296104c2366004611dea565b6111ff565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6060600e80546104f9906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610525906127fc565b80156105725780601f1061054757610100808354040283529160200191610572565b820191906000526020600020905b81548152906001019060200180831161055557829003601f168201915b5050505050905090565b600061058782611214565b6105ac5760405162461bcd60e51b81526004016105a390612531565b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105d382610c8d565b9050806001600160a01b0316836001600160a01b031614156106075760405162461bcd60e51b81526004016105a39061263a565b336001600160a01b0382161480610623575061062381336111d1565b61063f5760405162461bcd60e51b81526004016105a390612413565b6106498383611221565b505050565b600d5481565b600a60205260009081526040902080546001820180546001600160401b0380841694600160401b8504821694600160801b9004909116929091610696906127fc565b80601f01602080910402602001604051908101604052809291908181526020018280546106c2906127fc565b801561070f5780601f106106e45761010080835404028352916020019161070f565b820191906000526020600020905b8154815290600101906020018083116106f257829003601f168201915b5050505050905084565b6000610725600561128f565b905090565b610734338261129a565b6107505760405162461bcd60e51b81526004016105a39061267b565b610649838383611317565b3360009081526002602052604090205460ff16151560011461078f5760405162461bcd60e51b81526004016105a39061257d565b6000918252600b6020526040909120600101805463ffffffff909216600160601b0263ffffffff60601b19909216919091179055565b3360009081526002602052604081205460ff1615156001146107f95760405162461bcd60e51b81526004016105a39061257d565b63ffffffff84166000908152600a60205260409020546001600160401b03600160401b8204811691161161083f5760405162461bcd60e51b81526004016105a39061224c565b600061084b6011611479565b9050610857868261147d565b84600b600083815260200190815260200160002060010160086101000a81548163ffffffff021916908363ffffffff16021790555083600b60008381526020019081526020016000206000018190555042600b600083815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555042600b600083815260200190815260200160002060010160046101000a81548163ffffffff021916908363ffffffff16021790555082600b6000838152602001908152602001600020600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506001600a60008763ffffffff16815260200190815260200160002060000160088282829054906101000a90046001600160401b0316610985919061276c565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109b36011611541565b6109be86600161154a565b60019150505b949350505050565b6001600160a01b03821660009081526004602052604081206109ee90836115bf565b90505b92915050565b600960205260009081526040902080546001820180546001600160a01b039092169291610a23906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4f906127fc565b8015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b820191906000526020600020905b815481529060010190602001808311610a7f57829003601f168201915b505050505090806002018054610ab1906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610add906127fc565b8015610b2a5780601f10610aff57610100808354040283529160200191610b2a565b820191906000526020600020905b815481529060010190602001808311610b0d57829003601f168201915b5050505050905083565b61064983838360405180602001604052806000815250610e91565b6001546001600160a01b03163314610b795760405162461bcd60e51b81526004016105a39061231f565b600084815260096020908152604090912080546001600160a01b0319166001600160a01b0386161781558351610bb792600190920191850190611c81565b5060008481526009602090815260409091208251610bdd92600290920191840190611c81565b5050505050565b6001546001600160a01b03163314610c0e5760405162461bcd60e51b81526004016105a39061231f565b6000836001600160401b031611610c2457600080fd5b610c30848484846115cb565b50505050565b600080610c44600584611637565b509392505050565b6001546001600160a01b03163314610c765760405162461bcd60e51b81526004016105a39061231f565b8051610c89906010906020840190611c81565b5050565b60006109f1826040518060600160405280602981526020016128c26029913960059190611653565b6060601080546104f9906127fc565b60006001600160a01b038216610cec5760405162461bcd60e51b81526004016105a390612470565b6001600160a01b03821660009081526004602052604090206109f19061128f565b6001546001600160a01b031690565b6060600f80546104f9906127fc565b6003546001600160a01b03163314610d4257600080fd5b6000908152600b60205260409020600101805467ffffffff0000000019166401000000004263ffffffff1602179055565b6001600160a01b038216331415610d9c5760405162461bcd60e51b81526004016105a390612390565b3360008181526008602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610dff9085906121ec565b60405180910390a35050565b6001546001600160a01b03163314610e355760405162461bcd60e51b81526004016105a39061231f565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b610e9b338361129a565b610eb75760405162461bcd60e51b81526004016105a39061267b565b610c308484848461166a565b6001546001600160a01b03163314610eed5760405162461bcd60e51b81526004016105a39061231f565b6001600160401b0384166000908152600a602090815260409091208251610f1c92600190920191840190611c81565b50506001600160401b039283166000908152600a60205260409020805467ffffffffffffffff19169284169290921767ffffffffffffffff60801b1916600160801b9190931602919091179055565b600c546001600160a01b031681565b6001546001600160a01b03163314610fa45760405162461bcd60e51b81526004016105a39061231f565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b60209081526040808320600180820154600160401b810463ffffffff908116808852600a8752858820549454600160801b9095046001600160401b031680895260099097529487209092018054879687968796879660609693959294600160601b8504821694828116946401000000009091049092169291908190611051906127fc565b80601f016020809104026020016040519081016040528092919081815260200182805461107d906127fc565b80156110ca5780601f1061109f576101008083540402835291602001916110ca565b820191906000526020600020905b8154815290600101906020018083116110ad57829003601f168201915b505050505090509650965096509650965096505091939550919395565b60606110f282611214565b61110e5760405162461bcd60e51b81526004016105a3906125eb565b6000611118610cb5565b6000848152600b6020526040902060010154909150819061114590600160601b900463ffffffff1661169d565b604051602001611156929190612136565b604051602081830303815290604052915050919050565b6003546001600160a01b031681565b6001546001600160a01b031633146111a65760405162461bcd60e51b81526004016105a39061231f565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b60026020526000908152604090205460ff1681565b60006109f16005836117c2565b600081815260076020526040902080546001600160a01b0319166001600160a01b038416908117909155819061125682610c8d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006109f182611479565b60006112a582611214565b6112c15760405162461bcd60e51b81526004016105a3906123c7565b60006112cc83610c8d565b9050806001600160a01b0316846001600160a01b031614806113075750836001600160a01b03166112fc8461057c565b6001600160a01b0316145b806109c457506109c481856111d1565b826001600160a01b031661132a82610c8d565b6001600160a01b0316146113505760405162461bcd60e51b81526004016105a3906125a2565b6001600160a01b0382166113765760405162461bcd60e51b81526004016105a39061234c565b611381838383610649565b61138c600082611221565b6001600160a01b03831660009081526004602052604090206113ae90826117ce565b506001600160a01b03821660009081526004602052604090206113d190826117da565b506113de600582846117e6565b506000818152600b602052604090206001908101805463ffffffff19164263ffffffff1690811767ffffffff0000000019166401000000009190910217905561142890839061154a565b61143383600061154a565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b5490565b6001600160a01b0382166114a35760405162461bcd60e51b81526004016105a3906124fc565b6114ac81611214565b156114c95760405162461bcd60e51b81526004016105a3906122e8565b6114d560008383610649565b6001600160a01b03821660009081526004602052604090206114f790826117da565b50611504600582846117e6565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80546001019055565b6001600160a01b038216600090815260046020526040812061156b9061128f565b905080156115a55760018215151480156115855750806001145b156115a057600d805490600061159a83612837565b91905055505b610649565b600d80549060006115b5836127e5565b9190505550505050565b60006109ee83836117fc565b6001600160401b038481166000908152600a60209081526040909120805467ffffffffffffffff19168684161777ffffffffffffffffffffffffffffffff00000000000000001916600160801b938616939093029290921782558251610bdd9260010191840190611c81565b60008080806116468686611855565b9097909650945050505050565b60006116608484846118c5565b90505b9392505050565b611675848484611317565b6116818484848461193c565b610c305760405162461bcd60e51b81526004016105a390612296565b6060816116c257506040805180820190915260018152600360fc1b60208201526104e5565b8160005b81156116ec57806116d681612837565b91506116e59050600a8361278e565b91506116c6565b6000816001600160401b0381111561171457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561173e576020820181803683370190505b508593509050815b83156117b957611757600a85612852565b611762906030612754565b60f81b8261176f836127e5565b9250828151811061179057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506117b2600a8561278e565b9350611746565b50949350505050565b60006109ee8383611a4d565b60006109ee8383611a65565b60006109ee8383611b82565b600061166084846001600160a01b038516611bcc565b8154600090821061181f5760405162461bcd60e51b81526004016105a39061220a565b82600001828154811061184257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b81546000908190831061187a5760405162461bcd60e51b81526004016105a3906124ba565b600084600001848154811061189f57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816118f55760405162461bcd60e51b81526004016105a391906121f7565b50846119026001836127a2565b8154811061192057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b6000611950846001600160a01b0316611c7b565b15611a4557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611987903390899088908890600401612179565b602060405180830381600087803b1580156119a157600080fd5b505af19250505080156119d1575060408051601f3d908101601f191682019092526119ce91810190611fb4565b60015b611a2b573d8080156119ff576040519150601f19603f3d011682016040523d82523d6000602084013e611a04565b606091505b508051611a235760405162461bcd60e51b81526004016105a390612296565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506109c4565b5060016109c4565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611b78576000611a896001836127a2565b8554909150600090611a9d906001906127a2565b90506000866000018281548110611ac457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611af557634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611b0c836001612754565b60008281526001890160205260409020558654879080611b3c57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109f1565b60009150506109f1565b6000611b8e8383611a4d565b611bc4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109f1565b5060006109f1565b600082815260018401602052604081205480611c31575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611663565b8285611c3e6001846127a2565b81548110611c5c57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101819055506000915050611663565b3b151590565b828054611c8d906127fc565b90600052602060002090601f016020900481019282611caf5760008555611cf5565b82601f10611cc857805160ff1916838001178555611cf5565b82800160010185558215611cf5579182015b82811115611cf5578251825591602001919060010190611cda565b50611d01929150611d05565b5090565b5b80821115611d015760008155600101611d06565b60006001600160401b0380841115611d3457611d34612892565b604051601f8501601f191681016020018281118282101715611d5857611d58612892565b604052848152915081838501861015611d7057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146104e557600080fd5b600082601f830112611db0578081fd5b6109ee83833560208501611d1a565b803563ffffffff811681146104e557600080fd5b80356001600160401b03811681146104e557600080fd5b600060208284031215611dfb578081fd5b6109ee82611d89565b60008060408385031215611e16578081fd5b611e1f83611d89565b9150611e2d60208401611d89565b90509250929050565b600080600060608486031215611e4a578081fd5b611e5384611d89565b9250611e6160208501611d89565b9150604084013590509250925092565b60008060008060808587031215611e86578081fd5b611e8f85611d89565b9350611e9d60208601611d89565b92506040850135915060608501356001600160401b03811115611ebe578182fd5b8501601f81018713611ece578182fd5b611edd87823560208401611d1a565b91505092959194509250565b60008060408385031215611efb578182fd5b611f0483611d89565b915060208301358015158114611f18578182fd5b809150509250929050565b60008060408385031215611f35578182fd5b611f3e83611d89565b946020939093013593505050565b60008060008060808587031215611f61578384fd5b611f6a85611d89565b9350611f7860208601611dbf565b925060408501359150611f8d60608601611dbf565b905092959194509250565b600060208284031215611fa9578081fd5b8135611663816128a8565b600060208284031215611fc5578081fd5b8151611663816128a8565b600060208284031215611fe1578081fd5b81356001600160401b03811115611ff6578182fd5b6109c484828501611da0565b600060208284031215612013578081fd5b5035919050565b6000806000806080858703121561202f578384fd5b8435935061203f60208601611d89565b925060408501356001600160401b038082111561205a578384fd5b61206688838901611da0565b9350606087013591508082111561207b578283fd5b50611edd87828801611da0565b6000806040838503121561209a578182fd5b82359150611e2d60208401611dbf565b600080600080608085870312156120bf578182fd5b6120c885611dd3565b93506120d660208601611dd3565b92506120e460408601611dd3565b915060608501356001600160401b038111156120fe578182fd5b611edd87828801611da0565b600081518084526121228160208601602086016127b9565b601f01601f19169290920160200192915050565b600083516121488184602088016127b9565b83519083019061215c8183602088016127b9565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ac9083018461210a565b9695505050505050565b6001600160a01b03841681526060602082018190526000906121da9083018561210a565b82810360408401526121ac818561210a565b901515815260200190565b6000602082526109ee602083018461210a565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602a908201527f4d6178206d696e7461626c6520616d6f756e74207265616368656420666f72206040820152691d1a1a5cc8185cdcd95d60b21b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b90815260200190565b600063ffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261271460c083018461210a565b98975050505050505050565b60006001600160401b0380871683528086166020840152808516604084015250608060608301526121ac608083018461210a565b6000821982111561276757612767612866565b500190565b60006001600160401b0380831681851680830382111561215c5761215c612866565b60008261279d5761279d61287c565b500490565b6000828210156127b4576127b4612866565b500390565b60005b838110156127d45781810151838201526020016127bc565b83811115610c305750506000910152565b6000816127f4576127f4612866565b506000190190565b60028104600182168061281057607f821691505b6020821081141561283157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561284b5761284b612866565b5060010190565b6000826128615761286161287c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146128be57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220611ec779b13f76a38657886d85eb8e111ac6bb2acbe217cfc8c7bedc1c0740d764736f6c6343000800003368747470733a2f2f706f6c6b61636974792e6170702f33646e66746173736574732f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c80636352211e11610125578063bcd4ddf7116100ad578063c87b56dd1161007c578063c87b56dd14610473578063cea93fc314610486578063cf456ae71461048e578063e985e9c5146104a1578063f46eccc4146104b457610211565b8063bcd4ddf714610420578063bf56ee2614610433578063c1d022cf1461043b578063c1e037281461044e57610211565b806395d89b41116100f457806395d89b41146103cc578063a1cfb5ed146103d4578063a22cb465146103e7578063a6f9dae1146103fa578063b88d4fde1461040d57610211565b80636352211e146103965780636c0360eb146103a957806370a08231146103b1578063893d20e8146103c457610211565b806327c8ee26116101a857806342842e0e1161017757806342842e0e146103375780634db1be941461034a5780634efbce0a1461035d5780634f6ccce71461037057806355f804b31461038357610211565b806327c8ee26146102dc57806327ed628b146102ef5780632f745c591461030257806336ffbc771461031557610211565b80630c4192cf116101e45780630c4192cf146102895780631703b06c1461029e57806318160ddd146102c157806323b872dd146102c957610211565b806301ffc9a71461021657806306fdde031461023f578063081812fc14610254578063095ea7b314610274575b600080fd5b610229610224366004611f98565b6104c7565b60405161023691906121ec565b60405180910390f35b6102476104ea565b60405161023691906121f7565b610267610262366004612002565b61057c565b6040516102369190612165565b610287610282366004611f23565b6105c8565b005b61029161064e565b60405161023691906126cc565b6102b16102ac366004612002565b610654565b6040516102369493929190612720565b610291610719565b6102876102d7366004611e36565b61072a565b6102876102ea366004612088565b61075b565b6102296102fd366004611f4c565b6107c5565b610291610310366004611f23565b6109cc565b610328610323366004612002565b6109f7565b604051610236939291906121b6565b610287610345366004611e36565b610b34565b61028761035836600461201a565b610b4f565b61028761036b3660046120aa565b610be4565b61029161037e366004612002565b610c36565b610287610391366004611fd0565b610c4c565b6102676103a4366004612002565b610c8d565b610247610cb5565b6102916103bf366004611dea565b610cc4565b610267610d0d565b610247610d1c565b6102876103e2366004612002565b610d2b565b6102876103f5366004611ee9565b610d73565b610287610408366004611dea565b610e0b565b61028761041b366004611e71565b610e91565b61028761042e3660046120aa565b610ec3565b610267610f6b565b610287610449366004611dea565b610f7a565b61046161045c366004612002565b610fc6565b604051610236969594939291906126d5565b610247610481366004612002565b6110e7565b61026761116d565b61028761049c366004611ee9565b61117c565b6102296104af366004611e04565b6111d1565b6102296104c2366004611dea565b6111ff565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6060600e80546104f9906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610525906127fc565b80156105725780601f1061054757610100808354040283529160200191610572565b820191906000526020600020905b81548152906001019060200180831161055557829003601f168201915b5050505050905090565b600061058782611214565b6105ac5760405162461bcd60e51b81526004016105a390612531565b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105d382610c8d565b9050806001600160a01b0316836001600160a01b031614156106075760405162461bcd60e51b81526004016105a39061263a565b336001600160a01b0382161480610623575061062381336111d1565b61063f5760405162461bcd60e51b81526004016105a390612413565b6106498383611221565b505050565b600d5481565b600a60205260009081526040902080546001820180546001600160401b0380841694600160401b8504821694600160801b9004909116929091610696906127fc565b80601f01602080910402602001604051908101604052809291908181526020018280546106c2906127fc565b801561070f5780601f106106e45761010080835404028352916020019161070f565b820191906000526020600020905b8154815290600101906020018083116106f257829003601f168201915b5050505050905084565b6000610725600561128f565b905090565b610734338261129a565b6107505760405162461bcd60e51b81526004016105a39061267b565b610649838383611317565b3360009081526002602052604090205460ff16151560011461078f5760405162461bcd60e51b81526004016105a39061257d565b6000918252600b6020526040909120600101805463ffffffff909216600160601b0263ffffffff60601b19909216919091179055565b3360009081526002602052604081205460ff1615156001146107f95760405162461bcd60e51b81526004016105a39061257d565b63ffffffff84166000908152600a60205260409020546001600160401b03600160401b8204811691161161083f5760405162461bcd60e51b81526004016105a39061224c565b600061084b6011611479565b9050610857868261147d565b84600b600083815260200190815260200160002060010160086101000a81548163ffffffff021916908363ffffffff16021790555083600b60008381526020019081526020016000206000018190555042600b600083815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555042600b600083815260200190815260200160002060010160046101000a81548163ffffffff021916908363ffffffff16021790555082600b6000838152602001908152602001600020600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506001600a60008763ffffffff16815260200190815260200160002060000160088282829054906101000a90046001600160401b0316610985919061276c565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109b36011611541565b6109be86600161154a565b60019150505b949350505050565b6001600160a01b03821660009081526004602052604081206109ee90836115bf565b90505b92915050565b600960205260009081526040902080546001820180546001600160a01b039092169291610a23906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4f906127fc565b8015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b820191906000526020600020905b815481529060010190602001808311610a7f57829003601f168201915b505050505090806002018054610ab1906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610add906127fc565b8015610b2a5780601f10610aff57610100808354040283529160200191610b2a565b820191906000526020600020905b815481529060010190602001808311610b0d57829003601f168201915b5050505050905083565b61064983838360405180602001604052806000815250610e91565b6001546001600160a01b03163314610b795760405162461bcd60e51b81526004016105a39061231f565b600084815260096020908152604090912080546001600160a01b0319166001600160a01b0386161781558351610bb792600190920191850190611c81565b5060008481526009602090815260409091208251610bdd92600290920191840190611c81565b5050505050565b6001546001600160a01b03163314610c0e5760405162461bcd60e51b81526004016105a39061231f565b6000836001600160401b031611610c2457600080fd5b610c30848484846115cb565b50505050565b600080610c44600584611637565b509392505050565b6001546001600160a01b03163314610c765760405162461bcd60e51b81526004016105a39061231f565b8051610c89906010906020840190611c81565b5050565b60006109f1826040518060600160405280602981526020016128c26029913960059190611653565b6060601080546104f9906127fc565b60006001600160a01b038216610cec5760405162461bcd60e51b81526004016105a390612470565b6001600160a01b03821660009081526004602052604090206109f19061128f565b6001546001600160a01b031690565b6060600f80546104f9906127fc565b6003546001600160a01b03163314610d4257600080fd5b6000908152600b60205260409020600101805467ffffffff0000000019166401000000004263ffffffff1602179055565b6001600160a01b038216331415610d9c5760405162461bcd60e51b81526004016105a390612390565b3360008181526008602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610dff9085906121ec565b60405180910390a35050565b6001546001600160a01b03163314610e355760405162461bcd60e51b81526004016105a39061231f565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b610e9b338361129a565b610eb75760405162461bcd60e51b81526004016105a39061267b565b610c308484848461166a565b6001546001600160a01b03163314610eed5760405162461bcd60e51b81526004016105a39061231f565b6001600160401b0384166000908152600a602090815260409091208251610f1c92600190920191840190611c81565b50506001600160401b039283166000908152600a60205260409020805467ffffffffffffffff19169284169290921767ffffffffffffffff60801b1916600160801b9190931602919091179055565b600c546001600160a01b031681565b6001546001600160a01b03163314610fa45760405162461bcd60e51b81526004016105a39061231f565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b60209081526040808320600180820154600160401b810463ffffffff908116808852600a8752858820549454600160801b9095046001600160401b031680895260099097529487209092018054879687968796879660609693959294600160601b8504821694828116946401000000009091049092169291908190611051906127fc565b80601f016020809104026020016040519081016040528092919081815260200182805461107d906127fc565b80156110ca5780601f1061109f576101008083540402835291602001916110ca565b820191906000526020600020905b8154815290600101906020018083116110ad57829003601f168201915b505050505090509650965096509650965096505091939550919395565b60606110f282611214565b61110e5760405162461bcd60e51b81526004016105a3906125eb565b6000611118610cb5565b6000848152600b6020526040902060010154909150819061114590600160601b900463ffffffff1661169d565b604051602001611156929190612136565b604051602081830303815290604052915050919050565b6003546001600160a01b031681565b6001546001600160a01b031633146111a65760405162461bcd60e51b81526004016105a39061231f565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b60026020526000908152604090205460ff1681565b60006109f16005836117c2565b600081815260076020526040902080546001600160a01b0319166001600160a01b038416908117909155819061125682610c8d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006109f182611479565b60006112a582611214565b6112c15760405162461bcd60e51b81526004016105a3906123c7565b60006112cc83610c8d565b9050806001600160a01b0316846001600160a01b031614806113075750836001600160a01b03166112fc8461057c565b6001600160a01b0316145b806109c457506109c481856111d1565b826001600160a01b031661132a82610c8d565b6001600160a01b0316146113505760405162461bcd60e51b81526004016105a3906125a2565b6001600160a01b0382166113765760405162461bcd60e51b81526004016105a39061234c565b611381838383610649565b61138c600082611221565b6001600160a01b03831660009081526004602052604090206113ae90826117ce565b506001600160a01b03821660009081526004602052604090206113d190826117da565b506113de600582846117e6565b506000818152600b602052604090206001908101805463ffffffff19164263ffffffff1690811767ffffffff0000000019166401000000009190910217905561142890839061154a565b61143383600061154a565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b5490565b6001600160a01b0382166114a35760405162461bcd60e51b81526004016105a3906124fc565b6114ac81611214565b156114c95760405162461bcd60e51b81526004016105a3906122e8565b6114d560008383610649565b6001600160a01b03821660009081526004602052604090206114f790826117da565b50611504600582846117e6565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80546001019055565b6001600160a01b038216600090815260046020526040812061156b9061128f565b905080156115a55760018215151480156115855750806001145b156115a057600d805490600061159a83612837565b91905055505b610649565b600d80549060006115b5836127e5565b9190505550505050565b60006109ee83836117fc565b6001600160401b038481166000908152600a60209081526040909120805467ffffffffffffffff19168684161777ffffffffffffffffffffffffffffffff00000000000000001916600160801b938616939093029290921782558251610bdd9260010191840190611c81565b60008080806116468686611855565b9097909650945050505050565b60006116608484846118c5565b90505b9392505050565b611675848484611317565b6116818484848461193c565b610c305760405162461bcd60e51b81526004016105a390612296565b6060816116c257506040805180820190915260018152600360fc1b60208201526104e5565b8160005b81156116ec57806116d681612837565b91506116e59050600a8361278e565b91506116c6565b6000816001600160401b0381111561171457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561173e576020820181803683370190505b508593509050815b83156117b957611757600a85612852565b611762906030612754565b60f81b8261176f836127e5565b9250828151811061179057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506117b2600a8561278e565b9350611746565b50949350505050565b60006109ee8383611a4d565b60006109ee8383611a65565b60006109ee8383611b82565b600061166084846001600160a01b038516611bcc565b8154600090821061181f5760405162461bcd60e51b81526004016105a39061220a565b82600001828154811061184257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b81546000908190831061187a5760405162461bcd60e51b81526004016105a3906124ba565b600084600001848154811061189f57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816118f55760405162461bcd60e51b81526004016105a391906121f7565b50846119026001836127a2565b8154811061192057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b6000611950846001600160a01b0316611c7b565b15611a4557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611987903390899088908890600401612179565b602060405180830381600087803b1580156119a157600080fd5b505af19250505080156119d1575060408051601f3d908101601f191682019092526119ce91810190611fb4565b60015b611a2b573d8080156119ff576040519150601f19603f3d011682016040523d82523d6000602084013e611a04565b606091505b508051611a235760405162461bcd60e51b81526004016105a390612296565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506109c4565b5060016109c4565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611b78576000611a896001836127a2565b8554909150600090611a9d906001906127a2565b90506000866000018281548110611ac457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611af557634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611b0c836001612754565b60008281526001890160205260409020558654879080611b3c57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109f1565b60009150506109f1565b6000611b8e8383611a4d565b611bc4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109f1565b5060006109f1565b600082815260018401602052604081205480611c31575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611663565b8285611c3e6001846127a2565b81548110611c5c57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101819055506000915050611663565b3b151590565b828054611c8d906127fc565b90600052602060002090601f016020900481019282611caf5760008555611cf5565b82601f10611cc857805160ff1916838001178555611cf5565b82800160010185558215611cf5579182015b82811115611cf5578251825591602001919060010190611cda565b50611d01929150611d05565b5090565b5b80821115611d015760008155600101611d06565b60006001600160401b0380841115611d3457611d34612892565b604051601f8501601f191681016020018281118282101715611d5857611d58612892565b604052848152915081838501861015611d7057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146104e557600080fd5b600082601f830112611db0578081fd5b6109ee83833560208501611d1a565b803563ffffffff811681146104e557600080fd5b80356001600160401b03811681146104e557600080fd5b600060208284031215611dfb578081fd5b6109ee82611d89565b60008060408385031215611e16578081fd5b611e1f83611d89565b9150611e2d60208401611d89565b90509250929050565b600080600060608486031215611e4a578081fd5b611e5384611d89565b9250611e6160208501611d89565b9150604084013590509250925092565b60008060008060808587031215611e86578081fd5b611e8f85611d89565b9350611e9d60208601611d89565b92506040850135915060608501356001600160401b03811115611ebe578182fd5b8501601f81018713611ece578182fd5b611edd87823560208401611d1a565b91505092959194509250565b60008060408385031215611efb578182fd5b611f0483611d89565b915060208301358015158114611f18578182fd5b809150509250929050565b60008060408385031215611f35578182fd5b611f3e83611d89565b946020939093013593505050565b60008060008060808587031215611f61578384fd5b611f6a85611d89565b9350611f7860208601611dbf565b925060408501359150611f8d60608601611dbf565b905092959194509250565b600060208284031215611fa9578081fd5b8135611663816128a8565b600060208284031215611fc5578081fd5b8151611663816128a8565b600060208284031215611fe1578081fd5b81356001600160401b03811115611ff6578182fd5b6109c484828501611da0565b600060208284031215612013578081fd5b5035919050565b6000806000806080858703121561202f578384fd5b8435935061203f60208601611d89565b925060408501356001600160401b038082111561205a578384fd5b61206688838901611da0565b9350606087013591508082111561207b578283fd5b50611edd87828801611da0565b6000806040838503121561209a578182fd5b82359150611e2d60208401611dbf565b600080600080608085870312156120bf578182fd5b6120c885611dd3565b93506120d660208601611dd3565b92506120e460408601611dd3565b915060608501356001600160401b038111156120fe578182fd5b611edd87828801611da0565b600081518084526121228160208601602086016127b9565b601f01601f19169290920160200192915050565b600083516121488184602088016127b9565b83519083019061215c8183602088016127b9565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ac9083018461210a565b9695505050505050565b6001600160a01b03841681526060602082018190526000906121da9083018561210a565b82810360408401526121ac818561210a565b901515815260200190565b6000602082526109ee602083018461210a565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602a908201527f4d6178206d696e7461626c6520616d6f756e74207265616368656420666f72206040820152691d1a1a5cc8185cdcd95d60b21b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b90815260200190565b600063ffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261271460c083018461210a565b98975050505050505050565b60006001600160401b0380871683528086166020840152808516604084015250608060608301526121ac608083018461210a565b6000821982111561276757612767612866565b500190565b60006001600160401b0380831681851680830382111561215c5761215c612866565b60008261279d5761279d61287c565b500490565b6000828210156127b4576127b4612866565b500390565b60005b838110156127d45781810151838201526020016127bc565b83811115610c305750506000910152565b6000816127f4576127f4612866565b506000190190565b60028104600182168061281057607f821691505b6020821081141561283157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561284b5761284b612866565b5060010190565b6000826128615761286161287c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146128be57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220611ec779b13f76a38657886d85eb8e111ac6bb2acbe217cfc8c7bedc1c0740d764736f6c63430008000033

Deployed Bytecode Sourcemap

36750:18399:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7574:150;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40560:100;;;:::i;:::-;;;;;;;:::i;43246:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42776:404::-;;;;;;:::i;:::-;;:::i;:::-;;38419:32;;;:::i;:::-;;;;;;;:::i;38088:50::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;41665:211::-;;;:::i;44132:303::-;;;;;;:::i;:::-;;:::i;54618:201::-;;;;;;:::i;:::-;;:::i;52727:878::-;;;;;;:::i;:::-;;:::i;41425:164::-;;;;;;:::i;:::-;;:::i;37884:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;44506:151::-;;;;;;:::i;:::-;;:::i;54831:307::-;;;;;;:::i;:::-;;:::i;54065:234::-;;;;;;:::i;:::-;;:::i;41953:174::-;;;;;;:::i;:::-;;:::i;49957:99::-;;;;;;:::i;:::-;;:::i;40316:177::-;;;;;;:::i;:::-;;:::i;41244:97::-;;;:::i;40030:224::-;;;;;;:::i;:::-;;:::i;36660:83::-;;;:::i;40729:104::-;;;:::i;53879:174::-;;;;;;:::i;:::-;;:::i;43539:289::-;;;;;;:::i;:::-;;:::i;36520:132::-;;;;;;:::i;:::-;;:::i;44728:283::-;;;;;;:::i;:::-;;:::i;54311:295::-;;;;;;:::i;:::-;;:::i;38382:30::-;;;:::i;53757:110::-;;;;;;:::i;:::-;;:::i;42139:569::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;40904:332::-;;;;;;:::i;:::-;;:::i;37217:30::-;;;:::i;53617:128::-;;;;;;:::i;:::-;;:::i;43899:166::-;;;;;;:::i;:::-;;:::i;37113:40::-;;;;;;:::i;:::-;;:::i;7574:150::-;-1:-1:-1;;;;;;7683:33:0;;7659:4;7683:33;;;;;;;;;;;;;7574:150;;;;:::o;40560:100::-;40614:13;40647:5;40640:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40560:100;:::o;43246:221::-;43322:7;43350:16;43358:7;43350;:16::i;:::-;43342:73;;;;-1:-1:-1;;;43342:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;43435:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43435:24:0;;43246:221::o;42776:404::-;42857:14;42874:23;42889:7;42874:14;:23::i;:::-;42857:40;;42922:6;-1:-1:-1;;;;;42916:12:0;:2;-1:-1:-1;;;;;42916:12:0;;;42908:58;;;;-1:-1:-1;;;42908:58:0;;;;;;;:::i;:::-;42987:10;-1:-1:-1;;;;;42987:20:0;;;;:67;;;43011:43;43035:6;43043:10;43011:23;:43::i;:::-;42979:159;;;;-1:-1:-1;;;42979:159:0;;;;;;;:::i;:::-;43151:21;43160:2;43164:7;43151:8;:21::i;:::-;42776:404;;;:::o;38419:32::-;;;;:::o;38088:50::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38088:50:0;;;;-1:-1:-1;;;38088:50:0;;;;;-1:-1:-1;;;38088:50:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41665:211::-;41726:7;41847:21;:12;:19;:21::i;:::-;41840:28;;41665:211;:::o;44132:303::-;44293:39;44312:10;44324:7;44293:18;:39::i;:::-;44285:101;;;;-1:-1:-1;;;44285:101:0;;;;;;;:::i;:::-;44399:28;44409:4;44415:2;44419:7;44399:9;:28::i;54618:201::-;54711:10;54703:19;;;;:7;:19;;;;;;;;:27;;:19;:27;54695:51;;;;-1:-1:-1;;;54695:51:0;;;;;;;:::i;:::-;54757:23;;;;:13;:23;;;;;;:37;;:54;;;;;;-1:-1:-1;;;54757:54:0;-1:-1:-1;;;;54757:54:0;;;;;;;;;54618:201::o;52727:878::-;52876:10;52835:12;52868:19;;;:7;:19;;;;;;;;:27;;:19;:27;52860:51;;;;-1:-1:-1;;;52860:51:0;;;;;;;:::i;:::-;52967:24;;;;;;;:12;:24;;;;;:37;-1:-1:-1;;;;;;;;52967:37:0;;;;52930:34;;:74;52922:130;;;;-1:-1:-1;;;52922:130:0;;;;;;;:::i;:::-;53063:16;53082:25;:15;:23;:25::i;:::-;53063:44;;53118:19;53124:2;53128:8;53118:5;:19::i;:::-;53185:10;53148:13;:23;53162:8;53148:23;;;;;;;;;;;:34;;;:47;;;;;;;;;;;;;;;;;;53238:6;53206:13;:23;53220:8;53206:23;;;;;;;;;;;:29;;:38;;;;53298:15;53255:13;:23;53269:8;53255:23;;;;;;;;;;;:33;;;:59;;;;;;;;;;;;;;;;;;53370:15;53325:13;:23;53339:8;53325:23;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;53437:14;53397:13;:23;53411:8;53397:23;;;;;;;;;;;:37;;;:54;;;;;;;;;;;;;;;;;;53503:1;53462:12;:24;53475:10;53462:24;;;;;;;;;;;;;:37;;;:42;;;;;;;;;;-1:-1:-1;;;;;53462:42:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;53462:42:0;;;;;-1:-1:-1;;;;;53462:42:0;;;;;;53515:27;:15;:25;:27::i;:::-;53553:22;53566:2;53570:4;53553:12;:22::i;:::-;53593:4;53586:11;;;52727:878;;;;;;;:::o;41425:164::-;-1:-1:-1;;;;;41550:21:0;;41523:7;41550:21;;;:13;:21;;;;;:31;;41575:5;41550:24;:31::i;:::-;41543:38;;41425:164;;;;;:::o;37884:43::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37884:43:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44506:151::-;44610:39;44627:4;44633:2;44637:7;44610:39;;;;;;;;;;;;:16;:39::i;54831:307::-;36280:5;;-1:-1:-1;;;;;36280:5:0;36266:10;:19;36258:51;;;;-1:-1:-1;;;36258:51:0;;;;;;;:::i;:::-;54973:22:::1;::::0;;;:10:::1;:22;::::0;;;;;;;:51;;-1:-1:-1;;;;;;54973:51:0::1;-1:-1:-1::0;;;;;54973:51:0;::::1;;::::0;;55035:44;;::::1;::::0;-1:-1:-1;55035:29:0;;::::1;::::0;:44;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;55090:22:0::1;::::0;;;:10:::1;:22;::::0;;;;;;;:40;;::::1;::::0;:27:::1;::::0;;::::1;::::0;:40;::::1;::::0;::::1;:::i;:::-;;54831:307:::0;;;;:::o;54065:234::-;36280:5;;-1:-1:-1;;;;;36280:5:0;36266:10;:19;36258:51;;;;-1:-1:-1;;;36258:51:0;;;;;;;:::i;:::-;54219:1:::1;54206:10;-1:-1:-1::0;;;;;54206:14:0::1;;54198:23;;;::::0;::::1;;54232:59;54244:10;54256;54268;54280;54232;:59::i;:::-;54065:234:::0;;;;:::o;41953:174::-;42028:7;;42070:22;:12;42086:5;42070:15;:22::i;:::-;-1:-1:-1;42048:44:0;41953:174;-1:-1:-1;;;41953:174:0:o;49957:99::-;36280:5;;-1:-1:-1;;;;;36280:5:0;36266:10;:19;36258:51;;;;-1:-1:-1;;;36258:51:0;;;;;;;:::i;:::-;50029:19;;::::1;::::0;:8:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49957:99:::0;:::o;40316:177::-;40388:7;40415:70;40432:7;40415:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;41244:97::-;41292:13;41325:8;41318:15;;;;;:::i;40030:224::-;40103:7;-1:-1:-1;;;;;40131:20:0;;40123:75;;;;-1:-1:-1;;;40123:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40216:21:0;;;;;;:13;:21;;;;;:30;;:28;:30::i;36660:83::-;36730:5;;-1:-1:-1;;;;;36730:5:0;36660:83;:::o;40729:104::-;40785:13;40818:7;40811:14;;;;;:::i;53879:174::-;53959:15;;-1:-1:-1;;;;;53959:15:0;53945:10;:29;53937:38;;;;;;53986:21;;;;:13;:21;;;;;:33;;:59;;-1:-1:-1;;53986:59:0;;54029:15;53986:59;;;;;;53879:174::o;43539:289::-;-1:-1:-1;;;;;43642:22:0;;43654:10;43642:22;;43634:60;;;;-1:-1:-1;;;43634:60:0;;;;;;;:::i;:::-;43726:10;43707:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;43707:40:0;;;;;;;;;;;:51;;-1:-1:-1;;43707:51:0;;;;;;;43774:46;;43707:40;;43726:10;43774:46;;;;43707:51;;43774:46;:::i;:::-;;;;;;;;43539:289;;:::o;36520:132::-;36280:5;;-1:-1:-1;;;;;36280:5:0;36266:10;:19;36258:51;;;;-1:-1:-1;;;36258:51:0;;;;;;;:::i;:::-;36601:5:::1;::::0;36592:25:::1;::::0;-1:-1:-1;;;;;36592:25:0;;::::1;::::0;36601:5:::1;::::0;36592:25:::1;::::0;36601:5:::1;::::0;36592:25:::1;36628:5;:16:::0;;-1:-1:-1;;;;;;36628:16:0::1;-1:-1:-1::0;;;;;36628:16:0;;;::::1;::::0;;;::::1;::::0;;36520:132::o;44728:283::-;44860:39;44879:10;44891:7;44860:18;:39::i;:::-;44852:101;;;;-1:-1:-1;;;44852:101:0;;;;;;;:::i;:::-;44964:39;44978:4;44984:2;44988:7;44997:5;44964:13;:39::i;54311:295::-;36280:5;;-1:-1:-1;;;;;36280:5:0;36266:10;:19;36258:51;;;;-1:-1:-1;;;36258:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54444:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;;;:44;;::::1;::::0;:31:::1;::::0;;::::1;::::0;:44;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;;;54499:21:0;;::::1;;::::0;;;:12:::1;:21;::::0;;;;:44;;-1:-1:-1;;54499:44:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;54554:44:0::1;-1:-1:-1::0;;;54554:44:0;;;::::1;;::::0;;;::::1;::::0;;54311:295::o;38382:30::-;;;-1:-1:-1;;;;;38382:30:0;;:::o;53757:110::-;36280:5;;-1:-1:-1;;;;;36280:5:0;36266:10;:19;36258:51;;;;-1:-1:-1;;;36258:51:0;;;;;;;:::i;:::-;53832:15:::1;:27:::0;;-1:-1:-1;;;;;;53832:27:0::1;-1:-1:-1::0;;;;;53832:27:0;;;::::1;::::0;;;::::1;::::0;;53757:110::o;42139:569::-;42200:12;42366:20;;;:13;:20;;;;;;;;:31;;;;;-1:-1:-1;;;42366:31:0;;;;;;42352:47;;;:12;:47;;;;;:57;42624:26;;-1:-1:-1;;;42352:57:0;;;-1:-1:-1;;;;;42352:57:0;42661:21;;;:10;:21;;;;;;:28;;;42431:269;;42200:12;;;;;;;;42293:18;;42352:57;;42366:31;;-1:-1:-1;;;42493:34:0;;;;;42539:30;;;;42581:32;;;;;;;;42624:26;42661:28;;;42431:269;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42139:569;;;;;;;:::o;40904:332::-;40977:13;41011:16;41019:7;41011;:16::i;:::-;41003:76;;;;-1:-1:-1;;;41003:76:0;;;;;;;:::i;:::-;41090:18;41111:9;:7;:9::i;:::-;41177:22;;;;:13;:22;;;;;:36;;;41090:30;;-1:-1:-1;41090:30:0;;41169:56;;-1:-1:-1;;;41177:36:0;;;;41169:54;:56::i;:::-;41145:82;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41131:97;;;40904:332;;;:::o;37217:30::-;;;-1:-1:-1;;;;;37217:30:0;;:::o;53617:128::-;36280:5;;-1:-1:-1;;;;;36280:5:0;36266:10;:19;36258:51;;;;-1:-1:-1;;;36258:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53703:23:0;;;::::1;;::::0;;;:7:::1;:23;::::0;;;;:34;;-1:-1:-1;;53703:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53617:128::o;43899:166::-;-1:-1:-1;;;;;44021:26:0;;;43997:4;44021:26;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;;;43899:166::o;37113:40::-;;;;;;;;;;;;;;;:::o;46478:127::-;46543:4;46567:30;:12;46589:7;46567:21;:30::i;51470:183::-;51536:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51536:29:0;-1:-1:-1;;;;;51536:29:0;;;;;;;;:24;;51590:23;51536:24;51590:14;:23::i;:::-;-1:-1:-1;;;;;51581:46:0;;;;;;;;;;;51470:183;;:::o;32344:123::-;32413:7;32440:19;32448:3;32440:7;:19::i;46772:358::-;46865:4;46890:16;46898:7;46890;:16::i;:::-;46882:73;;;;-1:-1:-1;;;46882:73:0;;;;;;;:::i;:::-;46966:14;46983:23;46998:7;46983:14;:23::i;:::-;46966:40;;47036:6;-1:-1:-1;;;;;47025:17:0;:7;-1:-1:-1;;;;;47025:17:0;;:52;;;;47070:7;-1:-1:-1;;;;;47046:31:0;:20;47058:7;47046:11;:20::i;:::-;-1:-1:-1;;;;;47046:31:0;;47025:52;:96;;;;47081:40;47105:6;47113:7;47081:23;:40::i;49139:808::-;49264:4;-1:-1:-1;;;;;49237:31:0;:23;49252:7;49237:14;:23::i;:::-;-1:-1:-1;;;;;49237:31:0;;49229:85;;;;-1:-1:-1;;;49229:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49351:16:0;;49343:65;;;;-1:-1:-1;;;49343:65:0;;;;;;;:::i;:::-;49421:39;49442:4;49448:2;49452:7;49421:20;:39::i;:::-;49525:29;49542:1;49546:7;49525:8;:29::i;:::-;-1:-1:-1;;;;;49567:19:0;;;;;;:13;:19;;;;;:35;;49594:7;49567:26;:35::i;:::-;-1:-1:-1;;;;;;49613:17:0;;;;;;:13;:17;;;;;:30;;49635:7;49613:21;:30::i;:::-;-1:-1:-1;49656:29:0;:12;49673:7;49682:2;49656:16;:29::i;:::-;-1:-1:-1;49696:22:0;;;;:13;:22;;;;;:32;;;;:58;;-1:-1:-1;;49696:58:0;49738:15;49696:58;;;;;-1:-1:-1;;49765:60:0;;;;;;;;;49836:22;;49849:2;;49836:12;:22::i;:::-;49869:25;49882:4;49888:5;49869:12;:25::i;:::-;49931:7;49927:2;-1:-1:-1;;;;;49912:27:0;49921:4;-1:-1:-1;;;;;49912:27:0;;;;;;;;;;;49139:808;;;:::o;35590:114::-;35682:14;;35590:114::o;48396:404::-;-1:-1:-1;;;;;48476:16:0;;48468:61;;;;-1:-1:-1;;;48468:61:0;;;;;;;:::i;:::-;48549:16;48557:7;48549;:16::i;:::-;48548:17;48540:58;;;;-1:-1:-1;;;48540:58:0;;;;;;;:::i;:::-;48611:45;48640:1;48644:2;48648:7;48611:20;:45::i;:::-;-1:-1:-1;;;;;48669:17:0;;;;;;:13;:17;;;;;:30;;48691:7;48669:21;:30::i;:::-;-1:-1:-1;48712:29:0;:12;48729:7;48738:2;48712:16;:29::i;:::-;-1:-1:-1;48759:33:0;;48784:7;;-1:-1:-1;;;;;48759:33:0;;;48776:1;;48759:33;;48776:1;;48759:33;48396:404;;:::o;35712:127::-;35801:19;;35819:1;35801:19;;;35712:127::o;52371:344::-;-1:-1:-1;;;;;52471:23:0;;52446:22;52471:23;;;:13;:23;;;;;:32;;:30;:32::i;:::-;52446:57;-1:-1:-1;52518:18:0;;52514:194;;52570:4;52557:17;;;;:40;;;;;52578:14;52596:1;52578:19;52557:40;52553:96;;;52618:13;:15;;;:13;:15;;;:::i;:::-;;;;;;52553:96;52514:194;;;52681:13;:15;;;:13;:15;;;:::i;:::-;;;;;;52371:344;;;:::o;24966:137::-;25037:7;25072:22;25076:3;25088:5;25072:3;:22::i;39617:345::-;-1:-1:-1;;;;;39739:24:0;;;;;;;:12;:24;;;;;;;;:47;;-1:-1:-1;;39739:47:0;;;;;-1:-1:-1;;39849:47:0;-1:-1:-1;;;39849:47:0;;;;;;;;;;;;;39907;;;;-1:-1:-1;39907:34:0;;:47;;;;:::i;32806:236::-;32886:7;;;;32946:22;32950:3;32962:5;32946:3;:22::i;:::-;32915:53;;;;-1:-1:-1;32806:236:0;-1:-1:-1;;;;;32806:236:0:o;34092:213::-;34199:7;34250:44;34255:3;34275;34281:12;34250:4;:44::i;:::-;34242:53;-1:-1:-1;34092:213:0;;;;;;:::o;45893:272::-;46007:28;46017:4;46023:2;46027:7;46007:9;:28::i;:::-;46054:48;46077:4;46083:2;46087:7;46096:5;46054:22;:48::i;:::-;46046:111;;;;-1:-1:-1;;;46046:111:0;;;;;;;:::i;34423:751::-;34479:13;34700:10;34696:53;;-1:-1:-1;34727:10:0;;;;;;;;;;;;-1:-1:-1;;;34727:10:0;;;;;;34696:53;34774:5;34759:12;34815:78;34822:9;;34815:78;;34848:8;;;;:::i;:::-;;-1:-1:-1;34871:10:0;;-1:-1:-1;34879:2:0;34871:10;;:::i;:::-;;;34815:78;;;34903:19;34935:6;-1:-1:-1;;;;;34925:17:0;;;;;-1:-1:-1;;;34925:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34925:17:0;-1:-1:-1;34993:5:0;;-1:-1:-1;34903:39:0;-1:-1:-1;34969:6:0;35009:126;35016:9;;35009:126;;35086:9;35093:2;35086:4;:9;:::i;:::-;35073:23;;:2;:23;:::i;:::-;35060:38;;35042:6;35049:7;;;:::i;:::-;;;;35042:15;;;;;;-1:-1:-1;;;35042:15:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;35042:56:0;;;;;;;;-1:-1:-1;35113:10:0;35121:2;35113:10;;:::i;:::-;;;35009:126;;;-1:-1:-1;35159:6:0;34423:751;-1:-1:-1;;;;34423:751:0:o;32105:151::-;32189:4;32213:35;32223:3;32243;32213:9;:35::i;24053:137::-;24123:4;24147:35;24155:3;24175:5;24147:7;:35::i;23746:131::-;23813:4;23837:32;23842:3;23862:5;23837:4;:32::i;31528:185::-;31617:4;31641:64;31646:3;31666;-1:-1:-1;;;;;31680:23:0;;31641:4;:64::i;20004:204::-;20099:18;;20071:7;;20099:26;-1:-1:-1;20091:73:0;;;;-1:-1:-1;;;20091:73:0;;;;;;;:::i;:::-;20182:3;:11;;20194:5;20182:18;;;;;;-1:-1:-1;;;20182:18:0;;;;;;;;;;;;;;;;;20175:25;;20004:204;;;;:::o;29388:279::-;29492:19;;29455:7;;;;29492:27;-1:-1:-1;29484:74:0;;;;-1:-1:-1;;;29484:74:0;;;;;;;:::i;:::-;29571:22;29596:3;:12;;29609:5;29596:19;;;;;;-1:-1:-1;;;29596:19:0;;;;;;;;;;;;;;;;;;;29571:44;;29634:5;:10;;;29646:5;:12;;;29626:33;;;;;29388:279;;;;;:::o;30885:319::-;30979:7;31018:17;;;:12;;;:17;;;;;;31069:12;31054:13;31046:36;;;;-1:-1:-1;;;31046:36:0;;;;;;;;:::i;:::-;-1:-1:-1;31136:3:0;31149:12;31160:1;31149:8;:12;:::i;:::-;31136:26;;;;;;-1:-1:-1;;;31136:26:0;;;;;;;;;;;;;;;;;;;:33;;;31129:40;;;30885:319;;;;;:::o;50621:841::-;50742:4;50768:15;:2;-1:-1:-1;;;;;50768:13:0;;:15::i;:::-;50764:691;;;50804:70;;-1:-1:-1;;;50804:70:0;;-1:-1:-1;;;;;50804:36:0;;;;;:70;;50841:10;;50853:4;;50859:7;;50868:5;;50804:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50804:70:0;;;;;;;;-1:-1:-1;;50804:70:0;;;;;;;;;;;;:::i;:::-;;;50800:600;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51048:13:0;;51044:341;;51091:60;;-1:-1:-1;;;51091:60:0;;;;;;;:::i;51044:341::-;51335:6;51329:13;51320:6;51316:2;51312:15;51305:38;50800:600;-1:-1:-1;;;;;;50925:55:0;-1:-1:-1;;;50925:55:0;;-1:-1:-1;50918:62:0;;50764:691;-1:-1:-1;51439:4:0;51432:11;;28703:125;28774:4;28798:17;;;:12;;;;;:17;;;;;;:22;;;28703:125::o;17706:1544::-;17772:4;17911:19;;;:12;;;:19;;;;;;17947:15;;17943:1300;;18309:21;18333:14;18346:1;18333:10;:14;:::i;:::-;18382:18;;18309:38;;-1:-1:-1;18362:17:0;;18382:22;;18403:1;;18382:22;:::i;:::-;18362:42;;18649:17;18669:3;:11;;18681:9;18669:22;;;;;;-1:-1:-1;;;18669:22:0;;;;;;;;;;;;;;;;;18649:42;;18815:9;18786:3;:11;;18798:13;18786:26;;;;;;-1:-1:-1;;;18786:26:0;;;;;;;;;;;;;;;;;;:38;18918:17;:13;18934:1;18918:17;:::i;:::-;18892:23;;;;:12;;;:23;;;;;:43;19044:17;;18892:3;;19044:17;;;-1:-1:-1;;;19044:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;19139:3;:12;;:19;19152:5;19139:19;;;;;;;;;;;19132:26;;;19182:4;19175:11;;;;;;;;17943:1300;19226:5;19219:12;;;;;17116:414;17179:4;17201:21;17211:3;17216:5;17201:9;:21::i;:::-;17196:327;;-1:-1:-1;17239:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;17422:18;;17400:19;;;:12;;;:19;;;;;;:40;;;;17455:11;;17196:327;-1:-1:-1;17506:5:0;17499:12;;26203:692;26279:4;26414:17;;;:12;;;:17;;;;;;26448:13;26444:444;;-1:-1:-1;;26533:38:0;;;;;;;;;;;;;;;;;;26515:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;26730:19;;26710:17;;;:12;;;:17;;;;;;;:39;26764:11;;26444:444;26844:5;26808:3;26821:12;26832:1;26821:8;:12;:::i;:::-;26808:26;;;;;;-1:-1:-1;;;26808:26:0;;;;;;;;;;;;;;;;;;;:33;;:41;;;;26871:5;26864:12;;;;;8947:422;9314:20;9353:8;;;8947:422::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;-1:-1:-1;;;;;151:2:1;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:233;;904:3;897:4;889:6;885:17;881:27;871:2;;926:5;919;912:20;871:2;952:81;1029:3;1020:6;1007:20;1000:4;992:6;988:17;952:81;:::i;1044:165::-;1113:20;;1173:10;1162:22;;1152:33;;1142:2;;1199:1;1196;1189:12;1214:173;1283:20;;-1:-1:-1;;;;;1332:30:1;;1322:41;;1312:2;;1377:1;1374;1367:12;1392:198;;1504:2;1492:9;1483:7;1479:23;1475:32;1472:2;;;1525:6;1517;1510:22;1472:2;1553:31;1574:9;1553:31;:::i;1595:274::-;;;1724:2;1712:9;1703:7;1699:23;1695:32;1692:2;;;1745:6;1737;1730:22;1692:2;1773:31;1794:9;1773:31;:::i;:::-;1763:41;;1823:40;1859:2;1848:9;1844:18;1823:40;:::i;:::-;1813:50;;1682:187;;;;;:::o;1874:342::-;;;;2020:2;2008:9;1999:7;1995:23;1991:32;1988:2;;;2041:6;2033;2026:22;1988:2;2069:31;2090:9;2069:31;:::i;:::-;2059:41;;2119:40;2155:2;2144:9;2140:18;2119:40;:::i;:::-;2109:50;;2206:2;2195:9;2191:18;2178:32;2168:42;;1978:238;;;;;:::o;2221:702::-;;;;;2393:3;2381:9;2372:7;2368:23;2364:33;2361:2;;;2415:6;2407;2400:22;2361:2;2443:31;2464:9;2443:31;:::i;:::-;2433:41;;2493:40;2529:2;2518:9;2514:18;2493:40;:::i;:::-;2483:50;;2580:2;2569:9;2565:18;2552:32;2542:42;;2635:2;2624:9;2620:18;2607:32;-1:-1:-1;;;;;2654:6:1;2651:30;2648:2;;;2699:6;2691;2684:22;2648:2;2727:22;;2780:4;2772:13;;2768:27;-1:-1:-1;2758:2:1;;2814:6;2806;2799:22;2758:2;2842:75;2909:7;2904:2;2891:16;2886:2;2882;2878:11;2842:75;:::i;:::-;2832:85;;;2351:572;;;;;;;:::o;2928:369::-;;;3054:2;3042:9;3033:7;3029:23;3025:32;3022:2;;;3075:6;3067;3060:22;3022:2;3103:31;3124:9;3103:31;:::i;:::-;3093:41;;3184:2;3173:9;3169:18;3156:32;3231:5;3224:13;3217:21;3210:5;3207:32;3197:2;;3258:6;3250;3243:22;3197:2;3286:5;3276:15;;;3012:285;;;;;:::o;3302:266::-;;;3431:2;3419:9;3410:7;3406:23;3402:32;3399:2;;;3452:6;3444;3437:22;3399:2;3480:31;3501:9;3480:31;:::i;:::-;3470:41;3558:2;3543:18;;;;3530:32;;-1:-1:-1;;;3389:179:1:o;3573:415::-;;;;;3734:3;3722:9;3713:7;3709:23;3705:33;3702:2;;;3756:6;3748;3741:22;3702:2;3784:31;3805:9;3784:31;:::i;:::-;3774:41;;3834:39;3869:2;3858:9;3854:18;3834:39;:::i;:::-;3824:49;;3920:2;3909:9;3905:18;3892:32;3882:42;;3943:39;3978:2;3967:9;3963:18;3943:39;:::i;:::-;3933:49;;3692:296;;;;;;;:::o;3993:257::-;;4104:2;4092:9;4083:7;4079:23;4075:32;4072:2;;;4125:6;4117;4110:22;4072:2;4169:9;4156:23;4188:32;4214:5;4188:32;:::i;4255:261::-;;4377:2;4365:9;4356:7;4352:23;4348:32;4345:2;;;4398:6;4390;4383:22;4345:2;4435:9;4429:16;4454:32;4480:5;4454:32;:::i;4521:344::-;;4643:2;4631:9;4622:7;4618:23;4614:32;4611:2;;;4664:6;4656;4649:22;4611:2;4709:9;4696:23;-1:-1:-1;;;;;4734:6:1;4731:30;4728:2;;;4779:6;4771;4764:22;4728:2;4807:52;4851:7;4842:6;4831:9;4827:22;4807:52;:::i;4870:190::-;;4982:2;4970:9;4961:7;4957:23;4953:32;4950:2;;;5003:6;4995;4988:22;4950:2;-1:-1:-1;5031:23:1;;4940:120;-1:-1:-1;4940:120:1:o;5065:722::-;;;;;5248:3;5236:9;5227:7;5223:23;5219:33;5216:2;;;5270:6;5262;5255:22;5216:2;5311:9;5298:23;5288:33;;5340:40;5376:2;5365:9;5361:18;5340:40;:::i;:::-;5330:50;;5431:2;5420:9;5416:18;5403:32;-1:-1:-1;;;;;5495:2:1;5487:6;5484:14;5481:2;;;5516:6;5508;5501:22;5481:2;5544:52;5588:7;5579:6;5568:9;5564:22;5544:52;:::i;:::-;5534:62;;5649:2;5638:9;5634:18;5621:32;5605:48;;5678:2;5668:8;5665:16;5662:2;;;5699:6;5691;5684:22;5662:2;;5727:54;5773:7;5762:8;5751:9;5747:24;5727:54;:::i;5792:264::-;;;5920:2;5908:9;5899:7;5895:23;5891:32;5888:2;;;5941:6;5933;5926:22;5888:2;5982:9;5969:23;5959:33;;6011:39;6046:2;6035:9;6031:18;6011:39;:::i;6061:567::-;;;;;6231:3;6219:9;6210:7;6206:23;6202:33;6199:2;;;6253:6;6245;6238:22;6199:2;6281:30;6301:9;6281:30;:::i;:::-;6271:40;;6330:39;6365:2;6354:9;6350:18;6330:39;:::i;:::-;6320:49;;6388:39;6423:2;6412:9;6408:18;6388:39;:::i;:::-;6378:49;;6478:2;6467:9;6463:18;6450:32;-1:-1:-1;;;;;6497:6:1;6494:30;6491:2;;;6542:6;6534;6527:22;6491:2;6570:52;6614:7;6605:6;6594:9;6590:22;6570:52;:::i;6633:259::-;;6714:5;6708:12;6741:6;6736:3;6729:19;6757:63;6813:6;6806:4;6801:3;6797:14;6790:4;6783:5;6779:16;6757:63;:::i;:::-;6874:2;6853:15;-1:-1:-1;;6849:29:1;6840:39;;;;6881:4;6836:50;;6684:208;-1:-1:-1;;6684:208:1:o;6897:470::-;;7114:6;7108:13;7130:53;7176:6;7171:3;7164:4;7156:6;7152:17;7130:53;:::i;:::-;7246:13;;7205:16;;;;7268:57;7246:13;7205:16;7302:4;7290:17;;7268:57;:::i;:::-;7341:20;;7084:283;-1:-1:-1;;;;7084:283:1:o;7372:203::-;-1:-1:-1;;;;;7536:32:1;;;;7518:51;;7506:2;7491:18;;7473:102::o;7580:490::-;-1:-1:-1;;;;;7849:15:1;;;7831:34;;7901:15;;7896:2;7881:18;;7874:43;7948:2;7933:18;;7926:34;;;7996:3;7991:2;7976:18;;7969:31;;;7580:490;;8017:47;;8044:19;;8036:6;8017:47;:::i;:::-;8009:55;7783:287;-1:-1:-1;;;;;;7783:287:1:o;8075:482::-;-1:-1:-1;;;;;8300:32:1;;8282:51;;8369:2;8364;8349:18;;8342:30;;;8075:482;;8395:46;;8422:18;;8414:6;8395:46;:::i;:::-;8489:9;8481:6;8477:22;8472:2;8461:9;8457:18;8450:50;8517:34;8544:6;8536;8517:34;:::i;8562:187::-;8727:14;;8720:22;8702:41;;8690:2;8675:18;;8657:92::o;8754:221::-;;8903:2;8892:9;8885:21;8923:46;8965:2;8954:9;8950:18;8942:6;8923:46;:::i;8980:398::-;9182:2;9164:21;;;9221:2;9201:18;;;9194:30;9260:34;9255:2;9240:18;;9233:62;-1:-1:-1;;;9326:2:1;9311:18;;9304:32;9368:3;9353:19;;9154:224::o;9383:406::-;9585:2;9567:21;;;9624:2;9604:18;;;9597:30;9663:34;9658:2;9643:18;;9636:62;-1:-1:-1;;;9729:2:1;9714:18;;9707:40;9779:3;9764:19;;9557:232::o;9794:414::-;9996:2;9978:21;;;10035:2;10015:18;;;10008:30;10074:34;10069:2;10054:18;;10047:62;-1:-1:-1;;;10140:2:1;10125:18;;10118:48;10198:3;10183:19;;9968:240::o;10213:352::-;10415:2;10397:21;;;10454:2;10434:18;;;10427:30;10493;10488:2;10473:18;;10466:58;10556:2;10541:18;;10387:178::o;10570:343::-;10772:2;10754:21;;;10811:2;10791:18;;;10784:30;-1:-1:-1;;;10845:2:1;10830:18;;10823:49;10904:2;10889:18;;10744:169::o;10918:400::-;11120:2;11102:21;;;11159:2;11139:18;;;11132:30;11198:34;11193:2;11178:18;;11171:62;-1:-1:-1;;;11264:2:1;11249:18;;11242:34;11308:3;11293:19;;11092:226::o;11323:349::-;11525:2;11507:21;;;11564:2;11544:18;;;11537:30;11603:27;11598:2;11583:18;;11576:55;11663:2;11648:18;;11497:175::o;11677:408::-;11879:2;11861:21;;;11918:2;11898:18;;;11891:30;11957:34;11952:2;11937:18;;11930:62;-1:-1:-1;;;12023:2:1;12008:18;;12001:42;12075:3;12060:19;;11851:234::o;12090:420::-;12292:2;12274:21;;;12331:2;12311:18;;;12304:30;12370:34;12365:2;12350:18;;12343:62;12441:26;12436:2;12421:18;;12414:54;12500:3;12485:19;;12264:246::o;12515:406::-;12717:2;12699:21;;;12756:2;12736:18;;;12729:30;12795:34;12790:2;12775:18;;12768:62;-1:-1:-1;;;12861:2:1;12846:18;;12839:40;12911:3;12896:19;;12689:232::o;12926:398::-;13128:2;13110:21;;;13167:2;13147:18;;;13140:30;13206:34;13201:2;13186:18;;13179:62;-1:-1:-1;;;13272:2:1;13257:18;;13250:32;13314:3;13299:19;;13100:224::o;13329:356::-;13531:2;13513:21;;;13550:18;;;13543:30;13609:34;13604:2;13589:18;;13582:62;13676:2;13661:18;;13503:182::o;13690:408::-;13892:2;13874:21;;;13931:2;13911:18;;;13904:30;13970:34;13965:2;13950:18;;13943:62;-1:-1:-1;;;14036:2:1;14021:18;;14014:42;14088:3;14073:19;;13864:234::o;14103:335::-;14305:2;14287:21;;;14344:2;14324:18;;;14317:30;-1:-1:-1;;;14378:2:1;14363:18;;14356:41;14429:2;14414:18;;14277:161::o;14443:405::-;14645:2;14627:21;;;14684:2;14664:18;;;14657:30;14723:34;14718:2;14703:18;;14696:62;-1:-1:-1;;;14789:2:1;14774:18;;14767:39;14838:3;14823:19;;14617:231::o;14853:411::-;15055:2;15037:21;;;15094:2;15074:18;;;15067:30;15133:34;15128:2;15113:18;;15106:62;-1:-1:-1;;;15199:2:1;15184:18;;15177:45;15254:3;15239:19;;15027:237::o;15269:397::-;15471:2;15453:21;;;15510:2;15490:18;;;15483:30;15549:34;15544:2;15529:18;;15522:62;-1:-1:-1;;;15615:2:1;15600:18;;15593:31;15656:3;15641:19;;15443:223::o;15671:413::-;15873:2;15855:21;;;15912:2;15892:18;;;15885:30;15951:34;15946:2;15931:18;;15924:62;-1:-1:-1;;;16017:2:1;16002:18;;15995:47;16074:3;16059:19;;15845:239::o;16089:177::-;16235:25;;;16223:2;16208:18;;16190:76::o;16271:637::-;;16544:10;16593:2;16585:6;16581:15;16570:9;16563:34;16645:2;16637:6;16633:15;16628:2;16617:9;16613:18;16606:43;16697:2;16689:6;16685:15;16680:2;16669:9;16665:18;16658:43;16749:2;16741:6;16737:15;16732:2;16721:9;16717:18;16710:43;;16790:6;16784:3;16773:9;16769:19;16762:35;16834:3;16828;16817:9;16813:19;16806:32;16855:47;16897:3;16886:9;16882:19;16874:6;16855:47;:::i;:::-;16847:55;16524:384;-1:-1:-1;;;;;;;;16524:384:1:o;16913:494::-;;-1:-1:-1;;;;;17189:2:1;17181:6;17177:15;17166:9;17159:34;17241:2;17233:6;17229:15;17224:2;17213:9;17209:18;17202:43;17293:2;17285:6;17281:15;17276:2;17265:9;17261:18;17254:43;;17333:3;17328:2;17317:9;17313:18;17306:31;17354:47;17396:3;17385:9;17381:19;17373:6;17354:47;:::i;17412:128::-;;17483:1;17479:6;17476:1;17473:13;17470:2;;;17489:18;;:::i;:::-;-1:-1:-1;17525:9:1;;17460:80::o;17545:236::-;;-1:-1:-1;;;;;17657:2:1;17654:1;17650:10;17687:2;17684:1;17680:10;17718:3;17714:2;17710:12;17705:3;17702:21;17699:2;;;17726:18;;:::i;17786:120::-;;17852:1;17842:2;;17857:18;;:::i;:::-;-1:-1:-1;17891:9:1;;17832:74::o;17911:125::-;;17979:1;17976;17973:8;17970:2;;;17984:18;;:::i;:::-;-1:-1:-1;18021:9:1;;17960:76::o;18041:258::-;18113:1;18123:113;18137:6;18134:1;18131:13;18123:113;;;18213:11;;;18207:18;18194:11;;;18187:39;18159:2;18152:10;18123:113;;;18254:6;18251:1;18248:13;18245:2;;;-1:-1:-1;;18289:1:1;18271:16;;18264:27;18094:205::o;18304:136::-;;18371:5;18361:2;;18380:18;;:::i;:::-;-1:-1:-1;;;18416:18:1;;18351:89::o;18445:380::-;18530:1;18520:12;;18577:1;18567:12;;;18588:2;;18642:4;18634:6;18630:17;18620:27;;18588:2;18695;18687:6;18684:14;18664:18;18661:38;18658:2;;;18741:10;18736:3;18732:20;18729:1;18722:31;18776:4;18773:1;18766:15;18804:4;18801:1;18794:15;18658:2;;18500:325;;;:::o;18830:135::-;;-1:-1:-1;;18890:17:1;;18887:2;;;18910:18;;:::i;:::-;-1:-1:-1;18957:1:1;18946:13;;18877:88::o;18970:112::-;;19028:1;19018:2;;19033:18;;:::i;:::-;-1:-1:-1;19067:9:1;;19008:74::o;19087:127::-;19148:10;19143:3;19139:20;19136:1;19129:31;19179:4;19176:1;19169:15;19203:4;19200:1;19193:15;19219:127;19280:10;19275:3;19271:20;19268:1;19261:31;19311:4;19308:1;19301:15;19335:4;19332:1;19325:15;19351:127;19412:10;19407:3;19403:20;19400:1;19393:31;19443:4;19440:1;19433:15;19467:4;19464:1;19457:15;19483:133;-1:-1:-1;;;;;;19559:32:1;;19549:43;;19539:2;;19606:1;19603;19596:12;19539:2;19529:87;:::o

Swarm Source

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