ETH Price: $3,438.20 (-2.23%)
Gas: 3 Gwei

Token

Alkimi_Node (ALN)
 

Overview

Max Total Supply

0 ALN

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ALN
0x80Ef7084d31B02F38AF97e67e36C9615cc4474F4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AlkimiNodeNFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-27
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.15;

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

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

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

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

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

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

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

    /**
     * @dev 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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

interface INodeNFT {
    function getAvailableTokenID(
        string memory,
        address
    ) external view returns (uint256, bool);

    function isValidNodeNFTTypeIndex(uint32) external view returns (bool);

    function usable(uint256) external view returns (bool);

    function reclaimable(uint256) external view returns (bool);

    function getTypeIndexFromName(string memory) external view returns (uint32);

    function getTypeNameFromIndex(uint32) external view returns (string memory);

    function isValidTypeName(string memory) external view returns (bool);
}

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol)

// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981Detailed is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) /
            _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    function getDefaultRoyalty() public view virtual returns (address, uint96) {
        return (
            _defaultRoyaltyInfo.receiver,
            _defaultRoyaltyInfo.royaltyFraction
        );
    }

    function _getTokenRoyalty(
        uint256 _tokenId
    ) internal view virtual returns (address, uint96) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }
        return (royalty.receiver, royalty.royaltyFraction);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721RoyaltyDetailed is ERC2981Detailed, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(ERC721, ERC2981Detailed) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}

contract AlkimiNodeNFT is
    ERC721RoyaltyDetailed,
    ERC721Enumerable,
    Ownable,
    INodeNFT,
    ReentrancyGuard,
    Pausable
{
    using Address for address;
    // number of nfts totally minted
    uint256 public totalMinted = 0;
    // total supply of node nft
    uint256 private _totalSupply;

    mapping(address => bool) public isAdmin;
    uint8 private constant TotalAdmins = 2;
    uint8 adminsAdded = 0;

    mapping(uint256 => string) private updatedUri;
    mapping(uint256 => bool) private isUriUpdated;
    mapping(uint256 => string) private uriOfType;

    /**
    nft type : master, guardian etc
    totalSupply : total available amount of node nft of a type
    totalMinted : totalMinted node nft of a type
     */
    struct NodeNFTType {
        string nftType;
        uint256 totalSupply;
        uint256 totalMinted;
    }
    // index : NodeNFTType
    mapping(uint256 => NodeNFTType) public nftTypes;
    mapping(string => uint32) private typeNameIndexMap;
    mapping(string => bool) public isValidTypeName;
    // totally added node nft type
    uint32 public nftTypeCount = 0;

    /**
    collateral info
    nftType : nftType defined above in NodeNFTType
    underlying : pay token address
    amount : how much to pay to reclaim
     */
    struct Collateral {
        string nftType;
        address underlying;
        uint256 amount;
    }
    // index : Collateral
    mapping(uint256 => Collateral) public collaterals;
    // node nft token id : NodeNFTType index
    mapping(uint256 => uint32) private nftTypeOfTokenId;
    // token id : usability
    mapping(uint256 => bool) public usable;
    // token id : reclaimability
    mapping(uint256 => bool) public reclaimable;

    event AdminAdded(address indexed operator, address indexed added);
    event AdminRemoved(address indexed operator, address indexed removed);
    event Minted(
        address indexed receiver,
        uint256 tokenID,
        uint32 indexed typeIndex,
        string indexed nftType
    );
    event NFTTypeAdded(
        address operator,
        string indexed nftType,
        uint256 indexed supply
    );
    event TotalSupplyUpdated(
        address operator,
        string indexed nftType,
        uint256 oldTotalSupply,
        uint256 indexed newTotalSupply
    );
    event CollateralSet(
        address operator,
        uint256 indexed nodeTypeIndex,
        address indexed underlying,
        uint256 indexed amount
    );
    event UsabilityUpdated(
        address operator,
        uint256 indexed tokenID,
        bool indexed usability
    );
    event ReclaimabilityUpdated(
        address operator,
        uint256 indexed tokenID,
        bool indexed reclaimability
    );
    event DefaultRoyaltyChanged(
        address operator,
        uint256 indexed newRoyalty,
        address indexed receiver
    );
    event TokenRoyaltyChanged(
        address operator,
        uint256 indexed tokenID,
        uint256 indexed newRoyalty,
        address indexed receiver
    );

    modifier onlyAdmin() {
        require(
            isAdmin[msg.sender] || owner() == msg.sender,
            "unauthorised admin"
        );
        _;
    }

    modifier onlyValidTypeName(string memory _name) {
        require(isValidTypeName[_name], "invalid-type-name");
        _;
    }

    modifier tokenIDExists(uint256 _tokenId) {
        require(exists(_tokenId), "invalid-tokenID");
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC721(_name, _symbol) {}

    function mint(
        address _receiver,
        uint256 _amount,
        string memory _typeName
    ) public onlyValidTypeName(_typeName) nonReentrant whenNotPaused onlyAdmin {
        require(_receiver != address(0), "batchMint-0-address");
        uint32 _typeIndex = typeNameIndexMap[_typeName];
        NodeNFTType memory nftType = nftTypes[_typeIndex];
        uint256 typeTotalSupply = nftType.totalSupply;
        uint256 typeTotalMinted = nftType.totalMinted;
        require(
            typeTotalSupply >= (typeTotalMinted + _amount),
            "batchMint-more-than-type-totalSupply"
        );
        for (uint i = 0; i < _amount; ++i) {
            _mint(_receiver, totalMinted);
            nftTypeOfTokenId[totalMinted] = _typeIndex;
            usable[totalMinted] = true;
            reclaimable[totalMinted] = true;
            emit Minted(
                _receiver,
                totalMinted,
                _typeIndex,
                nftTypes[_typeIndex].nftType
            );
            totalMinted += 1;
        }
        updateTotalMintedOfType(_typeIndex, _amount);
    }

    function addAdmin(address _admin) public onlyOwner {
        require(TotalAdmins > adminsAdded, "addAdmin/can't-add-more");
        require(!isAdmin[_admin], "addAdmin/already-added");
        require(_admin != address(0), "addAdmin/invalid-address");
        require(_admin != owner(), "addAdmin/owner-can-not-be-admin");
        isAdmin[_admin] = true;
        adminsAdded += 1;
        emit AdminAdded(msg.sender, _admin);
    }

    function removeAdmin(address _admin) public onlyOwner {
        require(isAdmin[_admin], "removeAdmin/not-an-admin");
        require(msg.sender != _admin, "removeAdmin/can't-remove-self");
        isAdmin[_admin] = false;
        adminsAdded -= 1;
        emit AdminRemoved(msg.sender, _admin);
    }

    // set TotalSuppy for NFTType
    function setTotalSupplyForNFTType(
        string memory _typeName,
        uint256 _newTS
    ) public onlyValidTypeName(_typeName) whenNotPaused onlyAdmin {
        uint32 _typeIndex = typeNameIndexMap[_typeName];
        NodeNFTType memory nftType = nftTypes[_typeIndex];
        require(_newTS >= nftType.totalMinted, "invalid-new-totalSupply");
        require(_newTS != nftType.totalSupply, "same-totalSupply");
        emit TotalSupplyUpdated(
            msg.sender,
            nftType.nftType,
            nftType.totalSupply,
            _newTS
        );
        nftType.totalSupply = _newTS;
        nftTypes[_typeIndex] = nftType;
    }

    function getTotalSupplyForNFTType(
        string memory _typeName
    ) external view onlyValidTypeName(_typeName) returns (uint256) {
        uint32 _typeIndex = typeNameIndexMap[_typeName];
        NodeNFTType memory nftType = nftTypes[_typeIndex];
        return nftType.totalSupply;
    }

    // set default token uri of type
    function setDefaultUri(
        string memory _typeName,
        string memory _uri
    ) public onlyValidTypeName(_typeName) onlyAdmin {
        uint32 _typeIndex = typeNameIndexMap[_typeName];
        uriOfType[_typeIndex] = _uri;
    }

    function getDefaultUri(
        string memory _typeName
    ) external view onlyValidTypeName(_typeName) returns (string memory) {
        uint32 _typeIndex = typeNameIndexMap[_typeName];
        return uriOfType[_typeIndex];
    }

    // admin updates the token uri
    function setTokenUri(
        uint256 _tokenId,
        string memory _uri
    ) public tokenIDExists(_tokenId) onlyAdmin {
        updatedUri[_tokenId] = _uri;
        isUriUpdated[_tokenId] = true;
    }

    // get token uri
    function tokenURI(
        uint256 _tokenId
    ) public view virtual override returns (string memory) {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (isUriUpdated[_tokenId]) return updatedUri[_tokenId];
        else return uriOfType[nftTypeOfTokenId[_tokenId]];
    }

    // pause, unpause the contract
    function pause() public onlyOwner {
        _pause();
    }

    function unPause() public onlyOwner {
        _unpause();
    }

    // node nft type related
    function addNFTType(
        string memory _type,
        uint256 _ts,
        string memory _typeDefaultUri
    ) public whenNotPaused onlyAdmin {
        require(!isValidTypeName[_type], "type-name-already-exists");
        NodeNFTType memory nftType;
        nftType.nftType = _type;
        nftType.totalSupply = _ts;
        nftType.totalMinted = 0;
        nftTypes[nftTypeCount] = nftType;
        // set node type's default uri
        uriOfType[nftTypeCount] = _typeDefaultUri;
        typeNameIndexMap[_type] = nftTypeCount;
        isValidTypeName[_type] = true;
        nftTypeCount += 1;
        emit NFTTypeAdded(msg.sender, _type, _ts);
    }

    function getAllNFTTypes()
        external
        view
        returns (
            string[] memory,
            uint256[] memory,
            uint256[] memory,
            string[] memory
        )
    {
        string[] memory types = new string[](nftTypeCount);
        uint256[] memory totalSupplies = new uint256[](nftTypeCount);
        uint256[] memory totalMints = new uint256[](nftTypeCount);
        string[] memory uris = new string[](nftTypeCount);
        for (uint i = 0; i < nftTypeCount; ++i) {
            NodeNFTType memory nodeType = nftTypes[i];
            types[i] = nodeType.nftType;
            totalSupplies[i] = nodeType.totalSupply;
            totalMints[i] = nodeType.totalMinted;
            uris[i] = uriOfType[i];
        }
        return (types, totalSupplies, totalMints, uris);
    }

    // related to collateral
    function setCollateral(
        string memory _typeName,
        address _underlying,
        uint256 _amount
    ) public onlyValidTypeName(_typeName) whenNotPaused onlyAdmin {
        uint32 _typeIndex = typeNameIndexMap[_typeName];
        NodeNFTType memory nodeType = nftTypes[_typeIndex];
        require(_underlying.isContract(), "setCollateral-invalid-collateral");
        Collateral memory collat;
        collat.nftType = nodeType.nftType;
        collat.underlying = _underlying;
        collat.amount = _amount;
        collaterals[_typeIndex] = collat;
        emit CollateralSet(msg.sender, _typeIndex, _underlying, _amount);
    }

    // usability & reclaimability
    function setUsable(
        uint256 _tokenId,
        bool _isUsable
    ) public tokenIDExists(_tokenId) whenNotPaused onlyAdmin {
        usable[_tokenId] = _isUsable;
        emit UsabilityUpdated(msg.sender, _tokenId, _isUsable);
    }

    function setReclaimable(
        uint256 _tokenId,
        bool _isReclaimable
    ) public tokenIDExists(_tokenId) whenNotPaused onlyAdmin {
        reclaimable[_tokenId] = _isReclaimable;
        emit ReclaimabilityUpdated(msg.sender, _tokenId, _isReclaimable);
    }

    function getNFTType(
        uint256 _tokenId
    ) public view tokenIDExists(_tokenId) returns (uint32) {
        return nftTypeOfTokenId[_tokenId];
    }

    //
    function getNodeTypeAndCollateral(
        uint256 _tokenId
    )
        public
        view
        tokenIDExists(_tokenId)
        returns (uint256, uint256, address, uint256)
    {
        uint32 nftTypeIndex = nftTypeOfTokenId[_tokenId];
        Collateral memory collat = collaterals[nftTypeIndex];
        NodeNFTType memory nodeType = nftTypes[nftTypeIndex];
        return (
            nodeType.totalSupply,
            nodeType.totalMinted,
            collat.underlying,
            collat.amount
        );
    }

    function exists(uint256 _tokenId) public view returns (bool) {
        return _exists(_tokenId);
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    // get an available tokenID of node type from a certain address
    function getAvailableTokenID(
        string memory _typeName,
        address _holder
    ) public view onlyValidTypeName(_typeName) returns (uint256, bool) {
        uint256 walletBalance = balanceOf(_holder);
        if (walletBalance == 0) return (0, false);
        uint256 tokenID = 0;
        bool isFound = false;
        uint32 _nftTypeIndex = typeNameIndexMap[_typeName];
        for (uint i = 0; i < walletBalance; ++i) {
            uint256 id = tokenOfOwnerByIndex(_holder, i);
            if (nftTypeOfTokenId[id] == _nftTypeIndex) {
                tokenID = id;
                isFound = true;
                break;
            }
        }
        return (tokenID, isFound);
    }

    function isValidNodeNFTTypeIndex(
        uint32 _index
    ) public view override returns (bool) {
        return nftTypeCount > _index;
    }

    function getTypeNameFromIndex(
        uint32 _typeIndex
    ) public view override returns (string memory) {
        NodeNFTType memory nftType = nftTypes[_typeIndex];
        return nftType.nftType;
    }

    function getTypeIndexFromName(
        string memory _typeName
    ) public view override returns (uint32) {
        return typeNameIndexMap[_typeName];
    }

    // withdraw accidentally sent native currency
    function rescue(address to) public nonReentrant onlyOwner {
        uint256 amount = address(this).balance;
        (bool success, ) = payable(to).call{value: amount}("");
        require(success, "ether transfer failed");
    }

    // withdraw accidentally sent erc20 tokens
    function rescueToken(
        address _token,
        address to
    ) public nonReentrant onlyOwner {
        require(
            IERC20(_token).transfer(to, IERC20(_token).balanceOf(address(this)))
        );
    }

    // withdraw accidentally sent nft
    function rescueNFT(
        address _receiver,
        address _nft,
        uint256 _id
    ) public nonReentrant whenNotPaused onlyOwner {
        require(
            IERC721(_nft).ownerOf(_id) == address(this),
            "rescue/invalid-id"
        );
        IERC721(_nft).transferFrom(address(this), _receiver, _id);
    }

    // royalty part

    function setDefaultRoyalty(
        address _receiver,
        uint96 _feeNumerator
    ) public whenNotPaused onlyAdmin {
        require(
            _feeNumerator <= royaltyFeeDenominator() / 10,
            "defaultRoyalty/too-big"
        );
        emit DefaultRoyaltyChanged(msg.sender, _feeNumerator, _receiver);
        _setDefaultRoyalty(_receiver, _feeNumerator);
    }

    function deleteDefaultRoyalty() public whenNotPaused onlyAdmin {
        _deleteDefaultRoyalty();
    }

    function setTokenRoyalty(
        uint256 _tokenId,
        address _receiver,
        uint96 _feeNumerator
    ) public whenNotPaused tokenIDExists(_tokenId) onlyAdmin {
        require(
            _feeNumerator <= royaltyFeeDenominator() / 10,
            "defaultRoyalty/too-big"
        );
        emit TokenRoyaltyChanged(
            msg.sender,
            _tokenId,
            _feeNumerator,
            _receiver
        );
        _setTokenRoyalty(_tokenId, _receiver, _feeNumerator);
    }

    function resetTokenRoyalty(
        uint256 _tokenId
    ) public whenNotPaused tokenIDExists(_tokenId) onlyAdmin {
        _resetTokenRoyalty(_tokenId);
    }

    function getTokenRoyalty(
        uint256 _tokenId
    ) external view tokenIDExists(_tokenId) returns (address, uint96) {
        return _getTokenRoyalty(_tokenId);
    }

    function royaltyFeeDenominator() public view returns (uint96) {
        return _feeDenominator();
    }

    function updateTotalMintedOfType(
        uint32 _indexType,
        uint256 _amount
    ) private {
        NodeNFTType memory nodeType = nftTypes[_indexType];
        uint256 prevMintedAmt = nodeType.totalMinted;
        nodeType.totalMinted = prevMintedAmt + _amount;
        nftTypes[_indexType] = nodeType;
    }

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

    function supportsInterface(
        bytes4 interfaceId
    )
        public
        view
        virtual
        override(ERC721Enumerable, ERC721RoyaltyDetailed)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function burn(uint256 tokenID) external {
        _burn(tokenID);
    }

    function _burn(
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721RoyaltyDetailed) {
        require(ownerOf(tokenId) == msg.sender, "burn/unauthorised");
        ERC721RoyaltyDetailed._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }

    receive() external payable {}

    fallback() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"added","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"removed","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"nodeTypeIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"underlying","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollateralSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"newRoyalty","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"}],"name":"DefaultRoyaltyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"typeIndex","type":"uint32"},{"indexed":true,"internalType":"string","name":"nftType","type":"string"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"string","name":"nftType","type":"string"},{"indexed":true,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"NFTTypeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":true,"internalType":"bool","name":"reclaimability","type":"bool"}],"name":"ReclaimabilityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newRoyalty","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"}],"name":"TokenRoyaltyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"string","name":"nftType","type":"string"},{"indexed":false,"internalType":"uint256","name":"oldTotalSupply","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newTotalSupply","type":"uint256"}],"name":"TotalSupplyUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":true,"internalType":"bool","name":"usability","type":"bool"}],"name":"UsabilityUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_type","type":"string"},{"internalType":"uint256","name":"_ts","type":"uint256"},{"internalType":"string","name":"_typeDefaultUri","type":"string"}],"name":"addNFTType","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":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collaterals","outputs":[{"internalType":"string","name":"nftType","type":"string"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllNFTTypes","outputs":[{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_typeName","type":"string"},{"internalType":"address","name":"_holder","type":"address"}],"name":"getAvailableTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultRoyalty","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_typeName","type":"string"}],"name":"getDefaultUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getNFTType","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getNodeTypeAndCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenRoyalty","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_typeName","type":"string"}],"name":"getTotalSupplyForNFTType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_typeName","type":"string"}],"name":"getTypeIndexFromName","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_typeIndex","type":"uint32"}],"name":"getTypeNameFromIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint32","name":"_index","type":"uint32"}],"name":"isValidNodeNFTTypeIndex","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"isValidTypeName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_typeName","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftTypeCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftTypes","outputs":[{"internalType":"string","name":"nftType","type":"string"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"totalMinted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reclaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"rescueNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyFeeDenominator","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_typeName","type":"string"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_typeName","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setDefaultUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_isReclaimable","type":"bool"}],"name":"setReclaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_typeName","type":"string"},{"internalType":"uint256","name":"_newTS","type":"uint256"}],"name":"setTotalSupplyForNFTType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_isUsable","type":"bool"}],"name":"setUsable","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600f556012805460ff191690556019805463ffffffff191690553480156200002d57600080fd5b5060405162005822380380620058228339810160408190526200005091620001be565b81816002620000608382620002b7565b5060036200006f8282620002b7565b5050506200008c62000086620000a360201b60201c565b620000a7565b50506001600d55600e805460ff1916905562000383565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200012157600080fd5b81516001600160401b03808211156200013e576200013e620000f9565b604051601f8301601f19908116603f01168101908282118183101715620001695762000169620000f9565b816040528381526020925086838588010111156200018657600080fd5b600091505b83821015620001aa57858201830151818301840152908201906200018b565b600093810190920192909252949350505050565b60008060408385031215620001d257600080fd5b82516001600160401b0380821115620001ea57600080fd5b620001f8868387016200010f565b935060208501519150808211156200020f57600080fd5b506200021e858286016200010f565b9150509250929050565b600181811c908216806200023d57607f821691505b6020821081036200025e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002b257600081815260208120601f850160051c810160208610156200028d5750805b601f850160051c820191505b81811015620002ae5782815560010162000299565b5050505b505050565b81516001600160401b03811115620002d357620002d3620000f9565b620002eb81620002e4845462000228565b8462000264565b602080601f8311600181146200032357600084156200030a5750858301515b600019600386901b1c1916600185901b178555620002ae565b600085815260208120601f198616915b82811015620003545788860151825594840194600190910190840162000333565b5085821015620003735787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61548f80620003936000396000f3fe6080604052600436106103815760003560e01c806367603b0b116101cf578063913d9e1b11610101578063c87b56dd1161009a578063e985e9c51161006c578063e985e9c514610bdf578063f2fde38b14610c28578063f7b188a514610c48578063fa644c2014610c5d57005b8063c87b56dd14610b4f578063c8dafdbf14610b6f578063d26b496814610b9f578063d3fc986414610bbf57005b8063a2309ff8116100d3578063a2309ff814610ae4578063a2b2e87014610afa578063aa1b103f14610b1a578063b88d4fde14610b2f57005b8063913d9e1b14610a7257806395d89b4114610a8f5780639c13cd4d14610aa4578063a22cb46514610ac457005b80637a99d804116101735780638a616bc0116101455780638a616bc0146109e45780638cabe05a14610a045780638d6f8cef14610a345780638da5cb5b14610a5457005b80637a99d80414610948578063833b7b7814610968578063839006f2146109af5780638456cb59146109cf57005b806370a08231116101ac57806370a08231146108c4578063715018a6146108e457806375573f7e146108f957806379b2ab231461091957005b806367603b0b1461085f578063704802751461087f57806370789fe71461089f57005b80632aa65a7f116102b35780634f6ccce71161024c5780635944c7531161021e5780635944c753146107d25780635c975abb146107f25780635cb960e31461080a5780636352211e1461083f57005b80634f6ccce71461072d5780634ff4ae7d1461074d578063500c33321461078257806357f7789e146107b257005b806342842e0e1161028557806342842e0e146106ad57806342966c68146106cd5780634707d000146106ed5780634f558e791461070d57005b80632aa65a7f146106155780632f707f7d146106505780632f745c591461066d5780632fb12e301461068d57005b806315dc0c981161032557806323b872dd116102f757806323b872dd1461055757806324c1173b1461057757806324d7806c146105a65780632a55205a146105d657005b806315dc0c98146104a757806316458cb5146104f65780631785f53c1461052257806318160ddd1461054257005b80630554654f1161035e5780630554654f146103ff57806306fdde031461042d578063081812fc1461044f578063095ea7b31461048757005b8063016be9751461038a57806301ffc9a7146103aa57806304634d8d146103df57005b3661038857005b005b34801561039657600080fd5b506103886103a53660046147bb565b610c7d565b3480156103b657600080fd5b506103ca6103c5366004614801565b610d60565b60405190151581526020015b60405180910390f35b3480156103eb57600080fd5b506103886103fa366004614851565b610d8b565b34801561040b57600080fd5b5061041f61041a366004614931565b610ea4565b6040519081526020016103d6565b34801561043957600080fd5b50610442610fe1565b6040516103d691906149b5565b34801561045b57600080fd5b5061046f61046a3660046149c8565b611073565b6040516001600160a01b0390911681526020016103d6565b34801561049357600080fd5b506103886104a23660046149e1565b61109a565b3480156104b357600080fd5b506104c76104c23660046149c8565b6111af565b6040516103d6949392919093845260208401929092526001600160a01b03166040830152606082015260800190565b34801561050257600080fd5b506103ca610511366004614a0d565b60195463ffffffff91821691161190565b34801561052e57600080fd5b5061038861053d366004614a33565b6113b0565b34801561054e57600080fd5b5060105461041f565b34801561056357600080fd5b50610388610572366004614a50565b611509565b34801561058357600080fd5b506105976105923660046149c8565b61153a565b6040516103d693929190614a91565b3480156105b257600080fd5b506103ca6105c1366004614a33565b60116020526000908152604090205460ff1681565b3480156105e257600080fd5b506105f66105f1366004614abf565b6115ee565b604080516001600160a01b0390931683526020830191909152016103d6565b34801561062157600080fd5b506103ca610630366004614931565b805160208183018101805160188252928201919093012091525460ff1681565b34801561065c57600080fd5b5060405161271081526020016103d6565b34801561067957600080fd5b5061041f6106883660046149e1565b61169a565b34801561069957600080fd5b506103886106a8366004614ae1565b611730565b3480156106b957600080fd5b506103886106c8366004614a50565b6119f9565b3480156106d957600080fd5b506103886106e83660046149c8565b611a14565b3480156106f957600080fd5b50610388610708366004614b29565b611a20565b34801561071957600080fd5b506103ca6107283660046149c8565b611b24565b34801561073957600080fd5b5061041f6107483660046149c8565b611b43565b34801561075957600080fd5b5061076d610768366004614b57565b611bd6565b604080519283529015156020830152016103d6565b34801561078e57600080fd5b506103ca61079d3660046149c8565b601d6020526000908152604090205460ff1681565b3480156107be57600080fd5b506103886107cd366004614b9d565b611ccd565b3480156107de57600080fd5b506103886107ed366004614be3565b611d7c565b3480156107fe57600080fd5b50600e5460ff166103ca565b34801561081657600080fd5b5061082a6108253660046149c8565b611ec0565b60405163ffffffff90911681526020016103d6565b34801561084b57600080fd5b5061046f61085a3660046149c8565b611f02565b34801561086b57600080fd5b5061038861087a366004614c21565b611f62565b34801561088b57600080fd5b5061038861089a366004614a33565b61203f565b3480156108ab57600080fd5b506108b4612257565b6040516103d69493929190614d0a565b3480156108d057600080fd5b5061041f6108df366004614a33565b6125c7565b3480156108f057600080fd5b5061038861264d565b34801561090557600080fd5b50610442610914366004614a0d565b612661565b34801561092557600080fd5b506109396109343660046149c8565b612738565b6040516103d693929190614d62565b34801561095457600080fd5b50610442610963366004614931565b6127e2565b34801561097457600080fd5b506109886109833660046149c8565b6128f0565b604080516001600160a01b0390931683526001600160601b039091166020830152016103d6565b3480156109bb57600080fd5b506103886109ca366004614a33565b61292c565b3480156109db57600080fd5b506103886129e3565b3480156109f057600080fd5b506103886109ff3660046149c8565b6129f3565b348015610a1057600080fd5b506000546001600160a01b03811690600160a01b90046001600160601b0316610988565b348015610a4057600080fd5b50610388610a4f366004614d87565b612a86565b348015610a6057600080fd5b50600c546001600160a01b031661046f565b348015610a7e57600080fd5b5060195461082a9063ffffffff1681565b348015610a9b57600080fd5b50610442612d45565b348015610ab057600080fd5b50610388610abf366004614a50565b612d54565b348015610ad057600080fd5b50610388610adf366004614dcb565b612e93565b348015610af057600080fd5b5061041f600f5481565b348015610b0657600080fd5b50610388610b15366004614df9565b612e9e565b348015610b2657600080fd5b50610388613102565b348015610b3b57600080fd5b50610388610b4a366004614e65565b613166565b348015610b5b57600080fd5b50610442610b6a3660046149c8565b613198565b348015610b7b57600080fd5b506103ca610b8a3660046149c8565b601c6020526000908152604090205460ff1681565b348015610bab57600080fd5b5061082a610bba366004614931565b6132fd565b348015610bcb57600080fd5b50610388610bda366004614ee4565b61332b565b348015610beb57600080fd5b506103ca610bfa366004614b29565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610c3457600080fd5b50610388610c43366004614a33565b613696565b348015610c5457600080fd5b5061038861370c565b348015610c6957600080fd5b50610388610c783660046147bb565b61371c565b81610c8781611b24565b610cac5760405162461bcd60e51b8152600401610ca390614f32565b60405180910390fd5b610cb46137ed565b3360009081526011602052604090205460ff1680610ceb575033610ce0600c546001600160a01b031690565b6001600160a01b0316145b610d075760405162461bcd60e51b8152600401610ca390614f5b565b6000838152601d6020908152604091829020805460ff1916851515908117909155915133815285917f4113d5911a4878c63e6b73318e14fd183187527749fc7949511b6327a8e1506591015b60405180910390a3505050565b60006001600160e01b0319821663780e9d6360e01b1480610d855750610d8582613833565b92915050565b610d936137ed565b3360009081526011602052604090205460ff1680610dca575033610dbf600c546001600160a01b031690565b6001600160a01b0316145b610de65760405162461bcd60e51b8152600401610ca390614f5b565b610df3600a612710614fb3565b6001600160601b0316816001600160601b03161115610e4d5760405162461bcd60e51b815260206004820152601660248201527564656661756c74526f79616c74792f746f6f2d62696760501b6044820152606401610ca3565b6040513381526001600160a01b038316906001600160601b038316907f6e8b991c2d49dbf8fa5811e471d97c00c6a61fc1696050a37f70b21b97bf4c539060200160405180910390a3610ea08282613858565b5050565b600081601881604051610eb79190614fd9565b9081526040519081900360200190205460ff16610ee65760405162461bcd60e51b8152600401610ca390614ff5565b6000601784604051610ef89190614fd9565b90815260408051602092819003830181205463ffffffff166000818152601690945282842060608301909352825490945090919082908290610f3990615020565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6590615020565b8015610fb25780601f10610f8757610100808354040283529160200191610fb2565b820191906000526020600020905b815481529060010190602001808311610f9557829003601f168201915b505050505081526020016001820154815260200160028201548152505090508060200151935050505b50919050565b606060028054610ff090615020565b80601f016020809104026020016040519081016040528092919081815260200182805461101c90615020565b80156110695780601f1061103e57610100808354040283529160200191611069565b820191906000526020600020905b81548152906001019060200180831161104c57829003601f168201915b5050505050905090565b600061107e82613912565b506000908152600660205260409020546001600160a01b031690565b60006110a582611f02565b9050806001600160a01b0316836001600160a01b0316036111125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ca3565b336001600160a01b038216148061112e575061112e8133610bfa565b6111a05760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610ca3565b6111aa8383613971565b505050565b600080600080846111bf81611b24565b6111db5760405162461bcd60e51b8152600401610ca390614f32565b6000868152601b602090815260408083205463ffffffff16808452601a90925280832081516060810190925280549293928290829061121990615020565b80601f016020809104026020016040519081016040528092919081815260200182805461124590615020565b80156112925780601f1061126757610100808354040283529160200191611292565b820191906000526020600020905b81548152906001019060200180831161127557829003601f168201915b505050918352505060018201546001600160a01b031660208083019190915260029092015460409182015263ffffffff85166000908152601690925280822081516060810190925280549394509192909190829082906112f190615020565b80601f016020809104026020016040519081016040528092919081815260200182805461131d90615020565b801561136a5780601f1061133f5761010080835404028352916020019161136a565b820191906000526020600020905b81548152906001019060200180831161134d57829003601f168201915b5050505050815260200160018201548152602001600282015481525050905080602001518160400151836020015184604001519750975097509750505050509193509193565b6113b86139df565b6001600160a01b03811660009081526011602052604090205460ff166114205760405162461bcd60e51b815260206004820152601860248201527f72656d6f766541646d696e2f6e6f742d616e2d61646d696e00000000000000006044820152606401610ca3565b6001600160a01b03811633036114785760405162461bcd60e51b815260206004820152601d60248201527f72656d6f766541646d696e2f63616e27742d72656d6f76652d73656c660000006044820152606401610ca3565b6001600160a01b0381166000908152601160205260408120805460ff1916905560128054600192906114ae90849060ff16615054565b92506101000a81548160ff021916908360ff160217905550806001600160a01b0316336001600160a01b03167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce60405160405180910390a350565b6115133382613a39565b61152f5760405162461bcd60e51b8152600401610ca39061506d565b6111aa838383613ab8565b601a6020526000908152604090208054819061155590615020565b80601f016020809104026020016040519081016040528092919081815260200182805461158190615020565b80156115ce5780601f106115a3576101008083540402835291602001916115ce565b820191906000526020600020905b8154815290600101906020018083116115b157829003601f168201915b50505050600183015460029093015491926001600160a01b031691905083565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916116635750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611682906001600160601b0316876150ba565b61168c91906150d1565b915196919550909350505050565b60006116a5836125c7565b82106117075760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ca3565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b826018816040516117419190614fd9565b9081526040519081900360200190205460ff166117705760405162461bcd60e51b8152600401610ca390614ff5565b6117786137ed565b3360009081526011602052604090205460ff16806117af5750336117a4600c546001600160a01b031690565b6001600160a01b0316145b6117cb5760405162461bcd60e51b8152600401610ca390614f5b565b60006017856040516117dd9190614fd9565b90815260408051602092819003830181205463ffffffff16600081815260169094528284206060830190935282549094509091908290829061181e90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461184a90615020565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b50505091835250506001820154602082015260029091015460409091015290506001600160a01b0385163b61190e5760405162461bcd60e51b815260206004820181905260248201527f736574436f6c6c61746572616c2d696e76616c69642d636f6c6c61746572616c6044820152606401610ca3565b61193b60405180606001604052806060815260200160006001600160a01b03168152602001600081525090565b815181526001600160a01b038616602080830191909152604080830187905263ffffffff85166000908152601a90925290208151829190819061197e9082615133565b506020828101516001830180546001600160a01b0319166001600160a01b03928316179055604093840151600290930192909255915133815287929189169163ffffffff8716917fb84f729e50ae63635c3b7815c9a5b16c2f4163cef6d8bebe6aae9c39c421ad54910160405180910390a450505050505050565b6111aa83838360405180602001604052806000815250613166565b611a1d81613c6e565b50565b611a28613cdc565b611a306139df565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa291906151f2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b11919061520b565b611b1a57600080fd5b610ea06001600d55565b6000818152600460205260408120546001600160a01b03161515610d85565b6000611b4e600a5490565b8210611bb15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ca3565b600a8281548110611bc457611bc4615228565b90600052602060002001549050919050565b60008083601881604051611bea9190614fd9565b9081526040519081900360200190205460ff16611c195760405162461bcd60e51b8152600401610ca390614ff5565b6000611c24856125c7565b905080600003611c3b576000809350935050611cc5565b6000806000601789604051611c509190614fd9565b9081526040519081900360200190205463ffffffff16905060005b84811015611cbc576000611c7f8a8361169a565b6000818152601b602052604090205490915063ffffffff808516911603611cab57935060019250611cbc565b50611cb58161523e565b9050611c6b565b50919550935050505b509250929050565b81611cd781611b24565b611cf35760405162461bcd60e51b8152600401610ca390614f32565b3360009081526011602052604090205460ff1680611d2a575033611d1f600c546001600160a01b031690565b6001600160a01b0316145b611d465760405162461bcd60e51b8152600401610ca390614f5b565b6000838152601360205260409020611d5e8382615133565b5050506000908152601460205260409020805460ff19166001179055565b611d846137ed565b82611d8e81611b24565b611daa5760405162461bcd60e51b8152600401610ca390614f32565b3360009081526011602052604090205460ff1680611de1575033611dd6600c546001600160a01b031690565b6001600160a01b0316145b611dfd5760405162461bcd60e51b8152600401610ca390614f5b565b611e0a600a612710614fb3565b6001600160601b0316826001600160601b03161115611e645760405162461bcd60e51b815260206004820152601660248201527564656661756c74526f79616c74792f746f6f2d62696760501b6044820152606401610ca3565b6040513381526001600160a01b038416906001600160601b0384169086907f768d79acdc34ccf6f78ea4757874c38b18d939c1863ded46a7b8f7a1c52581149060200160405180910390a4611eba848484613d35565b50505050565b600081611ecc81611b24565b611ee85760405162461bcd60e51b8152600401610ca390614f32565b50506000908152601b602052604090205463ffffffff1690565b6000818152600460205260408120546001600160a01b031680610d855760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610ca3565b81601881604051611f739190614fd9565b9081526040519081900360200190205460ff16611fa25760405162461bcd60e51b8152600401610ca390614ff5565b3360009081526011602052604090205460ff1680611fd9575033611fce600c546001600160a01b031690565b6001600160a01b0316145b611ff55760405162461bcd60e51b8152600401610ca390614f5b565b60006017846040516120079190614fd9565b90815260408051602092819003830190205463ffffffff166000818152601590935291209091506120388482615133565b5050505050565b6120476139df565b60125460ff1660021161209c5760405162461bcd60e51b815260206004820152601760248201527f61646441646d696e2f63616e27742d6164642d6d6f72650000000000000000006044820152606401610ca3565b6001600160a01b03811660009081526011602052604090205460ff16156120fe5760405162461bcd60e51b815260206004820152601660248201527518591910591b5a5b8bd85b1c9958591e4b585919195960521b6044820152606401610ca3565b6001600160a01b0381166121545760405162461bcd60e51b815260206004820152601860248201527f61646441646d696e2f696e76616c69642d6164647265737300000000000000006044820152606401610ca3565b600c546001600160a01b03166001600160a01b0316816001600160a01b0316036121c05760405162461bcd60e51b815260206004820152601f60248201527f61646441646d696e2f6f776e65722d63616e2d6e6f742d62652d61646d696e006044820152606401610ca3565b6001600160a01b0381166000908152601160205260408120805460ff1916600190811790915560128054919290916121fc90849060ff16615257565b92506101000a81548160ff021916908360ff160217905550806001600160a01b0316336001600160a01b03167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a350565b60195460609081908190819060009063ffffffff166001600160401b0381111561228357612283614886565b6040519080825280602002602001820160405280156122b657816020015b60608152602001906001900390816122a15790505b5060195490915060009063ffffffff166001600160401b038111156122dd576122dd614886565b604051908082528060200260200182016040528015612306578160200160208202803683370190505b5060195490915060009063ffffffff166001600160401b0381111561232d5761232d614886565b604051908082528060200260200182016040528015612356578160200160208202803683370190505b5060195490915060009063ffffffff166001600160401b0381111561237d5761237d614886565b6040519080825280602002602001820160405280156123b057816020015b606081526020019060019003908161239b5790505b50905060005b60195463ffffffff168110156125b8576000818152601660205260408082208151606081019092528054829082906123ed90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461241990615020565b80156124665780601f1061243b57610100808354040283529160200191612466565b820191906000526020600020905b81548152906001019060200180831161244957829003601f168201915b50505050508152602001600182015481526020016002820154815250509050806000015186838151811061249c5761249c615228565b602002602001018190525080602001518583815181106124be576124be615228565b60200260200101818152505080604001518483815181106124e1576124e1615228565b60200260200101818152505060156000838152602001908152602001600020805461250b90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461253790615020565b80156125845780601f1061255957610100808354040283529160200191612584565b820191906000526020600020905b81548152906001019060200180831161256757829003601f168201915b505050505083838151811061259b5761259b615228565b602002602001018190525050806125b19061523e565b90506123b6565b50929791965094509092509050565b60006001600160a01b0382166126315760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610ca3565b506001600160a01b031660009081526005602052604090205490565b6126556139df565b61265f6000613e00565b565b60606000601660008463ffffffff16815260200190815260200160002060405180606001604052908160008201805461269990615020565b80601f01602080910402602001604051908101604052809291908181526020018280546126c590615020565b80156127125780601f106126e757610100808354040283529160200191612712565b820191906000526020600020905b8154815290600101906020018083116126f557829003601f168201915b505050918352505060018201546020820152600290910154604090910152519392505050565b60166020526000908152604090208054819061275390615020565b80601f016020809104026020016040519081016040528092919081815260200182805461277f90615020565b80156127cc5780601f106127a1576101008083540402835291602001916127cc565b820191906000526020600020905b8154815290600101906020018083116127af57829003601f168201915b5050505050908060010154908060020154905083565b6060816018816040516127f59190614fd9565b9081526040519081900360200190205460ff166128245760405162461bcd60e51b8152600401610ca390614ff5565b60006017846040516128369190614fd9565b90815260408051602092819003830190205463ffffffff1660008181526015909352912080549192509061286990615020565b80601f016020809104026020016040519081016040528092919081815260200182805461289590615020565b80156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b505050505092505050919050565b600080826128fd81611b24565b6129195760405162461bcd60e51b8152600401610ca390614f32565b61292284613e52565b9250925050915091565b612934613cdc565b61293c6139df565b60405147906000906001600160a01b0384169083908381818185875af1925050503d8060008114612989576040519150601f19603f3d011682016040523d82523d6000602084013e61298e565b606091505b50509050806129d75760405162461bcd60e51b8152602060048201526015602482015274195d1a195c881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610ca3565b5050611a1d6001600d55565b6129eb6139df565b61265f613ed9565b6129fb6137ed565b80612a0581611b24565b612a215760405162461bcd60e51b8152600401610ca390614f32565b3360009081526011602052604090205460ff1680612a58575033612a4d600c546001600160a01b031690565b6001600160a01b0316145b612a745760405162461bcd60e51b8152600401610ca390614f5b565b50600090815260016020526040812055565b81601881604051612a979190614fd9565b9081526040519081900360200190205460ff16612ac65760405162461bcd60e51b8152600401610ca390614ff5565b612ace6137ed565b3360009081526011602052604090205460ff1680612b05575033612afa600c546001600160a01b031690565b6001600160a01b0316145b612b215760405162461bcd60e51b8152600401610ca390614f5b565b6000601784604051612b339190614fd9565b90815260408051602092819003830181205463ffffffff166000818152601690945282842060608301909352825490945090919082908290612b7490615020565b80601f0160208091040260200160405190810160405280929190818152602001828054612ba090615020565b8015612bed5780601f10612bc257610100808354040283529160200191612bed565b820191906000526020600020905b815481529060010190602001808311612bd057829003601f168201915b505050505081526020016001820154815260200160028201548152505090508060400151841015612c605760405162461bcd60e51b815260206004820152601760248201527f696e76616c69642d6e65772d746f74616c537570706c790000000000000000006044820152606401610ca3565b80602001518403612ca65760405162461bcd60e51b815260206004820152601060248201526f73616d652d746f74616c537570706c7960801b6044820152606401610ca3565b80516040518591612cb691614fd9565b6040805191829003822060208086015133855290840152917fc750dedef64bbdd30a5772b5cc11c6890baca6ed80a6de398b17f065b8a9c858910160405180910390a3602080820185905263ffffffff8316600090815260169091526040902081518291908190612d279082615133565b50602082015160018201556040909101516002909101555050505050565b606060038054610ff090615020565b612d5c613cdc565b612d646137ed565b612d6c6139df565b6040516331a9108f60e11b81526004810182905230906001600160a01b03841690636352211e90602401602060405180830381865afa158015612db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd79190615270565b6001600160a01b031614612e215760405162461bcd60e51b81526020600482015260116024820152701c995cd8dd594bda5b9d985b1a590b5a59607a1b6044820152606401610ca3565b6040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018390528316906323b872dd90606401600060405180830381600087803b158015612e7157600080fd5b505af1158015612e85573d6000803e3d6000fd5b505050506111aa6001600d55565b610ea0338383613f33565b612ea66137ed565b3360009081526011602052604090205460ff1680612edd575033612ed2600c546001600160a01b031690565b6001600160a01b0316145b612ef95760405162461bcd60e51b8152600401610ca390614f5b565b601883604051612f099190614fd9565b9081526040519081900360200190205460ff1615612f695760405162461bcd60e51b815260206004820152601860248201527f747970652d6e616d652d616c72656164792d65786973747300000000000000006044820152606401610ca3565b612f8d60405180606001604052806060815260200160008152602001600081525090565b83815260208082018490526000604080840182905260195463ffffffff16825260169092522081518291908190612fc49082615133565b50602082810151600183015560409283015160029092019190915560195463ffffffff166000908152601590915220612ffd8382615133565b5060195460405163ffffffff9091169060179061301b908790614fd9565b908152602001604051809103902060006101000a81548163ffffffff021916908363ffffffff16021790555060016018856040516130599190614fd9565b908152604051908190036020019020805491151560ff19909216919091179055601980546001919060009061309590849063ffffffff1661528d565b92506101000a81548163ffffffff021916908363ffffffff16021790555082846040516130c29190614fd9565b604051908190038120338252907f5a99af48dc1ee889e1b8493ef14f3dc3b82011206c77f094789a17abb49a9f409060200160405180910390a350505050565b61310a6137ed565b3360009081526011602052604090205460ff1680613141575033613136600c546001600160a01b031690565b6001600160a01b0316145b61315d5760405162461bcd60e51b8152600401610ca390614f5b565b61265f60008055565b6131703383613a39565b61318c5760405162461bcd60e51b8152600401610ca39061506d565b611eba84848484613ff9565b6000818152600460205260409020546060906001600160a01b03166132175760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ca3565b60008281526014602052604090205460ff16156132cc576000828152601360205260409020805461324790615020565b80601f016020809104026020016040519081016040528092919081815260200182805461327390615020565b80156132c05780601f10613295576101008083540402835291602001916132c0565b820191906000526020600020905b8154815290600101906020018083116132a357829003601f168201915b50505050509050919050565b6000828152601b602090815260408083205463ffffffff16835260159091529020805461324790615020565b919050565b600060178260405161330f9190614fd9565b9081526040519081900360200190205463ffffffff1692915050565b8060188160405161333c9190614fd9565b9081526040519081900360200190205460ff1661336b5760405162461bcd60e51b8152600401610ca390614ff5565b613373613cdc565b61337b6137ed565b3360009081526011602052604090205460ff16806133b25750336133a7600c546001600160a01b031690565b6001600160a01b0316145b6133ce5760405162461bcd60e51b8152600401610ca390614f5b565b6001600160a01b03841661341a5760405162461bcd60e51b815260206004820152601360248201527262617463684d696e742d302d6164647265737360681b6044820152606401610ca3565b600060178360405161342c9190614fd9565b90815260408051602092819003830181205463ffffffff16600081815260169094528284206060830190935282549094509091908290829061346d90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461349990615020565b80156134e65780601f106134bb576101008083540402835291602001916134e6565b820191906000526020600020905b8154815290600101906020018083116134c957829003601f168201915b5050509183525050600182015460208083019190915260029092015460409182015290820151908201519192509061351e87826152b1565b8210156135795760405162461bcd60e51b8152602060048201526024808201527f62617463684d696e742d6d6f72652d7468616e2d747970652d746f74616c537560448201526370706c7960e01b6064820152608401610ca3565b60005b8781101561367d5761359089600f5461402c565b600f80546000908152601b60209081526040808320805463ffffffff191663ffffffff8b1690811790915584548452601c8352818420805460ff19908116600190811790925595548552601d845282852080549096161790945592825260169052819020905161360091906152c4565b60405180910390208563ffffffff168a6001600160a01b03167f9bf2091a0a0194755b935cb0f3fea3655447a60d66152e69ef67391f725db504600f5460405161364c91815260200190565b60405180910390a46001600f600082825461366791906152b1565b9091555061367690508161523e565b905061357c565b50613688848861417a565b50505050611eba6001600d55565b61369e6139df565b6001600160a01b0381166137035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca3565b611a1d81613e00565b6137146139df565b61265f614298565b8161372681611b24565b6137425760405162461bcd60e51b8152600401610ca390614f32565b61374a6137ed565b3360009081526011602052604090205460ff1680613781575033613776600c546001600160a01b031690565b6001600160a01b0316145b61379d5760405162461bcd60e51b8152600401610ca390614f5b565b6000838152601c6020908152604091829020805460ff1916851515908117909155915133815285917fd20ef8f4b34e3190a922e45caf3f60ff0d0661b89d9fca40cb0c54f7792c55d69101610d53565b600e5460ff161561265f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ca3565b60006001600160e01b0319821663780e9d6360e01b1480610d855750610d85826142d1565b6127106001600160601b03821611156138835760405162461bcd60e51b8152600401610ca39061533a565b6001600160a01b0382166138d95760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610ca3565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b6000818152600460205260409020546001600160a01b0316611a1d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610ca3565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906139a682611f02565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0316331461265f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca3565b600080613a4583611f02565b9050806001600160a01b0316846001600160a01b03161480613a8c57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80613ab05750836001600160a01b0316613aa584611073565b6001600160a01b0316145b949350505050565b826001600160a01b0316613acb82611f02565b6001600160a01b031614613b2f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ca3565b6001600160a01b038216613b915760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ca3565b613b9c8383836142dc565b600081815260066020908152604080832080546001600160a01b03191690556001600160a01b038616835260059091528120805460019290613bdf908490615384565b90915550506001600160a01b0382166000908152600560205260408120805460019290613c0d9084906152b1565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b33613c7882611f02565b6001600160a01b031614613cc25760405162461bcd60e51b8152602060048201526011602482015270189d5c9b8bdd5b985d5d1a1bdc9a5cd959607a1b6044820152606401610ca3565b613ccb816142e7565b600090815260016020526040812055565b6002600d5403613d2e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca3565b6002600d55565b6127106001600160601b0382161115613d605760405162461bcd60e51b8152600401610ca39061533a565b6001600160a01b038216613db65760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610ca3565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600190529190942093519051909116600160a01b029116179055565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008181526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291613ec75750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b80516020909101519094909350915050565b613ee16137ed565b600e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613f163390565b6040516001600160a01b03909116815260200160405180910390a1565b816001600160a01b0316836001600160a01b031603613f945760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ca3565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610d53565b614004848484613ab8565b614010848484846142f0565b611eba5760405162461bcd60e51b8152600401610ca390615397565b6001600160a01b0382166140825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ca3565b6000818152600460205260409020546001600160a01b0316156140e75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ca3565b6140f3600083836142dc565b6001600160a01b038216600090815260056020526040812080546001929061411c9084906152b1565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b63ffffffff82166000908152601660205260408082208151606081019092528054829082906141a890615020565b80601f01602080910402602001604051908101604052809291908181526020018280546141d490615020565b80156142215780601f106141f657610100808354040283529160200191614221565b820191906000526020600020905b81548152906001019060200180831161420457829003601f168201915b50505091835250506001820154602082015260029091015460409182015281015190915061424f83826152b1565b60408084019190915263ffffffff851660009081526016602052208251839190819061427b9082615133565b506020820151600182015560409091015160029091015550505050565b6142a06143f1565b600e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613f16565b6000610d858261443a565b6111aa83838361447a565b613ccb81614532565b60006001600160a01b0384163b156143e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906143349033908990889088906004016153e9565b6020604051808303816000875af192505050801561436f575060408051601f3d908101601f1916820190925261436c91810190615426565b60015b6143cc573d80801561439d576040519150601f19603f3d011682016040523d82523d6000602084013e6143a2565b606091505b5080516000036143c45760405162461bcd60e51b8152600401610ca390615397565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613ab0565b506001949350505050565b600e5460ff1661265f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ca3565b60006001600160e01b031982166380ac58cd60e01b148061446b57506001600160e01b03198216635b5e139f60e01b145b80610d855750610d85826145e8565b6001600160a01b0383166144d5576144d081600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6144f8565b816001600160a01b0316836001600160a01b0316146144f8576144f8838261461d565b6001600160a01b03821661450f576111aa816146ba565b826001600160a01b0316826001600160a01b0316146111aa576111aa8282614769565b600061453d82611f02565b905061454b816000846142dc565b600082815260066020908152604080832080546001600160a01b03191690556001600160a01b03841683526005909152812080546001929061458e908490615384565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b0319821663152a902d60e11b1480610d8557506301ffc9a760e01b6001600160e01b0319831614610d85565b6000600161462a846125c7565b6146349190615384565b600083815260096020526040902054909150808214614687576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906146cc90600190615384565b6000838152600b6020526040812054600a80549394509092849081106146f4576146f4615228565b9060005260206000200154905080600a838154811061471557614715615228565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061474d5761474d615443565b6001900381819060005260206000200160009055905550505050565b6000614774836125c7565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8015158114611a1d57600080fd5b600080604083850312156147ce57600080fd5b8235915060208301356147e0816147ad565b809150509250929050565b6001600160e01b031981168114611a1d57600080fd5b60006020828403121561481357600080fd5b813561481e816147eb565b9392505050565b6001600160a01b0381168114611a1d57600080fd5b80356001600160601b03811681146132f857600080fd5b6000806040838503121561486457600080fd5b823561486f81614825565b915061487d6020840161483a565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156148b6576148b6614886565b604051601f8501601f19908116603f011681019082821181831017156148de576148de614886565b816040528093508581528686860111156148f757600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261492257600080fd5b61481e8383356020850161489c565b60006020828403121561494357600080fd5b81356001600160401b0381111561495957600080fd5b613ab084828501614911565b60005b83811015614980578181015183820152602001614968565b50506000910152565b600081518084526149a1816020860160208601614965565b601f01601f19169290920160200192915050565b60208152600061481e6020830184614989565b6000602082840312156149da57600080fd5b5035919050565b600080604083850312156149f457600080fd5b82356149ff81614825565b946020939093013593505050565b600060208284031215614a1f57600080fd5b813563ffffffff8116811461481e57600080fd5b600060208284031215614a4557600080fd5b813561481e81614825565b600080600060608486031215614a6557600080fd5b8335614a7081614825565b92506020840135614a8081614825565b929592945050506040919091013590565b606081526000614aa46060830186614989565b6001600160a01b039490941660208301525060400152919050565b60008060408385031215614ad257600080fd5b50508035926020909101359150565b600080600060608486031215614af657600080fd5b83356001600160401b03811115614b0c57600080fd5b614b1886828701614911565b9350506020840135614a8081614825565b60008060408385031215614b3c57600080fd5b8235614b4781614825565b915060208301356147e081614825565b60008060408385031215614b6a57600080fd5b82356001600160401b03811115614b8057600080fd5b614b8c85828601614911565b92505060208301356147e081614825565b60008060408385031215614bb057600080fd5b8235915060208301356001600160401b03811115614bcd57600080fd5b614bd985828601614911565b9150509250929050565b600080600060608486031215614bf857600080fd5b833592506020840135614c0a81614825565b9150614c186040850161483a565b90509250925092565b60008060408385031215614c3457600080fd5b82356001600160401b0380821115614c4b57600080fd5b614c5786838701614911565b93506020850135915080821115614c6d57600080fd5b50614bd985828601614911565b600081518084526020808501808196508360051b8101915082860160005b85811015614cc2578284038952614cb0848351614989565b98850198935090840190600101614c98565b5091979650505050505050565b600081518084526020808501945080840160005b83811015614cff57815187529582019590820190600101614ce3565b509495945050505050565b608081526000614d1d6080830187614c7a565b8281036020840152614d2f8187614ccf565b90508281036040840152614d438186614ccf565b90508281036060840152614d578185614c7a565b979650505050505050565b606081526000614d756060830186614989565b60208301949094525060400152919050565b60008060408385031215614d9a57600080fd5b82356001600160401b03811115614db057600080fd5b614dbc85828601614911565b95602094909401359450505050565b60008060408385031215614dde57600080fd5b8235614de981614825565b915060208301356147e0816147ad565b600080600060608486031215614e0e57600080fd5b83356001600160401b0380821115614e2557600080fd5b614e3187838801614911565b9450602086013593506040860135915080821115614e4e57600080fd5b50614e5b86828701614911565b9150509250925092565b60008060008060808587031215614e7b57600080fd5b8435614e8681614825565b93506020850135614e9681614825565b92506040850135915060608501356001600160401b03811115614eb857600080fd5b8501601f81018713614ec957600080fd5b614ed88782356020840161489c565b91505092959194509250565b600080600060608486031215614ef957600080fd5b8335614f0481614825565b92506020840135915060408401356001600160401b03811115614f2657600080fd5b614e5b86828701614911565b6020808252600f908201526e1a5b9d985b1a590b5d1bdad95b9251608a1b604082015260600190565b6020808252601290820152713ab730baba3437b934b9b2b21030b236b4b760711b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160601b0380841680614fcd57614fcd614f87565b92169190910492915050565b60008251614feb818460208701614965565b9190910192915050565b602080825260119082015270696e76616c69642d747970652d6e616d6560781b604082015260600190565b600181811c9082168061503457607f821691505b602082108103610fdb57634e487b7160e01b600052602260045260246000fd5b60ff8281168282160390811115610d8557610d85614f9d565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082028115828204841417610d8557610d85614f9d565b6000826150e0576150e0614f87565b500490565b601f8211156111aa57600081815260208120601f850160051c8101602086101561510c5750805b601f850160051c820191505b8181101561512b57828155600101615118565b505050505050565b81516001600160401b0381111561514c5761514c614886565b6151608161515a8454615020565b846150e5565b602080601f831160018114615195576000841561517d5750858301515b600019600386901b1c1916600185901b17855561512b565b600085815260208120601f198616915b828110156151c4578886015182559484019460019091019084016151a5565b50858210156151e25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561520457600080fd5b5051919050565b60006020828403121561521d57600080fd5b815161481e816147ad565b634e487b7160e01b600052603260045260246000fd5b60006001820161525057615250614f9d565b5060010190565b60ff8181168382160190811115610d8557610d85614f9d565b60006020828403121561528257600080fd5b815161481e81614825565b63ffffffff8181168382160190808211156152aa576152aa614f9d565b5092915050565b80820180821115610d8557610d85614f9d565b60008083546152d281615020565b600182811680156152ea57600181146152ff5761532e565b60ff198416875282151583028701945061532e565b8760005260208060002060005b858110156153255781548a82015290840190820161530c565b50505082870194505b50929695505050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b81810381811115610d8557610d85614f9d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061541c90830184614989565b9695505050505050565b60006020828403121561543857600080fd5b815161481e816147eb565b634e487b7160e01b600052603160045260246000fdfea264697066735822122090ef3d16d73c23c67638bfd9f3daf828432d36fa4c904fdd72951d19ecc3918064736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b416c6b696d695f4e6f64650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003414c4e0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103815760003560e01c806367603b0b116101cf578063913d9e1b11610101578063c87b56dd1161009a578063e985e9c51161006c578063e985e9c514610bdf578063f2fde38b14610c28578063f7b188a514610c48578063fa644c2014610c5d57005b8063c87b56dd14610b4f578063c8dafdbf14610b6f578063d26b496814610b9f578063d3fc986414610bbf57005b8063a2309ff8116100d3578063a2309ff814610ae4578063a2b2e87014610afa578063aa1b103f14610b1a578063b88d4fde14610b2f57005b8063913d9e1b14610a7257806395d89b4114610a8f5780639c13cd4d14610aa4578063a22cb46514610ac457005b80637a99d804116101735780638a616bc0116101455780638a616bc0146109e45780638cabe05a14610a045780638d6f8cef14610a345780638da5cb5b14610a5457005b80637a99d80414610948578063833b7b7814610968578063839006f2146109af5780638456cb59146109cf57005b806370a08231116101ac57806370a08231146108c4578063715018a6146108e457806375573f7e146108f957806379b2ab231461091957005b806367603b0b1461085f578063704802751461087f57806370789fe71461089f57005b80632aa65a7f116102b35780634f6ccce71161024c5780635944c7531161021e5780635944c753146107d25780635c975abb146107f25780635cb960e31461080a5780636352211e1461083f57005b80634f6ccce71461072d5780634ff4ae7d1461074d578063500c33321461078257806357f7789e146107b257005b806342842e0e1161028557806342842e0e146106ad57806342966c68146106cd5780634707d000146106ed5780634f558e791461070d57005b80632aa65a7f146106155780632f707f7d146106505780632f745c591461066d5780632fb12e301461068d57005b806315dc0c981161032557806323b872dd116102f757806323b872dd1461055757806324c1173b1461057757806324d7806c146105a65780632a55205a146105d657005b806315dc0c98146104a757806316458cb5146104f65780631785f53c1461052257806318160ddd1461054257005b80630554654f1161035e5780630554654f146103ff57806306fdde031461042d578063081812fc1461044f578063095ea7b31461048757005b8063016be9751461038a57806301ffc9a7146103aa57806304634d8d146103df57005b3661038857005b005b34801561039657600080fd5b506103886103a53660046147bb565b610c7d565b3480156103b657600080fd5b506103ca6103c5366004614801565b610d60565b60405190151581526020015b60405180910390f35b3480156103eb57600080fd5b506103886103fa366004614851565b610d8b565b34801561040b57600080fd5b5061041f61041a366004614931565b610ea4565b6040519081526020016103d6565b34801561043957600080fd5b50610442610fe1565b6040516103d691906149b5565b34801561045b57600080fd5b5061046f61046a3660046149c8565b611073565b6040516001600160a01b0390911681526020016103d6565b34801561049357600080fd5b506103886104a23660046149e1565b61109a565b3480156104b357600080fd5b506104c76104c23660046149c8565b6111af565b6040516103d6949392919093845260208401929092526001600160a01b03166040830152606082015260800190565b34801561050257600080fd5b506103ca610511366004614a0d565b60195463ffffffff91821691161190565b34801561052e57600080fd5b5061038861053d366004614a33565b6113b0565b34801561054e57600080fd5b5060105461041f565b34801561056357600080fd5b50610388610572366004614a50565b611509565b34801561058357600080fd5b506105976105923660046149c8565b61153a565b6040516103d693929190614a91565b3480156105b257600080fd5b506103ca6105c1366004614a33565b60116020526000908152604090205460ff1681565b3480156105e257600080fd5b506105f66105f1366004614abf565b6115ee565b604080516001600160a01b0390931683526020830191909152016103d6565b34801561062157600080fd5b506103ca610630366004614931565b805160208183018101805160188252928201919093012091525460ff1681565b34801561065c57600080fd5b5060405161271081526020016103d6565b34801561067957600080fd5b5061041f6106883660046149e1565b61169a565b34801561069957600080fd5b506103886106a8366004614ae1565b611730565b3480156106b957600080fd5b506103886106c8366004614a50565b6119f9565b3480156106d957600080fd5b506103886106e83660046149c8565b611a14565b3480156106f957600080fd5b50610388610708366004614b29565b611a20565b34801561071957600080fd5b506103ca6107283660046149c8565b611b24565b34801561073957600080fd5b5061041f6107483660046149c8565b611b43565b34801561075957600080fd5b5061076d610768366004614b57565b611bd6565b604080519283529015156020830152016103d6565b34801561078e57600080fd5b506103ca61079d3660046149c8565b601d6020526000908152604090205460ff1681565b3480156107be57600080fd5b506103886107cd366004614b9d565b611ccd565b3480156107de57600080fd5b506103886107ed366004614be3565b611d7c565b3480156107fe57600080fd5b50600e5460ff166103ca565b34801561081657600080fd5b5061082a6108253660046149c8565b611ec0565b60405163ffffffff90911681526020016103d6565b34801561084b57600080fd5b5061046f61085a3660046149c8565b611f02565b34801561086b57600080fd5b5061038861087a366004614c21565b611f62565b34801561088b57600080fd5b5061038861089a366004614a33565b61203f565b3480156108ab57600080fd5b506108b4612257565b6040516103d69493929190614d0a565b3480156108d057600080fd5b5061041f6108df366004614a33565b6125c7565b3480156108f057600080fd5b5061038861264d565b34801561090557600080fd5b50610442610914366004614a0d565b612661565b34801561092557600080fd5b506109396109343660046149c8565b612738565b6040516103d693929190614d62565b34801561095457600080fd5b50610442610963366004614931565b6127e2565b34801561097457600080fd5b506109886109833660046149c8565b6128f0565b604080516001600160a01b0390931683526001600160601b039091166020830152016103d6565b3480156109bb57600080fd5b506103886109ca366004614a33565b61292c565b3480156109db57600080fd5b506103886129e3565b3480156109f057600080fd5b506103886109ff3660046149c8565b6129f3565b348015610a1057600080fd5b506000546001600160a01b03811690600160a01b90046001600160601b0316610988565b348015610a4057600080fd5b50610388610a4f366004614d87565b612a86565b348015610a6057600080fd5b50600c546001600160a01b031661046f565b348015610a7e57600080fd5b5060195461082a9063ffffffff1681565b348015610a9b57600080fd5b50610442612d45565b348015610ab057600080fd5b50610388610abf366004614a50565b612d54565b348015610ad057600080fd5b50610388610adf366004614dcb565b612e93565b348015610af057600080fd5b5061041f600f5481565b348015610b0657600080fd5b50610388610b15366004614df9565b612e9e565b348015610b2657600080fd5b50610388613102565b348015610b3b57600080fd5b50610388610b4a366004614e65565b613166565b348015610b5b57600080fd5b50610442610b6a3660046149c8565b613198565b348015610b7b57600080fd5b506103ca610b8a3660046149c8565b601c6020526000908152604090205460ff1681565b348015610bab57600080fd5b5061082a610bba366004614931565b6132fd565b348015610bcb57600080fd5b50610388610bda366004614ee4565b61332b565b348015610beb57600080fd5b506103ca610bfa366004614b29565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610c3457600080fd5b50610388610c43366004614a33565b613696565b348015610c5457600080fd5b5061038861370c565b348015610c6957600080fd5b50610388610c783660046147bb565b61371c565b81610c8781611b24565b610cac5760405162461bcd60e51b8152600401610ca390614f32565b60405180910390fd5b610cb46137ed565b3360009081526011602052604090205460ff1680610ceb575033610ce0600c546001600160a01b031690565b6001600160a01b0316145b610d075760405162461bcd60e51b8152600401610ca390614f5b565b6000838152601d6020908152604091829020805460ff1916851515908117909155915133815285917f4113d5911a4878c63e6b73318e14fd183187527749fc7949511b6327a8e1506591015b60405180910390a3505050565b60006001600160e01b0319821663780e9d6360e01b1480610d855750610d8582613833565b92915050565b610d936137ed565b3360009081526011602052604090205460ff1680610dca575033610dbf600c546001600160a01b031690565b6001600160a01b0316145b610de65760405162461bcd60e51b8152600401610ca390614f5b565b610df3600a612710614fb3565b6001600160601b0316816001600160601b03161115610e4d5760405162461bcd60e51b815260206004820152601660248201527564656661756c74526f79616c74792f746f6f2d62696760501b6044820152606401610ca3565b6040513381526001600160a01b038316906001600160601b038316907f6e8b991c2d49dbf8fa5811e471d97c00c6a61fc1696050a37f70b21b97bf4c539060200160405180910390a3610ea08282613858565b5050565b600081601881604051610eb79190614fd9565b9081526040519081900360200190205460ff16610ee65760405162461bcd60e51b8152600401610ca390614ff5565b6000601784604051610ef89190614fd9565b90815260408051602092819003830181205463ffffffff166000818152601690945282842060608301909352825490945090919082908290610f3990615020565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6590615020565b8015610fb25780601f10610f8757610100808354040283529160200191610fb2565b820191906000526020600020905b815481529060010190602001808311610f9557829003601f168201915b505050505081526020016001820154815260200160028201548152505090508060200151935050505b50919050565b606060028054610ff090615020565b80601f016020809104026020016040519081016040528092919081815260200182805461101c90615020565b80156110695780601f1061103e57610100808354040283529160200191611069565b820191906000526020600020905b81548152906001019060200180831161104c57829003601f168201915b5050505050905090565b600061107e82613912565b506000908152600660205260409020546001600160a01b031690565b60006110a582611f02565b9050806001600160a01b0316836001600160a01b0316036111125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ca3565b336001600160a01b038216148061112e575061112e8133610bfa565b6111a05760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610ca3565b6111aa8383613971565b505050565b600080600080846111bf81611b24565b6111db5760405162461bcd60e51b8152600401610ca390614f32565b6000868152601b602090815260408083205463ffffffff16808452601a90925280832081516060810190925280549293928290829061121990615020565b80601f016020809104026020016040519081016040528092919081815260200182805461124590615020565b80156112925780601f1061126757610100808354040283529160200191611292565b820191906000526020600020905b81548152906001019060200180831161127557829003601f168201915b505050918352505060018201546001600160a01b031660208083019190915260029092015460409182015263ffffffff85166000908152601690925280822081516060810190925280549394509192909190829082906112f190615020565b80601f016020809104026020016040519081016040528092919081815260200182805461131d90615020565b801561136a5780601f1061133f5761010080835404028352916020019161136a565b820191906000526020600020905b81548152906001019060200180831161134d57829003601f168201915b5050505050815260200160018201548152602001600282015481525050905080602001518160400151836020015184604001519750975097509750505050509193509193565b6113b86139df565b6001600160a01b03811660009081526011602052604090205460ff166114205760405162461bcd60e51b815260206004820152601860248201527f72656d6f766541646d696e2f6e6f742d616e2d61646d696e00000000000000006044820152606401610ca3565b6001600160a01b03811633036114785760405162461bcd60e51b815260206004820152601d60248201527f72656d6f766541646d696e2f63616e27742d72656d6f76652d73656c660000006044820152606401610ca3565b6001600160a01b0381166000908152601160205260408120805460ff1916905560128054600192906114ae90849060ff16615054565b92506101000a81548160ff021916908360ff160217905550806001600160a01b0316336001600160a01b03167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce60405160405180910390a350565b6115133382613a39565b61152f5760405162461bcd60e51b8152600401610ca39061506d565b6111aa838383613ab8565b601a6020526000908152604090208054819061155590615020565b80601f016020809104026020016040519081016040528092919081815260200182805461158190615020565b80156115ce5780601f106115a3576101008083540402835291602001916115ce565b820191906000526020600020905b8154815290600101906020018083116115b157829003601f168201915b50505050600183015460029093015491926001600160a01b031691905083565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916116635750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611682906001600160601b0316876150ba565b61168c91906150d1565b915196919550909350505050565b60006116a5836125c7565b82106117075760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ca3565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b826018816040516117419190614fd9565b9081526040519081900360200190205460ff166117705760405162461bcd60e51b8152600401610ca390614ff5565b6117786137ed565b3360009081526011602052604090205460ff16806117af5750336117a4600c546001600160a01b031690565b6001600160a01b0316145b6117cb5760405162461bcd60e51b8152600401610ca390614f5b565b60006017856040516117dd9190614fd9565b90815260408051602092819003830181205463ffffffff16600081815260169094528284206060830190935282549094509091908290829061181e90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461184a90615020565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b50505091835250506001820154602082015260029091015460409091015290506001600160a01b0385163b61190e5760405162461bcd60e51b815260206004820181905260248201527f736574436f6c6c61746572616c2d696e76616c69642d636f6c6c61746572616c6044820152606401610ca3565b61193b60405180606001604052806060815260200160006001600160a01b03168152602001600081525090565b815181526001600160a01b038616602080830191909152604080830187905263ffffffff85166000908152601a90925290208151829190819061197e9082615133565b506020828101516001830180546001600160a01b0319166001600160a01b03928316179055604093840151600290930192909255915133815287929189169163ffffffff8716917fb84f729e50ae63635c3b7815c9a5b16c2f4163cef6d8bebe6aae9c39c421ad54910160405180910390a450505050505050565b6111aa83838360405180602001604052806000815250613166565b611a1d81613c6e565b50565b611a28613cdc565b611a306139df565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa291906151f2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b11919061520b565b611b1a57600080fd5b610ea06001600d55565b6000818152600460205260408120546001600160a01b03161515610d85565b6000611b4e600a5490565b8210611bb15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ca3565b600a8281548110611bc457611bc4615228565b90600052602060002001549050919050565b60008083601881604051611bea9190614fd9565b9081526040519081900360200190205460ff16611c195760405162461bcd60e51b8152600401610ca390614ff5565b6000611c24856125c7565b905080600003611c3b576000809350935050611cc5565b6000806000601789604051611c509190614fd9565b9081526040519081900360200190205463ffffffff16905060005b84811015611cbc576000611c7f8a8361169a565b6000818152601b602052604090205490915063ffffffff808516911603611cab57935060019250611cbc565b50611cb58161523e565b9050611c6b565b50919550935050505b509250929050565b81611cd781611b24565b611cf35760405162461bcd60e51b8152600401610ca390614f32565b3360009081526011602052604090205460ff1680611d2a575033611d1f600c546001600160a01b031690565b6001600160a01b0316145b611d465760405162461bcd60e51b8152600401610ca390614f5b565b6000838152601360205260409020611d5e8382615133565b5050506000908152601460205260409020805460ff19166001179055565b611d846137ed565b82611d8e81611b24565b611daa5760405162461bcd60e51b8152600401610ca390614f32565b3360009081526011602052604090205460ff1680611de1575033611dd6600c546001600160a01b031690565b6001600160a01b0316145b611dfd5760405162461bcd60e51b8152600401610ca390614f5b565b611e0a600a612710614fb3565b6001600160601b0316826001600160601b03161115611e645760405162461bcd60e51b815260206004820152601660248201527564656661756c74526f79616c74792f746f6f2d62696760501b6044820152606401610ca3565b6040513381526001600160a01b038416906001600160601b0384169086907f768d79acdc34ccf6f78ea4757874c38b18d939c1863ded46a7b8f7a1c52581149060200160405180910390a4611eba848484613d35565b50505050565b600081611ecc81611b24565b611ee85760405162461bcd60e51b8152600401610ca390614f32565b50506000908152601b602052604090205463ffffffff1690565b6000818152600460205260408120546001600160a01b031680610d855760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610ca3565b81601881604051611f739190614fd9565b9081526040519081900360200190205460ff16611fa25760405162461bcd60e51b8152600401610ca390614ff5565b3360009081526011602052604090205460ff1680611fd9575033611fce600c546001600160a01b031690565b6001600160a01b0316145b611ff55760405162461bcd60e51b8152600401610ca390614f5b565b60006017846040516120079190614fd9565b90815260408051602092819003830190205463ffffffff166000818152601590935291209091506120388482615133565b5050505050565b6120476139df565b60125460ff1660021161209c5760405162461bcd60e51b815260206004820152601760248201527f61646441646d696e2f63616e27742d6164642d6d6f72650000000000000000006044820152606401610ca3565b6001600160a01b03811660009081526011602052604090205460ff16156120fe5760405162461bcd60e51b815260206004820152601660248201527518591910591b5a5b8bd85b1c9958591e4b585919195960521b6044820152606401610ca3565b6001600160a01b0381166121545760405162461bcd60e51b815260206004820152601860248201527f61646441646d696e2f696e76616c69642d6164647265737300000000000000006044820152606401610ca3565b600c546001600160a01b03166001600160a01b0316816001600160a01b0316036121c05760405162461bcd60e51b815260206004820152601f60248201527f61646441646d696e2f6f776e65722d63616e2d6e6f742d62652d61646d696e006044820152606401610ca3565b6001600160a01b0381166000908152601160205260408120805460ff1916600190811790915560128054919290916121fc90849060ff16615257565b92506101000a81548160ff021916908360ff160217905550806001600160a01b0316336001600160a01b03167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a350565b60195460609081908190819060009063ffffffff166001600160401b0381111561228357612283614886565b6040519080825280602002602001820160405280156122b657816020015b60608152602001906001900390816122a15790505b5060195490915060009063ffffffff166001600160401b038111156122dd576122dd614886565b604051908082528060200260200182016040528015612306578160200160208202803683370190505b5060195490915060009063ffffffff166001600160401b0381111561232d5761232d614886565b604051908082528060200260200182016040528015612356578160200160208202803683370190505b5060195490915060009063ffffffff166001600160401b0381111561237d5761237d614886565b6040519080825280602002602001820160405280156123b057816020015b606081526020019060019003908161239b5790505b50905060005b60195463ffffffff168110156125b8576000818152601660205260408082208151606081019092528054829082906123ed90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461241990615020565b80156124665780601f1061243b57610100808354040283529160200191612466565b820191906000526020600020905b81548152906001019060200180831161244957829003601f168201915b50505050508152602001600182015481526020016002820154815250509050806000015186838151811061249c5761249c615228565b602002602001018190525080602001518583815181106124be576124be615228565b60200260200101818152505080604001518483815181106124e1576124e1615228565b60200260200101818152505060156000838152602001908152602001600020805461250b90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461253790615020565b80156125845780601f1061255957610100808354040283529160200191612584565b820191906000526020600020905b81548152906001019060200180831161256757829003601f168201915b505050505083838151811061259b5761259b615228565b602002602001018190525050806125b19061523e565b90506123b6565b50929791965094509092509050565b60006001600160a01b0382166126315760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610ca3565b506001600160a01b031660009081526005602052604090205490565b6126556139df565b61265f6000613e00565b565b60606000601660008463ffffffff16815260200190815260200160002060405180606001604052908160008201805461269990615020565b80601f01602080910402602001604051908101604052809291908181526020018280546126c590615020565b80156127125780601f106126e757610100808354040283529160200191612712565b820191906000526020600020905b8154815290600101906020018083116126f557829003601f168201915b505050918352505060018201546020820152600290910154604090910152519392505050565b60166020526000908152604090208054819061275390615020565b80601f016020809104026020016040519081016040528092919081815260200182805461277f90615020565b80156127cc5780601f106127a1576101008083540402835291602001916127cc565b820191906000526020600020905b8154815290600101906020018083116127af57829003601f168201915b5050505050908060010154908060020154905083565b6060816018816040516127f59190614fd9565b9081526040519081900360200190205460ff166128245760405162461bcd60e51b8152600401610ca390614ff5565b60006017846040516128369190614fd9565b90815260408051602092819003830190205463ffffffff1660008181526015909352912080549192509061286990615020565b80601f016020809104026020016040519081016040528092919081815260200182805461289590615020565b80156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b505050505092505050919050565b600080826128fd81611b24565b6129195760405162461bcd60e51b8152600401610ca390614f32565b61292284613e52565b9250925050915091565b612934613cdc565b61293c6139df565b60405147906000906001600160a01b0384169083908381818185875af1925050503d8060008114612989576040519150601f19603f3d011682016040523d82523d6000602084013e61298e565b606091505b50509050806129d75760405162461bcd60e51b8152602060048201526015602482015274195d1a195c881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610ca3565b5050611a1d6001600d55565b6129eb6139df565b61265f613ed9565b6129fb6137ed565b80612a0581611b24565b612a215760405162461bcd60e51b8152600401610ca390614f32565b3360009081526011602052604090205460ff1680612a58575033612a4d600c546001600160a01b031690565b6001600160a01b0316145b612a745760405162461bcd60e51b8152600401610ca390614f5b565b50600090815260016020526040812055565b81601881604051612a979190614fd9565b9081526040519081900360200190205460ff16612ac65760405162461bcd60e51b8152600401610ca390614ff5565b612ace6137ed565b3360009081526011602052604090205460ff1680612b05575033612afa600c546001600160a01b031690565b6001600160a01b0316145b612b215760405162461bcd60e51b8152600401610ca390614f5b565b6000601784604051612b339190614fd9565b90815260408051602092819003830181205463ffffffff166000818152601690945282842060608301909352825490945090919082908290612b7490615020565b80601f0160208091040260200160405190810160405280929190818152602001828054612ba090615020565b8015612bed5780601f10612bc257610100808354040283529160200191612bed565b820191906000526020600020905b815481529060010190602001808311612bd057829003601f168201915b505050505081526020016001820154815260200160028201548152505090508060400151841015612c605760405162461bcd60e51b815260206004820152601760248201527f696e76616c69642d6e65772d746f74616c537570706c790000000000000000006044820152606401610ca3565b80602001518403612ca65760405162461bcd60e51b815260206004820152601060248201526f73616d652d746f74616c537570706c7960801b6044820152606401610ca3565b80516040518591612cb691614fd9565b6040805191829003822060208086015133855290840152917fc750dedef64bbdd30a5772b5cc11c6890baca6ed80a6de398b17f065b8a9c858910160405180910390a3602080820185905263ffffffff8316600090815260169091526040902081518291908190612d279082615133565b50602082015160018201556040909101516002909101555050505050565b606060038054610ff090615020565b612d5c613cdc565b612d646137ed565b612d6c6139df565b6040516331a9108f60e11b81526004810182905230906001600160a01b03841690636352211e90602401602060405180830381865afa158015612db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd79190615270565b6001600160a01b031614612e215760405162461bcd60e51b81526020600482015260116024820152701c995cd8dd594bda5b9d985b1a590b5a59607a1b6044820152606401610ca3565b6040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018390528316906323b872dd90606401600060405180830381600087803b158015612e7157600080fd5b505af1158015612e85573d6000803e3d6000fd5b505050506111aa6001600d55565b610ea0338383613f33565b612ea66137ed565b3360009081526011602052604090205460ff1680612edd575033612ed2600c546001600160a01b031690565b6001600160a01b0316145b612ef95760405162461bcd60e51b8152600401610ca390614f5b565b601883604051612f099190614fd9565b9081526040519081900360200190205460ff1615612f695760405162461bcd60e51b815260206004820152601860248201527f747970652d6e616d652d616c72656164792d65786973747300000000000000006044820152606401610ca3565b612f8d60405180606001604052806060815260200160008152602001600081525090565b83815260208082018490526000604080840182905260195463ffffffff16825260169092522081518291908190612fc49082615133565b50602082810151600183015560409283015160029092019190915560195463ffffffff166000908152601590915220612ffd8382615133565b5060195460405163ffffffff9091169060179061301b908790614fd9565b908152602001604051809103902060006101000a81548163ffffffff021916908363ffffffff16021790555060016018856040516130599190614fd9565b908152604051908190036020019020805491151560ff19909216919091179055601980546001919060009061309590849063ffffffff1661528d565b92506101000a81548163ffffffff021916908363ffffffff16021790555082846040516130c29190614fd9565b604051908190038120338252907f5a99af48dc1ee889e1b8493ef14f3dc3b82011206c77f094789a17abb49a9f409060200160405180910390a350505050565b61310a6137ed565b3360009081526011602052604090205460ff1680613141575033613136600c546001600160a01b031690565b6001600160a01b0316145b61315d5760405162461bcd60e51b8152600401610ca390614f5b565b61265f60008055565b6131703383613a39565b61318c5760405162461bcd60e51b8152600401610ca39061506d565b611eba84848484613ff9565b6000818152600460205260409020546060906001600160a01b03166132175760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ca3565b60008281526014602052604090205460ff16156132cc576000828152601360205260409020805461324790615020565b80601f016020809104026020016040519081016040528092919081815260200182805461327390615020565b80156132c05780601f10613295576101008083540402835291602001916132c0565b820191906000526020600020905b8154815290600101906020018083116132a357829003601f168201915b50505050509050919050565b6000828152601b602090815260408083205463ffffffff16835260159091529020805461324790615020565b919050565b600060178260405161330f9190614fd9565b9081526040519081900360200190205463ffffffff1692915050565b8060188160405161333c9190614fd9565b9081526040519081900360200190205460ff1661336b5760405162461bcd60e51b8152600401610ca390614ff5565b613373613cdc565b61337b6137ed565b3360009081526011602052604090205460ff16806133b25750336133a7600c546001600160a01b031690565b6001600160a01b0316145b6133ce5760405162461bcd60e51b8152600401610ca390614f5b565b6001600160a01b03841661341a5760405162461bcd60e51b815260206004820152601360248201527262617463684d696e742d302d6164647265737360681b6044820152606401610ca3565b600060178360405161342c9190614fd9565b90815260408051602092819003830181205463ffffffff16600081815260169094528284206060830190935282549094509091908290829061346d90615020565b80601f016020809104026020016040519081016040528092919081815260200182805461349990615020565b80156134e65780601f106134bb576101008083540402835291602001916134e6565b820191906000526020600020905b8154815290600101906020018083116134c957829003601f168201915b5050509183525050600182015460208083019190915260029092015460409182015290820151908201519192509061351e87826152b1565b8210156135795760405162461bcd60e51b8152602060048201526024808201527f62617463684d696e742d6d6f72652d7468616e2d747970652d746f74616c537560448201526370706c7960e01b6064820152608401610ca3565b60005b8781101561367d5761359089600f5461402c565b600f80546000908152601b60209081526040808320805463ffffffff191663ffffffff8b1690811790915584548452601c8352818420805460ff19908116600190811790925595548552601d845282852080549096161790945592825260169052819020905161360091906152c4565b60405180910390208563ffffffff168a6001600160a01b03167f9bf2091a0a0194755b935cb0f3fea3655447a60d66152e69ef67391f725db504600f5460405161364c91815260200190565b60405180910390a46001600f600082825461366791906152b1565b9091555061367690508161523e565b905061357c565b50613688848861417a565b50505050611eba6001600d55565b61369e6139df565b6001600160a01b0381166137035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca3565b611a1d81613e00565b6137146139df565b61265f614298565b8161372681611b24565b6137425760405162461bcd60e51b8152600401610ca390614f32565b61374a6137ed565b3360009081526011602052604090205460ff1680613781575033613776600c546001600160a01b031690565b6001600160a01b0316145b61379d5760405162461bcd60e51b8152600401610ca390614f5b565b6000838152601c6020908152604091829020805460ff1916851515908117909155915133815285917fd20ef8f4b34e3190a922e45caf3f60ff0d0661b89d9fca40cb0c54f7792c55d69101610d53565b600e5460ff161561265f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ca3565b60006001600160e01b0319821663780e9d6360e01b1480610d855750610d85826142d1565b6127106001600160601b03821611156138835760405162461bcd60e51b8152600401610ca39061533a565b6001600160a01b0382166138d95760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610ca3565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b6000818152600460205260409020546001600160a01b0316611a1d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610ca3565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906139a682611f02565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0316331461265f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca3565b600080613a4583611f02565b9050806001600160a01b0316846001600160a01b03161480613a8c57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80613ab05750836001600160a01b0316613aa584611073565b6001600160a01b0316145b949350505050565b826001600160a01b0316613acb82611f02565b6001600160a01b031614613b2f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ca3565b6001600160a01b038216613b915760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ca3565b613b9c8383836142dc565b600081815260066020908152604080832080546001600160a01b03191690556001600160a01b038616835260059091528120805460019290613bdf908490615384565b90915550506001600160a01b0382166000908152600560205260408120805460019290613c0d9084906152b1565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b33613c7882611f02565b6001600160a01b031614613cc25760405162461bcd60e51b8152602060048201526011602482015270189d5c9b8bdd5b985d5d1a1bdc9a5cd959607a1b6044820152606401610ca3565b613ccb816142e7565b600090815260016020526040812055565b6002600d5403613d2e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca3565b6002600d55565b6127106001600160601b0382161115613d605760405162461bcd60e51b8152600401610ca39061533a565b6001600160a01b038216613db65760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610ca3565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600190529190942093519051909116600160a01b029116179055565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008181526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291613ec75750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b80516020909101519094909350915050565b613ee16137ed565b600e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613f163390565b6040516001600160a01b03909116815260200160405180910390a1565b816001600160a01b0316836001600160a01b031603613f945760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ca3565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610d53565b614004848484613ab8565b614010848484846142f0565b611eba5760405162461bcd60e51b8152600401610ca390615397565b6001600160a01b0382166140825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ca3565b6000818152600460205260409020546001600160a01b0316156140e75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ca3565b6140f3600083836142dc565b6001600160a01b038216600090815260056020526040812080546001929061411c9084906152b1565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b63ffffffff82166000908152601660205260408082208151606081019092528054829082906141a890615020565b80601f01602080910402602001604051908101604052809291908181526020018280546141d490615020565b80156142215780601f106141f657610100808354040283529160200191614221565b820191906000526020600020905b81548152906001019060200180831161420457829003601f168201915b50505091835250506001820154602082015260029091015460409182015281015190915061424f83826152b1565b60408084019190915263ffffffff851660009081526016602052208251839190819061427b9082615133565b506020820151600182015560409091015160029091015550505050565b6142a06143f1565b600e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613f16565b6000610d858261443a565b6111aa83838361447a565b613ccb81614532565b60006001600160a01b0384163b156143e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906143349033908990889088906004016153e9565b6020604051808303816000875af192505050801561436f575060408051601f3d908101601f1916820190925261436c91810190615426565b60015b6143cc573d80801561439d576040519150601f19603f3d011682016040523d82523d6000602084013e6143a2565b606091505b5080516000036143c45760405162461bcd60e51b8152600401610ca390615397565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613ab0565b506001949350505050565b600e5460ff1661265f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ca3565b60006001600160e01b031982166380ac58cd60e01b148061446b57506001600160e01b03198216635b5e139f60e01b145b80610d855750610d85826145e8565b6001600160a01b0383166144d5576144d081600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6144f8565b816001600160a01b0316836001600160a01b0316146144f8576144f8838261461d565b6001600160a01b03821661450f576111aa816146ba565b826001600160a01b0316826001600160a01b0316146111aa576111aa8282614769565b600061453d82611f02565b905061454b816000846142dc565b600082815260066020908152604080832080546001600160a01b03191690556001600160a01b03841683526005909152812080546001929061458e908490615384565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b0319821663152a902d60e11b1480610d8557506301ffc9a760e01b6001600160e01b0319831614610d85565b6000600161462a846125c7565b6146349190615384565b600083815260096020526040902054909150808214614687576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906146cc90600190615384565b6000838152600b6020526040812054600a80549394509092849081106146f4576146f4615228565b9060005260206000200154905080600a838154811061471557614715615228565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061474d5761474d615443565b6001900381819060005260206000200160009055905550505050565b6000614774836125c7565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8015158114611a1d57600080fd5b600080604083850312156147ce57600080fd5b8235915060208301356147e0816147ad565b809150509250929050565b6001600160e01b031981168114611a1d57600080fd5b60006020828403121561481357600080fd5b813561481e816147eb565b9392505050565b6001600160a01b0381168114611a1d57600080fd5b80356001600160601b03811681146132f857600080fd5b6000806040838503121561486457600080fd5b823561486f81614825565b915061487d6020840161483a565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156148b6576148b6614886565b604051601f8501601f19908116603f011681019082821181831017156148de576148de614886565b816040528093508581528686860111156148f757600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261492257600080fd5b61481e8383356020850161489c565b60006020828403121561494357600080fd5b81356001600160401b0381111561495957600080fd5b613ab084828501614911565b60005b83811015614980578181015183820152602001614968565b50506000910152565b600081518084526149a1816020860160208601614965565b601f01601f19169290920160200192915050565b60208152600061481e6020830184614989565b6000602082840312156149da57600080fd5b5035919050565b600080604083850312156149f457600080fd5b82356149ff81614825565b946020939093013593505050565b600060208284031215614a1f57600080fd5b813563ffffffff8116811461481e57600080fd5b600060208284031215614a4557600080fd5b813561481e81614825565b600080600060608486031215614a6557600080fd5b8335614a7081614825565b92506020840135614a8081614825565b929592945050506040919091013590565b606081526000614aa46060830186614989565b6001600160a01b039490941660208301525060400152919050565b60008060408385031215614ad257600080fd5b50508035926020909101359150565b600080600060608486031215614af657600080fd5b83356001600160401b03811115614b0c57600080fd5b614b1886828701614911565b9350506020840135614a8081614825565b60008060408385031215614b3c57600080fd5b8235614b4781614825565b915060208301356147e081614825565b60008060408385031215614b6a57600080fd5b82356001600160401b03811115614b8057600080fd5b614b8c85828601614911565b92505060208301356147e081614825565b60008060408385031215614bb057600080fd5b8235915060208301356001600160401b03811115614bcd57600080fd5b614bd985828601614911565b9150509250929050565b600080600060608486031215614bf857600080fd5b833592506020840135614c0a81614825565b9150614c186040850161483a565b90509250925092565b60008060408385031215614c3457600080fd5b82356001600160401b0380821115614c4b57600080fd5b614c5786838701614911565b93506020850135915080821115614c6d57600080fd5b50614bd985828601614911565b600081518084526020808501808196508360051b8101915082860160005b85811015614cc2578284038952614cb0848351614989565b98850198935090840190600101614c98565b5091979650505050505050565b600081518084526020808501945080840160005b83811015614cff57815187529582019590820190600101614ce3565b509495945050505050565b608081526000614d1d6080830187614c7a565b8281036020840152614d2f8187614ccf565b90508281036040840152614d438186614ccf565b90508281036060840152614d578185614c7a565b979650505050505050565b606081526000614d756060830186614989565b60208301949094525060400152919050565b60008060408385031215614d9a57600080fd5b82356001600160401b03811115614db057600080fd5b614dbc85828601614911565b95602094909401359450505050565b60008060408385031215614dde57600080fd5b8235614de981614825565b915060208301356147e0816147ad565b600080600060608486031215614e0e57600080fd5b83356001600160401b0380821115614e2557600080fd5b614e3187838801614911565b9450602086013593506040860135915080821115614e4e57600080fd5b50614e5b86828701614911565b9150509250925092565b60008060008060808587031215614e7b57600080fd5b8435614e8681614825565b93506020850135614e9681614825565b92506040850135915060608501356001600160401b03811115614eb857600080fd5b8501601f81018713614ec957600080fd5b614ed88782356020840161489c565b91505092959194509250565b600080600060608486031215614ef957600080fd5b8335614f0481614825565b92506020840135915060408401356001600160401b03811115614f2657600080fd5b614e5b86828701614911565b6020808252600f908201526e1a5b9d985b1a590b5d1bdad95b9251608a1b604082015260600190565b6020808252601290820152713ab730baba3437b934b9b2b21030b236b4b760711b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160601b0380841680614fcd57614fcd614f87565b92169190910492915050565b60008251614feb818460208701614965565b9190910192915050565b602080825260119082015270696e76616c69642d747970652d6e616d6560781b604082015260600190565b600181811c9082168061503457607f821691505b602082108103610fdb57634e487b7160e01b600052602260045260246000fd5b60ff8281168282160390811115610d8557610d85614f9d565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082028115828204841417610d8557610d85614f9d565b6000826150e0576150e0614f87565b500490565b601f8211156111aa57600081815260208120601f850160051c8101602086101561510c5750805b601f850160051c820191505b8181101561512b57828155600101615118565b505050505050565b81516001600160401b0381111561514c5761514c614886565b6151608161515a8454615020565b846150e5565b602080601f831160018114615195576000841561517d5750858301515b600019600386901b1c1916600185901b17855561512b565b600085815260208120601f198616915b828110156151c4578886015182559484019460019091019084016151a5565b50858210156151e25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561520457600080fd5b5051919050565b60006020828403121561521d57600080fd5b815161481e816147ad565b634e487b7160e01b600052603260045260246000fd5b60006001820161525057615250614f9d565b5060010190565b60ff8181168382160190811115610d8557610d85614f9d565b60006020828403121561528257600080fd5b815161481e81614825565b63ffffffff8181168382160190808211156152aa576152aa614f9d565b5092915050565b80820180821115610d8557610d85614f9d565b60008083546152d281615020565b600182811680156152ea57600181146152ff5761532e565b60ff198416875282151583028701945061532e565b8760005260208060002060005b858110156153255781548a82015290840190820161530c565b50505082870194505b50929695505050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b81810381811115610d8557610d85614f9d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061541c90830184614989565b9695505050505050565b60006020828403121561543857600080fd5b815161481e816147eb565b634e487b7160e01b600052603160045260246000fdfea264697066735822122090ef3d16d73c23c67638bfd9f3daf828432d36fa4c904fdd72951d19ecc3918064736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b416c6b696d695f4e6f64650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003414c4e0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Alkimi_Node
Arg [1] : _symbol (string): ALN

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [3] : 416c6b696d695f4e6f6465000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 414c4e0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

61899:16926:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72417:275;;;;;;;;;;-1:-1:-1;72417:275:0;;;;;:::i;:::-;;:::i;78049:340::-;;;;;;;;;;-1:-1:-1;78049:340:0;;;;;:::i;:::-;;:::i;:::-;;;1002:14:1;;995:22;977:41;;965:2;950:18;78049:340:0;;;;;;;;75970:390;;;;;;;;;;-1:-1:-1;75970:390:0;;;;;:::i;:::-;;:::i;68201:299::-;;;;;;;;;;-1:-1:-1;68201:299:0;;;;;:::i;:::-;;:::i;:::-;;;3142:25:1;;;3130:2;3115:18;68201:299:0;2996:177:1;25673:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27185:171::-;;;;;;;;;;-1:-1:-1;27185:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4283:32:1;;;4265:51;;4253:2;4238:18;27185:171:0;4119:203:1;26703:416:0;;;;;;;;;;-1:-1:-1;26703:416:0;;;;;:::i;:::-;;:::i;72875:542::-;;;;;;;;;;-1:-1:-1;72875:542:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;4878:25:1;;;4934:2;4919:18;;4912:34;;;;-1:-1:-1;;;;;4982:32:1;4977:2;4962:18;;4955:60;5046:2;5031:18;;5024:34;4865:3;4850:19;;4647:417;74445:147:0;;;;;;;;;;-1:-1:-1;74445:147:0;;;;;:::i;:::-;74563:12;;:21;;;;:12;;:21;;74445:147;67177:307;;;;;;;;;;-1:-1:-1;67177:307:0;;;;;:::i;:::-;;:::i;73537:108::-;;;;;;;;;;-1:-1:-1;73625:12:0;;73537:108;;27885:335;;;;;;;;;;-1:-1:-1;27885:335:0;;;;;:::i;:::-;;:::i;63364:49::-;;;;;;;;;;-1:-1:-1;63364:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;62226:39::-;;;;;;;;;;-1:-1:-1;62226:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;57356:480;;;;;;;;;;-1:-1:-1;57356:480:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6901:32:1;;;6883:51;;6965:2;6950:18;;6943:34;;;;6856:18;57356:480:0;6709:274:1;62930:46:0;;;;;;;;;;-1:-1:-1;62930:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77361:105;;;;;;;;;;-1:-1:-1;77361:105:0;;58771:5;7132:58:1;;7120:2;7105:18;77361:105:0;6988:208:1;43002:256:0;;;;;;;;;;-1:-1:-1;43002:256:0;;;;;:::i;:::-;;:::i;71461:660::-;;;;;;;;;;-1:-1:-1;71461:660:0;;;;;:::i;:::-;;:::i;28291:185::-;;;;;;;;;;-1:-1:-1;28291:185:0;;;;;:::i;:::-;;:::i;78397:73::-;;;;;;;;;;-1:-1:-1;78397:73:0;;;;;:::i;:::-;;:::i;75328:224::-;;;;;;;;;;-1:-1:-1;75328:224:0;;;;;:::i;:::-;;:::i;73425:104::-;;;;;;;;;;-1:-1:-1;73425:104:0;;;;;:::i;:::-;;:::i;43524:233::-;;;;;;;;;;-1:-1:-1;43524:233:0;;;;;:::i;:::-;;:::i;73722:715::-;;;;;;;;;;-1:-1:-1;73722:715:0;;;;;:::i;:::-;;:::i;:::-;;;;8754:25:1;;;8822:14;;8815:22;8810:2;8795:18;;8788:50;8727:18;73722:715:0;8586:258:1;63632:43:0;;;;;;;;;;-1:-1:-1;63632:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;69078:211;;;;;;;;;;-1:-1:-1;69078:211:0;;;;;:::i;:::-;;:::i;76481:518::-;;;;;;;;;;-1:-1:-1;76481:518:0;;;;;:::i;:::-;;:::i;53259:86::-;;;;;;;;;;-1:-1:-1;53330:7:0;;;;53259:86;;72700:159;;;;;;;;;;-1:-1:-1;72700:159:0;;;;;:::i;:::-;;:::i;:::-;;;9810:10:1;9798:23;;;9780:42;;9768:2;9753:18;72700:159:0;9636:192:1;25384:222:0;;;;;;;;;;-1:-1:-1;25384:222:0;;;;;:::i;:::-;;:::i;68546:244::-;;;;;;;;;;-1:-1:-1;68546:244:0;;;;;:::i;:::-;;:::i;66730:439::-;;;;;;;;;;-1:-1:-1;66730:439:0;;;;;:::i;:::-;;:::i;70581:842::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;25115:207::-;;;;;;;;;;-1:-1:-1;25115:207:0;;;;;:::i;:::-;;:::i;2675:103::-;;;;;;;;;;;;;:::i;74600:211::-;;;;;;;;;;-1:-1:-1;74600:211:0;;;;;:::i;:::-;;:::i;62819:47::-;;;;;;;;;;-1:-1:-1;62819:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;68798:236::-;;;;;;;;;;-1:-1:-1;68798:236:0;;;;;:::i;:::-;;:::i;77178:175::-;;;;;;;;;;-1:-1:-1;77178:175:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12917:32:1;;;12899:51;;-1:-1:-1;;;;;12986:39:1;;;12981:2;12966:18;;12959:67;12872:18;77178:175:0;12727:305:1;75040:232:0;;;;;;;;;;-1:-1:-1;75040:232:0;;;;;:::i;:::-;;:::i;69727:61::-;;;;;;;;;;;;;:::i;77007:163::-;;;;;;;;;;-1:-1:-1;77007:163:0;;;;;:::i;:::-;;:::i;57844:205::-;;;;;;;;;;-1:-1:-1;57902:7:0;57952:28;-1:-1:-1;;;;;57952:28:0;;;-1:-1:-1;;;57995:35:0;;-1:-1:-1;;;;;57995:35:0;57844:205;;67527:666;;;;;;;;;;-1:-1:-1;67527:666:0;;;;;:::i;:::-;;:::i;2027:87::-;;;;;;;;;;-1:-1:-1;2100:6:0;;-1:-1:-1;;;;;2100:6:0;2027:87;;63019:30;;;;;;;;;;-1:-1:-1;63019:30:0;;;;;;;;25842:104;;;;;;;;;;;;;:::i;75599:340::-;;;;;;;;;;-1:-1:-1;75599:340:0;;;;;:::i;:::-;;:::i;27428:155::-;;;;;;;;;;-1:-1:-1;27428:155:0;;;;;:::i;:::-;;:::i;62119:30::-;;;;;;;;;;;;;;;;69899:674;;;;;;;;;;-1:-1:-1;69899:674:0;;;;;:::i;:::-;;:::i;76368:105::-;;;;;;;;;;;;;:::i;28547:322::-;;;;;;;;;;-1:-1:-1;28547:322:0;;;;;:::i;:::-;;:::i;69319:364::-;;;;;;;;;;-1:-1:-1;69319:364:0;;;;;:::i;:::-;;:::i;63553:38::-;;;;;;;;;;-1:-1:-1;63553:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;74819:162;;;;;;;;;;-1:-1:-1;74819:162:0;;;;;:::i;:::-;;:::i;65587:1135::-;;;;;;;;;;-1:-1:-1;65587:1135:0;;;;;:::i;:::-;;:::i;27654:164::-;;;;;;;;;;-1:-1:-1;27654:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27775:25:0;;;27751:4;27775:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27654:164;2933:201;;;;;;;;;;-1:-1:-1;2933:201:0;;;;;:::i;:::-;;:::i;69796:65::-;;;;;;;;;;;;;:::i;72164:245::-;;;;;;;;;;-1:-1:-1;72164:245:0;;;;;:::i;:::-;;:::i;72417:275::-;72526:8;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1;;;65401:44:0;;;;;;;:::i;:::-;;;;;;;;;52864:19:::1;:17;:19::i;:::-;65100:10:::2;65092:19;::::0;;;:7:::2;:19;::::0;;;;;::::2;;::::0;:44:::2;;-1:-1:-1::0;65126:10:0::2;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::2;-1:-1:-1::0;;;;;65115:21:0::2;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::2;;;;;;;:::i;:::-;72571:21:::3;::::0;;;:11:::3;:21;::::0;;;;;;;;:38;;-1:-1:-1;;72571:38:0::3;::::0;::::3;;::::0;;::::3;::::0;;;72625:59;;72647:10:::3;4265:51:1::0;;72571:21:0;;72625:59:::3;::::0;4238:18:1;72625:59:0::3;;;;;;;;72417:275:::0;;;:::o;78049:340::-;78236:4;-1:-1:-1;;;;;;78278:50:0;;-1:-1:-1;;;78278:50:0;;:103;;;78345:36;78369:11;78345:23;:36::i;:::-;78258:123;78049:340;-1:-1:-1;;78049:340:0:o;75970:390::-;52864:19;:17;:19::i;:::-;65100:10:::1;65092:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;::::0;:44:::1;;-1:-1:-1::0;65126:10:0::1;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::1;-1:-1:-1::0;;;;;65115:21:0::1;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::1;;;;;;;:::i;:::-;76144:28:::2;76170:2;58771:5:::0;76144:28:::2;:::i;:::-;-1:-1:-1::0;;;;;76127:45:0::2;:13;-1:-1:-1::0;;;;;76127:45:0::2;;;76105:117;;;::::0;-1:-1:-1;;;76105:117:0;;17134:2:1;76105:117:0::2;::::0;::::2;17116:21:1::0;17173:2;17153:18;;;17146:30;-1:-1:-1;;;17192:18:1;;;17185:52;17254:18;;76105:117:0::2;16932:346:1::0;76105:117:0::2;76238:59;::::0;76260:10:::2;4265:51:1::0;;-1:-1:-1;;;;;76238:59:0;::::2;::::0;-1:-1:-1;;;;;76238:59:0;::::2;::::0;::::2;::::0;4253:2:1;4238:18;76238:59:0::2;;;;;;;76308:44;76327:9;76338:13;76308:18;:44::i;:::-;75970:390:::0;;:::o;68201:299::-;68328:7;68308:9;65277:15;65293:5;65277:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65269:52;;;;-1:-1:-1;;;65269:52:0;;;;;;;:::i;:::-;68348:17:::1;68368:16;68385:9;68368:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;;;68435:20:::0;;;:8:::1;:20:::0;;;;;;68406:49:::1;::::0;::::1;::::0;;;;;68368:27;;-1:-1:-1;68368:27:0;;68435:20;68368:27;;68435:20;;68406:49:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;68473:7;:19;;;68466:26;;;;65332:1;68201:299:::0;;;;:::o;25673:100::-;25727:13;25760:5;25753:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25673:100;:::o;27185:171::-;27261:7;27281:23;27296:7;27281:14;:23::i;:::-;-1:-1:-1;27324:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27324:24:0;;27185:171::o;26703:416::-;26784:13;26800:23;26815:7;26800:14;:23::i;:::-;26784:39;;26848:5;-1:-1:-1;;;;;26842:11:0;:2;-1:-1:-1;;;;;26842:11:0;;26834:57;;;;-1:-1:-1;;;26834:57:0;;18510:2:1;26834:57:0;;;18492:21:1;18549:2;18529:18;;;18522:30;18588:34;18568:18;;;18561:62;-1:-1:-1;;;18639:18:1;;;18632:31;18680:19;;26834:57:0;18308:397:1;26834:57:0;816:10;-1:-1:-1;;;;;26926:21:0;;;;:62;;-1:-1:-1;26951:37:0;26968:5;816:10;27654:164;:::i;26951:37::-;26904:173;;;;-1:-1:-1;;;26904:173:0;;18912:2:1;26904:173:0;;;18894:21:1;18951:2;18931:18;;;18924:30;18990:34;18970:18;;;18963:62;19061:31;19041:18;;;19034:59;19110:19;;26904:173:0;18710:425:1;26904:173:0;27090:21;27099:2;27103:7;27090:8;:21::i;:::-;26773:346;26703:416;;:::o;72875:542::-;73024:7;73033;73042;73051;72996:8;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1;;;65401:44:0;;;;;;;:::i;:::-;73076:19:::1;73098:26:::0;;;:16:::1;:26;::::0;;;;;;;;::::1;;73162:25:::0;;;:11:::1;:25:::0;;;;;;73135:52;;::::1;::::0;::::1;::::0;;;;;73098:26;;73076:19;73135:52;;73162:25;;73135:52:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;73135:52:0;;;-1:-1:-1;;73135:52:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;73135:52:0::1;;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;73228:22:::1;::::0;::::1;73135:52;73228:22:::0;;;:8:::1;:22:::0;;;;;;73198:52;;::::1;::::0;::::1;::::0;;;;;73135;;-1:-1:-1;73135:52:0;;73198;;73228:22;73198:52;;73228:22;;73198:52:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;73283:8;:20;;;73318:8;:20;;;73353:6;:17;;;73385:6;:13;;;73261:148;;;;;;;;;;;72875:542:::0;;;;;;:::o;67177:307::-;1913:13;:11;:13::i;:::-;-1:-1:-1;;;;;67250:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;::::1;;67242:52;;;::::0;-1:-1:-1;;;67242:52:0;;19342:2:1;67242:52:0::1;::::0;::::1;19324:21:1::0;19381:2;19361:18;;;19354:30;19420:26;19400:18;;;19393:54;19464:18;;67242:52:0::1;19140:348:1::0;67242:52:0::1;-1:-1:-1::0;;;;;67313:20:0;::::1;:10;:20:::0;67305:62:::1;;;::::0;-1:-1:-1;;;67305:62:0;;19695:2:1;67305:62:0::1;::::0;::::1;19677:21:1::0;19734:2;19714:18;;;19707:30;19773:31;19753:18;;;19746:59;19822:18;;67305:62:0::1;19493:353:1::0;67305:62:0::1;-1:-1:-1::0;;;;;67378:15:0;::::1;67396:5;67378:15:::0;;;:7:::1;:15;::::0;;;;:23;;-1:-1:-1;;67378:23:0::1;::::0;;67412:11:::1;:16:::0;;67378:23;;67396:5;67412:16:::1;::::0;67378:23;;::::1;67412:16;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;67469:6;-1:-1:-1::0;;;;;67444:32:0::1;67457:10;-1:-1:-1::0;;;;;67444:32:0::1;;;;;;;;;;;67177:307:::0;:::o;27885:335::-;28080:41;816:10;28113:7;28080:18;:41::i;:::-;28072:99;;;;-1:-1:-1;;;28072:99:0;;;;;;;:::i;:::-;28184:28;28194:4;28200:2;28204:7;28184:9;:28::i;63364:49::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;63364:49:0;;;;;;;;;;;-1:-1:-1;;;;;63364:49:0;;;-1:-1:-1;63364:49:0;:::o;57356:480::-;57478:7;57536:27;;;:17;:27;;;;;;;;57507:56;;;;;;;;;-1:-1:-1;;;;;57507:56:0;;;;;-1:-1:-1;;;57507:56:0;;;-1:-1:-1;;;;;57507:56:0;;;;;;;;57478:7;;57576:92;;-1:-1:-1;57627:29:0;;;;;;;;;-1:-1:-1;57627:29:0;-1:-1:-1;;;;;57627:29:0;;;;-1:-1:-1;;;57627:29:0;;-1:-1:-1;;;;;57627:29:0;;;;;57576:92;57718:23;;;;57680:21;;58771:5;;57705:36;;-1:-1:-1;;;;;57705:36:0;:10;:36;:::i;:::-;57704:71;;;;:::i;:::-;57796:16;;;;;-1:-1:-1;57356:480:0;;-1:-1:-1;;;;57356:480:0:o;43002:256::-;43099:7;43135:23;43152:5;43135:16;:23::i;:::-;43127:5;:31;43119:87;;;;-1:-1:-1;;;43119:87:0;;20921:2:1;43119:87:0;;;20903:21:1;20960:2;20940:18;;;20933:30;20999:34;20979:18;;;20972:62;-1:-1:-1;;;21050:18:1;;;21043:41;21101:19;;43119:87:0;20719:407:1;43119:87:0;-1:-1:-1;;;;;;43224:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;43002:256::o;71461:660::-;71606:9;65277:15;65293:5;65277:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65269:52;;;;-1:-1:-1;;;65269:52:0;;;;;;;:::i;:::-;52864:19:::1;:17;:19::i;:::-;65100:10:::2;65092:19;::::0;;;:7:::2;:19;::::0;;;;;::::2;;::::0;:44:::2;;-1:-1:-1::0;65126:10:0::2;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::2;-1:-1:-1::0;;;;;65115:21:0::2;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::2;;;;;;;:::i;:::-;71652:17:::3;71672:16;71689:9;71672:27;;;;;;:::i;:::-;::::0;;;::::3;::::0;;::::3;::::0;;;;;;;;;::::3;;;71740:20:::0;;;:8:::3;:20:::0;;;;;;71710:50:::3;::::0;::::3;::::0;;;;;71672:27;;-1:-1:-1;71672:27:0;;71740:20;71672:27;;71740:20;;71710:50:::3;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;71710:50:0;;;-1:-1:-1;;71710:50:0::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;::::0;;;;;;;-1:-1:-1;;;;;;71779:22:0;::::3;4937:19:::0;71771:69:::3;;;::::0;-1:-1:-1;;;71771:69:0;;21333:2:1;71771:69:0::3;::::0;::::3;21315:21:1::0;;;21352:18;;;21345:30;21411:34;21391:18;;;21384:62;21463:18;;71771:69:0::3;21131:356:1::0;71771:69:0::3;71851:24;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71851:24:0::3;71903:16:::0;;71886:33;;-1:-1:-1;;;;;71930:31:0;::::3;:17;::::0;;::::3;:31:::0;;;;71972:13:::3;::::0;;::::3;:23:::0;;;72006::::3;::::0;::::3;71903:16;72006:23:::0;;;:11:::3;:23:::0;;;;;:32;;71886:6;;72006:23;;;:32:::3;::::0;:23;:32:::3;:::i;:::-;-1:-1:-1::0;72006:32:0::3;::::0;;::::3;::::0;::::3;::::0;::::3;::::0;;-1:-1:-1;;;;;;72006:32:0::3;-1:-1:-1::0;;;;;72006:32:0;;::::3;;::::0;;::::3;::::0;;::::3;::::0;::::3;::::0;;::::3;::::0;;;;72054:59;;72068:10:::3;4265:51:1::0;;72105:7:0;;72054:59;;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;4238:18:1;72054:59:0::3;;;;;;;71641:480;;;71461:660:::0;;;;:::o;28291:185::-;28429:39;28446:4;28452:2;28456:7;28429:39;;;;;;;;;;;;:16;:39::i;78397:73::-;78448:14;78454:7;78448:5;:14::i;:::-;78397:73;:::o;75328:224::-;51078:21;:19;:21::i;:::-;1913:13:::1;:11;:13::i;:::-;75493:39:::2;::::0;-1:-1:-1;;;75493:39:0;;75526:4:::2;75493:39;::::0;::::2;4265:51:1::0;-1:-1:-1;;;;;75465:23:0;::::2;::::0;::::2;::::0;75489:2;;75465:23;;75493:24:::2;::::0;4238:18:1;;75493:39:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75465:68;::::0;-1:-1:-1;;;;;;75465:68:0::2;::::0;;;;;;-1:-1:-1;;;;;6901:32:1;;;75465:68:0::2;::::0;::::2;6883:51:1::0;6950:18;;;6943:34;6856:18;;75465:68:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75443:101;;;::::0;::::2;;51122:20:::0;50516:1;51638:7;:22;51455:213;73425:104;73480:4;30465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30465:16:0;:30;;73504:17;30376:127;43524:233;43599:7;43635:30;43422:10;:17;;43334:113;43635:30;43627:5;:38;43619:95;;;;-1:-1:-1;;;43619:95:0;;24337:2:1;43619:95:0;;;24319:21:1;24376:2;24356:18;;;24349:30;24415:34;24395:18;;;24388:62;-1:-1:-1;;;24466:18:1;;;24459:42;24518:19;;43619:95:0;24135:408:1;43619:95:0;43732:10;43743:5;43732:17;;;;;;;;:::i;:::-;;;;;;;;;43725:24;;43524:233;;;:::o;73722:715::-;73868:7;73877:4;73848:9;65277:15;65293:5;65277:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65269:52;;;;-1:-1:-1;;;65269:52:0;;;;;;;:::i;:::-;73894:21:::1;73918:18;73928:7;73918:9;:18::i;:::-;73894:42;;73951:13;73968:1;73951:18:::0;73947:41:::1;;73979:1;73982:5:::0;73971:17:::1;;;;;;;73947:41;73999:15;74029:12:::0;74060:20:::1;74083:16;74100:9;74083:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;::::0;-1:-1:-1;74083:27:0::1;74121:273;74142:13;74138:1;:17;74121:273;;;74177:10;74190:31;74210:7;74219:1;74190:19;:31::i;:::-;74240:20;::::0;;;:16:::1;:20;::::0;;;;;74177:44;;-1:-1:-1;74240:37:0::1;::::0;;::::1;:20:::0;::::1;:37:::0;74236:147:::1;;74308:2:::0;-1:-1:-1;74339:4:0::1;::::0;-1:-1:-1;74362:5:0::1;;74236:147;-1:-1:-1::0;74157:3:0::1;::::0;::::1;:::i;:::-;;;74121:273;;;-1:-1:-1::0;74412:7:0;;-1:-1:-1;74421:7:0;-1:-1:-1;;;65332:1:0::1;73722:715:::0;;;;;;:::o;69078:211::-;69183:8;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1;;;65401:44:0;;;;;;;:::i;:::-;65100:10:::1;65092:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;::::0;:44:::1;;-1:-1:-1::0;65126:10:0::1;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::1;-1:-1:-1::0;;;;;65115:21:0::1;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::1;;;;;;;:::i;:::-;69214:20:::2;::::0;;;:10:::2;:20;::::0;;;;:27:::2;69237:4:::0;69214:20;:27:::2;:::i;:::-;-1:-1:-1::0;;;69252:22:0::2;::::0;;;:12:::2;:22;::::0;;;;:29;;-1:-1:-1;;69252:29:0::2;69277:4;69252:29;::::0;;69078:211::o;76481:518::-;52864:19;:17;:19::i;:::-;76634:8:::1;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1::0;;;65401:44:0::1;;;;;;;:::i;:::-;65100:10:::2;65092:19;::::0;;;:7:::2;:19;::::0;;;;;::::2;;::::0;:44:::2;;-1:-1:-1::0;65126:10:0::2;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::2;-1:-1:-1::0;;;;;65115:21:0::2;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::2;;;;;;;:::i;:::-;76704:28:::3;76730:2;58771:5:::0;76704:28:::3;:::i;:::-;-1:-1:-1::0;;;;;76687:45:0::3;:13;-1:-1:-1::0;;;;;76687:45:0::3;;;76665:117;;;::::0;-1:-1:-1;;;76665:117:0;;17134:2:1;76665:117:0::3;::::0;::::3;17116:21:1::0;17173:2;17153:18;;;17146:30;-1:-1:-1;;;17192:18:1;;;17185:52;17254:18;;76665:117:0::3;16932:346:1::0;76665:117:0::3;76798:130;::::0;76832:10:::3;4265:51:1::0;;-1:-1:-1;;;;;76798:130:0;::::3;::::0;-1:-1:-1;;;;;76798:130:0;::::3;::::0;76857:8;;76798:130:::3;::::0;4253:2:1;4238:18;76798:130:0::3;;;;;;;76939:52;76956:8;76966:9;76977:13;76939:16;:52::i;:::-;52894:1:::1;76481:518:::0;;;:::o;72700:159::-;72799:6;72780:8;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1;;;65401:44:0;;;;;;;:::i;:::-;-1:-1:-1;;72825:26:0::1;::::0;;;:16:::1;:26;::::0;;;;;::::1;;::::0;72700:159::o;25384:222::-;25456:7;25492:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25492:16:0;;25519:56;;;;-1:-1:-1;;;25519:56:0;;25022:2:1;25519:56:0;;;25004:21:1;25061:2;25041:18;;;25034:30;-1:-1:-1;;;25080:18:1;;;25073:54;25144:18;;25519:56:0;24820:348:1;68546:244:0;68664:9;65277:15;65293:5;65277:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65269:52;;;;-1:-1:-1;;;65269:52:0;;;;;;;:::i;:::-;65100:10:::1;65092:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;::::0;:44:::1;;-1:-1:-1::0;65126:10:0::1;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::1;-1:-1:-1::0;;;;;65115:21:0::1;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::1;;;;;;;:::i;:::-;68696:17:::2;68716:16;68733:9;68716:27;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;;;68754:21:::0;;;:9:::2;:21:::0;;;;;68716:27;;-1:-1:-1;68754:28:0::2;68778:4:::0;68754:21;:28:::2;:::i;:::-;;68685:105;68546:244:::0;;;:::o;66730:439::-;1913:13;:11;:13::i;:::-;66814:11:::1;::::0;::::1;;62309:1;66800:25;66792:61;;;::::0;-1:-1:-1;;;66792:61:0;;25375:2:1;66792:61:0::1;::::0;::::1;25357:21:1::0;25414:2;25394:18;;;25387:30;25453:25;25433:18;;;25426:53;25496:18;;66792:61:0::1;25173:347:1::0;66792:61:0::1;-1:-1:-1::0;;;;;66873:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;::::1;;66872:16;66864:51;;;::::0;-1:-1:-1;;;66864:51:0;;25727:2:1;66864:51:0::1;::::0;::::1;25709:21:1::0;25766:2;25746:18;;;25739:30;-1:-1:-1;;;25785:18:1;;;25778:52;25847:18;;66864:51:0::1;25525:346:1::0;66864:51:0::1;-1:-1:-1::0;;;;;66934:20:0;::::1;66926:57;;;::::0;-1:-1:-1;;;66926:57:0;;26078:2:1;66926:57:0::1;::::0;::::1;26060:21:1::0;26117:2;26097:18;;;26090:30;26156:26;26136:18;;;26129:54;26200:18;;66926:57:0::1;25876:348:1::0;66926:57:0::1;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;-1:-1:-1;;;;;67002:17:0::1;:6;-1:-1:-1::0;;;;;67002:17:0::1;::::0;66994:61:::1;;;::::0;-1:-1:-1;;;66994:61:0;;26431:2:1;66994:61:0::1;::::0;::::1;26413:21:1::0;26470:2;26450:18;;;26443:30;26509:33;26489:18;;;26482:61;26560:18;;66994:61:0::1;26229:355:1::0;66994:61:0::1;-1:-1:-1::0;;;;;67066:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;:22;;-1:-1:-1;;67066:22:0::1;67084:4;67066:22:::0;;::::1;::::0;;;67099:11:::1;:16:::0;;67084:4;;67099:11;;:16:::1;::::0;67084:4;;67066:22:::1;67099:16;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;67154:6;-1:-1:-1::0;;;;;67131:30:0::1;67142:10;-1:-1:-1::0;;;;;67131:30:0::1;;;;;;;;;;;66730:439:::0;:::o;70581:842::-;70843:12;;70671:15;;;;;;;;70806:21;;70843:12;;-1:-1:-1;;;;;70830:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70914:12:0;;70806:50;;-1:-1:-1;70867:30:0;;70914:12;;-1:-1:-1;;;;;70900:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70900:27:0;-1:-1:-1;70982:12:0;;70867:60;;-1:-1:-1;70938:27:0;;70982:12;;-1:-1:-1;;;;;70968:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70968:27:0;-1:-1:-1;71042:12:0;;70938:57;;-1:-1:-1;71006:20:0;;71042:12;;-1:-1:-1;;;;;71029:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71006:49;;71071:6;71066:292;71087:12;;;;71083:16;;71066:292;;;71121:27;71151:11;;;:8;:11;;;;;;71121:41;;;;;;;;;;;;71151:11;;71121:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71188:8;:16;;;71177:5;71183:1;71177:8;;;;;;;;:::i;:::-;;;;;;:27;;;;71238:8;:20;;;71219:13;71233:1;71219:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;71289:8;:20;;;71273:10;71284:1;71273:13;;;;;;;;:::i;:::-;;;;;;:36;;;;;71334:9;:12;71344:1;71334:12;;;;;;;;;;;71324:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;71329:1;71324:7;;;;;;;;:::i;:::-;;;;;;:22;;;;71106:252;71101:3;;;;:::i;:::-;;;71066:292;;;-1:-1:-1;71376:5:0;;71383:13;;-1:-1:-1;71383:13:0;-1:-1:-1;71376:5:0;;-1:-1:-1;70581:842:0;-1:-1:-1;70581:842:0:o;25115:207::-;25187:7;-1:-1:-1;;;;;25215:19:0;;25207:73;;;;-1:-1:-1;;;25207:73:0;;26944:2:1;25207:73:0;;;26926:21:1;26983:2;26963:18;;;26956:30;27022:34;27002:18;;;26995:62;-1:-1:-1;;;27073:18:1;;;27066:39;27122:19;;25207:73:0;26742:405:1;25207:73:0;-1:-1:-1;;;;;;25298:16:0;;;;;:9;:16;;;;;;;25115:207::o;2675:103::-;1913:13;:11;:13::i;:::-;2740:30:::1;2767:1;2740:18;:30::i;:::-;2675:103::o:0;74600:211::-;74695:13;74721:26;74750:8;:20;74759:10;74750:20;;;;;;;;;;;;;74721:49;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;74721:49:0;;;-1:-1:-1;;74721:49:0;;;;;;;;;;;;;;;;;;74788:15;;74600:211;-1:-1:-1;;;74600:211:0:o;62819:47::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68798:236::-;68914:13;68894:9;65277:15;65293:5;65277:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65269:52;;;;-1:-1:-1;;;65269:52:0;;;;;;;:::i;:::-;68940:17:::1;68960:16;68977:9;68960:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;;;69005:21:::0;;;:9:::1;:21:::0;;;;;68998:28;;68960:27;;-1:-1:-1;69005:21:0;68998:28:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68798:236:::0;;;;:::o;77178:175::-;77284:7;77293:6;77265:8;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1;;;65401:44:0;;;;;;;:::i;:::-;77319:26:::1;77336:8;77319:16;:26::i;:::-;77312:33;;;;77178:175:::0;;;;:::o;75040:232::-;51078:21;:19;:21::i;:::-;1913:13:::1;:11;:13::i;:::-;75177:35:::2;::::0;75126:21:::2;::::0;75109:14:::2;::::0;-1:-1:-1;;;;;75177:16:0;::::2;::::0;75126:21;;75109:14;75177:35;75109:14;75177:35;75126:21;75177:16;:35:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75158:54;;;75231:7;75223:41;;;::::0;-1:-1:-1;;;75223:41:0;;27564:2:1;75223:41:0::2;::::0;::::2;27546:21:1::0;27603:2;27583:18;;;27576:30;-1:-1:-1;;;27622:18:1;;;27615:51;27683:18;;75223:41:0::2;27362:345:1::0;75223:41:0::2;75098:174;;51122:20:::0;50516:1;51638:7;:22;51455:213;69727:61;1913:13;:11;:13::i;:::-;69772:8:::1;:6;:8::i;77007:163::-:0;52864:19;:17;:19::i;:::-;77103:8:::1;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1::0;;;65401:44:0::1;;;;;;;:::i;:::-;65100:10:::2;65092:19;::::0;;;:7:::2;:19;::::0;;;;;::::2;;::::0;:44:::2;;-1:-1:-1::0;65126:10:0::2;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::2;-1:-1:-1::0;;;;;65115:21:0::2;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;60518:26:0;;;;:17;:26;;;;;60511:33;75970:390::o;67527:666::-;67652:9;65277:15;65293:5;65277:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65269:52;;;;-1:-1:-1;;;65269:52:0;;;;;;;:::i;:::-;52864:19:::1;:17;:19::i;:::-;65100:10:::2;65092:19;::::0;;;:7:::2;:19;::::0;;;;;::::2;;::::0;:44:::2;;-1:-1:-1::0;65126:10:0::2;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::2;-1:-1:-1::0;;;;;65115:21:0::2;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::2;;;;;;;:::i;:::-;67698:17:::3;67718:16;67735:9;67718:27;;;;;;:::i;:::-;::::0;;;::::3;::::0;;::::3;::::0;;;;;;;;;::::3;;;67785:20:::0;;;:8:::3;:20:::0;;;;;;67756:49:::3;::::0;::::3;::::0;;;;;67718:27;;-1:-1:-1;67718:27:0;;67785:20;67718:27;;67785:20;;67756:49:::3;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;67834:7;:19;;;67824:6;:29;;67816:65;;;::::0;-1:-1:-1;;;67816:65:0;;27914:2:1;67816:65:0::3;::::0;::::3;27896:21:1::0;27953:2;27933:18;;;27926:30;27992:25;27972:18;;;27965:53;28035:18;;67816:65:0::3;27712:347:1::0;67816:65:0::3;67910:7;:19;;;67900:6;:29:::0;67892:58:::3;;;::::0;-1:-1:-1;;;67892:58:0;;28266:2:1;67892:58:0::3;::::0;::::3;28248:21:1::0;28305:2;28285:18;;;28278:30;-1:-1:-1;;;28324:18:1;;;28317:46;28380:18;;67892:58:0::3;28064:340:1::0;67892:58:0::3;68024:15:::0;;67966:139:::3;::::0;68088:6;;67966:139:::3;::::0;::::3;:::i;:::-;;::::0;;;;;::::3;::::0;;68054:19:::3;::::0;;::::3;::::0;67999:10:::3;6883:51:1::0;;6950:18;;;6943:34;67966:139:0;::::3;::::0;6856:18:1;67966:139:0::3;;;;;;;68116:19;::::0;;::::3;:28:::0;;;68155:20:::3;::::0;::::3;;::::0;;;:8:::3;:20:::0;;;;;;:30;;68116:7;;68155:20;;;:30:::3;::::0;:20;:30:::3;:::i;:::-;-1:-1:-1::0;68155:30:0::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;::::0;::::3;::::0;;::::3;::::0;-1:-1:-1;;;;;67527:666:0:o;25842:104::-;25898:13;25931:7;25924:14;;;;;:::i;75599:340::-;51078:21;:19;:21::i;:::-;52864:19:::1;:17;:19::i;:::-;1913:13:::2;:11;:13::i;:::-;75775:26:::3;::::0;-1:-1:-1;;;75775:26:0;;::::3;::::0;::::3;3142:25:1::0;;;75813:4:0::3;::::0;-1:-1:-1;;;;;75775:21:0;::::3;::::0;::::3;::::0;3115:18:1;;75775:26:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;75775:43:0::3;;75753:110;;;::::0;-1:-1:-1;;;75753:110:0;;28867:2:1;75753:110:0::3;::::0;::::3;28849:21:1::0;28906:2;28886:18;;;28879:30;-1:-1:-1;;;28925:18:1;;;28918:47;28982:18;;75753:110:0::3;28665:341:1::0;75753:110:0::3;75874:57;::::0;-1:-1:-1;;;75874:57:0;;75909:4:::3;75874:57;::::0;::::3;29251:34:1::0;-1:-1:-1;;;;;29321:15:1;;;29301:18;;;29294:43;29353:18;;;29346:34;;;75874:26:0;::::3;::::0;::::3;::::0;29186:18:1;;75874:57:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;51122:20:::0;50516:1;51638:7;:22;51455:213;27428:155;27523:52;816:10;27556:8;27566;27523:18;:52::i;69899:674::-;52864:19;:17;:19::i;:::-;65100:10:::1;65092:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;::::0;:44:::1;;-1:-1:-1::0;65126:10:0::1;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::1;-1:-1:-1::0;;;;;65115:21:0::1;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::1;;;;;;;:::i;:::-;70069:15:::2;70085:5;70069:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;70068:23;70060:60;;;::::0;-1:-1:-1;;;70060:60:0;;29593:2:1;70060:60:0::2;::::0;::::2;29575:21:1::0;29632:2;29612:18;;;29605:30;29671:26;29651:18;;;29644:54;29715:18;;70060:60:0::2;29391:348:1::0;70060:60:0::2;70131:26;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;70131:26:0::2;70168:23:::0;;;70202:19:::2;::::0;;::::2;:25:::0;;;70168:15:::2;70238:19;::::0;;::::2;:23:::0;;;70281:12:::2;::::0;::::2;;70272:22:::0;;:8:::2;:22:::0;;;;:32;;70168:7;;70272:22;;;:32:::2;::::0;:22;:32:::2;:::i;:::-;-1:-1:-1::0;70272:32:0::2;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;70365:12:::2;::::0;::::2;;-1:-1:-1::0;70355:23:0;;;:9:::2;:23:::0;;;;:41:::2;70381:15:::0;70355:23;:41:::2;:::i;:::-;-1:-1:-1::0;70433:12:0::2;::::0;70407:23:::2;::::0;70433:12:::2;::::0;;::::2;::::0;70407:16:::2;::::0;:23:::2;::::0;70424:5;;70407:23:::2;:::i;:::-;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;70481:4;70456:15;70472:5;70456:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:29;;;::::2;;-1:-1:-1::0;;70456:29:0;;::::2;::::0;;;::::2;::::0;;70496:12:::2;:17:::0;;70456:29;;70496:12;70456:22:::2;::::0;70496:17:::2;::::0;70456:29;;70496:17:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;70561:3;70554:5;70529:36;;;;;;:::i;:::-;;::::0;;;;::::2;::::0;;70542:10:::2;4265:51:1::0;;70529:36:0;::::2;::::0;4253:2:1;4238:18;70529:36:0::2;;;;;;;70049:524;69899:674:::0;;;:::o;76368:105::-;52864:19;:17;:19::i;:::-;65100:10:::1;65092:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;::::0;:44:::1;;-1:-1:-1::0;65126:10:0::1;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::1;-1:-1:-1::0;;;;;65115:21:0::1;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::1;;;;;;;:::i;:::-;76442:23:::2;59593:19:::0;59586:26;;59525:95;28547:322;28721:41;816:10;28754:7;28721:18;:41::i;:::-;28713:99;;;;-1:-1:-1;;;28713:99:0;;;;;;;:::i;:::-;28823:38;28837:4;28843:2;28847:7;28856:4;28823:13;:38::i;69319:364::-;30441:4;30465:16;;;:7;:16;;;;;;69409:13;;-1:-1:-1;;;;;30465:16:0;69435:114;;;;-1:-1:-1;;;69435:114:0;;30123:2:1;69435:114:0;;;30105:21:1;30162:2;30142:18;;;30135:30;30201:34;30181:18;;;30174:62;-1:-1:-1;;;30252:18:1;;;30245:45;30307:19;;69435:114:0;29921:411:1;69435:114:0;69564:22;;;;:12;:22;;;;;;;;69560:115;;;69595:20;;;;:10;:20;;;;;69588:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69319:364;;;:::o;69560:115::-;69638:37;69648:26;;;:16;:26;;;;;;;;;;;69638:37;;:9;:37;;;;;69631:44;;;;;:::i;69560:115::-;69319:364;;;:::o;74819:162::-;74920:6;74946:16;74963:9;74946:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;74819:162;-1:-1:-1;;74819:162:0:o;65587:1135::-;65721:9;65277:15;65293:5;65277:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65269:52;;;;-1:-1:-1;;;65269:52:0;;;;;;;:::i;:::-;51078:21:::1;:19;:21::i;:::-;52864:19:::2;:17;:19::i;:::-;65100:10:::3;65092:19;::::0;;;:7:::3;:19;::::0;;;;;::::3;;::::0;:44:::3;;-1:-1:-1::0;65126:10:0::3;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::3;-1:-1:-1::0;;;;;65115:21:0::3;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::3;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65788:23:0;::::4;65780:55;;;::::0;-1:-1:-1;;;65780:55:0;;30539:2:1;65780:55:0::4;::::0;::::4;30521:21:1::0;30578:2;30558:18;;;30551:30;-1:-1:-1;;;30597:18:1;;;30590:49;30656:18;;65780:55:0::4;30337:343:1::0;65780:55:0::4;65846:17;65866:16;65883:9;65866:27;;;;;;:::i;:::-;::::0;;;::::4;::::0;;::::4;::::0;;;;;;;;;::::4;;;65933:20:::0;;;:8:::4;:20:::0;;;;;;65904:49:::4;::::0;::::4;::::0;;;;;65866:27;;-1:-1:-1;65866:27:0;;65933:20;65866:27;;65933:20;;65904:49:::4;::::0;::::4;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;65904:49:0;;;-1:-1:-1;;65904:49:0::4;::::0;::::4;::::0;::::4;::::0;;::::4;::::0;;;;::::4;::::0;;::::4;::::0;;;;;;65990:19;;::::4;::::0;66046;;::::4;::::0;65904:49;;-1:-1:-1;65990:19:0;66118:25:::4;66136:7:::0;66046:19;66118:25:::4;:::i;:::-;66098:15;:46;;66076:132;;;::::0;-1:-1:-1;;;66076:132:0;;31017:2:1;66076:132:0::4;::::0;::::4;30999:21:1::0;31056:2;31036:18;;;31029:30;31095:34;31075:18;;;31068:62;-1:-1:-1;;;31146:18:1;;;31139:34;31190:19;;66076:132:0::4;30815:400:1::0;66076:132:0::4;66224:6;66219:441;66240:7;66236:1;:11;66219:441;;;66269:29;66275:9;66286:11;;66269:5;:29::i;:::-;66330:11;::::0;;66313:29:::4;::::0;;;:16:::4;:29;::::0;;;;;;;:42;;-1:-1:-1;;66313:42:0::4;;::::0;::::4;::::0;;::::4;::::0;;;66377:11;;66370:19;;:6:::4;:19:::0;;;;;:26;;-1:-1:-1;;66370:26:0;;::::4;-1:-1:-1::0;66370:26:0;;::::4;::::0;;;66423:11;;66411:24;;:11:::4;:24:::0;;;;;:31;;;;::::4;;::::0;;;66574:20;;;:8:::4;:20:::0;;;;;66462:155;;::::4;::::0;66574:20;66462:155:::4;:::i;:::-;;;;;;;;66545:10;66462:155;;66487:9;-1:-1:-1::0;;;;;66462:155:0::4;;66515:11;;66462:155;;;;3142:25:1::0;;3130:2;3115:18;;2996:177;66462:155:0::4;;;;;;;;66647:1;66632:11;;:16;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;66249:3:0::4;::::0;-1:-1:-1;66249:3:0;::::4;:::i;:::-;;;66219:441;;;;66670:44;66694:10;66706:7;66670:23;:44::i;:::-;65769:953;;;;51122:20:::1;50516:1:::0;51638:7;:22;51455:213;2933:201;1913:13;:11;:13::i;:::-;-1:-1:-1;;;;;3022:22:0;::::1;3014:73;;;::::0;-1:-1:-1;;;3014:73:0;;32269:2:1;3014:73:0::1;::::0;::::1;32251:21:1::0;32308:2;32288:18;;;32281:30;32347:34;32327:18;;;32320:62;-1:-1:-1;;;32398:18:1;;;32391:36;32444:19;;3014:73:0::1;32067:402:1::0;3014:73:0::1;3098:28;3117:8;3098:18;:28::i;69796:65::-:0;1913:13;:11;:13::i;:::-;69843:10:::1;:8;:10::i;72164:245::-:0;72263:8;65409:16;65416:8;65409:6;:16::i;:::-;65401:44;;;;-1:-1:-1;;;65401:44:0;;;;;;;:::i;:::-;52864:19:::1;:17;:19::i;:::-;65100:10:::2;65092:19;::::0;;;:7:::2;:19;::::0;;;;;::::2;;::::0;:44:::2;;-1:-1:-1::0;65126:10:0::2;65115:7;2100:6:::0;;-1:-1:-1;;;;;2100:6:0;;2027:87;65115:7:::2;-1:-1:-1::0;;;;;65115:21:0::2;;65092:44;65070:112;;;;-1:-1:-1::0;;;65070:112:0::2;;;;;;;:::i;:::-;72308:16:::3;::::0;;;:6:::3;:16;::::0;;;;;;;;:28;;-1:-1:-1;;72308:28:0::3;::::0;::::3;;::::0;;::::3;::::0;;;72352:49;;72369:10:::3;4265:51:1::0;;72308:16:0;;72352:49:::3;::::0;4238:18:1;72352:49:0::3;4119:203:1::0;53418:108:0;53330:7;;;;53488:9;53480:38;;;;-1:-1:-1;;;53480:38:0;;32676:2:1;53480:38:0;;;32658:21:1;32715:2;32695:18;;;32688:30;-1:-1:-1;;;32734:18:1;;;32727:46;32790:18;;53480:38:0;32474:340:1;42694:224:0;42796:4;-1:-1:-1;;;;;;42820:50:0;;-1:-1:-1;;;42820:50:0;;:90;;;42874:36;42898:11;42874:23;:36::i;59055:394::-;58771:5;-1:-1:-1;;;;;59197:33:0;;;;59175:125;;;;-1:-1:-1;;;59175:125:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59319:22:0;;59311:60;;;;-1:-1:-1;;;59311:60:0;;33432:2:1;59311:60:0;;;33414:21:1;33471:2;33451:18;;;33444:30;33510:27;33490:18;;;33483:55;33555:18;;59311:60:0;33230:349:1;59311:60:0;59406:35;;;;;;;;;-1:-1:-1;;;;;59406:35:0;;;;;;-1:-1:-1;;;;;59406:35:0;;;;;;;;;;-1:-1:-1;;;59384:57:0;;;;-1:-1:-1;59384:57:0;59055:394::o;35272:135::-;30441:4;30465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30465:16:0;35346:53;;;;-1:-1:-1;;;35346:53:0;;25022:2:1;35346:53:0;;;25004:21:1;25061:2;25041:18;;;25034:30;-1:-1:-1;;;25080:18:1;;;25073:54;25144:18;;35346:53:0;24820:348:1;34551:174:0;34626:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34626:29:0;-1:-1:-1;;;;;34626:29:0;;;;;;;;:24;;34680:23;34626:24;34680:14;:23::i;:::-;-1:-1:-1;;;;;34671:46:0;;;;;;;;;;;34551:174;;:::o;2192:132::-;2100:6;;-1:-1:-1;;;;;2100:6:0;816:10;2256:23;2248:68;;;;-1:-1:-1;;;2248:68:0;;33786:2:1;2248:68:0;;;33768:21:1;;;33805:18;;;33798:30;33864:34;33844:18;;;33837:62;33916:18;;2248:68:0;33584:356:1;30670:264:0;30763:4;30780:13;30796:23;30811:7;30796:14;:23::i;:::-;30780:39;;30849:5;-1:-1:-1;;;;;30838:16:0;:7;-1:-1:-1;;;;;30838:16:0;;:52;;;-1:-1:-1;;;;;;27775:25:0;;;27751:4;27775:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30858:32;30838:87;;;;30918:7;-1:-1:-1;;;;;30894:31:0;:20;30906:7;30894:11;:20::i;:::-;-1:-1:-1;;;;;30894:31:0;;30838:87;30830:96;30670:264;-1:-1:-1;;;;30670:264:0:o;33805:627::-;33964:4;-1:-1:-1;;;;;33937:31:0;:23;33952:7;33937:14;:23::i;:::-;-1:-1:-1;;;;;33937:31:0;;33929:81;;;;-1:-1:-1;;;33929:81:0;;34147:2:1;33929:81:0;;;34129:21:1;34186:2;34166:18;;;34159:30;34225:34;34205:18;;;34198:62;-1:-1:-1;;;34276:18:1;;;34269:35;34321:19;;33929:81:0;33945:401:1;33929:81:0;-1:-1:-1;;;;;34029:16:0;;34021:65;;;;-1:-1:-1;;;34021:65:0;;34553:2:1;34021:65:0;;;34535:21:1;34592:2;34572:18;;;34565:30;34631:34;34611:18;;;34604:62;-1:-1:-1;;;34682:18:1;;;34675:34;34726:19;;34021:65:0;34351:400:1;34021:65:0;34099:39;34120:4;34126:2;34130:7;34099:20;:39::i;:::-;34210:24;;;;:15;:24;;;;;;;;34203:31;;-1:-1:-1;;;;;;34203:31:0;;;-1:-1:-1;;;;;34247:15:0;;;;:9;:15;;;;;:20;;34203:31;;34210:24;34247:20;;34203:31;;34247:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34278:13:0;;;;;;:9;:13;;;;;:18;;34295:1;;34278:13;:18;;34295:1;;34278:18;:::i;:::-;;;;-1:-1:-1;;34307:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34307:21:0;-1:-1:-1;;;;;34307:21:0;;;;;;;;;34346:27;;34307:16;;34346:27;;;;;;;26773:346;26703:416;;:::o;78478:269::-;78622:10;78602:16;78610:7;78602;:16::i;:::-;-1:-1:-1;;;;;78602:30:0;;78594:60;;;;-1:-1:-1;;;78594:60:0;;35091:2:1;78594:60:0;;;35073:21:1;35130:2;35110:18;;;35103:30;-1:-1:-1;;;35149:18:1;;;35142:47;35206:18;;78594:60:0;34889:341:1;78594:60:0;78665:36;78693:7;78665:27;:36::i;:::-;60518:26;;;;:17;:26;;;;;60511:33;78397:73::o;51158:289::-;50560:1;51288:7;;:19;51280:63;;;;-1:-1:-1;;;51280:63:0;;35437:2:1;51280:63:0;;;35419:21:1;35476:2;35456:18;;;35449:30;35515:33;35495:18;;;35488:61;35566:18;;51280:63:0;35235:355:1;51280:63:0;50560:1;51421:7;:18;51158:289::o;59900:427::-;58771:5;-1:-1:-1;;;;;60066:33:0;;;;60044:125;;;;-1:-1:-1;;;60044:125:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60188:22:0;;60180:62;;;;-1:-1:-1;;;60180:62:0;;35797:2:1;60180:62:0;;;35779:21:1;35836:2;35816:18;;;35809:30;35875:29;35855:18;;;35848:57;35922:18;;60180:62:0;35595:351:1;60180:62:0;60284:35;;;;;;;;-1:-1:-1;;;;;60284:35:0;;;;;-1:-1:-1;;;;;60284:35:0;;;;;;;;;;-1:-1:-1;60255:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;60255:64:0;;;;;;59900:427::o;3294:191::-;3387:6;;;-1:-1:-1;;;;;3404:17:0;;;-1:-1:-1;;;;;;3404:17:0;;;;;;;3437:40;;3387:6;;;3404:17;3387:6;;3437:40;;3368:16;;3437:40;3357:128;3294:191;:::o;58057:348::-;58148:7;58205:27;;;:17;:27;;;;;;;;58176:56;;;;;;;;;-1:-1:-1;;;;;58176:56:0;;;;;-1:-1:-1;;;58176:56:0;;;-1:-1:-1;;;;;58176:56:0;;;;;;;;58148:7;;58245:92;;-1:-1:-1;58296:29:0;;;;;;;;;-1:-1:-1;58296:29:0;-1:-1:-1;;;;;58296:29:0;;;;-1:-1:-1;;;58296:29:0;;-1:-1:-1;;;;;58296:29:0;;;;;58245:92;58355:16;;58373:23;;;;;58355:16;;58373:23;;-1:-1:-1;58057:348:0;-1:-1:-1;;58057:348:0:o;53855:118::-;52864:19;:17;:19::i;:::-;53915:7:::1;:14:::0;;-1:-1:-1;;53915:14:0::1;53925:4;53915:14;::::0;;53945:20:::1;53952:12;816:10:::0;;736:98;53952:12:::1;53945:20;::::0;-1:-1:-1;;;;;4283:32:1;;;4265:51;;4253:2;4238:18;53945:20:0::1;;;;;;;53855:118::o:0;34868:315::-;35023:8;-1:-1:-1;;;;;35014:17:0;:5;-1:-1:-1;;;;;35014:17:0;;35006:55;;;;-1:-1:-1;;;35006:55:0;;36153:2:1;35006:55:0;;;36135:21:1;36192:2;36172:18;;;36165:30;36231:27;36211:18;;;36204:55;36276:18;;35006:55:0;35951:349:1;35006:55:0;-1:-1:-1;;;;;35072:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35072:46:0;;;;;;;;;;35134:41;;977::1;;;35134::0;;950:18:1;35134:41:0;837:187:1;29750:313:0;29906:28;29916:4;29922:2;29926:7;29906:9;:28::i;:::-;29953:47;29976:4;29982:2;29986:7;29995:4;29953:22;:47::i;:::-;29945:110;;;;-1:-1:-1;;;29945:110:0;;;;;;;:::i;32268:439::-;-1:-1:-1;;;;;32348:16:0;;32340:61;;;;-1:-1:-1;;;32340:61:0;;36926:2:1;32340:61:0;;;36908:21:1;;;36945:18;;;36938:30;37004:34;36984:18;;;36977:62;37056:18;;32340:61:0;36724:356:1;32340:61:0;30441:4;30465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30465:16:0;:30;32412:58;;;;-1:-1:-1;;;32412:58:0;;37287:2:1;32412:58:0;;;37269:21:1;37326:2;37306:18;;;37299:30;37365;37345:18;;;37338:58;37413:18;;32412:58:0;37085:352:1;32412:58:0;32483:45;32512:1;32516:2;32520:7;32483:20;:45::i;:::-;-1:-1:-1;;;;;32541:13:0;;;;;;:9;:13;;;;;:18;;32558:1;;32541:13;:18;;32558:1;;32541:18;:::i;:::-;;;;-1:-1:-1;;32570:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32570:21:0;-1:-1:-1;;;;;32570:21:0;;;;;;;;32609:33;;32570:16;;;32609:33;;32570:16;;32609:33;75970:390;;:::o;77474:325::-;77617:20;;;77587:27;77617:20;;;:8;:20;;;;;;77587:50;;;;;;;;;;;;77617:20;;77587:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77587:50:0;;;-1:-1:-1;;77587:50:0;;;;;;;;;;;;;;;;;;77672:20;;;77587:50;;-1:-1:-1;77726:23:0;77742:7;77672:20;77726:23;:::i;:::-;77703:20;;;;:46;;;;77760:20;;;;;;;:8;:20;;;:31;;77703:8;;77760:20;;;:31;;:20;:31;:::i;:::-;-1:-1:-1;77760:31:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;77474:325:0:o;54114:120::-;53123:16;:14;:16::i;:::-;54173:7:::1;:15:::0;;-1:-1:-1;;54173:15:0::1;::::0;;54204:22:::1;816:10:::0;54213:12:::1;736:98:::0;61431:194;61557:4;61581:36;61605:11;61581:23;:36::i;77807:234::-;77977:56;78015:4;78021:2;78025:7;77977:37;:56::i;61757:135::-;61826:20;61838:7;61826:11;:20::i;35971:853::-;36125:4;-1:-1:-1;;;;;36146:13:0;;4937:19;:23;36142:675;;36182:71;;-1:-1:-1;;;36182:71:0;;-1:-1:-1;;;;;36182:36:0;;;;;:71;;816:10;;36233:4;;36239:7;;36248:4;;36182:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36182:71:0;;;;;;;;-1:-1:-1;;36182:71:0;;;;;;;;;;;;:::i;:::-;;;36178:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36423:6;:13;36440:1;36423:18;36419:328;;36466:60;;-1:-1:-1;;;36466:60:0;;;;;;;:::i;36419:328::-;36697:6;36691:13;36682:6;36678:2;36674:15;36667:38;36178:584;-1:-1:-1;;;;;;36304:51:0;-1:-1:-1;;;36304:51:0;;-1:-1:-1;36297:58:0;;36142:675;-1:-1:-1;36801:4:0;35971:853;;;;;;:::o;53603:108::-;53330:7;;;;53662:41;;;;-1:-1:-1;;;53662:41:0;;38392:2:1;53662:41:0;;;38374:21:1;38431:2;38411:18;;;38404:30;-1:-1:-1;;;38450:18:1;;;38443:50;38510:18;;53662:41:0;38190:344:1;24746:305:0;24848:4;-1:-1:-1;;;;;;24885:40:0;;-1:-1:-1;;;24885:40:0;;:105;;-1:-1:-1;;;;;;;24942:48:0;;-1:-1:-1;;;24942:48:0;24885:105;:158;;;;25007:36;25031:11;25007:23;:36::i;44370:589::-;-1:-1:-1;;;;;44576:18:0;;44572:187;;44611:40;44643:7;45786:10;:17;;45759:24;;;;:15;:24;;;;;:44;;;45814:24;;;;;;;;;;;;45682:164;44611:40;44572:187;;;44681:2;-1:-1:-1;;;;;44673:10:0;:4;-1:-1:-1;;;;;44673:10:0;;44669:90;;44700:47;44733:4;44739:7;44700:32;:47::i;:::-;-1:-1:-1;;;;;44773:16:0;;44769:183;;44806:45;44843:7;44806:36;:45::i;44769:183::-;44879:4;-1:-1:-1;;;;;44873:10:0;:2;-1:-1:-1;;;;;44873:10:0;;44869:83;;44900:40;44928:2;44932:7;44900:27;:40::i;33046:422::-;33106:13;33122:23;33137:7;33122:14;:23::i;:::-;33106:39;;33158:48;33179:5;33194:1;33198:7;33158:20;:48::i;:::-;33254:24;;;;:15;:24;;;;;;;;33247:31;;-1:-1:-1;;;;;;33247:31:0;;;-1:-1:-1;;;;;33291:16:0;;;;:9;:16;;;;;:21;;33247:31;;33254:24;33291:21;;33247:31;;33291:21;:::i;:::-;;;;-1:-1:-1;;33330:16:0;;;;:7;:16;;;;;;33323:23;;-1:-1:-1;;;;;;33323:23:0;;;33364:36;33338:7;;33330:16;-1:-1:-1;;;;;33364:36:0;;;;;33330:16;;33364:36;75970:390;;:::o;57044:257::-;57162:4;-1:-1:-1;;;;;;57199:41:0;;-1:-1:-1;;;57199:41:0;;:94;;-1:-1:-1;;;;;;;;;;23464:40:0;;;57257:36;23355:157;46473:988;46739:22;46789:1;46764:22;46781:4;46764:16;:22::i;:::-;:26;;;;:::i;:::-;46801:18;46822:26;;;:17;:26;;;;;;46739:51;;-1:-1:-1;46955:28:0;;;46951:328;;-1:-1:-1;;;;;47022:18:0;;47000:19;47022:18;;;:12;:18;;;;;;;;:34;;;;;;;;;47073:30;;;;;;:44;;;47190:30;;:17;:30;;;;;:43;;;46951:328;-1:-1:-1;47375:26:0;;;;:17;:26;;;;;;;;47368:33;;;-1:-1:-1;;;;;47419:18:0;;;;;:12;:18;;;;;:34;;;;;;;47412:41;46473:988::o;47756:1079::-;48034:10;:17;48009:22;;48034:21;;48054:1;;48034:21;:::i;:::-;48066:18;48087:24;;;:15;:24;;;;;;48460:10;:26;;48009:46;;-1:-1:-1;48087:24:0;;48009:46;;48460:26;;;;;;:::i;:::-;;;;;;;;;48438:48;;48524:11;48499:10;48510;48499:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48604:28;;;:15;:28;;;;;;;:41;;;48776:24;;;;;48769:31;48811:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47827:1008;;;47756:1079;:::o;45260:221::-;45345:14;45362:20;45379:2;45362:16;:20::i;:::-;-1:-1:-1;;;;;45393:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45438:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45260:221:0:o;14:118:1:-;100:5;93:13;86:21;79:5;76:32;66:60;;122:1;119;112:12;137:309;202:6;210;263:2;251:9;242:7;238:23;234:32;231:52;;;279:1;276;269:12;231:52;315:9;302:23;292:33;;375:2;364:9;360:18;347:32;388:28;410:5;388:28;:::i;:::-;435:5;425:15;;;137:309;;;;;:::o;451:131::-;-1:-1:-1;;;;;;525:32:1;;515:43;;505:71;;572:1;569;562:12;587:245;645:6;698:2;686:9;677:7;673:23;669:32;666:52;;;714:1;711;704:12;666:52;753:9;740:23;772:30;796:5;772:30;:::i;:::-;821:5;587:245;-1:-1:-1;;;587:245:1:o;1029:131::-;-1:-1:-1;;;;;1104:31:1;;1094:42;;1084:70;;1150:1;1147;1140:12;1165:179;1232:20;;-1:-1:-1;;;;;1281:38:1;;1271:49;;1261:77;;1334:1;1331;1324:12;1349:319;1416:6;1424;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;1532:9;1519:23;1551:31;1576:5;1551:31;:::i;:::-;1601:5;-1:-1:-1;1625:37:1;1658:2;1643:18;;1625:37;:::i;:::-;1615:47;;1349:319;;;;;:::o;1673:127::-;1734:10;1729:3;1725:20;1722:1;1715:31;1765:4;1762:1;1755:15;1789:4;1786:1;1779:15;1805:632;1870:5;-1:-1:-1;;;;;1941:2:1;1933:6;1930:14;1927:40;;;1947:18;;:::i;:::-;2022:2;2016:9;1990:2;2076:15;;-1:-1:-1;;2072:24:1;;;2098:2;2068:33;2064:42;2052:55;;;2122:18;;;2142:22;;;2119:46;2116:72;;;2168:18;;:::i;:::-;2208:10;2204:2;2197:22;2237:6;2228:15;;2267:6;2259;2252:22;2307:3;2298:6;2293:3;2289:16;2286:25;2283:45;;;2324:1;2321;2314:12;2283:45;2374:6;2369:3;2362:4;2354:6;2350:17;2337:44;2429:1;2422:4;2413:6;2405;2401:19;2397:30;2390:41;;;;1805:632;;;;;:::o;2442:222::-;2485:5;2538:3;2531:4;2523:6;2519:17;2515:27;2505:55;;2556:1;2553;2546:12;2505:55;2578:80;2654:3;2645:6;2632:20;2625:4;2617:6;2613:17;2578:80;:::i;2669:322::-;2738:6;2791:2;2779:9;2770:7;2766:23;2762:32;2759:52;;;2807:1;2804;2797:12;2759:52;2847:9;2834:23;-1:-1:-1;;;;;2872:6:1;2869:30;2866:50;;;2912:1;2909;2902:12;2866:50;2935;2977:7;2968:6;2957:9;2953:22;2935:50;:::i;3178:250::-;3263:1;3273:113;3287:6;3284:1;3281:13;3273:113;;;3363:11;;;3357:18;3344:11;;;3337:39;3309:2;3302:10;3273:113;;;-1:-1:-1;;3420:1:1;3402:16;;3395:27;3178:250::o;3433:271::-;3475:3;3513:5;3507:12;3540:6;3535:3;3528:19;3556:76;3625:6;3618:4;3613:3;3609:14;3602:4;3595:5;3591:16;3556:76;:::i;:::-;3686:2;3665:15;-1:-1:-1;;3661:29:1;3652:39;;;;3693:4;3648:50;;3433:271;-1:-1:-1;;3433:271:1:o;3709:220::-;3858:2;3847:9;3840:21;3821:4;3878:45;3919:2;3908:9;3904:18;3896:6;3878:45;:::i;3934:180::-;3993:6;4046:2;4034:9;4025:7;4021:23;4017:32;4014:52;;;4062:1;4059;4052:12;4014:52;-1:-1:-1;4085:23:1;;3934:180;-1:-1:-1;3934:180:1:o;4327:315::-;4395:6;4403;4456:2;4444:9;4435:7;4431:23;4427:32;4424:52;;;4472:1;4469;4462:12;4424:52;4511:9;4498:23;4530:31;4555:5;4530:31;:::i;:::-;4580:5;4632:2;4617:18;;;;4604:32;;-1:-1:-1;;;4327:315:1:o;5069:276::-;5127:6;5180:2;5168:9;5159:7;5155:23;5151:32;5148:52;;;5196:1;5193;5186:12;5148:52;5235:9;5222:23;5285:10;5278:5;5274:22;5267:5;5264:33;5254:61;;5311:1;5308;5301:12;5350:247;5409:6;5462:2;5450:9;5441:7;5437:23;5433:32;5430:52;;;5478:1;5475;5468:12;5430:52;5517:9;5504:23;5536:31;5561:5;5536:31;:::i;5602:456::-;5679:6;5687;5695;5748:2;5736:9;5727:7;5723:23;5719:32;5716:52;;;5764:1;5761;5754:12;5716:52;5803:9;5790:23;5822:31;5847:5;5822:31;:::i;:::-;5872:5;-1:-1:-1;5929:2:1;5914:18;;5901:32;5942:33;5901:32;5942:33;:::i;:::-;5602:456;;5994:7;;-1:-1:-1;;;6048:2:1;6033:18;;;;6020:32;;5602:456::o;6063:388::-;6268:2;6257:9;6250:21;6231:4;6288:45;6329:2;6318:9;6314:18;6306:6;6288:45;:::i;:::-;-1:-1:-1;;;;;6369:32:1;;;;6364:2;6349:18;;6342:60;-1:-1:-1;6433:2:1;6418:18;6411:34;6280:53;6063:388;-1:-1:-1;6063:388:1:o;6456:248::-;6524:6;6532;6585:2;6573:9;6564:7;6560:23;6556:32;6553:52;;;6601:1;6598;6591:12;6553:52;-1:-1:-1;;6624:23:1;;;6694:2;6679:18;;;6666:32;;-1:-1:-1;6456:248:1:o;7201:525::-;7288:6;7296;7304;7357:2;7345:9;7336:7;7332:23;7328:32;7325:52;;;7373:1;7370;7363:12;7325:52;7413:9;7400:23;-1:-1:-1;;;;;7438:6:1;7435:30;7432:50;;;7478:1;7475;7468:12;7432:50;7501;7543:7;7534:6;7523:9;7519:22;7501:50;:::i;:::-;7491:60;;;7601:2;7590:9;7586:18;7573:32;7614:31;7639:5;7614:31;:::i;7731:388::-;7799:6;7807;7860:2;7848:9;7839:7;7835:23;7831:32;7828:52;;;7876:1;7873;7866:12;7828:52;7915:9;7902:23;7934:31;7959:5;7934:31;:::i;:::-;7984:5;-1:-1:-1;8041:2:1;8026:18;;8013:32;8054:33;8013:32;8054:33;:::i;8124:457::-;8202:6;8210;8263:2;8251:9;8242:7;8238:23;8234:32;8231:52;;;8279:1;8276;8269:12;8231:52;8319:9;8306:23;-1:-1:-1;;;;;8344:6:1;8341:30;8338:50;;;8384:1;8381;8374:12;8338:50;8407;8449:7;8440:6;8429:9;8425:22;8407:50;:::i;:::-;8397:60;;;8507:2;8496:9;8492:18;8479:32;8520:31;8545:5;8520:31;:::i;8849:390::-;8927:6;8935;8988:2;8976:9;8967:7;8963:23;8959:32;8956:52;;;9004:1;9001;8994:12;8956:52;9040:9;9027:23;9017:33;;9101:2;9090:9;9086:18;9073:32;-1:-1:-1;;;;;9120:6:1;9117:30;9114:50;;;9160:1;9157;9150:12;9114:50;9183;9225:7;9216:6;9205:9;9201:22;9183:50;:::i;:::-;9173:60;;;8849:390;;;;;:::o;9244:387::-;9320:6;9328;9336;9389:2;9377:9;9368:7;9364:23;9360:32;9357:52;;;9405:1;9402;9395:12;9357:52;9441:9;9428:23;9418:33;;9501:2;9490:9;9486:18;9473:32;9514:31;9539:5;9514:31;:::i;:::-;9564:5;-1:-1:-1;9588:37:1;9621:2;9606:18;;9588:37;:::i;:::-;9578:47;;9244:387;;;;;:::o;9833:543::-;9921:6;9929;9982:2;9970:9;9961:7;9957:23;9953:32;9950:52;;;9998:1;9995;9988:12;9950:52;10038:9;10025:23;-1:-1:-1;;;;;10108:2:1;10100:6;10097:14;10094:34;;;10124:1;10121;10114:12;10094:34;10147:50;10189:7;10180:6;10169:9;10165:22;10147:50;:::i;:::-;10137:60;;10250:2;10239:9;10235:18;10222:32;10206:48;;10279:2;10269:8;10266:16;10263:36;;;10295:1;10292;10285:12;10263:36;;10318:52;10362:7;10351:8;10340:9;10336:24;10318:52;:::i;10381:616::-;10433:3;10471:5;10465:12;10498:6;10493:3;10486:19;10524:4;10565:2;10560:3;10556:12;10590:11;10617;10610:18;;10667:6;10664:1;10660:14;10653:5;10649:26;10637:38;;10709:2;10702:5;10698:14;10730:1;10740:231;10754:6;10751:1;10748:13;10740:231;;;10825:5;10819:4;10815:16;10810:3;10803:29;10853:38;10886:4;10877:6;10871:13;10853:38;:::i;:::-;10949:12;;;;10845:46;-1:-1:-1;10914:15:1;;;;10776:1;10769:9;10740:231;;;-1:-1:-1;10987:4:1;;10381:616;-1:-1:-1;;;;;;;10381:616:1:o;11002:435::-;11055:3;11093:5;11087:12;11120:6;11115:3;11108:19;11146:4;11175:2;11170:3;11166:12;11159:19;;11212:2;11205:5;11201:14;11233:1;11243:169;11257:6;11254:1;11251:13;11243:169;;;11318:13;;11306:26;;11352:12;;;;11387:15;;;;11279:1;11272:9;11243:169;;;-1:-1:-1;11428:3:1;;11002:435;-1:-1:-1;;;;;11002:435:1:o;11442:913::-;11895:3;11884:9;11877:22;11858:4;11922:56;11973:3;11962:9;11958:19;11950:6;11922:56;:::i;:::-;12026:9;12018:6;12014:22;12009:2;11998:9;11994:18;11987:50;12060:44;12097:6;12089;12060:44;:::i;:::-;12046:58;;12152:9;12144:6;12140:22;12135:2;12124:9;12120:18;12113:50;12186:44;12223:6;12215;12186:44;:::i;:::-;12172:58;;12278:9;12270:6;12266:22;12261:2;12250:9;12246:18;12239:50;12306:43;12342:6;12334;12306:43;:::i;:::-;12298:51;11442:913;-1:-1:-1;;;;;;;11442:913:1:o;12360:362::-;12565:2;12554:9;12547:21;12528:4;12585:45;12626:2;12615:9;12611:18;12603:6;12585:45;:::i;:::-;12661:2;12646:18;;12639:34;;;;-1:-1:-1;12704:2:1;12689:18;12682:34;12577:53;12360:362;-1:-1:-1;12360:362:1:o;13037:390::-;13115:6;13123;13176:2;13164:9;13155:7;13151:23;13147:32;13144:52;;;13192:1;13189;13182:12;13144:52;13232:9;13219:23;-1:-1:-1;;;;;13257:6:1;13254:30;13251:50;;;13297:1;13294;13287:12;13251:50;13320;13362:7;13353:6;13342:9;13338:22;13320:50;:::i;:::-;13310:60;13417:2;13402:18;;;;13389:32;;-1:-1:-1;;;;13037:390:1:o;13432:382::-;13497:6;13505;13558:2;13546:9;13537:7;13533:23;13529:32;13526:52;;;13574:1;13571;13564:12;13526:52;13613:9;13600:23;13632:31;13657:5;13632:31;:::i;:::-;13682:5;-1:-1:-1;13739:2:1;13724:18;;13711:32;13752:30;13711:32;13752:30;:::i;13819:611::-;13916:6;13924;13932;13985:2;13973:9;13964:7;13960:23;13956:32;13953:52;;;14001:1;13998;13991:12;13953:52;14041:9;14028:23;-1:-1:-1;;;;;14111:2:1;14103:6;14100:14;14097:34;;;14127:1;14124;14117:12;14097:34;14150:50;14192:7;14183:6;14172:9;14168:22;14150:50;:::i;:::-;14140:60;;14247:2;14236:9;14232:18;14219:32;14209:42;;14304:2;14293:9;14289:18;14276:32;14260:48;;14333:2;14323:8;14320:16;14317:36;;;14349:1;14346;14339:12;14317:36;;14372:52;14416:7;14405:8;14394:9;14390:24;14372:52;:::i;:::-;14362:62;;;13819:611;;;;;:::o;14435:795::-;14530:6;14538;14546;14554;14607:3;14595:9;14586:7;14582:23;14578:33;14575:53;;;14624:1;14621;14614:12;14575:53;14663:9;14650:23;14682:31;14707:5;14682:31;:::i;:::-;14732:5;-1:-1:-1;14789:2:1;14774:18;;14761:32;14802:33;14761:32;14802:33;:::i;:::-;14854:7;-1:-1:-1;14908:2:1;14893:18;;14880:32;;-1:-1:-1;14963:2:1;14948:18;;14935:32;-1:-1:-1;;;;;14979:30:1;;14976:50;;;15022:1;15019;15012:12;14976:50;15045:22;;15098:4;15090:13;;15086:27;-1:-1:-1;15076:55:1;;15127:1;15124;15117:12;15076:55;15150:74;15216:7;15211:2;15198:16;15193:2;15189;15185:11;15150:74;:::i;:::-;15140:84;;;14435:795;;;;;;;:::o;15235:525::-;15322:6;15330;15338;15391:2;15379:9;15370:7;15366:23;15362:32;15359:52;;;15407:1;15404;15397:12;15359:52;15446:9;15433:23;15465:31;15490:5;15465:31;:::i;:::-;15515:5;-1:-1:-1;15567:2:1;15552:18;;15539:32;;-1:-1:-1;15622:2:1;15607:18;;15594:32;-1:-1:-1;;;;;15638:30:1;;15635:50;;;15681:1;15678;15671:12;15635:50;15704;15746:7;15737:6;15726:9;15722:22;15704:50;:::i;15765:339::-;15967:2;15949:21;;;16006:2;15986:18;;;15979:30;-1:-1:-1;;;16040:2:1;16025:18;;16018:45;16095:2;16080:18;;15765:339::o;16109:342::-;16311:2;16293:21;;;16350:2;16330:18;;;16323:30;-1:-1:-1;;;16384:2:1;16369:18;;16362:48;16442:2;16427:18;;16109:342::o;16456:127::-;16517:10;16512:3;16508:20;16505:1;16498:31;16548:4;16545:1;16538:15;16572:4;16569:1;16562:15;16588:127;16649:10;16644:3;16640:20;16637:1;16630:31;16680:4;16677:1;16670:15;16704:4;16701:1;16694:15;16720:207;16759:1;-1:-1:-1;;;;;16838:2:1;16835:1;16831:10;16860:3;16850:37;;16867:18;;:::i;:::-;16905:10;;16901:20;;;;;16720:207;-1:-1:-1;;16720:207:1:o;17283:289::-;17414:3;17452:6;17446:13;17468:66;17527:6;17522:3;17515:4;17507:6;17503:17;17468:66;:::i;:::-;17550:16;;;;;17283:289;-1:-1:-1;;17283:289:1:o;17577:341::-;17779:2;17761:21;;;17818:2;17798:18;;;17791:30;-1:-1:-1;;;17852:2:1;17837:18;;17830:47;17909:2;17894:18;;17577:341::o;17923:380::-;18002:1;17998:12;;;;18045;;;18066:61;;18120:4;18112:6;18108:17;18098:27;;18066:61;18173:2;18165:6;18162:14;18142:18;18139:38;18136:161;;18219:10;18214:3;18210:20;18207:1;18200:31;18254:4;18251:1;18244:15;18282:4;18279:1;18272:15;19851:151;19941:4;19934:12;;;19920;;;19916:31;;19959:14;;19956:40;;;19976:18;;:::i;20007:409::-;20209:2;20191:21;;;20248:2;20228:18;;;20221:30;20287:34;20282:2;20267:18;;20260:62;-1:-1:-1;;;20353:2:1;20338:18;;20331:43;20406:3;20391:19;;20007:409::o;20421:168::-;20494:9;;;20525;;20542:15;;;20536:22;;20522:37;20512:71;;20563:18;;:::i;20594:120::-;20634:1;20660;20650:35;;20665:18;;:::i;:::-;-1:-1:-1;20699:9:1;;20594:120::o;21618:545::-;21720:2;21715:3;21712:11;21709:448;;;21756:1;21781:5;21777:2;21770:17;21826:4;21822:2;21812:19;21896:2;21884:10;21880:19;21877:1;21873:27;21867:4;21863:38;21932:4;21920:10;21917:20;21914:47;;;-1:-1:-1;21955:4:1;21914:47;22010:2;22005:3;22001:12;21998:1;21994:20;21988:4;21984:31;21974:41;;22065:82;22083:2;22076:5;22073:13;22065:82;;;22128:17;;;22109:1;22098:13;22065:82;;;22069:3;;;21618:545;;;:::o;22339:1352::-;22465:3;22459:10;-1:-1:-1;;;;;22484:6:1;22481:30;22478:56;;;22514:18;;:::i;:::-;22543:97;22633:6;22593:38;22625:4;22619:11;22593:38;:::i;:::-;22587:4;22543:97;:::i;:::-;22695:4;;22759:2;22748:14;;22776:1;22771:663;;;;23478:1;23495:6;23492:89;;;-1:-1:-1;23547:19:1;;;23541:26;23492:89;-1:-1:-1;;22296:1:1;22292:11;;;22288:24;22284:29;22274:40;22320:1;22316:11;;;22271:57;23594:81;;22741:944;;22771:663;21565:1;21558:14;;;21602:4;21589:18;;-1:-1:-1;;22807:20:1;;;22925:236;22939:7;22936:1;22933:14;22925:236;;;23028:19;;;23022:26;23007:42;;23120:27;;;;23088:1;23076:14;;;;22955:19;;22925:236;;;22929:3;23189:6;23180:7;23177:19;23174:201;;;23250:19;;;23244:26;-1:-1:-1;;23333:1:1;23329:14;;;23345:3;23325:24;23321:37;23317:42;23302:58;23287:74;;23174:201;-1:-1:-1;;;;;23421:1:1;23405:14;;;23401:22;23388:36;;-1:-1:-1;22339:1352:1:o;23696:184::-;23766:6;23819:2;23807:9;23798:7;23794:23;23790:32;23787:52;;;23835:1;23832;23825:12;23787:52;-1:-1:-1;23858:16:1;;23696:184;-1:-1:-1;23696:184:1:o;23885:245::-;23952:6;24005:2;23993:9;23984:7;23980:23;23976:32;23973:52;;;24021:1;24018;24011:12;23973:52;24053:9;24047:16;24072:28;24094:5;24072:28;:::i;24548:127::-;24609:10;24604:3;24600:20;24597:1;24590:31;24640:4;24637:1;24630:15;24664:4;24661:1;24654:15;24680:135;24719:3;24740:17;;;24737:43;;24760:18;;:::i;:::-;-1:-1:-1;24807:1:1;24796:13;;24680:135::o;26589:148::-;26677:4;26656:12;;;26670;;;26652:31;;26695:13;;26692:39;;;26711:18;;:::i;28409:251::-;28479:6;28532:2;28520:9;28511:7;28507:23;28503:32;28500:52;;;28548:1;28545;28538:12;28500:52;28580:9;28574:16;28599:31;28624:5;28599:31;:::i;29744:172::-;29811:10;29841;;;29853;;;29837:27;;29876:11;;;29873:37;;;29890:18;;:::i;:::-;29873:37;29744:172;;;;:::o;30685:125::-;30750:9;;;30771:10;;;30768:36;;;30784:18;;:::i;31220:842::-;31348:3;31377:1;31410:6;31404:13;31440:36;31466:9;31440:36;:::i;:::-;31495:1;31512:18;;;31539:133;;;;31686:1;31681:356;;;;31505:532;;31539:133;-1:-1:-1;;31572:24:1;;31560:37;;31645:14;;31638:22;31626:35;;31617:45;;;-1:-1:-1;31539:133:1;;31681:356;31712:6;31709:1;31702:17;31742:4;31787:2;31784:1;31774:16;31812:1;31826:165;31840:6;31837:1;31834:13;31826:165;;;31918:14;;31905:11;;;31898:35;31961:16;;;;31855:10;;31826:165;;;31830:3;;;32020:6;32015:3;32011:16;32004:23;;31505:532;-1:-1:-1;32053:3:1;;31220:842;-1:-1:-1;;;;;;31220:842:1:o;32819:406::-;33021:2;33003:21;;;33060:2;33040:18;;;33033:30;33099:34;33094:2;33079:18;;33072:62;-1:-1:-1;;;33165:2:1;33150:18;;33143:40;33215:3;33200:19;;32819:406::o;34756:128::-;34823:9;;;34844:11;;;34841:37;;;34858:18;;:::i;36305:414::-;36507:2;36489:21;;;36546:2;36526:18;;;36519:30;36585:34;36580:2;36565:18;;36558:62;-1:-1:-1;;;36651:2:1;36636:18;;36629:48;36709:3;36694:19;;36305:414::o;37442:489::-;-1:-1:-1;;;;;37711:15:1;;;37693:34;;37763:15;;37758:2;37743:18;;37736:43;37810:2;37795:18;;37788:34;;;37858:3;37853:2;37838:18;;37831:31;;;37636:4;;37879:46;;37905:19;;37897:6;37879:46;:::i;:::-;37871:54;37442:489;-1:-1:-1;;;;;;37442:489:1:o;37936:249::-;38005:6;38058:2;38046:9;38037:7;38033:23;38029:32;38026:52;;;38074:1;38071;38064:12;38026:52;38106:9;38100:16;38125:30;38149:5;38125:30;:::i;38539:127::-;38600:10;38595:3;38591:20;38588:1;38581:31;38631:4;38628:1;38621:15;38655:4;38652:1;38645:15

Swarm Source

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