POL Price: $0.623884 (-1.68%)
 

Overview

Max Total Supply

24,044 MEEBMASTER

Holders

6,740

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Circle: USDC.e Token
Balance
1 MEEBMASTER
0x2791bca1f2de4661ed88a30c99a7a9449aa84174
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
MeebMasterNFT

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-22
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IMeebMasterNFT is IERC721 {
    function getStats(uint256 tokenId)
        external
        view
        returns (
            uint16[] memory pvpStats,
            uint16 luckStat,
            uint16 productivityStat,
            uint256 otherStats
        );

    function totalBurned() external view returns (uint256);

    function exists(uint256 tokenId) external view returns (bool);

    function lockedBy(uint256 tokenId) external view returns (address);

    function lock(uint256 tokenId, address locker) external;

    function unlock(uint256 tokenId) external;

    function burn(uint256 tokenId) external;
}

interface IMeebMasterStats {
    struct MeebInfo {
        uint8 id;
        string Name;
        string Attribute;
        uint8 Level;
        string Passive;
    }

    struct MeebPurity {
        uint8 id;
        string Name;
        uint8 Star;
    }

    struct MeebBody {
        uint16 HP;
        uint16 Atk;
        uint16 S_Atk;
        uint16 Energy;
        uint16 Crit;
        uint16 Crit_Dmg;
        uint16 Speed;
        uint16 AFK_Stat;
        uint16 Luck;
        uint16 Productivity;
    }

    /**
     * @dev Returns game info.
     */
    function info()
        external
        view
        returns (
            uint256 totalSupply,
            uint256 totalBurned,
            uint256 totalFusion,
            uint256[] memory otherInfo
        );

    /**
     * @dev Returns MeebMaster stats from the token ID
     */
    function stats(uint256 tokenId)
        external
        view
        returns (
            uint16[] memory pvpStats,
            uint16 luckStat,
            uint16 productivityStat,
            uint256 otherStats
        );

    /**
     * @dev Returns MeebMaster card details from the token ID
     */
    function details(uint256 tokenId)
        external
        view
        returns (
            MeebInfo[] memory info,
            MeebPurity memory purity,
            MeebBody memory body
        );

    /**
     * @dev Returns expected price (in MEEB) from the token ID
     */
    function expectedPrice(uint256 tokenId) external view returns (uint256);

    function setInfo(uint256 tokenId, MeebInfo[] memory newInfo) external;

    function setPurity(uint256 tokenId, MeebPurity memory newPurity) external;

    function setBody(uint256 tokenId, MeebBody memory newBody) external;

    function setDetails(
        uint256 tokenId,
        MeebInfo[] memory newInfo,
        MeebPurity memory newPurity,
        MeebBody memory newBody
    ) external;
}

interface IERC721Locker {
    function unlock(uint256 tokenId) external;

    function onERC721Locked(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);

    function onERC721Unlocked(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 * add admin user.
 * rewrite ownerOf(uint256) token not mint yet will belong to admin user by default.
 * rewrite tokenURI(uint256) always return _baseURI() + tokenId; metadata sever will handle no-mint token.
 * rewrite balanceOf(address), if is admin, return 999999999.
 * rewrite transferFrom&safeTransferFrom, no-mint token will _mint before transfer, only admin user.
 */
contract BRC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    address private _admin;

    mapping(address => bool) _minters;

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

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

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

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

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

    modifier onlyAdmin() {
        require(msg.sender == _admin, "restrict to admin");
        _;
    }

    modifier onlyMinter() {
        require(_minters[msg.sender], "restrict to minter");
        _;
    }

    /**
     * @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}.
     * return magic balance value if is admin user
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     * return admin user address is not mint yet.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        if (owner == address(0)) {
            return _admin;
        }
        return owner;
    }

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

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

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

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

    /**
     * return admin user;
     */
    function admin() public view virtual returns (address) {
        return _admin;
    }

    /**
     * return if the account has minter right;
     */
    function isMinter(address account) public view virtual returns (bool) {
        return _minters[account];
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     * if msg.sender is admin, mint before transfer
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _mintIfNotExist(tokenId);
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     * if msg.sender is admin, mint before transfer
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _mintIfNotExist(tokenId);
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = _owners[tokenId];

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

        // Clear approvals
        _approve(address(0), tokenId);

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /*
     * mint if msg.sender is admin && tokenId not mint.
     */
    function _mintIfNotExist(uint256 tokenId) private {
        if (_minters[msg.sender] || msg.sender == _admin) {
            if (!_exists(tokenId)) {
                _mint(msg.sender, tokenId);
            }
        }
    }

    function mint(address to, uint256 tokenId) external onlyMinter {
        _mint(to, tokenId);
    }

    function safeMint(address to, uint256 tokenId) external onlyMinter {
        _safeMint(to, tokenId);
    }

    function changeAdmin(address newAdmin) external onlyAdmin {
        _admin = newAdmin;
    }

    function setMinterStatus(address account, bool _isMinter) external onlyAdmin {
        _minters[account] = _isMinter;
    }

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

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

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

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

abstract contract BRC721Enumerable is BRC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    bool private _paused;

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

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

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

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

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

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

contract BNFT is BRC721Enumerable, Pausable {
    using Strings for uint256;

    string private baseURI;

    constructor(
        address admin_,
        string memory baseURI_,
        string memory name_,
        string memory symbol_
    ) BRC721(admin_, name_, symbol_) {
        baseURI = string(abi.encodePacked(baseURI_, symbol_, "/"));
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    /**
     * override tokenURI(uint256), remove restrict for tokenId exist.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }

    function setPause() external onlyAdmin {
        _pause();
    }

    function unsetPause() external onlyAdmin {
        _unpause();
    }

    function changeBaseURI(string memory newBaseURI) external onlyAdmin {
        string memory symbol_ = symbol();
        baseURI = string(abi.encodePacked(newBaseURI, symbol_, "/"));
    }

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "BRC721Pausable: token transfer while paused");
    }
}

contract MeebMasterNFT is BNFT, IMeebMasterNFT, ReentrancyGuard {
    using Address for address;

    uint256 private _totalBurned;

    // Mapping from token ID to locker address
    mapping(uint256 => address) private _lockedBy;

    address private _meebStats;

    constructor() BNFT(_msgSender(), "https://nftstatic.meebmaster.com/static/nft/POLYGON/", "MeebMaster.com NFT", "MEEBMASTER") {}

    function setMeebStats(address newMeebStats) external onlyAdmin {
        _meebStats = newMeebStats;
    }

    /* ========== VIEW FUNCTIONS ========== */

    function totalBurned() external view override returns (uint256) {
        return _totalBurned;
    }

    function getStats(uint256 tokenId)
        external
        view
        override
        returns (
            uint16[] memory pvpStats,
            uint16 luckStat,
            uint16 productivityStat,
            uint256 otherStats
        )
    {
        if (_meebStats != address(0)) {
            (pvpStats, luckStat, productivityStat, otherStats) = IMeebMasterStats(_meebStats).stats(tokenId);
        }
    }

    function exists(uint256 tokenId) external view virtual override returns (bool) {
        return _exists(tokenId);
    }

    function lockedBy(uint256 tokenId) external view override returns (address) {
        return _lockedBy[tokenId];
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    function lock(uint256 tokenId, address locker) external override nonReentrant {
        require(_lockedBy[tokenId] == address(0), "MeebMasterNFT: already locked");

        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _lockedBy[tokenId] = locker;
        require(_checkOnERC721Locked(ownerOf(tokenId), locker, tokenId, ""), "MeebMasterNFT: lock failed");
    }

    function unlock(uint256 tokenId) external override {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address _locker = _lockedBy[tokenId];
        //solhint-disable-next-line max-line-length
        require(_locker == _msgSender() || admin() == _msgSender(), "MeebMasterNFT: caller is not locker nor admin");
        require(_checkOnERC721Unlocked(ownerOf(tokenId), _locker, tokenId, ""), "MeebMasterNFT: unlock failed");

        delete _lockedBy[tokenId];
    }

    /**
     * @dev Internal function to invoke {IERC721Locker-onERC721Locked} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the owner of the given token ID
     * @param locker target address that will lock 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 _checkOnERC721Locked(
        address from,
        address locker,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (locker.isContract()) {
            try IERC721Locker(locker).onERC721Locked(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Locker(locker).onERC721Locked.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("MeebMasterNFT: lock by non ERC721Locker implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Locker-onERC721Unlocked} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the owner of the given token ID
     * @param locker target address that will lock 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 _checkOnERC721Unlocked(
        address from,
        address locker,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (locker.isContract()) {
            try IERC721Locker(locker).onERC721Unlocked(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Locker(locker).onERC721Unlocked.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("MeebMasterNFT: unlock from a non ERC721Locker implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override nonReentrant {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
        _totalBurned++;
    }

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the token is not locked or the target (to) is the locker
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (_lockedBy[tokenId] != to) {
            require(_lockedBy[tokenId] == address(0), "MeebMasterNFT: token transfer while locked");
        } else {
            delete _lockedBy[tokenId];
        }
    }

    /* ========== EMERGENCY ========== */

    function rescueStuckErc20(address _token) external onlyAdmin {
        IERC20(_token).transfer(admin(), IERC20(_token).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStats","outputs":[{"internalType":"uint16[]","name":"pvpStats","type":"uint16[]"},{"internalType":"uint16","name":"luckStat","type":"uint16"},{"internalType":"uint16","name":"productivityStat","type":"uint16"},{"internalType":"uint256","name":"otherStats","type":"uint256"}],"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":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"locker","type":"address"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lockedBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueStuckErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","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":"address","name":"newMeebStats","type":"address"}],"name":"setMeebStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_isMinter","type":"bool"}],"name":"setMinterStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unsetPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5033604051806060016040528060348152602001620040f46034913960408051808201825260128152711359595893585cdd195c8b98dbdb4813919560721b60208083019182528351808501909452600a84526926a2a2a126a0a9aa22a960b11b90840152600280546001600160a01b0319166001600160a01b0387161790558151919291859184918491620000ab91600091906200011b565b508051620000c19060019060208401906200011b565b5050600c805460ff191690555050604051620000e49084908390602001620001ff565b604051602081830303815290604052600d90805190602001906200010a9291906200011b565b50506001600e555062000267915050565b82805462000129906200022a565b90600052602060002090601f0160209004810192826200014d576000855562000198565b82601f106200016857805160ff191683800117855562000198565b8280016001018555821562000198579182015b82811115620001985782518255916020019190600101906200017b565b50620001a6929150620001aa565b5090565b5b80821115620001a65760008155600101620001ab565b6000815160005b81811015620001e45760208185018101518683015201620001c8565b81811115620001f4576000828601525b509290920192915050565b600062000218620002118386620001c1565b84620001c1565b602f60f81b8152600101949350505050565b600181811c908216806200023f57607f821691505b602082108114156200026157634e487b7160e01b600052602260045260246000fd5b50919050565b613e7d80620002776000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c806366dfbfb411610145578063b5d56a41116100bd578063d89135cd1161008c578063e985e9c511610071578063e985e9c514610508578063f00c298d14610551578063f851a4401461056457600080fd5b8063d89135cd146104ca578063e1e77855146104d257600080fd5b8063b5d56a4114610489578063b88d4fde1461049c578063c87b56dd146104af578063d431b1ac146104c257600080fd5b80638f28397011610114578063a1448194116100f9578063a14481941461042a578063a22cb4651461043d578063aa271e1a1461045057600080fd5b80638f2839701461040f57806395d89b411461042257600080fd5b806366dfbfb4146103b357806370a08231146103c65780637b303965146103d957806381ca7eba146103fc57600080fd5b806340c10f19116101d85780634f6ccce7116101a75780635c975abb1161018c5780635c975abb146103825780636198e3391461038d5780636352211e146103a057600080fd5b80634f6ccce7146103675780634f8421431461037a57600080fd5b806340c10f191461031b57806342842e0e1461032e57806342966c68146103415780634f558e791461035457600080fd5b806318160ddd1161021457806318160ddd146102d057806323b872dd146102e25780632f745c59146102f557806339a0c6f91461030857600080fd5b806301ffc9a71461024657806306fdde031461026e578063081812fc14610283578063095ea7b3146102bb575b600080fd5b610259610254366004613892565b610582565b60405190151581526020015b60405180910390f35b6102766105de565b6040516102659190613bae565b610296610291366004613915565b610670565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102ce6102c936600461376d565b61074f565b005b600a545b604051908152602001610265565b6102ce6102f036600461367e565b6108dc565b6102d461030336600461376d565b610987565b6102ce6103163660046138cc565b610a56565b6102ce61032936600461376d565b610b1a565b6102ce61033c36600461367e565b610ba1565b6102ce61034f366004613915565b610bbc565b610259610362366004613915565b610ce9565b6102d4610375366004613915565b610d15565b6102ce610dd3565b600c5460ff16610259565b6102ce61039b366004613915565b610e5e565b6102966103ae366004613915565b6110a5565b6102ce6103c1366004613947565b6110ef565b6102d46103d4366004613629565b611362565b6103ec6103e7366004613915565b611430565b6040516102659493929190613b4e565b6102ce61040a366004613629565b61152e565b6102ce61041d366004613629565b61172a565b6102766117f2565b6102ce61043836600461376d565b611801565b6102ce61044b366004613736565b611884565b61025961045e366004613629565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b6102ce610497366004613629565b61199b565b6102ce6104aa3660046136ba565b611a63565b6102766104bd366004613915565b611b13565b6102ce611b47565b600f546102d4565b6102966104e0366004613915565b60009081526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61025961051636600461364b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102ce61055f366004613736565b611bd0565b60025473ffffffffffffffffffffffffffffffffffffffff16610296565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806105d857506105d882611ca7565b92915050565b6060600080546105ed90613c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461061990613c7f565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061075a826110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161071d565b3373ffffffffffffffffffffffffffffffffffffffff8216148061084157506108418133610516565b6108cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071d565b6108d78383611d8a565b505050565b6108e581611e2a565b6108f0335b82611e9a565b61097c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b6108d783838361200a565b600061099283611362565b8210610a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b60025473ffffffffffffffffffffffffffffffffffffffff163314610ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b6000610ae16117f2565b90508181604051602001610af69291906139d0565b604051602081830303815290604052600d90805190602001906108d79291906134df565b3360009081526003602052604090205460ff16610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d828261227c565b5050565b6108d783838360405180602001604052806000815250611a63565b6002600e541415610c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e55610c37336108ea565b610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000606482015260840161071d565b610ccc816124b4565b600f8054906000610cdc83613cd3565b90915550506001600e5550565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff1615156105d8565b6000610d20600a5490565b8210610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161071d565b600a8281548110610dc157610dc1613dad565b90600052602060002001549050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612657565b565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16610f0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610f59575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610fe5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d6565624d61737465724e46543a2063616c6c6572206973206e6f74206c6f6360448201527f6b6572206e6f722061646d696e00000000000000000000000000000000000000606482015260840161071d565b611008610ff1836110a5565b828460405180602001604052806000815250612738565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d6565624d61737465724e46543a20756e6c6f636b206661696c656400000000604482015260640161071d565b50600090815260106020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105d857505060025473ffffffffffffffffffffffffffffffffffffffff16919050565b6002600e54141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e5560008281526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156111ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d6565624d61737465724e46543a20616c7265616479206c6f636b6564000000604482015260640161071d565b6111f8335b83611e9a565b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b600082815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556112f36112dc836110a5565b828460405180602001604052806000815250612937565b611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d6565624d61737465724e46543a206c6f636b206661696c6564000000000000604482015260640161071d565b50506001600e55565b600073ffffffffffffffffffffffffffffffffffffffff8216611407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b6011546060906000908190819073ffffffffffffffffffffffffffffffffffffffff1615611527576011546040517fad217ae50000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff9091169063ad217ae59060240160006040518083038186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261151c9190810190613797565b929650909450925090505b9193509193565b60025473ffffffffffffffffffffffffffffffffffffffff1633146115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115ea60025473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611687919061392e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9d9190613875565b60025473ffffffffffffffffffffffffffffffffffffffff1633146117ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6060600180546105ed90613c7f565b3360009081526003602052604090205460ff1661187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d8282612b23565b73ffffffffffffffffffffffffffffffffffffffff8216331415611904576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071d565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611a1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611a6c82611e2a565b611a75336111f2565b611b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b611b0d84848484612b3d565b50505050565b6060600d611b2083612be0565b604051602001611b31929190613a27565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611bc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612d12565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611d3a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105d857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146105d8565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611de4826110a5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3360009081526003602052604090205460ff1680611e5f575060025473ffffffffffffffffffffffffffffffffffffffff1633145b15611e975760008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16611e9757611e97338261227c565b50565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16611f4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b6000611f56836110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc557508373ffffffffffffffffffffffffffffffffffffffff16611fad84610670565b73ffffffffffffffffffffffffffffffffffffffff16145b80612002575073ffffffffffffffffffffffffffffffffffffffff80821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661202a826110a5565b73ffffffffffffffffffffffffffffffffffffffff16146120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff821661216f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161071d565b61217a838383612dd2565b612185600082611d8a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604081208054600192906121bb908490613c3c565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604081208054600192906121f6908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff82166122f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071d565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161071d565b600081116123ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4552433732313a207a65726f2069640000000000000000000000000000000000604482015260640161071d565b6123fb60008383612dd2565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805460019290612431908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff169061259790829084612dd2565b6125a2600083611d8a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081208054600192906125d8908490613c3c565b909155505060008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600c5460ff166126c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f8aed3f9c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690638aed3f9c906127af903390899088908890600401613b05565b602060405180830381600087803b1580156127c957600080fd5b505af1925050508015612817575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612814918101906138af565b60015b6128e1573d808015612845576040519150601f19603f3d011682016040523d82523d6000602084013e61284a565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d6565624d61737465724e46543a20756e6c6f636b2066726f6d2061206e6f6e60448201527f204552433732314c6f636b657220696d706c656d656e74657200000000000000606482015260840161071d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f8aed3f9c00000000000000000000000000000000000000000000000000000000149050612002565b506001949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f9f2c9fd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690639f2c9fd5906129ae903390899088908890600401613b05565b602060405180830381600087803b1580156129c857600080fd5b505af1925050508015612a16575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612a13918101906138af565b60015b612ad8573d808015612a44576040519150601f19603f3d011682016040523d82523d6000602084013e612a49565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d6565624d61737465724e46543a206c6f636b206279206e6f6e20455243373260448201527f314c6f636b657220696d706c656d656e74657200000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f9f2c9fd500000000000000000000000000000000000000000000000000000000149050612002565b610b9d828260405180602001604052806000815250612ef5565b612b4884848461200a565b612b5484848484612f98565b611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b606081612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613cd3565b9150612c439050600a83613c28565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613ddc565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b841561200257612ca4600183613c3c565b9150612cb1600a86613d0c565b612cbc906030613c10565b60f81b818381518110612cd157612cd1613dad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613c28565b9450612c93565b600c5460ff1615612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861270e3390565b612ddd838383613184565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff838116911614612ebd5760008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4d6565624d61737465724e46543a20746f6b656e207472616e7366657220776860448201527f696c65206c6f636b656400000000000000000000000000000000000000000000606482015260840161071d565b600090815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b612eff838361227c565b612f0c6000848484612f98565b6108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061300f903390899088908890600401613b05565b602060405180830381600087803b15801561302957600080fd5b505af1925050508015613077575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613074918101906138af565b60015b613139573d8080156130a5576040519150601f19603f3d011682016040523d82523d6000602084013e6130aa565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612002565b61318f838383613222565b600c5460ff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4252433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c6520706175736564000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff831661328a5761328581600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6132c7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132c7576132c78382613328565b73ffffffffffffffffffffffffffffffffffffffff82166132eb576108d7816133df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146108d7576108d7828261348e565b6000600161333584611362565b61333f9190613c3c565b60008381526009602052604090205490915080821461339f5773ffffffffffffffffffffffffffffffffffffffff841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b50600091825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a546000906133f190600190613c3c565b6000838152600b6020526040812054600a805493945090928490811061341957613419613dad565b9060005260206000200154905080600a838154811061343a5761343a613dad565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061347257613472613d7e565b6001900381819060005260206000200160009055905550505050565b600061349983611362565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8280546134eb90613c7f565b90600052602060002090601f01602090048101928261350d5760008555613553565b82601f1061352657805160ff1916838001178555613553565b82800160010185558215613553579182015b82811115613553578251825591602001919060010190613538565b5061355f929150613563565b5090565b5b8082111561355f5760008155600101613564565b600067ffffffffffffffff83111561359257613592613ddc565b6135c360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613bc1565b90508281528383830111156135d757600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461361257600080fd5b919050565b805161ffff8116811461361257600080fd5b60006020828403121561363b57600080fd5b613644826135ee565b9392505050565b6000806040838503121561365e57600080fd5b613667836135ee565b9150613675602084016135ee565b90509250929050565b60008060006060848603121561369357600080fd5b61369c846135ee565b92506136aa602085016135ee565b9150604084013590509250925092565b600080600080608085870312156136d057600080fd5b6136d9856135ee565b93506136e7602086016135ee565b925060408501359150606085013567ffffffffffffffff81111561370a57600080fd5b8501601f8101871361371b57600080fd5b61372a87823560208401613578565b91505092959194509250565b6000806040838503121561374957600080fd5b613752836135ee565b9150602083013561376281613e0b565b809150509250929050565b6000806040838503121561378057600080fd5b613789836135ee565b946020939093013593505050565b600080600080608085870312156137ad57600080fd5b845167ffffffffffffffff808211156137c557600080fd5b818701915087601f8301126137d957600080fd5b81516020828211156137ed576137ed613ddc565b8160051b92506137fe818401613bc1565b8281528181019085830185870184018d101561381957600080fd5b600096505b848710156138435761382f81613617565b83526001969096019591830191830161381e565b5098506138539050898201613617565b96505050505061386560408601613617565b6060959095015193969295505050565b60006020828403121561388757600080fd5b815161364481613e0b565b6000602082840312156138a457600080fd5b813561364481613e19565b6000602082840312156138c157600080fd5b815161364481613e19565b6000602082840312156138de57600080fd5b813567ffffffffffffffff8111156138f557600080fd5b8201601f8101841361390657600080fd5b61200284823560208401613578565b60006020828403121561392757600080fd5b5035919050565b60006020828403121561394057600080fd5b5051919050565b6000806040838503121561395a57600080fd5b82359150613675602084016135ee565b60008151808452613982816020860160208601613c53565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516139c6818560208601613c53565b9290920192915050565b600083516139e2818460208801613c53565b8351908301906139f6818360208801613c53565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b600080845481600182811c915080831680613a4357607f831692505b6020808410821415613a7c577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613a905760018114613abf57613aec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613aec565b60008b81526020902060005b86811015613ae45781548b820152908501908301613acb565b505084890196505b505050505050613afc81856139b4565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613b44608083018461396a565b9695505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613b8b57815161ffff1684529284019290840190600101613b6b565b50505061ffff968716918401919091529390941660408201526060015292915050565b602081526000613644602083018461396a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c0857613c08613ddc565b604052919050565b60008219821115613c2357613c23613d20565b500190565b600082613c3757613c37613d4f565b500490565b600082821015613c4e57613c4e613d20565b500390565b60005b83811015613c6e578181015183820152602001613c56565b83811115611b0d5750506000910152565b600181811c90821680613c9357607f821691505b60208210811415613ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0557613d05613d20565b5060010190565b600082613d1b57613d1b613d4f565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611e9757600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9757600080fdfea2646970667358221220db0d16cc55a06d37306a8c1b3722e04a4d7a49eeb5385238234adb318c90e81864736f6c6343000806003368747470733a2f2f6e66747374617469632e6d6565626d61737465722e636f6d2f7374617469632f6e66742f504f4c59474f4e2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102415760003560e01c806366dfbfb411610145578063b5d56a41116100bd578063d89135cd1161008c578063e985e9c511610071578063e985e9c514610508578063f00c298d14610551578063f851a4401461056457600080fd5b8063d89135cd146104ca578063e1e77855146104d257600080fd5b8063b5d56a4114610489578063b88d4fde1461049c578063c87b56dd146104af578063d431b1ac146104c257600080fd5b80638f28397011610114578063a1448194116100f9578063a14481941461042a578063a22cb4651461043d578063aa271e1a1461045057600080fd5b80638f2839701461040f57806395d89b411461042257600080fd5b806366dfbfb4146103b357806370a08231146103c65780637b303965146103d957806381ca7eba146103fc57600080fd5b806340c10f19116101d85780634f6ccce7116101a75780635c975abb1161018c5780635c975abb146103825780636198e3391461038d5780636352211e146103a057600080fd5b80634f6ccce7146103675780634f8421431461037a57600080fd5b806340c10f191461031b57806342842e0e1461032e57806342966c68146103415780634f558e791461035457600080fd5b806318160ddd1161021457806318160ddd146102d057806323b872dd146102e25780632f745c59146102f557806339a0c6f91461030857600080fd5b806301ffc9a71461024657806306fdde031461026e578063081812fc14610283578063095ea7b3146102bb575b600080fd5b610259610254366004613892565b610582565b60405190151581526020015b60405180910390f35b6102766105de565b6040516102659190613bae565b610296610291366004613915565b610670565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102ce6102c936600461376d565b61074f565b005b600a545b604051908152602001610265565b6102ce6102f036600461367e565b6108dc565b6102d461030336600461376d565b610987565b6102ce6103163660046138cc565b610a56565b6102ce61032936600461376d565b610b1a565b6102ce61033c36600461367e565b610ba1565b6102ce61034f366004613915565b610bbc565b610259610362366004613915565b610ce9565b6102d4610375366004613915565b610d15565b6102ce610dd3565b600c5460ff16610259565b6102ce61039b366004613915565b610e5e565b6102966103ae366004613915565b6110a5565b6102ce6103c1366004613947565b6110ef565b6102d46103d4366004613629565b611362565b6103ec6103e7366004613915565b611430565b6040516102659493929190613b4e565b6102ce61040a366004613629565b61152e565b6102ce61041d366004613629565b61172a565b6102766117f2565b6102ce61043836600461376d565b611801565b6102ce61044b366004613736565b611884565b61025961045e366004613629565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b6102ce610497366004613629565b61199b565b6102ce6104aa3660046136ba565b611a63565b6102766104bd366004613915565b611b13565b6102ce611b47565b600f546102d4565b6102966104e0366004613915565b60009081526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61025961051636600461364b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102ce61055f366004613736565b611bd0565b60025473ffffffffffffffffffffffffffffffffffffffff16610296565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806105d857506105d882611ca7565b92915050565b6060600080546105ed90613c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461061990613c7f565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061075a826110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161071d565b3373ffffffffffffffffffffffffffffffffffffffff8216148061084157506108418133610516565b6108cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071d565b6108d78383611d8a565b505050565b6108e581611e2a565b6108f0335b82611e9a565b61097c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b6108d783838361200a565b600061099283611362565b8210610a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b60025473ffffffffffffffffffffffffffffffffffffffff163314610ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b6000610ae16117f2565b90508181604051602001610af69291906139d0565b604051602081830303815290604052600d90805190602001906108d79291906134df565b3360009081526003602052604090205460ff16610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d828261227c565b5050565b6108d783838360405180602001604052806000815250611a63565b6002600e541415610c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e55610c37336108ea565b610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000606482015260840161071d565b610ccc816124b4565b600f8054906000610cdc83613cd3565b90915550506001600e5550565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff1615156105d8565b6000610d20600a5490565b8210610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161071d565b600a8281548110610dc157610dc1613dad565b90600052602060002001549050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612657565b565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16610f0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610f59575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610fe5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d6565624d61737465724e46543a2063616c6c6572206973206e6f74206c6f6360448201527f6b6572206e6f722061646d696e00000000000000000000000000000000000000606482015260840161071d565b611008610ff1836110a5565b828460405180602001604052806000815250612738565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d6565624d61737465724e46543a20756e6c6f636b206661696c656400000000604482015260640161071d565b50600090815260106020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105d857505060025473ffffffffffffffffffffffffffffffffffffffff16919050565b6002600e54141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e5560008281526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156111ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d6565624d61737465724e46543a20616c7265616479206c6f636b6564000000604482015260640161071d565b6111f8335b83611e9a565b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b600082815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556112f36112dc836110a5565b828460405180602001604052806000815250612937565b611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d6565624d61737465724e46543a206c6f636b206661696c6564000000000000604482015260640161071d565b50506001600e55565b600073ffffffffffffffffffffffffffffffffffffffff8216611407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b6011546060906000908190819073ffffffffffffffffffffffffffffffffffffffff1615611527576011546040517fad217ae50000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff9091169063ad217ae59060240160006040518083038186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261151c9190810190613797565b929650909450925090505b9193509193565b60025473ffffffffffffffffffffffffffffffffffffffff1633146115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115ea60025473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611687919061392e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9d9190613875565b60025473ffffffffffffffffffffffffffffffffffffffff1633146117ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6060600180546105ed90613c7f565b3360009081526003602052604090205460ff1661187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d8282612b23565b73ffffffffffffffffffffffffffffffffffffffff8216331415611904576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071d565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611a1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611a6c82611e2a565b611a75336111f2565b611b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b611b0d84848484612b3d565b50505050565b6060600d611b2083612be0565b604051602001611b31929190613a27565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611bc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612d12565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611d3a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105d857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146105d8565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611de4826110a5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3360009081526003602052604090205460ff1680611e5f575060025473ffffffffffffffffffffffffffffffffffffffff1633145b15611e975760008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16611e9757611e97338261227c565b50565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16611f4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b6000611f56836110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc557508373ffffffffffffffffffffffffffffffffffffffff16611fad84610670565b73ffffffffffffffffffffffffffffffffffffffff16145b80612002575073ffffffffffffffffffffffffffffffffffffffff80821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661202a826110a5565b73ffffffffffffffffffffffffffffffffffffffff16146120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff821661216f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161071d565b61217a838383612dd2565b612185600082611d8a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604081208054600192906121bb908490613c3c565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604081208054600192906121f6908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff82166122f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071d565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161071d565b600081116123ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4552433732313a207a65726f2069640000000000000000000000000000000000604482015260640161071d565b6123fb60008383612dd2565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805460019290612431908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff169061259790829084612dd2565b6125a2600083611d8a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081208054600192906125d8908490613c3c565b909155505060008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600c5460ff166126c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f8aed3f9c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690638aed3f9c906127af903390899088908890600401613b05565b602060405180830381600087803b1580156127c957600080fd5b505af1925050508015612817575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612814918101906138af565b60015b6128e1573d808015612845576040519150601f19603f3d011682016040523d82523d6000602084013e61284a565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d6565624d61737465724e46543a20756e6c6f636b2066726f6d2061206e6f6e60448201527f204552433732314c6f636b657220696d706c656d656e74657200000000000000606482015260840161071d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f8aed3f9c00000000000000000000000000000000000000000000000000000000149050612002565b506001949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f9f2c9fd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690639f2c9fd5906129ae903390899088908890600401613b05565b602060405180830381600087803b1580156129c857600080fd5b505af1925050508015612a16575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612a13918101906138af565b60015b612ad8573d808015612a44576040519150601f19603f3d011682016040523d82523d6000602084013e612a49565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d6565624d61737465724e46543a206c6f636b206279206e6f6e20455243373260448201527f314c6f636b657220696d706c656d656e74657200000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f9f2c9fd500000000000000000000000000000000000000000000000000000000149050612002565b610b9d828260405180602001604052806000815250612ef5565b612b4884848461200a565b612b5484848484612f98565b611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b606081612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613cd3565b9150612c439050600a83613c28565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613ddc565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b841561200257612ca4600183613c3c565b9150612cb1600a86613d0c565b612cbc906030613c10565b60f81b818381518110612cd157612cd1613dad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613c28565b9450612c93565b600c5460ff1615612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861270e3390565b612ddd838383613184565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff838116911614612ebd5760008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4d6565624d61737465724e46543a20746f6b656e207472616e7366657220776860448201527f696c65206c6f636b656400000000000000000000000000000000000000000000606482015260840161071d565b600090815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b612eff838361227c565b612f0c6000848484612f98565b6108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061300f903390899088908890600401613b05565b602060405180830381600087803b15801561302957600080fd5b505af1925050508015613077575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613074918101906138af565b60015b613139573d8080156130a5576040519150601f19603f3d011682016040523d82523d6000602084013e6130aa565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612002565b61318f838383613222565b600c5460ff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4252433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c6520706175736564000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff831661328a5761328581600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6132c7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132c7576132c78382613328565b73ffffffffffffffffffffffffffffffffffffffff82166132eb576108d7816133df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146108d7576108d7828261348e565b6000600161333584611362565b61333f9190613c3c565b60008381526009602052604090205490915080821461339f5773ffffffffffffffffffffffffffffffffffffffff841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b50600091825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a546000906133f190600190613c3c565b6000838152600b6020526040812054600a805493945090928490811061341957613419613dad565b9060005260206000200154905080600a838154811061343a5761343a613dad565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061347257613472613d7e565b6001900381819060005260206000200160009055905550505050565b600061349983611362565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8280546134eb90613c7f565b90600052602060002090601f01602090048101928261350d5760008555613553565b82601f1061352657805160ff1916838001178555613553565b82800160010185558215613553579182015b82811115613553578251825591602001919060010190613538565b5061355f929150613563565b5090565b5b8082111561355f5760008155600101613564565b600067ffffffffffffffff83111561359257613592613ddc565b6135c360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613bc1565b90508281528383830111156135d757600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461361257600080fd5b919050565b805161ffff8116811461361257600080fd5b60006020828403121561363b57600080fd5b613644826135ee565b9392505050565b6000806040838503121561365e57600080fd5b613667836135ee565b9150613675602084016135ee565b90509250929050565b60008060006060848603121561369357600080fd5b61369c846135ee565b92506136aa602085016135ee565b9150604084013590509250925092565b600080600080608085870312156136d057600080fd5b6136d9856135ee565b93506136e7602086016135ee565b925060408501359150606085013567ffffffffffffffff81111561370a57600080fd5b8501601f8101871361371b57600080fd5b61372a87823560208401613578565b91505092959194509250565b6000806040838503121561374957600080fd5b613752836135ee565b9150602083013561376281613e0b565b809150509250929050565b6000806040838503121561378057600080fd5b613789836135ee565b946020939093013593505050565b600080600080608085870312156137ad57600080fd5b845167ffffffffffffffff808211156137c557600080fd5b818701915087601f8301126137d957600080fd5b81516020828211156137ed576137ed613ddc565b8160051b92506137fe818401613bc1565b8281528181019085830185870184018d101561381957600080fd5b600096505b848710156138435761382f81613617565b83526001969096019591830191830161381e565b5098506138539050898201613617565b96505050505061386560408601613617565b6060959095015193969295505050565b60006020828403121561388757600080fd5b815161364481613e0b565b6000602082840312156138a457600080fd5b813561364481613e19565b6000602082840312156138c157600080fd5b815161364481613e19565b6000602082840312156138de57600080fd5b813567ffffffffffffffff8111156138f557600080fd5b8201601f8101841361390657600080fd5b61200284823560208401613578565b60006020828403121561392757600080fd5b5035919050565b60006020828403121561394057600080fd5b5051919050565b6000806040838503121561395a57600080fd5b82359150613675602084016135ee565b60008151808452613982816020860160208601613c53565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516139c6818560208601613c53565b9290920192915050565b600083516139e2818460208801613c53565b8351908301906139f6818360208801613c53565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b600080845481600182811c915080831680613a4357607f831692505b6020808410821415613a7c577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613a905760018114613abf57613aec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613aec565b60008b81526020902060005b86811015613ae45781548b820152908501908301613acb565b505084890196505b505050505050613afc81856139b4565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613b44608083018461396a565b9695505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613b8b57815161ffff1684529284019290840190600101613b6b565b50505061ffff968716918401919091529390941660408201526060015292915050565b602081526000613644602083018461396a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c0857613c08613ddc565b604052919050565b60008219821115613c2357613c23613d20565b500190565b600082613c3757613c37613d4f565b500490565b600082821015613c4e57613c4e613d20565b500390565b60005b83811015613c6e578181015183820152602001613c56565b83811115611b0d5750506000910152565b600181811c90821680613c9357607f821691505b60208210811415613ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0557613d05613d20565b5060010190565b600082613d1b57613d1b613d4f565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611e9757600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9757600080fdfea2646970667358221220db0d16cc55a06d37306a8c1b3722e04a4d7a49eeb5385238234adb318c90e81864736f6c63430008060033

Deployed Bytecode Sourcemap

53585:6600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43754:224;;;;;;:::i;:::-;;:::i;:::-;;;10500:14:1;;10493:22;10475:41;;10463:2;10448:18;43754:224:0;;;;;;;;29804:100;;;:::i;:::-;;;;;;;:::i;31542:221::-;;;;;;:::i;:::-;;:::i;:::-;;;8557:42:1;8545:55;;;8527:74;;8515:2;8500:18;31542:221:0;8482:125:1;31102:374:0;;;;;;:::i;:::-;;:::i;:::-;;44394:113;44482:10;:17;44394:113;;;22171:25:1;;;22159:2;22144:18;44394:113:0;22126:76:1;32485:374:0;;;;;;:::i;:::-;;:::i;44062:256::-;;;;;;:::i;:::-;;:::i;52958:190::-;;;;;;:::i;:::-;;:::i;41113:100::-;;;;;;:::i;:::-;;:::i;32930:185::-;;;;;;:::i;:::-;;:::i;59094:292::-;;;;;;:::i;:::-;;:::i;54712:121::-;;;;;;:::i;:::-;;:::i;44584:233::-;;;;;;:::i;:::-;;:::i;52880:70::-;;;:::i;50885:86::-;50956:7;;;;50885:86;;55520:514;;;;;;:::i;:::-;;:::i;29507:230::-;;;;;;:::i;:::-;;:::i;55023:489::-;;;;;;:::i;:::-;;:::i;29186:208::-;;;;;;:::i;:::-;;:::i;54274:430::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;60029:153::-;;;;;;:::i;:::-;;:::i;41337:94::-;;;;;;:::i;:::-;;:::i;29973:104::-;;;:::i;41221:108::-;;;;;;:::i;:::-;;:::i;31835:295::-;;;;;;:::i;:::-;;:::i;30696:113::-;;;;;;:::i;:::-;30784:17;;30760:4;30784:17;;;:8;:17;;;;;;;;;30696:113;53999:107;;;;;;:::i;:::-;;:::i;33239:363::-;;;;;;:::i;:::-;;:::i;52639:159::-;;;;;;:::i;:::-;;:::i;52806:66::-;;;:::i;54164:102::-;54246:12;;54164:102;;54841:120;;;;;;:::i;:::-;54908:7;54935:18;;;:9;:18;;;;;;;;;54841:120;32201:164;;;;;;:::i;:::-;32322:25;;;;32298:4;32322:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32201:164;41439:125;;;;;;:::i;:::-;;:::i;30535:87::-;30608:6;;;;30535:87;;43754:224;43856:4;43880:50;;;43895:35;43880:50;;:90;;;43934:36;43958:11;43934:23;:36::i;:::-;43873:97;43754:224;-1:-1:-1;;43754:224:0:o;29804:100::-;29858:13;29891:5;29884:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29804:100;:::o;31542:221::-;31618:7;35201:16;;;:7;:16;;;;;;:30;:16;31638:73;;;;;;;17780:2:1;31638:73:0;;;17762:21:1;17819:2;17799:18;;;17792:30;17858:34;17838:18;;;17831:62;17929:14;17909:18;;;17902:42;17961:19;;31638:73:0;;;;;;;;;-1:-1:-1;31731:24:0;;;;:15;:24;;;;;;;;;31542:221::o;31102:374::-;31183:13;31199:23;31214:7;31199:14;:23::i;:::-;31183:39;;31247:5;31241:11;;:2;:11;;;;31233:57;;;;;;;18603:2:1;31233:57:0;;;18585:21:1;18642:2;18622:18;;;18615:30;18681:34;18661:18;;;18654:62;18752:3;18732:18;;;18725:31;18773:19;;31233:57:0;18575:223:1;31233:57:0;23846:10;31311:21;;;;;:62;;-1:-1:-1;31336:37:0;31353:5;23846:10;32201:164;:::i;31336:37::-;31303:131;;;;;;;15822:2:1;31303:131:0;;;15804:21:1;15861:2;15841:18;;;15834:30;15900:34;15880:18;;;15873:62;15971:26;15951:18;;;15944:54;16015:19;;31303:131:0;15794:246:1;31303:131:0;31447:21;31456:2;31460:7;31447:8;:21::i;:::-;31172:304;31102:374;;:::o;32485:::-;32619:24;32635:7;32619:15;:24::i;:::-;32715:41;23846:10;32734:12;32748:7;32715:18;:41::i;:::-;32707:103;;;;;;;19005:2:1;32707:103:0;;;18987:21:1;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;19154:19;19134:18;;;19127:47;19191:19;;32707:103:0;18977:239:1;32707:103:0;32823:28;32833:4;32839:2;32843:7;32823:9;:28::i;44062:256::-;44159:7;44195:23;44212:5;44195:16;:23::i;:::-;44187:5;:31;44179:87;;;;;;;12015:2:1;44179:87:0;;;11997:21:1;12054:2;12034:18;;;12027:30;12093:34;12073:18;;;12066:62;12164:13;12144:18;;;12137:41;12195:19;;44179:87:0;11987:233:1;44179:87:0;-1:-1:-1;44284:19:0;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44062:256::o;52958:190::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;53037:21:::1;53061:8;:6;:8::i;:::-;53037:32;;53114:10;53126:7;53097:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53080:7;:60;;;;;;;;;;;;:::i;41113:100::-:0;28678:10;28669:20;;;;:8;:20;;;;;;;;28661:51;;;;;;;16658:2:1;28661:51:0;;;16640:21:1;16697:2;16677:18;;;16670:30;16736:20;16716:18;;;16709:48;16774:18;;28661:51:0;16630:168:1;28661:51:0;41187:18:::1;41193:2;41197:7;41187:5;:18::i;:::-;41113:100:::0;;:::o;32930:185::-;33068:39;33085:4;33091:2;33095:7;33068:39;;;;;;;;;;;;:16;:39::i;59094:292::-;4459:1;5055:7;;:19;;5047:63;;;;;;;21450:2:1;5047:63:0;;;21432:21:1;21489:2;21469:18;;;21462:30;21528:33;21508:18;;;21501:61;21579:18;;5047:63:0;21422:181:1;5047:63:0;4459:1;5188:7;:18;59234:41:::1;23846:10:::0;59253:12:::1;23766:98:::0;59234:41:::1;59226:102;;;::::0;::::1;::::0;;21810:2:1;59226:102:0::1;::::0;::::1;21792:21:1::0;21849:2;21829:18;;;21822:30;21888:34;21868:18;;;21861:62;21959:18;21939;;;21932:46;21995:19;;59226:102:0::1;21782:238:1::0;59226:102:0::1;59339:14;59345:7;59339:5;:14::i;:::-;59364:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;4415:1:0;5367:7;:22;-1:-1:-1;59094:292:0:o;54712:121::-;54785:4;35201:16;;;:7;:16;;;;;;:30;:16;:30;;54809:16;35112:127;44584:233;44659:7;44695:30;44482:10;:17;;44394:113;44695:30;44687:5;:38;44679:95;;;;;;;19780:2:1;44679:95:0;;;19762:21:1;19819:2;19799:18;;;19792:30;19858:34;19838:18;;;19831:62;19929:14;19909:18;;;19902:42;19961:19;;44679:95:0;19752:234:1;44679:95:0;44792:10;44803:5;44792:17;;;;;;;;:::i;:::-;;;;;;;;;44785:24;;44584:233;;;:::o;52880:70::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;52932:10:::1;:8;:10::i;:::-;52880:70::o:0;55520:514::-;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;55582:73;;;;;;;14718:2:1;55582:73:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;14867:14;14847:18;;;14840:42;14899:19;;55582:73:0;14690:234:1;55582:73:0;55666:15;55684:18;;;:9;:18;;;;;;;;23846:10;55774:23;;;:50;;-1:-1:-1;30608:6:0;;55801:23;30608:6;23846:10;55801:23;55774:50;55766:108;;;;;;;17005:2:1;55766:108:0;;;16987:21:1;17044:2;17024:18;;;17017:30;17083:34;17063:18;;;17056:62;17154:15;17134:18;;;17127:43;17187:19;;55766:108:0;16977:235:1;55766:108:0;55893:62;55916:16;55924:7;55916;:16::i;:::-;55934:7;55943;55893:62;;;;;;;;;;;;:22;:62::i;:::-;55885:103;;;;;;;19423:2:1;55885:103:0;;;19405:21:1;19462:2;19442:18;;;19435:30;19501;19481:18;;;19474:58;19549:18;;55885:103:0;19395:178:1;55885:103:0;-1:-1:-1;56008:18:0;;;;:9;:18;;;;;56001:25;;;;;;55520:514::o;29507:230::-;29579:7;29615:16;;;:7;:16;;;;;;;;29646:19;29642:65;;-1:-1:-1;;29689:6:0;;;;;29507:230;-1:-1:-1;29507:230:0:o;55023:489::-;4459:1;5055:7;;:19;;5047:63;;;;;;;21450:2:1;5047:63:0;;;21432:21:1;21489:2;21469:18;;;21462:30;21528:33;21508:18;;;21501:61;21579:18;;5047:63:0;21422:181:1;5047:63:0;4459:1;5188:7;:18;55150:1:::1;55120:18:::0;;;:9:::1;:18;::::0;;;;;:32:::1;:18;:32:::0;55112:74:::1;;;::::0;::::1;::::0;;10953:2:1;55112:74:0::1;::::0;::::1;10935:21:1::0;10992:2;10972:18;;;10965:30;11031:31;11011:18;;;11004:59;11080:18;;55112:74:0::1;10925:179:1::0;55112:74:0::1;55260:41;23846:10:::0;55279:12:::1;55293:7;55260:18;:41::i;:::-;55252:103;;;::::0;::::1;::::0;;19005:2:1;55252:103:0::1;::::0;::::1;18987:21:1::0;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;19154:19;19134:18;;;19127:47;19191:19;;55252:103:0::1;18977:239:1::0;55252:103:0::1;55368:18;::::0;;;:9:::1;:18;::::0;;;;:27;;;::::1;;::::0;::::1;;::::0;;55414:59:::1;55435:16;55368:18:::0;55435:7:::1;:16::i;:::-;55453:6;55461:7;55414:59;;;;;;;;;;;::::0;:20:::1;:59::i;:::-;55406:98;;;::::0;::::1;::::0;;11660:2:1;55406:98:0::1;::::0;::::1;11642:21:1::0;11699:2;11679:18;;;11672:30;11738:28;11718:18;;;11711:56;11784:18;;55406:98:0::1;11632:176:1::0;55406:98:0::1;-1:-1:-1::0;;4415:1:0;5367:7;:22;55023:489::o;29186:208::-;29258:7;29286:19;;;29278:74;;;;;;;16247:2:1;29278:74:0;;;16229:21:1;16286:2;16266:18;;;16259:30;16325:34;16305:18;;;16298:62;16396:12;16376:18;;;16369:40;16426:19;;29278:74:0;16219:232:1;29278:74:0;-1:-1:-1;29370:16:0;;;;;;:9;:16;;;;;;;29186:208::o;54274:430::-;54548:10;;54391:24;;54430:15;;;;;;54548:24;:10;:24;54544:153;;54659:10;;54642:43;;;;;;;;22171:25:1;;;54659:10:0;;;;;54642:34;;22144:18:1;;54642:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54589:96;;-1:-1:-1;54589:96:0;;-1:-1:-1;54589:96:0;-1:-1:-1;54589:96:0;-1:-1:-1;54544:153:0;54274:430;;;;;:::o;60029:153::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;60108:6:::1;60101:23;;;60125:7;30608:6:::0;;;;;30535:87;60125:7:::1;60134:39;::::0;;;;60167:4:::1;60134:39;::::0;::::1;8527:74:1::0;60134:24:0::1;::::0;::::1;::::0;::::1;::::0;8500:18:1;;60134:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60101:73;::::0;;::::1;::::0;;;;;;9332:42:1;9320:55;;;60101:73:0::1;::::0;::::1;9302:74:1::0;9392:18;;;9385:34;9275:18;;60101:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41337:94::-:0;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;41406:6:::1;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;41337:94::o;29973:104::-;30029:13;30062:7;30055:14;;;;;:::i;41221:108::-;28678:10;28669:20;;;;:8;:20;;;;;;;;28661:51;;;;;;;16658:2:1;28661:51:0;;;16640:21:1;16697:2;16677:18;;;16670:30;16736:20;16716:18;;;16709:48;16774:18;;28661:51:0;16630:168:1;28661:51:0;41299:22:::1;41309:2;41313:7;41299:9;:22::i;31835:295::-:0;31938:24;;;23846:10;31938:24;;31930:62;;;;;;;14364:2:1;31930:62:0;;;14346:21:1;14403:2;14383:18;;;14376:30;14442:27;14422:18;;;14415:55;14487:18;;31930:62:0;14336:175:1;31930:62:0;23846:10;32005:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;32074:48;;10475:41:1;;;32005:42:0;;23846:10;32074:48;;10448:18:1;32074:48:0;;;;;;;31835:295;;:::o;53999:107::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;54073:10:::1;:25:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;53999:107::o;33239:363::-;33406:24;33422:7;33406:15;:24::i;:::-;33449:41;23846:10;33468:12;23766:98;33449:41;33441:103;;;;;;;19005:2:1;33441:103:0;;;18987:21:1;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;19154:19;19134:18;;;19127:47;19191:19;;33441:103:0;18977:239:1;33441:103:0;33555:39;33569:4;33575:2;33579:7;33588:5;33555:13;:39::i;:::-;33239:363;;;;:::o;52639:159::-;52704:13;52761:7;52770:18;:7;:16;:18::i;:::-;52744:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52730:60;;52639:159;;;:::o;52806:66::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;52856:8:::1;:6;:8::i;41439:125::-:0;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;41527:17:::1;::::0;;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:29;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;41439:125::o;28804:266::-;28906:4;28930:40;;;28945:25;28930:40;;:92;;-1:-1:-1;28974:48:0;;;28989:33;28974:48;28930:92;:132;;;-1:-1:-1;26787:25:0;26772:40;;;;29026:36;26663:157;39184:174;39259:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;39313:23;39259:24;39313:14;:23::i;:::-;39304:46;;;;;;;;;;;;39184:174;;:::o;40877:228::-;40951:10;40942:20;;;;:8;:20;;;;;;;;;:44;;-1:-1:-1;40980:6:0;;;;40966:10;:20;40942:44;40938:160;;;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;41003:84;;41045:26;41051:10;41063:7;41045:5;:26::i;:::-;40877:228;:::o;35406:348::-;35499:4;35201:16;;;:7;:16;;;;;;:30;:16;35516:73;;;;;;;14718:2:1;35516:73:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;14867:14;14847:18;;;14840:42;14899:19;;35516:73:0;14690:234:1;35516:73:0;35600:13;35616:23;35631:7;35616:14;:23::i;:::-;35600:39;;35669:5;35658:16;;:7;:16;;;:51;;;;35702:7;35678:31;;:20;35690:7;35678:11;:20::i;:::-;:31;;;35658:51;:87;;;-1:-1:-1;32322:25:0;;;;32298:4;32322:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35713:32;35650:96;35406:348;-1:-1:-1;;;;35406:348:0:o;38488:578::-;38647:4;38620:31;;:23;38635:7;38620:14;:23::i;:::-;:31;;;38612:85;;;;;;;18193:2:1;38612:85:0;;;18175:21:1;18232:2;18212:18;;;18205:30;18271:34;18251:18;;;18244:62;18342:11;18322:18;;;18315:39;18371:19;;38612:85:0;18165:231:1;38612:85:0;38716:16;;;38708:65;;;;;;;13959:2:1;38708:65:0;;;13941:21:1;13998:2;13978:18;;;13971:30;14037:34;14017:18;;;14010:62;14108:6;14088:18;;;14081:34;14132:19;;38708:65:0;13931:226:1;38708:65:0;38786:39;38807:4;38813:2;38817:7;38786:20;:39::i;:::-;38890:29;38907:1;38911:7;38890:8;:29::i;:::-;38932:15;;;;;;;:9;:15;;;;;:20;;38951:1;;38932:15;:20;;38951:1;;38932:20;:::i;:::-;;;;-1:-1:-1;;38963:13:0;;;;;;;:9;:13;;;;;:18;;38980:1;;38963:13;:18;;38980:1;;38963:18;:::i;:::-;;;;-1:-1:-1;;38992:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;39031:27;;38992:16;;39031:27;;;;;;;38488:578;;;:::o;37053:432::-;37133:16;;;37125:61;;;;;;;17419:2:1;37125:61:0;;;17401:21:1;;;17438:18;;;17431:30;17497:34;17477:18;;;17470:62;17549:18;;37125:61:0;17391:182:1;37125:61:0;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;:30;37197:58;;;;;;;12846:2:1;37197:58:0;;;12828:21:1;12885:2;12865:18;;;12858:30;12924;12904:18;;;12897:58;12972:18;;37197:58:0;12818:178:1;37197:58:0;37284:1;37274:7;:11;37266:39;;;;;;;13615:2:1;37266:39:0;;;13597:21:1;13654:2;13634:18;;;13627:30;13693:17;13673:18;;;13666:45;13728:18;;37266:39:0;13587:165:1;37266:39:0;37318:45;37347:1;37351:2;37355:7;37318:20;:45::i;:::-;37376:13;;;;;;;:9;:13;;;;;:18;;37393:1;;37376:13;:18;;37393:1;;37376:18;:::i;:::-;;;;-1:-1:-1;;37405:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;37444:33;;37405:16;;;37444:33;;37405:16;;37444:33;37053:432;;:::o;37714:437::-;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;37774:73;;;;;;;14718:2:1;37774:73:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;14867:14;14847:18;;;14840:42;14899:19;;37774:73:0;14690:234:1;37774:73:0;37858:13;37874:16;;;:7;:16;;;;;;;;;37903:48;;37874:16;;37882:7;37903:20;:48::i;:::-;37992:29;38009:1;38013:7;37992:8;:29::i;:::-;38034:16;;;;;;;:9;:16;;;;;:21;;38054:1;;38034:16;:21;;38054:1;;38034:21;:::i;:::-;;;;-1:-1:-1;;38073:16:0;;;;:7;:16;;;;;;38066:23;;;;;;38107:36;38081:7;;38073:16;38066:23;38107:36;;;;;38073:16;;38107:36;37763:388;37714:437;:::o;51944:120::-;50956:7;;;;51480:41;;;;;;;11311:2:1;51480:41:0;;;11293:21:1;11350:2;11330:18;;;11323:30;11389:22;11369:18;;;11362:50;11429:18;;51480:41:0;11283:170:1;51480:41:0;52003:7:::1;:15:::0;;;::::1;::::0;;52034:22:::1;23846:10:::0;52043:12:::1;52034:22;::::0;8557:42:1;8545:55;;;8527:74;;8515:2;8500:18;52034:22:0::1;;;;;;;51944:120::o:0;58021:891::-;58180:4;58201:17;;;16436:20;16484:8;58197:708;;58241:74;;;;;:38;;;;;;:74;;23846:10;;58294:4;;58300:7;;58309:5;;58241:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58241:74:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58237:613;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58491:13:0;;58487:348;;58534:67;;;;;20604:2:1;58534:67:0;;;20586:21:1;20643:2;20623:18;;;20616:30;20682:34;20662:18;;;20655:62;20753:27;20733:18;;;20726:55;20798:19;;58534:67:0;20576:247:1;58487:348:0;58785:6;58779:13;58770:6;58766:2;58762:15;58755:38;58237:613;58366:57;;58376:47;58366:57;;-1:-1:-1;58359:64:0;;58197:708;-1:-1:-1;58889:4:0;58021:891;;;;;;:::o;56587:879::-;56744:4;56765:17;;;16436:20;16484:8;56761:698;;56805:72;;;;;:36;;;;;;:72;;23846:10;;56856:4;;56862:7;;56871:5;;56805:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56805:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56801:603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57051:13:0;;57047:342;;57094:61;;;;;21030:2:1;57094:61:0;;;21012:21:1;21069:2;21049:18;;;21042:30;21108:34;21088:18;;;21081:62;21179:21;21159:18;;;21152:49;21218:19;;57094:61:0;21002:241:1;56801:603:0;56928:55;;56938:45;56928:55;;-1:-1:-1;56921:62:0;;36096:110;36172:26;36182:2;36186:7;36172:26;;;;;;;;;;;;:9;:26::i;34484:315::-;34641:28;34651:4;34657:2;34661:7;34641:9;:28::i;:::-;34688:48;34711:4;34717:2;34721:7;34730:5;34688:22;:48::i;:::-;34680:111;;;;;;;12427:2:1;34680:111:0;;;12409:21:1;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;12576:20;12556:18;;;12549:48;12614:19;;34680:111:0;12399:240:1;24206:723:0;24262:13;24483:10;24479:53;;-1:-1:-1;;24510:10:0;;;;;;;;;;;;;;;;;;24206:723::o;24479:53::-;24557:5;24542:12;24598:78;24605:9;;24598:78;;24631:8;;;;:::i;:::-;;-1:-1:-1;24654:10:0;;-1:-1:-1;24662:2:0;24654:10;;:::i;:::-;;;24598:78;;;24686:19;24718:6;24708:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24708:17:0;;24686:39;;24736:154;24743:10;;24736:154;;24770:11;24780:1;24770:11;;:::i;:::-;;-1:-1:-1;24839:10:0;24847:2;24839:5;:10;:::i;:::-;24826:24;;:2;:24;:::i;:::-;24813:39;;24796:6;24803;24796:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;24867:11:0;24876:2;24867:11;;:::i;:::-;;;24736:154;;51685:118;50956:7;;;;51210:9;51202:38;;;;;;;15131:2:1;51202:38:0;;;15113:21:1;15170:2;15150:18;;;15143:30;15209:18;15189;;;15182:46;15245:18;;51202:38:0;15103:166:1;51202:38:0;51745:7:::1;:14:::0;;;::::1;51755:4;51745:14;::::0;;51775:20:::1;51782:12;23846:10:::0;;23766:98;59565:411;59709:45;59736:4;59742:2;59746:7;59709:26;:45::i;:::-;59771:18;;;;:9;:18;;;;;;:24;;;;:18;;:24;59767:202;;59850:1;59820:18;;;:9;:18;;;;;;:32;:18;:32;59812:87;;;;;;;20193:2:1;59812:87:0;;;20175:21:1;20232:2;20212:18;;;20205:30;20271:34;20251:18;;;20244:62;20342:12;20322:18;;;20315:40;20372:19;;59812:87:0;20165:232:1;59767:202:0;59939:18;;;;:9;:18;;;;;59932:25;;;;;;-1:-1:-1;;59565:411:0:o;36433:284::-;36563:18;36569:2;36573:7;36563:5;:18::i;:::-;36600:54;36631:1;36635:2;36639:7;36648:5;36600:22;:54::i;:::-;36592:117;;;;;;;12427:2:1;36592:117:0;;;12409:21:1;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;12576:20;12556:18;;;12549:48;12614:19;;36592:117:0;12399:240:1;39923:872:0;40078:4;40099:13;;;16436:20;16484:8;40095:693;;40135:72;;;;;:36;;;;;;:72;;23846:10;;40186:4;;40192:7;;40201:5;;40135:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40135:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40131:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40381:13:0;;40377:341;;40424:60;;;;;12427:2:1;40424:60:0;;;12409:21:1;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;12576:20;12556:18;;;12549:48;12614:19;;40424:60:0;12399:240:1;40131:602:0;40258:55;;40268:45;40258:55;;-1:-1:-1;40251:62:0;;53303:275;53447:45;53474:4;53480:2;53484:7;53447:26;:45::i;:::-;50956:7;;;;53513:9;53505:65;;;;;;;13203:2:1;53505:65:0;;;13185:21:1;13242:2;13222:18;;;13215:30;13281:34;13261:18;;;13254:62;13352:13;13332:18;;;13325:41;13383:19;;53505:65:0;13175:233:1;45430:589:0;45636:18;;;45632:187;;45671:40;45703:7;46846:10;:17;;46819:24;;;;:15;:24;;;;;:44;;;46874:24;;;;;;;;;;;;46742:164;45671:40;45632:187;;;45741:2;45733:10;;:4;:10;;;45729:90;;45760:47;45793:4;45799:7;45760:32;:47::i;:::-;45833:16;;;45829:183;;45866:45;45903:7;45866:36;:45::i;45829:183::-;45939:4;45933:10;;:2;:10;;;45929:83;;45960:40;45988:2;45992:7;45960:27;:40::i;47533:988::-;47799:22;47849:1;47824:22;47841:4;47824:16;:22::i;:::-;:26;;;;:::i;:::-;47861:18;47882:26;;;:17;:26;;;;;;47799:51;;-1:-1:-1;48015:28:0;;;48011:328;;48082:18;;;48060:19;48082:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48133:30;;;;;;:44;;;48250:30;;:17;:30;;;;;:43;;;48011:328;-1:-1:-1;48435:26:0;;;;:17;:26;;;;;;;;48428:33;;;48479:18;;;;;;:12;:18;;;;;:34;;;;;;;48472:41;47533:988::o;48816:1079::-;49094:10;:17;49069:22;;49094:21;;49114:1;;49094:21;:::i;:::-;49126:18;49147:24;;;:15;:24;;;;;;49520:10;:26;;49069:46;;-1:-1:-1;49147:24:0;;49069:46;;49520:26;;;;;;:::i;:::-;;;;;;;;;49498:48;;49584:11;49559:10;49570;49559:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;49664:28;;;:15;:28;;;;;;;:41;;;49836:24;;;;;49829:31;49871:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48887:1008;;;48816:1079;:::o;46320:221::-;46405:14;46422:20;46439:2;46422:16;:20::i;:::-;46453:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;46498:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46320:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:2;;;368:1;365;358:12;327:2;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;88:391;;;;;:::o;484:196::-;552:20;;612:42;601:54;;591:65;;581:2;;670:1;667;660:12;581:2;533:147;;;:::o;685:163::-;763:13;;816:6;805:18;;795:29;;785:2;;838:1;835;828:12;853:186;912:6;965:2;953:9;944:7;940:23;936:32;933:2;;;981:1;978;971:12;933:2;1004:29;1023:9;1004:29;:::i;:::-;994:39;923:116;-1:-1:-1;;;923:116:1:o;1044:260::-;1112:6;1120;1173:2;1161:9;1152:7;1148:23;1144:32;1141:2;;;1189:1;1186;1179:12;1141:2;1212:29;1231:9;1212:29;:::i;:::-;1202:39;;1260:38;1294:2;1283:9;1279:18;1260:38;:::i;:::-;1250:48;;1131:173;;;;;:::o;1309:328::-;1386:6;1394;1402;1455:2;1443:9;1434:7;1430:23;1426:32;1423:2;;;1471:1;1468;1461:12;1423:2;1494:29;1513:9;1494:29;:::i;:::-;1484:39;;1542:38;1576:2;1565:9;1561:18;1542:38;:::i;:::-;1532:48;;1627:2;1616:9;1612:18;1599:32;1589:42;;1413:224;;;;;:::o;1642:666::-;1737:6;1745;1753;1761;1814:3;1802:9;1793:7;1789:23;1785:33;1782:2;;;1831:1;1828;1821:12;1782:2;1854:29;1873:9;1854:29;:::i;:::-;1844:39;;1902:38;1936:2;1925:9;1921:18;1902:38;:::i;:::-;1892:48;;1987:2;1976:9;1972:18;1959:32;1949:42;;2042:2;2031:9;2027:18;2014:32;2069:18;2061:6;2058:30;2055:2;;;2101:1;2098;2091:12;2055:2;2124:22;;2177:4;2169:13;;2165:27;-1:-1:-1;2155:2:1;;2206:1;2203;2196:12;2155:2;2229:73;2294:7;2289:2;2276:16;2271:2;2267;2263:11;2229:73;:::i;:::-;2219:83;;;1772:536;;;;;;;:::o;2313:315::-;2378:6;2386;2439:2;2427:9;2418:7;2414:23;2410:32;2407:2;;;2455:1;2452;2445:12;2407:2;2478:29;2497:9;2478:29;:::i;:::-;2468:39;;2557:2;2546:9;2542:18;2529:32;2570:28;2592:5;2570:28;:::i;:::-;2617:5;2607:15;;;2397:231;;;;;:::o;2633:254::-;2701:6;2709;2762:2;2750:9;2741:7;2737:23;2733:32;2730:2;;;2778:1;2775;2768:12;2730:2;2801:29;2820:9;2801:29;:::i;:::-;2791:39;2877:2;2862:18;;;;2849:32;;-1:-1:-1;;;2720:167:1:o;2892:1199::-;3011:6;3019;3027;3035;3088:3;3076:9;3067:7;3063:23;3059:33;3056:2;;;3105:1;3102;3095:12;3056:2;3138:9;3132:16;3167:18;3208:2;3200:6;3197:14;3194:2;;;3224:1;3221;3214:12;3194:2;3262:6;3251:9;3247:22;3237:32;;3307:7;3300:4;3296:2;3292:13;3288:27;3278:2;;3329:1;3326;3319:12;3278:2;3358;3352:9;3380:4;3403:2;3399;3396:10;3393:2;;;3409:18;;:::i;:::-;3455:2;3452:1;3448:10;3438:20;;3478:28;3502:2;3498;3494:11;3478:28;:::i;:::-;3540:15;;;3571:12;;;;3603:11;;;3633;;;3629:20;;3626:33;-1:-1:-1;3623:2:1;;;3672:1;3669;3662:12;3623:2;3694:1;3685:10;;3704:179;3718:2;3715:1;3712:9;3704:179;;;3775:33;3804:3;3775:33;:::i;:::-;3763:46;;3736:1;3729:9;;;;;3829:12;;;;3861;;3704:179;;;-1:-1:-1;3902:5:1;-1:-1:-1;3926:48:1;;-1:-1:-1;3955:18:1;;;3926:48;:::i;:::-;3916:58;;;;;;3993:48;4037:2;4026:9;4022:18;3993:48;:::i;:::-;4081:2;4066:18;;;;4060:25;3046:1045;;;;-1:-1:-1;;;3046:1045:1:o;4096:245::-;4163:6;4216:2;4204:9;4195:7;4191:23;4187:32;4184:2;;;4232:1;4229;4222:12;4184:2;4264:9;4258:16;4283:28;4305:5;4283:28;:::i;4346:245::-;4404:6;4457:2;4445:9;4436:7;4432:23;4428:32;4425:2;;;4473:1;4470;4463:12;4425:2;4512:9;4499:23;4531:30;4555:5;4531:30;:::i;4596:249::-;4665:6;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4766:9;4760:16;4785:30;4809:5;4785:30;:::i;4850:450::-;4919:6;4972:2;4960:9;4951:7;4947:23;4943:32;4940:2;;;4988:1;4985;4978:12;4940:2;5028:9;5015:23;5061:18;5053:6;5050:30;5047:2;;;5093:1;5090;5083:12;5047:2;5116:22;;5169:4;5161:13;;5157:27;-1:-1:-1;5147:2:1;;5198:1;5195;5188:12;5147:2;5221:73;5286:7;5281:2;5268:16;5263:2;5259;5255:11;5221:73;:::i;5305:180::-;5364:6;5417:2;5405:9;5396:7;5392:23;5388:32;5385:2;;;5433:1;5430;5423:12;5385:2;-1:-1:-1;5456:23:1;;5375:110;-1:-1:-1;5375:110:1:o;5490:184::-;5560:6;5613:2;5601:9;5592:7;5588:23;5584:32;5581:2;;;5629:1;5626;5619:12;5581:2;-1:-1:-1;5652:16:1;;5571:103;-1:-1:-1;5571:103:1:o;5679:254::-;5747:6;5755;5808:2;5796:9;5787:7;5783:23;5779:32;5776:2;;;5824:1;5821;5814:12;5776:2;5860:9;5847:23;5837:33;;5889:38;5923:2;5912:9;5908:18;5889:38;:::i;5938:316::-;5979:3;6017:5;6011:12;6044:6;6039:3;6032:19;6060:63;6116:6;6109:4;6104:3;6100:14;6093:4;6086:5;6082:16;6060:63;:::i;:::-;6168:2;6156:15;6173:66;6152:88;6143:98;;;;6243:4;6139:109;;5987:267;-1:-1:-1;;5987:267:1:o;6259:185::-;6301:3;6339:5;6333:12;6354:52;6399:6;6394:3;6387:4;6380:5;6376:16;6354:52;:::i;:::-;6422:16;;;;;6309:135;-1:-1:-1;;6309:135:1:o;6449:633::-;6729:3;6767:6;6761:13;6783:53;6829:6;6824:3;6817:4;6809:6;6805:17;6783:53;:::i;:::-;6899:13;;6858:16;;;;6921:57;6899:13;6858:16;6955:4;6943:17;;6921:57;:::i;:::-;7043:3;7000:20;;7029:18;;;7074:1;7063:13;;6737:345;-1:-1:-1;;;;6737:345:1:o;7087:1289::-;7263:3;7292:1;7325:6;7319:13;7355:3;7377:1;7405:9;7401:2;7397:18;7387:28;;7465:2;7454:9;7450:18;7487;7477:2;;7531:4;7523:6;7519:17;7509:27;;7477:2;7557;7605;7597:6;7594:14;7574:18;7571:38;7568:2;;;7644:77;7639:3;7632:90;7745:4;7742:1;7735:15;7775:4;7770:3;7763:17;7568:2;7806:18;7833:162;;;;8009:1;8004:320;;;;7799:525;;7833:162;7881:66;7870:9;7866:82;7861:3;7854:95;7978:6;7973:3;7969:16;7962:23;;7833:162;;8004:320;22619:1;22612:14;;;22656:4;22643:18;;8099:1;8113:165;8127:6;8124:1;8121:13;8113:165;;;8205:14;;8192:11;;;8185:35;8248:16;;;;8142:10;;8113:165;;;8117:3;;8307:6;8302:3;8298:16;8291:23;;7799:525;;;;;;;8340:30;8366:3;8358:6;8340:30;:::i;:::-;8333:37;7271:1105;-1:-1:-1;;;;;7271:1105:1:o;8612:511::-;8806:4;8835:42;8916:2;8908:6;8904:15;8893:9;8886:34;8968:2;8960:6;8956:15;8951:2;8940:9;8936:18;8929:43;;9008:6;9003:2;8992:9;8988:18;8981:34;9051:3;9046:2;9035:9;9031:18;9024:31;9072:45;9112:3;9101:9;9097:19;9089:6;9072:45;:::i;:::-;9064:53;8815:308;-1:-1:-1;;;;;;8815:308:1:o;9430:900::-;9698:3;9711:22;;;9782:13;;9683:19;;;9804:22;;;9650:4;;9880;;9857:3;9842:19;;;9907:15;;;9650:4;9950:182;9964:6;9961:1;9958:13;9950:182;;;10029:13;;10044:6;10025:26;10013:39;;10072:12;;;;10107:15;;;;9986:1;9979:9;9950:182;;;-1:-1:-1;;;10171:6:1;10213:15;;;10193:18;;;10186:43;;;;10265:15;;;;10260:2;10245:18;;10238:43;10312:2;10297:18;10290:34;10149:3;9659:671;-1:-1:-1;;9659:671:1:o;10527:219::-;10676:2;10665:9;10658:21;10639:4;10696:44;10736:2;10725:9;10721:18;10713:6;10696:44;:::i;22207:334::-;22278:2;22272:9;22334:2;22324:13;;22339:66;22320:86;22308:99;;22437:18;22422:34;;22458:22;;;22419:62;22416:2;;;22484:18;;:::i;:::-;22520:2;22513:22;22252:289;;-1:-1:-1;22252:289:1:o;22672:128::-;22712:3;22743:1;22739:6;22736:1;22733:13;22730:2;;;22749:18;;:::i;:::-;-1:-1:-1;22785:9:1;;22720:80::o;22805:120::-;22845:1;22871;22861:2;;22876:18;;:::i;:::-;-1:-1:-1;22910:9:1;;22851:74::o;22930:125::-;22970:4;22998:1;22995;22992:8;22989:2;;;23003:18;;:::i;:::-;-1:-1:-1;23040:9:1;;22979:76::o;23060:258::-;23132:1;23142:113;23156:6;23153:1;23150:13;23142:113;;;23232:11;;;23226:18;23213:11;;;23206:39;23178:2;23171:10;23142:113;;;23273:6;23270:1;23267:13;23264:2;;;-1:-1:-1;;23308:1:1;23290:16;;23283:27;23113:205::o;23323:437::-;23402:1;23398:12;;;;23445;;;23466:2;;23520:4;23512:6;23508:17;23498:27;;23466:2;23573;23565:6;23562:14;23542:18;23539:38;23536:2;;;23610:77;23607:1;23600:88;23711:4;23708:1;23701:15;23739:4;23736:1;23729:15;23536:2;;23378:382;;;:::o;23765:195::-;23804:3;23835:66;23828:5;23825:77;23822:2;;;23905:18;;:::i;:::-;-1:-1:-1;23952:1:1;23941:13;;23812:148::o;23965:112::-;23997:1;24023;24013:2;;24028:18;;:::i;:::-;-1:-1:-1;24062:9:1;;24003:74::o;24082:184::-;24134:77;24131:1;24124:88;24231:4;24228:1;24221:15;24255:4;24252:1;24245:15;24271:184;24323:77;24320:1;24313:88;24420:4;24417:1;24410:15;24444:4;24441:1;24434:15;24460:184;24512:77;24509:1;24502:88;24609:4;24606:1;24599:15;24633:4;24630:1;24623:15;24649:184;24701:77;24698:1;24691:88;24798:4;24795:1;24788:15;24822:4;24819:1;24812:15;24838:184;24890:77;24887:1;24880:88;24987:4;24984:1;24977:15;25011:4;25008:1;25001:15;25027:118;25113:5;25106:13;25099:21;25092:5;25089:32;25079:2;;25135:1;25132;25125:12;25150:177;25235:66;25228:5;25224:78;25217:5;25214:89;25204:2;;25317:1;25314;25307:12

Swarm Source

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