ETH Price: $3,253.97 (-0.00%)
Gas: 1 Gwei

Token

UB SAFE (UB)
 

Overview

Max Total Supply

681 UB

Holders

546

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
keyno28.eth
Balance
1 UB
0x9F9aF0E5a16Cf2755E6717f8476907Bdf89e47d9
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:
UnBankable

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-05
*/

// SPDX-License-Identifier: MIT

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/token/ERC721/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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/utils/math/SaftMath.sol
pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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/ERC721/[email protected]


pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/access/[email protected]


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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), 'ERC721Burnable: caller is not owner nor approved');
        _burn(tokenId);
    }
}

pragma solidity ^0.8.0;
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


pragma solidity ^0.8.0;

contract UnBankable is ERC721, ERC721Enumerable, Ownable,ERC721Burnable {

    using Counters for Counters.Counter;
    using SafeMath for uint256;
    using Strings for uint256;

    Counters.Counter private _tokenIdCounter;
    uint256 private  tokenPrice = 0; // 0.09 ETH 90000000000000000
    uint256 private  limitTransaction = 1;
    uint256 private  limitWallet      = 1;
    uint256 public maxSupply = 13462;
    bool public saleIsActive = true;
    bool public presaleActive = true;
    bool public revealed = false;
    string public notRevealedUri = "";
    string private _baseURIextended;
    string private baseExtension = ".json";
    bytes32 public merkleRoot = 0xe65be91ecf56e8c8ebe9fa90860753f9b58419ae72b8029371556efd370e4f08;


    constructor(string memory baseURI, string memory _notrevealURI) ERC721("UB SAFE", "UB") { 
        _baseURIextended = baseURI;
        notRevealedUri = _notrevealURI;
    }
 
 
    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function reveal() external onlyOwner {
        revealed = true;
    }

    function setBaseExtension(string memory _baseExtension) public onlyOwner {
        baseExtension = _baseExtension;
    }

    function setMerkleRoot(bytes32 merkleHash) public onlyOwner {
        merkleRoot = merkleHash;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );
        
        if(revealed == false) {
            return notRevealedUri;
        }

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

    function setTokenPrice(uint256 _price) public onlyOwner {
        tokenPrice = _price;
    }

    function setLimitWallet(uint256 _limit) public onlyOwner {
        limitWallet = _limit;
    }

    function setMax(uint256 _supply) external onlyOwner() {
        maxSupply = _supply;
    }

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

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function toogleSale() external onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function togglePresale() external onlyOwner {
        presaleActive = !presaleActive;
    }

    modifier saleIsOpen {
        require(totalToken() <= maxSupply, "Soldout!");
        require(saleIsActive, "Sales not open");
        _;
    }

    function totalToken() public view returns (uint256) {
        return _tokenIdCounter.current();
    }

    function mintToken(uint256 numberOfTokens, bytes32[] calldata _merkleProof) public payable saleIsOpen {
        uint256 total = totalToken();
        require(total + numberOfTokens <= maxSupply, "Max limit");
        require(numberOfTokens <= limitTransaction, "Exceeded max token purchase per transaction");
        require(balanceOf(msg.sender) + numberOfTokens <= limitWallet, "Exceeded max token purchase per wallet");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(presaleActive == false || MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not whitelist");

        for (uint256 i = 0; i < numberOfTokens; i++) internalMint(msg.sender);    
    }

    function internalMint(address to) internal {
        _tokenIdCounter.increment();
        _safeMint(to, totalToken());
    }

    function airdrop(uint8 numberofTokens, address to ) external onlyOwner {
        for (uint8 i = 0; i < numberofTokens; i++) internalMint(to);
    }

    function _widthdraw(address _address, uint256 _amount) public onlyOwner {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        _widthdraw(msg.sender, balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"_notrevealURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_widthdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberofTokens","type":"uint8"},{"internalType":"address","name":"to","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setLimitWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleHash","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toogleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c556001600d556001600e55613496600f556001601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff02191690831515021790555060405180602001604052806000815250601190805190602001906200009192919062000302565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060139080519060200190620000df92919062000302565b507fe65be91ecf56e8c8ebe9fa90860753f9b58419ae72b8029371556efd370e4f0860001b6014553480156200011457600080fd5b50604051620056943803806200569483398181016040528101906200013a919062000424565b6040518060400160405280600781526020017f55422053414645000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f55420000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001be92919062000302565b508060019080519060200190620001d792919062000302565b505050620001fa620001ee6200023460201b60201c565b6200023c60201b60201c565b81601290805190602001906200021292919062000302565b5080601190805190602001906200022b92919062000302565b505050620005c8565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003109062000534565b90600052602060002090601f01602090048101928262000334576000855562000380565b82601f106200034f57805160ff191683800117855562000380565b8280016001018555821562000380579182015b828111156200037f57825182559160200191906001019062000362565b5b5090506200038f919062000393565b5090565b5b80821115620003ae57600081600090555060010162000394565b5090565b6000620003c9620003c384620004cb565b62000497565b905082815260208101848484011115620003e257600080fd5b620003ef848285620004fe565b509392505050565b600082601f8301126200040957600080fd5b81516200041b848260208601620003b2565b91505092915050565b600080604083850312156200043857600080fd5b600083015167ffffffffffffffff8111156200045357600080fd5b6200046185828601620003f7565b925050602083015167ffffffffffffffff8111156200047f57600080fd5b6200048d85828601620003f7565b9150509250929050565b6000604051905081810181811067ffffffffffffffff82111715620004c157620004c062000599565b5b8060405250919050565b600067ffffffffffffffff821115620004e957620004e862000599565b5b601f19601f8301169050602081019050919050565b60005b838110156200051e57808201518184015260208101905062000501565b838111156200052e576000848401525b50505050565b600060028204905060018216806200054d57607f821691505b602082108114156200056457620005636200056a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6150bc80620005d86000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063b3d6c53c116100b6578063da3ef23f1161007a578063da3ef23f1461081f578063e985e9c514610848578063eb8d244414610885578063f2c4ce1e146108b0578063f2fde38b146108d9578063fe92b0931461090257610246565b8063b3d6c53c1461073c578063b4e380d514610765578063b88d4fde1461078e578063c87b56dd146107b7578063d5abeb01146107f457610246565b80638da5cb5b116100fd5780638da5cb5b1461068a57806395d89b41146106b5578063a22cb465146106e0578063a475b5dd14610709578063ae7c122e1461072057610246565b806370a08231146105df578063715018a61461061c5780637cb6475914610633578063814c36341461065c578063853828b61461067357610246565b806334393743116101c757806353135ca01161018b57806353135ca0146104fa57806355f804b314610525578063626be5671461054e5780636352211e146105795780636a61e5fc146105b657610246565b8063343937431461042957806342842e0e1461044057806342966c68146104695780634f6ccce71461049257806351830227146104cf57610246565b806318160ddd1161020e57806318160ddd146103445780631fe9eabc1461036f57806323b872dd146103985780632eb4a7ab146103c15780632f745c59146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063081c8c44146102f0578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613a45565b61092b565b60405161027f9190614775565b60405180910390f35b34801561029457600080fd5b5061029d61093d565b6040516102aa91906147ab565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613ad8565b6109cf565b6040516102e7919061470e565b60405180910390f35b3480156102fc57600080fd5b50610305610a54565b60405161031291906147ab565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d91906139e0565b610ae2565b005b34801561035057600080fd5b50610359610bfa565b6040516103669190614b2d565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613ad8565b610c07565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906138da565b610c8d565b005b3480156103cd57600080fd5b506103d6610ced565b6040516103e39190614790565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e91906139e0565b610cf3565b6040516104209190614b2d565b60405180910390f35b34801561043557600080fd5b5061043e610d98565b005b34801561044c57600080fd5b50610467600480360381019061046291906138da565b610e40565b005b34801561047557600080fd5b50610490600480360381019061048b9190613ad8565b610e60565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613ad8565b610ebc565b6040516104c69190614b2d565b60405180910390f35b3480156104db57600080fd5b506104e4610f53565b6040516104f19190614775565b60405180910390f35b34801561050657600080fd5b5061050f610f66565b60405161051c9190614775565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613a97565b610f79565b005b34801561055a57600080fd5b5061056361100f565b6040516105709190614b2d565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613ad8565b611020565b6040516105ad919061470e565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d89190613ad8565b6110d2565b005b3480156105eb57600080fd5b5061060660048036038101906106019190613875565b611158565b6040516106139190614b2d565b60405180910390f35b34801561062857600080fd5b50610631611210565b005b34801561063f57600080fd5b5061065a60048036038101906106559190613a1c565b61134d565b005b34801561066857600080fd5b506106716113d3565b005b34801561067f57600080fd5b5061068861147b565b005b34801561069657600080fd5b5061069f611516565b6040516106ac919061470e565b60405180910390f35b3480156106c157600080fd5b506106ca611540565b6040516106d791906147ab565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906139a4565b6115d2565b005b34801561071557600080fd5b5061071e611753565b005b61073a60048036038101906107359190613b01565b6117ec565b005b34801561074857600080fd5b50610763600480360381019061075e9190613b59565b611ad5565b005b34801561077157600080fd5b5061078c600480360381019061078791906139e0565b611b83565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613929565b611cb0565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613ad8565b611d12565b6040516107eb91906147ab565b60405180910390f35b34801561080057600080fd5b50610809611e6b565b6040516108169190614b2d565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613a97565b611e71565b005b34801561085457600080fd5b5061086f600480360381019061086a919061389e565b611f07565b60405161087c9190614775565b60405180910390f35b34801561089157600080fd5b5061089a611f9b565b6040516108a79190614775565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190613a97565b611fae565b005b3480156108e557600080fd5b5061090060048036038101906108fb9190613875565b612044565b005b34801561090e57600080fd5b5061092960048036038101906109249190613ad8565b61213c565b005b6000610936826121c2565b9050919050565b60606000805461094c90614e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461097890614e1e565b80156109c55780601f1061099a576101008083540402835291602001916109c5565b820191906000526020600020905b8154815290600101906020018083116109a857829003601f168201915b5050505050905090565b60006109da8261223c565b610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a10906149ad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610a6190614e1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8d90614e1e565b8015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b505050505081565b6000610aed82611020565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590614a2d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7d6122a8565b73ffffffffffffffffffffffffffffffffffffffff161480610bac5750610bab81610ba66122a8565b611f07565b5b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be29061492d565b60405180910390fd5b610bf583836122b0565b505050565b6000600880549050905090565b610c0f6122a8565b73ffffffffffffffffffffffffffffffffffffffff16610c2d611516565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a906149cd565b60405180910390fd5b80600f8190555050565b610c9e610c986122a8565b82612369565b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490614a8d565b60405180910390fd5b610ce8838383612447565b505050565b60145481565b6000610cfe83611158565b8210610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906147ed565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610da06122a8565b73ffffffffffffffffffffffffffffffffffffffff16610dbe611516565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906149cd565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610e5b83838360405180602001604052806000815250611cb0565b505050565b610e71610e6b6122a8565b82612369565b610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614aed565b60405180910390fd5b610eb9816126a3565b50565b6000610ec6610bfa565b8210610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90614aad565b60405180910390fd5b60088281548110610f41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601060029054906101000a900460ff1681565b601060019054906101000a900460ff1681565b610f816122a8565b73ffffffffffffffffffffffffffffffffffffffff16610f9f611516565b73ffffffffffffffffffffffffffffffffffffffff1614610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec906149cd565b60405180910390fd5b806012908051906020019061100b929190613625565b5050565b600061101b600b6127b4565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c09061496d565b60405180910390fd5b80915050919050565b6110da6122a8565b73ffffffffffffffffffffffffffffffffffffffff166110f8611516565b73ffffffffffffffffffffffffffffffffffffffff161461114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906149cd565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c09061494d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112186122a8565b73ffffffffffffffffffffffffffffffffffffffff16611236611516565b73ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611283906149cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113556122a8565b73ffffffffffffffffffffffffffffffffffffffff16611373611516565b73ffffffffffffffffffffffffffffffffffffffff16146113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906149cd565b60405180910390fd5b8060148190555050565b6113db6122a8565b73ffffffffffffffffffffffffffffffffffffffff166113f9611516565b73ffffffffffffffffffffffffffffffffffffffff161461144f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611446906149cd565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6114836122a8565b73ffffffffffffffffffffffffffffffffffffffff166114a1611516565b73ffffffffffffffffffffffffffffffffffffffff16146114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee906149cd565b60405180910390fd5b60004790506000811161150957600080fd5b6115133382611b83565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461154f90614e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461157b90614e1e565b80156115c85780601f1061159d576101008083540402835291602001916115c8565b820191906000526020600020905b8154815290600101906020018083116115ab57829003601f168201915b5050505050905090565b6115da6122a8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f906148ad565b60405180910390fd5b80600560006116556122a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117026122a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117479190614775565b60405180910390a35050565b61175b6122a8565b73ffffffffffffffffffffffffffffffffffffffff16611779611516565b73ffffffffffffffffffffffffffffffffffffffff16146117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c6906149cd565b60405180910390fd5b6001601060026101000a81548160ff021916908315150217905550565b600f546117f761100f565b1115611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90614b0d565b60405180910390fd5b601060009054906101000a900460ff16611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90614a4d565b60405180910390fd5b600061189161100f565b9050600f5484826118a29190614c3c565b11156118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da906148ed565b60405180910390fd5b600d54841115611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906147cd565b60405180910390fd5b600e548461193533611158565b61193f9190614c3c565b1115611980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119779061486d565b60405180910390fd5b3484600c5461198f9190614cc3565b11156119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c7906148cd565b60405180910390fd5b6000336040516020016119e39190614681565b60405160208183030381529060405280519060200120905060001515601060019054906101000a900460ff1615151480611a675750611a66848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836127c2565b5b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90614acd565b60405180910390fd5b60005b85811015611acd57611aba336127d9565b8080611ac590614e50565b915050611aa9565b505050505050565b611add6122a8565b73ffffffffffffffffffffffffffffffffffffffff16611afb611516565b73ffffffffffffffffffffffffffffffffffffffff1614611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b48906149cd565b60405180910390fd5b60005b8260ff168160ff161015611b7e57611b6b826127d9565b8080611b7690614e99565b915050611b54565b505050565b611b8b6122a8565b73ffffffffffffffffffffffffffffffffffffffff16611ba9611516565b73ffffffffffffffffffffffffffffffffffffffff1614611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf6906149cd565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c25906146f9565b60006040518083038185875af1925050503d8060008114611c62576040519150601f19603f3d011682016040523d82523d6000602084013e611c67565b606091505b5050905080611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca290614a6d565b60405180910390fd5b505050565b611cc1611cbb6122a8565b83612369565b611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790614a8d565b60405180910390fd5b611d0c848484846127f7565b50505050565b6060611d1d8261223c565b611d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5390614a0d565b60405180910390fd5b60001515601060029054906101000a900460ff1615151415611e0a5760118054611d8590614e1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611db190614e1e565b8015611dfe5780601f10611dd357610100808354040283529160200191611dfe565b820191906000526020600020905b815481529060010190602001808311611de157829003601f168201915b50505050509050611e66565b6000611e14612853565b90506000815111611e345760405180602001604052806000815250611e62565b80611e3e846128e5565b6013604051602001611e52939291906146c8565b6040516020818303038152906040525b9150505b919050565b600f5481565b611e796122a8565b73ffffffffffffffffffffffffffffffffffffffff16611e97611516565b73ffffffffffffffffffffffffffffffffffffffff1614611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906149cd565b60405180910390fd5b8060139080519060200190611f03929190613625565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b611fb66122a8565b73ffffffffffffffffffffffffffffffffffffffff16611fd4611516565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612021906149cd565b60405180910390fd5b8060119080519060200190612040929190613625565b5050565b61204c6122a8565b73ffffffffffffffffffffffffffffffffffffffff1661206a611516565b73ffffffffffffffffffffffffffffffffffffffff16146120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b7906149cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612130576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121279061482d565b60405180910390fd5b61213981612a92565b50565b6121446122a8565b73ffffffffffffffffffffffffffffffffffffffff16612162611516565b73ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906149cd565b60405180910390fd5b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612235575061223482612b58565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661232383611020565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123748261223c565b6123b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123aa9061490d565b60405180910390fd5b60006123be83611020565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061242d57508373ffffffffffffffffffffffffffffffffffffffff16612415846109cf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243e575061243d8185611f07565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661246782611020565b73ffffffffffffffffffffffffffffffffffffffff16146124bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b4906149ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561252d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125249061488d565b60405180910390fd5b612538838383612c3a565b6125436000826122b0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125939190614d1d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ea9190614c3c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126ae82611020565b90506126bc81600084612c3a565b6126c76000836122b0565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127179190614d1d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600001549050919050565b6000826127cf8584612c4a565b1490509392505050565b6127e3600b612d23565b6127f4816127ef61100f565b612d39565b50565b612802848484612447565b61280e84848484612d57565b61284d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128449061480d565b60405180910390fd5b50505050565b60606012805461286290614e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461288e90614e1e565b80156128db5780601f106128b0576101008083540402835291602001916128db565b820191906000526020600020905b8154815290600101906020018083116128be57829003601f168201915b5050505050905090565b6060600082141561292d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8d565b600082905060005b6000821461295f57808061294890614e50565b915050600a826129589190614c92565b9150612935565b60008167ffffffffffffffff8111156129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129d35781602001600182028036833780820191505090505b5090505b60008514612a86576001826129ec9190614d1d565b9150600a856129fb9190614ef1565b6030612a079190614c3c565b60f81b818381518110612a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a7f9190614c92565b94506129d7565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c2357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c335750612c3282612eee565b5b9050919050565b612c45838383612f58565b505050565b60008082905060005b8451811015612d18576000858281518110612c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612cd8578281604051602001612cbb92919061469c565b604051602081830303815290604052805190602001209250612d04565b8083604051602001612ceb92919061469c565b6040516020818303038152906040528051906020012092505b508080612d1090614e50565b915050612c53565b508091505092915050565b6001816000016000828254019250508190555050565b612d5382826040518060200160405280600081525061306c565b5050565b6000612d788473ffffffffffffffffffffffffffffffffffffffff166130c7565b15612ee1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612da16122a8565b8786866040518563ffffffff1660e01b8152600401612dc39493929190614729565b602060405180830381600087803b158015612ddd57600080fd5b505af1925050508015612e0e57506040513d601f19601f82011682018060405250810190612e0b9190613a6e565b60015b612e91573d8060008114612e3e576040519150601f19603f3d011682016040523d82523d6000602084013e612e43565b606091505b50600081511415612e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e809061480d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ee6565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f638383836130da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fa657612fa1816130df565b612fe5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fe457612fe38382613128565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130285761302381613295565b613067565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130665761306582826133d8565b5b5b505050565b6130768383613457565b6130836000848484612d57565b6130c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b99061480d565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161313584611158565b61313f9190614d1d565b9050600060076000848152602001908152602001600020549050818114613224576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132a99190614d1d565b90506000600960008481526020019081526020016000205490506000600883815481106132ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613347577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133e383611158565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134be9061498d565b60405180910390fd5b6134d08161223c565b15613510576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135079061484d565b60405180910390fd5b61351c60008383612c3a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461356c9190614c3c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461363190614e1e565b90600052602060002090601f016020900481019282613653576000855561369a565b82601f1061366c57805160ff191683800117855561369a565b8280016001018555821561369a579182015b8281111561369957825182559160200191906001019061367e565b5b5090506136a791906136ab565b5090565b5b808211156136c45760008160009055506001016136ac565b5090565b60006136db6136d684614b79565b614b48565b9050828152602081018484840111156136f357600080fd5b6136fe848285614ddc565b509392505050565b600061371961371484614ba9565b614b48565b90508281526020810184848401111561373157600080fd5b61373c848285614ddc565b509392505050565b60008135905061375381614ffc565b92915050565b60008083601f84011261376b57600080fd5b8235905067ffffffffffffffff81111561378457600080fd5b60208301915083602082028301111561379c57600080fd5b9250929050565b6000813590506137b281615013565b92915050565b6000813590506137c78161502a565b92915050565b6000813590506137dc81615041565b92915050565b6000815190506137f181615041565b92915050565b600082601f83011261380857600080fd5b81356138188482602086016136c8565b91505092915050565b600082601f83011261383257600080fd5b8135613842848260208601613706565b91505092915050565b60008135905061385a81615058565b92915050565b60008135905061386f8161506f565b92915050565b60006020828403121561388757600080fd5b600061389584828501613744565b91505092915050565b600080604083850312156138b157600080fd5b60006138bf85828601613744565b92505060206138d085828601613744565b9150509250929050565b6000806000606084860312156138ef57600080fd5b60006138fd86828701613744565b935050602061390e86828701613744565b925050604061391f8682870161384b565b9150509250925092565b6000806000806080858703121561393f57600080fd5b600061394d87828801613744565b945050602061395e87828801613744565b935050604061396f8782880161384b565b925050606085013567ffffffffffffffff81111561398c57600080fd5b613998878288016137f7565b91505092959194509250565b600080604083850312156139b757600080fd5b60006139c585828601613744565b92505060206139d6858286016137a3565b9150509250929050565b600080604083850312156139f357600080fd5b6000613a0185828601613744565b9250506020613a128582860161384b565b9150509250929050565b600060208284031215613a2e57600080fd5b6000613a3c848285016137b8565b91505092915050565b600060208284031215613a5757600080fd5b6000613a65848285016137cd565b91505092915050565b600060208284031215613a8057600080fd5b6000613a8e848285016137e2565b91505092915050565b600060208284031215613aa957600080fd5b600082013567ffffffffffffffff811115613ac357600080fd5b613acf84828501613821565b91505092915050565b600060208284031215613aea57600080fd5b6000613af88482850161384b565b91505092915050565b600080600060408486031215613b1657600080fd5b6000613b248682870161384b565b935050602084013567ffffffffffffffff811115613b4157600080fd5b613b4d86828701613759565b92509250509250925092565b60008060408385031215613b6c57600080fd5b6000613b7a85828601613860565b9250506020613b8b85828601613744565b9150509250929050565b613b9e81614d51565b82525050565b613bb5613bb082614d51565b614ec3565b82525050565b613bc481614d63565b82525050565b613bd381614d6f565b82525050565b613bea613be582614d6f565b614ed5565b82525050565b6000613bfb82614bee565b613c058185614c04565b9350613c15818560208601614deb565b613c1e81614fde565b840191505092915050565b6000613c3482614bf9565b613c3e8185614c20565b9350613c4e818560208601614deb565b613c5781614fde565b840191505092915050565b6000613c6d82614bf9565b613c778185614c31565b9350613c87818560208601614deb565b80840191505092915050565b60008154613ca081614e1e565b613caa8186614c31565b94506001821660008114613cc55760018114613cd657613d09565b60ff19831686528186019350613d09565b613cdf85614bd9565b60005b83811015613d0157815481890152600182019150602081019050613ce2565b838801955050505b50505092915050565b6000613d1f602b83614c20565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f7472616e73616374696f6e0000000000000000000000000000000000000000006020830152604082019050919050565b6000613d85602b83614c20565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613deb603283614c20565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613e51602683614c20565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eb7601c83614c20565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613ef7602683614c20565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f77616c6c657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f5d602483614c20565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc3601983614c20565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614003601f83614c20565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614043600983614c20565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b6000614083602c83614c20565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006140e9603883614c20565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061414f602a83614c20565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b5602983614c20565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061421b602083614c20565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061425b602c83614c20565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142c1602083614c20565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614301602983614c20565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614367602f83614c20565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006143cd602183614c20565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614433600e83614c20565b91507f53616c6573206e6f74206f70656e0000000000000000000000000000000000006000830152602082019050919050565b6000614473600083614c15565b9150600082019050919050565b600061448d601083614c20565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b60006144cd603183614c20565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614533602c83614c20565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614599600d83614c20565b91507f4e6f742077686974656c697374000000000000000000000000000000000000006000830152602082019050919050565b60006145d9603083614c20565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b600061463f600883614c20565b91507f536f6c646f7574210000000000000000000000000000000000000000000000006000830152602082019050919050565b61467b81614dc5565b82525050565b600061468d8284613ba4565b60148201915081905092915050565b60006146a88285613bd9565b6020820191506146b88284613bd9565b6020820191508190509392505050565b60006146d48286613c62565b91506146e08285613c62565b91506146ec8284613c93565b9150819050949350505050565b600061470482614466565b9150819050919050565b60006020820190506147236000830184613b95565b92915050565b600060808201905061473e6000830187613b95565b61474b6020830186613b95565b6147586040830185614672565b818103606083015261476a8184613bf0565b905095945050505050565b600060208201905061478a6000830184613bbb565b92915050565b60006020820190506147a56000830184613bca565b92915050565b600060208201905081810360008301526147c58184613c29565b905092915050565b600060208201905081810360008301526147e681613d12565b9050919050565b6000602082019050818103600083015261480681613d78565b9050919050565b6000602082019050818103600083015261482681613dde565b9050919050565b6000602082019050818103600083015261484681613e44565b9050919050565b6000602082019050818103600083015261486681613eaa565b9050919050565b6000602082019050818103600083015261488681613eea565b9050919050565b600060208201905081810360008301526148a681613f50565b9050919050565b600060208201905081810360008301526148c681613fb6565b9050919050565b600060208201905081810360008301526148e681613ff6565b9050919050565b6000602082019050818103600083015261490681614036565b9050919050565b6000602082019050818103600083015261492681614076565b9050919050565b60006020820190508181036000830152614946816140dc565b9050919050565b6000602082019050818103600083015261496681614142565b9050919050565b60006020820190508181036000830152614986816141a8565b9050919050565b600060208201905081810360008301526149a68161420e565b9050919050565b600060208201905081810360008301526149c68161424e565b9050919050565b600060208201905081810360008301526149e6816142b4565b9050919050565b60006020820190508181036000830152614a06816142f4565b9050919050565b60006020820190508181036000830152614a268161435a565b9050919050565b60006020820190508181036000830152614a46816143c0565b9050919050565b60006020820190508181036000830152614a6681614426565b9050919050565b60006020820190508181036000830152614a8681614480565b9050919050565b60006020820190508181036000830152614aa6816144c0565b9050919050565b60006020820190508181036000830152614ac681614526565b9050919050565b60006020820190508181036000830152614ae68161458c565b9050919050565b60006020820190508181036000830152614b06816145cc565b9050919050565b60006020820190508181036000830152614b2681614632565b9050919050565b6000602082019050614b426000830184614672565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b6f57614b6e614faf565b5b8060405250919050565b600067ffffffffffffffff821115614b9457614b93614faf565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614bc457614bc3614faf565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c4782614dc5565b9150614c5283614dc5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c8757614c86614f22565b5b828201905092915050565b6000614c9d82614dc5565b9150614ca883614dc5565b925082614cb857614cb7614f51565b5b828204905092915050565b6000614cce82614dc5565b9150614cd983614dc5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d1257614d11614f22565b5b828202905092915050565b6000614d2882614dc5565b9150614d3383614dc5565b925082821015614d4657614d45614f22565b5b828203905092915050565b6000614d5c82614da5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e09578082015181840152602081019050614dee565b83811115614e18576000848401525b50505050565b60006002820490506001821680614e3657607f821691505b60208210811415614e4a57614e49614f80565b5b50919050565b6000614e5b82614dc5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e8e57614e8d614f22565b5b600182019050919050565b6000614ea482614dcf565b915060ff821415614eb857614eb7614f22565b5b600182019050919050565b6000614ece82614edf565b9050919050565b6000819050919050565b6000614eea82614fef565b9050919050565b6000614efc82614dc5565b9150614f0783614dc5565b925082614f1757614f16614f51565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61500581614d51565b811461501057600080fd5b50565b61501c81614d63565b811461502757600080fd5b50565b61503381614d6f565b811461503e57600080fd5b50565b61504a81614d79565b811461505557600080fd5b50565b61506181614dc5565b811461506c57600080fd5b50565b61507881614dcf565b811461508357600080fd5b5056fea26469706673582212201425e7e087cdfc69e4cb8f0ee568bd19b179077deb3e7e642af28bd1e520556e64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063b3d6c53c116100b6578063da3ef23f1161007a578063da3ef23f1461081f578063e985e9c514610848578063eb8d244414610885578063f2c4ce1e146108b0578063f2fde38b146108d9578063fe92b0931461090257610246565b8063b3d6c53c1461073c578063b4e380d514610765578063b88d4fde1461078e578063c87b56dd146107b7578063d5abeb01146107f457610246565b80638da5cb5b116100fd5780638da5cb5b1461068a57806395d89b41146106b5578063a22cb465146106e0578063a475b5dd14610709578063ae7c122e1461072057610246565b806370a08231146105df578063715018a61461061c5780637cb6475914610633578063814c36341461065c578063853828b61461067357610246565b806334393743116101c757806353135ca01161018b57806353135ca0146104fa57806355f804b314610525578063626be5671461054e5780636352211e146105795780636a61e5fc146105b657610246565b8063343937431461042957806342842e0e1461044057806342966c68146104695780634f6ccce71461049257806351830227146104cf57610246565b806318160ddd1161020e57806318160ddd146103445780631fe9eabc1461036f57806323b872dd146103985780632eb4a7ab146103c15780632f745c59146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063081c8c44146102f0578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613a45565b61092b565b60405161027f9190614775565b60405180910390f35b34801561029457600080fd5b5061029d61093d565b6040516102aa91906147ab565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613ad8565b6109cf565b6040516102e7919061470e565b60405180910390f35b3480156102fc57600080fd5b50610305610a54565b60405161031291906147ab565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d91906139e0565b610ae2565b005b34801561035057600080fd5b50610359610bfa565b6040516103669190614b2d565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613ad8565b610c07565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906138da565b610c8d565b005b3480156103cd57600080fd5b506103d6610ced565b6040516103e39190614790565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e91906139e0565b610cf3565b6040516104209190614b2d565b60405180910390f35b34801561043557600080fd5b5061043e610d98565b005b34801561044c57600080fd5b50610467600480360381019061046291906138da565b610e40565b005b34801561047557600080fd5b50610490600480360381019061048b9190613ad8565b610e60565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613ad8565b610ebc565b6040516104c69190614b2d565b60405180910390f35b3480156104db57600080fd5b506104e4610f53565b6040516104f19190614775565b60405180910390f35b34801561050657600080fd5b5061050f610f66565b60405161051c9190614775565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613a97565b610f79565b005b34801561055a57600080fd5b5061056361100f565b6040516105709190614b2d565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613ad8565b611020565b6040516105ad919061470e565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d89190613ad8565b6110d2565b005b3480156105eb57600080fd5b5061060660048036038101906106019190613875565b611158565b6040516106139190614b2d565b60405180910390f35b34801561062857600080fd5b50610631611210565b005b34801561063f57600080fd5b5061065a60048036038101906106559190613a1c565b61134d565b005b34801561066857600080fd5b506106716113d3565b005b34801561067f57600080fd5b5061068861147b565b005b34801561069657600080fd5b5061069f611516565b6040516106ac919061470e565b60405180910390f35b3480156106c157600080fd5b506106ca611540565b6040516106d791906147ab565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906139a4565b6115d2565b005b34801561071557600080fd5b5061071e611753565b005b61073a60048036038101906107359190613b01565b6117ec565b005b34801561074857600080fd5b50610763600480360381019061075e9190613b59565b611ad5565b005b34801561077157600080fd5b5061078c600480360381019061078791906139e0565b611b83565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613929565b611cb0565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613ad8565b611d12565b6040516107eb91906147ab565b60405180910390f35b34801561080057600080fd5b50610809611e6b565b6040516108169190614b2d565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613a97565b611e71565b005b34801561085457600080fd5b5061086f600480360381019061086a919061389e565b611f07565b60405161087c9190614775565b60405180910390f35b34801561089157600080fd5b5061089a611f9b565b6040516108a79190614775565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190613a97565b611fae565b005b3480156108e557600080fd5b5061090060048036038101906108fb9190613875565b612044565b005b34801561090e57600080fd5b5061092960048036038101906109249190613ad8565b61213c565b005b6000610936826121c2565b9050919050565b60606000805461094c90614e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461097890614e1e565b80156109c55780601f1061099a576101008083540402835291602001916109c5565b820191906000526020600020905b8154815290600101906020018083116109a857829003601f168201915b5050505050905090565b60006109da8261223c565b610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a10906149ad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610a6190614e1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8d90614e1e565b8015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b505050505081565b6000610aed82611020565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590614a2d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7d6122a8565b73ffffffffffffffffffffffffffffffffffffffff161480610bac5750610bab81610ba66122a8565b611f07565b5b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be29061492d565b60405180910390fd5b610bf583836122b0565b505050565b6000600880549050905090565b610c0f6122a8565b73ffffffffffffffffffffffffffffffffffffffff16610c2d611516565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a906149cd565b60405180910390fd5b80600f8190555050565b610c9e610c986122a8565b82612369565b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490614a8d565b60405180910390fd5b610ce8838383612447565b505050565b60145481565b6000610cfe83611158565b8210610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906147ed565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610da06122a8565b73ffffffffffffffffffffffffffffffffffffffff16610dbe611516565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906149cd565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610e5b83838360405180602001604052806000815250611cb0565b505050565b610e71610e6b6122a8565b82612369565b610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614aed565b60405180910390fd5b610eb9816126a3565b50565b6000610ec6610bfa565b8210610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90614aad565b60405180910390fd5b60088281548110610f41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601060029054906101000a900460ff1681565b601060019054906101000a900460ff1681565b610f816122a8565b73ffffffffffffffffffffffffffffffffffffffff16610f9f611516565b73ffffffffffffffffffffffffffffffffffffffff1614610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec906149cd565b60405180910390fd5b806012908051906020019061100b929190613625565b5050565b600061101b600b6127b4565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c09061496d565b60405180910390fd5b80915050919050565b6110da6122a8565b73ffffffffffffffffffffffffffffffffffffffff166110f8611516565b73ffffffffffffffffffffffffffffffffffffffff161461114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906149cd565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c09061494d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112186122a8565b73ffffffffffffffffffffffffffffffffffffffff16611236611516565b73ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611283906149cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113556122a8565b73ffffffffffffffffffffffffffffffffffffffff16611373611516565b73ffffffffffffffffffffffffffffffffffffffff16146113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906149cd565b60405180910390fd5b8060148190555050565b6113db6122a8565b73ffffffffffffffffffffffffffffffffffffffff166113f9611516565b73ffffffffffffffffffffffffffffffffffffffff161461144f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611446906149cd565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6114836122a8565b73ffffffffffffffffffffffffffffffffffffffff166114a1611516565b73ffffffffffffffffffffffffffffffffffffffff16146114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee906149cd565b60405180910390fd5b60004790506000811161150957600080fd5b6115133382611b83565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461154f90614e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461157b90614e1e565b80156115c85780601f1061159d576101008083540402835291602001916115c8565b820191906000526020600020905b8154815290600101906020018083116115ab57829003601f168201915b5050505050905090565b6115da6122a8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f906148ad565b60405180910390fd5b80600560006116556122a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117026122a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117479190614775565b60405180910390a35050565b61175b6122a8565b73ffffffffffffffffffffffffffffffffffffffff16611779611516565b73ffffffffffffffffffffffffffffffffffffffff16146117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c6906149cd565b60405180910390fd5b6001601060026101000a81548160ff021916908315150217905550565b600f546117f761100f565b1115611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90614b0d565b60405180910390fd5b601060009054906101000a900460ff16611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90614a4d565b60405180910390fd5b600061189161100f565b9050600f5484826118a29190614c3c565b11156118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da906148ed565b60405180910390fd5b600d54841115611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906147cd565b60405180910390fd5b600e548461193533611158565b61193f9190614c3c565b1115611980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119779061486d565b60405180910390fd5b3484600c5461198f9190614cc3565b11156119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c7906148cd565b60405180910390fd5b6000336040516020016119e39190614681565b60405160208183030381529060405280519060200120905060001515601060019054906101000a900460ff1615151480611a675750611a66848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836127c2565b5b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90614acd565b60405180910390fd5b60005b85811015611acd57611aba336127d9565b8080611ac590614e50565b915050611aa9565b505050505050565b611add6122a8565b73ffffffffffffffffffffffffffffffffffffffff16611afb611516565b73ffffffffffffffffffffffffffffffffffffffff1614611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b48906149cd565b60405180910390fd5b60005b8260ff168160ff161015611b7e57611b6b826127d9565b8080611b7690614e99565b915050611b54565b505050565b611b8b6122a8565b73ffffffffffffffffffffffffffffffffffffffff16611ba9611516565b73ffffffffffffffffffffffffffffffffffffffff1614611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf6906149cd565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c25906146f9565b60006040518083038185875af1925050503d8060008114611c62576040519150601f19603f3d011682016040523d82523d6000602084013e611c67565b606091505b5050905080611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca290614a6d565b60405180910390fd5b505050565b611cc1611cbb6122a8565b83612369565b611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790614a8d565b60405180910390fd5b611d0c848484846127f7565b50505050565b6060611d1d8261223c565b611d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5390614a0d565b60405180910390fd5b60001515601060029054906101000a900460ff1615151415611e0a5760118054611d8590614e1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611db190614e1e565b8015611dfe5780601f10611dd357610100808354040283529160200191611dfe565b820191906000526020600020905b815481529060010190602001808311611de157829003601f168201915b50505050509050611e66565b6000611e14612853565b90506000815111611e345760405180602001604052806000815250611e62565b80611e3e846128e5565b6013604051602001611e52939291906146c8565b6040516020818303038152906040525b9150505b919050565b600f5481565b611e796122a8565b73ffffffffffffffffffffffffffffffffffffffff16611e97611516565b73ffffffffffffffffffffffffffffffffffffffff1614611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906149cd565b60405180910390fd5b8060139080519060200190611f03929190613625565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b611fb66122a8565b73ffffffffffffffffffffffffffffffffffffffff16611fd4611516565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612021906149cd565b60405180910390fd5b8060119080519060200190612040929190613625565b5050565b61204c6122a8565b73ffffffffffffffffffffffffffffffffffffffff1661206a611516565b73ffffffffffffffffffffffffffffffffffffffff16146120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b7906149cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612130576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121279061482d565b60405180910390fd5b61213981612a92565b50565b6121446122a8565b73ffffffffffffffffffffffffffffffffffffffff16612162611516565b73ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906149cd565b60405180910390fd5b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612235575061223482612b58565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661232383611020565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123748261223c565b6123b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123aa9061490d565b60405180910390fd5b60006123be83611020565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061242d57508373ffffffffffffffffffffffffffffffffffffffff16612415846109cf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243e575061243d8185611f07565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661246782611020565b73ffffffffffffffffffffffffffffffffffffffff16146124bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b4906149ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561252d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125249061488d565b60405180910390fd5b612538838383612c3a565b6125436000826122b0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125939190614d1d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ea9190614c3c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126ae82611020565b90506126bc81600084612c3a565b6126c76000836122b0565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127179190614d1d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600001549050919050565b6000826127cf8584612c4a565b1490509392505050565b6127e3600b612d23565b6127f4816127ef61100f565b612d39565b50565b612802848484612447565b61280e84848484612d57565b61284d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128449061480d565b60405180910390fd5b50505050565b60606012805461286290614e1e565b80601f016020809104026020016040519081016040528092919081815260200182805461288e90614e1e565b80156128db5780601f106128b0576101008083540402835291602001916128db565b820191906000526020600020905b8154815290600101906020018083116128be57829003601f168201915b5050505050905090565b6060600082141561292d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8d565b600082905060005b6000821461295f57808061294890614e50565b915050600a826129589190614c92565b9150612935565b60008167ffffffffffffffff8111156129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129d35781602001600182028036833780820191505090505b5090505b60008514612a86576001826129ec9190614d1d565b9150600a856129fb9190614ef1565b6030612a079190614c3c565b60f81b818381518110612a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a7f9190614c92565b94506129d7565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c2357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c335750612c3282612eee565b5b9050919050565b612c45838383612f58565b505050565b60008082905060005b8451811015612d18576000858281518110612c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612cd8578281604051602001612cbb92919061469c565b604051602081830303815290604052805190602001209250612d04565b8083604051602001612ceb92919061469c565b6040516020818303038152906040528051906020012092505b508080612d1090614e50565b915050612c53565b508091505092915050565b6001816000016000828254019250508190555050565b612d5382826040518060200160405280600081525061306c565b5050565b6000612d788473ffffffffffffffffffffffffffffffffffffffff166130c7565b15612ee1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612da16122a8565b8786866040518563ffffffff1660e01b8152600401612dc39493929190614729565b602060405180830381600087803b158015612ddd57600080fd5b505af1925050508015612e0e57506040513d601f19601f82011682018060405250810190612e0b9190613a6e565b60015b612e91573d8060008114612e3e576040519150601f19603f3d011682016040523d82523d6000602084013e612e43565b606091505b50600081511415612e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e809061480d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ee6565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f638383836130da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fa657612fa1816130df565b612fe5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fe457612fe38382613128565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130285761302381613295565b613067565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130665761306582826133d8565b5b5b505050565b6130768383613457565b6130836000848484612d57565b6130c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b99061480d565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161313584611158565b61313f9190614d1d565b9050600060076000848152602001908152602001600020549050818114613224576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132a99190614d1d565b90506000600960008481526020019081526020016000205490506000600883815481106132ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613347577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133e383611158565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134be9061498d565b60405180910390fd5b6134d08161223c565b15613510576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135079061484d565b60405180910390fd5b61351c60008383612c3a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461356c9190614c3c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461363190614e1e565b90600052602060002090601f016020900481019282613653576000855561369a565b82601f1061366c57805160ff191683800117855561369a565b8280016001018555821561369a579182015b8281111561369957825182559160200191906001019061367e565b5b5090506136a791906136ab565b5090565b5b808211156136c45760008160009055506001016136ac565b5090565b60006136db6136d684614b79565b614b48565b9050828152602081018484840111156136f357600080fd5b6136fe848285614ddc565b509392505050565b600061371961371484614ba9565b614b48565b90508281526020810184848401111561373157600080fd5b61373c848285614ddc565b509392505050565b60008135905061375381614ffc565b92915050565b60008083601f84011261376b57600080fd5b8235905067ffffffffffffffff81111561378457600080fd5b60208301915083602082028301111561379c57600080fd5b9250929050565b6000813590506137b281615013565b92915050565b6000813590506137c78161502a565b92915050565b6000813590506137dc81615041565b92915050565b6000815190506137f181615041565b92915050565b600082601f83011261380857600080fd5b81356138188482602086016136c8565b91505092915050565b600082601f83011261383257600080fd5b8135613842848260208601613706565b91505092915050565b60008135905061385a81615058565b92915050565b60008135905061386f8161506f565b92915050565b60006020828403121561388757600080fd5b600061389584828501613744565b91505092915050565b600080604083850312156138b157600080fd5b60006138bf85828601613744565b92505060206138d085828601613744565b9150509250929050565b6000806000606084860312156138ef57600080fd5b60006138fd86828701613744565b935050602061390e86828701613744565b925050604061391f8682870161384b565b9150509250925092565b6000806000806080858703121561393f57600080fd5b600061394d87828801613744565b945050602061395e87828801613744565b935050604061396f8782880161384b565b925050606085013567ffffffffffffffff81111561398c57600080fd5b613998878288016137f7565b91505092959194509250565b600080604083850312156139b757600080fd5b60006139c585828601613744565b92505060206139d6858286016137a3565b9150509250929050565b600080604083850312156139f357600080fd5b6000613a0185828601613744565b9250506020613a128582860161384b565b9150509250929050565b600060208284031215613a2e57600080fd5b6000613a3c848285016137b8565b91505092915050565b600060208284031215613a5757600080fd5b6000613a65848285016137cd565b91505092915050565b600060208284031215613a8057600080fd5b6000613a8e848285016137e2565b91505092915050565b600060208284031215613aa957600080fd5b600082013567ffffffffffffffff811115613ac357600080fd5b613acf84828501613821565b91505092915050565b600060208284031215613aea57600080fd5b6000613af88482850161384b565b91505092915050565b600080600060408486031215613b1657600080fd5b6000613b248682870161384b565b935050602084013567ffffffffffffffff811115613b4157600080fd5b613b4d86828701613759565b92509250509250925092565b60008060408385031215613b6c57600080fd5b6000613b7a85828601613860565b9250506020613b8b85828601613744565b9150509250929050565b613b9e81614d51565b82525050565b613bb5613bb082614d51565b614ec3565b82525050565b613bc481614d63565b82525050565b613bd381614d6f565b82525050565b613bea613be582614d6f565b614ed5565b82525050565b6000613bfb82614bee565b613c058185614c04565b9350613c15818560208601614deb565b613c1e81614fde565b840191505092915050565b6000613c3482614bf9565b613c3e8185614c20565b9350613c4e818560208601614deb565b613c5781614fde565b840191505092915050565b6000613c6d82614bf9565b613c778185614c31565b9350613c87818560208601614deb565b80840191505092915050565b60008154613ca081614e1e565b613caa8186614c31565b94506001821660008114613cc55760018114613cd657613d09565b60ff19831686528186019350613d09565b613cdf85614bd9565b60005b83811015613d0157815481890152600182019150602081019050613ce2565b838801955050505b50505092915050565b6000613d1f602b83614c20565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f7472616e73616374696f6e0000000000000000000000000000000000000000006020830152604082019050919050565b6000613d85602b83614c20565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613deb603283614c20565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613e51602683614c20565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eb7601c83614c20565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613ef7602683614c20565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f77616c6c657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f5d602483614c20565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc3601983614c20565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614003601f83614c20565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614043600983614c20565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b6000614083602c83614c20565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006140e9603883614c20565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061414f602a83614c20565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b5602983614c20565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061421b602083614c20565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061425b602c83614c20565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142c1602083614c20565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614301602983614c20565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614367602f83614c20565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006143cd602183614c20565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614433600e83614c20565b91507f53616c6573206e6f74206f70656e0000000000000000000000000000000000006000830152602082019050919050565b6000614473600083614c15565b9150600082019050919050565b600061448d601083614c20565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b60006144cd603183614c20565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614533602c83614c20565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614599600d83614c20565b91507f4e6f742077686974656c697374000000000000000000000000000000000000006000830152602082019050919050565b60006145d9603083614c20565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b600061463f600883614c20565b91507f536f6c646f7574210000000000000000000000000000000000000000000000006000830152602082019050919050565b61467b81614dc5565b82525050565b600061468d8284613ba4565b60148201915081905092915050565b60006146a88285613bd9565b6020820191506146b88284613bd9565b6020820191508190509392505050565b60006146d48286613c62565b91506146e08285613c62565b91506146ec8284613c93565b9150819050949350505050565b600061470482614466565b9150819050919050565b60006020820190506147236000830184613b95565b92915050565b600060808201905061473e6000830187613b95565b61474b6020830186613b95565b6147586040830185614672565b818103606083015261476a8184613bf0565b905095945050505050565b600060208201905061478a6000830184613bbb565b92915050565b60006020820190506147a56000830184613bca565b92915050565b600060208201905081810360008301526147c58184613c29565b905092915050565b600060208201905081810360008301526147e681613d12565b9050919050565b6000602082019050818103600083015261480681613d78565b9050919050565b6000602082019050818103600083015261482681613dde565b9050919050565b6000602082019050818103600083015261484681613e44565b9050919050565b6000602082019050818103600083015261486681613eaa565b9050919050565b6000602082019050818103600083015261488681613eea565b9050919050565b600060208201905081810360008301526148a681613f50565b9050919050565b600060208201905081810360008301526148c681613fb6565b9050919050565b600060208201905081810360008301526148e681613ff6565b9050919050565b6000602082019050818103600083015261490681614036565b9050919050565b6000602082019050818103600083015261492681614076565b9050919050565b60006020820190508181036000830152614946816140dc565b9050919050565b6000602082019050818103600083015261496681614142565b9050919050565b60006020820190508181036000830152614986816141a8565b9050919050565b600060208201905081810360008301526149a68161420e565b9050919050565b600060208201905081810360008301526149c68161424e565b9050919050565b600060208201905081810360008301526149e6816142b4565b9050919050565b60006020820190508181036000830152614a06816142f4565b9050919050565b60006020820190508181036000830152614a268161435a565b9050919050565b60006020820190508181036000830152614a46816143c0565b9050919050565b60006020820190508181036000830152614a6681614426565b9050919050565b60006020820190508181036000830152614a8681614480565b9050919050565b60006020820190508181036000830152614aa6816144c0565b9050919050565b60006020820190508181036000830152614ac681614526565b9050919050565b60006020820190508181036000830152614ae68161458c565b9050919050565b60006020820190508181036000830152614b06816145cc565b9050919050565b60006020820190508181036000830152614b2681614632565b9050919050565b6000602082019050614b426000830184614672565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b6f57614b6e614faf565b5b8060405250919050565b600067ffffffffffffffff821115614b9457614b93614faf565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614bc457614bc3614faf565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c4782614dc5565b9150614c5283614dc5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c8757614c86614f22565b5b828201905092915050565b6000614c9d82614dc5565b9150614ca883614dc5565b925082614cb857614cb7614f51565b5b828204905092915050565b6000614cce82614dc5565b9150614cd983614dc5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d1257614d11614f22565b5b828202905092915050565b6000614d2882614dc5565b9150614d3383614dc5565b925082821015614d4657614d45614f22565b5b828203905092915050565b6000614d5c82614da5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e09578082015181840152602081019050614dee565b83811115614e18576000848401525b50505050565b60006002820490506001821680614e3657607f821691505b60208210811415614e4a57614e49614f80565b5b50919050565b6000614e5b82614dc5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e8e57614e8d614f22565b5b600182019050919050565b6000614ea482614dcf565b915060ff821415614eb857614eb7614f22565b5b600182019050919050565b6000614ece82614edf565b9050919050565b6000819050919050565b6000614eea82614fef565b9050919050565b6000614efc82614dc5565b9150614f0783614dc5565b925082614f1757614f16614f51565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61500581614d51565b811461501057600080fd5b50565b61501c81614d63565b811461502757600080fd5b50565b61503381614d6f565b811461503e57600080fd5b50565b61504a81614d79565b811461505557600080fd5b50565b61506181614dc5565b811461506c57600080fd5b50565b61507881614dcf565b811461508357600080fd5b5056fea26469706673582212201425e7e087cdfc69e4cb8f0ee568bd19b179077deb3e7e642af28bd1e520556e64736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):
Arg [1] : _notrevealURI (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53475:4841:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56198:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28327:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29886:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54019:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29409:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44411:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55909:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30776:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54142:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44079:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56481:93;;;;;;;;;;;;;:::i;:::-;;31186:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51548:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44601:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53984:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53945:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54434:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56737:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28021:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55703:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27751:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41163:148;;;;;;;;;;;;;:::i;:::-;;55021:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56385:88;;;;;;;;;;;;;:::i;:::-;;58140:171;;;;;;;;;;;;;:::i;:::-;;40511:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28496:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30179:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54812:71;;;;;;;;;;;;;:::i;:::-;;56848:794;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57785:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57942:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31442:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55131:564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53868:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54891:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30545:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53907:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54678:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41466:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55805:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56198:179;56309:4;56333:36;56357:11;56333:23;:36::i;:::-;56326:43;;56198:179;;;:::o;28327:100::-;28381:13;28414:5;28407:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28327:100;:::o;29886:221::-;29962:7;29990:16;29998:7;29990;:16::i;:::-;29982:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30075:15;:24;30091:7;30075:24;;;;;;;;;;;;;;;;;;;;;30068:31;;29886:221;;;:::o;54019:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29409:411::-;29490:13;29506:23;29521:7;29506:14;:23::i;:::-;29490:39;;29554:5;29548:11;;:2;:11;;;;29540:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29648:5;29632:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29657:37;29674:5;29681:12;:10;:12::i;:::-;29657:16;:37::i;:::-;29632:62;29610:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29791:21;29800:2;29804:7;29791:8;:21::i;:::-;29409:411;;;:::o;44411:113::-;44472:7;44499:10;:17;;;;44492:24;;44411:113;:::o;55909:92::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55986:7:::1;55974:9;:19;;;;55909:92:::0;:::o;30776:339::-;30971:41;30990:12;:10;:12::i;:::-;31004:7;30971:18;:41::i;:::-;30963:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31079:28;31089:4;31095:2;31099:7;31079:9;:28::i;:::-;30776:339;;;:::o;54142:94::-;;;;:::o;44079:256::-;44176:7;44212:23;44229:5;44212:16;:23::i;:::-;44204:5;:31;44196:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44301:12;:19;44314:5;44301:19;;;;;;;;;;;;;;;:26;44321:5;44301:26;;;;;;;;;;;;44294:33;;44079:256;;;;:::o;56481:93::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56553:13:::1;;;;;;;;;;;56552:14;56536:13;;:30;;;;;;;;;;;;;;;;;;56481:93::o:0;31186:185::-;31324:39;31341:4;31347:2;31351:7;31324:39;;;;;;;;;;;;:16;:39::i;:::-;31186:185;;;:::o;51548:245::-;51666:41;51685:12;:10;:12::i;:::-;51699:7;51666:18;:41::i;:::-;51658:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;51771:14;51777:7;51771:5;:14::i;:::-;51548:245;:::o;44601:233::-;44676:7;44712:30;:28;:30::i;:::-;44704:5;:38;44696:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44809:10;44820:5;44809:17;;;;;;;;;;;;;;;;;;;;;;;;44802:24;;44601:233;;;:::o;53984:28::-;;;;;;;;;;;;;:::o;53945:32::-;;;;;;;;;;;;;:::o;54434:111::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54529:8:::1;54510:16;:27;;;;;;;;;;;;:::i;:::-;;54434:111:::0;:::o;56737:103::-;56780:7;56807:25;:15;:23;:25::i;:::-;56800:32;;56737:103;:::o;28021:239::-;28093:7;28113:13;28129:7;:16;28137:7;28129:16;;;;;;;;;;;;;;;;;;;;;28113:32;;28181:1;28164:19;;:5;:19;;;;28156:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28247:5;28240:12;;;28021:239;;;:::o;55703:94::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55783:6:::1;55770:10;:19;;;;55703:94:::0;:::o;27751:208::-;27823:7;27868:1;27851:19;;:5;:19;;;;27843:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27935:9;:16;27945:5;27935:16;;;;;;;;;;;;;;;;27928:23;;27751:208;;;:::o;41163:148::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41270:1:::1;41233:40;;41254:6;;;;;;;;;;;41233:40;;;;;;;;;;;;41301:1;41284:6;;:19;;;;;;;;;;;;;;;;;;41163:148::o:0;55021:102::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55105:10:::1;55092;:23;;;;55021:102:::0;:::o;56385:88::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56453:12:::1;;;;;;;;;;;56452:13;56437:12;;:28;;;;;;;;;;;;;;;;;;56385:88::o:0;58140:171::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58191:15:::1;58209:21;58191:39;;58259:1;58249:7;:11;58241:20;;;::::0;::::1;;58272:31;58283:10;58295:7;58272:10;:31::i;:::-;40802:1;58140:171::o:0;40511:87::-;40557:7;40584:6;;;;;;;;;;;40577:13;;40511:87;:::o;28496:104::-;28552:13;28585:7;28578:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28496:104;:::o;30179:295::-;30294:12;:10;:12::i;:::-;30282:24;;:8;:24;;;;30274:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30394:8;30349:18;:32;30368:12;:10;:12::i;:::-;30349:32;;;;;;;;;;;;;;;:42;30382:8;30349:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30447:8;30418:48;;30433:12;:10;:12::i;:::-;30418:48;;;30457:8;30418:48;;;;;;:::i;:::-;;;;;;;;30179:295;;:::o;54812:71::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54871:4:::1;54860:8;;:15;;;;;;;;;;;;;;;;;;54812:71::o:0;56848:794::-;56637:9;;56621:12;:10;:12::i;:::-;:25;;56613:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56678:12;;;;;;;;;;;56670:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;56961:13:::1;56977:12;:10;:12::i;:::-;56961:28;;57034:9;;57016:14;57008:5;:22;;;;:::i;:::-;:35;;57000:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;57094:16;;57076:14;:34;;57068:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;57219:11;;57201:14;57177:21;57187:10;57177:9;:21::i;:::-;:38;;;;:::i;:::-;:53;;57169:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;57323:9;57305:14;57292:10;;:27;;;;:::i;:::-;:40;;57284:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;57381:12;57423:10;57406:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57396:39;;;;;;57381:54;;57471:5;57454:22;;:13;;;;;;;;;;;:22;;;:76;;;;57480:50;57499:12;;57480:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57513:10;;57525:4;57480:18;:50::i;:::-;57454:76;57446:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;57566:9;57561:69;57585:14;57581:1;:18;57561:69;;;57606:24;57619:10;57606:12;:24::i;:::-;57601:3;;;;;:::i;:::-;;;;57561:69;;;;56720:1;;56848:794:::0;;;:::o;57785:149::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57872:7:::1;57867:59;57889:14;57885:18;;:1;:18;;;57867:59;;;57910:16;57923:2;57910:12;:16::i;:::-;57905:3;;;;;:::i;:::-;;;;57867:59;;;;57785:149:::0;;:::o;57942:190::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58026:12:::1;58044:8;:13;;58065:7;58044:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58025:52;;;58096:7;58088:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;40802:1;57942:190:::0;;:::o;31442:328::-;31617:41;31636:12;:10;:12::i;:::-;31650:7;31617:18;:41::i;:::-;31609:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31723:39;31737:4;31743:2;31747:7;31756:5;31723:13;:39::i;:::-;31442:328;;;;:::o;55131:564::-;55249:13;55298:16;55306:7;55298;:16::i;:::-;55280:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;55421:5;55409:17;;:8;;;;;;;;;;;:17;;;55406:70;;;55450:14;55443:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55406:70;55488:28;55519:10;:8;:10::i;:::-;55488:41;;55578:1;55553:14;55547:28;:32;:140;;;;;;;;;;;;;;;;;55619:14;55635:18;:7;:16;:18::i;:::-;55654:13;55602:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55547:140;55540:147;;;55131:564;;;;:::o;53868:32::-;;;;:::o;54891:122::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54991:14:::1;54975:13;:30;;;;;;;;;;;;:::i;:::-;;54891:122:::0;:::o;30545:164::-;30642:4;30666:18;:25;30685:5;30666:25;;;;;;;;;;;;;;;:35;30692:8;30666:35;;;;;;;;;;;;;;;;;;;;;;;;;30659:42;;30545:164;;;;:::o;53907:31::-;;;;;;;;;;;;;:::o;54678:126::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54781:15:::1;54764:14;:32;;;;;;;;;;;;:::i;:::-;;54678:126:::0;:::o;41466:192::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41575:1:::1;41555:22;;:8;:22;;;;41547:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41631:19;41641:8;41631:9;:19::i;:::-;41466:192:::0;:::o;55805:96::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55887:6:::1;55873:11;:20;;;;55805:96:::0;:::o;43771:224::-;43873:4;43912:35;43897:50;;;:11;:50;;;;:90;;;;43951:36;43975:11;43951:23;:36::i;:::-;43897:90;43890:97;;43771:224;;;:::o;33280:127::-;33345:4;33397:1;33369:30;;:7;:16;33377:7;33369:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33362:37;;33280:127;;;:::o;15840:98::-;15893:7;15920:10;15913:17;;15840:98;:::o;37262:174::-;37364:2;37337:15;:24;37353:7;37337:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37420:7;37416:2;37382:46;;37391:23;37406:7;37391:14;:23::i;:::-;37382:46;;;;;;;;;;;;37262:174;;:::o;33574:348::-;33667:4;33692:16;33700:7;33692;:16::i;:::-;33684:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33768:13;33784:23;33799:7;33784:14;:23::i;:::-;33768:39;;33837:5;33826:16;;:7;:16;;;:51;;;;33870:7;33846:31;;:20;33858:7;33846:11;:20::i;:::-;:31;;;33826:51;:87;;;;33881:32;33898:5;33905:7;33881:16;:32::i;:::-;33826:87;33818:96;;;33574:348;;;;:::o;36566:578::-;36725:4;36698:31;;:23;36713:7;36698:14;:23::i;:::-;:31;;;36690:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36808:1;36794:16;;:2;:16;;;;36786:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36864:39;36885:4;36891:2;36895:7;36864:20;:39::i;:::-;36968:29;36985:1;36989:7;36968:8;:29::i;:::-;37029:1;37010:9;:15;37020:4;37010:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37058:1;37041:9;:13;37051:2;37041:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37089:2;37070:7;:16;37078:7;37070:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37128:7;37124:2;37109:27;;37118:4;37109:27;;;;;;;;;;;;36566:578;;;:::o;35869:360::-;35929:13;35945:23;35960:7;35945:14;:23::i;:::-;35929:39;;35981:48;36002:5;36017:1;36021:7;35981:20;:48::i;:::-;36070:29;36087:1;36091:7;36070:8;:29::i;:::-;36132:1;36112:9;:16;36122:5;36112:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;36151:7;:16;36159:7;36151:16;;;;;;;;;;;;36144:23;;;;;;;;;;;36213:7;36209:1;36185:36;;36194:5;36185:36;;;;;;;;;;;;35869:360;;:::o;50679:114::-;50744:7;50771;:14;;;50764:21;;50679:114;;;:::o;52186:190::-;52311:4;52364;52335:25;52348:5;52355:4;52335:12;:25::i;:::-;:33;52328:40;;52186:190;;;;;:::o;57650:127::-;57704:27;:15;:25;:27::i;:::-;57742;57752:2;57756:12;:10;:12::i;:::-;57742:9;:27::i;:::-;57650:127;:::o;32652:315::-;32809:28;32819:4;32825:2;32829:7;32809:9;:28::i;:::-;32856:48;32879:4;32885:2;32889:7;32898:5;32856:22;:48::i;:::-;32848:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32652:315;;;;:::o;54553:117::-;54613:13;54646:16;54639:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54553:117;:::o;23321:723::-;23377:13;23607:1;23598:5;:10;23594:53;;;23625:10;;;;;;;;;;;;;;;;;;;;;23594:53;23657:12;23672:5;23657:20;;23688:14;23713:78;23728:1;23720:4;:9;23713:78;;23746:8;;;;;:::i;:::-;;;;23777:2;23769:10;;;;;:::i;:::-;;;23713:78;;;23801:19;23833:6;23823:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23801:39;;23851:154;23867:1;23858:5;:10;23851:154;;23895:1;23885:11;;;;;:::i;:::-;;;23962:2;23954:5;:10;;;;:::i;:::-;23941:2;:24;;;;:::i;:::-;23928:39;;23911:6;23918;23911:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;23991:2;23982:11;;;;;:::i;:::-;;;23851:154;;;24029:6;24015:21;;;;;23321:723;;;;:::o;41666:173::-;41722:16;41741:6;;;;;;;;;;;41722:25;;41767:8;41758:6;;:17;;;;;;;;;;;;;;;;;;41822:8;41791:40;;41812:8;41791:40;;;;;;;;;;;;41666:173;;:::o;27382:305::-;27484:4;27536:25;27521:40;;;:11;:40;;;;:105;;;;27593:33;27578:48;;;:11;:48;;;;27521:105;:158;;;;27643:36;27667:11;27643:23;:36::i;:::-;27521:158;27501:178;;27382:305;;;:::o;56009:181::-;56137:45;56164:4;56170:2;56174:7;56137:26;:45::i;:::-;56009:181;;;:::o;52738:701::-;52821:7;52841:20;52864:4;52841:27;;52884:9;52879:523;52903:5;:12;52899:1;:16;52879:523;;;52937:20;52960:5;52966:1;52960:8;;;;;;;;;;;;;;;;;;;;;;52937:31;;53003:12;52987;:28;52983:408;;53157:12;53171;53140:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53130:55;;;;;;53115:70;;52983:408;;;53347:12;53361;53330:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53320:55;;;;;;53305:70;;52983:408;52879:523;52917:3;;;;;:::i;:::-;;;;52879:523;;;;53419:12;53412:19;;;52738:701;;;;:::o;50801:127::-;50908:1;50890:7;:14;;;:19;;;;;;;;;;;50801:127;:::o;34264:110::-;34340:26;34350:2;34354:7;34340:26;;;;;;;;;;;;:9;:26::i;:::-;34264:110;;:::o;38001:803::-;38156:4;38177:15;:2;:13;;;:15::i;:::-;38173:624;;;38229:2;38213:36;;;38250:12;:10;:12::i;:::-;38264:4;38270:7;38279:5;38213:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38209:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38476:1;38459:6;:13;:18;38455:272;;;38502:60;;;;;;;;;;:::i;:::-;;;;;;;;38455:272;38677:6;38671:13;38662:6;38658:2;38654:15;38647:38;38209:533;38346:45;;;38336:55;;;:6;:55;;;;38329:62;;;;;38173:624;38781:4;38774:11;;38001:803;;;;;;;:::o;25882:157::-;25967:4;26006:25;25991:40;;;:11;:40;;;;25984:47;;25882:157;;;:::o;45447:589::-;45591:45;45618:4;45624:2;45628:7;45591:26;:45::i;:::-;45669:1;45653:18;;:4;:18;;;45649:187;;;45688:40;45720:7;45688:31;:40::i;:::-;45649:187;;;45758:2;45750:10;;:4;:10;;;45746:90;;45777:47;45810:4;45816:7;45777:32;:47::i;:::-;45746:90;45649:187;45864:1;45850:16;;:2;:16;;;45846:183;;;45883:45;45920:7;45883:36;:45::i;:::-;45846:183;;;45956:4;45950:10;;:2;:10;;;45946:83;;45977:40;46005:2;46009:7;45977:27;:40::i;:::-;45946:83;45846:183;45447:589;;;:::o;34601:321::-;34731:18;34737:2;34741:7;34731:5;:18::i;:::-;34782:54;34813:1;34817:2;34821:7;34830:5;34782:22;:54::i;:::-;34760:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34601:321;;;:::o;8094:387::-;8154:4;8362:12;8429:7;8417:20;8409:28;;8472:1;8465:4;:8;8458:15;;;8094:387;;;:::o;39376:126::-;;;;:::o;46759:164::-;46863:10;:17;;;;46836:15;:24;46852:7;46836:24;;;;;;;;;;;:44;;;;46891:10;46907:7;46891:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46759:164;:::o;47550:988::-;47816:22;47866:1;47841:22;47858:4;47841:16;:22::i;:::-;:26;;;;:::i;:::-;47816:51;;47878:18;47899:17;:26;47917:7;47899:26;;;;;;;;;;;;47878:47;;48046:14;48032:10;:28;48028:328;;48077:19;48099:12;:18;48112:4;48099:18;;;;;;;;;;;;;;;:34;48118:14;48099:34;;;;;;;;;;;;48077:56;;48183:11;48150:12;:18;48163:4;48150:18;;;;;;;;;;;;;;;:30;48169:10;48150:30;;;;;;;;;;;:44;;;;48300:10;48267:17;:30;48285:11;48267:30;;;;;;;;;;;:43;;;;48028:328;;48452:17;:26;48470:7;48452:26;;;;;;;;;;;48445:33;;;48496:12;:18;48509:4;48496:18;;;;;;;;;;;;;;;:34;48515:14;48496:34;;;;;;;;;;;48489:41;;;47550:988;;;;:::o;48833:1079::-;49086:22;49131:1;49111:10;:17;;;;:21;;;;:::i;:::-;49086:46;;49143:18;49164:15;:24;49180:7;49164:24;;;;;;;;;;;;49143:45;;49515:19;49537:10;49548:14;49537:26;;;;;;;;;;;;;;;;;;;;;;;;49515:48;;49601:11;49576:10;49587;49576:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49712:10;49681:15;:28;49697:11;49681:28;;;;;;;;;;;:41;;;;49853:15;:24;49869:7;49853:24;;;;;;;;;;;49846:31;;;49888:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48833:1079;;;;:::o;46337:221::-;46422:14;46439:20;46456:2;46439:16;:20::i;:::-;46422:37;;46497:7;46470:12;:16;46483:2;46470:16;;;;;;;;;;;;;;;:24;46487:6;46470:24;;;;;;;;;;;:34;;;;46544:6;46515:17;:26;46533:7;46515:26;;;;;;;;;;;:35;;;;46337:221;;;:::o;35258:382::-;35352:1;35338:16;;:2;:16;;;;35330:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35411:16;35419:7;35411;:16::i;:::-;35410:17;35402:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35473:45;35502:1;35506:2;35510:7;35473:20;:45::i;:::-;35548:1;35531:9;:13;35541:2;35531:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35579:2;35560:7;:16;35568:7;35560:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35624:7;35620:2;35599:33;;35616:1;35599:33;;;;;;;;;;;;35258:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:273::-;;2223:3;2216:4;2208:6;2204:17;2200:27;2190:2;;2241:1;2238;2231:12;2190:2;2281:6;2268:20;2306:79;2381:3;2373:6;2366:4;2358:6;2354:17;2306:79;:::i;:::-;2297:88;;2180:211;;;;;:::o;2397:139::-;;2481:6;2468:20;2459:29;;2497:33;2524:5;2497:33;:::i;:::-;2449:87;;;;:::o;2542:135::-;;2624:6;2611:20;2602:29;;2640:31;2665:5;2640:31;:::i;:::-;2592:85;;;;:::o;2683:262::-;;2791:2;2779:9;2770:7;2766:23;2762:32;2759:2;;;2807:1;2804;2797:12;2759:2;2850:1;2875:53;2920:7;2911:6;2900:9;2896:22;2875:53;:::i;:::-;2865:63;;2821:117;2749:196;;;;:::o;2951:407::-;;;3076:2;3064:9;3055:7;3051:23;3047:32;3044:2;;;3092:1;3089;3082:12;3044:2;3135:1;3160:53;3205:7;3196:6;3185:9;3181:22;3160:53;:::i;:::-;3150:63;;3106:117;3262:2;3288:53;3333:7;3324:6;3313:9;3309:22;3288:53;:::i;:::-;3278:63;;3233:118;3034:324;;;;;:::o;3364:552::-;;;;3506:2;3494:9;3485:7;3481:23;3477:32;3474:2;;;3522:1;3519;3512:12;3474:2;3565:1;3590:53;3635:7;3626:6;3615:9;3611:22;3590:53;:::i;:::-;3580:63;;3536:117;3692:2;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3663:118;3820:2;3846:53;3891:7;3882:6;3871:9;3867:22;3846:53;:::i;:::-;3836:63;;3791:118;3464:452;;;;;:::o;3922:809::-;;;;;4090:3;4078:9;4069:7;4065:23;4061:33;4058:2;;;4107:1;4104;4097:12;4058:2;4150:1;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4121:117;4277:2;4303:53;4348:7;4339:6;4328:9;4324:22;4303:53;:::i;:::-;4293:63;;4248:118;4405:2;4431:53;4476:7;4467:6;4456:9;4452:22;4431:53;:::i;:::-;4421:63;;4376:118;4561:2;4550:9;4546:18;4533:32;4592:18;4584:6;4581:30;4578:2;;;4624:1;4621;4614:12;4578:2;4652:62;4706:7;4697:6;4686:9;4682:22;4652:62;:::i;:::-;4642:72;;4504:220;4048:683;;;;;;;:::o;4737:401::-;;;4859:2;4847:9;4838:7;4834:23;4830:32;4827:2;;;4875:1;4872;4865:12;4827:2;4918:1;4943:53;4988:7;4979:6;4968:9;4964:22;4943:53;:::i;:::-;4933:63;;4889:117;5045:2;5071:50;5113:7;5104:6;5093:9;5089:22;5071:50;:::i;:::-;5061:60;;5016:115;4817:321;;;;;:::o;5144:407::-;;;5269:2;5257:9;5248:7;5244:23;5240:32;5237:2;;;5285:1;5282;5275:12;5237:2;5328:1;5353:53;5398:7;5389:6;5378:9;5374:22;5353:53;:::i;:::-;5343:63;;5299:117;5455:2;5481:53;5526:7;5517:6;5506:9;5502:22;5481:53;:::i;:::-;5471:63;;5426:118;5227:324;;;;;:::o;5557:262::-;;5665:2;5653:9;5644:7;5640:23;5636:32;5633:2;;;5681:1;5678;5671:12;5633:2;5724:1;5749:53;5794:7;5785:6;5774:9;5770:22;5749:53;:::i;:::-;5739:63;;5695:117;5623:196;;;;:::o;5825:260::-;;5932:2;5920:9;5911:7;5907:23;5903:32;5900:2;;;5948:1;5945;5938:12;5900:2;5991:1;6016:52;6060:7;6051:6;6040:9;6036:22;6016:52;:::i;:::-;6006:62;;5962:116;5890:195;;;;:::o;6091:282::-;;6209:2;6197:9;6188:7;6184:23;6180:32;6177:2;;;6225:1;6222;6215:12;6177:2;6268:1;6293:63;6348:7;6339:6;6328:9;6324:22;6293:63;:::i;:::-;6283:73;;6239:127;6167:206;;;;:::o;6379:375::-;;6497:2;6485:9;6476:7;6472:23;6468:32;6465:2;;;6513:1;6510;6503:12;6465:2;6584:1;6573:9;6569:17;6556:31;6614:18;6606:6;6603:30;6600:2;;;6646:1;6643;6636:12;6600:2;6674:63;6729:7;6720:6;6709:9;6705:22;6674:63;:::i;:::-;6664:73;;6527:220;6455:299;;;;:::o;6760:262::-;;6868:2;6856:9;6847:7;6843:23;6839:32;6836:2;;;6884:1;6881;6874:12;6836:2;6927:1;6952:53;6997:7;6988:6;6977:9;6973:22;6952:53;:::i;:::-;6942:63;;6898:117;6826:196;;;;:::o;7028:570::-;;;;7188:2;7176:9;7167:7;7163:23;7159:32;7156:2;;;7204:1;7201;7194:12;7156:2;7247:1;7272:53;7317:7;7308:6;7297:9;7293:22;7272:53;:::i;:::-;7262:63;;7218:117;7402:2;7391:9;7387:18;7374:32;7433:18;7425:6;7422:30;7419:2;;;7465:1;7462;7455:12;7419:2;7501:80;7573:7;7564:6;7553:9;7549:22;7501:80;:::i;:::-;7483:98;;;;7345:246;7146:452;;;;;:::o;7604:403::-;;;7727:2;7715:9;7706:7;7702:23;7698:32;7695:2;;;7743:1;7740;7733:12;7695:2;7786:1;7811:51;7854:7;7845:6;7834:9;7830:22;7811:51;:::i;:::-;7801:61;;7757:115;7911:2;7937:53;7982:7;7973:6;7962:9;7958:22;7937:53;:::i;:::-;7927:63;;7882:118;7685:322;;;;;:::o;8013:118::-;8100:24;8118:5;8100:24;:::i;:::-;8095:3;8088:37;8078:53;;:::o;8137:157::-;8242:45;8262:24;8280:5;8262:24;:::i;:::-;8242:45;:::i;:::-;8237:3;8230:58;8220:74;;:::o;8300:109::-;8381:21;8396:5;8381:21;:::i;:::-;8376:3;8369:34;8359:50;;:::o;8415:118::-;8502:24;8520:5;8502:24;:::i;:::-;8497:3;8490:37;8480:53;;:::o;8539:157::-;8644:45;8664:24;8682:5;8664:24;:::i;:::-;8644:45;:::i;:::-;8639:3;8632:58;8622:74;;:::o;8702:360::-;;8816:38;8848:5;8816:38;:::i;:::-;8870:70;8933:6;8928:3;8870:70;:::i;:::-;8863:77;;8949:52;8994:6;8989:3;8982:4;8975:5;8971:16;8949:52;:::i;:::-;9026:29;9048:6;9026:29;:::i;:::-;9021:3;9017:39;9010:46;;8792:270;;;;;:::o;9068:364::-;;9184:39;9217:5;9184:39;:::i;:::-;9239:71;9303:6;9298:3;9239:71;:::i;:::-;9232:78;;9319:52;9364:6;9359:3;9352:4;9345:5;9341:16;9319:52;:::i;:::-;9396:29;9418:6;9396:29;:::i;:::-;9391:3;9387:39;9380:46;;9160:272;;;;;:::o;9438:377::-;;9572:39;9605:5;9572:39;:::i;:::-;9627:89;9709:6;9704:3;9627:89;:::i;:::-;9620:96;;9725:52;9770:6;9765:3;9758:4;9751:5;9747:16;9725:52;:::i;:::-;9802:6;9797:3;9793:16;9786:23;;9548:267;;;;;:::o;9845:845::-;;9985:5;9979:12;10014:36;10040:9;10014:36;:::i;:::-;10066:89;10148:6;10143:3;10066:89;:::i;:::-;10059:96;;10186:1;10175:9;10171:17;10202:1;10197:137;;;;10348:1;10343:341;;;;10164:520;;10197:137;10281:4;10277:9;10266;10262:25;10257:3;10250:38;10317:6;10312:3;10308:16;10301:23;;10197:137;;10343:341;10410:38;10442:5;10410:38;:::i;:::-;10470:1;10484:154;10498:6;10495:1;10492:13;10484:154;;;10572:7;10566:14;10562:1;10557:3;10553:11;10546:35;10622:1;10613:7;10609:15;10598:26;;10520:4;10517:1;10513:12;10508:17;;10484:154;;;10667:6;10662:3;10658:16;10651:23;;10350:334;;10164:520;;9952:738;;;;;;:::o;10696:375::-;;10859:67;10923:2;10918:3;10859:67;:::i;:::-;10852:74;;10956:34;10952:1;10947:3;10943:11;10936:55;11022:13;11017:2;11012:3;11008:12;11001:35;11062:2;11057:3;11053:12;11046:19;;10842:229;;;:::o;11077:375::-;;11240:67;11304:2;11299:3;11240:67;:::i;:::-;11233:74;;11337:34;11333:1;11328:3;11324:11;11317:55;11403:13;11398:2;11393:3;11389:12;11382:35;11443:2;11438:3;11434:12;11427:19;;11223:229;;;:::o;11458:382::-;;11621:67;11685:2;11680:3;11621:67;:::i;:::-;11614:74;;11718:34;11714:1;11709:3;11705:11;11698:55;11784:20;11779:2;11774:3;11770:12;11763:42;11831:2;11826:3;11822:12;11815:19;;11604:236;;;:::o;11846:370::-;;12009:67;12073:2;12068:3;12009:67;:::i;:::-;12002:74;;12106:34;12102:1;12097:3;12093:11;12086:55;12172:8;12167:2;12162:3;12158:12;12151:30;12207:2;12202:3;12198:12;12191:19;;11992:224;;;:::o;12222:326::-;;12385:67;12449:2;12444:3;12385:67;:::i;:::-;12378:74;;12482:30;12478:1;12473:3;12469:11;12462:51;12539:2;12534:3;12530:12;12523:19;;12368:180;;;:::o;12554:370::-;;12717:67;12781:2;12776:3;12717:67;:::i;:::-;12710:74;;12814:34;12810:1;12805:3;12801:11;12794:55;12880:8;12875:2;12870:3;12866:12;12859:30;12915:2;12910:3;12906:12;12899:19;;12700:224;;;:::o;12930:368::-;;13093:67;13157:2;13152:3;13093:67;:::i;:::-;13086:74;;13190:34;13186:1;13181:3;13177:11;13170:55;13256:6;13251:2;13246:3;13242:12;13235:28;13289:2;13284:3;13280:12;13273:19;;13076:222;;;:::o;13304:323::-;;13467:67;13531:2;13526:3;13467:67;:::i;:::-;13460:74;;13564:27;13560:1;13555:3;13551:11;13544:48;13618:2;13613:3;13609:12;13602:19;;13450:177;;;:::o;13633:329::-;;13796:67;13860:2;13855:3;13796:67;:::i;:::-;13789:74;;13893:33;13889:1;13884:3;13880:11;13873:54;13953:2;13948:3;13944:12;13937:19;;13779:183;;;:::o;13968:306::-;;14131:66;14195:1;14190:3;14131:66;:::i;:::-;14124:73;;14227:11;14223:1;14218:3;14214:11;14207:32;14265:2;14260:3;14256:12;14249:19;;14114:160;;;:::o;14280:376::-;;14443:67;14507:2;14502:3;14443:67;:::i;:::-;14436:74;;14540:34;14536:1;14531:3;14527:11;14520:55;14606:14;14601:2;14596:3;14592:12;14585:36;14647:2;14642:3;14638:12;14631:19;;14426:230;;;:::o;14662:388::-;;14825:67;14889:2;14884:3;14825:67;:::i;:::-;14818:74;;14922:34;14918:1;14913:3;14909:11;14902:55;14988:26;14983:2;14978:3;14974:12;14967:48;15041:2;15036:3;15032:12;15025:19;;14808:242;;;:::o;15056:374::-;;15219:67;15283:2;15278:3;15219:67;:::i;:::-;15212:74;;15316:34;15312:1;15307:3;15303:11;15296:55;15382:12;15377:2;15372:3;15368:12;15361:34;15421:2;15416:3;15412:12;15405:19;;15202:228;;;:::o;15436:373::-;;15599:67;15663:2;15658:3;15599:67;:::i;:::-;15592:74;;15696:34;15692:1;15687:3;15683:11;15676:55;15762:11;15757:2;15752:3;15748:12;15741:33;15800:2;15795:3;15791:12;15784:19;;15582:227;;;:::o;15815:330::-;;15978:67;16042:2;16037:3;15978:67;:::i;:::-;15971:74;;16075:34;16071:1;16066:3;16062:11;16055:55;16136:2;16131:3;16127:12;16120:19;;15961:184;;;:::o;16151:376::-;;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16411:34;16407:1;16402:3;16398:11;16391:55;16477:14;16472:2;16467:3;16463:12;16456:36;16518:2;16513:3;16509:12;16502:19;;16297:230;;;:::o;16533:330::-;;16696:67;16760:2;16755:3;16696:67;:::i;:::-;16689:74;;16793:34;16789:1;16784:3;16780:11;16773:55;16854:2;16849:3;16845:12;16838:19;;16679:184;;;:::o;16869:373::-;;17032:67;17096:2;17091:3;17032:67;:::i;:::-;17025:74;;17129:34;17125:1;17120:3;17116:11;17109:55;17195:11;17190:2;17185:3;17181:12;17174:33;17233:2;17228:3;17224:12;17217:19;;17015:227;;;:::o;17248:379::-;;17411:67;17475:2;17470:3;17411:67;:::i;:::-;17404:74;;17508:34;17504:1;17499:3;17495:11;17488:55;17574:17;17569:2;17564:3;17560:12;17553:39;17618:2;17613:3;17609:12;17602:19;;17394:233;;;:::o;17633:365::-;;17796:67;17860:2;17855:3;17796:67;:::i;:::-;17789:74;;17893:34;17889:1;17884:3;17880:11;17873:55;17959:3;17954:2;17949:3;17945:12;17938:25;17989:2;17984:3;17980:12;17973:19;;17779:219;;;:::o;18004:312::-;;18167:67;18231:2;18226:3;18167:67;:::i;:::-;18160:74;;18264:16;18260:1;18255:3;18251:11;18244:37;18307:2;18302:3;18298:12;18291:19;;18150:166;;;:::o;18322:297::-;;18502:83;18583:1;18578:3;18502:83;:::i;:::-;18495:90;;18611:1;18606:3;18602:11;18595:18;;18485:134;;;:::o;18625:314::-;;18788:67;18852:2;18847:3;18788:67;:::i;:::-;18781:74;;18885:18;18881:1;18876:3;18872:11;18865:39;18930:2;18925:3;18921:12;18914:19;;18771:168;;;:::o;18945:381::-;;19108:67;19172:2;19167:3;19108:67;:::i;:::-;19101:74;;19205:34;19201:1;19196:3;19192:11;19185:55;19271:19;19266:2;19261:3;19257:12;19250:41;19317:2;19312:3;19308:12;19301:19;;19091:235;;;:::o;19332:376::-;;19495:67;19559:2;19554:3;19495:67;:::i;:::-;19488:74;;19592:34;19588:1;19583:3;19579:11;19572:55;19658:14;19653:2;19648:3;19644:12;19637:36;19699:2;19694:3;19690:12;19683:19;;19478:230;;;:::o;19714:311::-;;19877:67;19941:2;19936:3;19877:67;:::i;:::-;19870:74;;19974:15;19970:1;19965:3;19961:11;19954:36;20016:2;20011:3;20007:12;20000:19;;19860:165;;;:::o;20031:380::-;;20194:67;20258:2;20253:3;20194:67;:::i;:::-;20187:74;;20291:34;20287:1;20282:3;20278:11;20271:55;20357:18;20352:2;20347:3;20343:12;20336:40;20402:2;20397:3;20393:12;20386:19;;20177:234;;;:::o;20417:305::-;;20580:66;20644:1;20639:3;20580:66;:::i;:::-;20573:73;;20676:10;20672:1;20667:3;20663:11;20656:31;20713:2;20708:3;20704:12;20697:19;;20563:159;;;:::o;20728:118::-;20815:24;20833:5;20815:24;:::i;:::-;20810:3;20803:37;20793:53;;:::o;20852:256::-;;20979:75;21050:3;21041:6;20979:75;:::i;:::-;21079:2;21074:3;21070:12;21063:19;;21099:3;21092:10;;20968:140;;;;:::o;21114:397::-;;21269:75;21340:3;21331:6;21269:75;:::i;:::-;21369:2;21364:3;21360:12;21353:19;;21382:75;21453:3;21444:6;21382:75;:::i;:::-;21482:2;21477:3;21473:12;21466:19;;21502:3;21495:10;;21258:253;;;;;:::o;21517:589::-;;21764:95;21855:3;21846:6;21764:95;:::i;:::-;21757:102;;21876:95;21967:3;21958:6;21876:95;:::i;:::-;21869:102;;21988:92;22076:3;22067:6;21988:92;:::i;:::-;21981:99;;22097:3;22090:10;;21746:360;;;;;;:::o;22112:379::-;;22318:147;22461:3;22318:147;:::i;:::-;22311:154;;22482:3;22475:10;;22300:191;;;:::o;22497:222::-;;22628:2;22617:9;22613:18;22605:26;;22641:71;22709:1;22698:9;22694:17;22685:6;22641:71;:::i;:::-;22595:124;;;;:::o;22725:640::-;;22958:3;22947:9;22943:19;22935:27;;22972:71;23040:1;23029:9;23025:17;23016:6;22972:71;:::i;:::-;23053:72;23121:2;23110:9;23106:18;23097:6;23053:72;:::i;:::-;23135;23203:2;23192:9;23188:18;23179:6;23135:72;:::i;:::-;23254:9;23248:4;23244:20;23239:2;23228:9;23224:18;23217:48;23282:76;23353:4;23344:6;23282:76;:::i;:::-;23274:84;;22925:440;;;;;;;:::o;23371:210::-;;23496:2;23485:9;23481:18;23473:26;;23509:65;23571:1;23560:9;23556:17;23547:6;23509:65;:::i;:::-;23463:118;;;;:::o;23587:222::-;;23718:2;23707:9;23703:18;23695:26;;23731:71;23799:1;23788:9;23784:17;23775:6;23731:71;:::i;:::-;23685:124;;;;:::o;23815:313::-;;23966:2;23955:9;23951:18;23943:26;;24015:9;24009:4;24005:20;24001:1;23990:9;23986:17;23979:47;24043:78;24116:4;24107:6;24043:78;:::i;:::-;24035:86;;23933:195;;;;:::o;24134:419::-;;24338:2;24327:9;24323:18;24315:26;;24387:9;24381:4;24377:20;24373:1;24362:9;24358:17;24351:47;24415:131;24541:4;24415:131;:::i;:::-;24407:139;;24305:248;;;:::o;24559:419::-;;24763:2;24752:9;24748:18;24740:26;;24812:9;24806:4;24802:20;24798:1;24787:9;24783:17;24776:47;24840:131;24966:4;24840:131;:::i;:::-;24832:139;;24730:248;;;:::o;24984:419::-;;25188:2;25177:9;25173:18;25165:26;;25237:9;25231:4;25227:20;25223:1;25212:9;25208:17;25201:47;25265:131;25391:4;25265:131;:::i;:::-;25257:139;;25155:248;;;:::o;25409:419::-;;25613:2;25602:9;25598:18;25590:26;;25662:9;25656:4;25652:20;25648:1;25637:9;25633:17;25626:47;25690:131;25816:4;25690:131;:::i;:::-;25682:139;;25580:248;;;:::o;25834:419::-;;26038:2;26027:9;26023:18;26015:26;;26087:9;26081:4;26077:20;26073:1;26062:9;26058:17;26051:47;26115:131;26241:4;26115:131;:::i;:::-;26107:139;;26005:248;;;:::o;26259:419::-;;26463:2;26452:9;26448:18;26440:26;;26512:9;26506:4;26502:20;26498:1;26487:9;26483:17;26476:47;26540:131;26666:4;26540:131;:::i;:::-;26532:139;;26430:248;;;:::o;26684:419::-;;26888:2;26877:9;26873:18;26865:26;;26937:9;26931:4;26927:20;26923:1;26912:9;26908:17;26901:47;26965:131;27091:4;26965:131;:::i;:::-;26957:139;;26855:248;;;:::o;27109:419::-;;27313:2;27302:9;27298:18;27290:26;;27362:9;27356:4;27352:20;27348:1;27337:9;27333:17;27326:47;27390:131;27516:4;27390:131;:::i;:::-;27382:139;;27280:248;;;:::o;27534:419::-;;27738:2;27727:9;27723:18;27715:26;;27787:9;27781:4;27777:20;27773:1;27762:9;27758:17;27751:47;27815:131;27941:4;27815:131;:::i;:::-;27807:139;;27705:248;;;:::o;27959:419::-;;28163:2;28152:9;28148:18;28140:26;;28212:9;28206:4;28202:20;28198:1;28187:9;28183:17;28176:47;28240:131;28366:4;28240:131;:::i;:::-;28232:139;;28130:248;;;:::o;28384:419::-;;28588:2;28577:9;28573:18;28565:26;;28637:9;28631:4;28627:20;28623:1;28612:9;28608:17;28601:47;28665:131;28791:4;28665:131;:::i;:::-;28657:139;;28555:248;;;:::o;28809:419::-;;29013:2;29002:9;28998:18;28990:26;;29062:9;29056:4;29052:20;29048:1;29037:9;29033:17;29026:47;29090:131;29216:4;29090:131;:::i;:::-;29082:139;;28980:248;;;:::o;29234:419::-;;29438:2;29427:9;29423:18;29415:26;;29487:9;29481:4;29477:20;29473:1;29462:9;29458:17;29451:47;29515:131;29641:4;29515:131;:::i;:::-;29507:139;;29405:248;;;:::o;29659:419::-;;29863:2;29852:9;29848:18;29840:26;;29912:9;29906:4;29902:20;29898:1;29887:9;29883:17;29876:47;29940:131;30066:4;29940:131;:::i;:::-;29932:139;;29830:248;;;:::o;30084:419::-;;30288:2;30277:9;30273:18;30265:26;;30337:9;30331:4;30327:20;30323:1;30312:9;30308:17;30301:47;30365:131;30491:4;30365:131;:::i;:::-;30357:139;;30255:248;;;:::o;30509:419::-;;30713:2;30702:9;30698:18;30690:26;;30762:9;30756:4;30752:20;30748:1;30737:9;30733:17;30726:47;30790:131;30916:4;30790:131;:::i;:::-;30782:139;;30680:248;;;:::o;30934:419::-;;31138:2;31127:9;31123:18;31115:26;;31187:9;31181:4;31177:20;31173:1;31162:9;31158:17;31151:47;31215:131;31341:4;31215:131;:::i;:::-;31207:139;;31105:248;;;:::o;31359:419::-;;31563:2;31552:9;31548:18;31540:26;;31612:9;31606:4;31602:20;31598:1;31587:9;31583:17;31576:47;31640:131;31766:4;31640:131;:::i;:::-;31632:139;;31530:248;;;:::o;31784:419::-;;31988:2;31977:9;31973:18;31965:26;;32037:9;32031:4;32027:20;32023:1;32012:9;32008:17;32001:47;32065:131;32191:4;32065:131;:::i;:::-;32057:139;;31955:248;;;:::o;32209:419::-;;32413:2;32402:9;32398:18;32390:26;;32462:9;32456:4;32452:20;32448:1;32437:9;32433:17;32426:47;32490:131;32616:4;32490:131;:::i;:::-;32482:139;;32380:248;;;:::o;32634:419::-;;32838:2;32827:9;32823:18;32815:26;;32887:9;32881:4;32877:20;32873:1;32862:9;32858:17;32851:47;32915:131;33041:4;32915:131;:::i;:::-;32907:139;;32805:248;;;:::o;33059:419::-;;33263:2;33252:9;33248:18;33240:26;;33312:9;33306:4;33302:20;33298:1;33287:9;33283:17;33276:47;33340:131;33466:4;33340:131;:::i;:::-;33332:139;;33230:248;;;:::o;33484:419::-;;33688:2;33677:9;33673:18;33665:26;;33737:9;33731:4;33727:20;33723:1;33712:9;33708:17;33701:47;33765:131;33891:4;33765:131;:::i;:::-;33757:139;;33655:248;;;:::o;33909:419::-;;34113:2;34102:9;34098:18;34090:26;;34162:9;34156:4;34152:20;34148:1;34137:9;34133:17;34126:47;34190:131;34316:4;34190:131;:::i;:::-;34182:139;;34080:248;;;:::o;34334:419::-;;34538:2;34527:9;34523:18;34515:26;;34587:9;34581:4;34577:20;34573:1;34562:9;34558:17;34551:47;34615:131;34741:4;34615:131;:::i;:::-;34607:139;;34505:248;;;:::o;34759:419::-;;34963:2;34952:9;34948:18;34940:26;;35012:9;35006:4;35002:20;34998:1;34987:9;34983:17;34976:47;35040:131;35166:4;35040:131;:::i;:::-;35032:139;;34930:248;;;:::o;35184:419::-;;35388:2;35377:9;35373:18;35365:26;;35437:9;35431:4;35427:20;35423:1;35412:9;35408:17;35401:47;35465:131;35591:4;35465:131;:::i;:::-;35457:139;;35355:248;;;:::o;35609:222::-;;35740:2;35729:9;35725:18;35717:26;;35753:71;35821:1;35810:9;35806:17;35797:6;35753:71;:::i;:::-;35707:124;;;;:::o;35837:283::-;;35903:2;35897:9;35887:19;;35945:4;35937:6;35933:17;36052:6;36040:10;36037:22;36016:18;36004:10;36001:34;35998:62;35995:2;;;36063:18;;:::i;:::-;35995:2;36103:10;36099:2;36092:22;35877:243;;;;:::o;36126:331::-;;36277:18;36269:6;36266:30;36263:2;;;36299:18;;:::i;:::-;36263:2;36384:4;36380:9;36373:4;36365:6;36361:17;36357:33;36349:41;;36445:4;36439;36435:15;36427:23;;36192:265;;;:::o;36463:332::-;;36615:18;36607:6;36604:30;36601:2;;;36637:18;;:::i;:::-;36601:2;36722:4;36718:9;36711:4;36703:6;36699:17;36695:33;36687:41;;36783:4;36777;36773:15;36765:23;;36530:265;;;:::o;36801:141::-;;36873:3;36865:11;;36896:3;36893:1;36886:14;36930:4;36927:1;36917:18;36909:26;;36855:87;;;:::o;36948:98::-;;37033:5;37027:12;37017:22;;37006:40;;;:::o;37052:99::-;;37138:5;37132:12;37122:22;;37111:40;;;:::o;37157:168::-;;37274:6;37269:3;37262:19;37314:4;37309:3;37305:14;37290:29;;37252:73;;;;:::o;37331:147::-;;37469:3;37454:18;;37444:34;;;;:::o;37484:169::-;;37602:6;37597:3;37590:19;37642:4;37637:3;37633:14;37618:29;;37580:73;;;;:::o;37659:148::-;;37798:3;37783:18;;37773:34;;;;:::o;37813:305::-;;37872:20;37890:1;37872:20;:::i;:::-;37867:25;;37906:20;37924:1;37906:20;:::i;:::-;37901:25;;38060:1;37992:66;37988:74;37985:1;37982:81;37979:2;;;38066:18;;:::i;:::-;37979:2;38110:1;38107;38103:9;38096:16;;37857:261;;;;:::o;38124:185::-;;38181:20;38199:1;38181:20;:::i;:::-;38176:25;;38215:20;38233:1;38215:20;:::i;:::-;38210:25;;38254:1;38244:2;;38259:18;;:::i;:::-;38244:2;38301:1;38298;38294:9;38289:14;;38166:143;;;;:::o;38315:348::-;;38378:20;38396:1;38378:20;:::i;:::-;38373:25;;38412:20;38430:1;38412:20;:::i;:::-;38407:25;;38600:1;38532:66;38528:74;38525:1;38522:81;38517:1;38510:9;38503:17;38499:105;38496:2;;;38607:18;;:::i;:::-;38496:2;38655:1;38652;38648:9;38637:20;;38363:300;;;;:::o;38669:191::-;;38729:20;38747:1;38729:20;:::i;:::-;38724:25;;38763:20;38781:1;38763:20;:::i;:::-;38758:25;;38802:1;38799;38796:8;38793:2;;;38807:18;;:::i;:::-;38793:2;38852:1;38849;38845:9;38837:17;;38714:146;;;;:::o;38866:96::-;;38932:24;38950:5;38932:24;:::i;:::-;38921:35;;38911:51;;;:::o;38968:90::-;;39045:5;39038:13;39031:21;39020:32;;39010:48;;;:::o;39064:77::-;;39130:5;39119:16;;39109:32;;;:::o;39147:149::-;;39223:66;39216:5;39212:78;39201:89;;39191:105;;;:::o;39302:126::-;;39379:42;39372:5;39368:54;39357:65;;39347:81;;;:::o;39434:77::-;;39500:5;39489:16;;39479:32;;;:::o;39517:86::-;;39592:4;39585:5;39581:16;39570:27;;39560:43;;;:::o;39609:154::-;39693:6;39688:3;39683;39670:30;39755:1;39746:6;39741:3;39737:16;39730:27;39660:103;;;:::o;39769:307::-;39837:1;39847:113;39861:6;39858:1;39855:13;39847:113;;;39946:1;39941:3;39937:11;39931:18;39927:1;39922:3;39918:11;39911:39;39883:2;39880:1;39876:10;39871:15;;39847:113;;;39978:6;39975:1;39972:13;39969:2;;;40058:1;40049:6;40044:3;40040:16;40033:27;39969:2;39818:258;;;;:::o;40082:320::-;;40163:1;40157:4;40153:12;40143:22;;40210:1;40204:4;40200:12;40231:18;40221:2;;40287:4;40279:6;40275:17;40265:27;;40221:2;40349;40341:6;40338:14;40318:18;40315:38;40312:2;;;40368:18;;:::i;:::-;40312:2;40133:269;;;;:::o;40408:233::-;;40470:24;40488:5;40470:24;:::i;:::-;40461:33;;40516:66;40509:5;40506:77;40503:2;;;40586:18;;:::i;:::-;40503:2;40633:1;40626:5;40622:13;40615:20;;40451:190;;;:::o;40647:167::-;;40707:22;40723:5;40707:22;:::i;:::-;40698:31;;40751:4;40744:5;40741:15;40738:2;;;40759:18;;:::i;:::-;40738:2;40806:1;40799:5;40795:13;40788:20;;40688:126;;;:::o;40820:100::-;;40888:26;40908:5;40888:26;:::i;:::-;40877:37;;40867:53;;;:::o;40926:79::-;;40994:5;40983:16;;40973:32;;;:::o;41011:94::-;;41079:20;41093:5;41079:20;:::i;:::-;41068:31;;41058:47;;;:::o;41111:176::-;;41160:20;41178:1;41160:20;:::i;:::-;41155:25;;41194:20;41212:1;41194:20;:::i;:::-;41189:25;;41233:1;41223:2;;41238:18;;:::i;:::-;41223:2;41279:1;41276;41272:9;41267:14;;41145:142;;;;:::o;41293:180::-;41341:77;41338:1;41331:88;41438:4;41435:1;41428:15;41462:4;41459:1;41452:15;41479:180;41527:77;41524:1;41517:88;41624:4;41621:1;41614:15;41648:4;41645:1;41638:15;41665:180;41713:77;41710:1;41703:88;41810:4;41807:1;41800:15;41834:4;41831:1;41824:15;41851:180;41899:77;41896:1;41889:88;41996:4;41993:1;41986:15;42020:4;42017:1;42010:15;42037:102;;42129:2;42125:7;42120:2;42113:5;42109:14;42105:28;42095:38;;42085:54;;;:::o;42145:94::-;;42226:5;42222:2;42218:14;42197:35;;42187:52;;;:::o;42245:122::-;42318:24;42336:5;42318:24;:::i;:::-;42311:5;42308:35;42298:2;;42357:1;42354;42347:12;42298:2;42288:79;:::o;42373:116::-;42443:21;42458:5;42443:21;:::i;:::-;42436:5;42433:32;42423:2;;42479:1;42476;42469:12;42423:2;42413:76;:::o;42495:122::-;42568:24;42586:5;42568:24;:::i;:::-;42561:5;42558:35;42548:2;;42607:1;42604;42597:12;42548:2;42538:79;:::o;42623:120::-;42695:23;42712:5;42695:23;:::i;:::-;42688:5;42685:34;42675:2;;42733:1;42730;42723:12;42675:2;42665:78;:::o;42749:122::-;42822:24;42840:5;42822:24;:::i;:::-;42815:5;42812:35;42802:2;;42861:1;42858;42851:12;42802:2;42792:79;:::o;42877:118::-;42948:22;42964:5;42948:22;:::i;:::-;42941:5;42938:33;42928:2;;42985:1;42982;42975:12;42928:2;42918:77;:::o

Swarm Source

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