ETH Price: $3,441.90 (+3.91%)

Token

 

Overview

Max Total Supply

3,199

Holders

242

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x0e9e32f0fc107388b781cd7a2dd55e68c8b66b12
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
XCART

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-08
*/

// SPDX-License-Identifier: MIT
// Creator: XCart Dev Team
// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

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

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: xcart.sol


// Creator: XCart Dev Team

pragma solidity ^0.8.7;






error MintedQueryForZeroAddress();
error PiecesNotEnoughToSynthesize();

contract XCART is ERC1155, Ownable {
    using SafeERC20 for IERC20;
    enum Status {
        Waiting,
        Started,
        Opened,
        Finished
    }

    struct AddressData {
        // Sum of minted and synthesized.
        uint64 nft_balance;
        // Only for minted ones.
        uint64 nft_num_minted;
        // From id to number.
        mapping(uint8 => uint16) piecesData;
    }

    Status public status;

    // Instead of uri_
    string private _baseURI;

    // Price
    uint256 private NFT_PRICE = 0.168 * 10**18; // 0.168 ETH
    uint256 private PIECE_PRICE = 0.0188 * 10**18; // 0.0188 ETH

    // For NFT
    uint8 private MAX_MINT_PER_ADDR = 2;

    // This value cannot be greater than 2800.
    uint16 private SYN_SUPPLY = 0;
    // This value cannot be greater than 7200.
    uint16 private MINT_SUPPLY = 0;
    // Offset between mint & syn
    uint16 private _offset = 7205;

    // The tokenId of the next token to be minted.
    uint256 private _currentMintNFTIndex;
    uint256 private _currentSynNFTIndex;

    // For pieces
    uint8 public constant ID_P1 = 0;
    uint8 public constant ID_P2 = 1;
    uint8 public constant ID_P3 = 2;
    uint8 public constant ID_P4 = 3;
    uint8 public constant ID_P5 = 4;

    uint16 public constant MAX_PIECES = 2800;

    mapping(address => AddressData) private _addressData;
    mapping(uint8 => uint16) private _piecesMinted;

    event NFTMinted(address indexed minter, uint256 amount, uint256 firstTokenId, address inviter);
    event NFTSynthesized(address owner, uint256 tokenId);
    event NFTExchanged(address indexed owner, uint256 tokenId);
    event PiecesMinted(address indexed minter, uint256 amount, uint256 tokenId, address inviter);
    event PiecesAirdropped(address indexed receiver, uint256 amount);
    event StatusChanged(Status status);
    event BaseURIChanged(string newBaseURI);

    constructor(string memory uri_) ERC1155("XCART") {
        _baseURI = uri_;
        _currentMintNFTIndex = _genesisNFTId();
        _currentSynNFTIndex = _offset;
    }

    function _genesisNFTId() internal view virtual returns (uint256) {
        return 5;
    }

    function totalSupply() public view returns (uint256) {
        unchecked {
            return MINT_SUPPLY + SYN_SUPPLY;
        }
    }

    function totalMintSupply() public view returns (uint256) {
        unchecked {
            return MINT_SUPPLY;
        }
    }

    function totalSynSupply() public view returns (uint256) {
        unchecked {
            return SYN_SUPPLY;
        }
    }

    function perAccountSupply() public view returns (uint256) {
        unchecked {
            return MAX_MINT_PER_ADDR;
        }
    }

    // How many NFTs has been minted.
    function totalNFTMinted() public view returns (uint256) {
        unchecked {
            return _currentMintNFTIndex - _genesisNFTId();
        }
    }

    function totalNFTSynthesized() public view returns (uint256) {
        unchecked {
            return _currentSynNFTIndex - _offset;
        }
    }

    // Max mint number for each address
    function maxMintNumberPerAddress() public view returns (uint256) {
        unchecked {
            return uint256(MAX_MINT_PER_ADDR);
        }
    }

    // How many pieces has been minted.
    function piecesMinted(uint8 pid) public view returns (uint256) {
        unchecked {
            return uint256(_piecesMinted[pid]);
        }
    }

    function numberMinted(address owner_) public view returns (uint256) {
        if (owner_ == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner_].nft_num_minted);
    }

    // Read-only price functions
    function nftPrice() public view returns (uint256) {
        unchecked {
            return NFT_PRICE;
        }
    }

    function piecePrice() public view returns (uint256) {
        unchecked {
            return PIECE_PRICE;
        }
    }

    function mintNFT(uint256 quantity_, address inviter_) public payable {
        require(status == Status.Started || status == Status.Opened, "Sale has not started");
        require(tx.origin == msg.sender, "Contract calls are not allowed");
        require(quantity_ > 0, "At least one NFT must be minted");
        require(
            totalNFTMinted() + quantity_ <= MINT_SUPPLY,
            "Short minted supply(NFT)"
        );
        require(
            numberMinted(msg.sender) + quantity_ <= MAX_MINT_PER_ADDR,
            "This address has reached the limit of minting."
        );
        require(msg.value >= NFT_PRICE * quantity_, "Not enough ETH sent: check price.");

        uint256[] memory ids = new uint256[] (quantity_);
        uint256[] memory amounts = new uint256[] (quantity_);
        uint256 index = _currentMintNFTIndex;
        for (uint256 i = 0; i < quantity_; i++) {
            ids[i] = index;
            amounts[i] = 1;
            index ++;
        }
        _mintBatch(msg.sender, ids, amounts, "");
        _currentMintNFTIndex += quantity_;
        _addressData[msg.sender].nft_balance += uint64(quantity_);
        _addressData[msg.sender].nft_num_minted += uint64(quantity_);

        _refundIfOver(NFT_PRICE * quantity_);
        emit NFTMinted(msg.sender, quantity_, ids[0], inviter_);
    }

    function mintPiece(address inviter_) public payable {
        require(status == Status.Started || status == Status.Opened, "Sale has not started");
        require(tx.origin == msg.sender, "Contract calls are not allowed");
        require( 
            piecesMinted(ID_P1) + 
            piecesMinted(ID_P2) + 
            piecesMinted(ID_P3) + 
            piecesMinted(ID_P4) + 
            piecesMinted(ID_P5) < MAX_PIECES * 5, "Short minted supply(Pieces)");

        require(msg.value >= PIECE_PRICE, "Not enough ETH sent: check price.");

        uint8 random = _randomInFive();
        if (piecesMinted(random) == MAX_PIECES) {
            for (uint8 i = 0; i < 5; i++) {
                if (piecesMinted(i) < MAX_PIECES) {
                    random = i;
                    break;
                }
            }
        }
        _mint(msg.sender, random, 1, "");
        _piecesMinted[random] += 1;
        _addressData[msg.sender].piecesData[random] += 1;
        uint256 tokenId = random;

        _refundIfOver(PIECE_PRICE);
        emit PiecesMinted(msg.sender, 1, tokenId, inviter_);
    }

    function synthesize() public payable {
        require(status >= Status.Started, "Sale has not started");
        require(tx.origin == msg.sender, "Contract calls are not allowed");
        require(
            totalNFTSynthesized() <= SYN_SUPPLY,
            "Short synthesized NFT supply"
        );
        for(uint8 i = 0 ; i < 5 ; i ++) {
            if(_addressData[msg.sender].piecesData[i] <= 0) {
                revert PiecesNotEnoughToSynthesize();
            }
        }
        for (uint8 i = 0 ; i < 5 ; i ++) {
            _burn(msg.sender, i, 1);
            _addressData[msg.sender].piecesData[i] -= 1;
        }
        _synthesizeNFT();
    }

    function exchange(uint256 nft_id_) public payable {
        require(status >= Status.Started, "Sale has not started");
        require(tx.origin == msg.sender, "Contract calls are not allowed");
        require(balanceOf(msg.sender, nft_id_) > 0, "Address does not have any NFTs");
        require(nft_id_ >= _genesisNFTId(), "Cannot exchange a piece.");
        _burn(msg.sender, nft_id_, 1);
        _addressData[msg.sender].nft_balance -= 1;
        emit NFTExchanged(msg.sender, nft_id_);
    }

    function _synthesizeNFT() private {
        require(status >= Status.Started, "Sale has not started");
        require(tx.origin == msg.sender, "Contract calls are not allowed");
        require(
            totalNFTSynthesized() <= SYN_SUPPLY,
            "Short synthesized NFT supply"
        );
        uint256 tokenId = _currentSynNFTIndex;
        _mint(msg.sender, _currentSynNFTIndex, 1, "");
        _currentSynNFTIndex += 1;
        _addressData[msg.sender].nft_balance += 1;
        emit NFTSynthesized(msg.sender, tokenId);
    }

    function setStatus(Status status_) public onlyOwner {
        status = status_;
        emit StatusChanged(status);
    }

    function uri(uint256 tokenId_) public view virtual override returns (string memory) {
        if (tokenId_ < _genesisNFTId()) {
            return "https://bafybeie2mbntsrgcgiw3svgqutbz7ovtpfcxjuotu5mbhjy4s3xduiugry.ipfs.nftstorage.link/{id}.json";
        }
        return _baseURI;
    }

    function setURI(string calldata newURI_) public onlyOwner {
        _baseURI = newURI_;
        emit BaseURIChanged(newURI_);
    }

    function setMintSupply(uint16 mintSupply_) public onlyOwner {
        require(mintSupply_ > MINT_SUPPLY, "Mint supply value must be greater than original value");
        require(mintSupply_ <= 7200, "Mint supply value must be less than or equal 7200");
        MINT_SUPPLY = mintSupply_;
    }

    function setSynSupply(uint16 synSupply_) public onlyOwner {
        require(synSupply_ > SYN_SUPPLY, "Syn supply value must be greater than original value");
        require(synSupply_ <= 2800, "Syn supply value must be less than or equal 2800");
        SYN_SUPPLY = synSupply_;
    }

    function setMaxMintNumberPerAddress(uint8 maxMintNumber_) public onlyOwner {
        require(maxMintNumber_ > 0, "Value must greater than 0");
        require(maxMintNumber_ < 256, "Value must less than 256");
        MAX_MINT_PER_ADDR = maxMintNumber_;
    }

    function setMintPrice(uint256 mintPrice_) public onlyOwner {
        require(mintPrice_ > 0, "Mint price must be greater than 0");
        NFT_PRICE = mintPrice_;
    }

    function setPiecePrice(uint256 pPrice_) public onlyOwner {
        require(pPrice_ > 0, "Piece price must be greater than 0");
        PIECE_PRICE = pPrice_;
    }

    function _refundIfOver(uint256 price_) private {
        if (msg.value > price_) {
            payable(msg.sender).transfer(msg.value - price_);
        }
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        require(amount < 65536, "Amount cannot over 65536");
        _safeTransferFrom(from, to, id, amount, data);

        if (id < _genesisNFTId()) {
            _addressData[from].piecesData[uint8(id)] -= uint16(amount);
            _addressData[to].piecesData[uint8(id)] += uint16(amount);
        } else {
            _addressData[from].nft_balance -= uint16(amount);
            _addressData[to].nft_balance += uint16(amount);
        }
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            require(amounts[i] < 65536, "Amount cannot over 65536");
            if (ids[i] < _genesisNFTId()) {
                _addressData[from].piecesData[uint8(ids[i])] -= uint16(amounts[i]);
                _addressData[to].piecesData[uint8(ids[i])] += uint16(amounts[i]);
            } else {
                _addressData[from].nft_balance -= uint16(amounts[i]);
                _addressData[to].nft_balance += uint16(amounts[i]);
            }
        }
    }

    // Get a random number in 5
    function _randomInFive() private view returns (uint8) {
        uint256 x = uint256(keccak256(abi.encodePacked(
                    (block.timestamp) +
                    (block.difficulty) +
                    ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (block.timestamp)) +
                    (block.gaslimit) +
                    ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (block.timestamp)) +
                    (block.number)
                ))) % 5;
        return uint8(x);
    }

    function withdrawETH(address payable recipient_) external onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = recipient_.call{value: balance}("");
        require(success, "Withdraw successfully");
    }

    function withdrawSafeERC20Token(address tokenContract_, address payable recipient_, uint256 amount_) external onlyOwner {
        IERC20 tokenContract = IERC20(tokenContract_);
        tokenContract.safeTransfer(recipient_, amount_);
    }

    function airdropPieces(address receiver_, uint16 amount_) external onlyOwner {
        require(piecesMinted(ID_P1) < MAX_PIECES - amount_, "Short minted supply(Piece id: 0)");
        require(piecesMinted(ID_P2) < MAX_PIECES - amount_, "Short minted supply(Piece id: 1)");
        require(piecesMinted(ID_P3) < MAX_PIECES - amount_, "Short minted supply(Piece id: 2)");
        require(piecesMinted(ID_P4) < MAX_PIECES - amount_, "Short minted supply(Piece id: 3)");
        require(piecesMinted(ID_P5) < MAX_PIECES - amount_, "Short minted supply(Piece id: 4)");

        for (uint8 i = 0; i < 5; i ++) {
            _mint(receiver_, i, amount_, "");
            _piecesMinted[i] += amount_;
            _addressData[receiver_].piecesData[i] += amount_;
        }
        emit PiecesAirdropped(receiver_, amount_);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"PiecesNotEnoughToSynthesize","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"string","name":"newBaseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTExchanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstTokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"inviter","type":"address"}],"name":"NFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTSynthesized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PiecesAirdropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"inviter","type":"address"}],"name":"PiecesMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum XCART.Status","name":"status","type":"uint8"}],"name":"StatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"ID_P1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ID_P2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ID_P3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ID_P4","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ID_P5","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PIECES","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint16","name":"amount_","type":"uint16"}],"name":"airdropPieces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nft_id_","type":"uint256"}],"name":"exchange","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintNumberPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity_","type":"uint256"},{"internalType":"address","name":"inviter_","type":"address"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"inviter_","type":"address"}],"name":"mintPiece","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perAccountSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piecePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"pid","type":"uint8"}],"name":"piecesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"uint8","name":"maxMintNumber_","type":"uint8"}],"name":"setMaxMintNumberPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice_","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"mintSupply_","type":"uint16"}],"name":"setMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pPrice_","type":"uint256"}],"name":"setPiecePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum XCART.Status","name":"status_","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"synSupply_","type":"uint16"}],"name":"setSynSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI_","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum XCART.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"synthesize","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"totalMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFTMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFTSynthesized","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSynSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient_","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract_","type":"address"},{"internalType":"address payable","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdrawSafeERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052670254db1c224400006005556642ca8019c700006006556007805466ffffffffffffff1916661c2500000000021790553480156200004157600080fd5b506040516200469f3803806200469f83398101604081905262000064916200013f565b6040805180820190915260058152641610d0549560da1b60208201526200008b81620000c5565b506200009733620000d7565b6004620000a58282620002a3565b5060056008555060075465010000000000900461ffff166009556200036f565b6002620000d38282620002a3565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200015357600080fd5b82516001600160401b03808211156200016b57600080fd5b818501915085601f8301126200018057600080fd5b81518181111562000195576200019562000129565b604051601f8201601f19908116603f01168101908382118183101715620001c057620001c062000129565b816040528281528886848701011115620001d957600080fd5b600093505b82841015620001fd5784840186015181850187015292850192620001de565b600086848301015280965050505050505092915050565b600181811c908216806200022957607f821691505b6020821081036200024a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029e57600081815260208120601f850160051c81016020861015620002795750805b601f850160051c820191505b818110156200029a5782815560010162000285565b5050505b505050565b81516001600160401b03811115620002bf57620002bf62000129565b620002d781620002d0845462000214565b8462000250565b602080601f8311600181146200030f5760008415620002f65750858301515b600019600386901b1c1916600185901b1785556200029a565b600085815260208120601f198616915b8281101562000340578886015182559484019460019091019084016200031f565b50858210156200035f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b614320806200037f6000396000f3fe60806040526004361061025b5760003560e01c8063824ae8cb11610144578063bf2ce9a7116100b6578063e985e9c51161007a578063e985e9c5146106de578063f242432a14610727578063f2fde38b14610747578063f45b0e4a14610767578063f4a0a5281461077c578063fcb711331461079c57600080fd5b8063bf2ce9a714610665578063d50e391f14610685578063da9c3eb21461064d578063dc33e681146106a5578063e3ff09ea146106c557600080fd5b806393e136da1161010857806393e136da146105c9578063a22cb465146105f2578063aad63c7714610612578063b0b702d21461061a578063b38d32821461062f578063bd3459301461064d57600080fd5b8063824ae8cb14610518578063846b5b101461054c5780638588c7651461056157806385e0832c146105815780638da5cb5b146105a157600080fd5b806336840218116101dd57806353556559116101a15780635355655914610493578063669f5a51146104a657806368f317dd146104b9578063690d8320146104ce5780636dab915d146104ee578063715018a61461050357600080fd5b806336840218146103e457806348dbc0b1146103f75780634ba0a33c1461041e5780634e1273f4146104465780634ed6f0841461047357600080fd5b806318160ddd1161022457806318160ddd14610327578063200d2ed2146103565780632e49d78b146103845780632eb2c2d6146103a45780632f705c29146103c457600080fd5b8062fdd58e1461026057806301ffc9a71461029357806302fe5305146102c35780630d39fc81146102e55780630e89341c146102fa575b600080fd5b34801561026c57600080fd5b5061028061027b3660046134dd565b6107bc565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b506102b36102ae36600461351f565b610855565b604051901515815260200161028a565b3480156102cf57600080fd5b506102e36102de36600461353c565b6108a5565b005b3480156102f157600080fd5b50600554610280565b34801561030657600080fd5b5061031a6103153660046135ad565b6108f8565b60405161028a9190613616565b34801561033357600080fd5b50600754610100810461ffff908116630100000090920481169190910116610280565b34801561036257600080fd5b5060035461037790600160a01b900460ff1681565b60405161028a919061363f565b34801561039057600080fd5b506102e361039f366004613667565b6109b4565b3480156103b057600080fd5b506102e36103bf3660046137d1565b610a2e565b3480156103d057600080fd5b506102e36103df3660046135ad565b610d67565b6102e36103f236600461387e565b610dcf565b34801561040357600080fd5b5061040c600181565b60405160ff909116815260200161028a565b34801561042a57600080fd5b506007546009546501000000000090910461ffff169003610280565b34801561045257600080fd5b5061046661046136600461389b565b611155565b60405161028a91906139a2565b34801561047f57600080fd5b506102e361048e3660046139cc565b61127e565b6102e36104a13660046135ad565b61138e565b6102e36104b43660046139e7565b611534565b3480156104c557600080fd5b50600654610280565b3480156104da57600080fd5b506102e36104e936600461387e565b611978565b3480156104fa57600080fd5b5061040c600281565b34801561050f57600080fd5b506102e3611a20565b34801561052457600080fd5b50610280610533366004613a17565b60ff166000908152600b602052604090205461ffff1690565b34801561055857600080fd5b5061040c600381565b34801561056d57600080fd5b506102e361057c366004613a17565b611a34565b34801561058d57600080fd5b506007546301000000900461ffff16610280565b3480156105ad57600080fd5b506003546040516001600160a01b03909116815260200161028a565b3480156105d557600080fd5b506105df610af081565b60405161ffff909116815260200161028a565b3480156105fe57600080fd5b506102e361060d366004613a48565b611af9565b6102e3611b08565b34801561062657600080fd5b5061040c600081565b34801561063b57600080fd5b50600754610100900461ffff16610280565b34801561065957600080fd5b5060075460ff16610280565b34801561067157600080fd5b506102e3610680366004613a76565b611cbf565b34801561069157600080fd5b506102e36106a03660046139cc565b6120a9565b3480156106b157600080fd5b506102806106c036600461387e565b6121c1565b3480156106d157600080fd5b5060085460041901610280565b3480156106ea57600080fd5b506102b36106f9366004613aab565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561073357600080fd5b506102e3610742366004613ad9565b612216565b34801561075357600080fd5b506102e361076236600461387e565b612414565b34801561077357600080fd5b5061040c600481565b34801561078857600080fd5b506102e36107973660046135ad565b61248d565b3480156107a857600080fd5b506102e36107b7366004613b41565b6124f4565b60006001600160a01b03831661082c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061088657506001600160e01b031982166303a24d0760e21b145b8061084f57506301ffc9a760e01b6001600160e01b031983161461084f565b6108ad612517565b60046108ba828483613c02565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf682826040516108ec929190613cc1565b60405180910390a15050565b60606005821015610922576040518060a00160405280606281526020016142896062913992915050565b6004805461092f90613b82565b80601f016020809104026020016040519081016040528092919081815260200182805461095b90613b82565b80156109a85780601f1061097d576101008083540402835291602001916109a8565b820191906000526020600020905b81548152906001019060200180831161098b57829003601f168201915b50505050509050919050565b6109bc612517565b6003805482919060ff60a01b1916600160a01b83838111156109e0576109e0613629565b02179055507fafa725e7f44cadb687a7043853fa1a7e7b8f0da74ce87ec546e9420f04da8c1e600360149054906101000a900460ff16604051610a23919061363f565b60405180910390a150565b6001600160a01b038516331480610a4a5750610a4a85336106f9565b610a665760405162461bcd60e51b815260040161082390613cf0565b610a738585858585612571565b60005b8351811015610d5f5762010000838281518110610a9557610a95613d3f565b602002602001015110610ae55760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1031b0b73737ba1037bb32b9101b1a9a999b60411b6044820152606401610823565b6005848281518110610af957610af9613d3f565b60200260200101511015610c5c57828181518110610b1957610b19613d3f565b6020026020010151600a6000886001600160a01b03166001600160a01b031681526020019081526020016000206001016000868481518110610b5d57610b5d613d3f565b602002602001015160ff1660ff16815260200190815260200160002060008282829054906101000a900461ffff16610b959190613d6b565b92506101000a81548161ffff021916908361ffff160217905550828181518110610bc157610bc1613d3f565b6020026020010151600a6000876001600160a01b03166001600160a01b031681526020019081526020016000206001016000868481518110610c0557610c05613d3f565b602002602001015160ff1660ff16815260200190815260200160002060008282829054906101000a900461ffff16610c3d9190613d8d565b92506101000a81548161ffff021916908361ffff160217905550610d4f565b828181518110610c6e57610c6e613d3f565b6020908102919091018101516001600160a01b0388166000908152600a90925260408220805461ffff909216929091610cb19084906001600160401b0316613da8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550828181518110610ce757610ce7613d3f565b6020908102919091018101516001600160a01b0387166000908152600a90925260408220805461ffff909216929091610d2a9084906001600160401b0316613dc8565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b610d5881613de8565b9050610a76565b505050505050565b610d6f612517565b60008111610dca5760405162461bcd60e51b815260206004820152602260248201527f5069656365207072696365206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608401610823565b600655565b600160038054600160a01b900460ff1690811115610def57610def613629565b1480610e185750600260038054600160a01b900460ff1690811115610e1657610e16613629565b145b610e345760405162461bcd60e51b815260040161082390613e01565b323314610e535760405162461bcd60e51b815260040161082390613e2f565b610e60610af06005613e66565b600b6020527f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c784547f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e547fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634547f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf54600080527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765461ffff95861695948516949384169392831692610f339281169116613e8c565b610f3d9190613e8c565b610f479190613e8c565b610f519190613e8c565b10610f9e5760405162461bcd60e51b815260206004820152601b60248201527f53686f7274206d696e74656420737570706c79285069656365732900000000006044820152606401610823565b600654341015610fc05760405162461bcd60e51b815260040161082390613e9f565b6000610fca612705565b9050610af0610fec8260ff166000908152600b602052604090205461ffff1690565b036110425760005b60058160ff16101561104057610af06110208260ff166000908152600b602052604090205461ffff1690565b101561102e57809150611040565b8061103881613ee0565b915050610ff4565b505b611061338260ff166001604051806020016040528060008152506127fe565b60ff81166000908152600b6020526040812080546001929061108890849061ffff16613d8d565b82546101009290920a61ffff818102199093169183160217909155336000908152600a6020908152604080832060ff87168452600190810190925282208054919450926110d791859116613d8d565b92506101000a81548161ffff021916908361ffff16021790555060008160ff1690506111046006546128d8565b6040805160018152602081018390526001600160a01b03851681830152905133917fb03c0f461205c0ffc3656e1de19cf301143293a39ee173c14802240d382e97db919081900360600190a2505050565b606081518351146111ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610823565b600083516001600160401b038111156111d5576111d5613688565b6040519080825280602002602001820160405280156111fe578160200160208202803683370190505b50905060005b84518110156112765761124985828151811061122257611222613d3f565b602002602001015185838151811061123c5761123c613d3f565b60200260200101516107bc565b82828151811061125b5761125b613d3f565b602090810291909101015261126f81613de8565b9050611204565b509392505050565b611286612517565b60075461ffff6101009091048116908216116113015760405162461bcd60e51b815260206004820152603460248201527f53796e20737570706c792076616c7565206d7573742062652067726561746572604482015273207468616e206f726967696e616c2076616c756560601b6064820152608401610823565b610af08161ffff1611156113705760405162461bcd60e51b815260206004820152603060248201527f53796e20737570706c792076616c7565206d757374206265206c65737320746860448201526f0616e206f7220657175616c20323830360841b6064820152608401610823565b6007805461ffff9092166101000262ffff0019909216919091179055565b600160038054600160a01b900460ff16908111156113ae576113ae613629565b10156113cc5760405162461bcd60e51b815260040161082390613e01565b3233146113eb5760405162461bcd60e51b815260040161082390613e2f565b60006113f733836107bc565b116114445760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320646f6573206e6f74206861766520616e79204e46547300006044820152606401610823565b60058110156114955760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742065786368616e676520612070696563652e00000000000000006044820152606401610823565b6114a133826001612916565b336000908152600a602052604081208054600192906114ca9084906001600160401b0316613da8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550336001600160a01b03167fbb434b1cd27bbc829f8aab296f53fb35ce7d5a5c41265bbbde75caa9d04de1098260405161152991815260200190565b60405180910390a250565b600160038054600160a01b900460ff169081111561155457611554613629565b148061157d5750600260038054600160a01b900460ff169081111561157b5761157b613629565b145b6115995760405162461bcd60e51b815260040161082390613e01565b3233146115b85760405162461bcd60e51b815260040161082390613e2f565b600082116116085760405162461bcd60e51b815260206004820152601f60248201527f4174206c65617374206f6e65204e4654206d757374206265206d696e746564006044820152606401610823565b6007546301000000900461ffff16826116246008546004190190565b61162e9190613e8c565b111561167c5760405162461bcd60e51b815260206004820152601860248201527f53686f7274206d696e74656420737570706c79284e46542900000000000000006044820152606401610823565b60075460ff168261168c336121c1565b6116969190613e8c565b11156116fb5760405162461bcd60e51b815260206004820152602e60248201527f54686973206164647265737320686173207265616368656420746865206c696d60448201526d34ba1037b31036b4b73a34b7339760911b6064820152608401610823565b816005546117099190613eff565b3410156117285760405162461bcd60e51b815260040161082390613e9f565b6000826001600160401b0381111561174257611742613688565b60405190808252806020026020018201604052801561176b578160200160208202803683370190505b5090506000836001600160401b0381111561178857611788613688565b6040519080825280602002602001820160405280156117b1578160200160208202803683370190505b5060085490915060005b8581101561182157818482815181106117d6576117d6613d3f565b60200260200101818152505060018382815181106117f6576117f6613d3f565b60209081029190910101528161180b81613de8565b925050808061181990613de8565b9150506117bb565b5061183d33848460405180602001604052806000815250612a92565b846008600082825461184f9190613e8c565b9091555050336000908152600a60205260408120805487929061187c9084906001600160401b0316613dc8565b82546101009290920a6001600160401b03818102199093169183160217909155336000908152600a60205260409020805488935090916008916118c8918591600160401b900416613dc8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550611902856005546118fd9190613eff565b6128d8565b336001600160a01b03167f1b668b37a8626c6996f8ffdbb42aa7510af393a9bc7ba431e0b3cfb590bfffb1868560008151811061194157611941613d3f565b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a25050505050565b611980612517565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146119cd576040519150601f19603f3d011682016040523d82523d6000602084013e6119d2565b606091505b5050905080611a1b5760405162461bcd60e51b81526020600482015260156024820152745769746864726177207375636365737366756c6c7960581b6044820152606401610823565b505050565b611a28612517565b611a326000612bdd565b565b611a3c612517565b60008160ff1611611a8f5760405162461bcd60e51b815260206004820152601960248201527f56616c7565206d7573742067726561746572207468616e2030000000000000006044820152606401610823565b6101008160ff1610611ae35760405162461bcd60e51b815260206004820152601860248201527f56616c7565206d757374206c657373207468616e2032353600000000000000006044820152606401610823565b6007805460ff191660ff92909216919091179055565b611b04338383612c2f565b5050565b600160038054600160a01b900460ff1690811115611b2857611b28613629565b1015611b465760405162461bcd60e51b815260040161082390613e01565b323314611b655760405162461bcd60e51b815260040161082390613e2f565b60075460095461ffff61010083048116926501000000000090041690031115611bd05760405162461bcd60e51b815260206004820152601c60248201527f53686f72742073796e74686573697a6564204e465420737570706c79000000006044820152606401610823565b60005b60058160ff161015611c3357336000908152600a6020908152604080832060ff8516845260010190915290205461ffff16611c2157604051630e97e47b60e31b815260040160405180910390fd5b80611c2b81613ee0565b915050611bd3565b5060005b60058160ff161015611cb657611c52338260ff166001612916565b336000908152600a6020908152604080832060ff8516845260019081019092528220805491929091611c8990849061ffff16613d6b565b92506101000a81548161ffff021916908361ffff1602179055508080611cae90613ee0565b915050611c37565b50611a32612d0f565b611cc7612517565b611cd381610af0613d6b565b60008052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765461ffff918216911610611d535760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2030296044820152606401610823565b611d5f81610af0613d6b565b6001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5461ffff918216911610611de05760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2031296044820152606401610823565b611dec81610af0613d6b565b6002600052600b6020527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916345461ffff918216911610611e6d5760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2032296044820152606401610823565b611e7981610af0613d6b565b6003600052600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e5461ffff918216911610611efa5760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2033296044820152606401610823565b611f0681610af0613d6b565b6004600052600b6020527f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c7845461ffff918216911610611f875760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2034296044820152606401610823565b60005b60058160ff16101561206257611fb8838260ff168461ffff16604051806020016040528060008152506127fe565b60ff81166000908152600b602052604081208054849290611fde90849061ffff16613d8d565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0385166000908152600a6020908152604080832060ff8716845260010190915281208054869450909261203591859116613d8d565b92506101000a81548161ffff021916908361ffff160217905550808061205a90613ee0565b915050611f8a565b5060405161ffff821681526001600160a01b038316907feb2ffbfae0600f16164a99aa9cb85a4155660f64298d6a28c991f2e0e48315649060200160405180910390a25050565b6120b1612517565b60075461ffff630100000090910481169082161161212f5760405162461bcd60e51b815260206004820152603560248201527f4d696e7420737570706c792076616c7565206d7573742062652067726561746560448201527472207468616e206f726967696e616c2076616c756560581b6064820152608401610823565b611c208161ffff16111561219f5760405162461bcd60e51b815260206004820152603160248201527f4d696e7420737570706c792076616c7565206d757374206265206c6573732074604482015270068616e206f7220657175616c203732303607c1b6064820152608401610823565b6007805461ffff90921663010000000264ffff00000019909216919091179055565b60006001600160a01b0382166121ea576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b03166000908152600a6020526040902054600160401b90046001600160401b031690565b6001600160a01b038516331480612232575061223285336106f9565b61224e5760405162461bcd60e51b815260040161082390613cf0565b62010000821061229b5760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1031b0b73737ba1037bb32b9101b1a9a999b60411b6044820152606401610823565b6122a88585858585612e96565b6005831015612364576001600160a01b0385166000908152600a6020908152604080832060ff87168452600101909152812080548492906122ee90849061ffff16613d6b565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0386166000908152600a6020908152604080832060ff8916845260010190915281208054869450909261234591859116613d8d565b92506101000a81548161ffff021916908361ffff16021790555061240d565b6001600160a01b0385166000908152600a60205260408120805461ffff851692906123999084906001600160401b0316613da8565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b0386166000908152600a60205260408120805461ffff8716945090926123e891859116613dc8565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5050505050565b61241c612517565b6001600160a01b0381166124815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610823565b61248a81612bdd565b50565b612495612517565b600081116124ef5760405162461bcd60e51b815260206004820152602160248201527f4d696e74207072696365206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608401610823565b600555565b6124fc612517565b826125116001600160a01b0382168484612fc0565b50505050565b6003546001600160a01b03163314611a325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610823565b81518351146125925760405162461bcd60e51b815260040161082390613f16565b6001600160a01b0384166125b85760405162461bcd60e51b815260040161082390613f5e565b3360005b845181101561269f5760008582815181106125d9576125d9613d3f565b6020026020010151905060008583815181106125f7576125f7613d3f565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156126475760405162461bcd60e51b815260040161082390613fa3565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612684908490613e8c565b925050819055505050508061269890613de8565b90506125bc565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126ef929190613fed565b60405180910390a4610d5f818787878787613012565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190600590439042906034016040516020818303038152906040528051906020012060001c6127529190614031565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c6127979190614031565b6127a14442613e8c565b6127ab9190613e8c565b6127b59190613e8c565b6127bf9190613e8c565b6127c99190613e8c565b6040516020016127db91815260200190565b6040516020818303038152906040528051906020012060001c61084f9190614045565b6001600160a01b0384166128245760405162461bcd60e51b815260040161082390614059565b3360006128308561316d565b9050600061283d8561316d565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061286f908490613e8c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46128cf836000898989896131b8565b50505050505050565b8034111561248a57336108fc6128ee833461409a565b6040518115909202916000818181858888f19350505050158015611b04573d6000803e3d6000fd5b6001600160a01b0383166129785760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610823565b3360006129848461316d565b905060006129918461316d565b60408051602080820183526000918290528882528181528282206001600160a01b038b1683529052205490915084811015612a1a5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610823565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090526128cf565b6001600160a01b038416612ab85760405162461bcd60e51b815260040161082390614059565b8151835114612ad95760405162461bcd60e51b815260040161082390613f16565b3360005b8451811015612b7557838181518110612af857612af8613d3f565b6020026020010151600080878481518110612b1557612b15613d3f565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612b5d9190613e8c565b90915550819050612b6d81613de8565b915050612add565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612bc6929190613fed565b60405180910390a461240d81600087878787613012565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603612ca25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610823565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600160038054600160a01b900460ff1690811115612d2f57612d2f613629565b1015612d4d5760405162461bcd60e51b815260040161082390613e01565b323314612d6c5760405162461bcd60e51b815260040161082390613e2f565b60075460095461ffff61010083048116926501000000000090041690031115612dd75760405162461bcd60e51b815260206004820152601c60248201527f53686f72742073796e74686573697a6564204e465420737570706c79000000006044820152606401610823565b60006009549050612dfc336009546001604051806020016040528060008152506127fe565b600160096000828254612e0f9190613e8c565b9091555050336000908152600a60205260408120805460019290612e3d9084906001600160401b0316613dc8565b82546001600160401b039182166101009390930a92830291909202199091161790555060408051338152602081018390527fa02e3a67619b56f2ccc92d43d32d66a3b374a3406087c5ee99d7f43a69d90ffa9101610a23565b6001600160a01b038416612ebc5760405162461bcd60e51b815260040161082390613f5e565b336000612ec88561316d565b90506000612ed58561316d565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015612f185760405162461bcd60e51b815260040161082390613fa3565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612f55908490613e8c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612fb5848a8a8a8a8a6131b8565b505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a1b908490613273565b6001600160a01b0384163b15610d5f5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061305690899089908890889088906004016140ad565b6020604051808303816000875af1925050508015613091575060408051601f3d908101601f1916820190925261308e9181019061410b565b60015b61313d5761309d614128565b806308c379a0036130d657506130b1614144565b806130bc57506130d8565b8060405162461bcd60e51b81526004016108239190613616565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610823565b6001600160e01b0319811663bc197c8160e01b146128cf5760405162461bcd60e51b8152600401610823906141cd565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106131a7576131a7613d3f565b602090810291909101015292915050565b6001600160a01b0384163b15610d5f5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906131fc9089908990889088908890600401614215565b6020604051808303816000875af1925050508015613237575060408051601f3d908101601f191682019092526132349181019061410b565b60015b6132435761309d614128565b6001600160e01b0319811663f23a6e6160e01b146128cf5760405162461bcd60e51b8152600401610823906141cd565b60006132c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133459092919063ffffffff16565b805190915015611a1b57808060200190518101906132e6919061424f565b611a1b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610823565b6060613354848460008561335e565b90505b9392505050565b6060824710156133bf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610823565b6001600160a01b0385163b6134165760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610823565b600080866001600160a01b03168587604051613432919061426c565b60006040518083038185875af1925050503d806000811461346f576040519150601f19603f3d011682016040523d82523d6000602084013e613474565b606091505b509150915061348482828661348f565b979650505050505050565b6060831561349e575081613357565b8251156134ae5782518084602001fd5b8160405162461bcd60e51b81526004016108239190613616565b6001600160a01b038116811461248a57600080fd5b600080604083850312156134f057600080fd5b82356134fb816134c8565b946020939093013593505050565b6001600160e01b03198116811461248a57600080fd5b60006020828403121561353157600080fd5b813561335781613509565b6000806020838503121561354f57600080fd5b82356001600160401b038082111561356657600080fd5b818501915085601f83011261357a57600080fd5b81358181111561358957600080fd5b86602082850101111561359b57600080fd5b60209290920196919550909350505050565b6000602082840312156135bf57600080fd5b5035919050565b60005b838110156135e15781810151838201526020016135c9565b50506000910152565b600081518084526136028160208601602086016135c6565b601f01601f19169290920160200192915050565b60208152600061335760208301846135ea565b634e487b7160e01b600052602160045260246000fd5b602081016004831061366157634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561367957600080fd5b81356004811061335757600080fd5b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156136c3576136c3613688565b6040525050565b60006001600160401b038211156136e3576136e3613688565b5060051b60200190565b600082601f8301126136fe57600080fd5b8135602061370b826136ca565b604051613718828261369e565b83815260059390931b850182019282810191508684111561373857600080fd5b8286015b84811015613753578035835291830191830161373c565b509695505050505050565b600082601f83011261376f57600080fd5b81356001600160401b0381111561378857613788613688565b60405161379f601f8301601f19166020018261369e565b8181528460208386010111156137b457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156137e957600080fd5b85356137f4816134c8565b94506020860135613804816134c8565b935060408601356001600160401b038082111561382057600080fd5b61382c89838a016136ed565b9450606088013591508082111561384257600080fd5b61384e89838a016136ed565b9350608088013591508082111561386457600080fd5b506138718882890161375e565b9150509295509295909350565b60006020828403121561389057600080fd5b8135613357816134c8565b600080604083850312156138ae57600080fd5b82356001600160401b03808211156138c557600080fd5b818501915085601f8301126138d957600080fd5b813560206138e6826136ca565b6040516138f3828261369e565b83815260059390931b850182019282810191508984111561391357600080fd5b948201945b8386101561393a57853561392b816134c8565b82529482019490820190613918565b9650508601359250508082111561395057600080fd5b5061395d858286016136ed565b9150509250929050565b600081518084526020808501945080840160005b838110156139975781518752958201959082019060010161397b565b509495945050505050565b6020815260006133576020830184613967565b803561ffff811681146139c757600080fd5b919050565b6000602082840312156139de57600080fd5b613357826139b5565b600080604083850312156139fa57600080fd5b823591506020830135613a0c816134c8565b809150509250929050565b600060208284031215613a2957600080fd5b813560ff8116811461335757600080fd5b801515811461248a57600080fd5b60008060408385031215613a5b57600080fd5b8235613a66816134c8565b91506020830135613a0c81613a3a565b60008060408385031215613a8957600080fd5b8235613a94816134c8565b9150613aa2602084016139b5565b90509250929050565b60008060408385031215613abe57600080fd5b8235613ac9816134c8565b91506020830135613a0c816134c8565b600080600080600060a08688031215613af157600080fd5b8535613afc816134c8565b94506020860135613b0c816134c8565b9350604086013592506060860135915060808601356001600160401b03811115613b3557600080fd5b6138718882890161375e565b600080600060608486031215613b5657600080fd5b8335613b61816134c8565b92506020840135613b71816134c8565b929592945050506040919091013590565b600181811c90821680613b9657607f821691505b602082108103613bb657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611a1b57600081815260208120601f850160051c81016020861015613be35750805b601f850160051c820191505b81811015610d5f57828155600101613bef565b6001600160401b03831115613c1957613c19613688565b613c2d83613c278354613b82565b83613bbc565b6000601f841160018114613c615760008515613c495750838201355b600019600387901b1c1916600186901b17835561240d565b600083815260209020601f19861690835b82811015613c925786850135825560209485019460019092019101613c72565b5086821015613caf5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b61ffff828116828216039080821115613d8657613d86613d55565b5092915050565b61ffff818116838216019080821115613d8657613d86613d55565b6001600160401b03828116828216039080821115613d8657613d86613d55565b6001600160401b03818116838216019080821115613d8657613d86613d55565b600060018201613dfa57613dfa613d55565b5060010190565b60208082526014908201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b604082015260600190565b6020808252601e908201527f436f6e74726163742063616c6c7320617265206e6f7420616c6c6f7765640000604082015260600190565b61ffff818116838216028082169190828114613e8457613e84613d55565b505092915050565b8082018082111561084f5761084f613d55565b60208082526021908201527f4e6f7420656e6f756768204554482073656e743a20636865636b2070726963656040820152601760f91b606082015260800190565b600060ff821660ff8103613ef657613ef6613d55565b60010192915050565b808202811582820484141761084f5761084f613d55565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006140006040830185613967565b82810360208401526140128185613967565b95945050505050565b634e487b7160e01b600052601260045260246000fd5b6000826140405761404061401b565b500490565b6000826140545761405461401b565b500690565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b8181038181111561084f5761084f613d55565b6001600160a01b0386811682528516602082015260a0604082018190526000906140d990830186613967565b82810360608401526140eb8186613967565b905082810360808401526140ff81856135ea565b98975050505050505050565b60006020828403121561411d57600080fd5b815161335781613509565b600060033d11156141415760046000803e5060005160e01c5b90565b600060443d10156141525790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561418157505050505090565b82850191508151818111156141995750505050505090565b843d87010160208285010111156141b35750505050505090565b6141c26020828601018761369e565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613484908301846135ea565b60006020828403121561426157600080fd5b815161335781613a3a565b6000825161427e8184602087016135c6565b919091019291505056fe68747470733a2f2f6261667962656965326d626e747372676367697733737667717574627a376f7674706663786a756f7475356d62686a7934733378647569756772792e697066732e6e667473746f726167652e6c696e6b2f7b69647d2e6a736f6ea2646970667358221220b06f62de42e077f2c68f2e95729cd4e7bc67f095e8641dfe281c109431716cb364736f6c634300081100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6261666b72656967626f756a333773743468636d346a6a776876376f756c687136706c6177637a34746261726b766267326965756f72327a6a6e692e697066732e6e667473746f726167652e6c696e6b2f00000000000000

Deployed Bytecode

0x60806040526004361061025b5760003560e01c8063824ae8cb11610144578063bf2ce9a7116100b6578063e985e9c51161007a578063e985e9c5146106de578063f242432a14610727578063f2fde38b14610747578063f45b0e4a14610767578063f4a0a5281461077c578063fcb711331461079c57600080fd5b8063bf2ce9a714610665578063d50e391f14610685578063da9c3eb21461064d578063dc33e681146106a5578063e3ff09ea146106c557600080fd5b806393e136da1161010857806393e136da146105c9578063a22cb465146105f2578063aad63c7714610612578063b0b702d21461061a578063b38d32821461062f578063bd3459301461064d57600080fd5b8063824ae8cb14610518578063846b5b101461054c5780638588c7651461056157806385e0832c146105815780638da5cb5b146105a157600080fd5b806336840218116101dd57806353556559116101a15780635355655914610493578063669f5a51146104a657806368f317dd146104b9578063690d8320146104ce5780636dab915d146104ee578063715018a61461050357600080fd5b806336840218146103e457806348dbc0b1146103f75780634ba0a33c1461041e5780634e1273f4146104465780634ed6f0841461047357600080fd5b806318160ddd1161022457806318160ddd14610327578063200d2ed2146103565780632e49d78b146103845780632eb2c2d6146103a45780632f705c29146103c457600080fd5b8062fdd58e1461026057806301ffc9a71461029357806302fe5305146102c35780630d39fc81146102e55780630e89341c146102fa575b600080fd5b34801561026c57600080fd5b5061028061027b3660046134dd565b6107bc565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b506102b36102ae36600461351f565b610855565b604051901515815260200161028a565b3480156102cf57600080fd5b506102e36102de36600461353c565b6108a5565b005b3480156102f157600080fd5b50600554610280565b34801561030657600080fd5b5061031a6103153660046135ad565b6108f8565b60405161028a9190613616565b34801561033357600080fd5b50600754610100810461ffff908116630100000090920481169190910116610280565b34801561036257600080fd5b5060035461037790600160a01b900460ff1681565b60405161028a919061363f565b34801561039057600080fd5b506102e361039f366004613667565b6109b4565b3480156103b057600080fd5b506102e36103bf3660046137d1565b610a2e565b3480156103d057600080fd5b506102e36103df3660046135ad565b610d67565b6102e36103f236600461387e565b610dcf565b34801561040357600080fd5b5061040c600181565b60405160ff909116815260200161028a565b34801561042a57600080fd5b506007546009546501000000000090910461ffff169003610280565b34801561045257600080fd5b5061046661046136600461389b565b611155565b60405161028a91906139a2565b34801561047f57600080fd5b506102e361048e3660046139cc565b61127e565b6102e36104a13660046135ad565b61138e565b6102e36104b43660046139e7565b611534565b3480156104c557600080fd5b50600654610280565b3480156104da57600080fd5b506102e36104e936600461387e565b611978565b3480156104fa57600080fd5b5061040c600281565b34801561050f57600080fd5b506102e3611a20565b34801561052457600080fd5b50610280610533366004613a17565b60ff166000908152600b602052604090205461ffff1690565b34801561055857600080fd5b5061040c600381565b34801561056d57600080fd5b506102e361057c366004613a17565b611a34565b34801561058d57600080fd5b506007546301000000900461ffff16610280565b3480156105ad57600080fd5b506003546040516001600160a01b03909116815260200161028a565b3480156105d557600080fd5b506105df610af081565b60405161ffff909116815260200161028a565b3480156105fe57600080fd5b506102e361060d366004613a48565b611af9565b6102e3611b08565b34801561062657600080fd5b5061040c600081565b34801561063b57600080fd5b50600754610100900461ffff16610280565b34801561065957600080fd5b5060075460ff16610280565b34801561067157600080fd5b506102e3610680366004613a76565b611cbf565b34801561069157600080fd5b506102e36106a03660046139cc565b6120a9565b3480156106b157600080fd5b506102806106c036600461387e565b6121c1565b3480156106d157600080fd5b5060085460041901610280565b3480156106ea57600080fd5b506102b36106f9366004613aab565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561073357600080fd5b506102e3610742366004613ad9565b612216565b34801561075357600080fd5b506102e361076236600461387e565b612414565b34801561077357600080fd5b5061040c600481565b34801561078857600080fd5b506102e36107973660046135ad565b61248d565b3480156107a857600080fd5b506102e36107b7366004613b41565b6124f4565b60006001600160a01b03831661082c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061088657506001600160e01b031982166303a24d0760e21b145b8061084f57506301ffc9a760e01b6001600160e01b031983161461084f565b6108ad612517565b60046108ba828483613c02565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf682826040516108ec929190613cc1565b60405180910390a15050565b60606005821015610922576040518060a00160405280606281526020016142896062913992915050565b6004805461092f90613b82565b80601f016020809104026020016040519081016040528092919081815260200182805461095b90613b82565b80156109a85780601f1061097d576101008083540402835291602001916109a8565b820191906000526020600020905b81548152906001019060200180831161098b57829003601f168201915b50505050509050919050565b6109bc612517565b6003805482919060ff60a01b1916600160a01b83838111156109e0576109e0613629565b02179055507fafa725e7f44cadb687a7043853fa1a7e7b8f0da74ce87ec546e9420f04da8c1e600360149054906101000a900460ff16604051610a23919061363f565b60405180910390a150565b6001600160a01b038516331480610a4a5750610a4a85336106f9565b610a665760405162461bcd60e51b815260040161082390613cf0565b610a738585858585612571565b60005b8351811015610d5f5762010000838281518110610a9557610a95613d3f565b602002602001015110610ae55760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1031b0b73737ba1037bb32b9101b1a9a999b60411b6044820152606401610823565b6005848281518110610af957610af9613d3f565b60200260200101511015610c5c57828181518110610b1957610b19613d3f565b6020026020010151600a6000886001600160a01b03166001600160a01b031681526020019081526020016000206001016000868481518110610b5d57610b5d613d3f565b602002602001015160ff1660ff16815260200190815260200160002060008282829054906101000a900461ffff16610b959190613d6b565b92506101000a81548161ffff021916908361ffff160217905550828181518110610bc157610bc1613d3f565b6020026020010151600a6000876001600160a01b03166001600160a01b031681526020019081526020016000206001016000868481518110610c0557610c05613d3f565b602002602001015160ff1660ff16815260200190815260200160002060008282829054906101000a900461ffff16610c3d9190613d8d565b92506101000a81548161ffff021916908361ffff160217905550610d4f565b828181518110610c6e57610c6e613d3f565b6020908102919091018101516001600160a01b0388166000908152600a90925260408220805461ffff909216929091610cb19084906001600160401b0316613da8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550828181518110610ce757610ce7613d3f565b6020908102919091018101516001600160a01b0387166000908152600a90925260408220805461ffff909216929091610d2a9084906001600160401b0316613dc8565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b610d5881613de8565b9050610a76565b505050505050565b610d6f612517565b60008111610dca5760405162461bcd60e51b815260206004820152602260248201527f5069656365207072696365206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608401610823565b600655565b600160038054600160a01b900460ff1690811115610def57610def613629565b1480610e185750600260038054600160a01b900460ff1690811115610e1657610e16613629565b145b610e345760405162461bcd60e51b815260040161082390613e01565b323314610e535760405162461bcd60e51b815260040161082390613e2f565b610e60610af06005613e66565b600b6020527f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c784547f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e547fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634547f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf54600080527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765461ffff95861695948516949384169392831692610f339281169116613e8c565b610f3d9190613e8c565b610f479190613e8c565b610f519190613e8c565b10610f9e5760405162461bcd60e51b815260206004820152601b60248201527f53686f7274206d696e74656420737570706c79285069656365732900000000006044820152606401610823565b600654341015610fc05760405162461bcd60e51b815260040161082390613e9f565b6000610fca612705565b9050610af0610fec8260ff166000908152600b602052604090205461ffff1690565b036110425760005b60058160ff16101561104057610af06110208260ff166000908152600b602052604090205461ffff1690565b101561102e57809150611040565b8061103881613ee0565b915050610ff4565b505b611061338260ff166001604051806020016040528060008152506127fe565b60ff81166000908152600b6020526040812080546001929061108890849061ffff16613d8d565b82546101009290920a61ffff818102199093169183160217909155336000908152600a6020908152604080832060ff87168452600190810190925282208054919450926110d791859116613d8d565b92506101000a81548161ffff021916908361ffff16021790555060008160ff1690506111046006546128d8565b6040805160018152602081018390526001600160a01b03851681830152905133917fb03c0f461205c0ffc3656e1de19cf301143293a39ee173c14802240d382e97db919081900360600190a2505050565b606081518351146111ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610823565b600083516001600160401b038111156111d5576111d5613688565b6040519080825280602002602001820160405280156111fe578160200160208202803683370190505b50905060005b84518110156112765761124985828151811061122257611222613d3f565b602002602001015185838151811061123c5761123c613d3f565b60200260200101516107bc565b82828151811061125b5761125b613d3f565b602090810291909101015261126f81613de8565b9050611204565b509392505050565b611286612517565b60075461ffff6101009091048116908216116113015760405162461bcd60e51b815260206004820152603460248201527f53796e20737570706c792076616c7565206d7573742062652067726561746572604482015273207468616e206f726967696e616c2076616c756560601b6064820152608401610823565b610af08161ffff1611156113705760405162461bcd60e51b815260206004820152603060248201527f53796e20737570706c792076616c7565206d757374206265206c65737320746860448201526f0616e206f7220657175616c20323830360841b6064820152608401610823565b6007805461ffff9092166101000262ffff0019909216919091179055565b600160038054600160a01b900460ff16908111156113ae576113ae613629565b10156113cc5760405162461bcd60e51b815260040161082390613e01565b3233146113eb5760405162461bcd60e51b815260040161082390613e2f565b60006113f733836107bc565b116114445760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320646f6573206e6f74206861766520616e79204e46547300006044820152606401610823565b60058110156114955760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742065786368616e676520612070696563652e00000000000000006044820152606401610823565b6114a133826001612916565b336000908152600a602052604081208054600192906114ca9084906001600160401b0316613da8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550336001600160a01b03167fbb434b1cd27bbc829f8aab296f53fb35ce7d5a5c41265bbbde75caa9d04de1098260405161152991815260200190565b60405180910390a250565b600160038054600160a01b900460ff169081111561155457611554613629565b148061157d5750600260038054600160a01b900460ff169081111561157b5761157b613629565b145b6115995760405162461bcd60e51b815260040161082390613e01565b3233146115b85760405162461bcd60e51b815260040161082390613e2f565b600082116116085760405162461bcd60e51b815260206004820152601f60248201527f4174206c65617374206f6e65204e4654206d757374206265206d696e746564006044820152606401610823565b6007546301000000900461ffff16826116246008546004190190565b61162e9190613e8c565b111561167c5760405162461bcd60e51b815260206004820152601860248201527f53686f7274206d696e74656420737570706c79284e46542900000000000000006044820152606401610823565b60075460ff168261168c336121c1565b6116969190613e8c565b11156116fb5760405162461bcd60e51b815260206004820152602e60248201527f54686973206164647265737320686173207265616368656420746865206c696d60448201526d34ba1037b31036b4b73a34b7339760911b6064820152608401610823565b816005546117099190613eff565b3410156117285760405162461bcd60e51b815260040161082390613e9f565b6000826001600160401b0381111561174257611742613688565b60405190808252806020026020018201604052801561176b578160200160208202803683370190505b5090506000836001600160401b0381111561178857611788613688565b6040519080825280602002602001820160405280156117b1578160200160208202803683370190505b5060085490915060005b8581101561182157818482815181106117d6576117d6613d3f565b60200260200101818152505060018382815181106117f6576117f6613d3f565b60209081029190910101528161180b81613de8565b925050808061181990613de8565b9150506117bb565b5061183d33848460405180602001604052806000815250612a92565b846008600082825461184f9190613e8c565b9091555050336000908152600a60205260408120805487929061187c9084906001600160401b0316613dc8565b82546101009290920a6001600160401b03818102199093169183160217909155336000908152600a60205260409020805488935090916008916118c8918591600160401b900416613dc8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550611902856005546118fd9190613eff565b6128d8565b336001600160a01b03167f1b668b37a8626c6996f8ffdbb42aa7510af393a9bc7ba431e0b3cfb590bfffb1868560008151811061194157611941613d3f565b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a25050505050565b611980612517565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146119cd576040519150601f19603f3d011682016040523d82523d6000602084013e6119d2565b606091505b5050905080611a1b5760405162461bcd60e51b81526020600482015260156024820152745769746864726177207375636365737366756c6c7960581b6044820152606401610823565b505050565b611a28612517565b611a326000612bdd565b565b611a3c612517565b60008160ff1611611a8f5760405162461bcd60e51b815260206004820152601960248201527f56616c7565206d7573742067726561746572207468616e2030000000000000006044820152606401610823565b6101008160ff1610611ae35760405162461bcd60e51b815260206004820152601860248201527f56616c7565206d757374206c657373207468616e2032353600000000000000006044820152606401610823565b6007805460ff191660ff92909216919091179055565b611b04338383612c2f565b5050565b600160038054600160a01b900460ff1690811115611b2857611b28613629565b1015611b465760405162461bcd60e51b815260040161082390613e01565b323314611b655760405162461bcd60e51b815260040161082390613e2f565b60075460095461ffff61010083048116926501000000000090041690031115611bd05760405162461bcd60e51b815260206004820152601c60248201527f53686f72742073796e74686573697a6564204e465420737570706c79000000006044820152606401610823565b60005b60058160ff161015611c3357336000908152600a6020908152604080832060ff8516845260010190915290205461ffff16611c2157604051630e97e47b60e31b815260040160405180910390fd5b80611c2b81613ee0565b915050611bd3565b5060005b60058160ff161015611cb657611c52338260ff166001612916565b336000908152600a6020908152604080832060ff8516845260019081019092528220805491929091611c8990849061ffff16613d6b565b92506101000a81548161ffff021916908361ffff1602179055508080611cae90613ee0565b915050611c37565b50611a32612d0f565b611cc7612517565b611cd381610af0613d6b565b60008052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765461ffff918216911610611d535760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2030296044820152606401610823565b611d5f81610af0613d6b565b6001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5461ffff918216911610611de05760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2031296044820152606401610823565b611dec81610af0613d6b565b6002600052600b6020527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916345461ffff918216911610611e6d5760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2032296044820152606401610823565b611e7981610af0613d6b565b6003600052600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e5461ffff918216911610611efa5760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2033296044820152606401610823565b611f0681610af0613d6b565b6004600052600b6020527f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c7845461ffff918216911610611f875760405162461bcd60e51b815260206004820181905260248201527f53686f7274206d696e74656420737570706c792850696563652069643a2034296044820152606401610823565b60005b60058160ff16101561206257611fb8838260ff168461ffff16604051806020016040528060008152506127fe565b60ff81166000908152600b602052604081208054849290611fde90849061ffff16613d8d565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0385166000908152600a6020908152604080832060ff8716845260010190915281208054869450909261203591859116613d8d565b92506101000a81548161ffff021916908361ffff160217905550808061205a90613ee0565b915050611f8a565b5060405161ffff821681526001600160a01b038316907feb2ffbfae0600f16164a99aa9cb85a4155660f64298d6a28c991f2e0e48315649060200160405180910390a25050565b6120b1612517565b60075461ffff630100000090910481169082161161212f5760405162461bcd60e51b815260206004820152603560248201527f4d696e7420737570706c792076616c7565206d7573742062652067726561746560448201527472207468616e206f726967696e616c2076616c756560581b6064820152608401610823565b611c208161ffff16111561219f5760405162461bcd60e51b815260206004820152603160248201527f4d696e7420737570706c792076616c7565206d757374206265206c6573732074604482015270068616e206f7220657175616c203732303607c1b6064820152608401610823565b6007805461ffff90921663010000000264ffff00000019909216919091179055565b60006001600160a01b0382166121ea576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b03166000908152600a6020526040902054600160401b90046001600160401b031690565b6001600160a01b038516331480612232575061223285336106f9565b61224e5760405162461bcd60e51b815260040161082390613cf0565b62010000821061229b5760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1031b0b73737ba1037bb32b9101b1a9a999b60411b6044820152606401610823565b6122a88585858585612e96565b6005831015612364576001600160a01b0385166000908152600a6020908152604080832060ff87168452600101909152812080548492906122ee90849061ffff16613d6b565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0386166000908152600a6020908152604080832060ff8916845260010190915281208054869450909261234591859116613d8d565b92506101000a81548161ffff021916908361ffff16021790555061240d565b6001600160a01b0385166000908152600a60205260408120805461ffff851692906123999084906001600160401b0316613da8565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b0386166000908152600a60205260408120805461ffff8716945090926123e891859116613dc8565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5050505050565b61241c612517565b6001600160a01b0381166124815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610823565b61248a81612bdd565b50565b612495612517565b600081116124ef5760405162461bcd60e51b815260206004820152602160248201527f4d696e74207072696365206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608401610823565b600555565b6124fc612517565b826125116001600160a01b0382168484612fc0565b50505050565b6003546001600160a01b03163314611a325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610823565b81518351146125925760405162461bcd60e51b815260040161082390613f16565b6001600160a01b0384166125b85760405162461bcd60e51b815260040161082390613f5e565b3360005b845181101561269f5760008582815181106125d9576125d9613d3f565b6020026020010151905060008583815181106125f7576125f7613d3f565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156126475760405162461bcd60e51b815260040161082390613fa3565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612684908490613e8c565b925050819055505050508061269890613de8565b90506125bc565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126ef929190613fed565b60405180910390a4610d5f818787878787613012565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190600590439042906034016040516020818303038152906040528051906020012060001c6127529190614031565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c6127979190614031565b6127a14442613e8c565b6127ab9190613e8c565b6127b59190613e8c565b6127bf9190613e8c565b6127c99190613e8c565b6040516020016127db91815260200190565b6040516020818303038152906040528051906020012060001c61084f9190614045565b6001600160a01b0384166128245760405162461bcd60e51b815260040161082390614059565b3360006128308561316d565b9050600061283d8561316d565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061286f908490613e8c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46128cf836000898989896131b8565b50505050505050565b8034111561248a57336108fc6128ee833461409a565b6040518115909202916000818181858888f19350505050158015611b04573d6000803e3d6000fd5b6001600160a01b0383166129785760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610823565b3360006129848461316d565b905060006129918461316d565b60408051602080820183526000918290528882528181528282206001600160a01b038b1683529052205490915084811015612a1a5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610823565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090526128cf565b6001600160a01b038416612ab85760405162461bcd60e51b815260040161082390614059565b8151835114612ad95760405162461bcd60e51b815260040161082390613f16565b3360005b8451811015612b7557838181518110612af857612af8613d3f565b6020026020010151600080878481518110612b1557612b15613d3f565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612b5d9190613e8c565b90915550819050612b6d81613de8565b915050612add565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612bc6929190613fed565b60405180910390a461240d81600087878787613012565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603612ca25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610823565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600160038054600160a01b900460ff1690811115612d2f57612d2f613629565b1015612d4d5760405162461bcd60e51b815260040161082390613e01565b323314612d6c5760405162461bcd60e51b815260040161082390613e2f565b60075460095461ffff61010083048116926501000000000090041690031115612dd75760405162461bcd60e51b815260206004820152601c60248201527f53686f72742073796e74686573697a6564204e465420737570706c79000000006044820152606401610823565b60006009549050612dfc336009546001604051806020016040528060008152506127fe565b600160096000828254612e0f9190613e8c565b9091555050336000908152600a60205260408120805460019290612e3d9084906001600160401b0316613dc8565b82546001600160401b039182166101009390930a92830291909202199091161790555060408051338152602081018390527fa02e3a67619b56f2ccc92d43d32d66a3b374a3406087c5ee99d7f43a69d90ffa9101610a23565b6001600160a01b038416612ebc5760405162461bcd60e51b815260040161082390613f5e565b336000612ec88561316d565b90506000612ed58561316d565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015612f185760405162461bcd60e51b815260040161082390613fa3565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612f55908490613e8c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612fb5848a8a8a8a8a6131b8565b505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a1b908490613273565b6001600160a01b0384163b15610d5f5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061305690899089908890889088906004016140ad565b6020604051808303816000875af1925050508015613091575060408051601f3d908101601f1916820190925261308e9181019061410b565b60015b61313d5761309d614128565b806308c379a0036130d657506130b1614144565b806130bc57506130d8565b8060405162461bcd60e51b81526004016108239190613616565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610823565b6001600160e01b0319811663bc197c8160e01b146128cf5760405162461bcd60e51b8152600401610823906141cd565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106131a7576131a7613d3f565b602090810291909101015292915050565b6001600160a01b0384163b15610d5f5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906131fc9089908990889088908890600401614215565b6020604051808303816000875af1925050508015613237575060408051601f3d908101601f191682019092526132349181019061410b565b60015b6132435761309d614128565b6001600160e01b0319811663f23a6e6160e01b146128cf5760405162461bcd60e51b8152600401610823906141cd565b60006132c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133459092919063ffffffff16565b805190915015611a1b57808060200190518101906132e6919061424f565b611a1b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610823565b6060613354848460008561335e565b90505b9392505050565b6060824710156133bf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610823565b6001600160a01b0385163b6134165760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610823565b600080866001600160a01b03168587604051613432919061426c565b60006040518083038185875af1925050503d806000811461346f576040519150601f19603f3d011682016040523d82523d6000602084013e613474565b606091505b509150915061348482828661348f565b979650505050505050565b6060831561349e575081613357565b8251156134ae5782518084602001fd5b8160405162461bcd60e51b81526004016108239190613616565b6001600160a01b038116811461248a57600080fd5b600080604083850312156134f057600080fd5b82356134fb816134c8565b946020939093013593505050565b6001600160e01b03198116811461248a57600080fd5b60006020828403121561353157600080fd5b813561335781613509565b6000806020838503121561354f57600080fd5b82356001600160401b038082111561356657600080fd5b818501915085601f83011261357a57600080fd5b81358181111561358957600080fd5b86602082850101111561359b57600080fd5b60209290920196919550909350505050565b6000602082840312156135bf57600080fd5b5035919050565b60005b838110156135e15781810151838201526020016135c9565b50506000910152565b600081518084526136028160208601602086016135c6565b601f01601f19169290920160200192915050565b60208152600061335760208301846135ea565b634e487b7160e01b600052602160045260246000fd5b602081016004831061366157634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561367957600080fd5b81356004811061335757600080fd5b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156136c3576136c3613688565b6040525050565b60006001600160401b038211156136e3576136e3613688565b5060051b60200190565b600082601f8301126136fe57600080fd5b8135602061370b826136ca565b604051613718828261369e565b83815260059390931b850182019282810191508684111561373857600080fd5b8286015b84811015613753578035835291830191830161373c565b509695505050505050565b600082601f83011261376f57600080fd5b81356001600160401b0381111561378857613788613688565b60405161379f601f8301601f19166020018261369e565b8181528460208386010111156137b457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156137e957600080fd5b85356137f4816134c8565b94506020860135613804816134c8565b935060408601356001600160401b038082111561382057600080fd5b61382c89838a016136ed565b9450606088013591508082111561384257600080fd5b61384e89838a016136ed565b9350608088013591508082111561386457600080fd5b506138718882890161375e565b9150509295509295909350565b60006020828403121561389057600080fd5b8135613357816134c8565b600080604083850312156138ae57600080fd5b82356001600160401b03808211156138c557600080fd5b818501915085601f8301126138d957600080fd5b813560206138e6826136ca565b6040516138f3828261369e565b83815260059390931b850182019282810191508984111561391357600080fd5b948201945b8386101561393a57853561392b816134c8565b82529482019490820190613918565b9650508601359250508082111561395057600080fd5b5061395d858286016136ed565b9150509250929050565b600081518084526020808501945080840160005b838110156139975781518752958201959082019060010161397b565b509495945050505050565b6020815260006133576020830184613967565b803561ffff811681146139c757600080fd5b919050565b6000602082840312156139de57600080fd5b613357826139b5565b600080604083850312156139fa57600080fd5b823591506020830135613a0c816134c8565b809150509250929050565b600060208284031215613a2957600080fd5b813560ff8116811461335757600080fd5b801515811461248a57600080fd5b60008060408385031215613a5b57600080fd5b8235613a66816134c8565b91506020830135613a0c81613a3a565b60008060408385031215613a8957600080fd5b8235613a94816134c8565b9150613aa2602084016139b5565b90509250929050565b60008060408385031215613abe57600080fd5b8235613ac9816134c8565b91506020830135613a0c816134c8565b600080600080600060a08688031215613af157600080fd5b8535613afc816134c8565b94506020860135613b0c816134c8565b9350604086013592506060860135915060808601356001600160401b03811115613b3557600080fd5b6138718882890161375e565b600080600060608486031215613b5657600080fd5b8335613b61816134c8565b92506020840135613b71816134c8565b929592945050506040919091013590565b600181811c90821680613b9657607f821691505b602082108103613bb657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611a1b57600081815260208120601f850160051c81016020861015613be35750805b601f850160051c820191505b81811015610d5f57828155600101613bef565b6001600160401b03831115613c1957613c19613688565b613c2d83613c278354613b82565b83613bbc565b6000601f841160018114613c615760008515613c495750838201355b600019600387901b1c1916600186901b17835561240d565b600083815260209020601f19861690835b82811015613c925786850135825560209485019460019092019101613c72565b5086821015613caf5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b61ffff828116828216039080821115613d8657613d86613d55565b5092915050565b61ffff818116838216019080821115613d8657613d86613d55565b6001600160401b03828116828216039080821115613d8657613d86613d55565b6001600160401b03818116838216019080821115613d8657613d86613d55565b600060018201613dfa57613dfa613d55565b5060010190565b60208082526014908201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b604082015260600190565b6020808252601e908201527f436f6e74726163742063616c6c7320617265206e6f7420616c6c6f7765640000604082015260600190565b61ffff818116838216028082169190828114613e8457613e84613d55565b505092915050565b8082018082111561084f5761084f613d55565b60208082526021908201527f4e6f7420656e6f756768204554482073656e743a20636865636b2070726963656040820152601760f91b606082015260800190565b600060ff821660ff8103613ef657613ef6613d55565b60010192915050565b808202811582820484141761084f5761084f613d55565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006140006040830185613967565b82810360208401526140128185613967565b95945050505050565b634e487b7160e01b600052601260045260246000fd5b6000826140405761404061401b565b500490565b6000826140545761405461401b565b500690565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b8181038181111561084f5761084f613d55565b6001600160a01b0386811682528516602082015260a0604082018190526000906140d990830186613967565b82810360608401526140eb8186613967565b905082810360808401526140ff81856135ea565b98975050505050505050565b60006020828403121561411d57600080fd5b815161335781613509565b600060033d11156141415760046000803e5060005160e01c5b90565b600060443d10156141525790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561418157505050505090565b82850191508151818111156141995750505050505090565b843d87010160208285010111156141b35750505050505090565b6141c26020828601018761369e565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613484908301846135ea565b60006020828403121561426157600080fd5b815161335781613a3a565b6000825161427e8184602087016135c6565b919091019291505056fe68747470733a2f2f6261667962656965326d626e747372676367697733737667717574627a376f7674706663786a756f7475356d62686a7934733378647569756772792e697066732e6e667473746f726167652e6c696e6b2f7b69647d2e6a736f6ea2646970667358221220b06f62de42e077f2c68f2e95729cd4e7bc67f095e8641dfe281c109431716cb364736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6261666b72656967626f756a333773743468636d346a6a776876376f756c687136706c6177637a34746261726b766267326965756f72327a6a6e692e697066732e6e667473746f726167652e6c696e6b2f00000000000000

-----Decoded View---------------
Arg [0] : uri_ (string): https://bafkreigbouj37st4hcm4jjwhv7oulhq6plawcz4tbarkvbg2ieuor2zjni.ipfs.nftstorage.link/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [2] : 68747470733a2f2f6261666b72656967626f756a333773743468636d346a6a77
Arg [3] : 6876376f756c687136706c6177637a34746261726b766267326965756f72327a
Arg [4] : 6a6e692e697066732e6e667473746f726167652e6c696e6b2f00000000000000


Deployed Bytecode Sourcemap

51624:14000:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35930:230;;;;;;;;;;-1:-1:-1;35930:230:0;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;35930:230:0;;;;;;;;34953:310;;;;;;;;;;-1:-1:-1;34953:310:0;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;34953:310:0;1038:187:1;60409:134:0;;;;;;;;;;-1:-1:-1;60409:134:0;;;;;:::i;:::-;;:::i;:::-;;55438:121;;;;;;;;;;-1:-1:-1;55531:9:0;;55438:121;;60107:294;;;;;;;;;;-1:-1:-1;60107:294:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53855:139::-;;;;;;;;;;-1:-1:-1;53965:10:0;;;;;;;;;53951:11;;;;;;:24;;;;53944:31;53855:139;;52048:20;;;;;;;;;;-1:-1:-1;52048:20:0;;;;-1:-1:-1;;;52048:20:0;;;;;;;;;;;;;:::i;59975:124::-;;;;;;;;;;-1:-1:-1;59975:124:0;;;;;:::i;:::-;;:::i;62755:956::-;;;;;;;;;;-1:-1:-1;62755:956:0;;;;;:::i;:::-;;:::i;61604:166::-;;;;;;;;;;-1:-1:-1;61604:166:0;;;;;:::i;:::-;;:::i;57071:1134::-;;;;;;:::i;:::-;;:::i;52774:31::-;;;;;;;;;;;;52804:1;52774:31;;;;;6879:4:1;6867:17;;;6849:36;;6837:2;6822:18;52774:31:0;6707:184:1;54624:152:0;;;;;;;;;;-1:-1:-1;54750:7:0;;54728:19;;54750:7;;;;;;54728:29;;54624:152;;36326:524;;;;;;;;;;-1:-1:-1;36326:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60857:289::-;;;;;;;;;;-1:-1:-1;60857:289:0;;;;;:::i;:::-;;:::i;58900:506::-;;;;;;:::i;:::-;;:::i;55700:1363::-;;;;;;:::i;:::-;;:::i;55567:125::-;;;;;;;;;;-1:-1:-1;55662:11:0;;55567:125;;64286:243;;;;;;;;;;-1:-1:-1;64286:243:0;;;;;:::i;:::-;;:::i;52812:31::-;;;;;;;;;;;;52842:1;52812:31;;10578:103;;;;;;;;;;;;;:::i;55027:152::-;;;;;;;;;;-1:-1:-1;55027:152:0;;;;;:::i;:::-;55141:18;;55081:7;55141:18;;;:13;:18;;;;;;;;;55027:152;52850:31;;;;;;;;;;;;52880:1;52850:31;;61154:263;;;;;;;;;;-1:-1:-1;61154:263:0;;;;;:::i;:::-;;:::i;54002:130::-;;;;;;;;;;-1:-1:-1;54102:11:0;;;;;;;54002:130;;9930:87;;;;;;;;;;-1:-1:-1;10003:6:0;;9930:87;;-1:-1:-1;;;;;10003:6:0;;;10237:51:1;;10225:2;10210:18;9930:87:0;10091:203:1;52928:40:0;;;;;;;;;;;;52964:4;52928:40;;;;;10473:6:1;10461:19;;;10443:38;;10431:2;10416:18;52928:40:0;10299:188:1;36923:155:0;;;;;;;;;;-1:-1:-1;36923:155:0;;;;;:::i;:::-;;:::i;58213:679::-;;;:::i;52736:31::-;;;;;;;;;;;;52766:1;52736:31;;54140:128;;;;;;;;;;-1:-1:-1;54239:10:0;;;;;;;54140:128;;54825:153;;;;;;;;;;-1:-1:-1;54941:17:0;;;;54825:153;;64787:834;;;;;;;;;;-1:-1:-1;64787:834:0;;;;;:::i;:::-;;:::i;60551:298::-;;;;;;;;;;-1:-1:-1;60551:298:0;;;;;:::i;:::-;;:::i;55187:209::-;;;;;;;;;;-1:-1:-1;55187:209:0;;;;;:::i;:::-;;:::i;54460:156::-;;;;;;;;;;-1:-1:-1;54559:20:0;;-1:-1:-1;;54559:38:0;54460:156;;37150:168;;;;;;;;;;-1:-1:-1;37150:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;37273:27:0;;;37249:4;37273:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;37150:168;61950:797;;;;;;;;;;-1:-1:-1;61950:797:0;;;;;:::i;:::-;;:::i;10836:201::-;;;;;;;;;;-1:-1:-1;10836:201:0;;;;;:::i;:::-;;:::i;52888:31::-;;;;;;;;;;;;52918:1;52888:31;;61425:171;;;;;;;;;;-1:-1:-1;61425:171:0;;;;;:::i;:::-;;:::i;64537:242::-;;;;;;;;;;-1:-1:-1;64537:242:0;;;;;:::i;:::-;;:::i;35930:230::-;36016:7;-1:-1:-1;;;;;36044:21:0;;36036:76;;;;-1:-1:-1;;;36036:76:0;;13129:2:1;36036:76:0;;;13111:21:1;13168:2;13148:18;;;13141:30;13207:34;13187:18;;;13180:62;-1:-1:-1;;;13258:18:1;;;13251:40;13308:19;;36036:76:0;;;;;;;;;-1:-1:-1;36130:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;36130:22:0;;;;;;;;;;35930:230;;;;;:::o;34953:310::-;35055:4;-1:-1:-1;;;;;;35092:41:0;;-1:-1:-1;;;35092:41:0;;:110;;-1:-1:-1;;;;;;;35150:52:0;;-1:-1:-1;;;35150:52:0;35092:110;:163;;;-1:-1:-1;;;;;;;;;;26343:40:0;;;35219:36;26234:157;60409:134;9816:13;:11;:13::i;:::-;60478:8:::1;:18;60489:7:::0;;60478:8;:18:::1;:::i;:::-;;60512:23;60527:7;;60512:23;;;;;;;:::i;:::-;;;;;;;;60409:134:::0;;:::o;60107:294::-;60176:13;53838:1;60206:8;:26;60202:166;;;60249:107;;;;;;;;;;;;;;;;;;60107:294;-1:-1:-1;;60107:294:0:o;60202:166::-;60385:8;60378:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60107:294;;;:::o;59975:124::-;9816:13;:11;:13::i;:::-;60038:6:::1;:16:::0;;60047:7;;60038:6;-1:-1:-1;;;;60038:16:0::1;-1:-1:-1::0;;;60047:7:0;60038:16;;::::1;;;;;;:::i;:::-;;;;;;60070:21;60084:6;;;;;;;;;;;60070:21;;;;;;:::i;:::-;;;;;;;;59975:124:::0;:::o;62755:956::-;-1:-1:-1;;;;;62980:20:0;;8561:10;62980:20;;:60;;-1:-1:-1;63004:36:0;63021:4;8561:10;37150:168;:::i;63004:36::-;62958:157;;;;-1:-1:-1;;;62958:157:0;;;;;;;:::i;:::-;63126:52;63149:4;63155:2;63159:3;63164:7;63173:4;63126:22;:52::i;:::-;63196:9;63191:513;63215:3;:10;63211:1;:14;63191:513;;;63268:5;63255:7;63263:1;63255:10;;;;;;;;:::i;:::-;;;;;;;:18;63247:55;;;;-1:-1:-1;;;63247:55:0;;16926:2:1;63247:55:0;;;16908:21:1;16965:2;16945:18;;;16938:30;-1:-1:-1;;;16984:18:1;;;16977:54;17048:18;;63247:55:0;16724:348:1;63247:55:0;53838:1;63321:3;63325:1;63321:6;;;;;;;;:::i;:::-;;;;;;;:24;63317:376;;;63421:7;63429:1;63421:10;;;;;;;;:::i;:::-;;;;;;;63366:12;:18;63379:4;-1:-1:-1;;;;;63366:18:0;-1:-1:-1;;;;;63366:18:0;;;;;;;;;;;;:29;;:44;63402:3;63406:1;63402:6;;;;;;;;:::i;:::-;;;;;;;63366:44;;;;;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;63504:7;63512:1;63504:10;;;;;;;;:::i;:::-;;;;;;;63451:12;:16;63464:2;-1:-1:-1;;;;;63451:16:0;-1:-1:-1;;;;;63451:16:0;;;;;;;;;;;;:27;;:42;63485:3;63489:1;63485:6;;;;;;;;:::i;:::-;;;;;;;63451:42;;;;;;;;;;;;;;;;:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;63317:376;;;63597:7;63605:1;63597:10;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;63556:18:0;;;;;;:12;:18;;;;;;:52;;;;;;;:18;;:52;;;;-1:-1:-1;;;;;63556:52:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;63556:52:0;;;;;-1:-1:-1;;;;;63556:52:0;;;;;;63666:7;63674:1;63666:10;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;63627:16:0;;;;;;:12;:16;;;;;;:50;;;;;;;:16;;:50;;;;-1:-1:-1;;;;;63627:50:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;63627:50:0;;;;;-1:-1:-1;;;;;63627:50:0;;;;;;63317:376;63227:3;;;:::i;:::-;;;63191:513;;;;62755:956;;;;;:::o;61604:166::-;9816:13;:11;:13::i;:::-;61690:1:::1;61680:7;:11;61672:58;;;::::0;-1:-1:-1;;;61672:58:0;;18273:2:1;61672:58:0::1;::::0;::::1;18255:21:1::0;18312:2;18292:18;;;18285:30;18351:34;18331:18;;;18324:62;-1:-1:-1;;;18402:18:1;;;18395:32;18444:19;;61672:58:0::1;18071:398:1::0;61672:58:0::1;61741:11;:21:::0;61604:166::o;57071:1134::-;57152:14;57142:6;;;-1:-1:-1;;;57142:6:0;;;;;:24;;;;;;;:::i;:::-;;:51;;;-1:-1:-1;57180:13:0;57170:6;;;-1:-1:-1;;;57170:6:0;;;;;:23;;;;;;;:::i;:::-;;57142:51;57134:84;;;;-1:-1:-1;;;57134:84:0;;;;;;;:::i;:::-;57237:9;57250:10;57237:23;57229:66;;;;-1:-1:-1;;;57229:66:0;;;;;;;:::i;:::-;57495:14;52964:4;57508:1;57495:14;:::i;:::-;55141:13;:18;;;;;;;;;;55081:7;55141:18;;;;57329:180;;;;;55141:18;;;;;;;;;;;;57329:55;;55141:18;;;;57329:55;:::i;:::-;:91;;;;:::i;:::-;:127;;;;:::i;:::-;:163;;;;:::i;:::-;:180;57306:235;;;;-1:-1:-1;;;57306:235:0;;19764:2:1;57306:235:0;;;19746:21:1;19803:2;19783:18;;;19776:30;19842:29;19822:18;;;19815:57;19889:18;;57306:235:0;19562:351:1;57306:235:0;57575:11;;57562:9;:24;;57554:70;;;;-1:-1:-1;;;57554:70:0;;;;;;;:::i;:::-;57637:12;57652:15;:13;:15::i;:::-;57637:30;-1:-1:-1;52964:4:0;57682:20;57637:30;55141:18;;55081:7;55141:18;;;:13;:18;;;;;;;;;55027:152;57682:20;:34;57678:245;;57738:7;57733:179;57755:1;57751;:5;;;57733:179;;;52964:4;57786:15;57799:1;55141:18;;55081:7;55141:18;;;:13;:18;;;;;;;;;55027:152;57786:15;:28;57782:115;;;57848:1;57839:10;;57872:5;;57782:115;57758:3;;;;:::i;:::-;;;;57733:179;;;;57678:245;57933:32;57939:10;57951:6;57933:32;;57959:1;57933:32;;;;;;;;;;;;:5;:32::i;:::-;57976:21;;;;;;;:13;:21;;;;;:26;;58001:1;;57976:21;:26;;58001:1;;57976:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;58026:10;-1:-1:-1;58013:24:0;;;:12;:24;;;;;;;;:43;;;;;-1:-1:-1;58013:35:0;;;:43;;;;;:48;;-1:-1:-1;;;58013:43:0;:48;;-1:-1:-1;;58013:48:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58072:15;58090:6;58072:24;;;;58109:26;58123:11;;58109:13;:26::i;:::-;58151:46;;;58176:1;20710:25:1;;20766:2;20751:18;;20744:34;;;-1:-1:-1;;;;;20814:32:1;;20794:18;;;20787:60;58151:46:0;;58164:10;;58151:46;;;;;;20698:2:1;58151:46:0;;;57123:1082;;57071:1134;:::o;36326:524::-;36482:16;36543:3;:10;36524:8;:15;:29;36516:83;;;;-1:-1:-1;;;36516:83:0;;21060:2:1;36516:83:0;;;21042:21:1;21099:2;21079:18;;;21072:30;21138:34;21118:18;;;21111:62;-1:-1:-1;;;21189:18:1;;;21182:39;21238:19;;36516:83:0;20858:405:1;36516:83:0;36612:30;36659:8;:15;-1:-1:-1;;;;;36645:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36645:30:0;;36612:63;;36693:9;36688:122;36712:8;:15;36708:1;:19;36688:122;;;36768:30;36778:8;36787:1;36778:11;;;;;;;;:::i;:::-;;;;;;;36791:3;36795:1;36791:6;;;;;;;;:::i;:::-;;;;;;;36768:9;:30::i;:::-;36749:13;36763:1;36749:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;36729:3;;;:::i;:::-;;;36688:122;;;-1:-1:-1;36829:13:0;36326:524;-1:-1:-1;;;36326:524:0:o;60857:289::-;9816:13;:11;:13::i;:::-;60947:10:::1;::::0;::::1;;::::0;;::::1;::::0;::::1;60934:23:::0;;::::1;;60926:88;;;::::0;-1:-1:-1;;;60926:88:0;;21470:2:1;60926:88:0::1;::::0;::::1;21452:21:1::0;21509:2;21489:18;;;21482:30;21548:34;21528:18;;;21521:62;-1:-1:-1;;;21599:18:1;;;21592:50;21659:19;;60926:88:0::1;21268:416:1::0;60926:88:0::1;61047:4;61033:10;:18;;;;61025:79;;;::::0;-1:-1:-1;;;61025:79:0;;21891:2:1;61025:79:0::1;::::0;::::1;21873:21:1::0;21930:2;21910:18;;;21903:30;21969:34;21949:18;;;21942:62;-1:-1:-1;;;22020:18:1;;;22013:46;22076:19;;61025:79:0::1;21689:412:1::0;61025:79:0::1;61115:10;:23:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;61115:23:0;;::::1;::::0;;;::::1;::::0;;60857:289::o;58900:506::-;58979:14;58969:6;;;-1:-1:-1;;;58969:6:0;;;;;:24;;;;;;;:::i;:::-;;;58961:57;;;;-1:-1:-1;;;58961:57:0;;;;;;;:::i;:::-;59037:9;59050:10;59037:23;59029:66;;;;-1:-1:-1;;;59029:66:0;;;;;;;:::i;:::-;59147:1;59114:30;59124:10;59136:7;59114:9;:30::i;:::-;:34;59106:77;;;;-1:-1:-1;;;59106:77:0;;22308:2:1;59106:77:0;;;22290:21:1;22347:2;22327:18;;;22320:30;22386:32;22366:18;;;22359:60;22436:18;;59106:77:0;22106:354:1;59106:77:0;53838:1;59202:7;:26;;59194:63;;;;-1:-1:-1;;;59194:63:0;;22667:2:1;59194:63:0;;;22649:21:1;22706:2;22686:18;;;22679:30;22745:26;22725:18;;;22718:54;22789:18;;59194:63:0;22465:348:1;59194:63:0;59268:29;59274:10;59286:7;59295:1;59268:5;:29::i;:::-;59321:10;59308:24;;;;:12;:24;;;;;:41;;59348:1;;59308:24;:41;;59348:1;;-1:-1:-1;;;;;59308:41:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;59308:41:0;;;;;-1:-1:-1;;;;;59308:41:0;;;;;;59378:10;-1:-1:-1;;;;;59365:33:0;;59390:7;59365:33;;;;616:25:1;;604:2;589:18;;470:177;59365:33:0;;;;;;;;58900:506;:::o;55700:1363::-;55798:14;55788:6;;;-1:-1:-1;;;55788:6:0;;;;;:24;;;;;;;:::i;:::-;;:51;;;-1:-1:-1;55826:13:0;55816:6;;;-1:-1:-1;;;55816:6:0;;;;;:23;;;;;;;:::i;:::-;;55788:51;55780:84;;;;-1:-1:-1;;;55780:84:0;;;;;;;:::i;:::-;55883:9;55896:10;55883:23;55875:66;;;;-1:-1:-1;;;55875:66:0;;;;;;;:::i;:::-;55972:1;55960:9;:13;55952:57;;;;-1:-1:-1;;;55952:57:0;;23020:2:1;55952:57:0;;;23002:21:1;23059:2;23039:18;;;23032:30;23098:33;23078:18;;;23071:61;23149:18;;55952:57:0;22818:355:1;55952:57:0;56074:11;;;;;;;56061:9;56042:16;54559:20;;-1:-1:-1;;54559:38:0;;54460:156;56042:16;:28;;;;:::i;:::-;:43;;56020:117;;;;-1:-1:-1;;;56020:117:0;;23380:2:1;56020:117:0;;;23362:21:1;23419:2;23399:18;;;23392:30;23458:26;23438:18;;;23431:54;23502:18;;56020:117:0;23178:348:1;56020:117:0;56210:17;;;;56197:9;56170:24;56183:10;56170:12;:24::i;:::-;:36;;;;:::i;:::-;:57;;56148:153;;;;-1:-1:-1;;;56148:153:0;;23733:2:1;56148:153:0;;;23715:21:1;23772:2;23752:18;;;23745:30;23811:34;23791:18;;;23784:62;-1:-1:-1;;;23862:18:1;;;23855:44;23916:19;;56148:153:0;23531:410:1;56148:153:0;56345:9;56333;;:21;;;;:::i;:::-;56320:9;:34;;56312:80;;;;-1:-1:-1;;;56312:80:0;;;;;;;:::i;:::-;56405:20;56443:9;-1:-1:-1;;;;;56428:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56428:25:0;;56405:48;;56464:24;56506:9;-1:-1:-1;;;;;56491:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56491:25:0;-1:-1:-1;56543:20:0;;56464:52;;-1:-1:-1;56527:13:0;56574:133;56598:9;56594:1;:13;56574:133;;;56638:5;56629:3;56633:1;56629:6;;;;;;;;:::i;:::-;;;;;;:14;;;;;56671:1;56658:7;56666:1;56658:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;56687:8;;;;:::i;:::-;;;;56609:3;;;;;:::i;:::-;;;;56574:133;;;;56717:40;56728:10;56740:3;56745:7;56717:40;;;;;;;;;;;;:10;:40::i;:::-;56792:9;56768:20;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;56825:10:0;56812:24;;;;:12;:24;;;;;:57;;56859:9;;56812:24;:57;;56859:9;;-1:-1:-1;;;;;56812:57:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;56812:57:0;;;;;;;;;;;;;;;56893:10;-1:-1:-1;56880:24:0;;;:12;:24;;;;;:60;;56930:9;;-1:-1:-1;56880:24:0;;:39;;:60;;56930:9;;-1:-1:-1;;;56880:60:0;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;56880:60:0;;;;;-1:-1:-1;;;;;56880:60:0;;;;;;56953:36;56979:9;56967;;:21;;;;:::i;:::-;56953:13;:36::i;:::-;57015:10;-1:-1:-1;;;;;57005:50:0;;57027:9;57038:3;57042:1;57038:6;;;;;;;;:::i;:::-;;;;;;;;;;;;57005:50;;;20710:25:1;;;20751:18;;;20744:34;-1:-1:-1;;;;;20814:32:1;;20794:18;;;20787:60;20698:2;20683:18;57005:50:0;;;;;;;55769:1294;;;55700:1363;;:::o;64286:243::-;9816:13;:11;:13::i;:::-;64434:35:::1;::::0;64383:21:::1;::::0;64365:15:::1;::::0;-1:-1:-1;;;;;64434:15:0;::::1;::::0;64383:21;;64365:15;64434:35;64365:15;64434:35;64383:21;64434:15;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64415:54;;;64488:7;64480:41;;;::::0;-1:-1:-1;;;64480:41:0;;24881:2:1;64480:41:0::1;::::0;::::1;24863:21:1::0;24920:2;24900:18;;;24893:30;-1:-1:-1;;;24939:18:1;;;24932:51;25000:18;;64480:41:0::1;24679:345:1::0;64480:41:0::1;64354:175;;64286:243:::0;:::o;10578:103::-;9816:13;:11;:13::i;:::-;10643:30:::1;10670:1;10643:18;:30::i;:::-;10578:103::o:0;61154:263::-;9816:13;:11;:13::i;:::-;61265:1:::1;61248:14;:18;;;61240:56;;;::::0;-1:-1:-1;;;61240:56:0;;25231:2:1;61240:56:0::1;::::0;::::1;25213:21:1::0;25270:2;25250:18;;;25243:30;25309:27;25289:18;;;25282:55;25354:18;;61240:56:0::1;25029:349:1::0;61240:56:0::1;61332:3;61315:14;:20;;;61307:57;;;::::0;-1:-1:-1;;;61307:57:0;;25585:2:1;61307:57:0::1;::::0;::::1;25567:21:1::0;25624:2;25604:18;;;25597:30;25663:26;25643:18;;;25636:54;25707:18;;61307:57:0::1;25383:348:1::0;61307:57:0::1;61375:17;:34:::0;;-1:-1:-1;;61375:34:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;61154:263::o;36923:155::-;37018:52;8561:10;37051:8;37061;37018:18;:52::i;:::-;36923:155;;:::o;58213:679::-;58279:14;58269:6;;;-1:-1:-1;;;58269:6:0;;;;;:24;;;;;;;:::i;:::-;;;58261:57;;;;-1:-1:-1;;;58261:57:0;;;;;;;:::i;:::-;58337:9;58350:10;58337:23;58329:66;;;;-1:-1:-1;;;58329:66:0;;;;;;;:::i;:::-;58453:10;;54728:19;;58453:10;;;;;;;54750:7;;;;54728:29;;58428:35;;58406:113;;;;-1:-1:-1;;;58406:113:0;;25938:2:1;58406:113:0;;;25920:21:1;25977:2;25957:18;;;25950:30;26016;25996:18;;;25989:58;26064:18;;58406:113:0;25736:352:1;58406:113:0;58534:7;58530:177;58552:1;58548;:5;;;58530:177;;;58593:10;58622:1;58580:24;;;:12;:24;;;;;;;;:38;;;;;:35;;:38;;;;;;;;58577:119;;58651:29;;-1:-1:-1;;;58651:29:0;;;;;;;;;;;58577:119;58556:4;;;;:::i;:::-;;;;58530:177;;;;58722:7;58717:141;58740:1;58736;:5;;;58717:141;;;58765:23;58771:10;58783:1;58765:23;;58786:1;58765:5;:23::i;:::-;58816:10;58803:24;;;;:12;:24;;;;;;;;:38;;;;;58845:1;58803:35;;;:38;;;;;:43;;58845:1;;58803:38;;:43;;58845:1;;58803:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58744:4;;;;;:::i;:::-;;;;58717:141;;;;58868:16;:14;:16::i;64787:834::-;9816:13;:11;:13::i;:::-;64905:20:::1;64918:7:::0;52964:4:::1;64905:20;:::i;:::-;52766:1;55141:18:::0;;:13;:18;;;;64883:42:::1;::::0;;::::1;::::0;55141:18;64883:42:::1;64875:87;;;::::0;-1:-1:-1;;;64875:87:0;;26295:2:1;64875:87:0::1;::::0;::::1;26277:21:1::0;;;26314:18;;;26307:30;26373:34;26353:18;;;26346:62;26425:18;;64875:87:0::1;26093:356:1::0;64875:87:0::1;65003:20;65016:7:::0;52964:4:::1;65003:20;:::i;:::-;52804:1;55081:7:::0;55141:18;:13;:18;;;;64981:42:::1;::::0;;::::1;::::0;55141:18;64981:42:::1;64973:87;;;::::0;-1:-1:-1;;;64973:87:0;;26656:2:1;64973:87:0::1;::::0;::::1;26638:21:1::0;;;26675:18;;;26668:30;26734:34;26714:18;;;26707:62;26786:18;;64973:87:0::1;26454:356:1::0;64973:87:0::1;65101:20;65114:7:::0;52964:4:::1;65101:20;:::i;:::-;52842:1;55081:7:::0;55141:18;:13;:18;;;;65079:42:::1;::::0;;::::1;::::0;55141:18;65079:42:::1;65071:87;;;::::0;-1:-1:-1;;;65071:87:0;;27017:2:1;65071:87:0::1;::::0;::::1;26999:21:1::0;;;27036:18;;;27029:30;27095:34;27075:18;;;27068:62;27147:18;;65071:87:0::1;26815:356:1::0;65071:87:0::1;65199:20;65212:7:::0;52964:4:::1;65199:20;:::i;:::-;52880:1;55081:7:::0;55141:18;:13;:18;;;;65177:42:::1;::::0;;::::1;::::0;55141:18;65177:42:::1;65169:87;;;::::0;-1:-1:-1;;;65169:87:0;;27378:2:1;65169:87:0::1;::::0;::::1;27360:21:1::0;;;27397:18;;;27390:30;27456:34;27436:18;;;27429:62;27508:18;;65169:87:0::1;27176:356:1::0;65169:87:0::1;65297:20;65310:7:::0;52964:4:::1;65297:20;:::i;:::-;52918:1;55081:7:::0;55141:18;:13;:18;;;;65275:42:::1;::::0;;::::1;::::0;55141:18;65275:42:::1;65267:87;;;::::0;-1:-1:-1;;;65267:87:0;;27739:2:1;65267:87:0::1;::::0;::::1;27721:21:1::0;;;27758:18;;;27751:30;27817:34;27797:18;;;27790:62;27869:18;;65267:87:0::1;27537:356:1::0;65267:87:0::1;65372:7;65367:195;65389:1;65385;:5;;;65367:195;;;65413:32;65419:9;65430:1;65413:32;;65433:7;65413:32;;;;;;;;;;;;;::::0;:5:::1;:32::i;:::-;65460:16;::::0;::::1;;::::0;;;:13:::1;:16;::::0;;;;:27;;65480:7;;65460:16;:27:::1;::::0;65480:7;;65460:27:::1;;;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;-1:-1:-1;;;;;65502:23:0;::::1;-1:-1:-1::0;65502:23:0;;;:12:::1;:23;::::0;;;;;;;:37:::1;::::0;::::1;::::0;;-1:-1:-1;65502:34:0::1;:37:::0;;;;;:48;;65543:7;;-1:-1:-1;65502:37:0;;:48:::1;::::0;65543:7;;65502:48:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65392:4;;;;;:::i;:::-;;;;65367:195;;;-1:-1:-1::0;65577:36:0::1;::::0;10473:6:1;10461:19;;10443:38;;-1:-1:-1;;;;;65577:36:0;::::1;::::0;::::1;::::0;10431:2:1;10416:18;65577:36:0::1;;;;;;;64787:834:::0;;:::o;60551:298::-;9816:13;:11;:13::i;:::-;60644:11:::1;::::0;::::1;::::0;;;::::1;::::0;::::1;60630:25:::0;;::::1;;60622:91;;;::::0;-1:-1:-1;;;60622:91:0;;28294:2:1;60622:91:0::1;::::0;::::1;28276:21:1::0;28333:2;28313:18;;;28306:30;28372:34;28352:18;;;28345:62;-1:-1:-1;;;28423:18:1;;;28416:51;28484:19;;60622:91:0::1;28092:417:1::0;60622:91:0::1;60747:4;60732:11;:19;;;;60724:81;;;::::0;-1:-1:-1;;;60724:81:0;;28716:2:1;60724:81:0::1;::::0;::::1;28698:21:1::0;28755:2;28735:18;;;28728:30;28794:34;28774:18;;;28767:62;-1:-1:-1;;;28845:18:1;;;28838:47;28902:19;;60724:81:0::1;28514:413:1::0;60724:81:0::1;60816:11;:25:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;60816:25:0;;::::1;::::0;;;::::1;::::0;;60551:298::o;55187:209::-;55246:7;-1:-1:-1;;;;;55270:20:0;;55266:60;;55299:27;;-1:-1:-1;;;55299:27:0;;;;;;;;;;;55266:60;-1:-1:-1;;;;;;55352:20:0;;;;;:12;:20;;;;;:35;-1:-1:-1;;;55352:35:0;;-1:-1:-1;;;;;55352:35:0;;55187:209::o;61950:797::-;-1:-1:-1;;;;;62150:20:0;;8561:10;62150:20;;:60;;-1:-1:-1;62174:36:0;62191:4;8561:10;37150:168;:::i;62174:36::-;62128:157;;;;-1:-1:-1;;;62128:157:0;;;;;;;:::i;:::-;62313:5;62304:6;:14;62296:51;;;;-1:-1:-1;;;62296:51:0;;16926:2:1;62296:51:0;;;16908:21:1;16965:2;16945:18;;;16938:30;-1:-1:-1;;;16984:18:1;;;16977:54;17048:18;;62296:51:0;16724:348:1;62296:51:0;62358:45;62376:4;62382:2;62386;62390:6;62398:4;62358:17;:45::i;:::-;53838:1;62420:2;:20;62416:324;;;-1:-1:-1;;;;;62457:18:0;;;;;;:12;:18;;;;;;;;:40;;;;;:29;;:40;;;;;:58;;62508:6;;62457:18;:58;;62508:6;;62457:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62530:16:0;;-1:-1:-1;62530:16:0;;;:12;:16;;;;;;;;:38;;;;;-1:-1:-1;62530:27:0;:38;;;;;:56;;62579:6;;-1:-1:-1;62530:38:0;;:56;;62579:6;;62530:56;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;62416:324;;;-1:-1:-1;;;;;62619:18:0;;;;;;:12;:18;;;;;:48;;;;;;:18;:48;;;;-1:-1:-1;;;;;62619:48:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;62619:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;62682:16:0;;-1:-1:-1;62682:16:0;;;:12;:16;;;;;:46;;;;;;-1:-1:-1;62682:16:0;;:46;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;62682:46:0;;;;;-1:-1:-1;;;;;62682:46:0;;;;;;62416:324;61950:797;;;;;:::o;10836:201::-;9816:13;:11;:13::i;:::-;-1:-1:-1;;;;;10925:22:0;::::1;10917:73;;;::::0;-1:-1:-1;;;10917:73:0;;29134:2:1;10917:73:0::1;::::0;::::1;29116:21:1::0;29173:2;29153:18;;;29146:30;29212:34;29192:18;;;29185:62;-1:-1:-1;;;29263:18:1;;;29256:36;29309:19;;10917:73:0::1;28932:402:1::0;10917:73:0::1;11001:28;11020:8;11001:18;:28::i;:::-;10836:201:::0;:::o;61425:171::-;9816:13;:11;:13::i;:::-;61516:1:::1;61503:10;:14;61495:60;;;::::0;-1:-1:-1;;;61495:60:0;;29541:2:1;61495:60:0::1;::::0;::::1;29523:21:1::0;29580:2;29560:18;;;29553:30;29619:34;29599:18;;;29592:62;-1:-1:-1;;;29670:18:1;;;29663:31;29711:19;;61495:60:0::1;29339:397:1::0;61495:60:0::1;61566:9;:22:::0;61425:171::o;64537:242::-;9816:13;:11;:13::i;:::-;64698:14;64724:47:::1;-1:-1:-1::0;;;;;64724:26:0;::::1;64751:10:::0;64763:7;64724:26:::1;:47::i;:::-;64657:122;64537:242:::0;;;:::o;10095:132::-;10003:6;;-1:-1:-1;;;;;10003:6:0;8561:10;10159:23;10151:68;;;;-1:-1:-1;;;10151:68:0;;29943:2:1;10151:68:0;;;29925:21:1;;;29962:18;;;29955:30;30021:34;30001:18;;;29994:62;30073:18;;10151:68:0;29741:356:1;40109:1146:0;40336:7;:14;40322:3;:10;:28;40314:81;;;;-1:-1:-1;;;40314:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40414:16:0;;40406:66;;;;-1:-1:-1;;;40406:66:0;;;;;;;:::i;:::-;8561:10;40485:16;40602:421;40626:3;:10;40622:1;:14;40602:421;;;40658:10;40671:3;40675:1;40671:6;;;;;;;;:::i;:::-;;;;;;;40658:19;;40692:14;40709:7;40717:1;40709:10;;;;;;;;:::i;:::-;;;;;;;;;;;;40736:19;40758:13;;;;;;;;;;-1:-1:-1;;;;;40758:19:0;;;;;;;;;;;;40709:10;;-1:-1:-1;40800:21:0;;;;40792:76;;;;-1:-1:-1;;;40792:76:0;;;;;;;:::i;:::-;40912:9;:13;;;;;;;;;;;-1:-1:-1;;;;;40912:19:0;;;;;;;;;;40934:20;;;40912:42;;40984:17;;;;;;;:27;;40934:20;;40912:9;40984:27;;40934:20;;40984:27;:::i;:::-;;;;;;;;40643:380;;;40638:3;;;;:::i;:::-;;;40602:421;;;;41070:2;-1:-1:-1;;;;;41040:47:0;41064:4;-1:-1:-1;;;;;41040:47:0;41054:8;-1:-1:-1;;;;;41040:47:0;;41074:3;41079:7;41040:47;;;;;;;:::i;:::-;;;;;;;;41172:75;41208:8;41218:4;41224:2;41228:3;41233:7;41242:4;41172:35;:75::i;63752:526::-;64129:28;;-1:-1:-1;;64146:10:0;31947:2:1;31943:15;31939:53;64129:28:0;;;31927:66:1;63799:5:0;;;;64243:1;;64206:12;;64164:15;;32009:12:1;;64129:28:0;;;;;;;;;;;;64119:39;;;;;;64111:48;;64110:70;;;;:::i;:::-;63989:32;;-1:-1:-1;;64006:14:0;31947:2:1;31943:15;31939:53;63989:32:0;;;31927:66:1;64070:14:0;;64028:15;;32009:12:1;;63989:32:0;;;;;;;;;;;;63979:43;;;;;;63971:52;;63970:74;;;;:::i;:::-;63886:59;63928:16;63887:15;63886:59;:::i;:::-;:159;;;;:::i;:::-;:199;;;;:::i;:::-;:295;;;;:::i;:::-;:333;;;;:::i;:::-;63847:391;;;;;;32668:19:1;;32712:2;32703:12;;32539:182;63847:391:0;;;;;;;;;;;;;63837:402;;;;;;63829:411;;:415;;;;:::i;42573:729::-;-1:-1:-1;;;;;42726:16:0;;42718:62;;;;-1:-1:-1;;;42718:62:0;;;;;;;:::i;:::-;8561:10;42793:16;42858:21;42876:2;42858:17;:21::i;:::-;42835:44;;42890:24;42917:25;42935:6;42917:17;:25::i;:::-;42890:52;;43034:9;:13;;;;;;;;;;;-1:-1:-1;;;;;43034:17:0;;;;;;;;;:27;;43055:6;;43034:9;:27;;43055:6;;43034:27;:::i;:::-;;;;-1:-1:-1;;43077:52:0;;;33419:25:1;;;33475:2;33460:18;;33453:34;;;-1:-1:-1;;;;;43077:52:0;;;;43110:1;;43077:52;;;;;;33392:18:1;43077:52:0;;;;;;;43220:74;43251:8;43269:1;43273:2;43277;43281:6;43289:4;43220:30;:74::i;:::-;42707:595;;;42573:729;;;;:::o;61778:164::-;61852:6;61840:9;:18;61836:99;;;61883:10;61875:48;61904:18;61916:6;61904:9;:18;:::i;:::-;61875:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44816:808;-1:-1:-1;;;;;44943:18:0;;44935:66;;;;-1:-1:-1;;;44935:66:0;;33833:2:1;44935:66:0;;;33815:21:1;33872:2;33852:18;;;33845:30;33911:34;33891:18;;;33884:62;-1:-1:-1;;;33962:18:1;;;33955:33;34005:19;;44935:66:0;33631:399:1;44935:66:0;8561:10;45014:16;45079:21;45097:2;45079:17;:21::i;:::-;45056:44;;45111:24;45138:25;45156:6;45138:17;:25::i;:::-;45176:66;;;;;;;;;-1:-1:-1;45176:66:0;;;;45277:13;;;;;;;;;-1:-1:-1;;;;;45277:19:0;;;;;;;;45111:52;;-1:-1:-1;45315:21:0;;;;45307:70;;;;-1:-1:-1;;;45307:70:0;;34237:2:1;45307:70:0;;;34219:21:1;34276:2;34256:18;;;34249:30;34315:34;34295:18;;;34288:62;-1:-1:-1;;;34366:18:1;;;34359:34;34410:19;;45307:70:0;34035:400:1;45307:70:0;45413:9;:13;;;;;;;;;;;-1:-1:-1;;;;;45413:19:0;;;;;;;;;;;;45435:20;;;45413:42;;45484:54;;33419:25:1;;;33460:18;;;33453:34;;;45413:19:0;;45484:54;;;;;;33392:18:1;45484:54:0;;;;;;;45551:65;;;;;;;;;45595:1;45551:65;;;62755:956;43705:813;-1:-1:-1;;;;;43883:16:0;;43875:62;;;;-1:-1:-1;;;43875:62:0;;;;;;;:::i;:::-;43970:7;:14;43956:3;:10;:28;43948:81;;;;-1:-1:-1;;;43948:81:0;;;;;;;:::i;:::-;8561:10;44042:16;44165:103;44189:3;:10;44185:1;:14;44165:103;;;44246:7;44254:1;44246:10;;;;;;;;:::i;:::-;;;;;;;44221:9;:17;44231:3;44235:1;44231:6;;;;;;;;:::i;:::-;;;;;;;44221:17;;;;;;;;;;;:21;44239:2;-1:-1:-1;;;;;44221:21:0;-1:-1:-1;;;;;44221:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;44201:3:0;;-1:-1:-1;44201:3:0;;;:::i;:::-;;;;44165:103;;;;44321:2;-1:-1:-1;;;;;44285:53:0;44317:1;-1:-1:-1;;;;;44285:53:0;44299:8;-1:-1:-1;;;;;44285:53:0;;44325:3;44330:7;44285:53;;;;;;;:::i;:::-;;;;;;;;44429:81;44465:8;44483:1;44487:2;44491:3;44496:7;44505:4;44429:35;:81::i;11197:191::-;11290:6;;;-1:-1:-1;;;;;11307:17:0;;;-1:-1:-1;;;;;;11307:17:0;;;;;;;11340:40;;11290:6;;;11307:17;11290:6;;11340:40;;11271:16;;11340:40;11260:128;11197:191;:::o;46986:331::-;47141:8;-1:-1:-1;;;;;47132:17:0;:5;-1:-1:-1;;;;;47132:17:0;;47124:71;;;;-1:-1:-1;;;47124:71:0;;34642:2:1;47124:71:0;;;34624:21:1;34681:2;34661:18;;;34654:30;34720:34;34700:18;;;34693:62;-1:-1:-1;;;34771:18:1;;;34764:39;34820:19;;47124:71:0;34440:405:1;47124:71:0;-1:-1:-1;;;;;47206:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;47206:46:0;;;;;;;;;;47268:41;;1178::1;;;47268::0;;1151:18:1;47268:41:0;;;;;;;46986:331;;;:::o;59414:553::-;59477:14;59467:6;;;-1:-1:-1;;;59467:6:0;;;;;:24;;;;;;;:::i;:::-;;;59459:57;;;;-1:-1:-1;;;59459:57:0;;;;;;;:::i;:::-;59535:9;59548:10;59535:23;59527:66;;;;-1:-1:-1;;;59527:66:0;;;;;;;:::i;:::-;59651:10;;54728:19;;59651:10;;;;;;;54750:7;;;;54728:29;;59626:35;;59604:113;;;;-1:-1:-1;;;59604:113:0;;25938:2:1;59604:113:0;;;25920:21:1;25977:2;25957:18;;;25950:30;26016;25996:18;;;25989:58;26064:18;;59604:113:0;25736:352:1;59604:113:0;59728:15;59746:19;;59728:37;;59776:45;59782:10;59794:19;;59815:1;59776:45;;;;;;;;;;;;:5;:45::i;:::-;59855:1;59832:19;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;59880:10:0;59867:24;;;;:12;:24;;;;;:41;;59907:1;;59867:24;:41;;59907:1;;-1:-1:-1;;;;;59867:41:0;;:::i;:::-;;;-1:-1:-1;;;;;59867:41:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59924:35:0;;;59939:10;35024:51:1;;35106:2;35091:18;;35084:34;;;59924:35:0;;34997:18:1;59924:35:0;34850:274:1;38777:974:0;-1:-1:-1;;;;;38965:16:0;;38957:66;;;;-1:-1:-1;;;38957:66:0;;;;;;;:::i;:::-;8561:10;39036:16;39101:21;39119:2;39101:17;:21::i;:::-;39078:44;;39133:24;39160:25;39178:6;39160:17;:25::i;:::-;39133:52;;39271:19;39293:13;;;;;;;;;;;-1:-1:-1;;;;;39293:19:0;;;;;;;;;;39331:21;;;;39323:76;;;;-1:-1:-1;;;39323:76:0;;;;;;;:::i;:::-;39435:9;:13;;;;;;;;;;;-1:-1:-1;;;;;39435:19:0;;;;;;;;;;39457:20;;;39435:42;;39499:17;;;;;;;:27;;39457:20;;39435:9;39499:27;;39457:20;;39499:27;:::i;:::-;;;;-1:-1:-1;;39544:46:0;;;33419:25:1;;;33475:2;33460:18;;33453:34;;;-1:-1:-1;;;;;39544:46:0;;;;;;;;;;;;;;33392:18:1;39544:46:0;;;;;;;39675:68;39706:8;39716:4;39722:2;39726;39730:6;39738:4;39675:30;:68::i;:::-;38946:805;;;;38777:974;;;;;:::o;20662:211::-;20806:58;;;-1:-1:-1;;;;;35042:32:1;;20806:58:0;;;35024:51:1;35091:18;;;;35084:34;;;20806:58:0;;;;;;;;;;34997:18:1;;;;20806:58:0;;;;;;;;-1:-1:-1;;;;;20806:58:0;-1:-1:-1;;;20806:58:0;;;20779:86;;20799:5;;20779:19;:86::i;50431:813::-;-1:-1:-1;;;;;50671:13:0;;12923:19;:23;50667:570;;50707:79;;-1:-1:-1;;;50707:79:0;;-1:-1:-1;;;;;50707:43:0;;;;;:79;;50751:8;;50761:4;;50767:3;;50772:7;;50781:4;;50707:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50707:79:0;;;;;;;;-1:-1:-1;;50707:79:0;;;;;;;;;;;;:::i;:::-;;;50703:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;51099:6;51092:14;;-1:-1:-1;;;51092:14:0;;;;;;;;:::i;50703:523::-;;;51148:62;;-1:-1:-1;;;51148:62:0;;37277:2:1;51148:62:0;;;37259:21:1;37316:2;37296:18;;;37289:30;37355:34;37335:18;;;37328:62;-1:-1:-1;;;37406:18:1;;;37399:50;37466:19;;51148:62:0;37075:416:1;50703:523:0;-1:-1:-1;;;;;;50868:60:0;;-1:-1:-1;;;50868:60:0;50864:159;;50953:50;;-1:-1:-1;;;50953:50:0;;;;;;;:::i;51252:198::-;51372:16;;;51386:1;51372:16;;;;;;;;;51318;;51347:22;;51372:16;;;;;;;;;;;;-1:-1:-1;51372:16:0;51347:41;;51410:7;51399:5;51405:1;51399:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;51437:5;51252:198;-1:-1:-1;;51252:198:0:o;49679:744::-;-1:-1:-1;;;;;49894:13:0;;12923:19;:23;49890:526;;49930:72;;-1:-1:-1;;;49930:72:0;;-1:-1:-1;;;;;49930:38:0;;;;;:72;;49969:8;;49979:4;;49985:2;;49989:6;;49997:4;;49930:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49930:72:0;;;;;;;;-1:-1:-1;;49930:72:0;;;;;;;;;;;;:::i;:::-;;;49926:479;;;;:::i;:::-;-1:-1:-1;;;;;;50052:55:0;;-1:-1:-1;;;50052:55:0;50048:154;;50132:50;;-1:-1:-1;;;50132:50:0;;;;;;;:::i;23729:716::-;24153:23;24179:69;24207:4;24179:69;;;;;;;;;;;;;;;;;24187:5;-1:-1:-1;;;;;24179:27:0;;;:69;;;;;:::i;:::-;24263:17;;24153:95;;-1:-1:-1;24263:21:0;24259:179;;24360:10;24349:30;;;;;;;;;;;;:::i;:::-;24341:85;;;;-1:-1:-1;;;24341:85:0;;38923:2:1;24341:85:0;;;38905:21:1;38962:2;38942:18;;;38935:30;39001:34;38981:18;;;38974:62;-1:-1:-1;;;39052:18:1;;;39045:40;39102:19;;24341:85:0;38721:406:1;15373:229:0;15510:12;15542:52;15564:6;15572:4;15578:1;15581:12;15542:21;:52::i;:::-;15535:59;;15373:229;;;;;;:::o;16493:510::-;16663:12;16721:5;16696:21;:30;;16688:81;;;;-1:-1:-1;;;16688:81:0;;39334:2:1;16688:81:0;;;39316:21:1;39373:2;39353:18;;;39346:30;39412:34;39392:18;;;39385:62;-1:-1:-1;;;39463:18:1;;;39456:36;39509:19;;16688:81:0;39132:402:1;16688:81:0;-1:-1:-1;;;;;12923:19:0;;;16780:60;;;;-1:-1:-1;;;16780:60:0;;39741:2:1;16780:60:0;;;39723:21:1;39780:2;39760:18;;;39753:30;39819:31;39799:18;;;39792:59;39868:18;;16780:60:0;39539:353:1;16780:60:0;16854:12;16868:23;16895:6;-1:-1:-1;;;;;16895:11:0;16914:5;16921:4;16895:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16853:73;;;;16944:51;16961:7;16970:10;16982:12;16944:16;:51::i;:::-;16937:58;16493:510;-1:-1:-1;;;;;;;16493:510:0:o;19179:762::-;19329:12;19358:7;19354:580;;;-1:-1:-1;19389:10:0;19382:17;;19354:580;19503:17;;:21;19499:424;;19751:10;19745:17;19812:15;19799:10;19795:2;19791:19;19784:44;19499:424;19894:12;19887:20;;-1:-1:-1;;;19887:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;1230:592::-;1301:6;1309;1362:2;1350:9;1341:7;1337:23;1333:32;1330:52;;;1378:1;1375;1368:12;1330:52;1418:9;1405:23;-1:-1:-1;;;;;1488:2:1;1480:6;1477:14;1474:34;;;1504:1;1501;1494:12;1474:34;1542:6;1531:9;1527:22;1517:32;;1587:7;1580:4;1576:2;1572:13;1568:27;1558:55;;1609:1;1606;1599:12;1558:55;1649:2;1636:16;1675:2;1667:6;1664:14;1661:34;;;1691:1;1688;1681:12;1661:34;1736:7;1731:2;1722:6;1718:2;1714:15;1710:24;1707:37;1704:57;;;1757:1;1754;1747:12;1704:57;1788:2;1780:11;;;;;1810:6;;-1:-1:-1;1230:592:1;;-1:-1:-1;;;;1230:592:1:o;1827:180::-;1886:6;1939:2;1927:9;1918:7;1914:23;1910:32;1907:52;;;1955:1;1952;1945:12;1907:52;-1:-1:-1;1978:23:1;;1827:180;-1:-1:-1;1827:180:1:o;2012:250::-;2097:1;2107:113;2121:6;2118:1;2115:13;2107:113;;;2197:11;;;2191:18;2178:11;;;2171:39;2143:2;2136:10;2107:113;;;-1:-1:-1;;2254:1:1;2236:16;;2229:27;2012:250::o;2267:271::-;2309:3;2347:5;2341:12;2374:6;2369:3;2362:19;2390:76;2459:6;2452:4;2447:3;2443:14;2436:4;2429:5;2425:16;2390:76;:::i;:::-;2520:2;2499:15;-1:-1:-1;;2495:29:1;2486:39;;;;2527:4;2482:50;;2267:271;-1:-1:-1;;2267:271:1:o;2543:220::-;2692:2;2681:9;2674:21;2655:4;2712:45;2753:2;2742:9;2738:18;2730:6;2712:45;:::i;2768:127::-;2829:10;2824:3;2820:20;2817:1;2810:31;2860:4;2857:1;2850:15;2884:4;2881:1;2874:15;2900:339;3043:2;3028:18;;3076:1;3065:13;;3055:144;;3121:10;3116:3;3112:20;3109:1;3102:31;3156:4;3153:1;3146:15;3184:4;3181:1;3174:15;3055:144;3208:25;;;2900:339;:::o;3244:267::-;3314:6;3367:2;3355:9;3346:7;3342:23;3338:32;3335:52;;;3383:1;3380;3373:12;3335:52;3422:9;3409:23;3461:1;3454:5;3451:12;3441:40;;3477:1;3474;3467:12;3516:127;3577:10;3572:3;3568:20;3565:1;3558:31;3608:4;3605:1;3598:15;3632:4;3629:1;3622:15;3648:249;3758:2;3739:13;;-1:-1:-1;;3735:27:1;3723:40;;-1:-1:-1;;;;;3778:34:1;;3814:22;;;3775:62;3772:88;;;3840:18;;:::i;:::-;3876:2;3869:22;-1:-1:-1;;3648:249:1:o;3902:183::-;3962:4;-1:-1:-1;;;;;3987:6:1;3984:30;3981:56;;;4017:18;;:::i;:::-;-1:-1:-1;4062:1:1;4058:14;4074:4;4054:25;;3902:183::o;4090:724::-;4144:5;4197:3;4190:4;4182:6;4178:17;4174:27;4164:55;;4215:1;4212;4205:12;4164:55;4251:6;4238:20;4277:4;4300:43;4340:2;4300:43;:::i;:::-;4372:2;4366:9;4384:31;4412:2;4404:6;4384:31;:::i;:::-;4450:18;;;4542:1;4538:10;;;;4526:23;;4522:32;;;4484:15;;;;-1:-1:-1;4566:15:1;;;4563:35;;;4594:1;4591;4584:12;4563:35;4630:2;4622:6;4618:15;4642:142;4658:6;4653:3;4650:15;4642:142;;;4724:17;;4712:30;;4762:12;;;;4675;;4642:142;;;-1:-1:-1;4802:6:1;4090:724;-1:-1:-1;;;;;;4090:724:1:o;4819:555::-;4861:5;4914:3;4907:4;4899:6;4895:17;4891:27;4881:55;;4932:1;4929;4922:12;4881:55;4968:6;4955:20;-1:-1:-1;;;;;4990:2:1;4987:26;4984:52;;;5016:18;;:::i;:::-;5065:2;5059:9;5077:67;5132:2;5113:13;;-1:-1:-1;;5109:27:1;5138:4;5105:38;5059:9;5077:67;:::i;:::-;5168:2;5160:6;5153:18;5214:3;5207:4;5202:2;5194:6;5190:15;5186:26;5183:35;5180:55;;;5231:1;5228;5221:12;5180:55;5295:2;5288:4;5280:6;5276:17;5269:4;5261:6;5257:17;5244:54;5342:1;5318:15;;;5335:4;5314:26;5307:37;;;;5322:6;4819:555;-1:-1:-1;;;4819:555:1:o;5379:1071::-;5533:6;5541;5549;5557;5565;5618:3;5606:9;5597:7;5593:23;5589:33;5586:53;;;5635:1;5632;5625:12;5586:53;5674:9;5661:23;5693:31;5718:5;5693:31;:::i;:::-;5743:5;-1:-1:-1;5800:2:1;5785:18;;5772:32;5813:33;5772:32;5813:33;:::i;:::-;5865:7;-1:-1:-1;5923:2:1;5908:18;;5895:32;-1:-1:-1;;;;;5976:14:1;;;5973:34;;;6003:1;6000;5993:12;5973:34;6026:61;6079:7;6070:6;6059:9;6055:22;6026:61;:::i;:::-;6016:71;;6140:2;6129:9;6125:18;6112:32;6096:48;;6169:2;6159:8;6156:16;6153:36;;;6185:1;6182;6175:12;6153:36;6208:63;6263:7;6252:8;6241:9;6237:24;6208:63;:::i;:::-;6198:73;;6324:3;6313:9;6309:19;6296:33;6280:49;;6354:2;6344:8;6341:16;6338:36;;;6370:1;6367;6360:12;6338:36;;6393:51;6436:7;6425:8;6414:9;6410:24;6393:51;:::i;:::-;6383:61;;;5379:1071;;;;;;;;:::o;6455:247::-;6514:6;6567:2;6555:9;6546:7;6542:23;6538:32;6535:52;;;6583:1;6580;6573:12;6535:52;6622:9;6609:23;6641:31;6666:5;6641:31;:::i;6896:1277::-;7014:6;7022;7075:2;7063:9;7054:7;7050:23;7046:32;7043:52;;;7091:1;7088;7081:12;7043:52;7131:9;7118:23;-1:-1:-1;;;;;7201:2:1;7193:6;7190:14;7187:34;;;7217:1;7214;7207:12;7187:34;7255:6;7244:9;7240:22;7230:32;;7300:7;7293:4;7289:2;7285:13;7281:27;7271:55;;7322:1;7319;7312:12;7271:55;7358:2;7345:16;7380:4;7403:43;7443:2;7403:43;:::i;:::-;7475:2;7469:9;7487:31;7515:2;7507:6;7487:31;:::i;:::-;7553:18;;;7641:1;7637:10;;;;7629:19;;7625:28;;;7587:15;;;;-1:-1:-1;7665:19:1;;;7662:39;;;7697:1;7694;7687:12;7662:39;7721:11;;;;7741:217;7757:6;7752:3;7749:15;7741:217;;;7837:3;7824:17;7854:31;7879:5;7854:31;:::i;:::-;7898:18;;7774:12;;;;7936;;;;7741:217;;;7977:6;-1:-1:-1;;8021:18:1;;8008:32;;-1:-1:-1;;8052:16:1;;;8049:36;;;8081:1;8078;8071:12;8049:36;;8104:63;8159:7;8148:8;8137:9;8133:24;8104:63;:::i;:::-;8094:73;;;6896:1277;;;;;:::o;8178:435::-;8231:3;8269:5;8263:12;8296:6;8291:3;8284:19;8322:4;8351:2;8346:3;8342:12;8335:19;;8388:2;8381:5;8377:14;8409:1;8419:169;8433:6;8430:1;8427:13;8419:169;;;8494:13;;8482:26;;8528:12;;;;8563:15;;;;8455:1;8448:9;8419:169;;;-1:-1:-1;8604:3:1;;8178:435;-1:-1:-1;;;;;8178:435:1:o;8618:261::-;8797:2;8786:9;8779:21;8760:4;8817:56;8869:2;8858:9;8854:18;8846:6;8817:56;:::i;8884:159::-;8951:20;;9011:6;9000:18;;8990:29;;8980:57;;9033:1;9030;9023:12;8980:57;8884:159;;;:::o;9048:184::-;9106:6;9159:2;9147:9;9138:7;9134:23;9130:32;9127:52;;;9175:1;9172;9165:12;9127:52;9198:28;9216:9;9198:28;:::i;9237:315::-;9305:6;9313;9366:2;9354:9;9345:7;9341:23;9337:32;9334:52;;;9382:1;9379;9372:12;9334:52;9418:9;9405:23;9395:33;;9478:2;9467:9;9463:18;9450:32;9491:31;9516:5;9491:31;:::i;:::-;9541:5;9531:15;;;9237:315;;;;;:::o;9817:269::-;9874:6;9927:2;9915:9;9906:7;9902:23;9898:32;9895:52;;;9943:1;9940;9933:12;9895:52;9982:9;9969:23;10032:4;10025:5;10021:16;10014:5;10011:27;10001:55;;10052:1;10049;10042:12;10492:118;10578:5;10571:13;10564:21;10557:5;10554:32;10544:60;;10600:1;10597;10590:12;10615:382;10680:6;10688;10741:2;10729:9;10720:7;10716:23;10712:32;10709:52;;;10757:1;10754;10747:12;10709:52;10796:9;10783:23;10815:31;10840:5;10815:31;:::i;:::-;10865:5;-1:-1:-1;10922:2:1;10907:18;;10894:32;10935:30;10894:32;10935:30;:::i;11002:319::-;11069:6;11077;11130:2;11118:9;11109:7;11105:23;11101:32;11098:52;;;11146:1;11143;11136:12;11098:52;11185:9;11172:23;11204:31;11229:5;11204:31;:::i;:::-;11254:5;-1:-1:-1;11278:37:1;11311:2;11296:18;;11278:37;:::i;:::-;11268:47;;11002:319;;;;;:::o;11326:388::-;11394:6;11402;11455:2;11443:9;11434:7;11430:23;11426:32;11423:52;;;11471:1;11468;11461:12;11423:52;11510:9;11497:23;11529:31;11554:5;11529:31;:::i;:::-;11579:5;-1:-1:-1;11636:2:1;11621:18;;11608:32;11649:33;11608:32;11649:33;:::i;11719:734::-;11823:6;11831;11839;11847;11855;11908:3;11896:9;11887:7;11883:23;11879:33;11876:53;;;11925:1;11922;11915:12;11876:53;11964:9;11951:23;11983:31;12008:5;11983:31;:::i;:::-;12033:5;-1:-1:-1;12090:2:1;12075:18;;12062:32;12103:33;12062:32;12103:33;:::i;:::-;12155:7;-1:-1:-1;12209:2:1;12194:18;;12181:32;;-1:-1:-1;12260:2:1;12245:18;;12232:32;;-1:-1:-1;12315:3:1;12300:19;;12287:33;-1:-1:-1;;;;;12332:30:1;;12329:50;;;12375:1;12372;12365:12;12329:50;12398:49;12439:7;12430:6;12419:9;12415:22;12398:49;:::i;12458:464::-;12543:6;12551;12559;12612:2;12600:9;12591:7;12587:23;12583:32;12580:52;;;12628:1;12625;12618:12;12580:52;12667:9;12654:23;12686:31;12711:5;12686:31;:::i;:::-;12736:5;-1:-1:-1;12793:2:1;12778:18;;12765:32;12806:33;12765:32;12806:33;:::i;:::-;12458:464;;12858:7;;-1:-1:-1;;;12912:2:1;12897:18;;;;12884:32;;12458:464::o;13338:380::-;13417:1;13413:12;;;;13460;;;13481:61;;13535:4;13527:6;13523:17;13513:27;;13481:61;13588:2;13580:6;13577:14;13557:18;13554:38;13551:161;;13634:10;13629:3;13625:20;13622:1;13615:31;13669:4;13666:1;13659:15;13697:4;13694:1;13687:15;13551:161;;13338:380;;;:::o;13849:545::-;13951:2;13946:3;13943:11;13940:448;;;13987:1;14012:5;14008:2;14001:17;14057:4;14053:2;14043:19;14127:2;14115:10;14111:19;14108:1;14104:27;14098:4;14094:38;14163:4;14151:10;14148:20;14145:47;;;-1:-1:-1;14186:4:1;14145:47;14241:2;14236:3;14232:12;14229:1;14225:20;14219:4;14215:31;14205:41;;14296:82;14314:2;14307:5;14304:13;14296:82;;;14359:17;;;14340:1;14329:13;14296:82;;14570:1206;-1:-1:-1;;;;;14689:3:1;14686:27;14683:53;;;14716:18;;:::i;:::-;14745:94;14835:3;14795:38;14827:4;14821:11;14795:38;:::i;:::-;14789:4;14745:94;:::i;:::-;14865:1;14890:2;14885:3;14882:11;14907:1;14902:616;;;;15562:1;15579:3;15576:93;;;-1:-1:-1;15635:19:1;;;15622:33;15576:93;-1:-1:-1;;14527:1:1;14523:11;;;14519:24;14515:29;14505:40;14551:1;14547:11;;;14502:57;15682:78;;14875:895;;14902:616;13796:1;13789:14;;;13833:4;13820:18;;-1:-1:-1;;14938:17:1;;;15039:9;15061:229;15075:7;15072:1;15069:14;15061:229;;;15164:19;;;15151:33;15136:49;;15271:4;15256:20;;;;15224:1;15212:14;;;;15091:12;15061:229;;;15065:3;15318;15309:7;15306:16;15303:159;;;15442:1;15438:6;15432:3;15426;15423:1;15419:11;15415:21;15411:34;15407:39;15394:9;15389:3;15385:19;15372:33;15368:79;15360:6;15353:95;15303:159;;;15505:1;15499:3;15496:1;15492:11;15488:19;15482:4;15475:33;14875:895;;14570:1206;;;:::o;15781:390::-;15940:2;15929:9;15922:21;15979:6;15974:2;15963:9;15959:18;15952:34;16036:6;16028;16023:2;16012:9;16008:18;15995:48;16092:1;16063:22;;;16087:2;16059:31;;;16052:42;;;;16155:2;16134:15;;;-1:-1:-1;;16130:29:1;16115:45;16111:54;;15781:390;-1:-1:-1;15781:390:1:o;16176:411::-;16378:2;16360:21;;;16417:2;16397:18;;;16390:30;16456:34;16451:2;16436:18;;16429:62;-1:-1:-1;;;16522:2:1;16507:18;;16500:45;16577:3;16562:19;;16176:411::o;16592:127::-;16653:10;16648:3;16644:20;16641:1;16634:31;16684:4;16681:1;16674:15;16708:4;16705:1;16698:15;17077:127;17138:10;17133:3;17129:20;17126:1;17119:31;17169:4;17166:1;17159:15;17193:4;17190:1;17183:15;17209:171;17277:6;17316:10;;;17304;;;17300:27;;17339:12;;;17336:38;;;17354:18;;:::i;:::-;17336:38;17209:171;;;;:::o;17385:168::-;17452:6;17478:10;;;17490;;;17474:27;;17513:11;;;17510:37;;;17527:18;;:::i;17558:183::-;-1:-1:-1;;;;;17677:10:1;;;17665;;;17661:27;;17700:12;;;17697:38;;;17715:18;;:::i;17746:180::-;-1:-1:-1;;;;;17851:10:1;;;17863;;;17847:27;;17886:11;;;17883:37;;;17900:18;;:::i;17931:135::-;17970:3;17991:17;;;17988:43;;18011:18;;:::i;:::-;-1:-1:-1;18058:1:1;18047:13;;17931:135::o;18474:344::-;18676:2;18658:21;;;18715:2;18695:18;;;18688:30;-1:-1:-1;;;18749:2:1;18734:18;;18727:50;18809:2;18794:18;;18474:344::o;18823:354::-;19025:2;19007:21;;;19064:2;19044:18;;;19037:30;19103:32;19098:2;19083:18;;19076:60;19168:2;19153:18;;18823:354::o;19182:245::-;19253:6;19291:10;;;19303;;;19287:27;19334:20;;;;19253:6;19373:24;;;19363:58;;19401:18;;:::i;:::-;19363:58;;19182:245;;;;:::o;19432:125::-;19497:9;;;19518:10;;;19515:36;;;19531:18;;:::i;19918:397::-;20120:2;20102:21;;;20159:2;20139:18;;;20132:30;20198:34;20193:2;20178:18;;20171:62;-1:-1:-1;;;20264:2:1;20249:18;;20242:31;20305:3;20290:19;;19918:397::o;20320:175::-;20357:3;20401:4;20394:5;20390:16;20430:4;20421:7;20418:17;20415:43;;20438:18;;:::i;:::-;20487:1;20474:15;;20320:175;-1:-1:-1;;20320:175:1:o;23946:168::-;24019:9;;;24050;;24067:15;;;24061:22;;24047:37;24037:71;;24088:18;;:::i;30102:404::-;30304:2;30286:21;;;30343:2;30323:18;;;30316:30;30382:34;30377:2;30362:18;;30355:62;-1:-1:-1;;;30448:2:1;30433:18;;30426:38;30496:3;30481:19;;30102:404::o;30511:401::-;30713:2;30695:21;;;30752:2;30732:18;;;30725:30;30791:34;30786:2;30771:18;;30764:62;-1:-1:-1;;;30857:2:1;30842:18;;30835:35;30902:3;30887:19;;30511:401::o;30917:406::-;31119:2;31101:21;;;31158:2;31138:18;;;31131:30;31197:34;31192:2;31177:18;;31170:62;-1:-1:-1;;;31263:2:1;31248:18;;31241:40;31313:3;31298:19;;30917:406::o;31328:465::-;31585:2;31574:9;31567:21;31548:4;31611:56;31663:2;31652:9;31648:18;31640:6;31611:56;:::i;:::-;31715:9;31707:6;31703:22;31698:2;31687:9;31683:18;31676:50;31743:44;31780:6;31772;31743:44;:::i;:::-;31735:52;31328:465;-1:-1:-1;;;;;31328:465:1:o;32032:127::-;32093:10;32088:3;32084:20;32081:1;32074:31;32124:4;32121:1;32114:15;32148:4;32145:1;32138:15;32164:120;32204:1;32230;32220:35;;32235:18;;:::i;:::-;-1:-1:-1;32269:9:1;;32164:120::o;32726:112::-;32758:1;32784;32774:35;;32789:18;;:::i;:::-;-1:-1:-1;32823:9:1;;32726:112::o;32843:397::-;33045:2;33027:21;;;33084:2;33064:18;;;33057:30;33123:34;33118:2;33103:18;;33096:62;-1:-1:-1;;;33189:2:1;33174:18;;33167:31;33230:3;33215:19;;32843:397::o;33498:128::-;33565:9;;;33586:11;;;33583:37;;;33600:18;;:::i;35129:827::-;-1:-1:-1;;;;;35526:15:1;;;35508:34;;35578:15;;35573:2;35558:18;;35551:43;35488:3;35625:2;35610:18;;35603:31;;;35451:4;;35657:57;;35694:19;;35686:6;35657:57;:::i;:::-;35762:9;35754:6;35750:22;35745:2;35734:9;35730:18;35723:50;35796:44;35833:6;35825;35796:44;:::i;:::-;35782:58;;35889:9;35881:6;35877:22;35871:3;35860:9;35856:19;35849:51;35917:33;35943:6;35935;35917:33;:::i;:::-;35909:41;35129:827;-1:-1:-1;;;;;;;;35129:827:1:o;35961:249::-;36030:6;36083:2;36071:9;36062:7;36058:23;36054:32;36051:52;;;36099:1;36096;36089:12;36051:52;36131:9;36125:16;36150:30;36174:5;36150:30;:::i;36215:179::-;36250:3;36292:1;36274:16;36271:23;36268:120;;;36338:1;36335;36332;36317:23;-1:-1:-1;36375:1:1;36369:8;36364:3;36360:18;36268:120;36215:179;:::o;36399:671::-;36438:3;36480:4;36462:16;36459:26;36456:39;;;36399:671;:::o;36456:39::-;36522:2;36516:9;-1:-1:-1;;36587:16:1;36583:25;;36580:1;36516:9;36559:50;36638:4;36632:11;36662:16;-1:-1:-1;;;;;36768:2:1;36761:4;36753:6;36749:17;36746:25;36741:2;36733:6;36730:14;36727:45;36724:58;;;36775:5;;;;;36399:671;:::o;36724:58::-;36812:6;36806:4;36802:17;36791:28;;36848:3;36842:10;36875:2;36867:6;36864:14;36861:27;;;36881:5;;;;;;36399:671;:::o;36861:27::-;36965:2;36946:16;36940:4;36936:27;36932:36;36925:4;36916:6;36911:3;36907:16;36903:27;36900:69;36897:82;;;36972:5;;;;;;36399:671;:::o;36897:82::-;36988:57;37039:4;37030:6;37022;37018:19;37014:30;37008:4;36988:57;:::i;:::-;-1:-1:-1;37061:3:1;;36399:671;-1:-1:-1;;;;;36399:671:1:o;37496:404::-;37698:2;37680:21;;;37737:2;37717:18;;;37710:30;37776:34;37771:2;37756:18;;37749:62;-1:-1:-1;;;37842:2:1;37827:18;;37820:38;37890:3;37875:19;;37496:404::o;37905:561::-;-1:-1:-1;;;;;38202:15:1;;;38184:34;;38254:15;;38249:2;38234:18;;38227:43;38301:2;38286:18;;38279:34;;;38344:2;38329:18;;38322:34;;;38164:3;38387;38372:19;;38365:32;;;38127:4;;38414:46;;38440:19;;38432:6;38414:46;:::i;38471:245::-;38538:6;38591:2;38579:9;38570:7;38566:23;38562:32;38559:52;;;38607:1;38604;38597:12;38559:52;38639:9;38633:16;38658:28;38680:5;38658:28;:::i;39897:287::-;40026:3;40064:6;40058:13;40080:66;40139:6;40134:3;40127:4;40119:6;40115:17;40080:66;:::i;:::-;40162:16;;;;;39897:287;-1:-1:-1;;39897:287:1:o

Swarm Source

ipfs://b06f62de42e077f2c68f2e95729cd4e7bc67f095e8641dfe281c109431716cb3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.