ETH Price: $4,043.87 (+3.61%)

Token

Metalk Name Service (MNS)
 

Overview

Max Total Supply

1,124 MNS

Holders

949

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
cryptoxiong.eth
Balance
1 MNS
0x5743ad8cfcf6ff9bcbb042a18ec40c48ee98b28e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Metalk Name Service is a digital identity system used in Metalk social application. MNS is unique and tradable, allowing users to access homepages, add friends and other functions.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MNSNFT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
pragma experimental ABIEncoderV2;

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

interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
/**
 * @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);
}

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

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;
    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }
    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }
    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Collection of functions related to the address Serial
 */
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
     * Serials of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {size := extcodesize(account)}
        return size > 0;
    }
    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success,) = recipient.call{value : amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value : value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error ApproveToCaller();
    error ApprovalToCurrentOwner();
    error BalanceQueryForZeroAddress();
    error MintedQueryForZeroAddress();
    error BurnedQueryForZeroAddress();
    error AuxQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerIndexOutOfBounds();
    error OwnerQueryForNonexistentToken();
    error TokenIndexOutOfBounds();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    // Base URI
    string private _baseURI;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }
    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
    unchecked {
        return _currentIndex - _burnCounter - _startTokenId();
    }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
    unchecked {
        return _currentIndex - _startTokenId();
    }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr && curr < _currentIndex) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (!ownership.burned) {
                if (ownership.addr != address(0)) {
                    return ownership;
                }
                // Invariant:
                // There will always be an ownership that has an address and is not burned
                // before an ownership that does not have an address and is not burned.
                // Hence, curr will not underflow.
                while (true) {
                    curr--;
                    ownership = _ownerships[curr];
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                }
            }
        }
    }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI_ = baseURI();
        return bytes(baseURI_).length != 0 ? string(abi.encodePacked(baseURI_, tokenId.toString())) : '';
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
        !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
    unchecked {
        _addressData[to].balance += uint64(quantity);
        _addressData[to].numberMinted += uint64(quantity);

        _ownerships[startTokenId].addr = to;
        _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

        uint256 updatedIndex = startTokenId;
        uint256 end = updatedIndex + quantity;

        if (safe && to.isContract()) {
            do {
                emit Transfer(address(0), to, updatedIndex);
                if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
            }
            while (updatedIndex != end);
            // Reentrancy protection
            if (_currentIndex != startTokenId) revert();
        } else {
            do {
                emit Transfer(address(0), to, updatedIndex++);
            }
            while (updatedIndex != end);
        }
        _currentIndex = updatedIndex;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
        isApprovedForAll(prevOwnership.addr, _msgSender()) ||
        getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
    unchecked {
        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;

        _ownerships[tokenId].addr = to;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            // This will suffice for checking _exists(nextTokenId),
            // as a burned slot cannot contain the zero address.
            if (nextTokenId < _currentIndex) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }
    }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
    unchecked {
        _addressData[prevOwnership.addr].balance -= 1;
        _addressData[prevOwnership.addr].numberBurned += 1;

        // Keep track of who burned the token, and the timestamp of burning.
        _ownerships[tokenId].addr = prevOwnership.addr;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
        _ownerships[tokenId].burned = true;

        // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            // This will suffice for checking _exists(nextTokenId),
            // as a burned slot cannot contain the zero address.
            if (nextTokenId < _currentIndex) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }
    }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
    unchecked {
        _burnCounter++;
    }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

/**
 * @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 ()  {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

abstract contract OwnerCheck is Ownable {
    mapping(address => bool) public keeperMap;
    uint8 private unlocked = 1;

    event SetKeeper(address addr, bool auth);

    modifier onlyKeeper(address addr) {
        require(isKeeper(addr), "caller is not the keeper");
        _;
    }

    modifier lock() {
        require(unlocked == 1, 'Contract: LOCKED');
        unlocked = 0;
        _;
        unlocked = 1;
    }

    function setKeeper(address addr, bool auth) public onlyOwner {
        keeperMap[addr] = auth;
        emit SetKeeper(addr, auth);
    }

    function isKeeper(address addr) public view returns (bool) {
        return keeperMap[addr];
    }

}

interface IERC20 {
    function transfer(address recipient, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

contract MNSNFT is ERC721A, OwnerCheck {
    using SafeMath for uint256;
    using Strings for uint256;
    using SafeERC20 for IERC20;

    IERC20 public metaToken;
    //card id start from 1
    //nick name=>card id
    mapping(bytes32 => uint256) private nickNameCardId;
    //keep lower nick name=>card id for check if nick name already register
    mapping(bytes32 => uint256) private nickNameLowerCardId;
    //card id=>nick name
    mapping(uint256 => bytes32) private cardIdNickName;
    //user address=>current nick name used in metalk
    mapping(address => bytes32) private userBindNickName;
    //price of one nick name
    uint256 public nickNamePrice = 5e16;
    uint256 public nickNameMetaPrice;
    address payable public ethRecipient = payable(0x50884B6452D807576a4B316DDE1944F0B66069A7);
    bool public useWhiteList = true;
    bool public metaUseWhiteList = true;
    //white list merkle root
    bytes32 public merkleRoot = 0x4660af648282e8881b4beb703d11d5ef2646a5ccc8b8e46e649f3790f6954e39;

    bytes32 public metaMerkleRoot;
    //already minted number less than max amount in white list
    //0-10 is which type mint,0 value means not mint;1 means already mint
    //16- save already minted
    //Cryptopunk=1、Meebits=2、Clonex=3、VeeFriends=4、AZUKI=5
    //BAYC=6、MAYC=7、Doodle=8、InvisibleFriends=9、Mfers=10
    //0 for others
    mapping(address => uint256) private _alreadyMinted;
    mapping(address => uint256) private _metaAlreadyMinted;

    bool public stopped = true;
    bool public metaStopped = true;

    struct social {
        string twitter;
        string instagram;
        string facebook;
        string discord;
    }

    mapping(address => social) socialLink;

    event BuyNickName(address user, bytes32 nickName, uint256 cardId, uint256 nickNamePrice, uint8 _type);
    event BuyNickNameByMeta(address user, bytes32 nickName, uint256 cardId, uint256 nickNamePrice, uint8 _type);
    event ChangeBindMNS(address user, uint256 cardId, bytes32 currentNick, bytes32 nick);

    //just for get function,not store data
    struct tokenNickName {
        uint256 tokenId;
        string nickName;
        string uri;
    }

    constructor(string memory _name, string memory _symbol, IERC20 meta) ERC721A(_name, _symbol) {
        _setBaseURI("https://storage.googleapis.com/metalk/mns/metadata/");
        metaToken = meta;
    }

    function buy(bytes32 _nickName, bytes32[] calldata merkleProof, uint64 maxCount, uint8 _type) public payable lock {
        require(!stopped, 'stopped');
        require(msg.value == nickNamePrice, 'eth need more');

        (bytes32 lo,bool valid) = lower(_nickName);
        require(valid, 'name invalid');
        require(nickNameLowerCardId[lo] == 0, 'name exists');

        if (useWhiteList) {
            require((_type > 0) && (_type < 11), 'type wrong');
            uint256 temp = _alreadyMinted[msg.sender];
            (uint64 total, uint16 setValue) = (uint64(temp >> 16), uint16(temp) & (uint16(0x01) << _type));
            require(total < uint64(maxCount), 'Insufficient left');
            require(setValue == 0, 'type used');
            require(_verify(merkleProof, msg.sender, uint256(maxCount), merkleRoot), 'Invalid proof');
            _alreadyMinted[msg.sender] = uint256(uint256(total + 1) << 16) | uint256((uint16(temp) | (uint16(0x01) << _type)));
        }

        ethRecipient.transfer(nickNamePrice);
        uint256 cardId = mint(msg.sender, _nickName, lo);
        emit BuyNickName(msg.sender, _nickName, cardId, nickNamePrice, _type);
    }

    //approve meta first
    function buyUseMeta(bytes32 _nickName, bytes32[] calldata merkleProof, uint64 maxCount, uint8 _type) public payable lock {
        require(!metaStopped, 'stopped');

        (bytes32 lo,bool valid) = lower(_nickName);
        require(valid, 'name invalid');
        require(nickNameLowerCardId[lo] == 0, 'name exists');

        if (metaUseWhiteList) {
            require((_type > 0) && (_type < 11), 'type wrong');
            uint256 temp = _metaAlreadyMinted[msg.sender];
            (uint64 total, uint16 setValue) = (uint64(temp >> 16), uint16(temp) & (uint16(0x01) << _type));
            require(setValue == 0, 'type used');
            require(total < uint256(maxCount), 'Insufficient meta left');
            require(_verify(merkleProof, msg.sender, uint256(maxCount), metaMerkleRoot), 'Invalid proof');
            _metaAlreadyMinted[msg.sender] = uint256(uint256(total + 1) << 16) | uint256((uint16(temp) | (uint16(0x01) << _type)));
        }

        metaToken.safeTransferFrom(msg.sender, ethRecipient, nickNameMetaPrice);
        uint256 cardId = mint(msg.sender, _nickName, lo);
        emit BuyNickNameByMeta(msg.sender, _nickName, cardId, nickNameMetaPrice, _type);
    }

    function mint(address to, bytes32 _nickName, bytes32 lo) private returns (uint cardId){
        //card id start from 1
        cardId = totalSupply() + 1;
        _mint(to, 1, new bytes(0), false);
        (nickNameCardId[_nickName], nickNameLowerCardId[lo], cardIdNickName[cardId]) = (cardId, cardId, _nickName);
    }

    function _verify(
        bytes32[] calldata merkleProof,
        address sender,
        uint256 maxAmount,
        bytes32 _merkleRoot
    ) private pure returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(sender, maxAmount.toString()));
        return processProof(merkleProof, leaf) == _merkleRoot;
    }

    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }

    function changeBindMNS(uint256 cardId) public lock {
        address owner = ownerOf(cardId);
        require(msg.sender == owner, "not owner");
        emit ChangeBindMNS(msg.sender, cardId, userBindNickName[msg.sender], cardIdNickName[cardId]);
        userBindNickName[msg.sender] = cardIdNickName[cardId];
    }

    //for user unbind card and sell
    function clearBindMNS() public lock {
        bytes32 oldNickName = userBindNickName[msg.sender];
        require(oldNickName != 0, "not bind");
        uint256 cardId = nickNameCardId[oldNickName];
        address owner = ownerOf(cardId);
        require(msg.sender == owner, "not owner");
        emit ChangeBindMNS(msg.sender, cardId, oldNickName, 0);
        delete userBindNickName[msg.sender];
    }

    function _beforeTokenTransfers(
        address from,
        address,
        uint256 startTokenId,
        uint256 quantity) internal override {
        bytes32 currentNickName = userBindNickName[from];
        if (currentNickName != 0) {
            for (uint i = 0; i < quantity; i++) {
                if (nickNameCardId[currentNickName] == startTokenId + i) {
                    emit ChangeBindMNS(from, startTokenId + i, currentNickName, 0);
                    delete userBindNickName[from];
                    break;
                }
            }
        }
    }

    function userBindInfo(address[] memory user) external view returns (tokenNickName[] memory ret){
        uint256 count = user.length;
        ret = new tokenNickName[](count);
        for (uint256 i = 0; i < count; i++) {
            ret[i].nickName = bytes32ToString(userBindNickName[user[i]]);
            if (userBindNickName[user[i]] != 0) {
                ret[i].tokenId = nickNameCardId[userBindNickName[user[i]]];
                ret[i].uri = tokenURI(ret[i].tokenId);
            }
        }
    }

    function tokenOf(uint256[] memory tokenIds) external view returns (tokenNickName[] memory ret){
        ret = new tokenNickName[](tokenIds.length);
        for (uint256 i = 0; i < tokenIds.length; i++) {
            ret[i].tokenId = tokenIds[i];
            ret[i].nickName = bytes32ToString(cardIdNickName[tokenIds[i]]);
            ret[i].uri = tokenURI(tokenIds[i]);
        }
    }

    function bindTwitterByUser(string memory twitter) public {
        socialLink[msg.sender].twitter = twitter;
    }

    function bindInstagramByUser(string memory instagram) public {
        socialLink[msg.sender].instagram = instagram;
    }

    function bindFacebookByUser(string memory facebook) public {
        socialLink[msg.sender].facebook = facebook;
    }

    function bindDiscordByUser(string memory discord) public {
        socialLink[msg.sender].discord = discord;
    }

    function getSocial(address user) public view returns (social memory){
        return socialLink[user];
    }

    function getNickNameCardId(bytes32 nick) public view returns (uint256){
        return nickNameCardId[nick];
    }

    function getNickNameExist(bytes32 nick) public view returns (bool){
        return nickNameLowerCardId[nick] != 0;
    }

    function getCardIdNickName(uint256 cardId) public view returns (string memory){
        return bytes32ToString(cardIdNickName[cardId]);
    }

    function getUserBindNickName(address user) public view returns (string memory){
        return bytes32ToString(userBindNickName[user]);
    }

    function getUserAddress(bytes32 nick) public view returns (address ret){
        uint256 card = nickNameCardId[nick];
        if (card != 0) {
            ret = ownerOf(card);
        }
    }

    //set base uri
    function setBaseTokenURI(string memory baseTokenURI) external onlyOwner {
        _setBaseURI(baseTokenURI);
    }

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

    function setNickNamePrice(uint256 _nickNamePrice) public onlyOwner {
        nickNamePrice = _nickNamePrice;
    }

    function setNickNameMetaPrice(uint256 price) public onlyOwner {
        nickNameMetaPrice = price;
    }

    function setEthRecipient(address payable _ethRecipient) public onlyOwner {
        ethRecipient = _ethRecipient;
    }

    function bytes32ToString(bytes32 input) private pure returns (string memory){
        if (input == 0) {
            return "";
        }
        uint8 i = 0;
        while (i < 32 && input[i] != 0) {
            i++;
        }
        bytes memory bytesArray = new bytes(i);
        for (i = 0; i < 32 && input[i] != 0; i++) {
            bytesArray[i] = input[i];
        }
        return string(bytesArray);
    }

    function lower(bytes32 _nickName) private pure returns (bytes32 ret, bool valid){
        if (_nickName == 0) {
            return (ret, false);
        }
        bytes memory bytesArray = new bytes(32);
        for (uint256 i; i < 32; i++) {
            bytes1 nick = _nickName[i];
            if (nick == 0) {
                break;
            } else if (nick >= bytes1("A") && nick <= bytes1("Z")) {
                bytesArray[i] = bytes1(uint8(nick) + 32);
            } else if ((nick >= bytes1("0") && nick <= bytes1("9")) || (nick >= bytes1("a") && nick <= bytes1("z"))) {
                bytesArray[i] = _nickName[i];
            } else {
                return (ret, false);
            }
        }
        ret = bytes32(bytesArray);
        valid = true;
    }

    function setUseWhiteList(bool use) public onlyOwner {
        useWhiteList = use;
    }

    function setUseMetaWhiteList(bool use) public onlyOwner {
        metaUseWhiteList = use;
    }

    function setMerkleProof(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setMetaMerkleProof(bytes32 _merkleRoot) public onlyOwner {
        metaMerkleRoot = _merkleRoot;
    }

    //index 0 is total minted
    function getAlreadyMinted(address addr) public view returns (uint64 total, uint8[11] memory typeCount) {
        total = uint64(_alreadyMinted[addr] >> 16);
        for (uint i = 0; i < 11; i++) {
            typeCount[i] = uint8((uint16(_alreadyMinted[addr]) & 2 ** i) >> i);
        }
    }

    function getMetaAlreadyMinted(address addr) public view returns (uint64 metaTotal, uint8[11] memory metaTypeCount) {
        metaTotal = uint64(_metaAlreadyMinted[addr] >> 16);
        for (uint i = 0; i < 11; i++) {
            metaTypeCount[i] = uint8((uint16(_metaAlreadyMinted[addr]) & 2 ** i) >> i);
        }
    }

    function setStopped(bool flag) public onlyOwner {
        stopped = flag;
    }

    function setUseMetaStopped(bool flag) public onlyOwner {
        metaStopped = flag;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract IERC20","name":"meta","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"user","type":"address"},{"indexed":false,"internalType":"bytes32","name":"nickName","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nickNamePrice","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"}],"name":"BuyNickName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bytes32","name":"nickName","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nickNamePrice","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"}],"name":"BuyNickNameByMeta","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"currentNick","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"nick","type":"bytes32"}],"name":"ChangeBindMNS","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":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"auth","type":"bool"}],"name":"SetKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"discord","type":"string"}],"name":"bindDiscordByUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"facebook","type":"string"}],"name":"bindFacebookByUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"instagram","type":"string"}],"name":"bindInstagramByUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"twitter","type":"string"}],"name":"bindTwitterByUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_nickName","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint64","name":"maxCount","type":"uint64"},{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_nickName","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint64","name":"maxCount","type":"uint64"},{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"buyUseMeta","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"changeBindMNS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearBindMNS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getAlreadyMinted","outputs":[{"internalType":"uint64","name":"total","type":"uint64"},{"internalType":"uint8[11]","name":"typeCount","type":"uint8[11]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"getCardIdNickName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getMetaAlreadyMinted","outputs":[{"internalType":"uint64","name":"metaTotal","type":"uint64"},{"internalType":"uint8[11]","name":"metaTypeCount","type":"uint8[11]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nick","type":"bytes32"}],"name":"getNickNameCardId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nick","type":"bytes32"}],"name":"getNickNameExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getSocial","outputs":[{"components":[{"internalType":"string","name":"twitter","type":"string"},{"internalType":"string","name":"instagram","type":"string"},{"internalType":"string","name":"facebook","type":"string"},{"internalType":"string","name":"discord","type":"string"}],"internalType":"struct MNSNFT.social","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nick","type":"bytes32"}],"name":"getUserAddress","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserBindNickName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"keeperMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaUseWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nickNameMetaPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nickNamePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_ethRecipient","type":"address"}],"name":"setEthRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"auth","type":"bool"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMetaMerkleProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setNickNameMetaPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nickNamePrice","type":"uint256"}],"name":"setNickNamePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setStopped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setUseMetaStopped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"use","type":"bool"}],"name":"setUseMetaWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"use","type":"bool"}],"name":"setUseWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"tokenIds","type":"uint256[]"}],"name":"tokenOf","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"nickName","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct MNSNFT.tokenNickName[]","name":"ret","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"}],"name":"userBindInfo","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"nickName","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct MNSNFT.tokenNickName[]","name":"ret","type":"tuple[]"}],"stateMutability":"view","type":"function"}]

6080604052600c8054600160ff1990911617905566b1a2bc2ec50000601155601380546001600160b01b03191675010150884b6452d807576a4b316dde1944f0b66069a71790557f4660af648282e8881b4beb703d11d5ef2646a5ccc8b8e46e649f3790f6954e396014556018805461ffff19166101011790553480156200008657600080fd5b50604051620043d8380380620043d8833981016040819052620000a99162000395565b8282620000bd6301ffc9a760e01b62000185565b8151620000d290600390602085019062000222565b508051620000e890600490602084019062000222565b50506001805550600a80546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000156604051806060016040528060338152602001620043a56033913962000209565b600c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055506200045f9050565b6001600160e01b03198082161415620001e45760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b80516200021e90600990602084019062000222565b5050565b828054620002309062000422565b90600052602060002090601f0160209004810192826200025457600085556200029f565b82601f106200026f57805160ff19168380011785556200029f565b828001600101855582156200029f579182015b828111156200029f57825182559160200191906001019062000282565b50620002ad929150620002b1565b5090565b5b80821115620002ad5760008155600101620002b2565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002f057600080fd5b81516001600160401b03808211156200030d576200030d620002c8565b604051601f8301601f19908116603f01168101908282118183101715620003385762000338620002c8565b816040528381526020925086838588010111156200035557600080fd5b600091505b838210156200037957858201830151818301840152908201906200035a565b838211156200038b5760008385830101525b9695505050505050565b600080600060608486031215620003ab57600080fd5b83516001600160401b0380821115620003c357600080fd5b620003d187838801620002de565b94506020860151915080821115620003e857600080fd5b50620003f786828701620002de565b604086015190935090506001600160a01b03811681146200041757600080fd5b809150509250925092565b600181811c908216806200043757607f821691505b602082108114156200045957634e487b7160e01b600052602260045260246000fd5b50919050565b613f36806200046f6000396000f3fe60806040526004361061038c5760003560e01c806386758912116101dc578063c87b56dd11610102578063d99f8674116100a0578063f2fde38b1161006f578063f2fde38b14610a97578063fd4c712d14610ab7578063ff00a2bb14610ad7578063fff5bb2114610af757600080fd5b8063d99f867414610a16578063dafe538014610a37578063e985e9c514610a57578063ef037cd614610a7757600080fd5b8063d1b9e853116100dc578063d1b9e85314610989578063d1e28890146109a9578063d50e829e146109d6578063d7e3884a146109f657600080fd5b8063c87b56dd14610929578063cc8c96fe14610949578063cdc52cef1461096957600080fd5b8063a846e2781161017a578063bca9980d11610149578063bca9980d1461089b578063c1cef5be146108bb578063c71fbb71146108db578063c82cef5c1461090957600080fd5b8063a846e27814610825578063b50986681461083b578063b88d4fde1461085b578063ba7264f01461087b57600080fd5b806395df8944116101b657806395df8944146107a55780639753704a146107c5578063a22cb465146107f2578063a7bd3b3f1461081257600080fd5b806386758912146107525780638da5cb5b1461077257806395d89b411461079057600080fd5b80634482bcb3116102c15780636352211e1161025f578063714c53981161022e578063714c5398146106fb578063715018a61461071057806375f12b2114610725578063852c530b1461073f57600080fd5b80636352211e14610662578063678c4208146106825780636ba42aaa146106a257806370a08231146106db57600080fd5b80634c18ccfc1161029b5780634c18ccfc146105dd5780634f6357771461060d57806356de0fd014610623578063581379fd1461064257600080fd5b80634482bcb314610586578063478103a6146105a75780634a4e8884146105bd57600080fd5b806318160ddd1161032e5780632eb4a7ab116103085780632eb4a7ab1461050357806330176e13146105195780633cc5caa81461053957806342842e0e1461056657600080fd5b806318160ddd1461049757806319cfca94146104be57806323b872dd146104e357600080fd5b8063095ea7b31161036a578063095ea7b314610420578063121ba6c414610442578063128c89ce1461045757806317c421231461047757600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac36600461349a565b610b26565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b81565b6040516103bd919061350f565b3480156103f457600080fd5b50610408610403366004613522565b610c13565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613550565b610c57565b005b34801561044e57600080fd5b50610440610ce5565b34801561046357600080fd5b50610440610472366004613619565b610e24565b34801561048357600080fd5b50610440610492366004613619565b610e4e565b3480156104a357600080fd5b5060025460015403600019015b6040519081526020016103bd565b3480156104ca57600080fd5b50600c546104089061010090046001600160a01b031681565b3480156104ef57600080fd5b506104406104fe366004613661565b610e74565b34801561050f57600080fd5b506104b060145481565b34801561052557600080fd5b50610440610534366004613619565b610e7f565b34801561054557600080fd5b506105596105543660046136c5565b610eb5565b6040516103bd919061374f565b34801561057257600080fd5b50610440610581366004613661565b611022565b34801561059257600080fd5b506013546103b190600160a81b900460ff1681565b3480156105b357600080fd5b506104b060115481565b3480156105c957600080fd5b506104086105d8366004613522565b61103d565b3480156105e957600080fd5b506103b16105f83660046137e0565b600b6020526000908152604090205460ff1681565b34801561061957600080fd5b506104b060155481565b34801561062f57600080fd5b506018546103b190610100900460ff1681565b34801561064e57600080fd5b50601354610408906001600160a01b031681565b34801561066e57600080fd5b5061040861067d366004613522565b611062565b34801561068e57600080fd5b5061044061069d36600461380b565b611074565b3480156106ae57600080fd5b506103b16106bd3660046137e0565b6001600160a01b03166000908152600b602052604090205460ff1690565b3480156106e757600080fd5b506104b06106f63660046137e0565b6110bc565b34801561070757600080fd5b506103db61110a565b34801561071c57600080fd5b50610440611119565b34801561073157600080fd5b506018546103b19060ff1681565b61044061074d36600461383e565b61118d565b34801561075e57600080fd5b5061044061076d366004613522565b611533565b34801561077e57600080fd5b50600a546001600160a01b0316610408565b34801561079c57600080fd5b506103db611562565b3480156107b157600080fd5b506104406107c03660046137e0565b611571565b3480156107d157600080fd5b506104b06107e0366004613522565b6000908152600d602052604090205490565b3480156107fe57600080fd5b5061044061080d3660046138e6565b6115bd565b61044061082036600461383e565b611653565b34801561083157600080fd5b506104b060125481565b34801561084757600080fd5b506103db6108563660046137e0565b611999565b34801561086757600080fd5b5061044061087636600461391f565b6119be565b34801561088757600080fd5b5061055961089636600461399e565b611a0f565b3480156108a757600080fd5b506104406108b6366004613522565b611c14565b3480156108c757600080fd5b506104406108d636600461380b565b611c43565b3480156108e757600080fd5b506108fb6108f63660046137e0565b611c8b565b6040516103bd929190613a2c565b34801561091557600080fd5b506103db610924366004613522565b611d20565b34801561093557600080fd5b506103db610944366004613522565b611d3b565b34801561095557600080fd5b50610440610964366004613522565b611dbf565b34801561097557600080fd5b5061044061098436600461380b565b611dee565b34801561099557600080fd5b506104406109a43660046138e6565b611e32565b3480156109b557600080fd5b506109c96109c43660046137e0565b611ebf565b6040516103bd9190613a71565b3480156109e257600080fd5b506104406109f136600461380b565b61215b565b348015610a0257600080fd5b50610440610a11366004613522565b612198565b348015610a2257600080fd5b506013546103b190600160a01b900460ff1681565b348015610a4357600080fd5b506108fb610a523660046137e0565b6122a2565b348015610a6357600080fd5b506103b1610a72366004613aef565b612331565b348015610a8357600080fd5b50610440610a92366004613619565b61235f565b348015610aa357600080fd5b50610440610ab23660046137e0565b61237f565b348015610ac357600080fd5b50610440610ad2366004613522565b61246a565b348015610ae357600080fd5b50610440610af2366004613619565b612499565b348015610b0357600080fd5b506103b1610b12366004613522565b6000908152600e6020526040902054151590565b60006001600160e01b031982166380ac58cd60e01b1480610b5757506001600160e01b03198216635b5e139f60e01b145b80610b7b57506001600160e01b0319821660009081526020819052604090205460ff165b92915050565b606060038054610b9090613b1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbc90613b1d565b8015610c095780601f10610bde57610100808354040283529160200191610c09565b820191906000526020600020905b815481529060010190602001808311610bec57829003601f168201915b5050505050905090565b6000610c1e826124bf565b610c3b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610c6282611062565b9050806001600160a01b0316836001600160a01b03161415610c975760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cb75750610cb58133612331565b155b15610cd5576040516367d9dca160e11b815260040160405180910390fd5b610ce08383836124f8565b505050565b600c5460ff16600114610d135760405162461bcd60e51b8152600401610d0a90613b52565b60405180910390fd5b600c805460ff191690553360009081526010602052604090205480610d655760405162461bcd60e51b81526020600482015260086024820152671b9bdd08189a5b9960c21b6044820152606401610d0a565b6000818152600d602052604081205490610d7e82611062565b9050336001600160a01b03821614610dc45760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610d0a565b7f8bc21fe292dc3f26065b7ab1b9a28c9582e1e2f7eff701ac1e4a6729a1989b5d3383856000604051610dfa9493929190613b7c565b60405180910390a150503360009081526010602052604081205550600c805460ff19166001179055565b3360009081526019602090815260409091208251610e4a926002909201918401906133cc565b5050565b3360009081526019602090815260409091208251610e4a926001909201918401906133cc565b610ce0838383612554565b600a546001600160a01b03163314610ea95760405162461bcd60e51b8152600401610d0a90613ba2565b610eb281612775565b50565b606081516001600160401b03811115610ed057610ed061357c565b604051908082528060200260200182016040528015610f2557816020015b610f1260405180606001604052806000815260200160608152602001606081525090565b815260200190600190039081610eee5790505b50905060005b825181101561101c57828181518110610f4657610f46613bd7565b6020026020010151828281518110610f6057610f60613bd7565b60200260200101516000018181525050610fa5600f6000858481518110610f8957610f89613bd7565b6020026020010151815260200190815260200160002054612788565b828281518110610fb757610fb7613bd7565b602002602001015160200181905250610fe8838281518110610fdb57610fdb613bd7565b6020026020010151611d3b565b828281518110610ffa57610ffa613bd7565b602002602001015160400181905250808061101490613c03565b915050610f2b565b50919050565b610ce0838383604051806020016040528060008152506119be565b6000818152600d6020526040812054801561101c5761105b81611062565b9392505050565b600061106d826128d0565b5192915050565b600a546001600160a01b0316331461109e5760405162461bcd60e51b8152600401610d0a90613ba2565b60138054911515600160a81b0260ff60a81b19909216919091179055565b60006001600160a01b0382166110e5576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b60606111146129f7565b905090565b600a546001600160a01b031633146111435760405162461bcd60e51b8152600401610d0a90613ba2565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600c5460ff166001146111b25760405162461bcd60e51b8152600401610d0a90613b52565b600c805460ff1916905560185460ff16156111f95760405162461bcd60e51b81526020600482015260076024820152661cdd1bdc1c195960ca1b6044820152606401610d0a565b601154341461123a5760405162461bcd60e51b815260206004820152600d60248201526c657468206e656564206d6f726560981b6044820152606401610d0a565b60008061124687612a06565b91509150806112865760405162461bcd60e51b815260206004820152600c60248201526b1b985b59481a5b9d985b1a5960a21b6044820152606401610d0a565b6000828152600e6020526040902054156112d05760405162461bcd60e51b815260206004820152600b60248201526a6e616d652065786973747360a81b6044820152606401610d0a565b601354600160a01b900460ff16156114795760008360ff161180156112f85750600b8360ff16105b6113315760405162461bcd60e51b815260206004820152600a602482015269747970652077726f6e6760b01b6044820152606401610d0a565b33600090815260166020526040902054601081901c600160ff86161b82166001600160401b038088169083161061139e5760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d081b19599d607a1b6044820152606401610d0a565b61ffff8116156113dc5760405162461bcd60e51b81526020600482015260096024820152681d1e5c19481d5cd95960ba1b6044820152606401610d0a565b6113f48989338a6001600160401b0316601454612ba3565b6114305760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610d0a565b8560ff16600161ffff16901b831761ffff1660108360016114519190613c1e565b3360009081526016602052604090206001600160401b039190911690911b9190911790555050505b6013546011546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156114b5573d6000803e3d6000fd5b5060006114c3338985612c24565b60115460408051338152602081018c9052908101839052606081019190915260ff861660808201529091507f55cd048872506f0260a28d0b81e7f245c7d0aa55c4d947f0899cdd28eb358e059060a0015b60405180910390a15050600c805460ff19166001179055505050505050565b600a546001600160a01b0316331461155d5760405162461bcd60e51b8152600401610d0a90613ba2565b601455565b606060048054610b9090613b1d565b600a546001600160a01b0316331461159b5760405162461bcd60e51b8152600401610d0a90613ba2565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156115e75760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c5460ff166001146116785760405162461bcd60e51b8152600401610d0a90613b52565b600c805460ff19169055601854610100900460ff16156116c45760405162461bcd60e51b81526020600482015260076024820152661cdd1bdc1c195960ca1b6044820152606401610d0a565b6000806116d087612a06565b91509150806117105760405162461bcd60e51b815260206004820152600c60248201526b1b985b59481a5b9d985b1a5960a21b6044820152606401610d0a565b6000828152600e60205260409020541561175a5760405162461bcd60e51b815260206004820152600b60248201526a6e616d652065786973747360a81b6044820152606401610d0a565b601354600160a81b900460ff161561190e5760008360ff161180156117825750600b8360ff16105b6117bb5760405162461bcd60e51b815260206004820152600a602482015269747970652077726f6e6760b01b6044820152606401610d0a565b33600090815260176020526040902054601081901c600160ff86161b821661ffff8116156118175760405162461bcd60e51b81526020600482015260096024820152681d1e5c19481d5cd95960ba1b6044820152606401610d0a565b866001600160401b0316826001600160401b0316106118715760405162461bcd60e51b8152602060048201526016602482015275125b9cdd59999a58da595b9d081b595d18481b19599d60521b6044820152606401610d0a565b6118898989338a6001600160401b0316601554612ba3565b6118c55760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610d0a565b8560ff16600161ffff16901b831761ffff1660108360016118e69190613c1e565b3360009081526017602052604090206001600160401b039190911690911b9190911790555050505b601354601254600c54611937926001600160a01b03610100909204821692339290911690612c96565b6000611944338985612c24565b60125460408051338152602081018c9052908101839052606081019190915260ff861660808201529091507f86c7fe133784f189979318893488aa80ea9b0f992a14ff05b01fdd508e86bfc59060a001611514565b6001600160a01b038116600090815260106020526040902054606090610b7b90612788565b6119c9848484612554565b6001600160a01b0383163b151580156119eb57506119e984848484612cf0565b155b15611a09576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b8051606090806001600160401b03811115611a2c57611a2c61357c565b604051908082528060200260200182016040528015611a8157816020015b611a6e60405180606001604052806000815260200160608152602001606081525090565b815260200190600190039081611a4a5790505b50915060005b81811015611c0d57611ad660106000868481518110611aa857611aa8613bd7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612788565b838281518110611ae857611ae8613bd7565b60200260200101516020018190525060106000858381518110611b0d57611b0d613bd7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000801b14611bfb57600d600060106000878581518110611b5957611b59613bd7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054815260200190815260200160002054838281518110611ba357611ba3613bd7565b60200260200101516000018181525050611bd9838281518110611bc857611bc8613bd7565b602002602001015160000151611d3b565b838281518110611beb57611beb613bd7565b6020026020010151604001819052505b80611c0581613c03565b915050611a87565b5050919050565b600a546001600160a01b03163314611c3e5760405162461bcd60e51b8152600401610d0a90613ba2565b601555565b600a546001600160a01b03163314611c6d5760405162461bcd60e51b8152600401610d0a90613ba2565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6000611c95613450565b6001600160a01b03831660009081526016602052604081205460101c92505b600b811015611d1a5780611cc9816002613d2d565b6001600160a01b0386166000908152601660205260409020541661ffff16901c8282600b8110611cfb57611cfb613bd7565b60ff909216602092909202015280611d1281613c03565b915050611cb4565b50915091565b6000818152600f6020526040902054606090610b7b90612788565b6060611d46826124bf565b611d6357604051630a14c4b560e41b815260040160405180910390fd5b6000611d6d6129f7565b9050805160001415611d8e576040518060200160405280600081525061105b565b80611d9884612dd9565b604051602001611da9929190613d39565b6040516020818303038152906040529392505050565b600a546001600160a01b03163314611de95760405162461bcd60e51b8152600401610d0a90613ba2565b601155565b600a546001600160a01b03163314611e185760405162461bcd60e51b8152600401610d0a90613ba2565b601880549115156101000261ff0019909216919091179055565b600a546001600160a01b03163314611e5c5760405162461bcd60e51b8152600401610d0a90613ba2565b6001600160a01b0382166000818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f8c2ff6748f99f65f4ebf8a1e973a289bad216c4d5b20fda1940d9e01118ae42a910160405180910390a15050565b611eea6040518060800160405280606081526020016060815260200160608152602001606081525090565b6001600160a01b03821660009081526019602052604090819020815160808101909252805482908290611f1c90613b1d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4890613b1d565b8015611f955780601f10611f6a57610100808354040283529160200191611f95565b820191906000526020600020905b815481529060010190602001808311611f7857829003601f168201915b50505050508152602001600182018054611fae90613b1d565b80601f0160208091040260200160405190810160405280929190818152602001828054611fda90613b1d565b80156120275780601f10611ffc57610100808354040283529160200191612027565b820191906000526020600020905b81548152906001019060200180831161200a57829003601f168201915b5050505050815260200160028201805461204090613b1d565b80601f016020809104026020016040519081016040528092919081815260200182805461206c90613b1d565b80156120b95780601f1061208e576101008083540402835291602001916120b9565b820191906000526020600020905b81548152906001019060200180831161209c57829003601f168201915b505050505081526020016003820180546120d290613b1d565b80601f01602080910402602001604051908101604052809291908181526020018280546120fe90613b1d565b801561214b5780601f106121205761010080835404028352916020019161214b565b820191906000526020600020905b81548152906001019060200180831161212e57829003601f168201915b5050505050815250509050919050565b600a546001600160a01b031633146121855760405162461bcd60e51b8152600401610d0a90613ba2565b6018805460ff1916911515919091179055565b600c5460ff166001146121bd5760405162461bcd60e51b8152600401610d0a90613b52565b600c805460ff1916905560006121d282611062565b9050336001600160a01b038216146122185760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610d0a565b33600081815260106020908152604080832054868452600f909252918290205491517f8bc21fe292dc3f26065b7ab1b9a28c9582e1e2f7eff701ac1e4a6729a1989b5d9361226c9390928792909190613b7c565b60405180910390a1506000908152600f6020908152604080832054338452601090925290912055600c805460ff19166001179055565b60006122ac613450565b6001600160a01b03831660009081526017602052604081205460101c92505b600b811015611d1a57806122e0816002613d2d565b6001600160a01b0386166000908152601760205260409020541661ffff16901c8282600b811061231257612312613bd7565b60ff90921660209290920201528061232981613c03565b9150506122cb565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3360009081526019602090815260409091208251610e4a928401906133cc565b600a546001600160a01b031633146123a95760405162461bcd60e51b8152600401610d0a90613ba2565b6001600160a01b03811661240e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d0a565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146124945760405162461bcd60e51b8152600401610d0a90613ba2565b601255565b3360009081526019602090815260409091208251610e4a926003909201918401906133cc565b6000816001111580156124d3575060015482105b8015610b7b575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061255f826128d0565b80519091506000906001600160a01b0316336001600160a01b0316148061258d5750815161258d9033612331565b806125a857503361259d84610c13565b6001600160a01b0316145b9050806125c857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146125fd5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661262457604051633a954ecd60e21b815260040160405180910390fd5b6126318585856001612ed6565b61264160008484600001516124f8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021790925590860180835291205490911661272b5760015481101561272b57825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b8051610e4a9060099060208401906133cc565b6060816127a357505060408051602081019091526000815290565b60005b60208160ff161080156127da5750828160ff16602081106127c9576127c9613bd7565b1a60f81b6001600160f81b03191615155b156127f157806127e981613d5f565b9150506127a6565b60008160ff166001600160401b0381111561280e5761280e61357c565b6040519080825280601f01601f191660200182016040528015612838576020820181803683370190505b509050600091505b60208260ff161080156128745750838260ff166020811061286357612863613bd7565b1a60f81b6001600160f81b03191615155b1561105b57838260ff166020811061288e5761288e613bd7565b1a60f81b818360ff16815181106128a7576128a7613bd7565b60200101906001600160f81b031916908160001a905350816128c881613d5f565b925050612840565b60408051606081018252600080825260208201819052918101919091528180600111158015612900575060015481105b156129de57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906129dc5780516001600160a01b031615612973579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156129d7579392505050565b612973565b505b604051636f96cda160e11b815260040160405180910390fd5b606060098054610b9090613b1d565b60008082612a1657509160009150565b60408051602080825281830190925260009160208201818036833701905050905060005b6020811015612b8e576000858260208110612a5757612a57613bd7565b1a60f81b90506001600160f81b03198116612a725750612b8e565b604160f81b6001600160f81b0319821610801590612a9e5750602d60f91b6001600160f81b0319821611155b15612ae357612ab260f882901c6020613d7f565b60f81b838381518110612ac757612ac7613bd7565b60200101906001600160f81b031916908160001a905350612b7b565b600360fc1b6001600160f81b0319821610801590612b0f5750603960f81b6001600160f81b0319821611155b80612b415750606160f81b6001600160f81b0319821610801590612b415750603d60f91b6001600160f81b0319821611155b15612b6e57858260208110612b5857612b58613bd7565b1a60f81b838381518110612ac757612ac7613bd7565b5092946000945092505050565b5080612b8681613c03565b915050612a3a565b50612b9881613da4565b946001945092505050565b60008084612bb085612dd9565b604051602001612bc1929190613dc8565b60405160208183030381529060405280519060200120905082612c18888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612f9e915050565b14979650505050505050565b600254600154600091900360001901612c3e906001613e00565b60408051600080825260208201909252919250612c6091869160019190613012565b6000838152600d60209081526040808320948352600e8252808320848452600f9092529091209390935591829055819055919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611a099085906131ef565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612d25903390899088908890600401613e18565b6020604051808303816000875af1925050508015612d60575060408051601f3d908101601f19168201909252612d5d91810190613e55565b60015b612dbb573d808015612d8e576040519150601f19603f3d011682016040523d82523d6000602084013e612d93565b606091505b508051612db3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081612dfd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e275780612e1181613c03565b9150612e209050600a83613e88565b9150612e01565b6000816001600160401b03811115612e4157612e4161357c565b6040519080825280601f01601f191660200182016040528015612e6b576020820181803683370190505b5090505b8415612dd157612e80600183613e9c565b9150612e8d600a86613eb3565b612e98906030613e00565b60f81b818381518110612ead57612ead613bd7565b60200101906001600160f81b031916908160001a905350612ecf600a86613e88565b9450612e6f565b6001600160a01b038416600090815260106020526040902054801561276e5760005b82811015612f9657612f0a8185613e00565b6000838152600d60205260409020541415612f84577f8bc21fe292dc3f26065b7ab1b9a28c9582e1e2f7eff701ac1e4a6729a1989b5d86612f4b8387613e00565b846000604051612f5e9493929190613b7c565b60405180910390a16001600160a01b038616600090815260106020526040812055612f96565b80612f8e81613c03565b915050612ef8565b505050505050565b600081815b845181101561300a576000858281518110612fc057612fc0613bd7565b60200260200101519050808311612fe65760008381526020829052604090209250612ff7565b600081815260208490526040902092505b508061300281613c03565b915050612fa3565b509392505050565b6001546001600160a01b03851661303b57604051622e076360e81b815260040160405180910390fd5b836130595760405163b562e8dd60e01b815260040160405180910390fd5b6130666000868387612ed6565b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561311757506001600160a01b0387163b15155b156131a0575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131686000888480600101955088612cf0565b613185576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561311d57826001541461319b57600080fd5b6131e6565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156131a1575b5060015561276e565b6000613244826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132c19092919063ffffffff16565b805190915015610ce057808060200190518101906132629190613ec7565b610ce05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d0a565b6060612dd1848460008585843b61331a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d0a565b600080866001600160a01b031685876040516133369190613ee4565b60006040518083038185875af1925050503d8060008114613373576040519150601f19603f3d011682016040523d82523d6000602084013e613378565b606091505b5091509150613388828286613393565b979650505050505050565b606083156133a257508161105b565b8251156133b25782518084602001fd5b8160405162461bcd60e51b8152600401610d0a919061350f565b8280546133d890613b1d565b90600052602060002090601f0160209004810192826133fa5760008555613440565b82601f1061341357805160ff1916838001178555613440565b82800160010185558215613440579182015b82811115613440578251825591602001919060010190613425565b5061344c92915061346f565b5090565b604051806101600160405280600b906020820280368337509192915050565b5b8082111561344c5760008155600101613470565b6001600160e01b031981168114610eb257600080fd5b6000602082840312156134ac57600080fd5b813561105b81613484565b60005b838110156134d25781810151838201526020016134ba565b83811115611a095750506000910152565b600081518084526134fb8160208601602086016134b7565b601f01601f19169290920160200192915050565b60208152600061105b60208301846134e3565b60006020828403121561353457600080fd5b5035919050565b6001600160a01b0381168114610eb257600080fd5b6000806040838503121561356357600080fd5b823561356e8161353b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156135ba576135ba61357c565b604052919050565b60006001600160401b038311156135db576135db61357c565b6135ee601f8401601f1916602001613592565b905082815283838301111561360257600080fd5b828260208301376000602084830101529392505050565b60006020828403121561362b57600080fd5b81356001600160401b0381111561364157600080fd5b8201601f8101841361365257600080fd5b612dd1848235602084016135c2565b60008060006060848603121561367657600080fd5b83356136818161353b565b925060208401356136918161353b565b929592945050506040919091013590565b60006001600160401b038211156136bb576136bb61357c565b5060051b60200190565b600060208083850312156136d857600080fd5b82356001600160401b038111156136ee57600080fd5b8301601f810185136136ff57600080fd5b803561371261370d826136a2565b613592565b81815260059190911b8201830190838101908783111561373157600080fd5b928401925b8284101561338857833582529284019290840190613736565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156137d257603f19898403018552815160608151855288820151818a8701526137a4828701826134e3565b915050878201519150848103888601526137be81836134e3565b968901969450505090860190600101613776565b509098975050505050505050565b6000602082840312156137f257600080fd5b813561105b8161353b565b8015158114610eb257600080fd5b60006020828403121561381d57600080fd5b813561105b816137fd565b803560ff8116811461383957600080fd5b919050565b60008060008060006080868803121561385657600080fd5b8535945060208601356001600160401b038082111561387457600080fd5b818801915088601f83011261388857600080fd5b81358181111561389757600080fd5b8960208260051b85010111156138ac57600080fd5b602083019650809550506040880135915080821682146138cb57600080fd5b5091506138da60608701613828565b90509295509295909350565b600080604083850312156138f957600080fd5b82356139048161353b565b91506020830135613914816137fd565b809150509250929050565b6000806000806080858703121561393557600080fd5b84356139408161353b565b935060208501356139508161353b565b92506040850135915060608501356001600160401b0381111561397257600080fd5b8501601f8101871361398357600080fd5b613992878235602084016135c2565b91505092959194509250565b600060208083850312156139b157600080fd5b82356001600160401b038111156139c757600080fd5b8301601f810185136139d857600080fd5b80356139e661370d826136a2565b81815260059190911b82018301908381019087831115613a0557600080fd5b928401925b82841015613388578335613a1d8161353b565b82529284019290840190613a0a565b6001600160401b0383168152610180810160208083018460005b600b811015613a6657815160ff1683529183019190830190600101613a46565b505050509392505050565b602081526000825160806020840152613a8d60a08401826134e3565b90506020840151601f1980858403016040860152613aab83836134e3565b92506040860151915080858403016060860152613ac883836134e3565b9250606086015191508085840301608086015250613ae682826134e3565b95945050505050565b60008060408385031215613b0257600080fd5b8235613b0d8161353b565b915060208301356139148161353b565b600181811c90821680613b3157607f821691505b6020821081141561101c57634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f10dbdb9d1c9858dd0e881313d0d2d15160821b604082015260600190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613c1757613c17613bed565b5060010190565b60006001600160401b03808316818516808303821115613c4057613c40613bed565b01949350505050565b600181815b80851115613c84578160001904821115613c6a57613c6a613bed565b80851615613c7757918102915b93841c9390800290613c4e565b509250929050565b600082613c9b57506001610b7b565b81613ca857506000610b7b565b8160018114613cbe5760028114613cc857613ce4565b6001915050610b7b565b60ff841115613cd957613cd9613bed565b50506001821b610b7b565b5060208310610133831016604e8410600b8410161715613d07575081810a610b7b565b613d118383613c49565b8060001904821115613d2557613d25613bed565b029392505050565b600061105b8383613c8c565b60008351613d4b8184602088016134b7565b835190830190613c408183602088016134b7565b600060ff821660ff811415613d7657613d76613bed565b60010192915050565b600060ff821660ff84168060ff03821115613d9c57613d9c613bed565b019392505050565b8051602080830151919081101561101c5760001960209190910360031b1b16919050565b6bffffffffffffffffffffffff198360601b16815260008251613df28160148501602087016134b7565b919091016014019392505050565b60008219821115613e1357613e13613bed565b500190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e4b908301846134e3565b9695505050505050565b600060208284031215613e6757600080fd5b815161105b81613484565b634e487b7160e01b600052601260045260246000fd5b600082613e9757613e97613e72565b500490565b600082821015613eae57613eae613bed565b500390565b600082613ec257613ec2613e72565b500690565b600060208284031215613ed957600080fd5b815161105b816137fd565b60008251613ef68184602087016134b7565b919091019291505056fea26469706673582212209b99a70115eaaa958c284d8bec5bab6afba18da8fc2dcb5d864b775e41221de264736f6c634300080b003368747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f6d6574616c6b2f6d6e732f6d657461646174612f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000364fcd7325c035cc4f2cde8b6c8d7df5e7db658900000000000000000000000000000000000000000000000000000000000000134d6574616c6b204e616d6520536572766963650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d4e530000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061038c5760003560e01c806386758912116101dc578063c87b56dd11610102578063d99f8674116100a0578063f2fde38b1161006f578063f2fde38b14610a97578063fd4c712d14610ab7578063ff00a2bb14610ad7578063fff5bb2114610af757600080fd5b8063d99f867414610a16578063dafe538014610a37578063e985e9c514610a57578063ef037cd614610a7757600080fd5b8063d1b9e853116100dc578063d1b9e85314610989578063d1e28890146109a9578063d50e829e146109d6578063d7e3884a146109f657600080fd5b8063c87b56dd14610929578063cc8c96fe14610949578063cdc52cef1461096957600080fd5b8063a846e2781161017a578063bca9980d11610149578063bca9980d1461089b578063c1cef5be146108bb578063c71fbb71146108db578063c82cef5c1461090957600080fd5b8063a846e27814610825578063b50986681461083b578063b88d4fde1461085b578063ba7264f01461087b57600080fd5b806395df8944116101b657806395df8944146107a55780639753704a146107c5578063a22cb465146107f2578063a7bd3b3f1461081257600080fd5b806386758912146107525780638da5cb5b1461077257806395d89b411461079057600080fd5b80634482bcb3116102c15780636352211e1161025f578063714c53981161022e578063714c5398146106fb578063715018a61461071057806375f12b2114610725578063852c530b1461073f57600080fd5b80636352211e14610662578063678c4208146106825780636ba42aaa146106a257806370a08231146106db57600080fd5b80634c18ccfc1161029b5780634c18ccfc146105dd5780634f6357771461060d57806356de0fd014610623578063581379fd1461064257600080fd5b80634482bcb314610586578063478103a6146105a75780634a4e8884146105bd57600080fd5b806318160ddd1161032e5780632eb4a7ab116103085780632eb4a7ab1461050357806330176e13146105195780633cc5caa81461053957806342842e0e1461056657600080fd5b806318160ddd1461049757806319cfca94146104be57806323b872dd146104e357600080fd5b8063095ea7b31161036a578063095ea7b314610420578063121ba6c414610442578063128c89ce1461045757806317c421231461047757600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac36600461349a565b610b26565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b81565b6040516103bd919061350f565b3480156103f457600080fd5b50610408610403366004613522565b610c13565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613550565b610c57565b005b34801561044e57600080fd5b50610440610ce5565b34801561046357600080fd5b50610440610472366004613619565b610e24565b34801561048357600080fd5b50610440610492366004613619565b610e4e565b3480156104a357600080fd5b5060025460015403600019015b6040519081526020016103bd565b3480156104ca57600080fd5b50600c546104089061010090046001600160a01b031681565b3480156104ef57600080fd5b506104406104fe366004613661565b610e74565b34801561050f57600080fd5b506104b060145481565b34801561052557600080fd5b50610440610534366004613619565b610e7f565b34801561054557600080fd5b506105596105543660046136c5565b610eb5565b6040516103bd919061374f565b34801561057257600080fd5b50610440610581366004613661565b611022565b34801561059257600080fd5b506013546103b190600160a81b900460ff1681565b3480156105b357600080fd5b506104b060115481565b3480156105c957600080fd5b506104086105d8366004613522565b61103d565b3480156105e957600080fd5b506103b16105f83660046137e0565b600b6020526000908152604090205460ff1681565b34801561061957600080fd5b506104b060155481565b34801561062f57600080fd5b506018546103b190610100900460ff1681565b34801561064e57600080fd5b50601354610408906001600160a01b031681565b34801561066e57600080fd5b5061040861067d366004613522565b611062565b34801561068e57600080fd5b5061044061069d36600461380b565b611074565b3480156106ae57600080fd5b506103b16106bd3660046137e0565b6001600160a01b03166000908152600b602052604090205460ff1690565b3480156106e757600080fd5b506104b06106f63660046137e0565b6110bc565b34801561070757600080fd5b506103db61110a565b34801561071c57600080fd5b50610440611119565b34801561073157600080fd5b506018546103b19060ff1681565b61044061074d36600461383e565b61118d565b34801561075e57600080fd5b5061044061076d366004613522565b611533565b34801561077e57600080fd5b50600a546001600160a01b0316610408565b34801561079c57600080fd5b506103db611562565b3480156107b157600080fd5b506104406107c03660046137e0565b611571565b3480156107d157600080fd5b506104b06107e0366004613522565b6000908152600d602052604090205490565b3480156107fe57600080fd5b5061044061080d3660046138e6565b6115bd565b61044061082036600461383e565b611653565b34801561083157600080fd5b506104b060125481565b34801561084757600080fd5b506103db6108563660046137e0565b611999565b34801561086757600080fd5b5061044061087636600461391f565b6119be565b34801561088757600080fd5b5061055961089636600461399e565b611a0f565b3480156108a757600080fd5b506104406108b6366004613522565b611c14565b3480156108c757600080fd5b506104406108d636600461380b565b611c43565b3480156108e757600080fd5b506108fb6108f63660046137e0565b611c8b565b6040516103bd929190613a2c565b34801561091557600080fd5b506103db610924366004613522565b611d20565b34801561093557600080fd5b506103db610944366004613522565b611d3b565b34801561095557600080fd5b50610440610964366004613522565b611dbf565b34801561097557600080fd5b5061044061098436600461380b565b611dee565b34801561099557600080fd5b506104406109a43660046138e6565b611e32565b3480156109b557600080fd5b506109c96109c43660046137e0565b611ebf565b6040516103bd9190613a71565b3480156109e257600080fd5b506104406109f136600461380b565b61215b565b348015610a0257600080fd5b50610440610a11366004613522565b612198565b348015610a2257600080fd5b506013546103b190600160a01b900460ff1681565b348015610a4357600080fd5b506108fb610a523660046137e0565b6122a2565b348015610a6357600080fd5b506103b1610a72366004613aef565b612331565b348015610a8357600080fd5b50610440610a92366004613619565b61235f565b348015610aa357600080fd5b50610440610ab23660046137e0565b61237f565b348015610ac357600080fd5b50610440610ad2366004613522565b61246a565b348015610ae357600080fd5b50610440610af2366004613619565b612499565b348015610b0357600080fd5b506103b1610b12366004613522565b6000908152600e6020526040902054151590565b60006001600160e01b031982166380ac58cd60e01b1480610b5757506001600160e01b03198216635b5e139f60e01b145b80610b7b57506001600160e01b0319821660009081526020819052604090205460ff165b92915050565b606060038054610b9090613b1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbc90613b1d565b8015610c095780601f10610bde57610100808354040283529160200191610c09565b820191906000526020600020905b815481529060010190602001808311610bec57829003601f168201915b5050505050905090565b6000610c1e826124bf565b610c3b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610c6282611062565b9050806001600160a01b0316836001600160a01b03161415610c975760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cb75750610cb58133612331565b155b15610cd5576040516367d9dca160e11b815260040160405180910390fd5b610ce08383836124f8565b505050565b600c5460ff16600114610d135760405162461bcd60e51b8152600401610d0a90613b52565b60405180910390fd5b600c805460ff191690553360009081526010602052604090205480610d655760405162461bcd60e51b81526020600482015260086024820152671b9bdd08189a5b9960c21b6044820152606401610d0a565b6000818152600d602052604081205490610d7e82611062565b9050336001600160a01b03821614610dc45760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610d0a565b7f8bc21fe292dc3f26065b7ab1b9a28c9582e1e2f7eff701ac1e4a6729a1989b5d3383856000604051610dfa9493929190613b7c565b60405180910390a150503360009081526010602052604081205550600c805460ff19166001179055565b3360009081526019602090815260409091208251610e4a926002909201918401906133cc565b5050565b3360009081526019602090815260409091208251610e4a926001909201918401906133cc565b610ce0838383612554565b600a546001600160a01b03163314610ea95760405162461bcd60e51b8152600401610d0a90613ba2565b610eb281612775565b50565b606081516001600160401b03811115610ed057610ed061357c565b604051908082528060200260200182016040528015610f2557816020015b610f1260405180606001604052806000815260200160608152602001606081525090565b815260200190600190039081610eee5790505b50905060005b825181101561101c57828181518110610f4657610f46613bd7565b6020026020010151828281518110610f6057610f60613bd7565b60200260200101516000018181525050610fa5600f6000858481518110610f8957610f89613bd7565b6020026020010151815260200190815260200160002054612788565b828281518110610fb757610fb7613bd7565b602002602001015160200181905250610fe8838281518110610fdb57610fdb613bd7565b6020026020010151611d3b565b828281518110610ffa57610ffa613bd7565b602002602001015160400181905250808061101490613c03565b915050610f2b565b50919050565b610ce0838383604051806020016040528060008152506119be565b6000818152600d6020526040812054801561101c5761105b81611062565b9392505050565b600061106d826128d0565b5192915050565b600a546001600160a01b0316331461109e5760405162461bcd60e51b8152600401610d0a90613ba2565b60138054911515600160a81b0260ff60a81b19909216919091179055565b60006001600160a01b0382166110e5576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b60606111146129f7565b905090565b600a546001600160a01b031633146111435760405162461bcd60e51b8152600401610d0a90613ba2565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600c5460ff166001146111b25760405162461bcd60e51b8152600401610d0a90613b52565b600c805460ff1916905560185460ff16156111f95760405162461bcd60e51b81526020600482015260076024820152661cdd1bdc1c195960ca1b6044820152606401610d0a565b601154341461123a5760405162461bcd60e51b815260206004820152600d60248201526c657468206e656564206d6f726560981b6044820152606401610d0a565b60008061124687612a06565b91509150806112865760405162461bcd60e51b815260206004820152600c60248201526b1b985b59481a5b9d985b1a5960a21b6044820152606401610d0a565b6000828152600e6020526040902054156112d05760405162461bcd60e51b815260206004820152600b60248201526a6e616d652065786973747360a81b6044820152606401610d0a565b601354600160a01b900460ff16156114795760008360ff161180156112f85750600b8360ff16105b6113315760405162461bcd60e51b815260206004820152600a602482015269747970652077726f6e6760b01b6044820152606401610d0a565b33600090815260166020526040902054601081901c600160ff86161b82166001600160401b038088169083161061139e5760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d081b19599d607a1b6044820152606401610d0a565b61ffff8116156113dc5760405162461bcd60e51b81526020600482015260096024820152681d1e5c19481d5cd95960ba1b6044820152606401610d0a565b6113f48989338a6001600160401b0316601454612ba3565b6114305760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610d0a565b8560ff16600161ffff16901b831761ffff1660108360016114519190613c1e565b3360009081526016602052604090206001600160401b039190911690911b9190911790555050505b6013546011546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156114b5573d6000803e3d6000fd5b5060006114c3338985612c24565b60115460408051338152602081018c9052908101839052606081019190915260ff861660808201529091507f55cd048872506f0260a28d0b81e7f245c7d0aa55c4d947f0899cdd28eb358e059060a0015b60405180910390a15050600c805460ff19166001179055505050505050565b600a546001600160a01b0316331461155d5760405162461bcd60e51b8152600401610d0a90613ba2565b601455565b606060048054610b9090613b1d565b600a546001600160a01b0316331461159b5760405162461bcd60e51b8152600401610d0a90613ba2565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156115e75760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c5460ff166001146116785760405162461bcd60e51b8152600401610d0a90613b52565b600c805460ff19169055601854610100900460ff16156116c45760405162461bcd60e51b81526020600482015260076024820152661cdd1bdc1c195960ca1b6044820152606401610d0a565b6000806116d087612a06565b91509150806117105760405162461bcd60e51b815260206004820152600c60248201526b1b985b59481a5b9d985b1a5960a21b6044820152606401610d0a565b6000828152600e60205260409020541561175a5760405162461bcd60e51b815260206004820152600b60248201526a6e616d652065786973747360a81b6044820152606401610d0a565b601354600160a81b900460ff161561190e5760008360ff161180156117825750600b8360ff16105b6117bb5760405162461bcd60e51b815260206004820152600a602482015269747970652077726f6e6760b01b6044820152606401610d0a565b33600090815260176020526040902054601081901c600160ff86161b821661ffff8116156118175760405162461bcd60e51b81526020600482015260096024820152681d1e5c19481d5cd95960ba1b6044820152606401610d0a565b866001600160401b0316826001600160401b0316106118715760405162461bcd60e51b8152602060048201526016602482015275125b9cdd59999a58da595b9d081b595d18481b19599d60521b6044820152606401610d0a565b6118898989338a6001600160401b0316601554612ba3565b6118c55760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610d0a565b8560ff16600161ffff16901b831761ffff1660108360016118e69190613c1e565b3360009081526017602052604090206001600160401b039190911690911b9190911790555050505b601354601254600c54611937926001600160a01b03610100909204821692339290911690612c96565b6000611944338985612c24565b60125460408051338152602081018c9052908101839052606081019190915260ff861660808201529091507f86c7fe133784f189979318893488aa80ea9b0f992a14ff05b01fdd508e86bfc59060a001611514565b6001600160a01b038116600090815260106020526040902054606090610b7b90612788565b6119c9848484612554565b6001600160a01b0383163b151580156119eb57506119e984848484612cf0565b155b15611a09576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b8051606090806001600160401b03811115611a2c57611a2c61357c565b604051908082528060200260200182016040528015611a8157816020015b611a6e60405180606001604052806000815260200160608152602001606081525090565b815260200190600190039081611a4a5790505b50915060005b81811015611c0d57611ad660106000868481518110611aa857611aa8613bd7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612788565b838281518110611ae857611ae8613bd7565b60200260200101516020018190525060106000858381518110611b0d57611b0d613bd7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000801b14611bfb57600d600060106000878581518110611b5957611b59613bd7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054815260200190815260200160002054838281518110611ba357611ba3613bd7565b60200260200101516000018181525050611bd9838281518110611bc857611bc8613bd7565b602002602001015160000151611d3b565b838281518110611beb57611beb613bd7565b6020026020010151604001819052505b80611c0581613c03565b915050611a87565b5050919050565b600a546001600160a01b03163314611c3e5760405162461bcd60e51b8152600401610d0a90613ba2565b601555565b600a546001600160a01b03163314611c6d5760405162461bcd60e51b8152600401610d0a90613ba2565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6000611c95613450565b6001600160a01b03831660009081526016602052604081205460101c92505b600b811015611d1a5780611cc9816002613d2d565b6001600160a01b0386166000908152601660205260409020541661ffff16901c8282600b8110611cfb57611cfb613bd7565b60ff909216602092909202015280611d1281613c03565b915050611cb4565b50915091565b6000818152600f6020526040902054606090610b7b90612788565b6060611d46826124bf565b611d6357604051630a14c4b560e41b815260040160405180910390fd5b6000611d6d6129f7565b9050805160001415611d8e576040518060200160405280600081525061105b565b80611d9884612dd9565b604051602001611da9929190613d39565b6040516020818303038152906040529392505050565b600a546001600160a01b03163314611de95760405162461bcd60e51b8152600401610d0a90613ba2565b601155565b600a546001600160a01b03163314611e185760405162461bcd60e51b8152600401610d0a90613ba2565b601880549115156101000261ff0019909216919091179055565b600a546001600160a01b03163314611e5c5760405162461bcd60e51b8152600401610d0a90613ba2565b6001600160a01b0382166000818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f8c2ff6748f99f65f4ebf8a1e973a289bad216c4d5b20fda1940d9e01118ae42a910160405180910390a15050565b611eea6040518060800160405280606081526020016060815260200160608152602001606081525090565b6001600160a01b03821660009081526019602052604090819020815160808101909252805482908290611f1c90613b1d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4890613b1d565b8015611f955780601f10611f6a57610100808354040283529160200191611f95565b820191906000526020600020905b815481529060010190602001808311611f7857829003601f168201915b50505050508152602001600182018054611fae90613b1d565b80601f0160208091040260200160405190810160405280929190818152602001828054611fda90613b1d565b80156120275780601f10611ffc57610100808354040283529160200191612027565b820191906000526020600020905b81548152906001019060200180831161200a57829003601f168201915b5050505050815260200160028201805461204090613b1d565b80601f016020809104026020016040519081016040528092919081815260200182805461206c90613b1d565b80156120b95780601f1061208e576101008083540402835291602001916120b9565b820191906000526020600020905b81548152906001019060200180831161209c57829003601f168201915b505050505081526020016003820180546120d290613b1d565b80601f01602080910402602001604051908101604052809291908181526020018280546120fe90613b1d565b801561214b5780601f106121205761010080835404028352916020019161214b565b820191906000526020600020905b81548152906001019060200180831161212e57829003601f168201915b5050505050815250509050919050565b600a546001600160a01b031633146121855760405162461bcd60e51b8152600401610d0a90613ba2565b6018805460ff1916911515919091179055565b600c5460ff166001146121bd5760405162461bcd60e51b8152600401610d0a90613b52565b600c805460ff1916905560006121d282611062565b9050336001600160a01b038216146122185760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610d0a565b33600081815260106020908152604080832054868452600f909252918290205491517f8bc21fe292dc3f26065b7ab1b9a28c9582e1e2f7eff701ac1e4a6729a1989b5d9361226c9390928792909190613b7c565b60405180910390a1506000908152600f6020908152604080832054338452601090925290912055600c805460ff19166001179055565b60006122ac613450565b6001600160a01b03831660009081526017602052604081205460101c92505b600b811015611d1a57806122e0816002613d2d565b6001600160a01b0386166000908152601760205260409020541661ffff16901c8282600b811061231257612312613bd7565b60ff90921660209290920201528061232981613c03565b9150506122cb565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3360009081526019602090815260409091208251610e4a928401906133cc565b600a546001600160a01b031633146123a95760405162461bcd60e51b8152600401610d0a90613ba2565b6001600160a01b03811661240e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d0a565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146124945760405162461bcd60e51b8152600401610d0a90613ba2565b601255565b3360009081526019602090815260409091208251610e4a926003909201918401906133cc565b6000816001111580156124d3575060015482105b8015610b7b575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061255f826128d0565b80519091506000906001600160a01b0316336001600160a01b0316148061258d5750815161258d9033612331565b806125a857503361259d84610c13565b6001600160a01b0316145b9050806125c857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146125fd5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661262457604051633a954ecd60e21b815260040160405180910390fd5b6126318585856001612ed6565b61264160008484600001516124f8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021790925590860180835291205490911661272b5760015481101561272b57825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b8051610e4a9060099060208401906133cc565b6060816127a357505060408051602081019091526000815290565b60005b60208160ff161080156127da5750828160ff16602081106127c9576127c9613bd7565b1a60f81b6001600160f81b03191615155b156127f157806127e981613d5f565b9150506127a6565b60008160ff166001600160401b0381111561280e5761280e61357c565b6040519080825280601f01601f191660200182016040528015612838576020820181803683370190505b509050600091505b60208260ff161080156128745750838260ff166020811061286357612863613bd7565b1a60f81b6001600160f81b03191615155b1561105b57838260ff166020811061288e5761288e613bd7565b1a60f81b818360ff16815181106128a7576128a7613bd7565b60200101906001600160f81b031916908160001a905350816128c881613d5f565b925050612840565b60408051606081018252600080825260208201819052918101919091528180600111158015612900575060015481105b156129de57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906129dc5780516001600160a01b031615612973579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156129d7579392505050565b612973565b505b604051636f96cda160e11b815260040160405180910390fd5b606060098054610b9090613b1d565b60008082612a1657509160009150565b60408051602080825281830190925260009160208201818036833701905050905060005b6020811015612b8e576000858260208110612a5757612a57613bd7565b1a60f81b90506001600160f81b03198116612a725750612b8e565b604160f81b6001600160f81b0319821610801590612a9e5750602d60f91b6001600160f81b0319821611155b15612ae357612ab260f882901c6020613d7f565b60f81b838381518110612ac757612ac7613bd7565b60200101906001600160f81b031916908160001a905350612b7b565b600360fc1b6001600160f81b0319821610801590612b0f5750603960f81b6001600160f81b0319821611155b80612b415750606160f81b6001600160f81b0319821610801590612b415750603d60f91b6001600160f81b0319821611155b15612b6e57858260208110612b5857612b58613bd7565b1a60f81b838381518110612ac757612ac7613bd7565b5092946000945092505050565b5080612b8681613c03565b915050612a3a565b50612b9881613da4565b946001945092505050565b60008084612bb085612dd9565b604051602001612bc1929190613dc8565b60405160208183030381529060405280519060200120905082612c18888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612f9e915050565b14979650505050505050565b600254600154600091900360001901612c3e906001613e00565b60408051600080825260208201909252919250612c6091869160019190613012565b6000838152600d60209081526040808320948352600e8252808320848452600f9092529091209390935591829055819055919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611a099085906131ef565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612d25903390899088908890600401613e18565b6020604051808303816000875af1925050508015612d60575060408051601f3d908101601f19168201909252612d5d91810190613e55565b60015b612dbb573d808015612d8e576040519150601f19603f3d011682016040523d82523d6000602084013e612d93565b606091505b508051612db3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081612dfd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e275780612e1181613c03565b9150612e209050600a83613e88565b9150612e01565b6000816001600160401b03811115612e4157612e4161357c565b6040519080825280601f01601f191660200182016040528015612e6b576020820181803683370190505b5090505b8415612dd157612e80600183613e9c565b9150612e8d600a86613eb3565b612e98906030613e00565b60f81b818381518110612ead57612ead613bd7565b60200101906001600160f81b031916908160001a905350612ecf600a86613e88565b9450612e6f565b6001600160a01b038416600090815260106020526040902054801561276e5760005b82811015612f9657612f0a8185613e00565b6000838152600d60205260409020541415612f84577f8bc21fe292dc3f26065b7ab1b9a28c9582e1e2f7eff701ac1e4a6729a1989b5d86612f4b8387613e00565b846000604051612f5e9493929190613b7c565b60405180910390a16001600160a01b038616600090815260106020526040812055612f96565b80612f8e81613c03565b915050612ef8565b505050505050565b600081815b845181101561300a576000858281518110612fc057612fc0613bd7565b60200260200101519050808311612fe65760008381526020829052604090209250612ff7565b600081815260208490526040902092505b508061300281613c03565b915050612fa3565b509392505050565b6001546001600160a01b03851661303b57604051622e076360e81b815260040160405180910390fd5b836130595760405163b562e8dd60e01b815260040160405180910390fd5b6130666000868387612ed6565b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561311757506001600160a01b0387163b15155b156131a0575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131686000888480600101955088612cf0565b613185576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561311d57826001541461319b57600080fd5b6131e6565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156131a1575b5060015561276e565b6000613244826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132c19092919063ffffffff16565b805190915015610ce057808060200190518101906132629190613ec7565b610ce05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d0a565b6060612dd1848460008585843b61331a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d0a565b600080866001600160a01b031685876040516133369190613ee4565b60006040518083038185875af1925050503d8060008114613373576040519150601f19603f3d011682016040523d82523d6000602084013e613378565b606091505b5091509150613388828286613393565b979650505050505050565b606083156133a257508161105b565b8251156133b25782518084602001fd5b8160405162461bcd60e51b8152600401610d0a919061350f565b8280546133d890613b1d565b90600052602060002090601f0160209004810192826133fa5760008555613440565b82601f1061341357805160ff1916838001178555613440565b82800160010185558215613440579182015b82811115613440578251825591602001919060010190613425565b5061344c92915061346f565b5090565b604051806101600160405280600b906020820280368337509192915050565b5b8082111561344c5760008155600101613470565b6001600160e01b031981168114610eb257600080fd5b6000602082840312156134ac57600080fd5b813561105b81613484565b60005b838110156134d25781810151838201526020016134ba565b83811115611a095750506000910152565b600081518084526134fb8160208601602086016134b7565b601f01601f19169290920160200192915050565b60208152600061105b60208301846134e3565b60006020828403121561353457600080fd5b5035919050565b6001600160a01b0381168114610eb257600080fd5b6000806040838503121561356357600080fd5b823561356e8161353b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156135ba576135ba61357c565b604052919050565b60006001600160401b038311156135db576135db61357c565b6135ee601f8401601f1916602001613592565b905082815283838301111561360257600080fd5b828260208301376000602084830101529392505050565b60006020828403121561362b57600080fd5b81356001600160401b0381111561364157600080fd5b8201601f8101841361365257600080fd5b612dd1848235602084016135c2565b60008060006060848603121561367657600080fd5b83356136818161353b565b925060208401356136918161353b565b929592945050506040919091013590565b60006001600160401b038211156136bb576136bb61357c565b5060051b60200190565b600060208083850312156136d857600080fd5b82356001600160401b038111156136ee57600080fd5b8301601f810185136136ff57600080fd5b803561371261370d826136a2565b613592565b81815260059190911b8201830190838101908783111561373157600080fd5b928401925b8284101561338857833582529284019290840190613736565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156137d257603f19898403018552815160608151855288820151818a8701526137a4828701826134e3565b915050878201519150848103888601526137be81836134e3565b968901969450505090860190600101613776565b509098975050505050505050565b6000602082840312156137f257600080fd5b813561105b8161353b565b8015158114610eb257600080fd5b60006020828403121561381d57600080fd5b813561105b816137fd565b803560ff8116811461383957600080fd5b919050565b60008060008060006080868803121561385657600080fd5b8535945060208601356001600160401b038082111561387457600080fd5b818801915088601f83011261388857600080fd5b81358181111561389757600080fd5b8960208260051b85010111156138ac57600080fd5b602083019650809550506040880135915080821682146138cb57600080fd5b5091506138da60608701613828565b90509295509295909350565b600080604083850312156138f957600080fd5b82356139048161353b565b91506020830135613914816137fd565b809150509250929050565b6000806000806080858703121561393557600080fd5b84356139408161353b565b935060208501356139508161353b565b92506040850135915060608501356001600160401b0381111561397257600080fd5b8501601f8101871361398357600080fd5b613992878235602084016135c2565b91505092959194509250565b600060208083850312156139b157600080fd5b82356001600160401b038111156139c757600080fd5b8301601f810185136139d857600080fd5b80356139e661370d826136a2565b81815260059190911b82018301908381019087831115613a0557600080fd5b928401925b82841015613388578335613a1d8161353b565b82529284019290840190613a0a565b6001600160401b0383168152610180810160208083018460005b600b811015613a6657815160ff1683529183019190830190600101613a46565b505050509392505050565b602081526000825160806020840152613a8d60a08401826134e3565b90506020840151601f1980858403016040860152613aab83836134e3565b92506040860151915080858403016060860152613ac883836134e3565b9250606086015191508085840301608086015250613ae682826134e3565b95945050505050565b60008060408385031215613b0257600080fd5b8235613b0d8161353b565b915060208301356139148161353b565b600181811c90821680613b3157607f821691505b6020821081141561101c57634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f10dbdb9d1c9858dd0e881313d0d2d15160821b604082015260600190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613c1757613c17613bed565b5060010190565b60006001600160401b03808316818516808303821115613c4057613c40613bed565b01949350505050565b600181815b80851115613c84578160001904821115613c6a57613c6a613bed565b80851615613c7757918102915b93841c9390800290613c4e565b509250929050565b600082613c9b57506001610b7b565b81613ca857506000610b7b565b8160018114613cbe5760028114613cc857613ce4565b6001915050610b7b565b60ff841115613cd957613cd9613bed565b50506001821b610b7b565b5060208310610133831016604e8410600b8410161715613d07575081810a610b7b565b613d118383613c49565b8060001904821115613d2557613d25613bed565b029392505050565b600061105b8383613c8c565b60008351613d4b8184602088016134b7565b835190830190613c408183602088016134b7565b600060ff821660ff811415613d7657613d76613bed565b60010192915050565b600060ff821660ff84168060ff03821115613d9c57613d9c613bed565b019392505050565b8051602080830151919081101561101c5760001960209190910360031b1b16919050565b6bffffffffffffffffffffffff198360601b16815260008251613df28160148501602087016134b7565b919091016014019392505050565b60008219821115613e1357613e13613bed565b500190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e4b908301846134e3565b9695505050505050565b600060208284031215613e6757600080fd5b815161105b81613484565b634e487b7160e01b600052601260045260246000fd5b600082613e9757613e97613e72565b500490565b600082821015613eae57613eae613bed565b500390565b600082613ec257613ec2613e72565b500690565b600060208284031215613ed957600080fd5b815161105b816137fd565b60008251613ef68184602087016134b7565b919091019291505056fea26469706673582212209b99a70115eaaa958c284d8bec5bab6afba18da8fc2dcb5d864b775e41221de264736f6c634300080b0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000364fcd7325c035cc4f2cde8b6c8d7df5e7db658900000000000000000000000000000000000000000000000000000000000000134d6574616c6b204e616d6520536572766963650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d4e530000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Metalk Name Service
Arg [1] : _symbol (string): MNS
Arg [2] : meta (address): 0x364fcd7325C035CC4F2cdE8b6c8D7Df5e7Db6589

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000364fcd7325c035cc4f2cde8b6c8d7df5e7db6589
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [4] : 4d6574616c6b204e616d65205365727669636500000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4d4e530000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51123:13315:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29198:285;;;;;;;;;;-1:-1:-1;29198:285:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29198:285:0;;;;;;;;32479:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33989:204::-;;;;;;;;;;-1:-1:-1;33989:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;33989:204:0;1528:203:1;33552:371:0;;;;;;;;;;-1:-1:-1;33552:371:0;;;;;:::i;:::-;;:::i;:::-;;57976:413;;;;;;;;;;;;;:::i;60175:120::-;;;;;;;;;;-1:-1:-1;60175:120:0;;;;;:::i;:::-;;:::i;60043:124::-;;;;;;;;;;-1:-1:-1;60043:124:0;;;;;:::i;:::-;;:::i;28471:291::-;;;;;;;;;;-1:-1:-1;28717:12:0;;28172:1;28701:13;:28;-1:-1:-1;;28701:46:0;28471:291;;;3618:25:1;;;3606:2;3591:18;28471:291:0;3472:177:1;51269:23:0;;;;;;;;;;-1:-1:-1;51269:23:0;;;;;;;-1:-1:-1;;;;;51269:23:0;;;34846:170;;;;;;;;;;-1:-1:-1;34846:170:0;;;;;:::i;:::-;;:::i;52062:94::-;;;;;;;;;;;;;;;;61325:116;;;;;;;;;;-1:-1:-1;61325:116:0;;;;;:::i;:::-;;:::i;59519:392::-;;;;;;;;;;-1:-1:-1;59519:392:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35087:185::-;;;;;;;;;;-1:-1:-1;35087:185:0;;;;;:::i;:::-;;:::i;51990:35::-;;;;;;;;;;-1:-1:-1;51990:35:0;;;;-1:-1:-1;;;51990:35:0;;;;;;51775;;;;;;;;;;;;;;;;61101:196;;;;;;;;;;-1:-1:-1;61101:196:0;;;;;:::i;:::-;;:::i;48581:41::-;;;;;;;;;;-1:-1:-1;48581:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;52165:29;;;;;;;;;;;;;;;;52678:30;;;;;;;;;;-1:-1:-1;52678:30:0;;;;;;;;;;;51856:89;;;;;;;;;;-1:-1:-1;51856:89:0;;;;-1:-1:-1;;;;;51856:89:0;;;32288:124;;;;;;;;;;-1:-1:-1;32288:124:0;;;;;:::i;:::-;;:::i;63246:97::-;;;;;;;;;;-1:-1:-1;63246:97:0;;;;;:::i;:::-;;:::i;49127:100::-;;;;;;;;;;-1:-1:-1;49127:100:0;;;;;:::i;:::-;-1:-1:-1;;;;;49204:15:0;49180:4;49204:15;;;:9;:15;;;;;;;;;49127:100;29547:206;;;;;;;;;;-1:-1:-1;29547:206:0;;;;;:::i;:::-;;:::i;61449:92::-;;;;;;;;;;;;;:::i;47982:148::-;;;;;;;;;;;;;:::i;52645:26::-;;;;;;;;;;-1:-1:-1;52645:26:0;;;;;;;;53578:1195;;;;;;:::i;:::-;;:::i;63351:105::-;;;;;;;;;;-1:-1:-1;63351:105:0;;;;;:::i;:::-;;:::i;47335:87::-;;;;;;;;;;-1:-1:-1;47408:6:0;;-1:-1:-1;;;;;47408:6:0;47335:87;;32648:104;;;;;;;;;;;;;:::i;61787:120::-;;;;;;;;;;-1:-1:-1;61787:120:0;;;;;:::i;:::-;;:::i;60545:116::-;;;;;;;;;;-1:-1:-1;60545:116:0;;;;;:::i;:::-;60607:7;60633:20;;;:14;:20;;;;;;;60545:116;34265:279;;;;;;;;;;-1:-1:-1;34265:279:0;;;;;:::i;:::-;;:::i;54807:1210::-;;;;;;:::i;:::-;;:::i;51817:32::-;;;;;;;;;;;;;;;;60950:143;;;;;;;;;;-1:-1:-1;60950:143:0;;;;;:::i;:::-;;:::i;35343:369::-;;;;;;;;;;-1:-1:-1;35343:369:0;;;;;:::i;:::-;;:::i;58995:516::-;;;;;;;;;;-1:-1:-1;58995:516:0;;;;;:::i;:::-;;:::i;63464:113::-;;;;;;;;;;-1:-1:-1;63464:113:0;;;;;:::i;:::-;;:::i;63149:89::-;;;;;;;;;;-1:-1:-1;63149:89:0;;;;;:::i;:::-;;:::i;63616:297::-;;;;;;;;;;-1:-1:-1;63616:297:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;60799:143::-;;;;;;;;;;-1:-1:-1;60799:143:0;;;;;:::i;:::-;;:::i;32823:320::-;;;;;;;;;;-1:-1:-1;32823:320:0;;;;;:::i;:::-;;:::i;61549:116::-;;;;;;;;;;-1:-1:-1;61549:116:0;;;;;:::i;:::-;;:::i;64343:92::-;;;;;;;;;;-1:-1:-1;64343:92:0;;;;;:::i;:::-;;:::i;48980:139::-;;;;;;;;;;-1:-1:-1;48980:139:0;;;;;:::i;:::-;;:::i;60427:110::-;;;;;;;;;;-1:-1:-1;60427:110:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64254:81::-;;;;;;;;;;-1:-1:-1;64254:81:0;;;;;:::i;:::-;;:::i;57611:320::-;;;;;;;;;;-1:-1:-1;57611:320:0;;;;;:::i;:::-;;:::i;51952:31::-;;;;;;;;;;-1:-1:-1;51952:31:0;;;;-1:-1:-1;;;51952:31:0;;;;;;63921:325;;;;;;;;;;-1:-1:-1;63921:325:0;;;;;:::i;:::-;;:::i;34615:164::-;;;;;;;;;;-1:-1:-1;34615:164:0;;;;;:::i;:::-;;:::i;59919:116::-;;;;;;;;;;-1:-1:-1;59919:116:0;;;;;:::i;:::-;;:::i;48283:244::-;;;;;;;;;;-1:-1:-1;48283:244:0;;;;;:::i;:::-;;:::i;61673:106::-;;;;;;;;;;-1:-1:-1;61673:106:0;;;;;:::i;:::-;;:::i;60303:116::-;;;;;;;;;;-1:-1:-1;60303:116:0;;;;;:::i;:::-;;:::i;60669:122::-;;;;;;;;;;-1:-1:-1;60669:122:0;;;;;:::i;:::-;60730:4;60753:25;;;:19;:25;;;;;;:30;;;60669:122;29198:285;29300:4;-1:-1:-1;;;;;;29333:40:0;;-1:-1:-1;;;29333:40:0;;:97;;-1:-1:-1;;;;;;;29382:48:0;;-1:-1:-1;;;29382:48:0;29333:97;:142;;;-1:-1:-1;;;;;;;8327:33:0;;8303:4;8327:33;;;;;;;;;;;;;29439:36;29317:158;29198:285;-1:-1:-1;;29198:285:0:o;32479:100::-;32533:13;32566:5;32559:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32479:100;:::o;33989:204::-;34057:7;34082:16;34090:7;34082;:16::i;:::-;34077:64;;34107:34;;-1:-1:-1;;;34107:34:0;;;;;;;;;;;34077:64;-1:-1:-1;34161:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34161:24:0;;33989:204::o;33552:371::-;33625:13;33641:24;33657:7;33641:15;:24::i;:::-;33625:40;;33686:5;-1:-1:-1;;;;;33680:11:0;:2;-1:-1:-1;;;;;33680:11:0;;33676:48;;;33700:24;;-1:-1:-1;;;33700:24:0;;;;;;;;;;;33676:48;719:10;-1:-1:-1;;;;;33741:21:0;;;;;;:63;;-1:-1:-1;33767:37:0;33784:5;719:10;34615:164;:::i;33767:37::-;33766:38;33741:63;33737:138;;;33828:35;;-1:-1:-1;;;33828:35:0;;;;;;;;;;;33737:138;33887:28;33896:2;33900:7;33909:5;33887:8;:28::i;:::-;33614:309;33552:371;;:::o;57976:413::-;48872:8;;;;;:13;48864:42;;;;-1:-1:-1;;;48864:42:0;;;;;;;:::i;:::-;;;;;;;;;48917:8;:12;;-1:-1:-1;;48917:12:0;;;58062:10:::1;48928:1:::0;58045:28;;;:16:::1;:28;::::0;;;;;58092:16;58084:37:::1;;;::::0;-1:-1:-1;;;58084:37:0;;14219:2:1;58084:37:0::1;::::0;::::1;14201:21:1::0;14258:1;14238:18;;;14231:29;-1:-1:-1;;;14276:18:1;;;14269:38;14324:18;;58084:37:0::1;14017:331:1::0;58084:37:0::1;58132:14;58149:27:::0;;;:14:::1;:27;::::0;;;;;;58203:15:::1;58149:27:::0;58203:7:::1;:15::i;:::-;58187:31:::0;-1:-1:-1;58237:10:0::1;-1:-1:-1::0;;;;;58237:19:0;::::1;;58229:41;;;::::0;-1:-1:-1;;;58229:41:0;;14555:2:1;58229:41:0::1;::::0;::::1;14537:21:1::0;14594:1;14574:18;;;14567:29;-1:-1:-1;;;14612:18:1;;;14605:39;14661:18;;58229:41:0::1;14353:332:1::0;58229:41:0::1;58286:49;58300:10;58312:6;58320:11;58333:1;58286:49;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;58370:10:0::1;58353:28;::::0;;;:16:::1;:28;::::0;;;;58346:35;-1:-1:-1;48952:8:0;:12;;-1:-1:-1;;48952:12:0;48963:1;48952:12;;;57976:413::o;60175:120::-;60256:10;60245:22;;;;:10;:22;;;;;;;;:42;;;;:31;;;;;:42;;;;:::i;:::-;;60175:120;:::o;60043:124::-;60126:10;60115:22;;;;:10;:22;;;;;;;;:44;;;;:32;;;;;:44;;;;:::i;34846:170::-;34980:28;34990:4;34996:2;35000:7;34980:9;:28::i;61325:116::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;61408:25:::1;61420:12;61408:11;:25::i;:::-;61325:116:::0;:::o;59519:392::-;59586:26;59650:8;:15;-1:-1:-1;;;;;59630:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;59630:36:0;;;;;;;;;;;;;;;;;59624:42;;59682:9;59677:227;59701:8;:15;59697:1;:19;59677:227;;;59755:8;59764:1;59755:11;;;;;;;;:::i;:::-;;;;;;;59738:3;59742:1;59738:6;;;;;;;;:::i;:::-;;;;;;;:14;;:28;;;;;59799:44;59815:14;:27;59830:8;59839:1;59830:11;;;;;;;;:::i;:::-;;;;;;;59815:27;;;;;;;;;;;;59799:15;:44::i;:::-;59781:3;59785:1;59781:6;;;;;;;;:::i;:::-;;;;;;;:15;;:62;;;;59871:21;59880:8;59889:1;59880:11;;;;;;;;:::i;:::-;;;;;;;59871:8;:21::i;:::-;59858:3;59862:1;59858:6;;;;;;;;:::i;:::-;;;;;;;:10;;:34;;;;59718:3;;;;;:::i;:::-;;;;59677:227;;;;59519:392;;;:::o;35087:185::-;35225:39;35242:4;35248:2;35252:7;35225:39;;;;;;;;;;;;:16;:39::i;61101:196::-;61160:11;61198:20;;;:14;:20;;;;;;61233:9;;61229:61;;61265:13;61273:4;61265:7;:13::i;:::-;61259:19;61101:196;-1:-1:-1;;;61101:196:0:o;32288:124::-;32352:7;32379:20;32391:7;32379:11;:20::i;:::-;:25;;32288:124;-1:-1:-1;;32288:124:0:o;63246:97::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;63313:16:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;63313:22:0::1;-1:-1:-1::0;;;;63313:22:0;;::::1;::::0;;;::::1;::::0;;63246:97::o;29547:206::-;29611:7;-1:-1:-1;;;;;29635:19:0;;29631:60;;29663:28;;-1:-1:-1;;;29663:28:0;;;;;;;;;;;29631:60;-1:-1:-1;;;;;;29717:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29717:27:0;;29547:206::o;61449:92::-;61492:13;61524:9;:7;:9::i;:::-;61517:16;;61449:92;:::o;47982:148::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;48073:6:::1;::::0;48052:40:::1;::::0;48089:1:::1;::::0;-1:-1:-1;;;;;48073:6:0::1;::::0;48052:40:::1;::::0;48089:1;;48052:40:::1;48103:6;:19:::0;;-1:-1:-1;;;;;;48103:19:0::1;::::0;;47982:148::o;53578:1195::-;48872:8;;;;;:13;48864:42;;;;-1:-1:-1;;;48864:42:0;;;;;;;:::i;:::-;48917:8;:12;;-1:-1:-1;;48917:12:0;;;53712:7:::1;::::0;48917:12;53712:7:::1;53711:8;53703:28;;;::::0;-1:-1:-1;;;53703:28:0;;16087:2:1;53703:28:0::1;::::0;::::1;16069:21:1::0;16126:1;16106:18;;;16099:29;-1:-1:-1;;;16144:18:1;;;16137:37;16191:18;;53703:28:0::1;15885:330:1::0;53703:28:0::1;53763:13;;53750:9;:26;53742:52;;;::::0;-1:-1:-1;;;53742:52:0;;16422:2:1;53742:52:0::1;::::0;::::1;16404:21:1::0;16461:2;16441:18;;;16434:30;-1:-1:-1;;;16480:18:1;;;16473:43;16533:18;;53742:52:0::1;16220:337:1::0;53742:52:0::1;53808:10;53819::::0;53833:16:::1;53839:9;53833:5;:16::i;:::-;53807:42;;;;53868:5;53860:30;;;::::0;-1:-1:-1;;;53860:30:0;;16764:2:1;53860:30:0::1;::::0;::::1;16746:21:1::0;16803:2;16783:18;;;16776:30;-1:-1:-1;;;16822:18:1;;;16815:42;16874:18;;53860:30:0::1;16562:336:1::0;53860:30:0::1;53909:23;::::0;;;:19:::1;:23;::::0;;;;;:28;53901:52:::1;;;::::0;-1:-1:-1;;;53901:52:0;;17105:2:1;53901:52:0::1;::::0;::::1;17087:21:1::0;17144:2;17124:18;;;17117:30;-1:-1:-1;;;17163:18:1;;;17156:41;17214:18;;53901:52:0::1;16903:335:1::0;53901:52:0::1;53970:12;::::0;-1:-1:-1;;;53970:12:0;::::1;;;53966:612;;;54016:1;54008:5;:9;;;54007:27;;;;;54031:2;54023:5;:10;;;54007:27;53999:50;;;::::0;-1:-1:-1;;;53999:50:0;;17445:2:1;53999:50:0::1;::::0;::::1;17427:21:1::0;17484:2;17464:18;;;17457:30;-1:-1:-1;;;17503:18:1;;;17496:40;17553:18;;53999:50:0::1;17243:334:1::0;53999:50:0::1;54094:10;54064:12;54079:26:::0;;;:14:::1;:26;::::0;;;;;54170:2:::1;54162:10:::0;;::::1;54198:4;54191:21;::::0;::::1;;54175:38:::0;::::1;-1:-1:-1::0;;;;;54237:24:0;;::::1;::::0;;::::1;;54229:54;;;::::0;-1:-1:-1;;;54229:54:0;;17784:2:1;54229:54:0::1;::::0;::::1;17766:21:1::0;17823:2;17803:18;;;17796:30;-1:-1:-1;;;17842:18:1;;;17835:47;17899:18;;54229:54:0::1;17582:341:1::0;54229:54:0::1;54306:13;::::0;::::1;::::0;54298:35:::1;;;::::0;-1:-1:-1;;;54298:35:0;;18130:2:1;54298:35:0::1;::::0;::::1;18112:21:1::0;18169:1;18149:18;;;18142:29;-1:-1:-1;;;18187:18:1;;;18180:39;18236:18;;54298:35:0::1;17928:332:1::0;54298:35:0::1;54356:63;54364:11;;54377:10;54397:8;-1:-1:-1::0;;;;;54389:17:0::1;54408:10;;54356:7;:63::i;:::-;54348:89;;;::::0;-1:-1:-1;;;54348:89:0;;18467:2:1;54348:89:0::1;::::0;::::1;18449:21:1::0;18506:2;18486:18;;;18479:30;-1:-1:-1;;;18525:18:1;;;18518:43;18578:18;;54348:89:0::1;18265:337:1::0;54348:89:0::1;54558:5;54542:21;;54549:4;54542:21;;;;54533:4;54526:38;54517:49;;54511:2;54497:5;54505:1;54497:9;;;;:::i;:::-;54467:10;54452:26;::::0;;;:14:::1;:26;::::0;;;;-1:-1:-1;;;;;54489:18:0;;;::::1;:24:::0;;::::1;54481:85:::0;;;::::1;54452:114:::0;;-1:-1:-1;;;53966:612:0::1;54590:12;::::0;54612:13:::1;::::0;54590:36:::1;::::0;-1:-1:-1;;;;;54590:12:0;;::::1;::::0;:36;::::1;;;::::0;54612:13;54590:12:::1;:36:::0;:12;:36;54612:13;54590:12;:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;54637:14;54654:31;54659:10;54671:9;54682:2;54654:4;:31::i;:::-;54744:13;::::0;54701:64:::1;::::0;;54713:10:::1;19103:51:1::0;;19185:2;19170:18;;19163:34;;;19213:18;;;19206:34;;;19271:2;19256:18;;19249:34;;;;19332:4;19320:17;;19314:3;19299:19;;19292:46;54637:48:0;;-1:-1:-1;54701:64:0::1;::::0;19090:3:1;19075:19;54701:64:0::1;;;;;;;;-1:-1:-1::0;;48952:8:0;:12;;-1:-1:-1;;48952:12:0;48963:1;48952:12;;;-1:-1:-1;;;;;;53578:1195:0:o;63351:105::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;63424:10:::1;:24:::0;63351:105::o;32648:104::-;32704:13;32737:7;32730:14;;;;;:::i;61787:120::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;61871:12:::1;:28:::0;;-1:-1:-1;;;;;;61871:28:0::1;-1:-1:-1::0;;;;;61871:28:0;;;::::1;::::0;;;::::1;::::0;;61787:120::o;34265:279::-;-1:-1:-1;;;;;34356:24:0;;719:10;34356:24;34352:54;;;34389:17;;-1:-1:-1;;;34389:17:0;;;;;;;;;;;34352:54;719:10;34419:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34419:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34419:53:0;;;;;;;;;;34488:48;;540:41:1;;;34419:42:0;;719:10;34488:48;;513:18:1;34488:48:0;;;;;;;34265:279;;:::o;54807:1210::-;48872:8;;;;;:13;48864:42;;;;-1:-1:-1;;;48864:42:0;;;;;;;:::i;:::-;48917:8;:12;;-1:-1:-1;;48917:12:0;;;54948:11:::1;::::0;48917:12;54948:11;::::1;48917:12:::0;54948:11:::1;54947:12;54939:32;;;::::0;-1:-1:-1;;;54939:32:0;;16087:2:1;54939:32:0::1;::::0;::::1;16069:21:1::0;16126:1;16106:18;;;16099:29;-1:-1:-1;;;16144:18:1;;;16137:37;16191:18;;54939:32:0::1;15885:330:1::0;54939:32:0::1;54985:10;54996::::0;55010:16:::1;55016:9;55010:5;:16::i;:::-;54984:42;;;;55045:5;55037:30;;;::::0;-1:-1:-1;;;55037:30:0;;16764:2:1;55037:30:0::1;::::0;::::1;16746:21:1::0;16803:2;16783:18;;;16776:30;-1:-1:-1;;;16822:18:1;;;16815:42;16874:18;;55037:30:0::1;16562:336:1::0;55037:30:0::1;55086:23;::::0;;;:19:::1;:23;::::0;;;;;:28;55078:52:::1;;;::::0;-1:-1:-1;;;55078:52:0;;17105:2:1;55078:52:0::1;::::0;::::1;17087:21:1::0;17144:2;17124:18;;;17117:30;-1:-1:-1;;;17163:18:1;;;17156:41;17214:18;;55078:52:0::1;16903:335:1::0;55078:52:0::1;55147:16;::::0;-1:-1:-1;;;55147:16:0;::::1;;;55143:634;;;55197:1;55189:5;:9;;;55188:27;;;;;55212:2;55204:5;:10;;;55188:27;55180:50;;;::::0;-1:-1:-1;;;55180:50:0;;17445:2:1;55180:50:0::1;::::0;::::1;17427:21:1::0;17484:2;17464:18;;;17457:30;-1:-1:-1;;;17503:18:1;;;17496:40;17553:18;;55180:50:0::1;17243:334:1::0;55180:50:0::1;55279:10;55245:12;55260:30:::0;;;:18:::1;:30;::::0;;;;;55355:2:::1;55347:10:::0;;::::1;55383:4;55376:21;::::0;::::1;;55360:38:::0;::::1;55376:21;55422:13:::0;::::1;::::0;55414:35:::1;;;::::0;-1:-1:-1;;;55414:35:0;;18130:2:1;55414:35:0::1;::::0;::::1;18112:21:1::0;18169:1;18149:18;;;18142:29;-1:-1:-1;;;18187:18:1;;;18180:39;18236:18;;55414:35:0::1;17928:332:1::0;55414:35:0::1;55488:8;-1:-1:-1::0;;;;;55480:17:0::1;55472:5;-1:-1:-1::0;;;;;55472:25:0::1;;55464:60;;;::::0;-1:-1:-1;;;55464:60:0;;19551:2:1;55464:60:0::1;::::0;::::1;19533:21:1::0;19590:2;19570:18;;;19563:30;-1:-1:-1;;;19609:18:1;;;19602:52;19671:18;;55464:60:0::1;19349:346:1::0;55464:60:0::1;55547:67;55555:11;;55568:10;55588:8;-1:-1:-1::0;;;;;55580:17:0::1;55599:14;;55547:7;:67::i;:::-;55539:93;;;::::0;-1:-1:-1;;;55539:93:0;;18467:2:1;55539:93:0::1;::::0;::::1;18449:21:1::0;18506:2;18486:18;;;18479:30;-1:-1:-1;;;18525:18:1;;;18518:43;18578:18;;55539:93:0::1;18265:337:1::0;55539:93:0::1;55757:5;55741:21;;55748:4;55741:21;;;;55732:4;55725:38;55716:49;;55710:2;55696:5;55704:1;55696:9;;;;:::i;:::-;55666:10;55647:30;::::0;;;:18:::1;:30;::::0;;;;-1:-1:-1;;;;;55688:18:0;;;::::1;:24:::0;;::::1;55680:85:::0;;;::::1;55647:118:::0;;-1:-1:-1;;;55143:634:0::1;55828:12;::::0;55842:17:::1;::::0;55789:9:::1;::::0;:71:::1;::::0;-1:-1:-1;;;;;55828:12:0::1;55789:9:::0;;::::1;::::0;::::1;::::0;55816:10:::1;::::0;55828:12;;::::1;::::0;55789:26:::1;:71::i;:::-;55871:14;55888:31;55893:10;55905:9;55916:2;55888:4;:31::i;:::-;55984:17;::::0;55935:74:::1;::::0;;55953:10:::1;19103:51:1::0;;19185:2;19170:18;;19163:34;;;19213:18;;;19206:34;;;19271:2;19256:18;;19249:34;;;;19332:4;19320:17;;19314:3;19299:19;;19292:46;55871:48:0;;-1:-1:-1;55935:74:0::1;::::0;19090:3:1;19075:19;55935:74:0::1;18848:496:1::0;60950:143:0;-1:-1:-1;;;;;61062:22:0;;;;;;:16;:22;;;;;;61014:13;;61046:39;;:15;:39::i;35343:369::-;35510:28;35520:4;35526:2;35530:7;35510:9;:28::i;:::-;-1:-1:-1;;;;;35553:13:0;;17377:20;17415:8;;35553:76;;;;;35573:56;35604:4;35610:2;35614:7;35623:5;35573:30;:56::i;:::-;35572:57;35553:76;35549:156;;;35653:40;;-1:-1:-1;;;35653:40:0;;;;;;;;;;;35549:156;35343:369;;;;:::o;58995:516::-;59117:11;;59063:26;;59117:11;-1:-1:-1;;;;;59145:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;59145:26:0;;;;;;;;;;;;;;;;;59139:32;;59187:9;59182:322;59206:5;59202:1;:9;59182:322;;;59251:42;59267:16;:25;59284:4;59289:1;59284:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;59267:25:0;-1:-1:-1;;;;;59267:25:0;;;;;;;;;;;;;59251:15;:42::i;:::-;59233:3;59237:1;59233:6;;;;;;;;:::i;:::-;;;;;;;:15;;:60;;;;59312:16;:25;59329:4;59334:1;59329:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;59312:25:0;-1:-1:-1;;;;;59312:25:0;;;;;;;;;;;;;59341:1;59312:30;;;59308:185;;59380:14;:41;59395:16;:25;59412:4;59417:1;59412:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;59395:25:0;-1:-1:-1;;;;;59395:25:0;;;;;;;;;;;;;59380:41;;;;;;;;;;;;59363:3;59367:1;59363:6;;;;;;;;:::i;:::-;;;;;;;:14;;:58;;;;;59453:24;59462:3;59466:1;59462:6;;;;;;;;:::i;:::-;;;;;;;:14;;;59453:8;:24::i;:::-;59440:3;59444:1;59440:6;;;;;;;;:::i;:::-;;;;;;;:10;;:37;;;;59308:185;59213:3;;;;:::i;:::-;;;;59182:322;;;;59090:421;58995:516;;;:::o;63464:113::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;63541:14:::1;:28:::0;63464:113::o;63149:89::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;63212:12:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;63212:18:0::1;-1:-1:-1::0;;;;63212:18:0;;::::1;::::0;;;::::1;::::0;;63149:89::o;63616:297::-;63677:12;63691:26;;:::i;:::-;-1:-1:-1;;;;;63745:20:0;;;;;;:14;:20;;;;;;63769:2;63745:26;;-1:-1:-1;63783:123:0;63804:2;63800:1;:6;63783:123;;;63892:1;63881:6;63892:1;63881;:6;:::i;:::-;-1:-1:-1;;;;;63857:20:0;;;;;;:14;:20;;;;;;63850:37;;;63849:44;;63828:9;63838:1;63828:12;;;;;;;:::i;:::-;:66;;;;:12;;;;;;:66;63808:3;;;;:::i;:::-;;;;63783:123;;;;63616:297;;;:::o;60799:143::-;60911:22;;;;:14;:22;;;;;;60863:13;;60895:39;;:15;:39::i;32823:320::-;32896:13;32927:16;32935:7;32927;:16::i;:::-;32922:59;;32952:29;;-1:-1:-1;;;32952:29:0;;;;;;;;;;;32922:59;32994:22;33019:9;:7;:9::i;:::-;32994:34;;33052:8;33046:22;33072:1;33046:27;;:89;;;;;;;;;;;;;;;;;33100:8;33110:18;:7;:16;:18::i;:::-;33083:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33039:96;32823:320;-1:-1:-1;;;32823:320:0:o;61549:116::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;61627:13:::1;:30:::0;61549:116::o;64343:92::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;64409:11:::1;:18:::0;;;::::1;;;;-1:-1:-1::0;;64409:18:0;;::::1;::::0;;;::::1;::::0;;64343:92::o;48980:139::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49052:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:22;;-1:-1:-1;;49052:22:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49090:21;;21717:51:1;;;21784:18;;;21777:50;49090:21:0::1;::::0;21690:18:1;49090:21:0::1;;;;;;;48980:139:::0;;:::o;60427:110::-;60481:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60481:13:0;-1:-1:-1;;;;;60513:16:0;;;;;;:10;:16;;;;;;;60506:23;;;;;;;;;;;;60513:16;;60506:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60427:110;;;:::o;64254:81::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;64313:7:::1;:14:::0;;-1:-1:-1;;64313:14:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64254:81::o;57611:320::-;48872:8;;;;;:13;48864:42;;;;-1:-1:-1;;;48864:42:0;;;;;;;:::i;:::-;48917:8;:12;;-1:-1:-1;;48917:12:0;;;48928:1;57689:15:::1;57697:6:::0;57689:7:::1;:15::i;:::-;57673:31:::0;-1:-1:-1;57723:10:0::1;-1:-1:-1::0;;;;;57723:19:0;::::1;;57715:41;;;::::0;-1:-1:-1;;;57715:41:0;;14555:2:1;57715:41:0::1;::::0;::::1;14537:21:1::0;14594:1;14574:18;;;14567:29;-1:-1:-1;;;14612:18:1;;;14605:39;14661:18;;57715:41:0::1;14353:332:1::0;57715:41:0::1;57786:10;57806:28;::::0;;;:16:::1;:28;::::0;;;;;;;;57836:22;;;:14:::1;:22:::0;;;;;;;;57772:87;;::::1;::::0;::::1;::::0;57786:10;;57798:6;;57806:28;;57836:22;57772:87:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;57901:22:0::1;::::0;;;:14:::1;:22;::::0;;;;;;;;57887:10:::1;57870:28:::0;;:16:::1;:28:::0;;;;;;:53;48952:8;:12;;-1:-1:-1;;48952:12:0;48963:1;48952:12;;;57611:320::o;63921:325::-;63986:16;64004:30;;:::i;:::-;-1:-1:-1;;;;;64066:24:0;;;;;;:18;:24;;;;;;64094:2;64066:30;;-1:-1:-1;64108:131:0;64129:2;64125:1;:6;64108:131;;;64225:1;64214:6;64225:1;64214;:6;:::i;:::-;-1:-1:-1;;;;;64186:24:0;;;;;;:18;:24;;;;;;64179:41;;;64178:48;;64153:13;64167:1;64153:16;;;;;;;:::i;:::-;:74;;;;:16;;;;;;:74;64133:3;;;;:::i;:::-;;;;64108:131;;34615:164;-1:-1:-1;;;;;34736:25:0;;;34712:4;34736:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34615:164::o;59919:116::-;59998:10;59987:22;;;;:10;:22;;;;;;;;:40;;;;;;;;:::i;48283:244::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48372:22:0;::::1;48364:73;;;::::0;-1:-1:-1;;;48364:73:0;;22462:2:1;48364:73:0::1;::::0;::::1;22444:21:1::0;22501:2;22481:18;;;22474:30;22540:34;22520:18;;;22513:62;-1:-1:-1;;;22591:18:1;;;22584:36;22637:19;;48364:73:0::1;22260:402:1::0;48364:73:0::1;48474:6;::::0;48453:38:::1;::::0;-1:-1:-1;;;;;48453:38:0;;::::1;::::0;48474:6:::1;::::0;48453:38:::1;::::0;48474:6:::1;::::0;48453:38:::1;48502:6;:17:::0;;-1:-1:-1;;;;;;48502:17:0::1;-1:-1:-1::0;;;;;48502:17:0;;;::::1;::::0;;;::::1;::::0;;48283:244::o;61673:106::-;47408:6;;-1:-1:-1;;;;;47408:6:0;719:10;47553:23;47545:68;;;;-1:-1:-1;;;47545:68:0;;;;;;;:::i;:::-;61746:17:::1;:25:::0;61673:106::o;60303:116::-;60382:10;60371:22;;;;:10;:22;;;;;;;;:40;;;;:30;;;;;:40;;;;:::i;35967:183::-;36024:4;36067:7;28172:1;36048:26;;:53;;;;;36088:13;;36078:7;:23;36048:53;:94;;;;-1:-1:-1;;36115:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36115:27:0;;;;36114:28;;35967:183::o;43344:196::-;43459:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43459:29:0;-1:-1:-1;;;;;43459:29:0;;;;;;;;;43504:28;;43459:24;;43504:28;;;;;;;43344:196;;;:::o;39010:2036::-;39125:35;39163:20;39175:7;39163:11;:20::i;:::-;39238:18;;39125:58;;-1:-1:-1;39196:22:0;;-1:-1:-1;;;;;39222:34:0;719:10;-1:-1:-1;;;;;39222:34:0;;:97;;;-1:-1:-1;39286:18:0;;39269:50;;719:10;34615:164;:::i;39269:50::-;39222:146;;;-1:-1:-1;719:10:0;39332:20;39344:7;39332:11;:20::i;:::-;-1:-1:-1;;;;;39332:36:0;;39222:146;39196:173;;39387:17;39382:66;;39413:35;;-1:-1:-1;;;39413:35:0;;;;;;;;;;;39382:66;39485:4;-1:-1:-1;;;;;39463:26:0;:13;:18;;;-1:-1:-1;;;;;39463:26:0;;39459:67;;39498:28;;-1:-1:-1;;;39498:28:0;;;;;;;;;;;39459:67;-1:-1:-1;;;;;39541:16:0;;39537:52;;39566:23;;-1:-1:-1;;;39566:23:0;;;;;;;;;;;39537:52;39602:43;39624:4;39630:2;39634:7;39643:1;39602:21;:43::i;:::-;39710:49;39727:1;39731:7;39740:13;:18;;;39710:8;:49::i;:::-;-1:-1:-1;;;;;40047:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40047:31:0;;;-1:-1:-1;;;;;40047:31:0;;;-1:-1:-1;;40047:31:0;;;;;;;40089:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40089:29:0;;;;;;;;;;;40131:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;40172:61:0;;;;-1:-1:-1;;;40217:15:0;40172:61;;;;;;;;;;;40495:11;;;40521:24;;;;;:29;40495:11;;40521:29;40517:417;;40734:13;;40720:11;:27;40716:207;;;40800:18;;;40768:24;;;:11;:24;;;;;;;;:50;;40879:28;;;;-1:-1:-1;;;;;40837:70:0;-1:-1:-1;;;40837:70:0;-1:-1:-1;;;;;;40837:70:0;;;-1:-1:-1;;;;;40768:50:0;;;40837:70;;;;;;;40716:207;40026:915;40977:7;40973:2;-1:-1:-1;;;;;40958:27:0;40967:4;-1:-1:-1;;;;;40958:27:0;;;;;;;;;;;40996:42;39114:1932;;39010:2036;;;:::o;28189:100::-;28262:19;;;;:8;;:19;;;;;:::i;61915:428::-;61977:13;62006:10;62002:52;;-1:-1:-1;;62033:9:0;;;;;;;;;-1:-1:-1;62033:9:0;;;61915:428::o;62002:52::-;62064:7;62086:62;62097:2;62093:1;:6;;;:23;;;;;62103:5;62109:1;62103:8;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;62103:13:0;;;62093:23;62086:62;;;62133:3;;;;:::i;:::-;;;;62086:62;;;62158:23;62194:1;62184:12;;-1:-1:-1;;;;;62184:12:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62184:12:0;;62158:38;;62216:1;62212:5;;62207:93;62223:2;62219:1;:6;;;:23;;;;;62229:5;62235:1;62229:8;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;62229:13:0;;;62219:23;62207:93;;;62280:5;62286:1;62280:8;;;;;;;;;:::i;:::-;;;;62264:10;62275:1;62264:13;;;;;;;;;;:::i;:::-;;;;:24;-1:-1:-1;;;;;62264:24:0;;;;;;;;-1:-1:-1;62244:3:0;;;;:::i;:::-;;;;62207:93;;31202:1024;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31312:7:0;;28172:1;31353:23;;:47;;;;;31387:13;;31380:4;:20;31353:47;31349:814;;;31417:31;31451:17;;;:11;:17;;;;;;;;;31417:51;;;;;;;;;-1:-1:-1;;;;;31417:51:0;;;;-1:-1:-1;;;31417:51:0;;-1:-1:-1;;;;;31417:51:0;;;;;;;;-1:-1:-1;;;31417:51:0;;;;;;;;;;;;;;31483:669;;31529:14;;-1:-1:-1;;;;;31529:28:0;;31525:93;;31589:9;31202:1024;-1:-1:-1;;;31202:1024:0:o;31525:93::-;-1:-1:-1;;;31936:6:0;31977:17;;;;:11;:17;;;;;;;;;31965:29;;;;;;;;;-1:-1:-1;;;;;31965:29:0;;;;;-1:-1:-1;;;31965:29:0;;-1:-1:-1;;;;;31965:29:0;;;;;;;;-1:-1:-1;;;31965:29:0;;;;;;;;;;;;;32021:28;32017:101;;32085:9;31202:1024;-1:-1:-1;;;31202:1024:0:o;32017:101::-;31900:237;;;31402:761;31349:814;32187:31;;-1:-1:-1;;;32187:31:0;;;;;;;;;;;33391:99;33441:13;33474:8;33467:15;;;;;:::i;62351:790::-;62407:11;;62446:14;62442:66;;-1:-1:-1;62485:3:0;62490:5;;-1:-1:-1;62351:790:0:o;62442:66::-;62544:13;;;62554:2;62544:13;;;;;;;;;62518:23;;62544:13;;;;;;;;;;-1:-1:-1;62544:13:0;62518:39;;62573:9;62568:507;62588:2;62584:1;:6;62568:507;;;62612:11;62626:9;62636:1;62626:12;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;;62657:9:0;;62653:411;;62687:5;;;62653:411;-1:-1:-1;;;;;;;;;62718:19:0;;;;;;:42;;-1:-1:-1;;;;;;;;;;62741:19:0;;;;62718:42;62714:350;;;62804:16;:11;;;;62818:2;62804:16;:::i;:::-;62797:24;;62781:10;62792:1;62781:13;;;;;;;;:::i;:::-;;;;:40;-1:-1:-1;;;;;62781:40:0;;;;;;;;;62714:350;;;-1:-1:-1;;;;;;;;;62848:19:0;;;;;;:42;;-1:-1:-1;;;;;;;;;;62871:19:0;;;;62848:42;62847:92;;;-1:-1:-1;;;;;;;;;;62896:19:0;;;;;;:42;;-1:-1:-1;;;;;;;;;;62919:19:0;;;;62896:42;62843:221;;;62976:9;62986:1;62976:12;;;;;;;:::i;:::-;;;;62960:10;62971:1;62960:13;;;;;;;;:::i;62843:221::-;-1:-1:-1;63037:3:0;;63042:5;;-1:-1:-1;62351:790:0;-1:-1:-1;;;62351:790:0:o;62843:221::-;-1:-1:-1;62592:3:0;;;;:::i;:::-;;;;62568:507;;;-1:-1:-1;63091:19:0;63099:10;63091:19;:::i;:::-;63085:25;63129:4;;-1:-1:-1;62351:790:0;-1:-1:-1;;;62351:790:0:o;56357:331::-;56527:4;56544:12;56586:6;56594:20;:9;:18;:20::i;:::-;56569:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56559:57;;;;;;56544:72;;56669:11;56634:31;56647:11;;56634:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56660:4:0;;-1:-1:-1;56634:12:0;;-1:-1:-1;;56634:31:0:i;:::-;:46;;56357:331;-1:-1:-1;;;;;;;56357:331:0:o;56025:324::-;28717:12;;28172:1;28701:13;56099:11;;28701:28;;-1:-1:-1;;28701:46:0;56163:17;;56179:1;56163:17;:::i;:::-;56204:12;;;56214:1;56204:12;;;;;;;;;56154:26;;-1:-1:-1;56191:33:0;;56197:2;;56201:1;;56204:12;56191:5;:33::i;:::-;56236:25;;;;:14;:25;;;;;;;;56263:23;;;:19;:23;;;;;56288:22;;;:14;:22;;;;;;56235:106;;;;;;;;;;;56315:6;56025:324;-1:-1:-1;56025:324:0:o;49761:248::-;49932:68;;;-1:-1:-1;;;;;24151:15:1;;;49932:68:0;;;24133:34:1;24203:15;;24183:18;;;24176:43;24235:18;;;;24228:34;;;49932:68:0;;;;;;;;;;24068:18:1;;;;49932:68:0;;;;;;;;-1:-1:-1;;;;;49932:68:0;-1:-1:-1;;;49932:68:0;;;49905:96;;49925:5;;49905:19;:96::i;44032:667::-;44216:72;;-1:-1:-1;;;44216:72:0;;44195:4;;-1:-1:-1;;;;;44216:36:0;;;;;:72;;719:10;;44267:4;;44273:7;;44282:5;;44216:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44216:72:0;;;;;;;;-1:-1:-1;;44216:72:0;;;;;;;;;;;;:::i;:::-;;;44212:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44450:13:0;;44446:235;;44496:40;;-1:-1:-1;;;44496:40:0;;;;;;;;;;;44446:235;44639:6;44633:13;44624:6;44620:2;44616:15;44609:38;44212:480;-1:-1:-1;;;;;;44335:55:0;-1:-1:-1;;;44335:55:0;;-1:-1:-1;44212:480:0;44032:667;;;;;;:::o;24391:721::-;24447:13;24666:10;24662:53;;-1:-1:-1;;24693:10:0;;;;;;;;;;;;-1:-1:-1;;;24693:10:0;;;;;24391:721::o;24662:53::-;24740:5;24725:12;24781:78;24788:9;;24781:78;;24814:8;;;;:::i;:::-;;-1:-1:-1;24837:10:0;;-1:-1:-1;24845:2:0;24837:10;;:::i;:::-;;;24781:78;;;24869:19;24901:6;-1:-1:-1;;;;;24891:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24891:17:0;;24869:39;;24919:154;24926:10;;24919:154;;24953:11;24963:1;24953:11;;:::i;:::-;;-1:-1:-1;25022:10:0;25030:2;25022:5;:10;:::i;:::-;25009:24;;:2;:24;:::i;:::-;24996:39;;24979:6;24986;24979:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24979:56:0;;;;;;;;-1:-1:-1;25050:11:0;25059:2;25050:11;;:::i;:::-;;;24919:154;;58397:590;-1:-1:-1;;;;;58583:22:0;;58557:23;58583:22;;;:16;:22;;;;;;58620:20;;58616:364;;58662:6;58657:312;58678:8;58674:1;:12;58657:312;;;58751:16;58766:1;58751:12;:16;:::i;:::-;58716:31;;;;:14;:31;;;;;;:51;58712:242;;;58797:57;58811:4;58817:16;58832:1;58817:12;:16;:::i;:::-;58835:15;58852:1;58797:57;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;58884:22:0;;;;;;:16;:22;;;;;58877:29;58929:5;;58712:242;58688:3;;;;:::i;:::-;;;;58657:312;;;;58546:441;58397:590;;;;:::o;56696:675::-;56779:7;56822:4;56779:7;56837:497;56861:5;:12;56857:1;:16;56837:497;;;56895:20;56918:5;56924:1;56918:8;;;;;;;;:::i;:::-;;;;;;;56895:31;;56961:12;56945;:28;56941:382;;57447:13;57497:15;;;57533:4;57526:15;;;57580:4;57564:21;;57073:57;;56941:382;;;57447:13;57497:15;;;57533:4;57526:15;;;57580:4;57564:21;;57250:57;;56941:382;-1:-1:-1;56875:3:0;;;;:::i;:::-;;;;56837:497;;;-1:-1:-1;57351:12:0;56696:675;-1:-1:-1;;;56696:675:0:o;37047:1709::-;37209:13;;-1:-1:-1;;;;;37237:16:0;;37233:48;;37262:19;;-1:-1:-1;;;37262:19:0;;;;;;;;;;;37233:48;37296:13;37292:44;;37318:18;;-1:-1:-1;;;37318:18:0;;;;;;;;;;;37292:44;37349:61;37379:1;37383:2;37387:12;37401:8;37349:21;:61::i;:::-;-1:-1:-1;;;;;37679:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;37734:49:0;;-1:-1:-1;;;;;37679:44:0;;;;;;;37734:49;;;;-1:-1:-1;;37679:44:0;;;;;;37734:49;;;;;;;;;;;;;;;;37796:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;37842:66:0;;;;-1:-1:-1;;;37892:15:0;37842:66;;;;;;;;;;37796:25;37981:23;;;38021:4;:23;;;;-1:-1:-1;;;;;;38029:13:0;;17377:20;17415:8;;38029:15;38017:615;;;38061:307;38088:38;;38113:12;;-1:-1:-1;;;;;38088:38:0;;;38105:1;;38088:38;;38105:1;;38088:38;38150:69;38189:1;38193:2;38197:14;;;;;;38213:5;38150:30;:69::i;:::-;38145:166;;38251:40;;-1:-1:-1;;;38251:40:0;;;;;;;;;;;38145:166;38363:3;38347:12;:19;;38061:307;;38441:12;38424:13;;:29;38420:43;;38455:8;;;38420:43;38017:615;;;38496:125;38523:40;;38548:14;;;;;-1:-1:-1;;;;;38523:40:0;;;38540:1;;38523:40;;38540:1;;38523:40;38616:3;38600:12;:19;;38496:125;;38017:615;-1:-1:-1;38642:13:0;:28;38688:60;35343:369;50400:716;50824:23;50850:69;50878:4;50850:69;;;;;;;;;;;;;;;;;50858:5;-1:-1:-1;;;;;50850:27:0;;;:69;;;;;:::i;:::-;50934:17;;50824:95;;-1:-1:-1;50934:21:0;50930:179;;51031:10;51020:30;;;;;;;;;;;;:::i;:::-;51012:85;;;;-1:-1:-1;;;51012:85:0;;25977:2:1;51012:85:0;;;25959:21:1;26016:2;25996:18;;;25989:30;26055:34;26035:18;;;26028:62;-1:-1:-1;;;26106:18:1;;;26099:40;26156:19;;51012:85:0;25775:406:1;19919:195:0;20022:12;20054:52;20076:6;20084:4;20090:1;20093:12;20022;17377:20;;21211:60;;;;-1:-1:-1;;;21211:60:0;;26795:2:1;21211:60:0;;;26777:21:1;26834:2;26814:18;;;26807:30;26873:31;26853:18;;;26846:59;26922:18;;21211:60:0;26593:353:1;21211:60:0;21343:12;21357:23;21384:6;-1:-1:-1;;;;;21384:11:0;21404:5;21411:4;21384:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21342:74;;;;21434:52;21452:7;21461:10;21473:12;21434:17;:52::i;:::-;21427:59;20967:527;-1:-1:-1;;;;;;;20967:527:0:o;23492:741::-;23608:12;23637:7;23633:593;;;-1:-1:-1;23668:10:0;23661:17;;23633:593;23782:17;;:21;23778:437;;24043:10;24037:17;24104:15;24091:10;24087:2;24083:19;24076:44;23778:437;24186:12;24179:20;;-1:-1:-1;;;24179:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:127::-;2253:10;2248:3;2244:20;2241:1;2234:31;2284:4;2281:1;2274:15;2308:4;2305:1;2298:15;2324:275;2395:2;2389:9;2460:2;2441:13;;-1:-1:-1;;2437:27:1;2425:40;;-1:-1:-1;;;;;2480:34:1;;2516:22;;;2477:62;2474:88;;;2542:18;;:::i;:::-;2578:2;2571:22;2324:275;;-1:-1:-1;2324:275:1:o;2604:407::-;2669:5;-1:-1:-1;;;;;2695:6:1;2692:30;2689:56;;;2725:18;;:::i;:::-;2763:57;2808:2;2787:15;;-1:-1:-1;;2783:29:1;2814:4;2779:40;2763:57;:::i;:::-;2754:66;;2843:6;2836:5;2829:21;2883:3;2874:6;2869:3;2865:16;2862:25;2859:45;;;2900:1;2897;2890:12;2859:45;2949:6;2944:3;2937:4;2930:5;2926:16;2913:43;3003:1;2996:4;2987:6;2980:5;2976:18;2972:29;2965:40;2604:407;;;;;:::o;3016:451::-;3085:6;3138:2;3126:9;3117:7;3113:23;3109:32;3106:52;;;3154:1;3151;3144:12;3106:52;3194:9;3181:23;-1:-1:-1;;;;;3219:6:1;3216:30;3213:50;;;3259:1;3256;3249:12;3213:50;3282:22;;3335:4;3327:13;;3323:27;-1:-1:-1;3313:55:1;;3364:1;3361;3354:12;3313:55;3387:74;3453:7;3448:2;3435:16;3430:2;3426;3422:11;3387:74;:::i;3877:456::-;3954:6;3962;3970;4023:2;4011:9;4002:7;3998:23;3994:32;3991:52;;;4039:1;4036;4029:12;3991:52;4078:9;4065:23;4097:31;4122:5;4097:31;:::i;:::-;4147:5;-1:-1:-1;4204:2:1;4189:18;;4176:32;4217:33;4176:32;4217:33;:::i;:::-;3877:456;;4269:7;;-1:-1:-1;;;4323:2:1;4308:18;;;;4295:32;;3877:456::o;4520:183::-;4580:4;-1:-1:-1;;;;;4605:6:1;4602:30;4599:56;;;4635:18;;:::i;:::-;-1:-1:-1;4680:1:1;4676:14;4692:4;4672:25;;4520:183::o;4708:891::-;4792:6;4823:2;4866;4854:9;4845:7;4841:23;4837:32;4834:52;;;4882:1;4879;4872:12;4834:52;4922:9;4909:23;-1:-1:-1;;;;;4947:6:1;4944:30;4941:50;;;4987:1;4984;4977:12;4941:50;5010:22;;5063:4;5055:13;;5051:27;-1:-1:-1;5041:55:1;;5092:1;5089;5082:12;5041:55;5128:2;5115:16;5151:60;5167:43;5207:2;5167:43;:::i;:::-;5151:60;:::i;:::-;5245:15;;;5327:1;5323:10;;;;5315:19;;5311:28;;;5276:12;;;;5351:19;;;5348:39;;;5383:1;5380;5373:12;5348:39;5407:11;;;;5427:142;5443:6;5438:3;5435:15;5427:142;;;5509:17;;5497:30;;5460:12;;;;5547;;;;5427:142;;5604:1244;5808:4;5837:2;5877;5866:9;5862:18;5907:2;5896:9;5889:21;5930:6;5965;5959:13;5996:6;5988;5981:22;6022:2;6012:12;;6055:2;6044:9;6040:18;6033:25;;6117:2;6107:6;6104:1;6100:14;6089:9;6085:30;6081:39;6155:2;6147:6;6143:15;6176:1;6186:633;6200:6;6197:1;6194:13;6186:633;;;6293:2;6289:7;6277:9;6269:6;6265:22;6261:36;6256:3;6249:49;6327:6;6321:13;6357:4;6395:2;6389:9;6381:6;6374:25;6446:2;6442;6438:11;6432:18;6487:2;6482;6474:6;6470:15;6463:27;6517:48;6561:2;6553:6;6549:15;6535:12;6517:48;:::i;:::-;6503:62;;;6614:2;6610;6606:11;6600:18;6578:40;;6667:6;6659;6655:19;6650:2;6642:6;6638:15;6631:44;6698:41;6732:6;6716:14;6698:41;:::i;:::-;6797:12;;;;6688:51;-1:-1:-1;;;6762:15:1;;;;6222:1;6215:9;6186:633;;;-1:-1:-1;6836:6:1;;5604:1244;-1:-1:-1;;;;;;;;5604:1244:1:o;7038:247::-;7097:6;7150:2;7138:9;7129:7;7125:23;7121:32;7118:52;;;7166:1;7163;7156:12;7118:52;7205:9;7192:23;7224:31;7249:5;7224:31;:::i;7514:118::-;7600:5;7593:13;7586:21;7579:5;7576:32;7566:60;;7622:1;7619;7612:12;7637:241;7693:6;7746:2;7734:9;7725:7;7721:23;7717:32;7714:52;;;7762:1;7759;7752:12;7714:52;7801:9;7788:23;7820:28;7842:5;7820:28;:::i;7883:156::-;7949:20;;8009:4;7998:16;;7988:27;;7978:55;;8029:1;8026;8019:12;7978:55;7883:156;;;:::o;8044:910::-;8154:6;8162;8170;8178;8186;8239:3;8227:9;8218:7;8214:23;8210:33;8207:53;;;8256:1;8253;8246:12;8207:53;8292:9;8279:23;8269:33;;8353:2;8342:9;8338:18;8325:32;-1:-1:-1;;;;;8417:2:1;8409:6;8406:14;8403:34;;;8433:1;8430;8423:12;8403:34;8471:6;8460:9;8456:22;8446:32;;8516:7;8509:4;8505:2;8501:13;8497:27;8487:55;;8538:1;8535;8528:12;8487:55;8578:2;8565:16;8604:2;8596:6;8593:14;8590:34;;;8620:1;8617;8610:12;8590:34;8673:7;8668:2;8658:6;8655:1;8651:14;8647:2;8643:23;8639:32;8636:45;8633:65;;;8694:1;8691;8684:12;8633:65;8725:2;8721;8717:11;8707:21;;8747:6;8737:16;;;8803:2;8792:9;8788:18;8775:32;8762:45;;8847:2;8840:5;8836:14;8829:5;8826:25;8816:53;;8865:1;8862;8855:12;8816:53;-1:-1:-1;8888:5:1;-1:-1:-1;8912:36:1;8944:2;8929:18;;8912:36;:::i;:::-;8902:46;;8044:910;;;;;;;;:::o;9219:382::-;9284:6;9292;9345:2;9333:9;9324:7;9320:23;9316:32;9313:52;;;9361:1;9358;9351:12;9313:52;9400:9;9387:23;9419:31;9444:5;9419:31;:::i;:::-;9469:5;-1:-1:-1;9526:2:1;9511:18;;9498:32;9539:30;9498:32;9539:30;:::i;:::-;9588:7;9578:17;;;9219:382;;;;;:::o;9606:795::-;9701:6;9709;9717;9725;9778:3;9766:9;9757:7;9753:23;9749:33;9746:53;;;9795:1;9792;9785:12;9746:53;9834:9;9821:23;9853:31;9878:5;9853:31;:::i;:::-;9903:5;-1:-1:-1;9960:2:1;9945:18;;9932:32;9973:33;9932:32;9973:33;:::i;:::-;10025:7;-1:-1:-1;10079:2:1;10064:18;;10051:32;;-1:-1:-1;10134:2:1;10119:18;;10106:32;-1:-1:-1;;;;;10150:30:1;;10147:50;;;10193:1;10190;10183:12;10147:50;10216:22;;10269:4;10261:13;;10257:27;-1:-1:-1;10247:55:1;;10298:1;10295;10288:12;10247:55;10321:74;10387:7;10382:2;10369:16;10364:2;10360;10356:11;10321:74;:::i;:::-;10311:84;;;9606:795;;;;;;;:::o;10406:966::-;10490:6;10521:2;10564;10552:9;10543:7;10539:23;10535:32;10532:52;;;10580:1;10577;10570:12;10532:52;10620:9;10607:23;-1:-1:-1;;;;;10645:6:1;10642:30;10639:50;;;10685:1;10682;10675:12;10639:50;10708:22;;10761:4;10753:13;;10749:27;-1:-1:-1;10739:55:1;;10790:1;10787;10780:12;10739:55;10826:2;10813:16;10849:60;10865:43;10905:2;10865:43;:::i;10849:60::-;10943:15;;;11025:1;11021:10;;;;11013:19;;11009:28;;;10974:12;;;;11049:19;;;11046:39;;;11081:1;11078;11071:12;11046:39;11105:11;;;;11125:217;11141:6;11136:3;11133:15;11125:217;;;11221:3;11208:17;11238:31;11263:5;11238:31;:::i;:::-;11282:18;;11158:12;;;;11320;;;;11125:217;;11377:586;-1:-1:-1;;;;;11612:31:1;;11594:50;;11581:3;11566:19;;11663:2;11685:18;;;11745:6;11539:4;11779:178;11793:4;11790:1;11787:11;11779:178;;;11856:13;;11871:4;11852:24;11840:37;;11897:12;;;;11932:15;;;;11813:1;11806:9;11779:178;;;11783:3;;;;11377:586;;;;;:::o;11968:921::-;12145:2;12134:9;12127:21;12108:4;12183:6;12177:13;12226:4;12221:2;12210:9;12206:18;12199:32;12254:52;12301:3;12290:9;12286:19;12272:12;12254:52;:::i;:::-;12240:66;;12355:2;12347:6;12343:15;12337:22;12382:2;12378:7;12449:2;12437:9;12429:6;12425:22;12421:31;12416:2;12405:9;12401:18;12394:59;12476:41;12510:6;12494:14;12476:41;:::i;:::-;12462:55;;12566:2;12558:6;12554:15;12548:22;12526:44;;12634:2;12622:9;12614:6;12610:22;12606:31;12601:2;12590:9;12586:18;12579:59;12661:41;12695:6;12679:14;12661:41;:::i;:::-;12647:55;;12751:2;12743:6;12739:15;12733:22;12711:44;;12821:2;12809:9;12801:6;12797:22;12793:31;12786:4;12775:9;12771:20;12764:61;;12842:41;12876:6;12860:14;12842:41;:::i;:::-;12834:49;11968:921;-1:-1:-1;;;;;11968:921:1:o;12894:388::-;12962:6;12970;13023:2;13011:9;13002:7;12998:23;12994:32;12991:52;;;13039:1;13036;13029:12;12991:52;13078:9;13065:23;13097:31;13122:5;13097:31;:::i;:::-;13147:5;-1:-1:-1;13204:2:1;13189:18;;13176:32;13217:33;13176:32;13217:33;:::i;13287:380::-;13366:1;13362:12;;;;13409;;;13430:61;;13484:4;13476:6;13472:17;13462:27;;13430:61;13537:2;13529:6;13526:14;13506:18;13503:38;13500:161;;;13583:10;13578:3;13574:20;13571:1;13564:31;13618:4;13615:1;13608:15;13646:4;13643:1;13636:15;13672:340;13874:2;13856:21;;;13913:2;13893:18;;;13886:30;-1:-1:-1;;;13947:2:1;13932:18;;13925:46;14003:2;13988:18;;13672:340::o;14690:425::-;-1:-1:-1;;;;;14947:32:1;;;;14929:51;;15011:2;14996:18;;14989:34;;;;15054:2;15039:18;;15032:34;15097:2;15082:18;;15075:34;14916:3;14901:19;;14690:425::o;15120:356::-;15322:2;15304:21;;;15341:18;;;15334:30;15400:34;15395:2;15380:18;;15373:62;15467:2;15452:18;;15120:356::o;15481:127::-;15542:10;15537:3;15533:20;15530:1;15523:31;15573:4;15570:1;15563:15;15597:4;15594:1;15587:15;15613:127;15674:10;15669:3;15665:20;15662:1;15655:31;15705:4;15702:1;15695:15;15729:4;15726:1;15719:15;15745:135;15784:3;-1:-1:-1;;15805:17:1;;15802:43;;;15825:18;;:::i;:::-;-1:-1:-1;15872:1:1;15861:13;;15745:135::o;18607:236::-;18646:3;-1:-1:-1;;;;;18719:2:1;18716:1;18712:10;18749:2;18746:1;18742:10;18780:3;18776:2;18772:12;18767:3;18764:21;18761:47;;;18788:18;;:::i;:::-;18824:13;;18607:236;-1:-1:-1;;;;18607:236:1:o;19700:422::-;19789:1;19832:5;19789:1;19846:270;19867:7;19857:8;19854:21;19846:270;;;19926:4;19922:1;19918:6;19914:17;19908:4;19905:27;19902:53;;;19935:18;;:::i;:::-;19985:7;19975:8;19971:22;19968:55;;;20005:16;;;;19968:55;20084:22;;;;20044:15;;;;19846:270;;;19850:3;19700:422;;;;;:::o;20127:806::-;20176:5;20206:8;20196:80;;-1:-1:-1;20247:1:1;20261:5;;20196:80;20295:4;20285:76;;-1:-1:-1;20332:1:1;20346:5;;20285:76;20377:4;20395:1;20390:59;;;;20463:1;20458:130;;;;20370:218;;20390:59;20420:1;20411:10;;20434:5;;;20458:130;20495:3;20485:8;20482:17;20479:43;;;20502:18;;:::i;:::-;-1:-1:-1;;20558:1:1;20544:16;;20573:5;;20370:218;;20672:2;20662:8;20659:16;20653:3;20647:4;20644:13;20640:36;20634:2;20624:8;20621:16;20616:2;20610:4;20607:12;20603:35;20600:77;20597:159;;;-1:-1:-1;20709:19:1;;;20741:5;;20597:159;20788:34;20813:8;20807:4;20788:34;:::i;:::-;20858:6;20854:1;20850:6;20846:19;20837:7;20834:32;20831:58;;;20869:18;;:::i;:::-;20907:20;;20127:806;-1:-1:-1;;;20127:806:1:o;20938:131::-;20998:5;21027:36;21054:8;21048:4;21027:36;:::i;21074:470::-;21253:3;21291:6;21285:13;21307:53;21353:6;21348:3;21341:4;21333:6;21329:17;21307:53;:::i;:::-;21423:13;;21382:16;;;;21445:57;21423:13;21382:16;21479:4;21467:17;;21445:57;:::i;22667:175::-;22704:3;22748:4;22741:5;22737:16;22777:4;22768:7;22765:17;22762:43;;;22785:18;;:::i;:::-;22834:1;22821:15;;22667:175;-1:-1:-1;;22667:175:1:o;22847:204::-;22885:3;22921:4;22918:1;22914:12;22953:4;22950:1;22946:12;22988:3;22982:4;22978:14;22973:3;22970:23;22967:49;;;22996:18;;:::i;:::-;23032:13;;22847:204;-1:-1:-1;;;22847:204:1:o;23056:297::-;23174:12;;23221:4;23210:16;;;23204:23;;23174:12;23239:16;;23236:111;;;-1:-1:-1;;23313:4:1;23309:17;;;;23306:1;23302:25;23298:38;23287:50;;23056:297;-1:-1:-1;23056:297:1:o;23358:397::-;23572:26;23568:31;23559:6;23555:2;23551:15;23547:53;23542:3;23535:66;23517:3;23630:6;23624:13;23646:62;23701:6;23696:2;23691:3;23687:12;23680:4;23672:6;23668:17;23646:62;:::i;:::-;23728:16;;;;23746:2;23724:25;;23358:397;-1:-1:-1;;;23358:397:1:o;23760:128::-;23800:3;23831:1;23827:6;23824:1;23821:13;23818:39;;;23837:18;;:::i;:::-;-1:-1:-1;23873:9:1;;23760:128::o;24273:489::-;-1:-1:-1;;;;;24542:15:1;;;24524:34;;24594:15;;24589:2;24574:18;;24567:43;24641:2;24626:18;;24619:34;;;24689:3;24684:2;24669:18;;24662:31;;;24467:4;;24710:46;;24736:19;;24728:6;24710:46;:::i;:::-;24702:54;24273:489;-1:-1:-1;;;;;;24273:489:1:o;24767:249::-;24836:6;24889:2;24877:9;24868:7;24864:23;24860:32;24857:52;;;24905:1;24902;24895:12;24857:52;24937:9;24931:16;24956:30;24980:5;24956:30;:::i;25021:127::-;25082:10;25077:3;25073:20;25070:1;25063:31;25113:4;25110:1;25103:15;25137:4;25134:1;25127:15;25153:120;25193:1;25219;25209:35;;25224:18;;:::i;:::-;-1:-1:-1;25258:9:1;;25153:120::o;25278:125::-;25318:4;25346:1;25343;25340:8;25337:34;;;25351:18;;:::i;:::-;-1:-1:-1;25388:9:1;;25278:125::o;25408:112::-;25440:1;25466;25456:35;;25471:18;;:::i;:::-;-1:-1:-1;25505:9:1;;25408:112::o;25525:245::-;25592:6;25645:2;25633:9;25624:7;25620:23;25616:32;25613:52;;;25661:1;25658;25651:12;25613:52;25693:9;25687:16;25712:28;25734:5;25712:28;:::i;26951:274::-;27080:3;27118:6;27112:13;27134:53;27180:6;27175:3;27168:4;27160:6;27156:17;27134:53;:::i;:::-;27203:16;;;;;26951:274;-1:-1:-1;;26951:274:1:o

Swarm Source

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