ETH Price: $3,310.43 (+2.17%)
Gas: 4 Gwei

Token

BoxBytes (BB)
 

Overview

Max Total Supply

131 BB

Holders

112

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BB
0x2123E8e2a4579686eaA1346D2c7F21a3Cffb7528
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:
BoxBytesFree

Compiler Version
v0.8.7+commit.e28d00a7

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-22
*/

// 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 BoxBytesFree 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 = 3333;
    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 = 0x0bb6a77d085ed07b764bef313b37f1ba798a57bba3a9851c506af4c056fcee2a;

    constructor(string memory baseURI, string memory _notrevealURI) ERC721("BoxBytes", "BB") { 
        _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"}]

60806040526000600c556001600d556001600e55610d05600f556001601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff02191690831515021790555060405180602001604052806000815250601190805190602001906200009192919062000302565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060139080519060200190620000df92919062000302565b507f0bb6a77d085ed07b764bef313b37f1ba798a57bba3a9851c506af4c056fcee2a60001b6014553480156200011457600080fd5b506040516200584a3803806200584a83398181016040528101906200013a919062000430565b6040518060400160405280600881526020017f426f7842797465730000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f42420000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001be92919062000302565b508060019080519060200190620001d792919062000302565b505050620001fa620001ee6200023460201b60201c565b6200023c60201b60201c565b81601290805190602001906200021292919062000302565b5080601190805190602001906200022b92919062000302565b50505062000639565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000310906200054a565b90600052602060002090601f01602090048101928262000334576000855562000380565b82601f106200034f57805160ff191683800117855562000380565b8280016001018555821562000380579182015b828111156200037f57825182559160200191906001019062000362565b5b5090506200038f919062000393565b5090565b5b80821115620003ae57600081600090555060010162000394565b5090565b6000620003c9620003c384620004de565b620004b5565b905082815260208101848484011115620003e857620003e762000619565b5b620003f584828562000514565b509392505050565b600082601f83011262000415576200041462000614565b5b815162000427848260208601620003b2565b91505092915050565b600080604083850312156200044a576200044962000623565b5b600083015167ffffffffffffffff8111156200046b576200046a6200061e565b5b6200047985828601620003fd565b925050602083015167ffffffffffffffff8111156200049d576200049c6200061e565b5b620004ab85828601620003fd565b9150509250929050565b6000620004c1620004d4565b9050620004cf828262000580565b919050565b6000604051905090565b600067ffffffffffffffff821115620004fc57620004fb620005e5565b5b620005078262000628565b9050602081019050919050565b60005b838110156200053457808201518184015260208101905062000517565b8381111562000544576000848401525b50505050565b600060028204905060018216806200056357607f821691505b602082108114156200057a5762000579620005b6565b5b50919050565b6200058b8262000628565b810181811067ffffffffffffffff82111715620005ad57620005ac620005e5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61520180620006496000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063b3d6c53c116100b6578063da3ef23f1161007a578063da3ef23f1461081f578063e985e9c514610848578063eb8d244414610885578063f2c4ce1e146108b0578063f2fde38b146108d9578063fe92b0931461090257610246565b8063b3d6c53c1461073c578063b4e380d514610765578063b88d4fde1461078e578063c87b56dd146107b7578063d5abeb01146107f457610246565b80638da5cb5b116100fd5780638da5cb5b1461068a57806395d89b41146106b5578063a22cb465146106e0578063a475b5dd14610709578063ae7c122e1461072057610246565b806370a08231146105df578063715018a61461061c5780637cb6475914610633578063814c36341461065c578063853828b61461067357610246565b806334393743116101c757806353135ca01161018b57806353135ca0146104fa57806355f804b314610525578063626be5671461054e5780636352211e146105795780636a61e5fc146105b657610246565b8063343937431461042957806342842e0e1461044057806342966c68146104695780634f6ccce71461049257806351830227146104cf57610246565b806318160ddd1161020e57806318160ddd146103445780631fe9eabc1461036f57806323b872dd146103985780632eb4a7ab146103c15780632f745c59146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063081c8c44146102f0578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613977565b61092b565b60405161027f919061413b565b60405180910390f35b34801561029457600080fd5b5061029d61093d565b6040516102aa9190614171565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a1a565b6109cf565b6040516102e791906140d4565b60405180910390f35b3480156102fc57600080fd5b50610305610a54565b6040516103129190614171565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d919061390a565b610ae2565b005b34801561035057600080fd5b50610359610bfa565b60405161036691906144f3565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613a1a565b610c07565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906137f4565b610c8d565b005b3480156103cd57600080fd5b506103d6610ced565b6040516103e39190614156565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e919061390a565b610cf3565b60405161042091906144f3565b60405180910390f35b34801561043557600080fd5b5061043e610d98565b005b34801561044c57600080fd5b50610467600480360381019061046291906137f4565b610e40565b005b34801561047557600080fd5b50610490600480360381019061048b9190613a1a565b610e60565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613a1a565b610ebc565b6040516104c691906144f3565b60405180910390f35b3480156104db57600080fd5b506104e4610f2d565b6040516104f1919061413b565b60405180910390f35b34801561050657600080fd5b5061050f610f40565b60405161051c919061413b565b60405180910390f35b34801561053157600080fd5b5061054c600480360381019061054791906139d1565b610f53565b005b34801561055a57600080fd5b50610563610fe9565b60405161057091906144f3565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613a1a565b610ffa565b6040516105ad91906140d4565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d89190613a1a565b6110ac565b005b3480156105eb57600080fd5b5061060660048036038101906106019190613787565b611132565b60405161061391906144f3565b60405180910390f35b34801561062857600080fd5b506106316111ea565b005b34801561063f57600080fd5b5061065a6004803603810190610655919061394a565b611327565b005b34801561066857600080fd5b506106716113ad565b005b34801561067f57600080fd5b50610688611455565b005b34801561069657600080fd5b5061069f6114f0565b6040516106ac91906140d4565b60405180910390f35b3480156106c157600080fd5b506106ca61151a565b6040516106d79190614171565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906138ca565b6115ac565b005b34801561071557600080fd5b5061071e61172d565b005b61073a60048036038101906107359190613a47565b6117c6565b005b34801561074857600080fd5b50610763600480360381019061075e9190613aa7565b611aaf565b005b34801561077157600080fd5b5061078c6004803603810190610787919061390a565b611b5d565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613847565b611c8a565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613a1a565b611cec565b6040516107eb9190614171565b60405180910390f35b34801561080057600080fd5b50610809611e45565b60405161081691906144f3565b60405180910390f35b34801561082b57600080fd5b50610846600480360381019061084191906139d1565b611e4b565b005b34801561085457600080fd5b5061086f600480360381019061086a91906137b4565b611ee1565b60405161087c919061413b565b60405180910390f35b34801561089157600080fd5b5061089a611f75565b6040516108a7919061413b565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d291906139d1565b611f88565b005b3480156108e557600080fd5b5061090060048036038101906108fb9190613787565b61201e565b005b34801561090e57600080fd5b5061092960048036038101906109249190613a1a565b612116565b005b60006109368261219c565b9050919050565b60606000805461094c906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054610978906147da565b80156109c55780601f1061099a576101008083540402835291602001916109c5565b820191906000526020600020905b8154815290600101906020018083116109a857829003601f168201915b5050505050905090565b60006109da82612216565b610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1090614373565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610a61906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8d906147da565b8015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b505050505081565b6000610aed82610ffa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b55906143f3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7d612282565b73ffffffffffffffffffffffffffffffffffffffff161480610bac5750610bab81610ba6612282565b611ee1565b5b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906142f3565b60405180910390fd5b610bf5838361228a565b505050565b6000600880549050905090565b610c0f612282565b73ffffffffffffffffffffffffffffffffffffffff16610c2d6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90614393565b60405180910390fd5b80600f8190555050565b610c9e610c98612282565b82612343565b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490614453565b60405180910390fd5b610ce8838383612421565b505050565b60145481565b6000610cfe83611132565b8210610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906141b3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610da0612282565b73ffffffffffffffffffffffffffffffffffffffff16610dbe6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614393565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610e5b83838360405180602001604052806000815250611c8a565b505050565b610e71610e6b612282565b82612343565b610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea7906144b3565b60405180910390fd5b610eb98161267d565b50565b6000610ec6610bfa565b8210610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90614473565b60405180910390fd5b60088281548110610f1b57610f1a6149cb565b5b90600052602060002001549050919050565b601060029054906101000a900460ff1681565b601060019054906101000a900460ff1681565b610f5b612282565b73ffffffffffffffffffffffffffffffffffffffff16610f796114f0565b73ffffffffffffffffffffffffffffffffffffffff1614610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690614393565b60405180910390fd5b8060129080519060200190610fe592919061351b565b5050565b6000610ff5600b61278e565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a90614333565b60405180910390fd5b80915050919050565b6110b4612282565b73ffffffffffffffffffffffffffffffffffffffff166110d26114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90614393565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90614313565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f2612282565b73ffffffffffffffffffffffffffffffffffffffff166112106114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90614393565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61132f612282565b73ffffffffffffffffffffffffffffffffffffffff1661134d6114f0565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90614393565b60405180910390fd5b8060148190555050565b6113b5612282565b73ffffffffffffffffffffffffffffffffffffffff166113d36114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090614393565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61145d612282565b73ffffffffffffffffffffffffffffffffffffffff1661147b6114f0565b73ffffffffffffffffffffffffffffffffffffffff16146114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c890614393565b60405180910390fd5b6000479050600081116114e357600080fd5b6114ed3382611b5d565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611529906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054611555906147da565b80156115a25780601f10611577576101008083540402835291602001916115a2565b820191906000526020600020905b81548152906001019060200180831161158557829003601f168201915b5050505050905090565b6115b4612282565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614273565b60405180910390fd5b806005600061162f612282565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116dc612282565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611721919061413b565b60405180910390a35050565b611735612282565b73ffffffffffffffffffffffffffffffffffffffff166117536114f0565b73ffffffffffffffffffffffffffffffffffffffff16146117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090614393565b60405180910390fd5b6001601060026101000a81548160ff021916908315150217905550565b600f546117d1610fe9565b1115611812576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611809906144d3565b60405180910390fd5b601060009054906101000a900460ff16611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890614413565b60405180910390fd5b600061186b610fe9565b9050600f54848261187c91906145f8565b11156118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b4906142b3565b60405180910390fd5b600d54841115611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990614193565b60405180910390fd5b600e548461190f33611132565b61191991906145f8565b111561195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195190614233565b60405180910390fd5b3484600c54611969919061467f565b11156119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614293565b60405180910390fd5b6000336040516020016119bd9190614047565b60405160208183030381529060405280519060200120905060001515601060019054906101000a900460ff1615151480611a415750611a40848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506014548361279c565b5b611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790614493565b60405180910390fd5b60005b85811015611aa757611a94336127b3565b8080611a9f9061483d565b915050611a83565b505050505050565b611ab7612282565b73ffffffffffffffffffffffffffffffffffffffff16611ad56114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2290614393565b60405180910390fd5b60005b8260ff168160ff161015611b5857611b45826127b3565b8080611b5090614886565b915050611b2e565b505050565b611b65612282565b73ffffffffffffffffffffffffffffffffffffffff16611b836114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090614393565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611bff906140bf565b60006040518083038185875af1925050503d8060008114611c3c576040519150601f19603f3d011682016040523d82523d6000602084013e611c41565b606091505b5050905080611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90614433565b60405180910390fd5b505050565b611c9b611c95612282565b83612343565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190614453565b60405180910390fd5b611ce6848484846127d1565b50505050565b6060611cf782612216565b611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d906143d3565b60405180910390fd5b60001515601060029054906101000a900460ff1615151415611de45760118054611d5f906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8b906147da565b8015611dd85780601f10611dad57610100808354040283529160200191611dd8565b820191906000526020600020905b815481529060010190602001808311611dbb57829003601f168201915b50505050509050611e40565b6000611dee61282d565b90506000815111611e0e5760405180602001604052806000815250611e3c565b80611e18846128bf565b6013604051602001611e2c9392919061408e565b6040516020818303038152906040525b9150505b919050565b600f5481565b611e53612282565b73ffffffffffffffffffffffffffffffffffffffff16611e716114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614393565b60405180910390fd5b8060139080519060200190611edd92919061351b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b611f90612282565b73ffffffffffffffffffffffffffffffffffffffff16611fae6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614393565b60405180910390fd5b806011908051906020019061201a92919061351b565b5050565b612026612282565b73ffffffffffffffffffffffffffffffffffffffff166120446114f0565b73ffffffffffffffffffffffffffffffffffffffff161461209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190614393565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561210a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612101906141f3565b60405180910390fd5b61211381612a20565b50565b61211e612282565b73ffffffffffffffffffffffffffffffffffffffff1661213c6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614612192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218990614393565b60405180910390fd5b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061220f575061220e82612ae6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122fd83610ffa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061234e82612216565b61238d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612384906142d3565b60405180910390fd5b600061239883610ffa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240757508373ffffffffffffffffffffffffffffffffffffffff166123ef846109cf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241857506124178185611ee1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661244182610ffa565b73ffffffffffffffffffffffffffffffffffffffff1614612497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248e906143b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe90614253565b60405180910390fd5b612512838383612bc8565b61251d60008261228a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256d91906146d9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c491906145f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061268882610ffa565b905061269681600084612bc8565b6126a160008361228a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126f191906146d9565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600001549050919050565b6000826127a98584612bd8565b1490509392505050565b6127bd600b612c8b565b6127ce816127c9610fe9565b612ca1565b50565b6127dc848484612421565b6127e884848484612cbf565b612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e906141d3565b60405180910390fd5b50505050565b60606012805461283c906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054612868906147da565b80156128b55780601f1061288a576101008083540402835291602001916128b5565b820191906000526020600020905b81548152906001019060200180831161289857829003601f168201915b5050505050905090565b60606000821415612907576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a1b565b600082905060005b600082146129395780806129229061483d565b915050600a82612932919061464e565b915061290f565b60008167ffffffffffffffff811115612955576129546149fa565b5b6040519080825280601f01601f1916602001820160405280156129875781602001600182028036833780820191505090505b5090505b60008514612a14576001826129a091906146d9565b9150600a856129af91906148de565b60306129bb91906145f8565b60f81b8183815181106129d1576129d06149cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0d919061464e565b945061298b565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bb157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bc15750612bc082612e56565b5b9050919050565b612bd3838383612ec0565b505050565b60008082905060005b8451811015612c80576000858281518110612bff57612bfe6149cb565b5b60200260200101519050808311612c40578281604051602001612c23929190614062565b604051602081830303815290604052805190602001209250612c6c565b8083604051602001612c53929190614062565b6040516020818303038152906040528051906020012092505b508080612c789061483d565b915050612be1565b508091505092915050565b6001816000016000828254019250508190555050565b612cbb828260405180602001604052806000815250612fd4565b5050565b6000612ce08473ffffffffffffffffffffffffffffffffffffffff1661302f565b15612e49578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d09612282565b8786866040518563ffffffff1660e01b8152600401612d2b94939291906140ef565b602060405180830381600087803b158015612d4557600080fd5b505af1925050508015612d7657506040513d601f19601f82011682018060405250810190612d7391906139a4565b60015b612df9573d8060008114612da6576040519150601f19603f3d011682016040523d82523d6000602084013e612dab565b606091505b50600081511415612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de8906141d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e4e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ecb838383613042565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f0e57612f0981613047565b612f4d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f4c57612f4b8382613090565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f9057612f8b816131fd565b612fcf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fce57612fcd82826132ce565b5b5b505050565b612fde838361334d565b612feb6000848484612cbf565b61302a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613021906141d3565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161309d84611132565b6130a791906146d9565b905060006007600084815260200190815260200160002054905081811461318c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061321191906146d9565b9050600060096000848152602001908152602001600020549050600060088381548110613241576132406149cb565b5b906000526020600020015490508060088381548110613263576132626149cb565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132b2576132b161499c565b5b6001900381819060005260206000200160009055905550505050565b60006132d983611132565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b490614353565b60405180910390fd5b6133c681612216565b15613406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fd90614213565b60405180910390fd5b61341260008383612bc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461346291906145f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613527906147da565b90600052602060002090601f0160209004810192826135495760008555613590565b82601f1061356257805160ff1916838001178555613590565b82800160010185558215613590579182015b8281111561358f578251825591602001919060010190613574565b5b50905061359d91906135a1565b5090565b5b808211156135ba5760008160009055506001016135a2565b5090565b60006135d16135cc84614533565b61450e565b9050828152602081018484840111156135ed576135ec614a38565b5b6135f8848285614798565b509392505050565b600061361361360e84614564565b61450e565b90508281526020810184848401111561362f5761362e614a38565b5b61363a848285614798565b509392505050565b60008135905061365181615141565b92915050565b60008083601f84011261366d5761366c614a2e565b5b8235905067ffffffffffffffff81111561368a57613689614a29565b5b6020830191508360208202830111156136a6576136a5614a33565b5b9250929050565b6000813590506136bc81615158565b92915050565b6000813590506136d18161516f565b92915050565b6000813590506136e681615186565b92915050565b6000815190506136fb81615186565b92915050565b600082601f83011261371657613715614a2e565b5b81356137268482602086016135be565b91505092915050565b600082601f83011261374457613743614a2e565b5b8135613754848260208601613600565b91505092915050565b60008135905061376c8161519d565b92915050565b600081359050613781816151b4565b92915050565b60006020828403121561379d5761379c614a42565b5b60006137ab84828501613642565b91505092915050565b600080604083850312156137cb576137ca614a42565b5b60006137d985828601613642565b92505060206137ea85828601613642565b9150509250929050565b60008060006060848603121561380d5761380c614a42565b5b600061381b86828701613642565b935050602061382c86828701613642565b925050604061383d8682870161375d565b9150509250925092565b6000806000806080858703121561386157613860614a42565b5b600061386f87828801613642565b945050602061388087828801613642565b93505060406138918782880161375d565b925050606085013567ffffffffffffffff8111156138b2576138b1614a3d565b5b6138be87828801613701565b91505092959194509250565b600080604083850312156138e1576138e0614a42565b5b60006138ef85828601613642565b9250506020613900858286016136ad565b9150509250929050565b6000806040838503121561392157613920614a42565b5b600061392f85828601613642565b92505060206139408582860161375d565b9150509250929050565b6000602082840312156139605761395f614a42565b5b600061396e848285016136c2565b91505092915050565b60006020828403121561398d5761398c614a42565b5b600061399b848285016136d7565b91505092915050565b6000602082840312156139ba576139b9614a42565b5b60006139c8848285016136ec565b91505092915050565b6000602082840312156139e7576139e6614a42565b5b600082013567ffffffffffffffff811115613a0557613a04614a3d565b5b613a118482850161372f565b91505092915050565b600060208284031215613a3057613a2f614a42565b5b6000613a3e8482850161375d565b91505092915050565b600080600060408486031215613a6057613a5f614a42565b5b6000613a6e8682870161375d565b935050602084013567ffffffffffffffff811115613a8f57613a8e614a3d565b5b613a9b86828701613657565b92509250509250925092565b60008060408385031215613abe57613abd614a42565b5b6000613acc85828601613772565b9250506020613add85828601613642565b9150509250929050565b613af08161470d565b82525050565b613b07613b028261470d565b6148b0565b82525050565b613b168161471f565b82525050565b613b258161472b565b82525050565b613b3c613b378261472b565b6148c2565b82525050565b6000613b4d826145aa565b613b5781856145c0565b9350613b678185602086016147a7565b613b7081614a47565b840191505092915050565b6000613b86826145b5565b613b9081856145dc565b9350613ba08185602086016147a7565b613ba981614a47565b840191505092915050565b6000613bbf826145b5565b613bc981856145ed565b9350613bd98185602086016147a7565b80840191505092915050565b60008154613bf2816147da565b613bfc81866145ed565b94506001821660008114613c175760018114613c2857613c5b565b60ff19831686528186019350613c5b565b613c3185614595565b60005b83811015613c5357815481890152600182019150602081019050613c34565b838801955050505b50505092915050565b6000613c71602b836145dc565b9150613c7c82614a65565b604082019050919050565b6000613c94602b836145dc565b9150613c9f82614ab4565b604082019050919050565b6000613cb76032836145dc565b9150613cc282614b03565b604082019050919050565b6000613cda6026836145dc565b9150613ce582614b52565b604082019050919050565b6000613cfd601c836145dc565b9150613d0882614ba1565b602082019050919050565b6000613d206026836145dc565b9150613d2b82614bca565b604082019050919050565b6000613d436024836145dc565b9150613d4e82614c19565b604082019050919050565b6000613d666019836145dc565b9150613d7182614c68565b602082019050919050565b6000613d89601f836145dc565b9150613d9482614c91565b602082019050919050565b6000613dac6009836145dc565b9150613db782614cba565b602082019050919050565b6000613dcf602c836145dc565b9150613dda82614ce3565b604082019050919050565b6000613df26038836145dc565b9150613dfd82614d32565b604082019050919050565b6000613e15602a836145dc565b9150613e2082614d81565b604082019050919050565b6000613e386029836145dc565b9150613e4382614dd0565b604082019050919050565b6000613e5b6020836145dc565b9150613e6682614e1f565b602082019050919050565b6000613e7e602c836145dc565b9150613e8982614e48565b604082019050919050565b6000613ea16020836145dc565b9150613eac82614e97565b602082019050919050565b6000613ec46029836145dc565b9150613ecf82614ec0565b604082019050919050565b6000613ee7602f836145dc565b9150613ef282614f0f565b604082019050919050565b6000613f0a6021836145dc565b9150613f1582614f5e565b604082019050919050565b6000613f2d600e836145dc565b9150613f3882614fad565b602082019050919050565b6000613f506000836145d1565b9150613f5b82614fd6565b600082019050919050565b6000613f736010836145dc565b9150613f7e82614fd9565b602082019050919050565b6000613f966031836145dc565b9150613fa182615002565b604082019050919050565b6000613fb9602c836145dc565b9150613fc482615051565b604082019050919050565b6000613fdc600d836145dc565b9150613fe7826150a0565b602082019050919050565b6000613fff6030836145dc565b915061400a826150c9565b604082019050919050565b60006140226008836145dc565b915061402d82615118565b602082019050919050565b61404181614781565b82525050565b60006140538284613af6565b60148201915081905092915050565b600061406e8285613b2b565b60208201915061407e8284613b2b565b6020820191508190509392505050565b600061409a8286613bb4565b91506140a68285613bb4565b91506140b28284613be5565b9150819050949350505050565b60006140ca82613f43565b9150819050919050565b60006020820190506140e96000830184613ae7565b92915050565b60006080820190506141046000830187613ae7565b6141116020830186613ae7565b61411e6040830185614038565b81810360608301526141308184613b42565b905095945050505050565b60006020820190506141506000830184613b0d565b92915050565b600060208201905061416b6000830184613b1c565b92915050565b6000602082019050818103600083015261418b8184613b7b565b905092915050565b600060208201905081810360008301526141ac81613c64565b9050919050565b600060208201905081810360008301526141cc81613c87565b9050919050565b600060208201905081810360008301526141ec81613caa565b9050919050565b6000602082019050818103600083015261420c81613ccd565b9050919050565b6000602082019050818103600083015261422c81613cf0565b9050919050565b6000602082019050818103600083015261424c81613d13565b9050919050565b6000602082019050818103600083015261426c81613d36565b9050919050565b6000602082019050818103600083015261428c81613d59565b9050919050565b600060208201905081810360008301526142ac81613d7c565b9050919050565b600060208201905081810360008301526142cc81613d9f565b9050919050565b600060208201905081810360008301526142ec81613dc2565b9050919050565b6000602082019050818103600083015261430c81613de5565b9050919050565b6000602082019050818103600083015261432c81613e08565b9050919050565b6000602082019050818103600083015261434c81613e2b565b9050919050565b6000602082019050818103600083015261436c81613e4e565b9050919050565b6000602082019050818103600083015261438c81613e71565b9050919050565b600060208201905081810360008301526143ac81613e94565b9050919050565b600060208201905081810360008301526143cc81613eb7565b9050919050565b600060208201905081810360008301526143ec81613eda565b9050919050565b6000602082019050818103600083015261440c81613efd565b9050919050565b6000602082019050818103600083015261442c81613f20565b9050919050565b6000602082019050818103600083015261444c81613f66565b9050919050565b6000602082019050818103600083015261446c81613f89565b9050919050565b6000602082019050818103600083015261448c81613fac565b9050919050565b600060208201905081810360008301526144ac81613fcf565b9050919050565b600060208201905081810360008301526144cc81613ff2565b9050919050565b600060208201905081810360008301526144ec81614015565b9050919050565b60006020820190506145086000830184614038565b92915050565b6000614518614529565b9050614524828261480c565b919050565b6000604051905090565b600067ffffffffffffffff82111561454e5761454d6149fa565b5b61455782614a47565b9050602081019050919050565b600067ffffffffffffffff82111561457f5761457e6149fa565b5b61458882614a47565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061460382614781565b915061460e83614781565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146435761464261490f565b5b828201905092915050565b600061465982614781565b915061466483614781565b9250826146745761467361493e565b5b828204905092915050565b600061468a82614781565b915061469583614781565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146ce576146cd61490f565b5b828202905092915050565b60006146e482614781565b91506146ef83614781565b9250828210156147025761470161490f565b5b828203905092915050565b600061471882614761565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156147c55780820151818401526020810190506147aa565b838111156147d4576000848401525b50505050565b600060028204905060018216806147f257607f821691505b602082108114156148065761480561496d565b5b50919050565b61481582614a47565b810181811067ffffffffffffffff82111715614834576148336149fa565b5b80604052505050565b600061484882614781565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487b5761487a61490f565b5b600182019050919050565b60006148918261478b565b915060ff8214156148a5576148a461490f565b5b600182019050919050565b60006148bb826148cc565b9050919050565b6000819050919050565b60006148d782614a58565b9050919050565b60006148e982614781565b91506148f483614781565b9250826149045761490361493e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f7472616e73616374696f6e000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206e6f74206f70656e000000000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737400000000000000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f536f6c646f757421000000000000000000000000000000000000000000000000600082015250565b61514a8161470d565b811461515557600080fd5b50565b6151618161471f565b811461516c57600080fd5b50565b6151788161472b565b811461518357600080fd5b50565b61518f81614735565b811461519a57600080fd5b50565b6151a681614781565b81146151b157600080fd5b50565b6151bd8161478b565b81146151c857600080fd5b5056fea26469706673582212202d1d8d95c58677b4b6c9188fb4e54bea6d77e812764134e4be10032c89abee3264736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063b3d6c53c116100b6578063da3ef23f1161007a578063da3ef23f1461081f578063e985e9c514610848578063eb8d244414610885578063f2c4ce1e146108b0578063f2fde38b146108d9578063fe92b0931461090257610246565b8063b3d6c53c1461073c578063b4e380d514610765578063b88d4fde1461078e578063c87b56dd146107b7578063d5abeb01146107f457610246565b80638da5cb5b116100fd5780638da5cb5b1461068a57806395d89b41146106b5578063a22cb465146106e0578063a475b5dd14610709578063ae7c122e1461072057610246565b806370a08231146105df578063715018a61461061c5780637cb6475914610633578063814c36341461065c578063853828b61461067357610246565b806334393743116101c757806353135ca01161018b57806353135ca0146104fa57806355f804b314610525578063626be5671461054e5780636352211e146105795780636a61e5fc146105b657610246565b8063343937431461042957806342842e0e1461044057806342966c68146104695780634f6ccce71461049257806351830227146104cf57610246565b806318160ddd1161020e57806318160ddd146103445780631fe9eabc1461036f57806323b872dd146103985780632eb4a7ab146103c15780632f745c59146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063081c8c44146102f0578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613977565b61092b565b60405161027f919061413b565b60405180910390f35b34801561029457600080fd5b5061029d61093d565b6040516102aa9190614171565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a1a565b6109cf565b6040516102e791906140d4565b60405180910390f35b3480156102fc57600080fd5b50610305610a54565b6040516103129190614171565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d919061390a565b610ae2565b005b34801561035057600080fd5b50610359610bfa565b60405161036691906144f3565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613a1a565b610c07565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906137f4565b610c8d565b005b3480156103cd57600080fd5b506103d6610ced565b6040516103e39190614156565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e919061390a565b610cf3565b60405161042091906144f3565b60405180910390f35b34801561043557600080fd5b5061043e610d98565b005b34801561044c57600080fd5b50610467600480360381019061046291906137f4565b610e40565b005b34801561047557600080fd5b50610490600480360381019061048b9190613a1a565b610e60565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613a1a565b610ebc565b6040516104c691906144f3565b60405180910390f35b3480156104db57600080fd5b506104e4610f2d565b6040516104f1919061413b565b60405180910390f35b34801561050657600080fd5b5061050f610f40565b60405161051c919061413b565b60405180910390f35b34801561053157600080fd5b5061054c600480360381019061054791906139d1565b610f53565b005b34801561055a57600080fd5b50610563610fe9565b60405161057091906144f3565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613a1a565b610ffa565b6040516105ad91906140d4565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d89190613a1a565b6110ac565b005b3480156105eb57600080fd5b5061060660048036038101906106019190613787565b611132565b60405161061391906144f3565b60405180910390f35b34801561062857600080fd5b506106316111ea565b005b34801561063f57600080fd5b5061065a6004803603810190610655919061394a565b611327565b005b34801561066857600080fd5b506106716113ad565b005b34801561067f57600080fd5b50610688611455565b005b34801561069657600080fd5b5061069f6114f0565b6040516106ac91906140d4565b60405180910390f35b3480156106c157600080fd5b506106ca61151a565b6040516106d79190614171565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906138ca565b6115ac565b005b34801561071557600080fd5b5061071e61172d565b005b61073a60048036038101906107359190613a47565b6117c6565b005b34801561074857600080fd5b50610763600480360381019061075e9190613aa7565b611aaf565b005b34801561077157600080fd5b5061078c6004803603810190610787919061390a565b611b5d565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613847565b611c8a565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613a1a565b611cec565b6040516107eb9190614171565b60405180910390f35b34801561080057600080fd5b50610809611e45565b60405161081691906144f3565b60405180910390f35b34801561082b57600080fd5b50610846600480360381019061084191906139d1565b611e4b565b005b34801561085457600080fd5b5061086f600480360381019061086a91906137b4565b611ee1565b60405161087c919061413b565b60405180910390f35b34801561089157600080fd5b5061089a611f75565b6040516108a7919061413b565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d291906139d1565b611f88565b005b3480156108e557600080fd5b5061090060048036038101906108fb9190613787565b61201e565b005b34801561090e57600080fd5b5061092960048036038101906109249190613a1a565b612116565b005b60006109368261219c565b9050919050565b60606000805461094c906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054610978906147da565b80156109c55780601f1061099a576101008083540402835291602001916109c5565b820191906000526020600020905b8154815290600101906020018083116109a857829003601f168201915b5050505050905090565b60006109da82612216565b610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1090614373565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610a61906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8d906147da565b8015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b505050505081565b6000610aed82610ffa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b55906143f3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7d612282565b73ffffffffffffffffffffffffffffffffffffffff161480610bac5750610bab81610ba6612282565b611ee1565b5b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906142f3565b60405180910390fd5b610bf5838361228a565b505050565b6000600880549050905090565b610c0f612282565b73ffffffffffffffffffffffffffffffffffffffff16610c2d6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90614393565b60405180910390fd5b80600f8190555050565b610c9e610c98612282565b82612343565b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490614453565b60405180910390fd5b610ce8838383612421565b505050565b60145481565b6000610cfe83611132565b8210610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906141b3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610da0612282565b73ffffffffffffffffffffffffffffffffffffffff16610dbe6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614393565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610e5b83838360405180602001604052806000815250611c8a565b505050565b610e71610e6b612282565b82612343565b610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea7906144b3565b60405180910390fd5b610eb98161267d565b50565b6000610ec6610bfa565b8210610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90614473565b60405180910390fd5b60088281548110610f1b57610f1a6149cb565b5b90600052602060002001549050919050565b601060029054906101000a900460ff1681565b601060019054906101000a900460ff1681565b610f5b612282565b73ffffffffffffffffffffffffffffffffffffffff16610f796114f0565b73ffffffffffffffffffffffffffffffffffffffff1614610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690614393565b60405180910390fd5b8060129080519060200190610fe592919061351b565b5050565b6000610ff5600b61278e565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a90614333565b60405180910390fd5b80915050919050565b6110b4612282565b73ffffffffffffffffffffffffffffffffffffffff166110d26114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90614393565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90614313565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f2612282565b73ffffffffffffffffffffffffffffffffffffffff166112106114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90614393565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61132f612282565b73ffffffffffffffffffffffffffffffffffffffff1661134d6114f0565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90614393565b60405180910390fd5b8060148190555050565b6113b5612282565b73ffffffffffffffffffffffffffffffffffffffff166113d36114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090614393565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61145d612282565b73ffffffffffffffffffffffffffffffffffffffff1661147b6114f0565b73ffffffffffffffffffffffffffffffffffffffff16146114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c890614393565b60405180910390fd5b6000479050600081116114e357600080fd5b6114ed3382611b5d565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611529906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054611555906147da565b80156115a25780601f10611577576101008083540402835291602001916115a2565b820191906000526020600020905b81548152906001019060200180831161158557829003601f168201915b5050505050905090565b6115b4612282565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614273565b60405180910390fd5b806005600061162f612282565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116dc612282565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611721919061413b565b60405180910390a35050565b611735612282565b73ffffffffffffffffffffffffffffffffffffffff166117536114f0565b73ffffffffffffffffffffffffffffffffffffffff16146117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090614393565b60405180910390fd5b6001601060026101000a81548160ff021916908315150217905550565b600f546117d1610fe9565b1115611812576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611809906144d3565b60405180910390fd5b601060009054906101000a900460ff16611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890614413565b60405180910390fd5b600061186b610fe9565b9050600f54848261187c91906145f8565b11156118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b4906142b3565b60405180910390fd5b600d54841115611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990614193565b60405180910390fd5b600e548461190f33611132565b61191991906145f8565b111561195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195190614233565b60405180910390fd5b3484600c54611969919061467f565b11156119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614293565b60405180910390fd5b6000336040516020016119bd9190614047565b60405160208183030381529060405280519060200120905060001515601060019054906101000a900460ff1615151480611a415750611a40848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506014548361279c565b5b611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790614493565b60405180910390fd5b60005b85811015611aa757611a94336127b3565b8080611a9f9061483d565b915050611a83565b505050505050565b611ab7612282565b73ffffffffffffffffffffffffffffffffffffffff16611ad56114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2290614393565b60405180910390fd5b60005b8260ff168160ff161015611b5857611b45826127b3565b8080611b5090614886565b915050611b2e565b505050565b611b65612282565b73ffffffffffffffffffffffffffffffffffffffff16611b836114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090614393565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611bff906140bf565b60006040518083038185875af1925050503d8060008114611c3c576040519150601f19603f3d011682016040523d82523d6000602084013e611c41565b606091505b5050905080611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90614433565b60405180910390fd5b505050565b611c9b611c95612282565b83612343565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190614453565b60405180910390fd5b611ce6848484846127d1565b50505050565b6060611cf782612216565b611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d906143d3565b60405180910390fd5b60001515601060029054906101000a900460ff1615151415611de45760118054611d5f906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8b906147da565b8015611dd85780601f10611dad57610100808354040283529160200191611dd8565b820191906000526020600020905b815481529060010190602001808311611dbb57829003601f168201915b50505050509050611e40565b6000611dee61282d565b90506000815111611e0e5760405180602001604052806000815250611e3c565b80611e18846128bf565b6013604051602001611e2c9392919061408e565b6040516020818303038152906040525b9150505b919050565b600f5481565b611e53612282565b73ffffffffffffffffffffffffffffffffffffffff16611e716114f0565b73ffffffffffffffffffffffffffffffffffffffff1614611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614393565b60405180910390fd5b8060139080519060200190611edd92919061351b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b611f90612282565b73ffffffffffffffffffffffffffffffffffffffff16611fae6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614393565b60405180910390fd5b806011908051906020019061201a92919061351b565b5050565b612026612282565b73ffffffffffffffffffffffffffffffffffffffff166120446114f0565b73ffffffffffffffffffffffffffffffffffffffff161461209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190614393565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561210a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612101906141f3565b60405180910390fd5b61211381612a20565b50565b61211e612282565b73ffffffffffffffffffffffffffffffffffffffff1661213c6114f0565b73ffffffffffffffffffffffffffffffffffffffff1614612192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218990614393565b60405180910390fd5b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061220f575061220e82612ae6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122fd83610ffa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061234e82612216565b61238d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612384906142d3565b60405180910390fd5b600061239883610ffa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240757508373ffffffffffffffffffffffffffffffffffffffff166123ef846109cf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241857506124178185611ee1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661244182610ffa565b73ffffffffffffffffffffffffffffffffffffffff1614612497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248e906143b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe90614253565b60405180910390fd5b612512838383612bc8565b61251d60008261228a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256d91906146d9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c491906145f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061268882610ffa565b905061269681600084612bc8565b6126a160008361228a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126f191906146d9565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600001549050919050565b6000826127a98584612bd8565b1490509392505050565b6127bd600b612c8b565b6127ce816127c9610fe9565b612ca1565b50565b6127dc848484612421565b6127e884848484612cbf565b612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e906141d3565b60405180910390fd5b50505050565b60606012805461283c906147da565b80601f0160208091040260200160405190810160405280929190818152602001828054612868906147da565b80156128b55780601f1061288a576101008083540402835291602001916128b5565b820191906000526020600020905b81548152906001019060200180831161289857829003601f168201915b5050505050905090565b60606000821415612907576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a1b565b600082905060005b600082146129395780806129229061483d565b915050600a82612932919061464e565b915061290f565b60008167ffffffffffffffff811115612955576129546149fa565b5b6040519080825280601f01601f1916602001820160405280156129875781602001600182028036833780820191505090505b5090505b60008514612a14576001826129a091906146d9565b9150600a856129af91906148de565b60306129bb91906145f8565b60f81b8183815181106129d1576129d06149cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0d919061464e565b945061298b565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bb157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bc15750612bc082612e56565b5b9050919050565b612bd3838383612ec0565b505050565b60008082905060005b8451811015612c80576000858281518110612bff57612bfe6149cb565b5b60200260200101519050808311612c40578281604051602001612c23929190614062565b604051602081830303815290604052805190602001209250612c6c565b8083604051602001612c53929190614062565b6040516020818303038152906040528051906020012092505b508080612c789061483d565b915050612be1565b508091505092915050565b6001816000016000828254019250508190555050565b612cbb828260405180602001604052806000815250612fd4565b5050565b6000612ce08473ffffffffffffffffffffffffffffffffffffffff1661302f565b15612e49578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d09612282565b8786866040518563ffffffff1660e01b8152600401612d2b94939291906140ef565b602060405180830381600087803b158015612d4557600080fd5b505af1925050508015612d7657506040513d601f19601f82011682018060405250810190612d7391906139a4565b60015b612df9573d8060008114612da6576040519150601f19603f3d011682016040523d82523d6000602084013e612dab565b606091505b50600081511415612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de8906141d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e4e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ecb838383613042565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f0e57612f0981613047565b612f4d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f4c57612f4b8382613090565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f9057612f8b816131fd565b612fcf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fce57612fcd82826132ce565b5b5b505050565b612fde838361334d565b612feb6000848484612cbf565b61302a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613021906141d3565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161309d84611132565b6130a791906146d9565b905060006007600084815260200190815260200160002054905081811461318c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061321191906146d9565b9050600060096000848152602001908152602001600020549050600060088381548110613241576132406149cb565b5b906000526020600020015490508060088381548110613263576132626149cb565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132b2576132b161499c565b5b6001900381819060005260206000200160009055905550505050565b60006132d983611132565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b490614353565b60405180910390fd5b6133c681612216565b15613406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fd90614213565b60405180910390fd5b61341260008383612bc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461346291906145f8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613527906147da565b90600052602060002090601f0160209004810192826135495760008555613590565b82601f1061356257805160ff1916838001178555613590565b82800160010185558215613590579182015b8281111561358f578251825591602001919060010190613574565b5b50905061359d91906135a1565b5090565b5b808211156135ba5760008160009055506001016135a2565b5090565b60006135d16135cc84614533565b61450e565b9050828152602081018484840111156135ed576135ec614a38565b5b6135f8848285614798565b509392505050565b600061361361360e84614564565b61450e565b90508281526020810184848401111561362f5761362e614a38565b5b61363a848285614798565b509392505050565b60008135905061365181615141565b92915050565b60008083601f84011261366d5761366c614a2e565b5b8235905067ffffffffffffffff81111561368a57613689614a29565b5b6020830191508360208202830111156136a6576136a5614a33565b5b9250929050565b6000813590506136bc81615158565b92915050565b6000813590506136d18161516f565b92915050565b6000813590506136e681615186565b92915050565b6000815190506136fb81615186565b92915050565b600082601f83011261371657613715614a2e565b5b81356137268482602086016135be565b91505092915050565b600082601f83011261374457613743614a2e565b5b8135613754848260208601613600565b91505092915050565b60008135905061376c8161519d565b92915050565b600081359050613781816151b4565b92915050565b60006020828403121561379d5761379c614a42565b5b60006137ab84828501613642565b91505092915050565b600080604083850312156137cb576137ca614a42565b5b60006137d985828601613642565b92505060206137ea85828601613642565b9150509250929050565b60008060006060848603121561380d5761380c614a42565b5b600061381b86828701613642565b935050602061382c86828701613642565b925050604061383d8682870161375d565b9150509250925092565b6000806000806080858703121561386157613860614a42565b5b600061386f87828801613642565b945050602061388087828801613642565b93505060406138918782880161375d565b925050606085013567ffffffffffffffff8111156138b2576138b1614a3d565b5b6138be87828801613701565b91505092959194509250565b600080604083850312156138e1576138e0614a42565b5b60006138ef85828601613642565b9250506020613900858286016136ad565b9150509250929050565b6000806040838503121561392157613920614a42565b5b600061392f85828601613642565b92505060206139408582860161375d565b9150509250929050565b6000602082840312156139605761395f614a42565b5b600061396e848285016136c2565b91505092915050565b60006020828403121561398d5761398c614a42565b5b600061399b848285016136d7565b91505092915050565b6000602082840312156139ba576139b9614a42565b5b60006139c8848285016136ec565b91505092915050565b6000602082840312156139e7576139e6614a42565b5b600082013567ffffffffffffffff811115613a0557613a04614a3d565b5b613a118482850161372f565b91505092915050565b600060208284031215613a3057613a2f614a42565b5b6000613a3e8482850161375d565b91505092915050565b600080600060408486031215613a6057613a5f614a42565b5b6000613a6e8682870161375d565b935050602084013567ffffffffffffffff811115613a8f57613a8e614a3d565b5b613a9b86828701613657565b92509250509250925092565b60008060408385031215613abe57613abd614a42565b5b6000613acc85828601613772565b9250506020613add85828601613642565b9150509250929050565b613af08161470d565b82525050565b613b07613b028261470d565b6148b0565b82525050565b613b168161471f565b82525050565b613b258161472b565b82525050565b613b3c613b378261472b565b6148c2565b82525050565b6000613b4d826145aa565b613b5781856145c0565b9350613b678185602086016147a7565b613b7081614a47565b840191505092915050565b6000613b86826145b5565b613b9081856145dc565b9350613ba08185602086016147a7565b613ba981614a47565b840191505092915050565b6000613bbf826145b5565b613bc981856145ed565b9350613bd98185602086016147a7565b80840191505092915050565b60008154613bf2816147da565b613bfc81866145ed565b94506001821660008114613c175760018114613c2857613c5b565b60ff19831686528186019350613c5b565b613c3185614595565b60005b83811015613c5357815481890152600182019150602081019050613c34565b838801955050505b50505092915050565b6000613c71602b836145dc565b9150613c7c82614a65565b604082019050919050565b6000613c94602b836145dc565b9150613c9f82614ab4565b604082019050919050565b6000613cb76032836145dc565b9150613cc282614b03565b604082019050919050565b6000613cda6026836145dc565b9150613ce582614b52565b604082019050919050565b6000613cfd601c836145dc565b9150613d0882614ba1565b602082019050919050565b6000613d206026836145dc565b9150613d2b82614bca565b604082019050919050565b6000613d436024836145dc565b9150613d4e82614c19565b604082019050919050565b6000613d666019836145dc565b9150613d7182614c68565b602082019050919050565b6000613d89601f836145dc565b9150613d9482614c91565b602082019050919050565b6000613dac6009836145dc565b9150613db782614cba565b602082019050919050565b6000613dcf602c836145dc565b9150613dda82614ce3565b604082019050919050565b6000613df26038836145dc565b9150613dfd82614d32565b604082019050919050565b6000613e15602a836145dc565b9150613e2082614d81565b604082019050919050565b6000613e386029836145dc565b9150613e4382614dd0565b604082019050919050565b6000613e5b6020836145dc565b9150613e6682614e1f565b602082019050919050565b6000613e7e602c836145dc565b9150613e8982614e48565b604082019050919050565b6000613ea16020836145dc565b9150613eac82614e97565b602082019050919050565b6000613ec46029836145dc565b9150613ecf82614ec0565b604082019050919050565b6000613ee7602f836145dc565b9150613ef282614f0f565b604082019050919050565b6000613f0a6021836145dc565b9150613f1582614f5e565b604082019050919050565b6000613f2d600e836145dc565b9150613f3882614fad565b602082019050919050565b6000613f506000836145d1565b9150613f5b82614fd6565b600082019050919050565b6000613f736010836145dc565b9150613f7e82614fd9565b602082019050919050565b6000613f966031836145dc565b9150613fa182615002565b604082019050919050565b6000613fb9602c836145dc565b9150613fc482615051565b604082019050919050565b6000613fdc600d836145dc565b9150613fe7826150a0565b602082019050919050565b6000613fff6030836145dc565b915061400a826150c9565b604082019050919050565b60006140226008836145dc565b915061402d82615118565b602082019050919050565b61404181614781565b82525050565b60006140538284613af6565b60148201915081905092915050565b600061406e8285613b2b565b60208201915061407e8284613b2b565b6020820191508190509392505050565b600061409a8286613bb4565b91506140a68285613bb4565b91506140b28284613be5565b9150819050949350505050565b60006140ca82613f43565b9150819050919050565b60006020820190506140e96000830184613ae7565b92915050565b60006080820190506141046000830187613ae7565b6141116020830186613ae7565b61411e6040830185614038565b81810360608301526141308184613b42565b905095945050505050565b60006020820190506141506000830184613b0d565b92915050565b600060208201905061416b6000830184613b1c565b92915050565b6000602082019050818103600083015261418b8184613b7b565b905092915050565b600060208201905081810360008301526141ac81613c64565b9050919050565b600060208201905081810360008301526141cc81613c87565b9050919050565b600060208201905081810360008301526141ec81613caa565b9050919050565b6000602082019050818103600083015261420c81613ccd565b9050919050565b6000602082019050818103600083015261422c81613cf0565b9050919050565b6000602082019050818103600083015261424c81613d13565b9050919050565b6000602082019050818103600083015261426c81613d36565b9050919050565b6000602082019050818103600083015261428c81613d59565b9050919050565b600060208201905081810360008301526142ac81613d7c565b9050919050565b600060208201905081810360008301526142cc81613d9f565b9050919050565b600060208201905081810360008301526142ec81613dc2565b9050919050565b6000602082019050818103600083015261430c81613de5565b9050919050565b6000602082019050818103600083015261432c81613e08565b9050919050565b6000602082019050818103600083015261434c81613e2b565b9050919050565b6000602082019050818103600083015261436c81613e4e565b9050919050565b6000602082019050818103600083015261438c81613e71565b9050919050565b600060208201905081810360008301526143ac81613e94565b9050919050565b600060208201905081810360008301526143cc81613eb7565b9050919050565b600060208201905081810360008301526143ec81613eda565b9050919050565b6000602082019050818103600083015261440c81613efd565b9050919050565b6000602082019050818103600083015261442c81613f20565b9050919050565b6000602082019050818103600083015261444c81613f66565b9050919050565b6000602082019050818103600083015261446c81613f89565b9050919050565b6000602082019050818103600083015261448c81613fac565b9050919050565b600060208201905081810360008301526144ac81613fcf565b9050919050565b600060208201905081810360008301526144cc81613ff2565b9050919050565b600060208201905081810360008301526144ec81614015565b9050919050565b60006020820190506145086000830184614038565b92915050565b6000614518614529565b9050614524828261480c565b919050565b6000604051905090565b600067ffffffffffffffff82111561454e5761454d6149fa565b5b61455782614a47565b9050602081019050919050565b600067ffffffffffffffff82111561457f5761457e6149fa565b5b61458882614a47565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061460382614781565b915061460e83614781565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146435761464261490f565b5b828201905092915050565b600061465982614781565b915061466483614781565b9250826146745761467361493e565b5b828204905092915050565b600061468a82614781565b915061469583614781565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146ce576146cd61490f565b5b828202905092915050565b60006146e482614781565b91506146ef83614781565b9250828210156147025761470161490f565b5b828203905092915050565b600061471882614761565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156147c55780820151818401526020810190506147aa565b838111156147d4576000848401525b50505050565b600060028204905060018216806147f257607f821691505b602082108114156148065761480561496d565b5b50919050565b61481582614a47565b810181811067ffffffffffffffff82111715614834576148336149fa565b5b80604052505050565b600061484882614781565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487b5761487a61490f565b5b600182019050919050565b60006148918261478b565b915060ff8214156148a5576148a461490f565b5b600182019050919050565b60006148bb826148cc565b9050919050565b6000819050919050565b60006148d782614a58565b9050919050565b60006148e982614781565b91506148f483614781565b9250826149045761490361493e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f7472616e73616374696f6e000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206e6f74206f70656e000000000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737400000000000000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f536f6c646f757421000000000000000000000000000000000000000000000000600082015250565b61514a8161470d565b811461515557600080fd5b50565b6151618161471f565b811461516c57600080fd5b50565b6151788161472b565b811461518357600080fd5b50565b61518f81614735565b811461519a57600080fd5b50565b6151a681614781565b81146151b157600080fd5b50565b6151bd8161478b565b81146151c857600080fd5b5056fea26469706673582212202d1d8d95c58677b4b6c9188fb4e54bea6d77e812764134e4be10032c89abee3264736f6c63430008070033

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:4838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56195:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28327:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29886:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54020:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29409:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44411:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55906:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30776:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54143:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44079:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56478:93;;;;;;;;;;;;;:::i;:::-;;31186:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51548:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44601:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53985:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53946:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54431:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56734:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28021:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55700:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27751:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41163:148;;;;;;;;;;;;;:::i;:::-;;55018:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56382:88;;;;;;;;;;;;;:::i;:::-;;58137:171;;;;;;;;;;;;;:::i;:::-;;40511:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28496:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30179:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54809:71;;;;;;;;;;;;;:::i;:::-;;56845:794;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57782:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57939:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31442:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55128:564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53870:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54888:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30545:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53908:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54675:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41466:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55802:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56195:179;56306:4;56330:36;56354:11;56330:23;:36::i;:::-;56323:43;;56195: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;54020: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;:::-;29479:341;29409:411;;:::o;44411:113::-;44472:7;44499:10;:17;;;;44492:24;;44411:113;:::o;55906:92::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55983:7:::1;55971:9;:19;;;;55906: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;54143: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;56478:93::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56550:13:::1;;;;;;;;;;;56549:14;56533:13;;:30;;;;;;;;;;;;;;;;;;56478: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;;;;;;;;:::i;:::-;;;;;;;;;;44802:24;;44601:233;;;:::o;53985:28::-;;;;;;;;;;;;;:::o;53946:32::-;;;;;;;;;;;;;:::o;54431:111::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54526:8:::1;54507:16;:27;;;;;;;;;;;;:::i;:::-;;54431:111:::0;:::o;56734:103::-;56777:7;56804:25;:15;:23;:25::i;:::-;56797:32;;56734: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;55700:94::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55780:6:::1;55767:10;:19;;;;55700: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;55018:102::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55102:10:::1;55089;:23;;;;55018:102:::0;:::o;56382:88::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56450:12:::1;;;;;;;;;;;56449:13;56434:12;;:28;;;;;;;;;;;;;;;;;;56382:88::o:0;58137:171::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58188:15:::1;58206:21;58188:39;;58256:1;58246:7;:11;58238:20;;;::::0;::::1;;58269:31;58280:10;58292:7;58269:10;:31::i;:::-;58177:131;58137: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;54809:71::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54868:4:::1;54857:8;;:15;;;;;;;;;;;;;;;;;;54809:71::o:0;56845:794::-;56634:9;;56618:12;:10;:12::i;:::-;:25;;56610:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56675:12;;;;;;;;;;;56667:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;56958:13:::1;56974:12;:10;:12::i;:::-;56958:28;;57031:9;;57013:14;57005:5;:22;;;;:::i;:::-;:35;;56997:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;57091:16;;57073:14;:34;;57065:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;57216:11;;57198:14;57174:21;57184:10;57174:9;:21::i;:::-;:38;;;;:::i;:::-;:53;;57166:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;57320:9;57302:14;57289:10;;:27;;;;:::i;:::-;:40;;57281:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;57378:12;57420:10;57403:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57393:39;;;;;;57378:54;;57468:5;57451:22;;:13;;;;;;;;;;;:22;;;:76;;;;57477:50;57496:12;;57477:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57510:10;;57522:4;57477:18;:50::i;:::-;57451:76;57443:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;57563:9;57558:69;57582:14;57578:1;:18;57558:69;;;57603:24;57616:10;57603:12;:24::i;:::-;57598:3;;;;;:::i;:::-;;;;57558:69;;;;56947:692;;56845:794:::0;;;:::o;57782:149::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57869:7:::1;57864:59;57886:14;57882:18;;:1;:18;;;57864:59;;;57907:16;57920:2;57907:12;:16::i;:::-;57902:3;;;;;:::i;:::-;;;;57864:59;;;;57782:149:::0;;:::o;57939:190::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58023:12:::1;58041:8;:13;;58062:7;58041:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58022:52;;;58093:7;58085:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58011:118;57939: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;55128:564::-;55246:13;55295:16;55303:7;55295;:16::i;:::-;55277:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;55418:5;55406:17;;:8;;;;;;;;;;;:17;;;55403:70;;;55447:14;55440:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55403:70;55485:28;55516:10;:8;:10::i;:::-;55485:41;;55575:1;55550:14;55544:28;:32;:140;;;;;;;;;;;;;;;;;55616:14;55632:18;:7;:16;:18::i;:::-;55651:13;55599:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55544:140;55537:147;;;55128:564;;;;:::o;53870:31::-;;;;:::o;54888:122::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54988:14:::1;54972:13;:30;;;;;;;;;;;;:::i;:::-;;54888:122:::0;:::o;30545:164::-;30642:4;30666:18;:25;30685:5;30666:25;;;;;;;;;;;;;;;:35;30692:8;30666:35;;;;;;;;;;;;;;;;;;;;;;;;;30659:42;;30545:164;;;;:::o;53908:31::-;;;;;;;;;;;;;:::o;54675:126::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54778:15:::1;54761:14;:32;;;;;;;;;;;;:::i;:::-;;54675: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;55802:96::-;40742:12;:10;:12::i;:::-;40731:23;;:7;:5;:7::i;:::-;:23;;;40723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55884:6:::1;55870:11;:20;;;;55802: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;;;;;;;;;;;;35918:311;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;57647:127::-;57701:27;:15;:25;:27::i;:::-;57739;57749:2;57753:12;:10;:12::i;:::-;57739:9;:27::i;:::-;57647: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;54550:117::-;54610:13;54643:16;54636:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54550: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;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;:::i;:::-;;;;;: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;;;;;;;;;;;;41711:128;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;56006:181::-;56134:45;56161:4;56167:2;56171:7;56134:26;:45::i;:::-;56006: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;;;;;;;;:::i;:::-;;;;;;;;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;52922:480;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;;;;48062:294;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;;;47631:907;;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;;;;;;;;:::i;:::-;;;;;;;;;;49515:48;;49601:11;49576:10;49587;49576:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49712:10;49681:15;:28;49697:11;49681:28;;;;;;;;;;;:41;;;;49853:15;:24;49869:7;49853:24;;;;;;;;;;;49846:31;;;49888:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48904:1008;;;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;;;;46411:147;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:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:135::-;3057:5;3095:6;3082:20;3073:29;;3111:31;3136:5;3111:31;:::i;:::-;3013:135;;;;:::o;3154:329::-;3213:6;3262:2;3250:9;3241:7;3237:23;3233:32;3230:119;;;3268:79;;:::i;:::-;3230:119;3388:1;3413:53;3458:7;3449:6;3438:9;3434:22;3413:53;:::i;:::-;3403:63;;3359:117;3154:329;;;;:::o;3489:474::-;3557:6;3565;3614:2;3602:9;3593:7;3589:23;3585:32;3582:119;;;3620:79;;:::i;:::-;3582:119;3740:1;3765:53;3810:7;3801:6;3790:9;3786:22;3765:53;:::i;:::-;3755:63;;3711:117;3867:2;3893:53;3938:7;3929:6;3918:9;3914:22;3893:53;:::i;:::-;3883:63;;3838:118;3489:474;;;;;:::o;3969:619::-;4046:6;4054;4062;4111:2;4099:9;4090:7;4086:23;4082:32;4079:119;;;4117:79;;:::i;:::-;4079:119;4237:1;4262:53;4307:7;4298:6;4287:9;4283:22;4262:53;:::i;:::-;4252:63;;4208:117;4364:2;4390:53;4435:7;4426:6;4415:9;4411:22;4390:53;:::i;:::-;4380:63;;4335:118;4492:2;4518:53;4563:7;4554:6;4543:9;4539:22;4518:53;:::i;:::-;4508:63;;4463:118;3969:619;;;;;:::o;4594:943::-;4689:6;4697;4705;4713;4762:3;4750:9;4741:7;4737:23;4733:33;4730:120;;;4769:79;;:::i;:::-;4730:120;4889:1;4914:53;4959:7;4950:6;4939:9;4935:22;4914:53;:::i;:::-;4904:63;;4860:117;5016:2;5042:53;5087:7;5078:6;5067:9;5063:22;5042:53;:::i;:::-;5032:63;;4987:118;5144:2;5170:53;5215:7;5206:6;5195:9;5191:22;5170:53;:::i;:::-;5160:63;;5115:118;5300:2;5289:9;5285:18;5272:32;5331:18;5323:6;5320:30;5317:117;;;5353:79;;:::i;:::-;5317:117;5458:62;5512:7;5503:6;5492:9;5488:22;5458:62;:::i;:::-;5448:72;;5243:287;4594:943;;;;;;;:::o;5543:468::-;5608:6;5616;5665:2;5653:9;5644:7;5640:23;5636:32;5633:119;;;5671:79;;:::i;:::-;5633:119;5791:1;5816:53;5861:7;5852:6;5841:9;5837:22;5816:53;:::i;:::-;5806:63;;5762:117;5918:2;5944:50;5986:7;5977:6;5966:9;5962:22;5944:50;:::i;:::-;5934:60;;5889:115;5543:468;;;;;:::o;6017:474::-;6085:6;6093;6142:2;6130:9;6121:7;6117:23;6113:32;6110:119;;;6148:79;;:::i;:::-;6110:119;6268:1;6293:53;6338:7;6329:6;6318:9;6314:22;6293:53;:::i;:::-;6283:63;;6239:117;6395:2;6421:53;6466:7;6457:6;6446:9;6442:22;6421:53;:::i;:::-;6411:63;;6366:118;6017:474;;;;;:::o;6497:329::-;6556:6;6605:2;6593:9;6584:7;6580:23;6576:32;6573:119;;;6611:79;;:::i;:::-;6573:119;6731:1;6756:53;6801:7;6792:6;6781:9;6777:22;6756:53;:::i;:::-;6746:63;;6702:117;6497:329;;;;:::o;6832:327::-;6890:6;6939:2;6927:9;6918:7;6914:23;6910:32;6907:119;;;6945:79;;:::i;:::-;6907:119;7065:1;7090:52;7134:7;7125:6;7114:9;7110:22;7090:52;:::i;:::-;7080:62;;7036:116;6832:327;;;;:::o;7165:349::-;7234:6;7283:2;7271:9;7262:7;7258:23;7254:32;7251:119;;;7289:79;;:::i;:::-;7251:119;7409:1;7434:63;7489:7;7480:6;7469:9;7465:22;7434:63;:::i;:::-;7424:73;;7380:127;7165:349;;;;:::o;7520:509::-;7589:6;7638:2;7626:9;7617:7;7613:23;7609:32;7606:119;;;7644:79;;:::i;:::-;7606:119;7792:1;7781:9;7777:17;7764:31;7822:18;7814:6;7811:30;7808:117;;;7844:79;;:::i;:::-;7808:117;7949:63;8004:7;7995:6;7984:9;7980:22;7949:63;:::i;:::-;7939:73;;7735:287;7520:509;;;;:::o;8035:329::-;8094:6;8143:2;8131:9;8122:7;8118:23;8114:32;8111:119;;;8149:79;;:::i;:::-;8111:119;8269:1;8294:53;8339:7;8330:6;8319:9;8315:22;8294:53;:::i;:::-;8284:63;;8240:117;8035:329;;;;:::o;8370:704::-;8465:6;8473;8481;8530:2;8518:9;8509:7;8505:23;8501:32;8498:119;;;8536:79;;:::i;:::-;8498:119;8656:1;8681:53;8726:7;8717:6;8706:9;8702:22;8681:53;:::i;:::-;8671:63;;8627:117;8811:2;8800:9;8796:18;8783:32;8842:18;8834:6;8831:30;8828:117;;;8864:79;;:::i;:::-;8828:117;8977:80;9049:7;9040:6;9029:9;9025:22;8977:80;:::i;:::-;8959:98;;;;8754:313;8370:704;;;;;:::o;9080:470::-;9146:6;9154;9203:2;9191:9;9182:7;9178:23;9174:32;9171:119;;;9209:79;;:::i;:::-;9171:119;9329:1;9354:51;9397:7;9388:6;9377:9;9373:22;9354:51;:::i;:::-;9344:61;;9300:115;9454:2;9480:53;9525:7;9516:6;9505:9;9501:22;9480:53;:::i;:::-;9470:63;;9425:118;9080:470;;;;;:::o;9556:118::-;9643:24;9661:5;9643:24;:::i;:::-;9638:3;9631:37;9556:118;;:::o;9680:157::-;9785:45;9805:24;9823:5;9805:24;:::i;:::-;9785:45;:::i;:::-;9780:3;9773:58;9680:157;;:::o;9843:109::-;9924:21;9939:5;9924:21;:::i;:::-;9919:3;9912:34;9843:109;;:::o;9958:118::-;10045:24;10063:5;10045:24;:::i;:::-;10040:3;10033:37;9958:118;;:::o;10082:157::-;10187:45;10207:24;10225:5;10207:24;:::i;:::-;10187:45;:::i;:::-;10182:3;10175:58;10082:157;;:::o;10245:360::-;10331:3;10359:38;10391:5;10359:38;:::i;:::-;10413:70;10476:6;10471:3;10413:70;:::i;:::-;10406:77;;10492:52;10537:6;10532:3;10525:4;10518:5;10514:16;10492:52;:::i;:::-;10569:29;10591:6;10569:29;:::i;:::-;10564:3;10560:39;10553:46;;10335:270;10245:360;;;;:::o;10611:364::-;10699:3;10727:39;10760:5;10727:39;:::i;:::-;10782:71;10846:6;10841:3;10782:71;:::i;:::-;10775:78;;10862:52;10907:6;10902:3;10895:4;10888:5;10884:16;10862:52;:::i;:::-;10939:29;10961:6;10939:29;:::i;:::-;10934:3;10930:39;10923:46;;10703:272;10611:364;;;;:::o;10981:377::-;11087:3;11115:39;11148:5;11115:39;:::i;:::-;11170:89;11252:6;11247:3;11170:89;:::i;:::-;11163:96;;11268:52;11313:6;11308:3;11301:4;11294:5;11290:16;11268:52;:::i;:::-;11345:6;11340:3;11336:16;11329:23;;11091:267;10981:377;;;;:::o;11388:845::-;11491:3;11528:5;11522:12;11557:36;11583:9;11557:36;:::i;:::-;11609:89;11691:6;11686:3;11609:89;:::i;:::-;11602:96;;11729:1;11718:9;11714:17;11745:1;11740:137;;;;11891:1;11886:341;;;;11707:520;;11740:137;11824:4;11820:9;11809;11805:25;11800:3;11793:38;11860:6;11855:3;11851:16;11844:23;;11740:137;;11886:341;11953:38;11985:5;11953:38;:::i;:::-;12013:1;12027:154;12041:6;12038:1;12035:13;12027:154;;;12115:7;12109:14;12105:1;12100:3;12096:11;12089:35;12165:1;12156:7;12152:15;12141:26;;12063:4;12060:1;12056:12;12051:17;;12027:154;;;12210:6;12205:3;12201:16;12194:23;;11893:334;;11707:520;;11495:738;;11388:845;;;;:::o;12239:366::-;12381:3;12402:67;12466:2;12461:3;12402:67;:::i;:::-;12395:74;;12478:93;12567:3;12478:93;:::i;:::-;12596:2;12591:3;12587:12;12580:19;;12239:366;;;:::o;12611:::-;12753:3;12774:67;12838:2;12833:3;12774:67;:::i;:::-;12767:74;;12850:93;12939:3;12850:93;:::i;:::-;12968:2;12963:3;12959:12;12952:19;;12611:366;;;:::o;12983:::-;13125:3;13146:67;13210:2;13205:3;13146:67;:::i;:::-;13139:74;;13222:93;13311:3;13222:93;:::i;:::-;13340:2;13335:3;13331:12;13324:19;;12983:366;;;:::o;13355:::-;13497:3;13518:67;13582:2;13577:3;13518:67;:::i;:::-;13511:74;;13594:93;13683:3;13594:93;:::i;:::-;13712:2;13707:3;13703:12;13696:19;;13355:366;;;:::o;13727:::-;13869:3;13890:67;13954:2;13949:3;13890:67;:::i;:::-;13883:74;;13966:93;14055:3;13966:93;:::i;:::-;14084:2;14079:3;14075:12;14068:19;;13727:366;;;:::o;14099:::-;14241:3;14262:67;14326:2;14321:3;14262:67;:::i;:::-;14255:74;;14338:93;14427:3;14338:93;:::i;:::-;14456:2;14451:3;14447:12;14440:19;;14099:366;;;:::o;14471:::-;14613:3;14634:67;14698:2;14693:3;14634:67;:::i;:::-;14627:74;;14710:93;14799:3;14710:93;:::i;:::-;14828:2;14823:3;14819:12;14812:19;;14471:366;;;:::o;14843:::-;14985:3;15006:67;15070:2;15065:3;15006:67;:::i;:::-;14999:74;;15082:93;15171:3;15082:93;:::i;:::-;15200:2;15195:3;15191:12;15184:19;;14843:366;;;:::o;15215:::-;15357:3;15378:67;15442:2;15437:3;15378:67;:::i;:::-;15371:74;;15454:93;15543:3;15454:93;:::i;:::-;15572:2;15567:3;15563:12;15556:19;;15215:366;;;:::o;15587:365::-;15729:3;15750:66;15814:1;15809:3;15750:66;:::i;:::-;15743:73;;15825:93;15914:3;15825:93;:::i;:::-;15943:2;15938:3;15934:12;15927:19;;15587:365;;;:::o;15958:366::-;16100:3;16121:67;16185:2;16180:3;16121:67;:::i;:::-;16114:74;;16197:93;16286:3;16197:93;:::i;:::-;16315:2;16310:3;16306:12;16299:19;;15958:366;;;:::o;16330:::-;16472:3;16493:67;16557:2;16552:3;16493:67;:::i;:::-;16486:74;;16569:93;16658:3;16569:93;:::i;:::-;16687:2;16682:3;16678:12;16671:19;;16330:366;;;:::o;16702:::-;16844:3;16865:67;16929:2;16924:3;16865:67;:::i;:::-;16858:74;;16941:93;17030:3;16941:93;:::i;:::-;17059:2;17054:3;17050:12;17043:19;;16702:366;;;:::o;17074:::-;17216:3;17237:67;17301:2;17296:3;17237:67;:::i;:::-;17230:74;;17313:93;17402:3;17313:93;:::i;:::-;17431:2;17426:3;17422:12;17415:19;;17074:366;;;:::o;17446:::-;17588:3;17609:67;17673:2;17668:3;17609:67;:::i;:::-;17602:74;;17685:93;17774:3;17685:93;:::i;:::-;17803:2;17798:3;17794:12;17787:19;;17446:366;;;:::o;17818:::-;17960:3;17981:67;18045:2;18040:3;17981:67;:::i;:::-;17974:74;;18057:93;18146:3;18057:93;:::i;:::-;18175:2;18170:3;18166:12;18159:19;;17818:366;;;:::o;18190:::-;18332:3;18353:67;18417:2;18412:3;18353:67;:::i;:::-;18346:74;;18429:93;18518:3;18429:93;:::i;:::-;18547:2;18542:3;18538:12;18531:19;;18190:366;;;:::o;18562:::-;18704:3;18725:67;18789:2;18784:3;18725:67;:::i;:::-;18718:74;;18801:93;18890:3;18801:93;:::i;:::-;18919:2;18914:3;18910:12;18903:19;;18562:366;;;:::o;18934:::-;19076:3;19097:67;19161:2;19156:3;19097:67;:::i;:::-;19090:74;;19173:93;19262:3;19173:93;:::i;:::-;19291:2;19286:3;19282:12;19275:19;;18934:366;;;:::o;19306:::-;19448:3;19469:67;19533:2;19528:3;19469:67;:::i;:::-;19462:74;;19545:93;19634:3;19545:93;:::i;:::-;19663:2;19658:3;19654:12;19647:19;;19306:366;;;:::o;19678:::-;19820:3;19841:67;19905:2;19900:3;19841:67;:::i;:::-;19834:74;;19917:93;20006:3;19917:93;:::i;:::-;20035:2;20030:3;20026:12;20019:19;;19678:366;;;:::o;20050:398::-;20209:3;20230:83;20311:1;20306:3;20230:83;:::i;:::-;20223:90;;20322:93;20411:3;20322:93;:::i;:::-;20440:1;20435:3;20431:11;20424:18;;20050:398;;;:::o;20454:366::-;20596:3;20617:67;20681:2;20676:3;20617:67;:::i;:::-;20610:74;;20693:93;20782:3;20693:93;:::i;:::-;20811:2;20806:3;20802:12;20795:19;;20454:366;;;:::o;20826:::-;20968:3;20989:67;21053:2;21048:3;20989:67;:::i;:::-;20982:74;;21065:93;21154:3;21065:93;:::i;:::-;21183:2;21178:3;21174:12;21167:19;;20826:366;;;:::o;21198:::-;21340:3;21361:67;21425:2;21420:3;21361:67;:::i;:::-;21354:74;;21437:93;21526:3;21437:93;:::i;:::-;21555:2;21550:3;21546:12;21539:19;;21198:366;;;:::o;21570:::-;21712:3;21733:67;21797:2;21792:3;21733:67;:::i;:::-;21726:74;;21809:93;21898:3;21809:93;:::i;:::-;21927:2;21922:3;21918:12;21911:19;;21570:366;;;:::o;21942:::-;22084:3;22105:67;22169:2;22164:3;22105:67;:::i;:::-;22098:74;;22181:93;22270:3;22181:93;:::i;:::-;22299:2;22294:3;22290:12;22283:19;;21942:366;;;:::o;22314:365::-;22456:3;22477:66;22541:1;22536:3;22477:66;:::i;:::-;22470:73;;22552:93;22641:3;22552:93;:::i;:::-;22670:2;22665:3;22661:12;22654:19;;22314:365;;;:::o;22685:118::-;22772:24;22790:5;22772:24;:::i;:::-;22767:3;22760:37;22685:118;;:::o;22809:256::-;22921:3;22936:75;23007:3;22998:6;22936:75;:::i;:::-;23036:2;23031:3;23027:12;23020:19;;23056:3;23049:10;;22809:256;;;;:::o;23071:397::-;23211:3;23226:75;23297:3;23288:6;23226:75;:::i;:::-;23326:2;23321:3;23317:12;23310:19;;23339:75;23410:3;23401:6;23339:75;:::i;:::-;23439:2;23434:3;23430:12;23423:19;;23459:3;23452:10;;23071:397;;;;;:::o;23474:589::-;23699:3;23721:95;23812:3;23803:6;23721:95;:::i;:::-;23714:102;;23833:95;23924:3;23915:6;23833:95;:::i;:::-;23826:102;;23945:92;24033:3;24024:6;23945:92;:::i;:::-;23938:99;;24054:3;24047:10;;23474:589;;;;;;:::o;24069:379::-;24253:3;24275:147;24418:3;24275:147;:::i;:::-;24268:154;;24439:3;24432:10;;24069:379;;;:::o;24454:222::-;24547:4;24585:2;24574:9;24570:18;24562:26;;24598:71;24666:1;24655:9;24651:17;24642:6;24598:71;:::i;:::-;24454:222;;;;:::o;24682:640::-;24877:4;24915:3;24904:9;24900:19;24892:27;;24929:71;24997:1;24986:9;24982:17;24973:6;24929:71;:::i;:::-;25010:72;25078:2;25067:9;25063:18;25054:6;25010:72;:::i;:::-;25092;25160:2;25149:9;25145:18;25136:6;25092:72;:::i;:::-;25211:9;25205:4;25201:20;25196:2;25185:9;25181:18;25174:48;25239:76;25310:4;25301:6;25239:76;:::i;:::-;25231:84;;24682:640;;;;;;;:::o;25328:210::-;25415:4;25453:2;25442:9;25438:18;25430:26;;25466:65;25528:1;25517:9;25513:17;25504:6;25466:65;:::i;:::-;25328:210;;;;:::o;25544:222::-;25637:4;25675:2;25664:9;25660:18;25652:26;;25688:71;25756:1;25745:9;25741:17;25732:6;25688:71;:::i;:::-;25544:222;;;;:::o;25772:313::-;25885:4;25923:2;25912:9;25908:18;25900:26;;25972:9;25966:4;25962:20;25958:1;25947:9;25943:17;25936:47;26000:78;26073:4;26064:6;26000:78;:::i;:::-;25992:86;;25772:313;;;;:::o;26091:419::-;26257:4;26295:2;26284:9;26280:18;26272:26;;26344:9;26338:4;26334:20;26330:1;26319:9;26315:17;26308:47;26372:131;26498:4;26372:131;:::i;:::-;26364:139;;26091:419;;;:::o;26516:::-;26682:4;26720:2;26709:9;26705:18;26697:26;;26769:9;26763:4;26759:20;26755:1;26744:9;26740:17;26733:47;26797:131;26923:4;26797:131;:::i;:::-;26789:139;;26516:419;;;:::o;26941:::-;27107:4;27145:2;27134:9;27130:18;27122:26;;27194:9;27188:4;27184:20;27180:1;27169:9;27165:17;27158:47;27222:131;27348:4;27222:131;:::i;:::-;27214:139;;26941:419;;;:::o;27366:::-;27532:4;27570:2;27559:9;27555:18;27547:26;;27619:9;27613:4;27609:20;27605:1;27594:9;27590:17;27583:47;27647:131;27773:4;27647:131;:::i;:::-;27639:139;;27366:419;;;:::o;27791:::-;27957:4;27995:2;27984:9;27980:18;27972:26;;28044:9;28038:4;28034:20;28030:1;28019:9;28015:17;28008:47;28072:131;28198:4;28072:131;:::i;:::-;28064:139;;27791:419;;;:::o;28216:::-;28382:4;28420:2;28409:9;28405:18;28397:26;;28469:9;28463:4;28459:20;28455:1;28444:9;28440:17;28433:47;28497:131;28623:4;28497:131;:::i;:::-;28489:139;;28216:419;;;:::o;28641:::-;28807:4;28845:2;28834:9;28830:18;28822:26;;28894:9;28888:4;28884:20;28880:1;28869:9;28865:17;28858:47;28922:131;29048:4;28922:131;:::i;:::-;28914:139;;28641:419;;;:::o;29066:::-;29232:4;29270:2;29259:9;29255:18;29247:26;;29319:9;29313:4;29309:20;29305:1;29294:9;29290:17;29283:47;29347:131;29473:4;29347:131;:::i;:::-;29339:139;;29066:419;;;:::o;29491:::-;29657:4;29695:2;29684:9;29680:18;29672:26;;29744:9;29738:4;29734:20;29730:1;29719:9;29715:17;29708:47;29772:131;29898:4;29772:131;:::i;:::-;29764:139;;29491:419;;;:::o;29916:::-;30082:4;30120:2;30109:9;30105:18;30097:26;;30169:9;30163:4;30159:20;30155:1;30144:9;30140:17;30133:47;30197:131;30323:4;30197:131;:::i;:::-;30189:139;;29916:419;;;:::o;30341:::-;30507:4;30545:2;30534:9;30530:18;30522:26;;30594:9;30588:4;30584:20;30580:1;30569:9;30565:17;30558:47;30622:131;30748:4;30622:131;:::i;:::-;30614:139;;30341:419;;;:::o;30766:::-;30932:4;30970:2;30959:9;30955:18;30947:26;;31019:9;31013:4;31009:20;31005:1;30994:9;30990:17;30983:47;31047:131;31173:4;31047:131;:::i;:::-;31039:139;;30766:419;;;:::o;31191:::-;31357:4;31395:2;31384:9;31380:18;31372:26;;31444:9;31438:4;31434:20;31430:1;31419:9;31415:17;31408:47;31472:131;31598:4;31472:131;:::i;:::-;31464:139;;31191:419;;;:::o;31616:::-;31782:4;31820:2;31809:9;31805:18;31797:26;;31869:9;31863:4;31859:20;31855:1;31844:9;31840:17;31833:47;31897:131;32023:4;31897:131;:::i;:::-;31889:139;;31616:419;;;:::o;32041:::-;32207:4;32245:2;32234:9;32230:18;32222:26;;32294:9;32288:4;32284:20;32280:1;32269:9;32265:17;32258:47;32322:131;32448:4;32322:131;:::i;:::-;32314:139;;32041:419;;;:::o;32466:::-;32632:4;32670:2;32659:9;32655:18;32647:26;;32719:9;32713:4;32709:20;32705:1;32694:9;32690:17;32683:47;32747:131;32873:4;32747:131;:::i;:::-;32739:139;;32466:419;;;:::o;32891:::-;33057:4;33095:2;33084:9;33080:18;33072:26;;33144:9;33138:4;33134:20;33130:1;33119:9;33115:17;33108:47;33172:131;33298:4;33172:131;:::i;:::-;33164:139;;32891:419;;;:::o;33316:::-;33482:4;33520:2;33509:9;33505:18;33497:26;;33569:9;33563:4;33559:20;33555:1;33544:9;33540:17;33533:47;33597:131;33723:4;33597:131;:::i;:::-;33589:139;;33316:419;;;:::o;33741:::-;33907:4;33945:2;33934:9;33930:18;33922:26;;33994:9;33988:4;33984:20;33980:1;33969:9;33965:17;33958:47;34022:131;34148:4;34022:131;:::i;:::-;34014:139;;33741:419;;;:::o;34166:::-;34332:4;34370:2;34359:9;34355:18;34347:26;;34419:9;34413:4;34409:20;34405:1;34394:9;34390:17;34383:47;34447:131;34573:4;34447:131;:::i;:::-;34439:139;;34166:419;;;:::o;34591:::-;34757:4;34795:2;34784:9;34780:18;34772:26;;34844:9;34838:4;34834:20;34830:1;34819:9;34815:17;34808:47;34872:131;34998:4;34872:131;:::i;:::-;34864:139;;34591:419;;;:::o;35016:::-;35182:4;35220:2;35209:9;35205:18;35197:26;;35269:9;35263:4;35259:20;35255:1;35244:9;35240:17;35233:47;35297:131;35423:4;35297:131;:::i;:::-;35289:139;;35016:419;;;:::o;35441:::-;35607:4;35645:2;35634:9;35630:18;35622:26;;35694:9;35688:4;35684:20;35680:1;35669:9;35665:17;35658:47;35722:131;35848:4;35722:131;:::i;:::-;35714:139;;35441:419;;;:::o;35866:::-;36032:4;36070:2;36059:9;36055:18;36047:26;;36119:9;36113:4;36109:20;36105:1;36094:9;36090:17;36083:47;36147:131;36273:4;36147:131;:::i;:::-;36139:139;;35866:419;;;:::o;36291:::-;36457:4;36495:2;36484:9;36480:18;36472:26;;36544:9;36538:4;36534:20;36530:1;36519:9;36515:17;36508:47;36572:131;36698:4;36572:131;:::i;:::-;36564:139;;36291:419;;;:::o;36716:::-;36882:4;36920:2;36909:9;36905:18;36897:26;;36969:9;36963:4;36959:20;36955:1;36944:9;36940:17;36933:47;36997:131;37123:4;36997:131;:::i;:::-;36989:139;;36716:419;;;:::o;37141:::-;37307:4;37345:2;37334:9;37330:18;37322:26;;37394:9;37388:4;37384:20;37380:1;37369:9;37365:17;37358:47;37422:131;37548:4;37422:131;:::i;:::-;37414:139;;37141:419;;;:::o;37566:222::-;37659:4;37697:2;37686:9;37682:18;37674:26;;37710:71;37778:1;37767:9;37763:17;37754:6;37710:71;:::i;:::-;37566:222;;;;:::o;37794:129::-;37828:6;37855:20;;:::i;:::-;37845:30;;37884:33;37912:4;37904:6;37884:33;:::i;:::-;37794:129;;;:::o;37929:75::-;37962:6;37995:2;37989:9;37979:19;;37929:75;:::o;38010:307::-;38071:4;38161:18;38153:6;38150:30;38147:56;;;38183:18;;:::i;:::-;38147:56;38221:29;38243:6;38221:29;:::i;:::-;38213:37;;38305:4;38299;38295:15;38287:23;;38010:307;;;:::o;38323:308::-;38385:4;38475:18;38467:6;38464:30;38461:56;;;38497:18;;:::i;:::-;38461:56;38535:29;38557:6;38535:29;:::i;:::-;38527:37;;38619:4;38613;38609:15;38601:23;;38323:308;;;:::o;38637:141::-;38686:4;38709:3;38701:11;;38732:3;38729:1;38722:14;38766:4;38763:1;38753:18;38745:26;;38637:141;;;:::o;38784:98::-;38835:6;38869:5;38863:12;38853:22;;38784:98;;;:::o;38888:99::-;38940:6;38974:5;38968:12;38958:22;;38888:99;;;:::o;38993:168::-;39076:11;39110:6;39105:3;39098:19;39150:4;39145:3;39141:14;39126:29;;38993:168;;;;:::o;39167:147::-;39268:11;39305:3;39290:18;;39167:147;;;;:::o;39320:169::-;39404:11;39438:6;39433:3;39426:19;39478:4;39473:3;39469:14;39454:29;;39320:169;;;;:::o;39495:148::-;39597:11;39634:3;39619:18;;39495:148;;;;:::o;39649:305::-;39689:3;39708:20;39726:1;39708:20;:::i;:::-;39703:25;;39742:20;39760:1;39742:20;:::i;:::-;39737:25;;39896:1;39828:66;39824:74;39821:1;39818:81;39815:107;;;39902:18;;:::i;:::-;39815:107;39946:1;39943;39939:9;39932:16;;39649:305;;;;:::o;39960:185::-;40000:1;40017:20;40035:1;40017:20;:::i;:::-;40012:25;;40051:20;40069:1;40051:20;:::i;:::-;40046:25;;40090:1;40080:35;;40095:18;;:::i;:::-;40080:35;40137:1;40134;40130:9;40125:14;;39960:185;;;;:::o;40151:348::-;40191:7;40214:20;40232:1;40214:20;:::i;:::-;40209:25;;40248:20;40266:1;40248:20;:::i;:::-;40243:25;;40436:1;40368:66;40364:74;40361:1;40358:81;40353:1;40346:9;40339:17;40335:105;40332:131;;;40443:18;;:::i;:::-;40332:131;40491:1;40488;40484:9;40473:20;;40151:348;;;;:::o;40505:191::-;40545:4;40565:20;40583:1;40565:20;:::i;:::-;40560:25;;40599:20;40617:1;40599:20;:::i;:::-;40594:25;;40638:1;40635;40632:8;40629:34;;;40643:18;;:::i;:::-;40629:34;40688:1;40685;40681:9;40673:17;;40505:191;;;;:::o;40702:96::-;40739:7;40768:24;40786:5;40768:24;:::i;:::-;40757:35;;40702:96;;;:::o;40804:90::-;40838:7;40881:5;40874:13;40867:21;40856:32;;40804:90;;;:::o;40900:77::-;40937:7;40966:5;40955:16;;40900:77;;;:::o;40983:149::-;41019:7;41059:66;41052:5;41048:78;41037:89;;40983:149;;;:::o;41138:126::-;41175:7;41215:42;41208:5;41204:54;41193:65;;41138:126;;;:::o;41270:77::-;41307:7;41336:5;41325:16;;41270:77;;;:::o;41353:86::-;41388:7;41428:4;41421:5;41417:16;41406:27;;41353:86;;;:::o;41445:154::-;41529:6;41524:3;41519;41506:30;41591:1;41582:6;41577:3;41573:16;41566:27;41445:154;;;:::o;41605:307::-;41673:1;41683:113;41697:6;41694:1;41691:13;41683:113;;;41782:1;41777:3;41773:11;41767:18;41763:1;41758:3;41754:11;41747:39;41719:2;41716:1;41712:10;41707:15;;41683:113;;;41814:6;41811:1;41808:13;41805:101;;;41894:1;41885:6;41880:3;41876:16;41869:27;41805:101;41654:258;41605:307;;;:::o;41918:320::-;41962:6;41999:1;41993:4;41989:12;41979:22;;42046:1;42040:4;42036:12;42067:18;42057:81;;42123:4;42115:6;42111:17;42101:27;;42057:81;42185:2;42177:6;42174:14;42154:18;42151:38;42148:84;;;42204:18;;:::i;:::-;42148:84;41969:269;41918:320;;;:::o;42244:281::-;42327:27;42349:4;42327:27;:::i;:::-;42319:6;42315:40;42457:6;42445:10;42442:22;42421:18;42409:10;42406:34;42403:62;42400:88;;;42468:18;;:::i;:::-;42400:88;42508:10;42504:2;42497:22;42287:238;42244:281;;:::o;42531:233::-;42570:3;42593:24;42611:5;42593:24;:::i;:::-;42584:33;;42639:66;42632:5;42629:77;42626:103;;;42709:18;;:::i;:::-;42626:103;42756:1;42749:5;42745:13;42738:20;;42531:233;;;:::o;42770:167::-;42807:3;42830:22;42846:5;42830:22;:::i;:::-;42821:31;;42874:4;42867:5;42864:15;42861:41;;;42882:18;;:::i;:::-;42861:41;42929:1;42922:5;42918:13;42911:20;;42770:167;;;:::o;42943:100::-;42982:7;43011:26;43031:5;43011:26;:::i;:::-;43000:37;;42943:100;;;:::o;43049:79::-;43088:7;43117:5;43106:16;;43049:79;;;:::o;43134:94::-;43173:7;43202:20;43216:5;43202:20;:::i;:::-;43191:31;;43134:94;;;:::o;43234:176::-;43266:1;43283:20;43301:1;43283:20;:::i;:::-;43278:25;;43317:20;43335:1;43317:20;:::i;:::-;43312:25;;43356:1;43346:35;;43361:18;;:::i;:::-;43346:35;43402:1;43399;43395:9;43390:14;;43234:176;;;;:::o;43416:180::-;43464:77;43461:1;43454:88;43561:4;43558:1;43551:15;43585:4;43582:1;43575:15;43602:180;43650:77;43647:1;43640:88;43747:4;43744:1;43737:15;43771:4;43768:1;43761:15;43788:180;43836:77;43833:1;43826:88;43933:4;43930:1;43923:15;43957:4;43954:1;43947:15;43974:180;44022:77;44019:1;44012:88;44119:4;44116:1;44109:15;44143:4;44140:1;44133:15;44160:180;44208:77;44205:1;44198:88;44305:4;44302:1;44295:15;44329:4;44326:1;44319:15;44346:180;44394:77;44391:1;44384:88;44491:4;44488:1;44481:15;44515:4;44512:1;44505:15;44532:117;44641:1;44638;44631:12;44655:117;44764:1;44761;44754:12;44778:117;44887:1;44884;44877:12;44901:117;45010:1;45007;45000:12;45024:117;45133:1;45130;45123:12;45147:117;45256:1;45253;45246:12;45270:102;45311:6;45362:2;45358:7;45353:2;45346:5;45342:14;45338:28;45328:38;;45270:102;;;:::o;45378:94::-;45411:8;45459:5;45455:2;45451:14;45430:35;;45378:94;;;:::o;45478:230::-;45618:34;45614:1;45606:6;45602:14;45595:58;45687:13;45682:2;45674:6;45670:15;45663:38;45478:230;:::o;45714:::-;45854:34;45850:1;45842:6;45838:14;45831:58;45923:13;45918:2;45910:6;45906:15;45899:38;45714:230;:::o;45950:237::-;46090:34;46086:1;46078:6;46074:14;46067:58;46159:20;46154:2;46146:6;46142:15;46135:45;45950:237;:::o;46193:225::-;46333:34;46329:1;46321:6;46317:14;46310:58;46402:8;46397:2;46389:6;46385:15;46378:33;46193:225;:::o;46424:178::-;46564:30;46560:1;46552:6;46548:14;46541:54;46424:178;:::o;46608:225::-;46748:34;46744:1;46736:6;46732:14;46725:58;46817:8;46812:2;46804:6;46800:15;46793:33;46608:225;:::o;46839:223::-;46979:34;46975:1;46967:6;46963:14;46956:58;47048:6;47043:2;47035:6;47031:15;47024:31;46839:223;:::o;47068:175::-;47208:27;47204:1;47196:6;47192:14;47185:51;47068:175;:::o;47249:181::-;47389:33;47385:1;47377:6;47373:14;47366:57;47249:181;:::o;47436:159::-;47576:11;47572:1;47564:6;47560:14;47553:35;47436:159;:::o;47601:231::-;47741:34;47737:1;47729:6;47725:14;47718:58;47810:14;47805:2;47797:6;47793:15;47786:39;47601:231;:::o;47838:243::-;47978:34;47974:1;47966:6;47962:14;47955:58;48047:26;48042:2;48034:6;48030:15;48023:51;47838:243;:::o;48087:229::-;48227:34;48223:1;48215:6;48211:14;48204:58;48296:12;48291:2;48283:6;48279:15;48272:37;48087:229;:::o;48322:228::-;48462:34;48458:1;48450:6;48446:14;48439:58;48531:11;48526:2;48518:6;48514:15;48507:36;48322:228;:::o;48556:182::-;48696:34;48692:1;48684:6;48680:14;48673:58;48556:182;:::o;48744:231::-;48884:34;48880:1;48872:6;48868:14;48861:58;48953:14;48948:2;48940:6;48936:15;48929:39;48744:231;:::o;48981:182::-;49121:34;49117:1;49109:6;49105:14;49098:58;48981:182;:::o;49169:228::-;49309:34;49305:1;49297:6;49293:14;49286:58;49378:11;49373:2;49365:6;49361:15;49354:36;49169:228;:::o;49403:234::-;49543:34;49539:1;49531:6;49527:14;49520:58;49612:17;49607:2;49599:6;49595:15;49588:42;49403:234;:::o;49643:220::-;49783:34;49779:1;49771:6;49767:14;49760:58;49852:3;49847:2;49839:6;49835:15;49828:28;49643:220;:::o;49869:164::-;50009:16;50005:1;49997:6;49993:14;49986:40;49869:164;:::o;50039:114::-;;:::o;50159:166::-;50299:18;50295:1;50287:6;50283:14;50276:42;50159:166;:::o;50331:236::-;50471:34;50467:1;50459:6;50455:14;50448:58;50540:19;50535:2;50527:6;50523:15;50516:44;50331:236;:::o;50573:231::-;50713:34;50709:1;50701:6;50697:14;50690:58;50782:14;50777:2;50769:6;50765:15;50758:39;50573:231;:::o;50810:163::-;50950:15;50946:1;50938:6;50934:14;50927:39;50810:163;:::o;50979:235::-;51119:34;51115:1;51107:6;51103:14;51096:58;51188:18;51183:2;51175:6;51171:15;51164:43;50979:235;:::o;51220:158::-;51360:10;51356:1;51348:6;51344:14;51337:34;51220:158;:::o;51384:122::-;51457:24;51475:5;51457:24;:::i;:::-;51450:5;51447:35;51437:63;;51496:1;51493;51486:12;51437:63;51384:122;:::o;51512:116::-;51582:21;51597:5;51582:21;:::i;:::-;51575:5;51572:32;51562:60;;51618:1;51615;51608:12;51562:60;51512:116;:::o;51634:122::-;51707:24;51725:5;51707:24;:::i;:::-;51700:5;51697:35;51687:63;;51746:1;51743;51736:12;51687:63;51634:122;:::o;51762:120::-;51834:23;51851:5;51834:23;:::i;:::-;51827:5;51824:34;51814:62;;51872:1;51869;51862:12;51814:62;51762:120;:::o;51888:122::-;51961:24;51979:5;51961:24;:::i;:::-;51954:5;51951:35;51941:63;;52000:1;51997;51990:12;51941:63;51888:122;:::o;52016:118::-;52087:22;52103:5;52087:22;:::i;:::-;52080:5;52077:33;52067:61;;52124:1;52121;52114:12;52067:61;52016:118;:::o

Swarm Source

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