ETH Price: $3,416.27 (-1.59%)
Gas: 10 Gwei

Token

zero to infinity (ZR_X)
 

Overview

Max Total Supply

2,048 ZR_X

Holders

549

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ZR_X
0x9fc1F3447082561B959bcb450aC4b36001FDD6dF
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:
ZRXNft

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-10-14
*/

/**
 *Submitted for verification at Etherscan.io on 2021-09-07
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
*/

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






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

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 subtraction 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;
        }
    }
}


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

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

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

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

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




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

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









/**
 * @dev 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 {
        _setOwner(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);
    }
}





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














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







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

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

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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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









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


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
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 {}
}







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


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


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}


contract ZRXNft is ERC721Enumerable, EIP712 , ReentrancyGuard, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public mintPrice = 4800000 gwei;
    bool public isPreSale;
    bool public isPublicSale;
    uint256 curTokenID = 1;
    uint256 maxTokenID = 2048;

    string ipfsAddr1 = "";
    string ipfsAddr2 = "";
    address payable public vaultAddress1;
    address payable public vaultAddress2;
    bool isBlindBox = true;

    struct AccountParam {
        bool inWhiteList;
        uint256 claimCnt;
        uint256[] tokenList;
    }
    mapping(address => AccountParam) mapAccount;
	

    // mint signer
    struct MintVoucher {
        address signer;
        address minter;
        uint256 expiration;
        bytes signature;
    }
    bytes32 internal constant MINTVOUCHER_HASH = keccak256("MintVoucher(address signer,address minter,uint256 expiration)");
    address[] public signers;


    constructor() ERC721("zero to infinity", "ZR_X") EIP712("ZR_X", "1") Ownable() payable {
        vaultAddress1 = payable(msg.sender);
        vaultAddress2 = payable(msg.sender);
    }

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        require(_exists(_tokenId), "tokenURI: URI query for nonexistent token");
        
        string memory _tokenIdStr = Strings.toString(_tokenId);
        if(isBlindBox == true){
            return string(abi.encodePacked(ipfsAddr1, _tokenIdStr, ".json"));
        }
        else{
             return string(abi.encodePacked(ipfsAddr2, _tokenIdStr, ".json"));
        }
    }
    
    
    function mint(MintVoucher calldata voucher) public nonReentrant payable {
        AccountParam storage _accountParam = mapAccount[msg.sender];

        require(curTokenID <= maxTokenID, "All nfts have been mined");      
        require(_accountParam.claimCnt < 2, "claim count > 2");
        require(msg.value == mintPrice,  string(abi.encodePacked("claim nft require ", Strings.toString(mintPrice), " wei")));

        bool _allowMint = false;
        if(isPublicSale)
            _allowMint = true;
        else if(isPreSale)
        {
            require(verifyVoucher(voucher) , "The voucher is invalid");
            _allowMint = true;
        }

        require(_allowMint == true, "allowMint = false");
        
        _safeMint(_msgSender(), curTokenID);
        
        ++_accountParam.claimCnt;
        _accountParam.tokenList.push(curTokenID);
        ++curTokenID;
        
    }


    function addSigner(address _address) external onlyOwner {
        bool isExist;
        (isExist ,) = _isExistSigner(_address);
        if(!isExist){
            signers.push(_address);
        }
    }

    
    function removeSigner(address _address) external onlyOwner {
        bool isExist;
        uint256 index;
        (isExist , index) = _isExistSigner(_address);
        if(isExist){
            signers[index] = signers[signers.length - 1];
            signers.pop();
        }
    }


    function _isExistSigner(address _address) internal view returns(bool , uint256) {
        bool exist;
        uint256 index; 
        for(uint256 i ; i < signers.length ; i++){
            if(signers[i] == _address){
                exist = true;
                index = i;
            }
        }
        return (exist , index);
    }

    
    function isMintVoucher(MintVoucher calldata voucher) public view returns (bool) {       
        bytes32 _hash = _hashTypedDataV4(keccak256(abi.encode(
                    MINTVOUCHER_HASH,
                    voucher.signer,
                    voucher.minter,
                    voucher.expiration
                )));

        return ECDSA.recover(_hash, voucher.signature) == voucher.signer;
    }

    
    function verifyVoucher(MintVoucher calldata voucher) public view returns (bool) {       
        require(isMintVoucher(voucher) , "Failed to verify the signature");
        bool isExist;
        (isExist , ) = _isExistSigner(voucher.signer);
        require(isExist , "The signer is invalid");
        require(msg.sender == voucher.minter , "Minter is not the current caller");
        require(voucher.expiration > block.timestamp , "The voucher has expired");
        return true;
    }



    function balanceOfContract() public view onlyOwner returns (uint) {
        return  address(this).balance;
    }
    
    function withdraw() public nonReentrant onlyOwner{
        uint256 _amount = address(this).balance;
        uint256 _div = SafeMath.div(_amount, 100);
        uint256 _amount1 =  SafeMath.mul(_div, 15);
        uint256 _amount2 = _amount - _amount1;

        (bool success1, ) = vaultAddress1.call{value: _amount1}("");
        require(success1, "Failed to send Ether to vaultAdrress1");

        (bool success2, ) = vaultAddress2.call{value: _amount2}("");
        require(success2, "Failed to send Ether to vaultAdrress2");
    }
    
    function startPreSale() public onlyOwner{
        isPreSale = true;
    }

    function pausedPreSale() public onlyOwner{
        isPreSale = false;
    }

    function startPublicSale() public onlyOwner{
        isPublicSale = true;
    }

    function pausedPublicSale() public onlyOwner{
        isPublicSale = false;
    }

    function setVaultAddress(address _vaultAddr1, address _vaultAddr2) public nonReentrant onlyOwner{
        vaultAddress1 = payable(_vaultAddr1);
        vaultAddress2 = payable(_vaultAddr2);
    }


    function setMintPrice(uint256 _mintPrice) public nonReentrant onlyOwner{
        mintPrice = _mintPrice;
    }

    function toggleDisplayMode() public onlyOwner{
        isBlindBox = !isBlindBox;
    }

    function setMetaAddress(string memory _url1, string memory _url2) public onlyOwner{
        ipfsAddr1 = _url1;
        ipfsAddr2 = _url2;
    }

    function reserve(uint _count) public onlyOwner{
        AccountParam storage _accountParam = mapAccount[msg.sender];

        for(uint _i = 0; _i < _count; ++_i)
        {
            if(curTokenID > maxTokenID){
              return;
            }
            _safeMint(_msgSender(), curTokenID);
            ++_accountParam.claimCnt;
            _accountParam.tokenList.push(curTokenID);

            ++curTokenID;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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"}],"name":"addSigner","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":[],"name":"balanceOfContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct ZRXNft.MintVoucher","name":"voucher","type":"tuple"}],"name":"isMintVoucher","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct ZRXNft.MintVoucher","name":"voucher","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","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":"pausedPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pausedPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url1","type":"string"},{"internalType":"string","name":"_url2","type":"string"}],"name":"setMetaAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddr1","type":"address"},{"internalType":"address","name":"_vaultAddr2","type":"address"}],"name":"setVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","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":"toggleDisplayMode","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultAddress1","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultAddress2","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct ZRXNft.MintVoucher","name":"voucher","type":"tuple"}],"name":"verifyVoucher","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61014060405266110d9316ec0000600c556001600e55610800600f5560405180602001604052806000815250601090805190602001906200004292919062000401565b5060405180602001604052806000815250601190805190602001906200006a92919062000401565b506001601360146101000a81548160ff0219169083151502179055506040518060400160405280600481526020017f5a525f58000000000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280601081526020017f7a65726f20746f20696e66696e697479000000000000000000000000000000008152506040518060400160405280600481526020017f5a525f580000000000000000000000000000000000000000000000000000000081525081600090805190602001906200017692919062000401565b5080600190805190602001906200018f92919062000401565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001fb818484620002f760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080610120818152505050505050506001600a819055506200026f620002636200033360201b60201c565b6200033b60201b60201c565b33601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620005ee565b6000838383463060405160200162000314959493929190620004e4565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200040f9062000589565b90600052602060002090601f0160209004810192826200043357600085556200047f565b82601f106200044e57805160ff19168380011785556200047f565b828001600101855582156200047f579182015b828111156200047e57825182559160200191906001019062000461565b5b5090506200048e919062000492565b5090565b5b80821115620004ad57600081600090555060010162000493565b5090565b620004bc8162000541565b82525050565b620004cd8162000555565b82525050565b620004de816200057f565b82525050565b600060a082019050620004fb6000830188620004c2565b6200050a6020830187620004c2565b620005196040830186620004c2565b620005286060830185620004d3565b620005376080830184620004b1565b9695505050505050565b60006200054e826200055f565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620005a257607f821691505b60208210811415620005b957620005b8620005bf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160601c60e0516101005161012051615ef86200064160003960006131c701526000613209015260006131e80152600061311d015260006131730152600061319c0152615ef86000f3fe6080604052600436106102465760003560e01c806367f3c60411610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610821578063e6c7c4561461085e578063e985e9c514610889578063eb12d61e146108c6578063f2fde38b146108ef578063f4a0a5281461091857610246565b8063a22cb46514610762578063a5a865dc1461078b578063a67bdcff146107b6578063b88d4fde146107cd578063c11bb088146107f657610246565b8063819b25ba116100fd578063819b25ba1461068a5780638da5cb5b146106b35780638eb4fc59146106de57806395d89b411461071b5780639c8b34ca1461074657610246565b806367f3c604146105cb5780636817c76c146105e257806370a082311461060d578063715018a61461064a57806378f16d971461066157610246565b8063216e85a2116101c75780634ced47341161018b5780634ced4734146104e45780634f6ccce71461050f57806355dd574c1461054c5780636352211e14610563578063650db04e146105a057610246565b8063216e85a21461040157806323b872dd1461043e5780632f745c59146104675780633ccfd60b146104a457806342842e0e146104bb57610246565b80630e316ab71161020e5780630e316ab71461033057806318160ddd1461035957806318fb56a5146103845780632079fb9a146103ad57806320f6ea9f146103ea57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630c1c972a14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190614194565b610941565b60405161027f9190614acb565b60405180910390f35b34801561029457600080fd5b5061029d6109bb565b6040516102aa9190614bc3565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906142af565b610a4d565b6040516102e79190614a49565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190614154565b610ad2565b005b34801561032557600080fd5b5061032e610bea565b005b34801561033c57600080fd5b5061035760048036038101906103529190613fd1565b610c83565b005b34801561036557600080fd5b5061036e610e12565b60405161037b9190615005565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613ffe565b610e1f565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906142af565b610f77565b6040516103e19190614a49565b60405180910390f35b3480156103f657600080fd5b506103ff610fb6565b005b34801561040d57600080fd5b5061042860048036038101906104239190614266565b61105e565b6040516104359190614acb565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061403e565b611184565b005b34801561047357600080fd5b5061048e60048036038101906104899190614154565b6111e4565b60405161049b9190615005565b60405180910390f35b3480156104b057600080fd5b506104b9611289565b005b3480156104c757600080fd5b506104e260048036038101906104dd919061403e565b611532565b005b3480156104f057600080fd5b506104f9611552565b6040516105069190614acb565b60405180910390f35b34801561051b57600080fd5b50610536600480360381019061053191906142af565b611565565b6040516105439190615005565b60405180910390f35b34801561055857600080fd5b506105616115d6565b005b34801561056f57600080fd5b5061058a600480360381019061058591906142af565b61166f565b6040516105979190614a49565b60405180910390f35b3480156105ac57600080fd5b506105b5611721565b6040516105c29190614a64565b60405180910390f35b3480156105d757600080fd5b506105e0611747565b005b3480156105ee57600080fd5b506105f76117e0565b6040516106049190615005565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613fd1565b6117e6565b6040516106419190615005565b60405180910390f35b34801561065657600080fd5b5061065f61189e565b005b34801561066d57600080fd5b50610688600480360381019061068391906141ee565b611926565b005b34801561069657600080fd5b506106b160048036038101906106ac91906142af565b6119d4565b005b3480156106bf57600080fd5b506106c8611b36565b6040516106d59190614a49565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190614266565b611b60565b6040516107129190614acb565b60405180910390f35b34801561072757600080fd5b50610730611cdc565b60405161073d9190614bc3565b60405180910390f35b610760600480360381019061075b9190614266565b611d6e565b005b34801561076e57600080fd5b5061078960048036038101906107849190614114565b612043565b005b34801561079757600080fd5b506107a06121c4565b6040516107ad9190614acb565b60405180910390f35b3480156107c257600080fd5b506107cb6121d7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190614091565b612270565b005b34801561080257600080fd5b5061080b6122d2565b6040516108189190614a64565b60405180910390f35b34801561082d57600080fd5b50610848600480360381019061084391906142af565b6122f8565b6040516108559190614bc3565b60405180910390f35b34801561086a57600080fd5b506108736123c2565b6040516108809190615005565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613ffe565b612446565b6040516108bd9190614acb565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613fd1565b6124da565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613fd1565b6125d3565b005b34801561092457600080fd5b5061093f600480360381019061093a91906142af565b6126cb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b457506109b3826127a7565b5b9050919050565b6060600080546109ca90615361565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690615361565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b6000610a5882612889565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90614ea5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610add8261166f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590614f45565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6d6128f5565b73ffffffffffffffffffffffffffffffffffffffff161480610b9c5750610b9b81610b966128f5565b612446565b5b610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290614dc5565b60405180910390fd5b610be583836128fd565b505050565b610bf26128f5565b73ffffffffffffffffffffffffffffffffffffffff16610c10611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90614ec5565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b610c8b6128f5565b73ffffffffffffffffffffffffffffffffffffffff16610ca9611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690614ec5565b60405180910390fd5b600080610d0b836129b6565b80925081935050508115610e0d5760156001601580549050610d2d919061524e565b81548110610d3e57610d3d615533565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660158281548110610d7d57610d7c615533565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506015805480610dd757610dd6615504565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050565b6000600880549050905090565b6002600a541415610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90614fc5565b60405180910390fd5b6002600a81905550610e756128f5565b73ffffffffffffffffffffffffffffffffffffffff16610e93611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614ec5565b60405180910390fd5b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a819055505050565b60158181548110610f8757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fbe6128f5565b73ffffffffffffffffffffffffffffffffffffffff16610fdc611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990614ec5565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b6000806110de7f031dc70f5666f65948db5ef4a2cbdeb11f1012222b71a76df156aff88713026f8460000160208101906110989190613fd1565b8560200160208101906110ab9190613fd1565b86604001356040516020016110c39493929190614ae6565b60405160208183030381529060405280519060200120612a67565b90508260000160208101906110f39190613fd1565b73ffffffffffffffffffffffffffffffffffffffff166111658285806060019061111d9190615020565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a81565b73ffffffffffffffffffffffffffffffffffffffff1614915050919050565b61119561118f6128f5565b82612aa8565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90614f65565b60405180910390fd5b6111df838383612b86565b505050565b60006111ef836117e6565b8210611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790614c45565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614fc5565b60405180910390fd5b6002600a819055506112df6128f5565b73ffffffffffffffffffffffffffffffffffffffff166112fd611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614ec5565b60405180910390fd5b60004790506000611365826064612de2565b9050600061137482600f612df8565b905060008184611384919061524e565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516113ce90614a34565b60006040518083038185875af1925050503d806000811461140b576040519150601f19603f3d011682016040523d82523d6000602084013e611410565b606091505b5050905080611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b90614e25565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161149c90614a34565b60006040518083038185875af1925050503d80600081146114d9576040519150601f19603f3d011682016040523d82523d6000602084013e6114de565b606091505b5050905080611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990614c05565b60405180910390fd5b5050505050506001600a81905550565b61154d83838360405180602001604052806000815250612270565b505050565b600d60009054906101000a900460ff1681565b600061156f610e12565b82106115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a790614fa5565b60405180910390fd5b600882815481106115c4576115c3615533565b5b90600052602060002001549050919050565b6115de6128f5565b73ffffffffffffffffffffffffffffffffffffffff166115fc611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990614ec5565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90614e05565b60405180910390fd5b80915050919050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61174f6128f5565b73ffffffffffffffffffffffffffffffffffffffff1661176d611b36565b73ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90614ec5565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90614de5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118a66128f5565b73ffffffffffffffffffffffffffffffffffffffff166118c4611b36565b73ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190614ec5565b60405180910390fd5b6119246000612e0e565b565b61192e6128f5565b73ffffffffffffffffffffffffffffffffffffffff1661194c611b36565b73ffffffffffffffffffffffffffffffffffffffff16146119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614ec5565b60405180910390fd5b81601090805190602001906119b8929190613dc6565b5080601190805190602001906119cf929190613dc6565b505050565b6119dc6128f5565b73ffffffffffffffffffffffffffffffffffffffff166119fa611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4790614ec5565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b82811015611b3057600f54600e541115611ab1575050611b33565b611ac4611abc6128f5565b600e54612ed4565b8160010160008154611ad5906153c4565b9190508190555081600201600e549080600181540180825580915050600190039060005260206000200160009091909190915055600e60008154611b18906153c4565b9190508190555080611b29906153c4565b9050611a96565b50505b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611b6b8261105e565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190614d85565b60405180910390fd5b6000611bc7836000016020810190611bc29190613fd1565b6129b6565b508091505080611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390614f85565b60405180910390fd5b826020016020810190611c1f9190613fd1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8390614da5565b60405180910390fd5b42836040013511611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990614f05565b60405180910390fd5b6001915050919050565b606060018054611ceb90615361565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1790615361565b8015611d645780601f10611d3957610100808354040283529160200191611d64565b820191906000526020600020905b815481529060010190602001808311611d4757829003601f168201915b5050505050905090565b6002600a541415611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90614fc5565b60405180910390fd5b6002600a819055506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600f54600e541115611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d90614f25565b60405180910390fd5b6002816001015410611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490614ca5565b60405180910390fd5b600c543414611e9d600c54612ef2565b604051602001611ead91906149d0565b60405160208183030381529060405290611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef49190614bc3565b60405180910390fd5b506000600d60019054906101000a900460ff1615611f1e5760019050611f81565b600d60009054906101000a900460ff1615611f8057611f3c83611b60565b611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614fe5565b60405180910390fd5b600190505b5b6001151581151514611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90614d65565b60405180910390fd5b611fdb611fd36128f5565b600e54612ed4565b8160010160008154611fec906153c4565b9190508190555081600201600e549080600181540180825580915050600190039060005260206000200160009091909190915055600e6000815461202f906153c4565b9190508190555050506001600a8190555050565b61204b6128f5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614d05565b60405180910390fd5b80600560006120c66128f5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121736128f5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b89190614acb565b60405180910390a35050565b600d60019054906101000a900460ff1681565b6121df6128f5565b73ffffffffffffffffffffffffffffffffffffffff166121fd611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90614ec5565b60405180910390fd5b6000600d60016101000a81548160ff021916908315150217905550565b61228161227b6128f5565b83612aa8565b6122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614f65565b60405180910390fd5b6122cc84848484613053565b50505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061230382612889565b612342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233990614e85565b60405180910390fd5b600061234d83612ef2565b905060011515601360149054906101000a900460ff16151514156123965760108160405160200161237f9291906149a1565b6040516020818303038152906040529150506123bd565b6011816040516020016123aa9291906149a1565b6040516020818303038152906040529150505b919050565b60006123cc6128f5565b73ffffffffffffffffffffffffffffffffffffffff166123ea611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243790614ec5565b60405180910390fd5b47905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124e26128f5565b73ffffffffffffffffffffffffffffffffffffffff16612500611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254d90614ec5565b60405180910390fd5b6000612561826129b6565b5080915050806125cf576015829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b6125db6128f5565b73ffffffffffffffffffffffffffffffffffffffff166125f9611b36565b73ffffffffffffffffffffffffffffffffffffffff161461264f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264690614ec5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b690614c85565b60405180910390fd5b6126c881612e0e565b50565b6002600a541415612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890614fc5565b60405180910390fd5b6002600a819055506127216128f5565b73ffffffffffffffffffffffffffffffffffffffff1661273f611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c90614ec5565b60405180910390fd5b80600c819055506001600a8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061287257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128825750612881826130af565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129708361166f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060008060005b601580549050811015612a59578573ffffffffffffffffffffffffffffffffffffffff16601582815481106129f7576129f6615533565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a4657600192508091505b8080612a51906153c4565b9150506129bf565b508181935093505050915091565b6000612a7a612a74613119565b83613233565b9050919050565b6000806000612a908585613266565b91509150612a9d816132b8565b819250505092915050565b6000612ab382612889565b612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae990614d45565b60405180910390fd5b6000612afd8361166f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b6c57508373ffffffffffffffffffffffffffffffffffffffff16612b5484610a4d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b7d5750612b7c8185612446565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ba68261166f565b73ffffffffffffffffffffffffffffffffffffffff1614612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390614ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6390614ce5565b60405180910390fd5b612c7783838361348d565b612c826000826128fd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cd2919061524e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d29919061516d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612df091906151c3565b905092915050565b60008183612e0691906151f4565b905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612eee8282604051806020016040528060008152506135a1565b5050565b60606000821415612f3a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061304e565b600082905060005b60008214612f6c578080612f55906153c4565b915050600a82612f6591906151c3565b9150612f42565b60008167ffffffffffffffff811115612f8857612f87615562565b5b6040519080825280601f01601f191660200182016040528015612fba5781602001600182028036833780820191505090505b5090505b6000851461304757600182612fd3919061524e565b9150600a85612fe29190615417565b6030612fee919061516d565b60f81b81838151811061300457613003615533565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304091906151c3565b9450612fbe565b8093505050505b919050565b61305e848484612b86565b61306a848484846135fc565b6130a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a090614c65565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561319557507f000000000000000000000000000000000000000000000000000000000000000046145b156131c2577f00000000000000000000000000000000000000000000000000000000000000009050613230565b61322d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613793565b90505b90565b600082826040516020016132489291906149fd565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156132a85760008060006020860151925060408601519150606086015160001a905061329c878285856137cd565b945094505050506132b1565b60006002915091505b9250929050565b600060048111156132cc576132cb6154a6565b5b8160048111156132df576132de6154a6565b5b14156132ea5761348a565b600160048111156132fe576132fd6154a6565b5b816004811115613311576133106154a6565b5b1415613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334990614be5565b60405180910390fd5b60026004811115613366576133656154a6565b5b816004811115613379576133786154a6565b5b14156133ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b190614c25565b60405180910390fd5b600360048111156133ce576133cd6154a6565b5b8160048111156133e1576133e06154a6565b5b1415613422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341990614d25565b60405180910390fd5b600480811115613435576134346154a6565b5b816004811115613448576134476154a6565b5b1415613489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348090614e45565b60405180910390fd5b5b50565b6134988383836138da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134db576134d6816138df565b61351a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613519576135188382613928565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561355d5761355881613a95565b61359c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461359b5761359a8282613b66565b5b5b505050565b6135ab8383613be5565b6135b860008484846135fc565b6135f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ee90614c65565b60405180910390fd5b505050565b600061361d8473ffffffffffffffffffffffffffffffffffffffff16613db3565b15613786578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136466128f5565b8786866040518563ffffffff1660e01b81526004016136689493929190614a7f565b602060405180830381600087803b15801561368257600080fd5b505af19250505080156136b357506040513d601f19601f820116820180604052508101906136b091906141c1565b60015b613736573d80600081146136e3576040519150601f19603f3d011682016040523d82523d6000602084013e6136e8565b606091505b5060008151141561372e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372590614c65565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061378b565b600190505b949350505050565b600083838346306040516020016137ae959493929190614b2b565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156138085760006003915091506138d1565b601b8560ff16141580156138205750601c8560ff1614155b156138325760006004915091506138d1565b6000600187878787604051600081526020016040526040516138579493929190614b7e565b6020604051602081039080840390855afa158015613879573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156138c8576000600192509250506138d1565b80600092509250505b94509492505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613935846117e6565b61393f919061524e565b9050600060076000848152602001908152602001600020549050818114613a24576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613aa9919061524e565b9050600060096000848152602001908152602001600020549050600060088381548110613ad957613ad8615533565b5b906000526020600020015490508060088381548110613afb57613afa615533565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b4a57613b49615504565b5b6001900381819060005260206000200160009055905550505050565b6000613b71836117e6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c4c90614e65565b60405180910390fd5b613c5e81612889565b15613c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9590614cc5565b60405180910390fd5b613caa6000838361348d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cfa919061516d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613dd290615361565b90600052602060002090601f016020900481019282613df45760008555613e3b565b82601f10613e0d57805160ff1916838001178555613e3b565b82800160010185558215613e3b579182015b82811115613e3a578251825591602001919060010190613e1f565b5b509050613e489190613e4c565b5090565b5b80821115613e65576000816000905550600101613e4d565b5090565b6000613e7c613e77846150a8565b615083565b905082815260208101848484011115613e9857613e976155aa565b5b613ea384828561531f565b509392505050565b6000613ebe613eb9846150d9565b615083565b905082815260208101848484011115613eda57613ed96155aa565b5b613ee584828561531f565b509392505050565b600081359050613efc81615e66565b92915050565b600081359050613f1181615e7d565b92915050565b600081359050613f2681615e94565b92915050565b600081519050613f3b81615e94565b92915050565b600082601f830112613f5657613f55615591565b5b8135613f66848260208601613e69565b91505092915050565b600082601f830112613f8457613f83615591565b5b8135613f94848260208601613eab565b91505092915050565b600060808284031215613fb357613fb261559b565b5b81905092915050565b600081359050613fcb81615eab565b92915050565b600060208284031215613fe757613fe66155b4565b5b6000613ff584828501613eed565b91505092915050565b60008060408385031215614015576140146155b4565b5b600061402385828601613eed565b925050602061403485828601613eed565b9150509250929050565b600080600060608486031215614057576140566155b4565b5b600061406586828701613eed565b935050602061407686828701613eed565b925050604061408786828701613fbc565b9150509250925092565b600080600080608085870312156140ab576140aa6155b4565b5b60006140b987828801613eed565b94505060206140ca87828801613eed565b93505060406140db87828801613fbc565b925050606085013567ffffffffffffffff8111156140fc576140fb6155af565b5b61410887828801613f41565b91505092959194509250565b6000806040838503121561412b5761412a6155b4565b5b600061413985828601613eed565b925050602061414a85828601613f02565b9150509250929050565b6000806040838503121561416b5761416a6155b4565b5b600061417985828601613eed565b925050602061418a85828601613fbc565b9150509250929050565b6000602082840312156141aa576141a96155b4565b5b60006141b884828501613f17565b91505092915050565b6000602082840312156141d7576141d66155b4565b5b60006141e584828501613f2c565b91505092915050565b60008060408385031215614205576142046155b4565b5b600083013567ffffffffffffffff811115614223576142226155af565b5b61422f85828601613f6f565b925050602083013567ffffffffffffffff8111156142505761424f6155af565b5b61425c85828601613f6f565b9150509250929050565b60006020828403121561427c5761427b6155b4565b5b600082013567ffffffffffffffff81111561429a576142996155af565b5b6142a684828501613f9d565b91505092915050565b6000602082840312156142c5576142c46155b4565b5b60006142d384828501613fbc565b91505092915050565b6142e581615294565b82525050565b6142f481615282565b82525050565b614303816152a6565b82525050565b614312816152b2565b82525050565b614329614324826152b2565b61540d565b82525050565b600061433a8261511f565b6143448185615135565b935061435481856020860161532e565b61435d816155b9565b840191505092915050565b60006143738261512a565b61437d8185615151565b935061438d81856020860161532e565b614396816155b9565b840191505092915050565b60006143ac8261512a565b6143b68185615162565b93506143c681856020860161532e565b80840191505092915050565b600081546143df81615361565b6143e98186615162565b94506001821660008114614404576001811461441557614448565b60ff19831686528186019350614448565b61441e8561510a565b60005b8381101561444057815481890152600182019150602081019050614421565b838801955050505b50505092915050565b600061445e601883615151565b9150614469826155ca565b602082019050919050565b6000614481602583615151565b915061448c826155f3565b604082019050919050565b60006144a4601283615162565b91506144af82615642565b601282019050919050565b60006144c7601f83615151565b91506144d28261566b565b602082019050919050565b60006144ea602b83615151565b91506144f582615694565b604082019050919050565b600061450d603283615151565b9150614518826156e3565b604082019050919050565b6000614530602683615151565b915061453b82615732565b604082019050919050565b6000614553600f83615151565b915061455e82615781565b602082019050919050565b6000614576601c83615151565b9150614581826157aa565b602082019050919050565b6000614599600283615162565b91506145a4826157d3565b600282019050919050565b60006145bc602483615151565b91506145c7826157fc565b604082019050919050565b60006145df601983615151565b91506145ea8261584b565b602082019050919050565b6000614602602283615151565b915061460d82615874565b604082019050919050565b6000614625602c83615151565b9150614630826158c3565b604082019050919050565b6000614648601183615151565b915061465382615912565b602082019050919050565b600061466b601e83615151565b91506146768261593b565b602082019050919050565b600061468e602083615151565b915061469982615964565b602082019050919050565b60006146b1600483615162565b91506146bc8261598d565b600482019050919050565b60006146d4603883615151565b91506146df826159b6565b604082019050919050565b60006146f7602a83615151565b915061470282615a05565b604082019050919050565b600061471a602983615151565b915061472582615a54565b604082019050919050565b600061473d602583615151565b915061474882615aa3565b604082019050919050565b6000614760602283615151565b915061476b82615af2565b604082019050919050565b6000614783602083615151565b915061478e82615b41565b602082019050919050565b60006147a6602983615151565b91506147b182615b6a565b604082019050919050565b60006147c9602c83615151565b91506147d482615bb9565b604082019050919050565b60006147ec600583615162565b91506147f782615c08565b600582019050919050565b600061480f602083615151565b915061481a82615c31565b602082019050919050565b6000614832602983615151565b915061483d82615c5a565b604082019050919050565b6000614855601783615151565b915061486082615ca9565b602082019050919050565b6000614878601883615151565b915061488382615cd2565b602082019050919050565b600061489b602183615151565b91506148a682615cfb565b604082019050919050565b60006148be600083615146565b91506148c982615d4a565b600082019050919050565b60006148e1603183615151565b91506148ec82615d4d565b604082019050919050565b6000614904601583615151565b915061490f82615d9c565b602082019050919050565b6000614927602c83615151565b915061493282615dc5565b604082019050919050565b600061494a601f83615151565b915061495582615e14565b602082019050919050565b600061496d601683615151565b915061497882615e3d565b602082019050919050565b61498c81615308565b82525050565b61499b81615312565b82525050565b60006149ad82856143d2565b91506149b982846143a1565b91506149c4826147df565b91508190509392505050565b60006149db82614497565b91506149e782846143a1565b91506149f2826146a4565b915081905092915050565b6000614a088261458c565b9150614a148285614318565b602082019150614a248284614318565b6020820191508190509392505050565b6000614a3f826148b1565b9150819050919050565b6000602082019050614a5e60008301846142eb565b92915050565b6000602082019050614a7960008301846142dc565b92915050565b6000608082019050614a9460008301876142eb565b614aa160208301866142eb565b614aae6040830185614983565b8181036060830152614ac0818461432f565b905095945050505050565b6000602082019050614ae060008301846142fa565b92915050565b6000608082019050614afb6000830187614309565b614b0860208301866142eb565b614b1560408301856142eb565b614b226060830184614983565b95945050505050565b600060a082019050614b406000830188614309565b614b4d6020830187614309565b614b5a6040830186614309565b614b676060830185614983565b614b7460808301846142eb565b9695505050505050565b6000608082019050614b936000830187614309565b614ba06020830186614992565b614bad6040830185614309565b614bba6060830184614309565b95945050505050565b60006020820190508181036000830152614bdd8184614368565b905092915050565b60006020820190508181036000830152614bfe81614451565b9050919050565b60006020820190508181036000830152614c1e81614474565b9050919050565b60006020820190508181036000830152614c3e816144ba565b9050919050565b60006020820190508181036000830152614c5e816144dd565b9050919050565b60006020820190508181036000830152614c7e81614500565b9050919050565b60006020820190508181036000830152614c9e81614523565b9050919050565b60006020820190508181036000830152614cbe81614546565b9050919050565b60006020820190508181036000830152614cde81614569565b9050919050565b60006020820190508181036000830152614cfe816145af565b9050919050565b60006020820190508181036000830152614d1e816145d2565b9050919050565b60006020820190508181036000830152614d3e816145f5565b9050919050565b60006020820190508181036000830152614d5e81614618565b9050919050565b60006020820190508181036000830152614d7e8161463b565b9050919050565b60006020820190508181036000830152614d9e8161465e565b9050919050565b60006020820190508181036000830152614dbe81614681565b9050919050565b60006020820190508181036000830152614dde816146c7565b9050919050565b60006020820190508181036000830152614dfe816146ea565b9050919050565b60006020820190508181036000830152614e1e8161470d565b9050919050565b60006020820190508181036000830152614e3e81614730565b9050919050565b60006020820190508181036000830152614e5e81614753565b9050919050565b60006020820190508181036000830152614e7e81614776565b9050919050565b60006020820190508181036000830152614e9e81614799565b9050919050565b60006020820190508181036000830152614ebe816147bc565b9050919050565b60006020820190508181036000830152614ede81614802565b9050919050565b60006020820190508181036000830152614efe81614825565b9050919050565b60006020820190508181036000830152614f1e81614848565b9050919050565b60006020820190508181036000830152614f3e8161486b565b9050919050565b60006020820190508181036000830152614f5e8161488e565b9050919050565b60006020820190508181036000830152614f7e816148d4565b9050919050565b60006020820190508181036000830152614f9e816148f7565b9050919050565b60006020820190508181036000830152614fbe8161491a565b9050919050565b60006020820190508181036000830152614fde8161493d565b9050919050565b60006020820190508181036000830152614ffe81614960565b9050919050565b600060208201905061501a6000830184614983565b92915050565b6000808335600160200384360303811261503d5761503c6155a0565b5b80840192508235915067ffffffffffffffff82111561505f5761505e615596565b5b60208301925060018202360383131561507b5761507a6155a5565b5b509250929050565b600061508d61509e565b90506150998282615393565b919050565b6000604051905090565b600067ffffffffffffffff8211156150c3576150c2615562565b5b6150cc826155b9565b9050602081019050919050565b600067ffffffffffffffff8211156150f4576150f3615562565b5b6150fd826155b9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061517882615308565b915061518383615308565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151b8576151b7615448565b5b828201905092915050565b60006151ce82615308565b91506151d983615308565b9250826151e9576151e8615477565b5b828204905092915050565b60006151ff82615308565b915061520a83615308565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561524357615242615448565b5b828202905092915050565b600061525982615308565b915061526483615308565b92508282101561527757615276615448565b5b828203905092915050565b600061528d826152e8565b9050919050565b600061529f826152e8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561534c578082015181840152602081019050615331565b8381111561535b576000848401525b50505050565b6000600282049050600182168061537957607f821691505b6020821081141561538d5761538c6154d5565b5b50919050565b61539c826155b9565b810181811067ffffffffffffffff821117156153bb576153ba615562565b5b80604052505050565b60006153cf82615308565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561540257615401615448565b5b600182019050919050565b6000819050919050565b600061542282615308565b915061542d83615308565b92508261543d5761543c615477565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4661696c656420746f2073656e6420457468657220746f207661756c7441647260008201527f7265737332000000000000000000000000000000000000000000000000000000602082015250565b7f636c61696d206e66742072657175697265200000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f636c61696d20636f756e74203e20320000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f616c6c6f774d696e74203d2066616c7365000000000000000000000000000000600082015250565b7f4661696c656420746f2076657269667920746865207369676e61747572650000600082015250565b7f4d696e746572206973206e6f74207468652063757272656e742063616c6c6572600082015250565b7f2077656900000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e6420457468657220746f207661756c7441647260008201527f7265737331000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f746f6b656e5552493a2055524920717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f54686520766f7563686572206861732065787069726564000000000000000000600082015250565b7f416c6c206e6674732068617665206265656e206d696e65640000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865207369676e657220697320696e76616c69640000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f54686520766f756368657220697320696e76616c696400000000000000000000600082015250565b615e6f81615282565b8114615e7a57600080fd5b50565b615e86816152a6565b8114615e9157600080fd5b50565b615e9d816152bc565b8114615ea857600080fd5b50565b615eb481615308565b8114615ebf57600080fd5b5056fea264697066735822122099f7cc0e1f8b3801353e87c872ac165a0c03ec96f6b6393618ab68a339534bbc64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102465760003560e01c806367f3c60411610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610821578063e6c7c4561461085e578063e985e9c514610889578063eb12d61e146108c6578063f2fde38b146108ef578063f4a0a5281461091857610246565b8063a22cb46514610762578063a5a865dc1461078b578063a67bdcff146107b6578063b88d4fde146107cd578063c11bb088146107f657610246565b8063819b25ba116100fd578063819b25ba1461068a5780638da5cb5b146106b35780638eb4fc59146106de57806395d89b411461071b5780639c8b34ca1461074657610246565b806367f3c604146105cb5780636817c76c146105e257806370a082311461060d578063715018a61461064a57806378f16d971461066157610246565b8063216e85a2116101c75780634ced47341161018b5780634ced4734146104e45780634f6ccce71461050f57806355dd574c1461054c5780636352211e14610563578063650db04e146105a057610246565b8063216e85a21461040157806323b872dd1461043e5780632f745c59146104675780633ccfd60b146104a457806342842e0e146104bb57610246565b80630e316ab71161020e5780630e316ab71461033057806318160ddd1461035957806318fb56a5146103845780632079fb9a146103ad57806320f6ea9f146103ea57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630c1c972a14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190614194565b610941565b60405161027f9190614acb565b60405180910390f35b34801561029457600080fd5b5061029d6109bb565b6040516102aa9190614bc3565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906142af565b610a4d565b6040516102e79190614a49565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190614154565b610ad2565b005b34801561032557600080fd5b5061032e610bea565b005b34801561033c57600080fd5b5061035760048036038101906103529190613fd1565b610c83565b005b34801561036557600080fd5b5061036e610e12565b60405161037b9190615005565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613ffe565b610e1f565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906142af565b610f77565b6040516103e19190614a49565b60405180910390f35b3480156103f657600080fd5b506103ff610fb6565b005b34801561040d57600080fd5b5061042860048036038101906104239190614266565b61105e565b6040516104359190614acb565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061403e565b611184565b005b34801561047357600080fd5b5061048e60048036038101906104899190614154565b6111e4565b60405161049b9190615005565b60405180910390f35b3480156104b057600080fd5b506104b9611289565b005b3480156104c757600080fd5b506104e260048036038101906104dd919061403e565b611532565b005b3480156104f057600080fd5b506104f9611552565b6040516105069190614acb565b60405180910390f35b34801561051b57600080fd5b50610536600480360381019061053191906142af565b611565565b6040516105439190615005565b60405180910390f35b34801561055857600080fd5b506105616115d6565b005b34801561056f57600080fd5b5061058a600480360381019061058591906142af565b61166f565b6040516105979190614a49565b60405180910390f35b3480156105ac57600080fd5b506105b5611721565b6040516105c29190614a64565b60405180910390f35b3480156105d757600080fd5b506105e0611747565b005b3480156105ee57600080fd5b506105f76117e0565b6040516106049190615005565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613fd1565b6117e6565b6040516106419190615005565b60405180910390f35b34801561065657600080fd5b5061065f61189e565b005b34801561066d57600080fd5b50610688600480360381019061068391906141ee565b611926565b005b34801561069657600080fd5b506106b160048036038101906106ac91906142af565b6119d4565b005b3480156106bf57600080fd5b506106c8611b36565b6040516106d59190614a49565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190614266565b611b60565b6040516107129190614acb565b60405180910390f35b34801561072757600080fd5b50610730611cdc565b60405161073d9190614bc3565b60405180910390f35b610760600480360381019061075b9190614266565b611d6e565b005b34801561076e57600080fd5b5061078960048036038101906107849190614114565b612043565b005b34801561079757600080fd5b506107a06121c4565b6040516107ad9190614acb565b60405180910390f35b3480156107c257600080fd5b506107cb6121d7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190614091565b612270565b005b34801561080257600080fd5b5061080b6122d2565b6040516108189190614a64565b60405180910390f35b34801561082d57600080fd5b50610848600480360381019061084391906142af565b6122f8565b6040516108559190614bc3565b60405180910390f35b34801561086a57600080fd5b506108736123c2565b6040516108809190615005565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613ffe565b612446565b6040516108bd9190614acb565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613fd1565b6124da565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613fd1565b6125d3565b005b34801561092457600080fd5b5061093f600480360381019061093a91906142af565b6126cb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b457506109b3826127a7565b5b9050919050565b6060600080546109ca90615361565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690615361565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b6000610a5882612889565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90614ea5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610add8261166f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590614f45565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6d6128f5565b73ffffffffffffffffffffffffffffffffffffffff161480610b9c5750610b9b81610b966128f5565b612446565b5b610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290614dc5565b60405180910390fd5b610be583836128fd565b505050565b610bf26128f5565b73ffffffffffffffffffffffffffffffffffffffff16610c10611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90614ec5565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b610c8b6128f5565b73ffffffffffffffffffffffffffffffffffffffff16610ca9611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690614ec5565b60405180910390fd5b600080610d0b836129b6565b80925081935050508115610e0d5760156001601580549050610d2d919061524e565b81548110610d3e57610d3d615533565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660158281548110610d7d57610d7c615533565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506015805480610dd757610dd6615504565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050565b6000600880549050905090565b6002600a541415610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90614fc5565b60405180910390fd5b6002600a81905550610e756128f5565b73ffffffffffffffffffffffffffffffffffffffff16610e93611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614ec5565b60405180910390fd5b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a819055505050565b60158181548110610f8757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fbe6128f5565b73ffffffffffffffffffffffffffffffffffffffff16610fdc611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990614ec5565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b6000806110de7f031dc70f5666f65948db5ef4a2cbdeb11f1012222b71a76df156aff88713026f8460000160208101906110989190613fd1565b8560200160208101906110ab9190613fd1565b86604001356040516020016110c39493929190614ae6565b60405160208183030381529060405280519060200120612a67565b90508260000160208101906110f39190613fd1565b73ffffffffffffffffffffffffffffffffffffffff166111658285806060019061111d9190615020565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a81565b73ffffffffffffffffffffffffffffffffffffffff1614915050919050565b61119561118f6128f5565b82612aa8565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90614f65565b60405180910390fd5b6111df838383612b86565b505050565b60006111ef836117e6565b8210611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790614c45565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614fc5565b60405180910390fd5b6002600a819055506112df6128f5565b73ffffffffffffffffffffffffffffffffffffffff166112fd611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614ec5565b60405180910390fd5b60004790506000611365826064612de2565b9050600061137482600f612df8565b905060008184611384919061524e565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516113ce90614a34565b60006040518083038185875af1925050503d806000811461140b576040519150601f19603f3d011682016040523d82523d6000602084013e611410565b606091505b5050905080611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b90614e25565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161149c90614a34565b60006040518083038185875af1925050503d80600081146114d9576040519150601f19603f3d011682016040523d82523d6000602084013e6114de565b606091505b5050905080611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990614c05565b60405180910390fd5b5050505050506001600a81905550565b61154d83838360405180602001604052806000815250612270565b505050565b600d60009054906101000a900460ff1681565b600061156f610e12565b82106115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a790614fa5565b60405180910390fd5b600882815481106115c4576115c3615533565b5b90600052602060002001549050919050565b6115de6128f5565b73ffffffffffffffffffffffffffffffffffffffff166115fc611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990614ec5565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90614e05565b60405180910390fd5b80915050919050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61174f6128f5565b73ffffffffffffffffffffffffffffffffffffffff1661176d611b36565b73ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90614ec5565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90614de5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118a66128f5565b73ffffffffffffffffffffffffffffffffffffffff166118c4611b36565b73ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190614ec5565b60405180910390fd5b6119246000612e0e565b565b61192e6128f5565b73ffffffffffffffffffffffffffffffffffffffff1661194c611b36565b73ffffffffffffffffffffffffffffffffffffffff16146119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614ec5565b60405180910390fd5b81601090805190602001906119b8929190613dc6565b5080601190805190602001906119cf929190613dc6565b505050565b6119dc6128f5565b73ffffffffffffffffffffffffffffffffffffffff166119fa611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4790614ec5565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b82811015611b3057600f54600e541115611ab1575050611b33565b611ac4611abc6128f5565b600e54612ed4565b8160010160008154611ad5906153c4565b9190508190555081600201600e549080600181540180825580915050600190039060005260206000200160009091909190915055600e60008154611b18906153c4565b9190508190555080611b29906153c4565b9050611a96565b50505b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611b6b8261105e565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190614d85565b60405180910390fd5b6000611bc7836000016020810190611bc29190613fd1565b6129b6565b508091505080611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390614f85565b60405180910390fd5b826020016020810190611c1f9190613fd1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8390614da5565b60405180910390fd5b42836040013511611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990614f05565b60405180910390fd5b6001915050919050565b606060018054611ceb90615361565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1790615361565b8015611d645780601f10611d3957610100808354040283529160200191611d64565b820191906000526020600020905b815481529060010190602001808311611d4757829003601f168201915b5050505050905090565b6002600a541415611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90614fc5565b60405180910390fd5b6002600a819055506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600f54600e541115611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d90614f25565b60405180910390fd5b6002816001015410611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490614ca5565b60405180910390fd5b600c543414611e9d600c54612ef2565b604051602001611ead91906149d0565b60405160208183030381529060405290611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef49190614bc3565b60405180910390fd5b506000600d60019054906101000a900460ff1615611f1e5760019050611f81565b600d60009054906101000a900460ff1615611f8057611f3c83611b60565b611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614fe5565b60405180910390fd5b600190505b5b6001151581151514611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90614d65565b60405180910390fd5b611fdb611fd36128f5565b600e54612ed4565b8160010160008154611fec906153c4565b9190508190555081600201600e549080600181540180825580915050600190039060005260206000200160009091909190915055600e6000815461202f906153c4565b9190508190555050506001600a8190555050565b61204b6128f5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614d05565b60405180910390fd5b80600560006120c66128f5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121736128f5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b89190614acb565b60405180910390a35050565b600d60019054906101000a900460ff1681565b6121df6128f5565b73ffffffffffffffffffffffffffffffffffffffff166121fd611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90614ec5565b60405180910390fd5b6000600d60016101000a81548160ff021916908315150217905550565b61228161227b6128f5565b83612aa8565b6122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614f65565b60405180910390fd5b6122cc84848484613053565b50505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061230382612889565b612342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233990614e85565b60405180910390fd5b600061234d83612ef2565b905060011515601360149054906101000a900460ff16151514156123965760108160405160200161237f9291906149a1565b6040516020818303038152906040529150506123bd565b6011816040516020016123aa9291906149a1565b6040516020818303038152906040529150505b919050565b60006123cc6128f5565b73ffffffffffffffffffffffffffffffffffffffff166123ea611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243790614ec5565b60405180910390fd5b47905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124e26128f5565b73ffffffffffffffffffffffffffffffffffffffff16612500611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254d90614ec5565b60405180910390fd5b6000612561826129b6565b5080915050806125cf576015829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b6125db6128f5565b73ffffffffffffffffffffffffffffffffffffffff166125f9611b36565b73ffffffffffffffffffffffffffffffffffffffff161461264f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264690614ec5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b690614c85565b60405180910390fd5b6126c881612e0e565b50565b6002600a541415612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890614fc5565b60405180910390fd5b6002600a819055506127216128f5565b73ffffffffffffffffffffffffffffffffffffffff1661273f611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c90614ec5565b60405180910390fd5b80600c819055506001600a8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061287257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128825750612881826130af565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129708361166f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060008060005b601580549050811015612a59578573ffffffffffffffffffffffffffffffffffffffff16601582815481106129f7576129f6615533565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a4657600192508091505b8080612a51906153c4565b9150506129bf565b508181935093505050915091565b6000612a7a612a74613119565b83613233565b9050919050565b6000806000612a908585613266565b91509150612a9d816132b8565b819250505092915050565b6000612ab382612889565b612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae990614d45565b60405180910390fd5b6000612afd8361166f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b6c57508373ffffffffffffffffffffffffffffffffffffffff16612b5484610a4d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b7d5750612b7c8185612446565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ba68261166f565b73ffffffffffffffffffffffffffffffffffffffff1614612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390614ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6390614ce5565b60405180910390fd5b612c7783838361348d565b612c826000826128fd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cd2919061524e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d29919061516d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612df091906151c3565b905092915050565b60008183612e0691906151f4565b905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612eee8282604051806020016040528060008152506135a1565b5050565b60606000821415612f3a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061304e565b600082905060005b60008214612f6c578080612f55906153c4565b915050600a82612f6591906151c3565b9150612f42565b60008167ffffffffffffffff811115612f8857612f87615562565b5b6040519080825280601f01601f191660200182016040528015612fba5781602001600182028036833780820191505090505b5090505b6000851461304757600182612fd3919061524e565b9150600a85612fe29190615417565b6030612fee919061516d565b60f81b81838151811061300457613003615533565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304091906151c3565b9450612fbe565b8093505050505b919050565b61305e848484612b86565b61306a848484846135fc565b6130a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a090614c65565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000ad3d4b99f23c3d4a60feb19478951b984d4d385b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561319557507f000000000000000000000000000000000000000000000000000000000000000146145b156131c2577f465f1a59c6d1eefd9548fa03079f93f4b88a131962ed2eae98c619611fd36cc09050613230565b61322d7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ffb5f053735f24c12f351a6a565c4911c7dd5c5f327b5c6bf30966e29a44fc8627fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613793565b90505b90565b600082826040516020016132489291906149fd565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156132a85760008060006020860151925060408601519150606086015160001a905061329c878285856137cd565b945094505050506132b1565b60006002915091505b9250929050565b600060048111156132cc576132cb6154a6565b5b8160048111156132df576132de6154a6565b5b14156132ea5761348a565b600160048111156132fe576132fd6154a6565b5b816004811115613311576133106154a6565b5b1415613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334990614be5565b60405180910390fd5b60026004811115613366576133656154a6565b5b816004811115613379576133786154a6565b5b14156133ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b190614c25565b60405180910390fd5b600360048111156133ce576133cd6154a6565b5b8160048111156133e1576133e06154a6565b5b1415613422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341990614d25565b60405180910390fd5b600480811115613435576134346154a6565b5b816004811115613448576134476154a6565b5b1415613489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348090614e45565b60405180910390fd5b5b50565b6134988383836138da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134db576134d6816138df565b61351a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613519576135188382613928565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561355d5761355881613a95565b61359c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461359b5761359a8282613b66565b5b5b505050565b6135ab8383613be5565b6135b860008484846135fc565b6135f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ee90614c65565b60405180910390fd5b505050565b600061361d8473ffffffffffffffffffffffffffffffffffffffff16613db3565b15613786578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136466128f5565b8786866040518563ffffffff1660e01b81526004016136689493929190614a7f565b602060405180830381600087803b15801561368257600080fd5b505af19250505080156136b357506040513d601f19601f820116820180604052508101906136b091906141c1565b60015b613736573d80600081146136e3576040519150601f19603f3d011682016040523d82523d6000602084013e6136e8565b606091505b5060008151141561372e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372590614c65565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061378b565b600190505b949350505050565b600083838346306040516020016137ae959493929190614b2b565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156138085760006003915091506138d1565b601b8560ff16141580156138205750601c8560ff1614155b156138325760006004915091506138d1565b6000600187878787604051600081526020016040526040516138579493929190614b7e565b6020604051602081039080840390855afa158015613879573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156138c8576000600192509250506138d1565b80600092509250505b94509492505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613935846117e6565b61393f919061524e565b9050600060076000848152602001908152602001600020549050818114613a24576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613aa9919061524e565b9050600060096000848152602001908152602001600020549050600060088381548110613ad957613ad8615533565b5b906000526020600020015490508060088381548110613afb57613afa615533565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b4a57613b49615504565b5b6001900381819060005260206000200160009055905550505050565b6000613b71836117e6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c4c90614e65565b60405180910390fd5b613c5e81612889565b15613c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9590614cc5565b60405180910390fd5b613caa6000838361348d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cfa919061516d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613dd290615361565b90600052602060002090601f016020900481019282613df45760008555613e3b565b82601f10613e0d57805160ff1916838001178555613e3b565b82800160010185558215613e3b579182015b82811115613e3a578251825591602001919060010190613e1f565b5b509050613e489190613e4c565b5090565b5b80821115613e65576000816000905550600101613e4d565b5090565b6000613e7c613e77846150a8565b615083565b905082815260208101848484011115613e9857613e976155aa565b5b613ea384828561531f565b509392505050565b6000613ebe613eb9846150d9565b615083565b905082815260208101848484011115613eda57613ed96155aa565b5b613ee584828561531f565b509392505050565b600081359050613efc81615e66565b92915050565b600081359050613f1181615e7d565b92915050565b600081359050613f2681615e94565b92915050565b600081519050613f3b81615e94565b92915050565b600082601f830112613f5657613f55615591565b5b8135613f66848260208601613e69565b91505092915050565b600082601f830112613f8457613f83615591565b5b8135613f94848260208601613eab565b91505092915050565b600060808284031215613fb357613fb261559b565b5b81905092915050565b600081359050613fcb81615eab565b92915050565b600060208284031215613fe757613fe66155b4565b5b6000613ff584828501613eed565b91505092915050565b60008060408385031215614015576140146155b4565b5b600061402385828601613eed565b925050602061403485828601613eed565b9150509250929050565b600080600060608486031215614057576140566155b4565b5b600061406586828701613eed565b935050602061407686828701613eed565b925050604061408786828701613fbc565b9150509250925092565b600080600080608085870312156140ab576140aa6155b4565b5b60006140b987828801613eed565b94505060206140ca87828801613eed565b93505060406140db87828801613fbc565b925050606085013567ffffffffffffffff8111156140fc576140fb6155af565b5b61410887828801613f41565b91505092959194509250565b6000806040838503121561412b5761412a6155b4565b5b600061413985828601613eed565b925050602061414a85828601613f02565b9150509250929050565b6000806040838503121561416b5761416a6155b4565b5b600061417985828601613eed565b925050602061418a85828601613fbc565b9150509250929050565b6000602082840312156141aa576141a96155b4565b5b60006141b884828501613f17565b91505092915050565b6000602082840312156141d7576141d66155b4565b5b60006141e584828501613f2c565b91505092915050565b60008060408385031215614205576142046155b4565b5b600083013567ffffffffffffffff811115614223576142226155af565b5b61422f85828601613f6f565b925050602083013567ffffffffffffffff8111156142505761424f6155af565b5b61425c85828601613f6f565b9150509250929050565b60006020828403121561427c5761427b6155b4565b5b600082013567ffffffffffffffff81111561429a576142996155af565b5b6142a684828501613f9d565b91505092915050565b6000602082840312156142c5576142c46155b4565b5b60006142d384828501613fbc565b91505092915050565b6142e581615294565b82525050565b6142f481615282565b82525050565b614303816152a6565b82525050565b614312816152b2565b82525050565b614329614324826152b2565b61540d565b82525050565b600061433a8261511f565b6143448185615135565b935061435481856020860161532e565b61435d816155b9565b840191505092915050565b60006143738261512a565b61437d8185615151565b935061438d81856020860161532e565b614396816155b9565b840191505092915050565b60006143ac8261512a565b6143b68185615162565b93506143c681856020860161532e565b80840191505092915050565b600081546143df81615361565b6143e98186615162565b94506001821660008114614404576001811461441557614448565b60ff19831686528186019350614448565b61441e8561510a565b60005b8381101561444057815481890152600182019150602081019050614421565b838801955050505b50505092915050565b600061445e601883615151565b9150614469826155ca565b602082019050919050565b6000614481602583615151565b915061448c826155f3565b604082019050919050565b60006144a4601283615162565b91506144af82615642565b601282019050919050565b60006144c7601f83615151565b91506144d28261566b565b602082019050919050565b60006144ea602b83615151565b91506144f582615694565b604082019050919050565b600061450d603283615151565b9150614518826156e3565b604082019050919050565b6000614530602683615151565b915061453b82615732565b604082019050919050565b6000614553600f83615151565b915061455e82615781565b602082019050919050565b6000614576601c83615151565b9150614581826157aa565b602082019050919050565b6000614599600283615162565b91506145a4826157d3565b600282019050919050565b60006145bc602483615151565b91506145c7826157fc565b604082019050919050565b60006145df601983615151565b91506145ea8261584b565b602082019050919050565b6000614602602283615151565b915061460d82615874565b604082019050919050565b6000614625602c83615151565b9150614630826158c3565b604082019050919050565b6000614648601183615151565b915061465382615912565b602082019050919050565b600061466b601e83615151565b91506146768261593b565b602082019050919050565b600061468e602083615151565b915061469982615964565b602082019050919050565b60006146b1600483615162565b91506146bc8261598d565b600482019050919050565b60006146d4603883615151565b91506146df826159b6565b604082019050919050565b60006146f7602a83615151565b915061470282615a05565b604082019050919050565b600061471a602983615151565b915061472582615a54565b604082019050919050565b600061473d602583615151565b915061474882615aa3565b604082019050919050565b6000614760602283615151565b915061476b82615af2565b604082019050919050565b6000614783602083615151565b915061478e82615b41565b602082019050919050565b60006147a6602983615151565b91506147b182615b6a565b604082019050919050565b60006147c9602c83615151565b91506147d482615bb9565b604082019050919050565b60006147ec600583615162565b91506147f782615c08565b600582019050919050565b600061480f602083615151565b915061481a82615c31565b602082019050919050565b6000614832602983615151565b915061483d82615c5a565b604082019050919050565b6000614855601783615151565b915061486082615ca9565b602082019050919050565b6000614878601883615151565b915061488382615cd2565b602082019050919050565b600061489b602183615151565b91506148a682615cfb565b604082019050919050565b60006148be600083615146565b91506148c982615d4a565b600082019050919050565b60006148e1603183615151565b91506148ec82615d4d565b604082019050919050565b6000614904601583615151565b915061490f82615d9c565b602082019050919050565b6000614927602c83615151565b915061493282615dc5565b604082019050919050565b600061494a601f83615151565b915061495582615e14565b602082019050919050565b600061496d601683615151565b915061497882615e3d565b602082019050919050565b61498c81615308565b82525050565b61499b81615312565b82525050565b60006149ad82856143d2565b91506149b982846143a1565b91506149c4826147df565b91508190509392505050565b60006149db82614497565b91506149e782846143a1565b91506149f2826146a4565b915081905092915050565b6000614a088261458c565b9150614a148285614318565b602082019150614a248284614318565b6020820191508190509392505050565b6000614a3f826148b1565b9150819050919050565b6000602082019050614a5e60008301846142eb565b92915050565b6000602082019050614a7960008301846142dc565b92915050565b6000608082019050614a9460008301876142eb565b614aa160208301866142eb565b614aae6040830185614983565b8181036060830152614ac0818461432f565b905095945050505050565b6000602082019050614ae060008301846142fa565b92915050565b6000608082019050614afb6000830187614309565b614b0860208301866142eb565b614b1560408301856142eb565b614b226060830184614983565b95945050505050565b600060a082019050614b406000830188614309565b614b4d6020830187614309565b614b5a6040830186614309565b614b676060830185614983565b614b7460808301846142eb565b9695505050505050565b6000608082019050614b936000830187614309565b614ba06020830186614992565b614bad6040830185614309565b614bba6060830184614309565b95945050505050565b60006020820190508181036000830152614bdd8184614368565b905092915050565b60006020820190508181036000830152614bfe81614451565b9050919050565b60006020820190508181036000830152614c1e81614474565b9050919050565b60006020820190508181036000830152614c3e816144ba565b9050919050565b60006020820190508181036000830152614c5e816144dd565b9050919050565b60006020820190508181036000830152614c7e81614500565b9050919050565b60006020820190508181036000830152614c9e81614523565b9050919050565b60006020820190508181036000830152614cbe81614546565b9050919050565b60006020820190508181036000830152614cde81614569565b9050919050565b60006020820190508181036000830152614cfe816145af565b9050919050565b60006020820190508181036000830152614d1e816145d2565b9050919050565b60006020820190508181036000830152614d3e816145f5565b9050919050565b60006020820190508181036000830152614d5e81614618565b9050919050565b60006020820190508181036000830152614d7e8161463b565b9050919050565b60006020820190508181036000830152614d9e8161465e565b9050919050565b60006020820190508181036000830152614dbe81614681565b9050919050565b60006020820190508181036000830152614dde816146c7565b9050919050565b60006020820190508181036000830152614dfe816146ea565b9050919050565b60006020820190508181036000830152614e1e8161470d565b9050919050565b60006020820190508181036000830152614e3e81614730565b9050919050565b60006020820190508181036000830152614e5e81614753565b9050919050565b60006020820190508181036000830152614e7e81614776565b9050919050565b60006020820190508181036000830152614e9e81614799565b9050919050565b60006020820190508181036000830152614ebe816147bc565b9050919050565b60006020820190508181036000830152614ede81614802565b9050919050565b60006020820190508181036000830152614efe81614825565b9050919050565b60006020820190508181036000830152614f1e81614848565b9050919050565b60006020820190508181036000830152614f3e8161486b565b9050919050565b60006020820190508181036000830152614f5e8161488e565b9050919050565b60006020820190508181036000830152614f7e816148d4565b9050919050565b60006020820190508181036000830152614f9e816148f7565b9050919050565b60006020820190508181036000830152614fbe8161491a565b9050919050565b60006020820190508181036000830152614fde8161493d565b9050919050565b60006020820190508181036000830152614ffe81614960565b9050919050565b600060208201905061501a6000830184614983565b92915050565b6000808335600160200384360303811261503d5761503c6155a0565b5b80840192508235915067ffffffffffffffff82111561505f5761505e615596565b5b60208301925060018202360383131561507b5761507a6155a5565b5b509250929050565b600061508d61509e565b90506150998282615393565b919050565b6000604051905090565b600067ffffffffffffffff8211156150c3576150c2615562565b5b6150cc826155b9565b9050602081019050919050565b600067ffffffffffffffff8211156150f4576150f3615562565b5b6150fd826155b9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061517882615308565b915061518383615308565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151b8576151b7615448565b5b828201905092915050565b60006151ce82615308565b91506151d983615308565b9250826151e9576151e8615477565b5b828204905092915050565b60006151ff82615308565b915061520a83615308565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561524357615242615448565b5b828202905092915050565b600061525982615308565b915061526483615308565b92508282101561527757615276615448565b5b828203905092915050565b600061528d826152e8565b9050919050565b600061529f826152e8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561534c578082015181840152602081019050615331565b8381111561535b576000848401525b50505050565b6000600282049050600182168061537957607f821691505b6020821081141561538d5761538c6154d5565b5b50919050565b61539c826155b9565b810181811067ffffffffffffffff821117156153bb576153ba615562565b5b80604052505050565b60006153cf82615308565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561540257615401615448565b5b600182019050919050565b6000819050919050565b600061542282615308565b915061542d83615308565b92508261543d5761543c615477565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4661696c656420746f2073656e6420457468657220746f207661756c7441647260008201527f7265737332000000000000000000000000000000000000000000000000000000602082015250565b7f636c61696d206e66742072657175697265200000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f636c61696d20636f756e74203e20320000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f616c6c6f774d696e74203d2066616c7365000000000000000000000000000000600082015250565b7f4661696c656420746f2076657269667920746865207369676e61747572650000600082015250565b7f4d696e746572206973206e6f74207468652063757272656e742063616c6c6572600082015250565b7f2077656900000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e6420457468657220746f207661756c7441647260008201527f7265737331000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f746f6b656e5552493a2055524920717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f54686520766f7563686572206861732065787069726564000000000000000000600082015250565b7f416c6c206e6674732068617665206265656e206d696e65640000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865207369676e657220697320696e76616c69640000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f54686520766f756368657220697320696e76616c696400000000000000000000600082015250565b615e6f81615282565b8114615e7a57600080fd5b50565b615e86816152a6565b8114615e9157600080fd5b50565b615e9d816152bc565b8114615ea857600080fd5b50565b615eb481615308565b8114615ebf57600080fd5b5056fea264697066735822122099f7cc0e1f8b3801353e87c872ac165a0c03ec96f6b6393618ab68a339534bbc64736f6c63430008070033

Deployed Bytecode Sourcemap

64404:6462:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45003:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32117:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33676:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33199:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69657:81;;;;;;;;;;;;;:::i;:::-;;67219:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45643:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69837:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65347:24;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70165:88;;;;;;;;;;;;;:::i;:::-;;67877:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34566:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45311:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68935:542;;;;;;;;;;;;;:::i;:::-;;34976:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64595:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45833:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69489:75;;;;;;;;;;;;;:::i;:::-;;31811:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64816:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69572:77;;;;;;;;;;;;;:::i;:::-;;64549:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31541:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16509:94;;;;;;;;;;;;;:::i;:::-;;70261:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70415:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15858:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68302:495;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32286:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66070:918;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33969:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64623:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69746:83;;;;;;;;;;;;;:::i;:::-;;35232:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64773:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65577:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68809:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34335:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66998:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16758:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70045:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45003:224;45105:4;45144:35;45129:50;;;:11;:50;;;;:90;;;;45183:36;45207:11;45183:23;:36::i;:::-;45129:90;45122:97;;45003:224;;;:::o;32117:100::-;32171:13;32204:5;32197:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32117:100;:::o;33676:221::-;33752:7;33780:16;33788:7;33780;:16::i;:::-;33772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33865:15;:24;33881:7;33865:24;;;;;;;;;;;;;;;;;;;;;33858:31;;33676:221;;;:::o;33199:411::-;33280:13;33296:23;33311:7;33296:14;:23::i;:::-;33280:39;;33344:5;33338:11;;:2;:11;;;;33330:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33438:5;33422:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33447:37;33464:5;33471:12;:10;:12::i;:::-;33447:16;:37::i;:::-;33422:62;33400:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33581:21;33590:2;33594:7;33581:8;:21::i;:::-;33269:341;33199:411;;:::o;69657:81::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69726:4:::1;69711:12;;:19;;;;;;;;;;;;;;;;;;69657:81::o:0;67219:289::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67289:12:::1;67312:13:::0;67356:24:::1;67371:8;67356:14;:24::i;:::-;67336:44;;;;;;;;67394:7;67391:110;;;67434:7;67459:1;67442:7;:14;;;;:18;;;;:::i;:::-;67434:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67417:7;67425:5;67417:14;;;;;;;;:::i;:::-;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;67476:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;67391:110;67278:230;;67219:289:::0;:::o;45643:113::-;45704:7;45731:10;:17;;;;45724:24;;45643:113;:::o;69837:198::-;18797:1;19393:7;;:19;;19385:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;18797:1;19526:7;:18;;;;16089:12:::1;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69968:11:::2;69944:13;;:36;;;;;;;;;;;;;;;;;;70015:11;69991:13;;:36;;;;;;;;;;;;;;;;;;18753:1:::0;19705:7;:22;;;;69837:198;;:::o;65347:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70165:88::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70235:10:::1;;;;;;;;;;;70234:11;70221:10;;:24;;;;;;;;;;;;;;;;;;70165:88::o:0;67877:411::-;67951:4;67975:13;67991:212;65266:74;68090:7;:14;;;;;;;;;;:::i;:::-;68127:7;:14;;;;;;;;;;:::i;:::-;68164:7;:18;;;68018:183;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68008:194;;;;;;67991:16;:212::i;:::-;67975:228;;68266:7;:14;;;;;;;;;;:::i;:::-;68223:57;;:39;68237:5;68244:7;:17;;;;;;;;:::i;:::-;68223:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:39::i;:::-;:57;;;68216:64;;;67877:411;;;:::o;34566:339::-;34761:41;34780:12;:10;:12::i;:::-;34794:7;34761:18;:41::i;:::-;34753:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34869:28;34879:4;34885:2;34889:7;34869:9;:28::i;:::-;34566:339;;;:::o;45311:256::-;45408:7;45444:23;45461:5;45444:16;:23::i;:::-;45436:5;:31;45428:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45533:12;:19;45546:5;45533:19;;;;;;;;;;;;;;;:26;45553:5;45533:26;;;;;;;;;;;;45526:33;;45311:256;;;;:::o;68935:542::-;18797:1;19393:7;;:19;;19385:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;18797:1;19526:7;:18;;;;16089:12:::1;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68995:15:::2;69013:21;68995:39;;69045:12;69060:26;69073:7;69082:3;69060:12;:26::i;:::-;69045:41;;69097:16;69117:22;69130:4;69136:2;69117:12;:22::i;:::-;69097:42;;69150:16;69179:8;69169:7;:18;;;;:::i;:::-;69150:37;;69201:13;69220;;;;;;;;;;;:18;;69246:8;69220:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69200:59;;;69278:8;69270:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;69342:13;69361;;;;;;;;;;;:18;;69387:8;69361:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69341:59;;;69419:8;69411:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;68984:493;;;;;;18753:1:::0;19705:7;:22;;;;68935:542::o;34976:185::-;35114:39;35131:4;35137:2;35141:7;35114:39;;;;;;;;;;;;:16;:39::i;:::-;34976:185;;;:::o;64595:21::-;;;;;;;;;;;;;:::o;45833:233::-;45908:7;45944:30;:28;:30::i;:::-;45936:5;:38;45928:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46041:10;46052:5;46041:17;;;;;;;;:::i;:::-;;;;;;;;;;46034:24;;45833:233;;;:::o;69489:75::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69552:4:::1;69540:9;;:16;;;;;;;;;;;;;;;;;;69489:75::o:0;31811:239::-;31883:7;31903:13;31919:7;:16;31927:7;31919:16;;;;;;;;;;;;;;;;;;;;;31903:32;;31971:1;31954:19;;:5;:19;;;;31946:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32037:5;32030:12;;;31811:239;;;:::o;64816:36::-;;;;;;;;;;;;;:::o;69572:77::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69636:5:::1;69624:9;;:17;;;;;;;;;;;;;;;;;;69572:77::o:0;64549:39::-;;;;:::o;31541:208::-;31613:7;31658:1;31641:19;;:5;:19;;;;31633:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31725:9;:16;31735:5;31725:16;;;;;;;;;;;;;;;;31718:23;;31541:208;;;:::o;16509:94::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16574:21:::1;16592:1;16574:9;:21::i;:::-;16509:94::o:0;70261:146::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70366:5:::1;70354:9;:17;;;;;;;;;;;;:::i;:::-;;70394:5;70382:9;:17;;;;;;;;;;;;:::i;:::-;;70261:146:::0;;:::o;70415:446::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70472:34:::1;70509:10;:22;70520:10;70509:22;;;;;;;;;;;;;;;70472:59;;70548:7;70544:310;70566:6;70561:2;:11;70544:310;;;70620:10;;70607;;:23;70604:66;;;70648:7;;;;70604:66;70684:35;70694:12;:10;:12::i;:::-;70708:10;;70684:9;:35::i;:::-;70736:13;:22;;;70734:24;;;;;:::i;:::-;;;;;;;;70773:13;:23;;70802:10;;70773:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70832:10;;70830:12;;;;;:::i;:::-;;;;;;;;70574:4;;;;:::i;:::-;;;70544:310;;;;70461:400;16149:1;70415:446:::0;:::o;15858:87::-;15904:7;15931:6;;;;;;;;;;;15924:13;;15858:87;:::o;68302:495::-;68376:4;68408:22;68422:7;68408:13;:22::i;:::-;68400:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68477:12;68515:30;68530:7;:14;;;;;;;;;;:::i;:::-;68515;:30::i;:::-;68500:45;;;;;68564:7;68556:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;68631:7;:14;;;;;;;;;;:::i;:::-;68617:28;;:10;:28;;;68609:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;68723:15;68702:7;:18;;;:36;68694:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68785:4;68778:11;;;68302:495;;;:::o;32286:104::-;32342:13;32375:7;32368:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32286:104;:::o;66070:918::-;18797:1;19393:7;;:19;;19385:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;18797:1;19526:7;:18;;;;66153:34:::1;66190:10;:22;66201:10;66190:22;;;;;;;;;;;;;;;66153:59;;66247:10;;66233;;:24;;66225:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;66336:1;66311:13;:22;;;:26;66303:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;66389:9;;66376;:22;66447:27;66464:9;;66447:16;:27::i;:::-;66408:75;;;;;;;;:::i;:::-;;;;;;;;;;;;;66368:117;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;66498:15;66535:12;;;;;;;;;;;66532:203;;;66575:4;66562:17;;66532:203;;;66598:9;;;;;;;;;;;66595:140;;;66641:22;66655:7;66641:13;:22::i;:::-;66633:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66719:4;66706:17;;66595:140;66532:203;66769:4;66755:18;;:10;:18;;;66747:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;66816:35;66826:12;:10;:12::i;:::-;66840:10;;66816:9;:35::i;:::-;66874:13;:22;;;66872:24;;;;;:::i;:::-;;;;;;;;66907:13;:23;;66936:10;;66907:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66960:10;;66958:12;;;;;:::i;:::-;;;;;;;;66142:846;;18753:1:::0;19705:7;:22;;;;66070:918;:::o;33969:295::-;34084:12;:10;:12::i;:::-;34072:24;;:8;:24;;;;34064:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34184:8;34139:18;:32;34158:12;:10;:12::i;:::-;34139:32;;;;;;;;;;;;;;;:42;34172:8;34139:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34237:8;34208:48;;34223:12;:10;:12::i;:::-;34208:48;;;34247:8;34208:48;;;;;;:::i;:::-;;;;;;;;33969:295;;:::o;64623:24::-;;;;;;;;;;;;;:::o;69746:83::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69816:5:::1;69801:12;;:20;;;;;;;;;;;;;;;;;;69746:83::o:0;35232:328::-;35407:41;35426:12;:10;:12::i;:::-;35440:7;35407:18;:41::i;:::-;35399:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35513:39;35527:4;35533:2;35537:7;35546:5;35513:13;:39::i;:::-;35232:328;;;;:::o;64773:36::-;;;;;;;;;;;;;:::o;65577:475::-;65643:13;65677:17;65685:8;65677:7;:17::i;:::-;65669:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65761:25;65789:26;65806:8;65789:16;:26::i;:::-;65761:54;;65843:4;65829:18;;:10;;;;;;;;;;;:18;;;65826:219;;;65894:9;65905:11;65877:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65863:64;;;;;65826:219;66000:9;66011:11;65983:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65969:64;;;65577:475;;;;:::o;68809:114::-;68869:4;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68894:21:::1;68886:29;;68809:114:::0;:::o;34335:164::-;34432:4;34456:18;:25;34475:5;34456:25;;;;;;;;;;;;;;;:35;34482:8;34456:35;;;;;;;;;;;;;;;;;;;;;;;;;34449:42;;34335:164;;;;:::o;66998:207::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67065:12:::1;67102:24;67117:8;67102:14;:24::i;:::-;67088:38;;;;;67141:7;67137:61;;67164:7;67177:8;67164:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67137:61;67054:151;66998:207:::0;:::o;16758:192::-;16089:12;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16867:1:::1;16847:22;;:8;:22;;;;16839:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16923:19;16933:8;16923:9;:19::i;:::-;16758:192:::0;:::o;70045:112::-;18797:1;19393:7;;:19;;19385:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;18797:1;19526:7;:18;;;;16089:12:::1;:10;:12::i;:::-;16078:23;;:7;:5;:7::i;:::-;:23;;;16070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70139:10:::2;70127:9;:22;;;;18753:1:::0;19705:7;:22;;;;70045:112;:::o;31172:305::-;31274:4;31326:25;31311:40;;;:11;:40;;;;:105;;;;31383:33;31368:48;;;:11;:48;;;;31311:105;:158;;;;31433:36;31457:11;31433:23;:36::i;:::-;31311:158;31291:178;;31172:305;;;:::o;37070:127::-;37135:4;37187:1;37159:30;;:7;:16;37167:7;37159:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37152:37;;37070:127;;;:::o;14718:98::-;14771:7;14798:10;14791:17;;14718:98;:::o;41052:174::-;41154:2;41127:15;:24;41143:7;41127:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41210:7;41206:2;41172:46;;41181:23;41196:7;41181:14;:23::i;:::-;41172:46;;;;;;;;;;;;41052:174;;:::o;67518:345::-;67582:4;67589:7;67609:10;67630:13;67659:9;67655:168;67675:7;:14;;;;67671:1;:18;67655:168;;;67728:8;67714:22;;:7;67722:1;67714:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:22;;;67711:101;;;67764:4;67756:12;;67795:1;67787:9;;67711:101;67692:3;;;;;:::i;:::-;;;;67655:168;;;;67841:5;67849;67833:22;;;;;;67518:345;;;:::o;64228:167::-;64305:7;64332:55;64354:20;:18;:20::i;:::-;64376:10;64332:21;:55::i;:::-;64325:62;;64228:167;;;:::o;54831:231::-;54909:7;54930:17;54949:18;54971:27;54982:4;54988:9;54971:10;:27::i;:::-;54929:69;;;;55009:18;55021:5;55009:11;:18::i;:::-;55045:9;55038:16;;;;54831:231;;;;:::o;37364:348::-;37457:4;37482:16;37490:7;37482;:16::i;:::-;37474:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37558:13;37574:23;37589:7;37574:14;:23::i;:::-;37558:39;;37627:5;37616:16;;:7;:16;;;:51;;;;37660:7;37636:31;;:20;37648:7;37636:11;:20::i;:::-;:31;;;37616:51;:87;;;;37671:32;37688:5;37695:7;37671:16;:32::i;:::-;37616:87;37608:96;;;37364:348;;;;:::o;40356:578::-;40515:4;40488:31;;:23;40503:7;40488:14;:23::i;:::-;:31;;;40480:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40598:1;40584:16;;:2;:16;;;;40576:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40654:39;40675:4;40681:2;40685:7;40654:20;:39::i;:::-;40758:29;40775:1;40779:7;40758:8;:29::i;:::-;40819:1;40800:9;:15;40810:4;40800:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40848:1;40831:9;:13;40841:2;40831:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40879:2;40860:7;:16;40868:7;40860:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40918:7;40914:2;40899:27;;40908:4;40899:27;;;;;;;;;;;;40356:578;;;:::o;9158:98::-;9216:7;9247:1;9243;:5;;;;:::i;:::-;9236:12;;9158:98;;;;:::o;8759:::-;8817:7;8848:1;8844;:5;;;;:::i;:::-;8837:12;;8759:98;;;;:::o;16958:173::-;17014:16;17033:6;;;;;;;;;;;17014:25;;17059:8;17050:6;;:17;;;;;;;;;;;;;;;;;;17114:8;17083:40;;17104:8;17083:40;;;;;;;;;;;;17003:128;16958:173;:::o;38054:110::-;38130:26;38140:2;38144:7;38130:26;;;;;;;;;;;;:9;:26::i;:::-;38054:110;;:::o;12414:723::-;12470:13;12700:1;12691:5;:10;12687:53;;;12718:10;;;;;;;;;;;;;;;;;;;;;12687:53;12750:12;12765:5;12750:20;;12781:14;12806:78;12821:1;12813:4;:9;12806:78;;12839:8;;;;;:::i;:::-;;;;12870:2;12862:10;;;;;:::i;:::-;;;12806:78;;;12894:19;12926:6;12916:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12894:39;;12944:154;12960:1;12951:5;:10;12944:154;;12988:1;12978:11;;;;;:::i;:::-;;;13055:2;13047:5;:10;;;;:::i;:::-;13034:2;:24;;;;:::i;:::-;13021:39;;13004:6;13011;13004:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13084:2;13075:11;;;;;:::i;:::-;;;12944:154;;;13122:6;13108:21;;;;;12414:723;;;;:::o;36442:315::-;36599:28;36609:4;36615:2;36619:7;36599:9;:28::i;:::-;36646:48;36669:4;36675:2;36679:7;36688:5;36646:22;:48::i;:::-;36638:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36442:315;;;;:::o;29779:157::-;29864:4;29903:25;29888:40;;;:11;:40;;;;29881:47;;29779:157;;;:::o;63001:314::-;63054:7;63095:12;63078:29;;63086:4;63078:29;;;:66;;;;;63128:16;63111:13;:33;63078:66;63074:234;;;63168:24;63161:31;;;;63074:234;63232:64;63254:10;63266:12;63280:15;63232:21;:64::i;:::-;63225:71;;63001:314;;:::o;59745:196::-;59838:7;59904:15;59921:10;59875:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59865:68;;;;;;59858:75;;59745:196;;;;:::o;53282:747::-;53363:7;53372:12;53421:2;53401:9;:16;:22;53397:625;;;53440:9;53464;53488:7;53745:4;53734:9;53730:20;53724:27;53719:32;;53795:4;53784:9;53780:20;53774:27;53769:32;;53853:4;53842:9;53838:20;53832:27;53829:1;53824:36;53819:41;;53896:25;53907:4;53913:1;53916;53919;53896:10;:25::i;:::-;53889:32;;;;;;;;;53397:625;53970:1;53974:35;53954:56;;;;53282:747;;;;;;:::o;51553:643::-;51631:20;51622:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;51618:571;;;51668:7;;51618:571;51729:29;51720:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;51716:473;;;51775:34;;;;;;;;;;:::i;:::-;;;;;;;;51716:473;51840:35;51831:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;51827:362;;;51892:41;;;;;;;;;;:::i;:::-;;;;;;;;51827:362;51964:30;51955:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;51951:238;;;52011:44;;;;;;;;;;:::i;:::-;;;;;;;;51951:238;52086:30;52077:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;52073:116;;;52133:44;;;;;;;;;;:::i;:::-;;;;;;;;52073:116;51553:643;;:::o;46679:589::-;46823:45;46850:4;46856:2;46860:7;46823:26;:45::i;:::-;46901:1;46885:18;;:4;:18;;;46881:187;;;46920:40;46952:7;46920:31;:40::i;:::-;46881:187;;;46990:2;46982:10;;:4;:10;;;46978:90;;47009:47;47042:4;47048:7;47009:32;:47::i;:::-;46978:90;46881:187;47096:1;47082:16;;:2;:16;;;47078:183;;;47115:45;47152:7;47115:36;:45::i;:::-;47078:183;;;47188:4;47182:10;;:2;:10;;;47178:83;;47209:40;47237:2;47241:7;47209:27;:40::i;:::-;47178:83;47078:183;46679:589;;;:::o;38391:321::-;38521:18;38527:2;38531:7;38521:5;:18::i;:::-;38572:54;38603:1;38607:2;38611:7;38620:5;38572:22;:54::i;:::-;38550:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38391:321;;;:::o;41791:803::-;41946:4;41967:15;:2;:13;;;:15::i;:::-;41963:624;;;42019:2;42003:36;;;42040:12;:10;:12::i;:::-;42054:4;42060:7;42069:5;42003:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41999:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42266:1;42249:6;:13;:18;42245:272;;;42292:60;;;;;;;;;;:::i;:::-;;;;;;;;42245:272;42467:6;42461:13;42452:6;42448:2;42444:15;42437:38;41999:533;42136:45;;;42126:55;;;:6;:55;;;;42119:62;;;;;41963:624;42571:4;42564:11;;41791:803;;;;;;;:::o;63323:263::-;63467:7;63515:8;63525;63535:11;63548:13;63571:4;63504:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63494:84;;;;;;63487:91;;63323:263;;;;;:::o;56283:1632::-;56414:7;56423:12;57348:66;57343:1;57335:10;;:79;57331:163;;;57447:1;57451:30;57431:51;;;;;;57331:163;57513:2;57508:1;:7;;;;:18;;;;;57524:2;57519:1;:7;;;;57508:18;57504:102;;;57559:1;57563:30;57543:51;;;;;;57504:102;57703:14;57720:24;57730:4;57736:1;57739;57742;57720:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57703:41;;57777:1;57759:20;;:6;:20;;;57755:103;;;57812:1;57816:29;57796:50;;;;;;;57755:103;57878:6;57886:20;57870:37;;;;;56283:1632;;;;;;;;:::o;43166:126::-;;;;:::o;47991:164::-;48095:10;:17;;;;48068:15;:24;48084:7;48068:24;;;;;;;;;;;:44;;;;48123:10;48139:7;48123:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47991:164;:::o;48782:988::-;49048:22;49098:1;49073:22;49090:4;49073:16;:22::i;:::-;:26;;;;:::i;:::-;49048:51;;49110:18;49131:17;:26;49149:7;49131:26;;;;;;;;;;;;49110:47;;49278:14;49264:10;:28;49260:328;;49309:19;49331:12;:18;49344:4;49331:18;;;;;;;;;;;;;;;:34;49350:14;49331:34;;;;;;;;;;;;49309:56;;49415:11;49382:12;:18;49395:4;49382:18;;;;;;;;;;;;;;;:30;49401:10;49382:30;;;;;;;;;;;:44;;;;49532:10;49499:17;:30;49517:11;49499:30;;;;;;;;;;;:43;;;;49294:294;49260:328;49684:17;:26;49702:7;49684:26;;;;;;;;;;;49677:33;;;49728:12;:18;49741:4;49728:18;;;;;;;;;;;;;;;:34;49747:14;49728:34;;;;;;;;;;;49721:41;;;48863:907;;48782:988;;:::o;50065:1079::-;50318:22;50363:1;50343:10;:17;;;;:21;;;;:::i;:::-;50318:46;;50375:18;50396:15;:24;50412:7;50396:24;;;;;;;;;;;;50375:45;;50747:19;50769:10;50780:14;50769:26;;;;;;;;:::i;:::-;;;;;;;;;;50747:48;;50833:11;50808:10;50819;50808:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;50944:10;50913:15;:28;50929:11;50913:28;;;;;;;;;;;:41;;;;51085:15;:24;51101:7;51085:24;;;;;;;;;;;51078:31;;;51120:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50136:1008;;;50065:1079;:::o;47569:221::-;47654:14;47671:20;47688:2;47671:16;:20::i;:::-;47654:37;;47729:7;47702:12;:16;47715:2;47702:16;;;;;;;;;;;;;;;:24;47719:6;47702:24;;;;;;;;;;;:34;;;;47776:6;47747:17;:26;47765:7;47747:26;;;;;;;;;;;:35;;;;47643:147;47569:221;;:::o;39048:382::-;39142:1;39128:16;;:2;:16;;;;39120:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39201:16;39209:7;39201;:16::i;:::-;39200:17;39192:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39263:45;39292:1;39296:2;39300:7;39263:20;:45::i;:::-;39338:1;39321:9;:13;39331:2;39321:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39369:2;39350:7;:16;39358:7;39350:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39414:7;39410:2;39389:33;;39406:1;39389:33;;;;;;;;;;;;39048:382;;:::o;21951:387::-;22011:4;22219:12;22286:7;22274:20;22266:28;;22329:1;22322:4;:8;22315:15;;;21951:387;;;:::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;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2165:236::-;2242:5;2283:3;2274:6;2269:3;2265:16;2261:26;2258:113;;;2290:79;;:::i;:::-;2258:113;2389:6;2380:15;;2165:236;;;;:::o;2407:139::-;2453:5;2491:6;2478:20;2469:29;;2507:33;2534:5;2507:33;:::i;:::-;2407:139;;;;:::o;2552:329::-;2611:6;2660:2;2648:9;2639:7;2635:23;2631:32;2628:119;;;2666:79;;:::i;:::-;2628:119;2786:1;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2757:117;2552:329;;;;:::o;2887:474::-;2955:6;2963;3012:2;3000:9;2991:7;2987:23;2983:32;2980:119;;;3018:79;;:::i;:::-;2980:119;3138:1;3163:53;3208:7;3199:6;3188:9;3184:22;3163:53;:::i;:::-;3153:63;;3109:117;3265:2;3291:53;3336:7;3327:6;3316:9;3312:22;3291:53;:::i;:::-;3281:63;;3236:118;2887:474;;;;;:::o;3367:619::-;3444:6;3452;3460;3509:2;3497:9;3488:7;3484:23;3480:32;3477:119;;;3515:79;;:::i;:::-;3477:119;3635:1;3660:53;3705:7;3696:6;3685:9;3681:22;3660:53;:::i;:::-;3650:63;;3606:117;3762:2;3788:53;3833:7;3824:6;3813:9;3809:22;3788:53;:::i;:::-;3778:63;;3733:118;3890:2;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3861:118;3367:619;;;;;:::o;3992:943::-;4087:6;4095;4103;4111;4160:3;4148:9;4139:7;4135:23;4131:33;4128:120;;;4167:79;;:::i;:::-;4128:120;4287:1;4312:53;4357:7;4348:6;4337:9;4333:22;4312:53;:::i;:::-;4302:63;;4258:117;4414:2;4440:53;4485:7;4476:6;4465:9;4461:22;4440:53;:::i;:::-;4430:63;;4385:118;4542:2;4568:53;4613:7;4604:6;4593:9;4589:22;4568:53;:::i;:::-;4558:63;;4513:118;4698:2;4687:9;4683:18;4670:32;4729:18;4721:6;4718:30;4715:117;;;4751:79;;:::i;:::-;4715:117;4856:62;4910:7;4901:6;4890:9;4886:22;4856:62;:::i;:::-;4846:72;;4641:287;3992:943;;;;;;;:::o;4941:468::-;5006:6;5014;5063:2;5051:9;5042:7;5038:23;5034:32;5031:119;;;5069:79;;:::i;:::-;5031:119;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:50;5384:7;5375:6;5364:9;5360:22;5342:50;:::i;:::-;5332:60;;5287:115;4941:468;;;;;:::o;5415:474::-;5483:6;5491;5540:2;5528:9;5519:7;5515:23;5511:32;5508:119;;;5546:79;;:::i;:::-;5508:119;5666:1;5691:53;5736:7;5727:6;5716:9;5712:22;5691:53;:::i;:::-;5681:63;;5637:117;5793:2;5819:53;5864:7;5855:6;5844:9;5840:22;5819:53;:::i;:::-;5809:63;;5764:118;5415:474;;;;;:::o;5895:327::-;5953:6;6002:2;5990:9;5981:7;5977:23;5973:32;5970:119;;;6008:79;;:::i;:::-;5970:119;6128:1;6153:52;6197:7;6188:6;6177:9;6173:22;6153:52;:::i;:::-;6143:62;;6099:116;5895:327;;;;:::o;6228:349::-;6297:6;6346:2;6334:9;6325:7;6321:23;6317:32;6314:119;;;6352:79;;:::i;:::-;6314:119;6472:1;6497:63;6552:7;6543:6;6532:9;6528:22;6497:63;:::i;:::-;6487:73;;6443:127;6228:349;;;;:::o;6583:834::-;6671:6;6679;6728:2;6716:9;6707:7;6703:23;6699:32;6696:119;;;6734:79;;:::i;:::-;6696:119;6882:1;6871:9;6867:17;6854:31;6912:18;6904:6;6901:30;6898:117;;;6934:79;;:::i;:::-;6898:117;7039:63;7094:7;7085:6;7074:9;7070:22;7039:63;:::i;:::-;7029:73;;6825:287;7179:2;7168:9;7164:18;7151:32;7210:18;7202:6;7199:30;7196:117;;;7232:79;;:::i;:::-;7196:117;7337:63;7392:7;7383:6;7372:9;7368:22;7337:63;:::i;:::-;7327:73;;7122:288;6583:834;;;;;:::o;7423:551::-;7513:6;7562:2;7550:9;7541:7;7537:23;7533:32;7530:119;;;7568:79;;:::i;:::-;7530:119;7716:1;7705:9;7701:17;7688:31;7746:18;7738:6;7735:30;7732:117;;;7768:79;;:::i;:::-;7732:117;7873:84;7949:7;7940:6;7929:9;7925:22;7873:84;:::i;:::-;7863:94;;7659:308;7423:551;;;;:::o;7980:329::-;8039:6;8088:2;8076:9;8067:7;8063:23;8059:32;8056:119;;;8094:79;;:::i;:::-;8056:119;8214:1;8239:53;8284:7;8275:6;8264:9;8260:22;8239:53;:::i;:::-;8229:63;;8185:117;7980:329;;;;:::o;8315:142::-;8418:32;8444:5;8418:32;:::i;:::-;8413:3;8406:45;8315:142;;:::o;8463:118::-;8550:24;8568:5;8550:24;:::i;:::-;8545:3;8538:37;8463:118;;:::o;8587:109::-;8668:21;8683:5;8668:21;:::i;:::-;8663:3;8656:34;8587:109;;:::o;8702:118::-;8789:24;8807:5;8789:24;:::i;:::-;8784:3;8777:37;8702:118;;:::o;8826:157::-;8931:45;8951:24;8969:5;8951:24;:::i;:::-;8931:45;:::i;:::-;8926:3;8919:58;8826:157;;:::o;8989:360::-;9075:3;9103:38;9135:5;9103:38;:::i;:::-;9157:70;9220:6;9215:3;9157:70;:::i;:::-;9150:77;;9236:52;9281:6;9276:3;9269:4;9262:5;9258:16;9236:52;:::i;:::-;9313:29;9335:6;9313:29;:::i;:::-;9308:3;9304:39;9297:46;;9079:270;8989:360;;;;:::o;9355:364::-;9443:3;9471:39;9504:5;9471:39;:::i;:::-;9526:71;9590:6;9585:3;9526:71;:::i;:::-;9519:78;;9606:52;9651:6;9646:3;9639:4;9632:5;9628:16;9606:52;:::i;:::-;9683:29;9705:6;9683:29;:::i;:::-;9678:3;9674:39;9667:46;;9447:272;9355:364;;;;:::o;9725:377::-;9831:3;9859:39;9892:5;9859:39;:::i;:::-;9914:89;9996:6;9991:3;9914:89;:::i;:::-;9907:96;;10012:52;10057:6;10052:3;10045:4;10038:5;10034:16;10012:52;:::i;:::-;10089:6;10084:3;10080:16;10073:23;;9835:267;9725:377;;;;:::o;10132:845::-;10235:3;10272:5;10266:12;10301:36;10327:9;10301:36;:::i;:::-;10353:89;10435:6;10430:3;10353:89;:::i;:::-;10346:96;;10473:1;10462:9;10458:17;10489:1;10484:137;;;;10635:1;10630:341;;;;10451:520;;10484:137;10568:4;10564:9;10553;10549:25;10544:3;10537:38;10604:6;10599:3;10595:16;10588:23;;10484:137;;10630:341;10697:38;10729:5;10697:38;:::i;:::-;10757:1;10771:154;10785:6;10782:1;10779:13;10771:154;;;10859:7;10853:14;10849:1;10844:3;10840:11;10833:35;10909:1;10900:7;10896:15;10885:26;;10807:4;10804:1;10800:12;10795:17;;10771:154;;;10954:6;10949:3;10945:16;10938:23;;10637:334;;10451:520;;10239:738;;10132:845;;;;:::o;10983:366::-;11125:3;11146:67;11210:2;11205:3;11146:67;:::i;:::-;11139:74;;11222:93;11311:3;11222:93;:::i;:::-;11340:2;11335:3;11331:12;11324:19;;10983:366;;;:::o;11355:::-;11497:3;11518:67;11582:2;11577:3;11518:67;:::i;:::-;11511:74;;11594:93;11683:3;11594:93;:::i;:::-;11712:2;11707:3;11703:12;11696:19;;11355:366;;;:::o;11727:402::-;11887:3;11908:85;11990:2;11985:3;11908:85;:::i;:::-;11901:92;;12002:93;12091:3;12002:93;:::i;:::-;12120:2;12115:3;12111:12;12104:19;;11727:402;;;:::o;12135:366::-;12277:3;12298:67;12362:2;12357:3;12298:67;:::i;:::-;12291:74;;12374:93;12463:3;12374:93;:::i;:::-;12492:2;12487:3;12483:12;12476:19;;12135:366;;;:::o;12507:::-;12649:3;12670:67;12734:2;12729:3;12670:67;:::i;:::-;12663:74;;12746:93;12835:3;12746:93;:::i;:::-;12864:2;12859:3;12855:12;12848:19;;12507:366;;;:::o;12879:::-;13021:3;13042:67;13106:2;13101:3;13042:67;:::i;:::-;13035:74;;13118:93;13207:3;13118:93;:::i;:::-;13236:2;13231:3;13227:12;13220:19;;12879:366;;;:::o;13251:::-;13393:3;13414:67;13478:2;13473:3;13414:67;:::i;:::-;13407:74;;13490:93;13579:3;13490:93;:::i;:::-;13608:2;13603:3;13599:12;13592:19;;13251:366;;;:::o;13623:::-;13765:3;13786:67;13850:2;13845:3;13786:67;:::i;:::-;13779:74;;13862:93;13951:3;13862:93;:::i;:::-;13980:2;13975:3;13971:12;13964:19;;13623:366;;;:::o;13995:::-;14137:3;14158:67;14222:2;14217:3;14158:67;:::i;:::-;14151:74;;14234:93;14323:3;14234:93;:::i;:::-;14352:2;14347:3;14343:12;14336:19;;13995:366;;;:::o;14367:400::-;14527:3;14548:84;14630:1;14625:3;14548:84;:::i;:::-;14541:91;;14641:93;14730:3;14641:93;:::i;:::-;14759:1;14754:3;14750:11;14743:18;;14367:400;;;:::o;14773:366::-;14915:3;14936:67;15000:2;14995:3;14936:67;:::i;:::-;14929:74;;15012:93;15101:3;15012:93;:::i;:::-;15130:2;15125:3;15121:12;15114:19;;14773:366;;;:::o;15145:::-;15287:3;15308:67;15372:2;15367:3;15308:67;:::i;:::-;15301:74;;15384:93;15473:3;15384:93;:::i;:::-;15502:2;15497:3;15493:12;15486:19;;15145:366;;;:::o;15517:::-;15659:3;15680:67;15744:2;15739:3;15680:67;:::i;:::-;15673:74;;15756:93;15845:3;15756:93;:::i;:::-;15874:2;15869:3;15865:12;15858:19;;15517:366;;;:::o;15889:::-;16031:3;16052:67;16116:2;16111:3;16052:67;:::i;:::-;16045:74;;16128:93;16217:3;16128:93;:::i;:::-;16246:2;16241:3;16237:12;16230:19;;15889:366;;;:::o;16261:::-;16403:3;16424:67;16488:2;16483:3;16424:67;:::i;:::-;16417:74;;16500:93;16589:3;16500:93;:::i;:::-;16618:2;16613:3;16609:12;16602:19;;16261:366;;;:::o;16633:::-;16775:3;16796:67;16860:2;16855:3;16796:67;:::i;:::-;16789:74;;16872:93;16961:3;16872:93;:::i;:::-;16990:2;16985:3;16981:12;16974:19;;16633:366;;;:::o;17005:::-;17147:3;17168:67;17232:2;17227:3;17168:67;:::i;:::-;17161:74;;17244:93;17333:3;17244:93;:::i;:::-;17362:2;17357:3;17353:12;17346:19;;17005:366;;;:::o;17377:400::-;17537:3;17558:84;17640:1;17635:3;17558:84;:::i;:::-;17551:91;;17651:93;17740:3;17651:93;:::i;:::-;17769:1;17764:3;17760:11;17753:18;;17377:400;;;:::o;17783:366::-;17925:3;17946:67;18010:2;18005:3;17946:67;:::i;:::-;17939:74;;18022:93;18111:3;18022:93;:::i;:::-;18140:2;18135:3;18131:12;18124:19;;17783:366;;;:::o;18155:::-;18297:3;18318:67;18382:2;18377:3;18318:67;:::i;:::-;18311:74;;18394:93;18483:3;18394:93;:::i;:::-;18512:2;18507:3;18503:12;18496:19;;18155:366;;;:::o;18527:::-;18669:3;18690:67;18754:2;18749:3;18690:67;:::i;:::-;18683:74;;18766:93;18855:3;18766:93;:::i;:::-;18884:2;18879:3;18875:12;18868:19;;18527:366;;;:::o;18899:::-;19041:3;19062:67;19126:2;19121:3;19062:67;:::i;:::-;19055:74;;19138:93;19227:3;19138:93;:::i;:::-;19256:2;19251:3;19247:12;19240:19;;18899:366;;;:::o;19271:::-;19413:3;19434:67;19498:2;19493:3;19434:67;:::i;:::-;19427:74;;19510:93;19599:3;19510:93;:::i;:::-;19628:2;19623:3;19619:12;19612:19;;19271:366;;;:::o;19643:::-;19785:3;19806:67;19870:2;19865:3;19806:67;:::i;:::-;19799:74;;19882:93;19971:3;19882:93;:::i;:::-;20000:2;19995:3;19991:12;19984:19;;19643:366;;;:::o;20015:::-;20157:3;20178:67;20242:2;20237:3;20178:67;:::i;:::-;20171:74;;20254:93;20343:3;20254:93;:::i;:::-;20372:2;20367:3;20363:12;20356:19;;20015:366;;;:::o;20387:::-;20529:3;20550:67;20614:2;20609:3;20550:67;:::i;:::-;20543:74;;20626:93;20715:3;20626:93;:::i;:::-;20744:2;20739:3;20735:12;20728:19;;20387:366;;;:::o;20759:400::-;20919:3;20940:84;21022:1;21017:3;20940:84;:::i;:::-;20933:91;;21033:93;21122:3;21033:93;:::i;:::-;21151:1;21146:3;21142:11;21135:18;;20759:400;;;:::o;21165:366::-;21307:3;21328:67;21392:2;21387:3;21328:67;:::i;:::-;21321:74;;21404:93;21493:3;21404:93;:::i;:::-;21522:2;21517:3;21513:12;21506:19;;21165:366;;;:::o;21537:::-;21679:3;21700:67;21764:2;21759:3;21700:67;:::i;:::-;21693:74;;21776:93;21865:3;21776:93;:::i;:::-;21894:2;21889:3;21885:12;21878:19;;21537:366;;;:::o;21909:::-;22051:3;22072:67;22136:2;22131:3;22072:67;:::i;:::-;22065:74;;22148:93;22237:3;22148:93;:::i;:::-;22266:2;22261:3;22257:12;22250:19;;21909:366;;;:::o;22281:::-;22423:3;22444:67;22508:2;22503:3;22444:67;:::i;:::-;22437:74;;22520:93;22609:3;22520:93;:::i;:::-;22638:2;22633:3;22629:12;22622:19;;22281:366;;;:::o;22653:::-;22795:3;22816:67;22880:2;22875:3;22816:67;:::i;:::-;22809:74;;22892:93;22981:3;22892:93;:::i;:::-;23010:2;23005:3;23001:12;22994:19;;22653:366;;;:::o;23025:398::-;23184:3;23205:83;23286:1;23281:3;23205:83;:::i;:::-;23198:90;;23297:93;23386:3;23297:93;:::i;:::-;23415:1;23410:3;23406:11;23399:18;;23025:398;;;:::o;23429:366::-;23571:3;23592:67;23656:2;23651:3;23592:67;:::i;:::-;23585:74;;23668:93;23757:3;23668:93;:::i;:::-;23786:2;23781:3;23777:12;23770:19;;23429:366;;;:::o;23801:::-;23943:3;23964:67;24028:2;24023:3;23964:67;:::i;:::-;23957:74;;24040:93;24129:3;24040:93;:::i;:::-;24158:2;24153:3;24149:12;24142:19;;23801:366;;;:::o;24173:::-;24315:3;24336:67;24400:2;24395:3;24336:67;:::i;:::-;24329:74;;24412:93;24501:3;24412:93;:::i;:::-;24530:2;24525:3;24521:12;24514:19;;24173:366;;;:::o;24545:::-;24687:3;24708:67;24772:2;24767:3;24708:67;:::i;:::-;24701:74;;24784:93;24873:3;24784:93;:::i;:::-;24902:2;24897:3;24893:12;24886:19;;24545:366;;;:::o;24917:::-;25059:3;25080:67;25144:2;25139:3;25080:67;:::i;:::-;25073:74;;25156:93;25245:3;25156:93;:::i;:::-;25274:2;25269:3;25265:12;25258:19;;24917:366;;;:::o;25289:118::-;25376:24;25394:5;25376:24;:::i;:::-;25371:3;25364:37;25289:118;;:::o;25413:112::-;25496:22;25512:5;25496:22;:::i;:::-;25491:3;25484:35;25413:112;;:::o;25531:695::-;25809:3;25831:92;25919:3;25910:6;25831:92;:::i;:::-;25824:99;;25940:95;26031:3;26022:6;25940:95;:::i;:::-;25933:102;;26052:148;26196:3;26052:148;:::i;:::-;26045:155;;26217:3;26210:10;;25531:695;;;;;:::o;26232:807::-;26566:3;26588:148;26732:3;26588:148;:::i;:::-;26581:155;;26753:95;26844:3;26835:6;26753:95;:::i;:::-;26746:102;;26865:148;27009:3;26865:148;:::i;:::-;26858:155;;27030:3;27023:10;;26232:807;;;;:::o;27045:663::-;27286:3;27308:148;27452:3;27308:148;:::i;:::-;27301:155;;27466:75;27537:3;27528:6;27466:75;:::i;:::-;27566:2;27561:3;27557:12;27550:19;;27579:75;27650:3;27641:6;27579:75;:::i;:::-;27679:2;27674:3;27670:12;27663:19;;27699:3;27692:10;;27045:663;;;;;:::o;27714:379::-;27898:3;27920:147;28063:3;27920:147;:::i;:::-;27913:154;;28084:3;28077:10;;27714:379;;;:::o;28099:222::-;28192:4;28230:2;28219:9;28215:18;28207:26;;28243:71;28311:1;28300:9;28296:17;28287:6;28243:71;:::i;:::-;28099:222;;;;:::o;28327:254::-;28436:4;28474:2;28463:9;28459:18;28451:26;;28487:87;28571:1;28560:9;28556:17;28547:6;28487:87;:::i;:::-;28327:254;;;;:::o;28587:640::-;28782:4;28820:3;28809:9;28805:19;28797:27;;28834:71;28902:1;28891:9;28887:17;28878:6;28834:71;:::i;:::-;28915:72;28983:2;28972:9;28968:18;28959:6;28915:72;:::i;:::-;28997;29065:2;29054:9;29050:18;29041:6;28997:72;:::i;:::-;29116:9;29110:4;29106:20;29101:2;29090:9;29086:18;29079:48;29144:76;29215:4;29206:6;29144:76;:::i;:::-;29136:84;;28587:640;;;;;;;:::o;29233:210::-;29320:4;29358:2;29347:9;29343:18;29335:26;;29371:65;29433:1;29422:9;29418:17;29409:6;29371:65;:::i;:::-;29233:210;;;;:::o;29449:553::-;29626:4;29664:3;29653:9;29649:19;29641:27;;29678:71;29746:1;29735:9;29731:17;29722:6;29678:71;:::i;:::-;29759:72;29827:2;29816:9;29812:18;29803:6;29759:72;:::i;:::-;29841;29909:2;29898:9;29894:18;29885:6;29841:72;:::i;:::-;29923;29991:2;29980:9;29976:18;29967:6;29923:72;:::i;:::-;29449:553;;;;;;;:::o;30008:664::-;30213:4;30251:3;30240:9;30236:19;30228:27;;30265:71;30333:1;30322:9;30318:17;30309:6;30265:71;:::i;:::-;30346:72;30414:2;30403:9;30399:18;30390:6;30346:72;:::i;:::-;30428;30496:2;30485:9;30481:18;30472:6;30428:72;:::i;:::-;30510;30578:2;30567:9;30563:18;30554:6;30510:72;:::i;:::-;30592:73;30660:3;30649:9;30645:19;30636:6;30592:73;:::i;:::-;30008:664;;;;;;;;:::o;30678:545::-;30851:4;30889:3;30878:9;30874:19;30866:27;;30903:71;30971:1;30960:9;30956:17;30947:6;30903:71;:::i;:::-;30984:68;31048:2;31037:9;31033:18;31024:6;30984:68;:::i;:::-;31062:72;31130:2;31119:9;31115:18;31106:6;31062:72;:::i;:::-;31144;31212:2;31201:9;31197:18;31188:6;31144:72;:::i;:::-;30678:545;;;;;;;:::o;31229:313::-;31342:4;31380:2;31369:9;31365:18;31357:26;;31429:9;31423:4;31419:20;31415:1;31404:9;31400:17;31393:47;31457:78;31530:4;31521:6;31457:78;:::i;:::-;31449:86;;31229:313;;;;:::o;31548:419::-;31714:4;31752:2;31741:9;31737:18;31729:26;;31801:9;31795:4;31791:20;31787:1;31776:9;31772:17;31765:47;31829:131;31955:4;31829:131;:::i;:::-;31821:139;;31548:419;;;:::o;31973:::-;32139:4;32177:2;32166:9;32162:18;32154:26;;32226:9;32220:4;32216:20;32212:1;32201:9;32197:17;32190:47;32254:131;32380:4;32254:131;:::i;:::-;32246:139;;31973:419;;;:::o;32398:::-;32564:4;32602:2;32591:9;32587:18;32579:26;;32651:9;32645:4;32641:20;32637:1;32626:9;32622:17;32615:47;32679:131;32805:4;32679:131;:::i;:::-;32671:139;;32398:419;;;:::o;32823:::-;32989:4;33027:2;33016:9;33012:18;33004:26;;33076:9;33070:4;33066:20;33062:1;33051:9;33047:17;33040:47;33104:131;33230:4;33104:131;:::i;:::-;33096:139;;32823:419;;;:::o;33248:::-;33414:4;33452:2;33441:9;33437:18;33429:26;;33501:9;33495:4;33491:20;33487:1;33476:9;33472:17;33465:47;33529:131;33655:4;33529:131;:::i;:::-;33521:139;;33248:419;;;:::o;33673:::-;33839:4;33877:2;33866:9;33862:18;33854:26;;33926:9;33920:4;33916:20;33912:1;33901:9;33897:17;33890:47;33954:131;34080:4;33954:131;:::i;:::-;33946:139;;33673:419;;;:::o;34098:::-;34264:4;34302:2;34291:9;34287:18;34279:26;;34351:9;34345:4;34341:20;34337:1;34326:9;34322:17;34315:47;34379:131;34505:4;34379:131;:::i;:::-;34371:139;;34098:419;;;:::o;34523:::-;34689:4;34727:2;34716:9;34712:18;34704:26;;34776:9;34770:4;34766:20;34762:1;34751:9;34747:17;34740:47;34804:131;34930:4;34804:131;:::i;:::-;34796:139;;34523:419;;;:::o;34948:::-;35114:4;35152:2;35141:9;35137:18;35129:26;;35201:9;35195:4;35191:20;35187:1;35176:9;35172:17;35165:47;35229:131;35355:4;35229:131;:::i;:::-;35221:139;;34948:419;;;:::o;35373:::-;35539:4;35577:2;35566:9;35562:18;35554:26;;35626:9;35620:4;35616:20;35612:1;35601:9;35597:17;35590:47;35654:131;35780:4;35654:131;:::i;:::-;35646:139;;35373:419;;;:::o;35798:::-;35964:4;36002:2;35991:9;35987:18;35979:26;;36051:9;36045:4;36041:20;36037:1;36026:9;36022:17;36015:47;36079:131;36205:4;36079:131;:::i;:::-;36071:139;;35798:419;;;:::o;36223:::-;36389:4;36427:2;36416:9;36412:18;36404:26;;36476:9;36470:4;36466:20;36462:1;36451:9;36447:17;36440:47;36504:131;36630:4;36504:131;:::i;:::-;36496:139;;36223:419;;;:::o;36648:::-;36814:4;36852:2;36841:9;36837:18;36829:26;;36901:9;36895:4;36891:20;36887:1;36876:9;36872:17;36865:47;36929:131;37055:4;36929:131;:::i;:::-;36921:139;;36648:419;;;:::o;37073:::-;37239:4;37277:2;37266:9;37262:18;37254:26;;37326:9;37320:4;37316:20;37312:1;37301:9;37297:17;37290:47;37354:131;37480:4;37354:131;:::i;:::-;37346:139;;37073:419;;;:::o;37498:::-;37664:4;37702:2;37691:9;37687:18;37679:26;;37751:9;37745:4;37741:20;37737:1;37726:9;37722:17;37715:47;37779:131;37905:4;37779:131;:::i;:::-;37771:139;;37498:419;;;:::o;37923:::-;38089:4;38127:2;38116:9;38112:18;38104:26;;38176:9;38170:4;38166:20;38162:1;38151:9;38147:17;38140:47;38204:131;38330:4;38204:131;:::i;:::-;38196:139;;37923:419;;;:::o;38348:::-;38514:4;38552:2;38541:9;38537:18;38529:26;;38601:9;38595:4;38591:20;38587:1;38576:9;38572:17;38565:47;38629:131;38755:4;38629:131;:::i;:::-;38621:139;;38348:419;;;:::o;38773:::-;38939:4;38977:2;38966:9;38962:18;38954:26;;39026:9;39020:4;39016:20;39012:1;39001:9;38997:17;38990:47;39054:131;39180:4;39054:131;:::i;:::-;39046:139;;38773:419;;;:::o;39198:::-;39364:4;39402:2;39391:9;39387:18;39379:26;;39451:9;39445:4;39441:20;39437:1;39426:9;39422:17;39415:47;39479:131;39605:4;39479:131;:::i;:::-;39471:139;;39198:419;;;:::o;39623:::-;39789:4;39827:2;39816:9;39812:18;39804:26;;39876:9;39870:4;39866:20;39862:1;39851:9;39847:17;39840:47;39904:131;40030:4;39904:131;:::i;:::-;39896:139;;39623:419;;;:::o;40048:::-;40214:4;40252:2;40241:9;40237:18;40229:26;;40301:9;40295:4;40291:20;40287:1;40276:9;40272:17;40265:47;40329:131;40455:4;40329:131;:::i;:::-;40321:139;;40048:419;;;:::o;40473:::-;40639:4;40677:2;40666:9;40662:18;40654:26;;40726:9;40720:4;40716:20;40712:1;40701:9;40697:17;40690:47;40754:131;40880:4;40754:131;:::i;:::-;40746:139;;40473:419;;;:::o;40898:::-;41064:4;41102:2;41091:9;41087:18;41079:26;;41151:9;41145:4;41141:20;41137:1;41126:9;41122:17;41115:47;41179:131;41305:4;41179:131;:::i;:::-;41171:139;;40898:419;;;:::o;41323:::-;41489:4;41527:2;41516:9;41512:18;41504:26;;41576:9;41570:4;41566:20;41562:1;41551:9;41547:17;41540:47;41604:131;41730:4;41604:131;:::i;:::-;41596:139;;41323:419;;;:::o;41748:::-;41914:4;41952:2;41941:9;41937:18;41929:26;;42001:9;41995:4;41991:20;41987:1;41976:9;41972:17;41965:47;42029:131;42155:4;42029:131;:::i;:::-;42021:139;;41748:419;;;:::o;42173:::-;42339:4;42377:2;42366:9;42362:18;42354:26;;42426:9;42420:4;42416:20;42412:1;42401:9;42397:17;42390:47;42454:131;42580:4;42454:131;:::i;:::-;42446:139;;42173:419;;;:::o;42598:::-;42764:4;42802:2;42791:9;42787:18;42779:26;;42851:9;42845:4;42841:20;42837:1;42826:9;42822:17;42815:47;42879:131;43005:4;42879:131;:::i;:::-;42871:139;;42598:419;;;:::o;43023:::-;43189:4;43227:2;43216:9;43212:18;43204:26;;43276:9;43270:4;43266:20;43262:1;43251:9;43247:17;43240:47;43304:131;43430:4;43304:131;:::i;:::-;43296:139;;43023:419;;;:::o;43448:::-;43614:4;43652:2;43641:9;43637:18;43629:26;;43701:9;43695:4;43691:20;43687:1;43676:9;43672:17;43665:47;43729:131;43855:4;43729:131;:::i;:::-;43721:139;;43448:419;;;:::o;43873:::-;44039:4;44077:2;44066:9;44062:18;44054:26;;44126:9;44120:4;44116:20;44112:1;44101:9;44097:17;44090:47;44154:131;44280:4;44154:131;:::i;:::-;44146:139;;43873:419;;;:::o;44298:::-;44464:4;44502:2;44491:9;44487:18;44479:26;;44551:9;44545:4;44541:20;44537:1;44526:9;44522:17;44515:47;44579:131;44705:4;44579:131;:::i;:::-;44571:139;;44298:419;;;:::o;44723:::-;44889:4;44927:2;44916:9;44912:18;44904:26;;44976:9;44970:4;44966:20;44962:1;44951:9;44947:17;44940:47;45004:131;45130:4;45004:131;:::i;:::-;44996:139;;44723:419;;;:::o;45148:::-;45314:4;45352:2;45341:9;45337:18;45329:26;;45401:9;45395:4;45391:20;45387:1;45376:9;45372:17;45365:47;45429:131;45555:4;45429:131;:::i;:::-;45421:139;;45148:419;;;:::o;45573:222::-;45666:4;45704:2;45693:9;45689:18;45681:26;;45717:71;45785:1;45774:9;45770:17;45761:6;45717:71;:::i;:::-;45573:222;;;;:::o;45801:724::-;45878:4;45884:6;45940:11;45927:25;46040:1;46034:4;46030:12;46019:8;46003:14;45999:29;45995:48;45975:18;45971:73;45961:168;;46048:79;;:::i;:::-;45961:168;46160:18;46150:8;46146:33;46138:41;;46212:4;46199:18;46189:28;;46240:18;46232:6;46229:30;46226:117;;;46262:79;;:::i;:::-;46226:117;46370:2;46364:4;46360:13;46352:21;;46427:4;46419:6;46415:17;46399:14;46395:38;46389:4;46385:49;46382:136;;;46437:79;;:::i;:::-;46382:136;45891:634;45801:724;;;;;:::o;46531:129::-;46565:6;46592:20;;:::i;:::-;46582:30;;46621:33;46649:4;46641:6;46621:33;:::i;:::-;46531:129;;;:::o;46666:75::-;46699:6;46732:2;46726:9;46716:19;;46666:75;:::o;46747:307::-;46808:4;46898:18;46890:6;46887:30;46884:56;;;46920:18;;:::i;:::-;46884:56;46958:29;46980:6;46958:29;:::i;:::-;46950:37;;47042:4;47036;47032:15;47024:23;;46747:307;;;:::o;47060:308::-;47122:4;47212:18;47204:6;47201:30;47198:56;;;47234:18;;:::i;:::-;47198:56;47272:29;47294:6;47272:29;:::i;:::-;47264:37;;47356:4;47350;47346:15;47338:23;;47060:308;;;:::o;47374:141::-;47423:4;47446:3;47438:11;;47469:3;47466:1;47459:14;47503:4;47500:1;47490:18;47482:26;;47374:141;;;:::o;47521:98::-;47572:6;47606:5;47600:12;47590:22;;47521:98;;;:::o;47625:99::-;47677:6;47711:5;47705:12;47695:22;;47625:99;;;:::o;47730:168::-;47813:11;47847:6;47842:3;47835:19;47887:4;47882:3;47878:14;47863:29;;47730:168;;;;:::o;47904:147::-;48005:11;48042:3;48027:18;;47904:147;;;;:::o;48057:169::-;48141:11;48175:6;48170:3;48163:19;48215:4;48210:3;48206:14;48191:29;;48057:169;;;;:::o;48232:148::-;48334:11;48371:3;48356:18;;48232:148;;;;:::o;48386:305::-;48426:3;48445:20;48463:1;48445:20;:::i;:::-;48440:25;;48479:20;48497:1;48479:20;:::i;:::-;48474:25;;48633:1;48565:66;48561:74;48558:1;48555:81;48552:107;;;48639:18;;:::i;:::-;48552:107;48683:1;48680;48676:9;48669:16;;48386:305;;;;:::o;48697:185::-;48737:1;48754:20;48772:1;48754:20;:::i;:::-;48749:25;;48788:20;48806:1;48788:20;:::i;:::-;48783:25;;48827:1;48817:35;;48832:18;;:::i;:::-;48817:35;48874:1;48871;48867:9;48862:14;;48697:185;;;;:::o;48888:348::-;48928:7;48951:20;48969:1;48951:20;:::i;:::-;48946:25;;48985:20;49003:1;48985:20;:::i;:::-;48980:25;;49173:1;49105:66;49101:74;49098:1;49095:81;49090:1;49083:9;49076:17;49072:105;49069:131;;;49180:18;;:::i;:::-;49069:131;49228:1;49225;49221:9;49210:20;;48888:348;;;;:::o;49242:191::-;49282:4;49302:20;49320:1;49302:20;:::i;:::-;49297:25;;49336:20;49354:1;49336:20;:::i;:::-;49331:25;;49375:1;49372;49369:8;49366:34;;;49380:18;;:::i;:::-;49366:34;49425:1;49422;49418:9;49410:17;;49242:191;;;;:::o;49439:96::-;49476:7;49505:24;49523:5;49505:24;:::i;:::-;49494:35;;49439:96;;;:::o;49541:104::-;49586:7;49615:24;49633:5;49615:24;:::i;:::-;49604:35;;49541:104;;;:::o;49651:90::-;49685:7;49728:5;49721:13;49714:21;49703:32;;49651:90;;;:::o;49747:77::-;49784:7;49813:5;49802:16;;49747:77;;;:::o;49830:149::-;49866:7;49906:66;49899:5;49895:78;49884:89;;49830:149;;;:::o;49985:126::-;50022:7;50062:42;50055:5;50051:54;50040:65;;49985:126;;;:::o;50117:77::-;50154:7;50183:5;50172:16;;50117:77;;;:::o;50200:86::-;50235:7;50275:4;50268:5;50264:16;50253:27;;50200:86;;;:::o;50292:154::-;50376:6;50371:3;50366;50353:30;50438:1;50429:6;50424:3;50420:16;50413:27;50292:154;;;:::o;50452:307::-;50520:1;50530:113;50544:6;50541:1;50538:13;50530:113;;;50629:1;50624:3;50620:11;50614:18;50610:1;50605:3;50601:11;50594:39;50566:2;50563:1;50559:10;50554:15;;50530:113;;;50661:6;50658:1;50655:13;50652:101;;;50741:1;50732:6;50727:3;50723:16;50716:27;50652:101;50501:258;50452:307;;;:::o;50765:320::-;50809:6;50846:1;50840:4;50836:12;50826:22;;50893:1;50887:4;50883:12;50914:18;50904:81;;50970:4;50962:6;50958:17;50948:27;;50904:81;51032:2;51024:6;51021:14;51001:18;50998:38;50995:84;;;51051:18;;:::i;:::-;50995:84;50816:269;50765:320;;;:::o;51091:281::-;51174:27;51196:4;51174:27;:::i;:::-;51166:6;51162:40;51304:6;51292:10;51289:22;51268:18;51256:10;51253:34;51250:62;51247:88;;;51315:18;;:::i;:::-;51247:88;51355:10;51351:2;51344:22;51134:238;51091:281;;:::o;51378:233::-;51417:3;51440:24;51458:5;51440:24;:::i;:::-;51431:33;;51486:66;51479:5;51476:77;51473:103;;;51556:18;;:::i;:::-;51473:103;51603:1;51596:5;51592:13;51585:20;;51378:233;;;:::o;51617:79::-;51656:7;51685:5;51674:16;;51617:79;;;:::o;51702:176::-;51734:1;51751:20;51769:1;51751:20;:::i;:::-;51746:25;;51785:20;51803:1;51785:20;:::i;:::-;51780:25;;51824:1;51814:35;;51829:18;;:::i;:::-;51814:35;51870:1;51867;51863:9;51858:14;;51702:176;;;;:::o;51884:180::-;51932:77;51929:1;51922:88;52029:4;52026:1;52019:15;52053:4;52050:1;52043:15;52070:180;52118:77;52115:1;52108:88;52215:4;52212:1;52205:15;52239:4;52236:1;52229:15;52256:180;52304:77;52301:1;52294:88;52401:4;52398:1;52391:15;52425:4;52422:1;52415:15;52442:180;52490:77;52487:1;52480:88;52587:4;52584:1;52577:15;52611:4;52608:1;52601:15;52628:180;52676:77;52673:1;52666:88;52773:4;52770:1;52763:15;52797:4;52794:1;52787:15;52814:180;52862:77;52859:1;52852:88;52959:4;52956:1;52949:15;52983:4;52980:1;52973:15;53000:180;53048:77;53045:1;53038:88;53145:4;53142:1;53135:15;53169:4;53166:1;53159:15;53186:117;53295:1;53292;53285:12;53309:117;53418:1;53415;53408:12;53432:117;53541:1;53538;53531:12;53555:117;53664:1;53661;53654:12;53678:117;53787:1;53784;53777:12;53801:117;53910:1;53907;53900:12;53924:117;54033:1;54030;54023:12;54047:117;54156:1;54153;54146:12;54170:102;54211:6;54262:2;54258:7;54253:2;54246:5;54242:14;54238:28;54228:38;;54170:102;;;:::o;54278:174::-;54418:26;54414:1;54406:6;54402:14;54395:50;54278:174;:::o;54458:224::-;54598:34;54594:1;54586:6;54582:14;54575:58;54667:7;54662:2;54654:6;54650:15;54643:32;54458:224;:::o;54688:168::-;54828:20;54824:1;54816:6;54812:14;54805:44;54688:168;:::o;54862:181::-;55002:33;54998:1;54990:6;54986:14;54979:57;54862:181;:::o;55049:230::-;55189:34;55185:1;55177:6;55173:14;55166:58;55258:13;55253:2;55245:6;55241:15;55234:38;55049:230;:::o;55285:237::-;55425:34;55421:1;55413:6;55409:14;55402:58;55494:20;55489:2;55481:6;55477:15;55470:45;55285:237;:::o;55528:225::-;55668:34;55664:1;55656:6;55652:14;55645:58;55737:8;55732:2;55724:6;55720:15;55713:33;55528:225;:::o;55759:165::-;55899:17;55895:1;55887:6;55883:14;55876:41;55759:165;:::o;55930:178::-;56070:30;56066:1;56058:6;56054:14;56047:54;55930:178;:::o;56114:214::-;56254:66;56250:1;56242:6;56238:14;56231:90;56114:214;:::o;56334:223::-;56474:34;56470:1;56462:6;56458:14;56451:58;56543:6;56538:2;56530:6;56526:15;56519:31;56334:223;:::o;56563:175::-;56703:27;56699:1;56691:6;56687:14;56680:51;56563:175;:::o;56744:221::-;56884:34;56880:1;56872:6;56868:14;56861:58;56953:4;56948:2;56940:6;56936:15;56929:29;56744:221;:::o;56971:231::-;57111:34;57107:1;57099:6;57095:14;57088:58;57180:14;57175:2;57167:6;57163:15;57156:39;56971:231;:::o;57208:167::-;57348:19;57344:1;57336:6;57332:14;57325:43;57208:167;:::o;57381:180::-;57521:32;57517:1;57509:6;57505:14;57498:56;57381:180;:::o;57567:182::-;57707:34;57703:1;57695:6;57691:14;57684:58;57567:182;:::o;57755:154::-;57895:6;57891:1;57883:6;57879:14;57872:30;57755:154;:::o;57915:243::-;58055:34;58051:1;58043:6;58039:14;58032:58;58124:26;58119:2;58111:6;58107:15;58100:51;57915:243;:::o;58164:229::-;58304:34;58300:1;58292:6;58288:14;58281:58;58373:12;58368:2;58360:6;58356:15;58349:37;58164:229;:::o;58399:228::-;58539:34;58535:1;58527:6;58523:14;58516:58;58608:11;58603:2;58595:6;58591:15;58584:36;58399:228;:::o;58633:224::-;58773:34;58769:1;58761:6;58757:14;58750:58;58842:7;58837:2;58829:6;58825:15;58818:32;58633:224;:::o;58863:221::-;59003:34;58999:1;58991:6;58987:14;58980:58;59072:4;59067:2;59059:6;59055:15;59048:29;58863:221;:::o;59090:182::-;59230:34;59226:1;59218:6;59214:14;59207:58;59090:182;:::o;59278:228::-;59418:34;59414:1;59406:6;59402:14;59395:58;59487:11;59482:2;59474:6;59470:15;59463:36;59278:228;:::o;59512:231::-;59652:34;59648:1;59640:6;59636:14;59629:58;59721:14;59716:2;59708:6;59704:15;59697:39;59512:231;:::o;59749:155::-;59889:7;59885:1;59877:6;59873:14;59866:31;59749:155;:::o;59910:182::-;60050:34;60046:1;60038:6;60034:14;60027:58;59910:182;:::o;60098:228::-;60238:34;60234:1;60226:6;60222:14;60215:58;60307:11;60302:2;60294:6;60290:15;60283:36;60098:228;:::o;60332:173::-;60472:25;60468:1;60460:6;60456:14;60449:49;60332:173;:::o;60511:174::-;60651:26;60647:1;60639:6;60635:14;60628:50;60511:174;:::o;60691:220::-;60831:34;60827:1;60819:6;60815:14;60808:58;60900:3;60895:2;60887:6;60883:15;60876:28;60691:220;:::o;60917:114::-;;:::o;61037:236::-;61177:34;61173:1;61165:6;61161:14;61154:58;61246:19;61241:2;61233:6;61229:15;61222:44;61037:236;:::o;61279:171::-;61419:23;61415:1;61407:6;61403:14;61396:47;61279:171;:::o;61456:231::-;61596:34;61592:1;61584:6;61580:14;61573:58;61665:14;61660:2;61652:6;61648:15;61641:39;61456:231;:::o;61693:181::-;61833:33;61829:1;61821:6;61817:14;61810:57;61693:181;:::o;61880:172::-;62020:24;62016:1;62008:6;62004:14;61997:48;61880:172;:::o;62058:122::-;62131:24;62149:5;62131:24;:::i;:::-;62124:5;62121:35;62111:63;;62170:1;62167;62160:12;62111:63;62058:122;:::o;62186:116::-;62256:21;62271:5;62256:21;:::i;:::-;62249:5;62246:32;62236:60;;62292:1;62289;62282:12;62236:60;62186:116;:::o;62308:120::-;62380:23;62397:5;62380:23;:::i;:::-;62373:5;62370:34;62360:62;;62418:1;62415;62408:12;62360:62;62308:120;:::o;62434:122::-;62507:24;62525:5;62507:24;:::i;:::-;62500:5;62497:35;62487:63;;62546:1;62543;62536:12;62487:63;62434:122;:::o

Swarm Source

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