ETH Price: $3,374.21 (-1.22%)
Gas: 11 Gwei

Token

nobody (nobody)
 

Overview

Max Total Supply

3,210 nobody

Holders

1,205

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
525960.eth
Balance
2 nobody
0x97013995b4866f7279e2bf6dbd7677529b21a762
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A visual (mis)interpretation of the modern nobody.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Nobody

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: node_modules\@openzeppelin\contracts\utils\math\SafeMath.sol";

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

// File: node_modules\@openzeppelin\contracts\token\ERC721\IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: node_modules\@openzeppelin\contracts\token\ERC721\IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: node_modules\@openzeppelin\contracts\token\ERC721\extensions\IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

// File: node_modules\@openzeppelin\contracts\token\ERC721\ERC721.sol



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: node_modules\@openzeppelin\contracts\token\ERC721\extensions\IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin\contracts\token\ERC721\extensions\ERC721Enumerable.sol



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts\SafeMathUint.sol



pragma solidity ^0.8.0;
/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

// File: contracts\TraitsofNobody.sol



pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;


contract TraitsofNobody {
  struct Trait {
    string id;
    uint score;
  }

  uint constant internal maxRarityScore = 100;
  uint internal nonce = 3210;
  mapping (string => bool) public foundDNAs;

  Trait[][] internal traitTable;
  Trait[12]  internal xs;
  Trait[8]  internal head;
  Trait[12]  internal mask;
  Trait[9] internal lfeye;
  Trait[9] internal rteye;
  Trait[9]  internal mouth;
  Trait[4]  internal bg;

  constructor() {
    _setTraitTable();
  }

  function _getNobody(uint _salt) internal returns (string memory) {
    while (true) {
      string memory id = "";
      for (uint i=0; i<traitTable.length-1; i++) {
        Trait[] memory traitPool = traitTable[i];
        string memory traitId = _findTraits(traitPool, _salt);
        id = string(abi.encodePacked(id, traitId));
      }
      if (foundDNAs[id] == false) {
        foundDNAs[id] = true;
        Trait[] memory traitPool = traitTable[traitTable.length-1];
        string memory traitId = _findTraits(traitPool, _salt);
        id = string(abi.encodePacked(id, traitId));
        return id;
      }

    }
  }

  function _findTraits(Trait[] memory _traits, uint _salt) internal returns (string memory) {
    uint r = _random(_salt, maxRarityScore);
    string memory foundTrait;
    uint found;
    for (uint i=0; i<_traits.length; i++) {
      if (_traits[i].score <= r) {
        if (found == 0) {
          foundTrait = _traits[i].id;
          found = 1;
        }else{
          if (_random(_salt, 2) > 0) {
            foundTrait = _traits[i].id;
          }
        }
      }
    }
    return foundTrait;
  }

  function _setTraitTable() internal {

    rteye[0] = Trait("0", 0);
    rteye[1] = Trait("1", 20);
    rteye[2] = Trait("2", 40);
    rteye[3] = Trait("3", 50);
    rteye[4] = Trait("4", 60);
    rteye[5] = Trait("5", 70);
    rteye[6] = Trait("6", 80);
    rteye[7] = Trait("7", 90);
    rteye[8] = Trait("8", 95);

    head[0] = Trait("0", 0);
    head[1] = Trait("1", 15);
    head[2] = Trait("2", 25);
    head[3] = Trait("3", 35);
    head[4] = Trait("4", 40);
    head[5] = Trait("5", 50);
    head[6] = Trait("6", 75);
    head[7] = Trait("7", 90);
   
    mask[0] = Trait("0", 0);
    mask[1] = Trait("1", 10);
    mask[2] = Trait("2", 20);
    mask[3] = Trait("3", 30);
    mask[4] = Trait("4", 40);
    mask[5] = Trait("5", 50);
    mask[6] = Trait("6", 50);
    mask[7] = Trait("7", 50);
    mask[8] = Trait("8", 50);
    mask[9] = Trait("9", 50);
    mask[10] = Trait("a", 90);
    mask[11] = Trait("b", 95);

    xs[0] = Trait("0", 0);
    xs[1] = Trait("1", 5);
    xs[2] = Trait("2", 10);
    xs[3] = Trait("3", 25);
    xs[4] = Trait("4", 40);
    xs[5] = Trait("5", 50);
    xs[6] = Trait("6", 55);
    xs[7] = Trait("7", 60);
    xs[8] = Trait("8", 70);
    xs[9] = Trait("9", 80);
    xs[10] = Trait("a", 90);
    xs[11] = Trait("b", 95);

    mouth[0] = Trait("0", 0);
    mouth[1] = Trait("1", 20);
    mouth[2] = Trait("2", 40);
    mouth[3] = Trait("3", 50);
    mouth[4] = Trait("4", 60);
    mouth[5] = Trait("5", 70);
    mouth[6] = Trait("6", 80);
    mouth[7] = Trait("7", 90);
    mouth[8] = Trait("8", 95);

    lfeye[0] = Trait("0", 0);
    lfeye[1] = Trait("1", 10);
    lfeye[2] = Trait("2", 20);
    lfeye[3] = Trait("3", 30);
    lfeye[4] = Trait("4", 40);
    lfeye[5] = Trait("5", 50);
    lfeye[6] = Trait("6", 60);
    lfeye[7] = Trait("7", 80);
    lfeye[8] = Trait("8", 90);

    bg[0] = Trait("0", 0);
    bg[1] = Trait("1", 50);
    bg[2] = Trait("2", 75);
    bg[3] = Trait("3", 90);

    traitTable.push(rteye);
    traitTable.push(head);
    traitTable.push(mask);
    traitTable.push(xs);
    traitTable.push(mouth);
    traitTable.push(lfeye);
    traitTable.push(bg);
  }


  function _random(uint _salt, uint _limit) internal returns (uint) {
    uint r = (uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce, _salt)))) % _limit;
    nonce++;
    return r;
  }


  function _substring(string memory str, uint startIndex, uint endIndex) internal pure returns (string memory) {
    bytes memory strBytes = bytes(str);
    bytes memory result = new bytes(endIndex-startIndex);
    for(uint i = startIndex; i < endIndex; i++) {
        result[i-startIndex] = strBytes[i];
    }
    return string(result);
  }

}

// File: contracts\nobody.sol

// SPDX-License-Identifier: UNLICENSED

//             ¸ ..
//           « *‡ ‰  ›
//             ª ¨ ™
//        _--- -- -- ---_ 
//       /   ¸ ¸ ¸       \       ¸    
//      ¦|  [  X ]  (  •}|¦      º±_
//      ¦|            ¨¨¨|¦      ”\\ 
//       \   =# # # #=   /                
//        ¯--- -- -- ---¯ 
//
//      _.    _.           ¦|                      |¦
//      _|\\  _|           ¦|                      |¦   _.   _. 
//      _| \\ _|   //¨¸¨\  ¦|ˆˆ¸ˆ\   //¨¸¨\   /ˆ¸ˆˆ|¦   _|   _|
//      _|  \\_|   \____/   \\___/   \____/   \____//   _|____|
//                                                            |
//                                                        _| _|

pragma solidity ^0.8.0;

interface theDudes
{
    function ownerOf (uint256 tokenid) external view returns (address);
    function dudes (uint256 tokenid) external view returns (string memory);
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

contract Nobody is ERC721Enumerable, TraitsofNobody, Ownable {
  using SafeMath for uint256;
  using SafeMath for uint8;
  using SafeMathUint for uint256;

  uint public maxNobody = 3210;
  uint public maxNobodyPerPurchase = 10;
  uint256 public price = 30000000000000000; // 0.030 Ether

  bool public isSaleActive = false;
  bool public isClaimActive = false;
  string public baseURI;
  
  mapping(uint256 => bool) public claimedTokenIds; //the Dudes tokenId
  mapping (uint => string) public nobody;

  address public thedudesaddress = 0xB0cf7Da8dc482997525BE8488B9caD4F44315422; 

  theDudes thedudescontract = theDudes(thedudesaddress);  
    
  address public creator = 0x7ddD43C63aa73CDE4c5aa6b5De5D9681882D88f8; 

  constructor (uint _maxNobody, uint _maxNobodyPerPurchase ) ERC721("nobody", "nobody") {
    maxNobody = _maxNobody;
    maxNobodyPerPurchase = _maxNobodyPerPurchase;
    _mint(creator, 1, 385906);
  }

  function claimAll(address _owner) public {
    require(isClaimActive, "Claim is not active yet.");
    require(!allClaimed(_owner), "All your tokens are claimed.");
    int256[] memory tokenIds = claimableOf(_owner);
    for (uint256 i = 0; i < tokenIds.length; i++) {
      if (tokenIds[i] != -1) {
        claim(uint256(tokenIds[i]));
      }
    }
  }

  function claim(uint256 _tokenId) public {
    require(isClaimActive, "Claim is not active yet.");
    require(!claimedTokenIds[_tokenId], "This token is already minted.");
    require(thedudescontract.ownerOf(_tokenId) == msg.sender, "Not the owner of this dudes.");
    string memory thedudesdna = thedudescontract.dudes(_tokenId);
    claimedTokenIds[_tokenId] = true;
    _claim(msg.sender, thedudesdna);
  }

  function _claim(address _to, string memory thedudesdna) internal {
      uint256 mintIndex = totalSupply();
          if (totalSupply() < maxNobody) {
                string memory nobodyid = string(abi.encodePacked(thedudesdna , _substring(thedudesdna,0,1)));
                nobody[mintIndex] = nobodyid;
                //foundDNAs[nobodyid] = true;
                _safeMint(_to, mintIndex);
            }
  }

 function claimableOf(address _owner) public view returns (int256[] memory) {
    uint256[] memory tokenIds = thedudescontract.tokensOfOwner(_owner);
    int256[] memory claimableTokenIds = new int256[](tokenIds.length);
    uint256 index = 0;
    for (uint256 i = 0; i < tokenIds.length; i++) {
      uint256 tokenId = tokenIds[i];
      claimableTokenIds[i] = -1;
      if (thedudescontract.ownerOf(tokenId) == _owner) {
        if (!claimedTokenIds[tokenId]) {
          claimableTokenIds[index] = tokenId.toInt256Safe();
          index++;
        }
      }
    }
    return claimableTokenIds;
  }

  function allClaimed(address _owner) public view returns (bool) {
    int256[] memory tokenIds = claimableOf(_owner);
    bool allClaimed = true;
    for (uint256 i = 0; i < tokenIds.length; i++) {
      if (tokenIds[i] != -1) {
        allClaimed = false;
      }
    }
    return allClaimed;
  }

  function mint(uint256 _numNobody, uint _salt) public payable {
    require(isSaleActive, "Sale is not active!" );
    require(_numNobody > 0 && _numNobody <= maxNobodyPerPurchase, 'Max is 10 at a time');
    require(totalSupply().add(_numNobody) <= maxNobody, "Sorry too many nobody!");
    require(msg.value >= price.mul(_numNobody), "Ether value sent is not correct!");

    _mint(msg.sender, _numNobody, _salt);
  }

  function tokensOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_owner, index);
      }
      return result;
    }
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
    return string(abi.encodePacked(_baseURI(), "/", nobody[_tokenId]));
  }
  
  function _mint(address _to, uint256 _numNobody, uint _salt) internal {
    for (uint256 i = 0; i < _numNobody; i++) {
      uint256 mintIndex = totalSupply();

          if (totalSupply() < maxNobody) {
                string memory nobodyid = _getNobody(_salt * i);
                nobody[mintIndex] = nobodyid;
                _safeMint(_to, mintIndex);
            }
    }
  }

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

  //owner only

  function flipSaleState() public onlyOwner {
        isSaleActive = !isSaleActive;
  }

  function flipClaimState() public onlyOwner {
        isClaimActive = !isClaimActive;
  }

  function setPrice(uint256 _newPrice) public onlyOwner {
      price = _newPrice;
  }
  
  function setBaseURI(string memory _newBaseURI) public onlyOwner {
      baseURI = _newBaseURI;
  }

  function withdraw() public onlyOwner {
      uint256 balance = address(this).balance;
      payable(msg.sender).transfer(balance);
  }

  function reserveNobody(uint256 _numNobody, uint256 _salt) public onlyOwner {        
        _mint(msg.sender, _numNobody, _salt);
  }
  
  function reservetheudes() public onlyOwner{
    for (uint256 i = 0; i < 512; i++) {
      string memory nobodyid = thedudescontract.dudes(i);
      if (foundDNAs[nobodyid] == false) {
          foundDNAs[nobodyid] = true;
        }
      }
  }


}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_maxNobody","type":"uint256"},{"internalType":"uint256","name":"_maxNobodyPerPurchase","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"allClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"claimableOf","outputs":[{"internalType":"int256[]","name":"","type":"int256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedTokenIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipClaimState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"foundDNAs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNobody","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNobodyPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numNobody","type":"uint256"},{"internalType":"uint256","name":"_salt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nobody","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numNobody","type":"uint256"},{"internalType":"uint256","name":"_salt","type":"uint256"}],"name":"reserveNobody","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservetheudes","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":"thedudesaddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610c8a600a55610c8a608c55600a608d55666a94d74f430000608e556000608f60006101000a81548160ff0219169083151502179055506000608f60016101000a81548160ff02191690831515021790555073b0cf7da8dc482997525be8488b9cad4f44315422609360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550609360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737ddd43c63aa73cde4c5aa6b5de5d9681882d88f8609560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200017057600080fd5b506040516200aabd3803806200aabd833981810160405281019062000196919062004726565b6040518060400160405280600681526020017f6e6f626f647900000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f6e6f626f6479000000000000000000000000000000000000000000000000000081525081600090805190602001906200021a929190620042ff565b50806001908051906020019062000233929190620042ff565b50505062000246620002b560201b60201c565b620002666200025a6200315660201b60201c565b6200315e60201b60201c565b81608c8190555080608d81905550620002ad609560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016205e3726200322460201b60201c565b505062004ea7565b60405180604001604052806040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525081526020016000815250605f6000600981106200033c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200035e929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016014815250605f600160098110620003f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000415929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525081526020016028815250605f600260098110620004aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620004cc929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f330000000000000000000000000000000000000000000000000000000000000081525081526020016032815250605f60036009811062000561577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000583929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f34000000000000000000000000000000000000000000000000000000000000008152508152602001603c815250605f60046009811062000618577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200063a929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016046815250605f600560098110620006cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620006f1929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f360000000000000000000000000000000000000000000000000000000000000081525081526020016050815250605f60066009811062000786577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620007a8929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f37000000000000000000000000000000000000000000000000000000000000008152508152602001605a815250605f6007600981106200083d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200085f929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f38000000000000000000000000000000000000000000000000000000000000008152508152602001605f815250605f600860098110620008f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000916929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250815260200160008152506025600060088110620009ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620009cd929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508152602001600f815250602560016008811062000a62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000a84929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525081526020016019815250602560026008811062000b19577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000b3b929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f330000000000000000000000000000000000000000000000000000000000000081525081526020016023815250602560036008811062000bd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000bf2929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f340000000000000000000000000000000000000000000000000000000000000081525081526020016028815250602560046008811062000c87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000ca9929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016032815250602560056008811062000d3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000d60929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f36000000000000000000000000000000000000000000000000000000000000008152508152602001604b815250602560066008811062000df5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000e17929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f37000000000000000000000000000000000000000000000000000000000000008152508152602001605a815250602560076008811062000eac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000ece929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152508152602001600081525060356000600c811062000f63577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062000f85929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508152602001600a81525060356001600c81106200101a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200103c929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f32000000000000000000000000000000000000000000000000000000000000008152508152602001601481525060356002600c8110620010d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620010f3929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f33000000000000000000000000000000000000000000000000000000000000008152508152602001601e81525060356003600c811062001188577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620011aa929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f34000000000000000000000000000000000000000000000000000000000000008152508152602001602881525060356004600c81106200123f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001261929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f35000000000000000000000000000000000000000000000000000000000000008152508152602001603281525060356005600c8110620012f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001318929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f36000000000000000000000000000000000000000000000000000000000000008152508152602001603281525060356006600c8110620013ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620013cf929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f37000000000000000000000000000000000000000000000000000000000000008152508152602001603281525060356007600c811062001464577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001486929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f38000000000000000000000000000000000000000000000000000000000000008152508152602001603281525060356008600c81106200151b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200153d929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f39000000000000000000000000000000000000000000000000000000000000008152508152602001603281525060356009600c8110620015d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620015f4929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f61000000000000000000000000000000000000000000000000000000000000008152508152602001605a8152506035600a600c811062001689577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620016ab929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f62000000000000000000000000000000000000000000000000000000000000008152508152602001605f8152506035600b600c811062001740577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001762929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525081526020016000815250600d6000600c8110620017f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001819929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016005815250600d6001600c8110620018ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620018d0929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f32000000000000000000000000000000000000000000000000000000000000008152508152602001600a815250600d6002600c811062001965577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001987929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f330000000000000000000000000000000000000000000000000000000000000081525081526020016019815250600d6003600c811062001a1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001a3e929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f340000000000000000000000000000000000000000000000000000000000000081525081526020016028815250600d6004600c811062001ad3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001af5929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016032815250600d6005600c811062001b8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001bac929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f360000000000000000000000000000000000000000000000000000000000000081525081526020016037815250600d6006600c811062001c41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001c63929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f37000000000000000000000000000000000000000000000000000000000000008152508152602001603c815250600d6007600c811062001cf8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001d1a929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525081526020016046815250600d6008600c811062001daf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001dd1929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525081526020016050815250600d6009600c811062001e66577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001e88929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f61000000000000000000000000000000000000000000000000000000000000008152508152602001605a815250600d600a600c811062001f1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001f3f929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f62000000000000000000000000000000000000000000000000000000000000008152508152602001605f815250600d600b600c811062001fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062001ff6929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152508152602001600081525060716000600981106200208b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620020ad929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016014815250607160016009811062002142577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002164929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f3200000000000000000000000000000000000000000000000000000000000000815250815260200160288152506071600260098110620021f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200221b929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f3300000000000000000000000000000000000000000000000000000000000000815250815260200160328152506071600360098110620022b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620022d2929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f34000000000000000000000000000000000000000000000000000000000000008152508152602001603c815250607160046009811062002367577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002389929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f35000000000000000000000000000000000000000000000000000000000000008152508152602001604681525060716005600981106200241e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002440929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f3600000000000000000000000000000000000000000000000000000000000000815250815260200160508152506071600660098110620024d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620024f7929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f37000000000000000000000000000000000000000000000000000000000000008152508152602001605a81525060716007600981106200258c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620025ae929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f38000000000000000000000000000000000000000000000000000000000000008152508152602001605f815250607160086009811062002643577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002665929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525081526020016000815250604d600060098110620026fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200271c929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508152602001600a815250604d600160098110620027b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620027d3929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525081526020016014815250604d60026009811062002868577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6002020160008201518160000190805190602001906200288a929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f33000000000000000000000000000000000000000000000000000000000000008152508152602001601e815250604d6003600981106200291f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002941929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f340000000000000000000000000000000000000000000000000000000000000081525081526020016028815250604d600460098110620029d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600202016000820151816000019080519060200190620029f8929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016032815250604d60056009811062002a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002aaf929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f36000000000000000000000000000000000000000000000000000000000000008152508152602001603c815250604d60066009811062002b44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002b66929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f370000000000000000000000000000000000000000000000000000000000000081525081526020016050815250604d60076009811062002bfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002c1d929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f38000000000000000000000000000000000000000000000000000000000000008152508152602001605a815250604d60086009811062002cb2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002cd4929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525081526020016000815250608360006004811062002d69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002d8b929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016032815250608360016004811062002e20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002e42929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f32000000000000000000000000000000000000000000000000000000000000008152508152602001604b815250608360026004811062002ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002ef9929190620042ff565b506020820151816001015590505060405180604001604052806040518060400160405280600181526020017f33000000000000000000000000000000000000000000000000000000000000008152508152602001605a815250608360036004811062002f8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60020201600082015181600001908051906020019062002fb0929190620042ff565b5060208201518160010155905050600c605f9080600181540180825580915050600190039060005260206000200160009091909190915090600962002ff792919062004390565b50600c6025908060018154018082558091505060019003906000526020600020016000909190919091509060086200303192919062004413565b50600c60359080600181540180825580915050600190039060005260206000200160009091909190915090600c6200306b92919062004496565b50600c600d9080600181540180825580915050600190039060005260206000200160009091909190915090600c620030a592919062004496565b50600c607190806001815401808255809150506001900390600052602060002001600090919091909150906009620030df92919062004390565b50600c604d908060018154018082558091505060019003906000526020600020016000909190919091509060096200311992919062004390565b50600c6083908060018154018082558091505060019003906000526020600020016000909190919091509060046200315392919062004519565b50565b600033905090565b6000608b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081608b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b82811015620032d557600062003242620032db60201b60201c565b9050608c5462003257620032db60201b60201c565b1015620032be5760006200327e838562003272919062004b9e565b620032e860201b60201c565b905080609260008481526020019081526020016000209080519060200190620032a9929190620042ff565b50620032bc8683620036e160201b60201c565b505b508080620032cc9062004d10565b91505062003227565b50505050565b6000600880549050905090565b60605b600115620036db57600060405180602001604052806000815250905060005b6001600c805490506200331e919062004bff565b811015620034bf576000600c828154811062003363577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805480602002602001604051908101604052809291908181526020016000905b82821015620034655783829060005260206000209060020201604051806040016040529081600082018054620033c39062004cda565b80601f0160208091040260200160405190810160405280929190818152602001828054620033f19062004cda565b8015620034425780601f10620034165761010080835404028352916020019162003442565b820191906000526020600020905b8154815290600101906020018083116200342457829003601f168201915b50505050508152602001600182015481525050815260200190600101906200338d565b50505050905060006200347f82876200370760201b60201c565b9050838160405160200162003496929190620049a4565b604051602081830303815290604052935050508080620034b69062004d10565b9150506200330a565b5060001515600b82604051620034d691906200498b565b908152602001604051809103902060009054906101000a900460ff1615151415620036d4576001600b826040516200350f91906200498b565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506000600c6001600c805490506200354c919062004bff565b8154811062003584577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805480602002602001604051908101604052809291908181526020016000905b82821015620036865783829060005260206000209060020201604051806040016040529081600082018054620035e49062004cda565b80601f0160208091040260200160405190810160405280929190818152602001828054620036129062004cda565b8015620036635780601f10620036375761010080835404028352916020019162003663565b820191906000526020600020905b8154815290600101906020018083116200364557829003601f168201915b5050505050815260200160018201548152505081526020019060010190620035ae565b5050505090506000620036a082866200370760201b60201c565b90508281604051602001620036b7929190620049a4565b6040516020818303038152906040529250829350505050620036dc565b50620032eb565b5b919050565b620037038282604051806020016040528060008152506200386760201b60201c565b5050565b606060006200371e836064620038d560201b60201c565b90506060600080600090505b86518110156200385a57838782815181106200376f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001511162003844576000821415620037dd57868181518110620037c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015192506001915062003843565b6000620037f2876002620038d560201b60201c565b1115620038425786818151811062003833577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015192505b5b5b8080620038519062004d10565b9150506200372a565b5081935050505092915050565b6200387983836200393f60201b60201c565b6200388e600084848462003b2560201b60201c565b620038d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620038c79062004a76565b60405180910390fd5b505050565b600080824233600a5487604051602001620038f49493929190620049cc565b6040516020818303038152906040528051906020012060001c62003919919062004d90565b9050600a6000815480929190620039309062004d10565b91905055508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620039b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620039a99062004adc565b60405180910390fd5b620039c38162003cdf60201b60201c565b1562003a06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620039fd9062004a98565b60405180910390fd5b62003a1a6000838362003d4b60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462003a6c919062004b41565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600062003b538473ffffffffffffffffffffffffffffffffffffffff1662003e9260201b620027d31760201c565b1562003cd2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262003b856200315660201b60201c565b8786866040518563ffffffff1660e01b815260040162003ba9949392919062004a22565b602060405180830381600087803b15801562003bc457600080fd5b505af192505050801562003bf857506040513d601f19601f8201168201806040525081019062003bf59190620046fa565b60015b62003c81573d806000811462003c2b576040519150601f19603f3d011682016040523d82523d6000602084013e62003c30565b606091505b5060008151141562003c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162003c709062004a76565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062003cd7565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62003d6383838362003ea560201b620027e61760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562003db05762003daa8162003eaa60201b60201c565b62003df8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462003df75762003df6838262003ef360201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562003e455762003e3f816200407060201b60201c565b62003e8d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462003e8c5762003e8b8282620041b860201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162003f0d846200424460201b620019471760201c565b62003f19919062004bff565b905060006007600084815260200190815260200160002054905081811462003fff576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062004086919062004bff565b9050600060096000848152602001908152602001600020549050600060088381548110620040dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062004126577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806200419c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000620041d0836200424460201b620019471760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620042b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620042af9062004aba565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8280546200430d9062004cda565b90600052602060002090601f0160209004810192826200433157600085556200437d565b82601f106200434c57805160ff19168380011785556200437d565b828001600101855582156200437d579182015b828111156200437c5782518255916020019190600101906200435f565b5b5090506200438c91906200459c565b5090565b82805482825590600052602060002090600202810192821562004400579160020282015b82811115620043ff5782826000820181600001908054620043d59062004cda565b620043e2929190620045bb565b5060018201548160010155505091600201919060020190620043b4565b5b5090506200440f919062004653565b5090565b82805482825590600052602060002090600202810192821562004483579160020282015b82811115620044825782826000820181600001908054620044589062004cda565b62004465929190620045bb565b506001820154816001015550509160020191906002019062004437565b5b50905062004492919062004653565b5090565b82805482825590600052602060002090600202810192821562004506579160020282015b82811115620045055782826000820181600001908054620044db9062004cda565b620044e8929190620045bb565b5060018201548160010155505091600201919060020190620044ba565b5b50905062004515919062004653565b5090565b82805482825590600052602060002090600202810192821562004589579160020282015b828111156200458857828260008201816000019080546200455e9062004cda565b6200456b929190620045bb565b50600182015481600101555050916002019190600201906200453d565b5b50905062004598919062004653565b5090565b5b80821115620045b75760008160009055506001016200459d565b5090565b828054620045c99062004cda565b90600052602060002090601f016020900481019282620045ed576000855562004640565b82601f1062004600578054855562004640565b828001600101855582156200464057600052602060002091601f016020900482015b828111156200463f57825482559160010191906001019062004622565b5b5090506200464f91906200459c565b5090565b5b8082111562004682576000808201600062004670919062004686565b60018201600090555060020162004654565b5090565b508054620046949062004cda565b6000825580601f10620046a85750620046c9565b601f016020900490600052602060002090810190620046c891906200459c565b5b50565b600081519050620046dd8162004e73565b92915050565b600081519050620046f48162004e8d565b92915050565b6000602082840312156200470d57600080fd5b60006200471d84828501620046cc565b91505092915050565b600080604083850312156200473a57600080fd5b60006200474a85828601620046e3565b92505060206200475d85828601620046e3565b9150509250929050565b620047728162004c3a565b82525050565b6200478d620047878262004c3a565b62004d5e565b82525050565b6000620047a08262004afe565b620047ac818562004b14565b9350620047be81856020860162004ca4565b620047c98162004e55565b840191505092915050565b6000620047e18262004b09565b620047ed818562004b36565b9350620047ff81856020860162004ca4565b80840191505092915050565b60006200481a60328362004b25565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062004882601c8362004b25565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000620048c4602a8362004b25565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006200492c60208362004b25565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6200496a8162004c9a565b82525050565b620049856200497f8262004c9a565b62004d86565b82525050565b6000620049998284620047d4565b915081905092915050565b6000620049b28285620047d4565b9150620049c08284620047d4565b91508190509392505050565b6000620049da828762004970565b602082019150620049ec828662004778565b601482019150620049fe828562004970565b60208201915062004a10828462004970565b60208201915081905095945050505050565b600060808201905062004a39600083018762004767565b62004a48602083018662004767565b62004a5760408301856200495f565b818103606083015262004a6b818462004793565b905095945050505050565b6000602082019050818103600083015262004a91816200480b565b9050919050565b6000602082019050818103600083015262004ab38162004873565b9050919050565b6000602082019050818103600083015262004ad581620048b5565b9050919050565b6000602082019050818103600083015262004af7816200491d565b9050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600062004b4e8262004c9a565b915062004b5b8362004c9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562004b935762004b9262004dc8565b5b828201905092915050565b600062004bab8262004c9a565b915062004bb88362004c9a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562004bf45762004bf362004dc8565b5b828202905092915050565b600062004c0c8262004c9a565b915062004c198362004c9a565b92508282101562004c2f5762004c2e62004dc8565b5b828203905092915050565b600062004c478262004c7a565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562004cc457808201518184015260208101905062004ca7565b8381111562004cd4576000848401525b50505050565b6000600282049050600182168062004cf357607f821691505b6020821081141562004d0a5762004d0962004e26565b5b50919050565b600062004d1d8262004c9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562004d535762004d5262004dc8565b5b600182019050919050565b600062004d6b8262004d72565b9050919050565b600062004d7f8262004e66565b9050919050565b6000819050919050565b600062004d9d8262004c9a565b915062004daa8362004c9a565b92508262004dbd5762004dbc62004df7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b62004e7e8162004c4e565b811462004e8a57600080fd5b50565b62004e988162004c9a565b811462004ea457600080fd5b50565b615c068062004eb76000396000f3fe60806040526004361061025c5760003560e01c80636d60e6c11161014457806395d89b41116100b6578063c87b56dd1161007a578063c87b56dd146108eb578063e510c03214610928578063e985e9c514610951578063eebe99ad1461098e578063f27dac42146109b9578063f2fde38b146109e45761025c565b806395d89b4114610818578063a035b1fe14610843578063a22cb4651461086e578063b88d4fde14610897578063c598e7f2146108c05761025c565b80638462151c116101085780638462151c146106d057806384b768bf1461070d578063865f48851461074a5780638903ab9d146107875780638da5cb5b146107c457806391b7f5ed146107ef5761025c565b80636d60e6c11461061157806370a0823114610628578063715018a61461066557806377329f351461067c5780637fc27803146106a55761025c565b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce71461050157806355f804b31461053e578063564566a8146105675780636352211e1461059257806365a65b4b146105cf5780636c0360eb146105e65761025c565b80632f745c591461044457806334918dfd14610481578063379607f5146104985780633ccfd60b146104c157806342842e0e146104d85761025c565b806318160ddd1161022457806318160ddd1461035a5780631b2ef1ca1461038557806323b872dd146103a15780632713727a146103ca5780632c84c31b146104075761025c565b806301ffc9a71461026157806302d05d3f1461029e57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190614506565b610a0d565b60405161029591906152fd565b60405180910390f35b3480156102aa57600080fd5b506102b3610a87565b6040516102c09190615252565b60405180910390f35b3480156102d557600080fd5b506102de610aad565b6040516102eb9190615318565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906145da565b610b3f565b6040516103289190615252565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190614489565b610bc4565b005b34801561036657600080fd5b5061036f610cdc565b60405161037c919061567a565b60405180910390f35b61039f600480360381019061039a9190614603565b610ce9565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190614383565b610e4d565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906145da565b610ead565b6040516103fe91906152fd565b60405180910390f35b34801561041357600080fd5b5061042e600480360381019061042991906145da565b610ecd565b60405161043b9190615318565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190614489565b610f6d565b604051610478919061567a565b60405180910390f35b34801561048d57600080fd5b50610496611012565b005b3480156104a457600080fd5b506104bf60048036038101906104ba91906145da565b6110ba565b005b3480156104cd57600080fd5b506104d6611370565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190614383565b61143b565b005b34801561050d57600080fd5b50610528600480360381019061052391906145da565b61145b565b604051610535919061567a565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190614558565b6114f2565b005b34801561057357600080fd5b5061057c611588565b60405161058991906152fd565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b491906145da565b61159b565b6040516105c69190615252565b60405180910390f35b3480156105db57600080fd5b506105e461164d565b005b3480156105f257600080fd5b506105fb611811565b6040516106089190615318565b60405180910390f35b34801561061d57600080fd5b5061062661189f565b005b34801561063457600080fd5b5061064f600480360381019061064a91906142f5565b611947565b60405161065c919061567a565b60405180910390f35b34801561067157600080fd5b5061067a6119ff565b005b34801561068857600080fd5b506106a3600480360381019061069e91906142f5565b611a87565b005b3480156106b157600080fd5b506106ba611c01565b6040516106c791906152fd565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906142f5565b611c14565b60405161070491906152db565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906142f5565b611d90565b60405161074191906152fd565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c9190614558565b611e3a565b60405161077e91906152fd565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906142f5565b611e70565b6040516107bb91906152b9565b60405180910390f35b3480156107d057600080fd5b506107d96121d3565b6040516107e69190615252565b60405180910390f35b3480156107fb57600080fd5b50610816600480360381019061081191906145da565b6121fd565b005b34801561082457600080fd5b5061082d612283565b60405161083a9190615318565b60405180910390f35b34801561084f57600080fd5b50610858612315565b604051610865919061567a565b60405180910390f35b34801561087a57600080fd5b506108956004803603810190610890919061444d565b61231b565b005b3480156108a357600080fd5b506108be60048036038101906108b991906143d2565b61249c565b005b3480156108cc57600080fd5b506108d56124fe565b6040516108e2919061567a565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d91906145da565b612504565b60405161091f9190615318565b60405180910390f35b34801561093457600080fd5b5061094f600480360381019061094a9190614603565b612590565b005b34801561095d57600080fd5b5061097860048036038101906109739190614347565b61261b565b60405161098591906152fd565b60405180910390f35b34801561099a57600080fd5b506109a36126af565b6040516109b09190615252565b60405180910390f35b3480156109c557600080fd5b506109ce6126d5565b6040516109db919061567a565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a0691906142f5565b6126db565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a805750610a7f826127eb565b5b9050919050565b609560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008054610abc906159c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae8906159c0565b8015610b355780601f10610b0a57610100808354040283529160200191610b35565b820191906000526020600020905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b6000610b4a826128cd565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061555a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bcf8261159b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c37906155fa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c5f612939565b73ffffffffffffffffffffffffffffffffffffffff161480610c8e5750610c8d81610c88612939565b61261b565b5b610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc4906154ba565b60405180910390fd5b610cd78383612941565b505050565b6000600880549050905090565b608f60009054906101000a900460ff16610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f906155da565b60405180910390fd5b600082118015610d4a5750608d548211155b610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d809061533a565b60405180910390fd5b608c54610da683610d98610cdc565b6129fa90919063ffffffff16565b1115610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde9061543a565b60405180910390fd5b610dfc82608e54612a1090919063ffffffff16565b341015610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359061551a565b60405180910390fd5b610e49338383612a26565b5050565b610e5e610e58612939565b82612ab4565b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e949061561a565b60405180910390fd5b610ea8838383612b92565b505050565b60916020528060005260406000206000915054906101000a900460ff1681565b60926020528060005260406000206000915090508054610eec906159c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906159c0565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b505050505081565b6000610f7883611947565b8210610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb09061535a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61101a612939565b73ffffffffffffffffffffffffffffffffffffffff166110386121d3565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110859061557a565b60405180910390fd5b608f60009054906101000a900460ff1615608f60006101000a81548160ff021916908315150217905550565b608f60019054906101000a900460ff16611109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111009061563a565b60405180910390fd5b6091600082815260200190815260200160002060009054906101000a900460ff161561116a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611161906153da565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016111dc919061567a565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122c919061431e565b73ffffffffffffffffffffffffffffffffffffffff1614611282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112799061545a565b60405180910390fd5b6000609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368633620836040518263ffffffff1660e01b81526004016112df919061567a565b60006040518083038186803b1580156112f757600080fd5b505afa15801561130b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113349190614599565b905060016091600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061136c3382612dee565b5050565b611378612939565b73ffffffffffffffffffffffffffffffffffffffff166113966121d3565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e39061557a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611437573d6000803e3d6000fd5b5050565b6114568383836040518060200160405280600081525061249c565b505050565b6000611465610cdc565b82106114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061565a565b60405180910390fd5b600882815481106114e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6114fa612939565b73ffffffffffffffffffffffffffffffffffffffff166115186121d3565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115659061557a565b60405180910390fd5b8060909080519060200190611584929190613ff1565b5050565b608f60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b906154fa565b60405180910390fd5b80915050919050565b611655612939565b73ffffffffffffffffffffffffffffffffffffffff166116736121d3565b73ffffffffffffffffffffffffffffffffffffffff16146116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c09061557a565b60405180910390fd5b60005b61020081101561180e576000609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368633620836040518263ffffffff1660e01b8152600401611733919061567a565b60006040518083038186803b15801561174b57600080fd5b505afa15801561175f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117889190614599565b905060001515600b8260405161179e919061519a565b908152602001604051809103902060009054906101000a900460ff16151514156117fa576001600b826040516117d4919061519a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505b508080611806906159f2565b9150506116cc565b50565b6090805461181e906159c0565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906159c0565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b505050505081565b6118a7612939565b73ffffffffffffffffffffffffffffffffffffffff166118c56121d3565b73ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119129061557a565b60405180910390fd5b608f60019054906101000a900460ff1615608f60016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af906154da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a07612939565b73ffffffffffffffffffffffffffffffffffffffff16611a256121d3565b73ffffffffffffffffffffffffffffffffffffffff1614611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a729061557a565b60405180910390fd5b611a856000612e76565b565b608f60019054906101000a900460ff16611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd9061563a565b60405180910390fd5b611adf81611d90565b15611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b169061549a565b60405180910390fd5b6000611b2a82611e70565b905060005b8151811015611bfc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828281518110611b92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015114611be957611be8828281518110611bdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516110ba565b5b8080611bf4906159f2565b915050611b2f565b505050565b608f60019054906101000a900460ff1681565b60606000611c2183611947565b90506000811415611ca457600067ffffffffffffffff811115611c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c9b5781602001602082028036833780820191505090505b50915050611d8b565b60008167ffffffffffffffff811115611ce6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d145781602001602082028036833780820191505090505b50905060005b82811015611d8457611d2c8582610f6d565b828281518110611d65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611d7c906159f2565b915050611d1a565b8193505050505b919050565b600080611d9c83611e70565b905060006001905060005b8251811015611e2f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff838281518110611e0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015114611e1c57600091505b8080611e27906159f2565b915050611da7565b508092505050919050565b600b818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60606000609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c846040518263ffffffff1660e01b8152600401611ecf9190615252565b60006040518083038186803b158015611ee757600080fd5b505afa158015611efb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f2491906144c5565b90506000815167ffffffffffffffff811115611f69577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f975781602001602082028036833780820191505090505b5090506000805b83518110156121c7576000848281518110611fe2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848381518110612046577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508673ffffffffffffffffffffffffffffffffffffffff16609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016120c4919061567a565b60206040518083038186803b1580156120dc57600080fd5b505afa1580156120f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612114919061431e565b73ffffffffffffffffffffffffffffffffffffffff1614156121b3576091600082815260200190815260200160002060009054906101000a900460ff166121b25761215e81612f3c565b848481518110612197577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505082806121ae906159f2565b9350505b5b5080806121bf906159f2565b915050611f9e565b50819350505050919050565b6000608b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612205612939565b73ffffffffffffffffffffffffffffffffffffffff166122236121d3565b73ffffffffffffffffffffffffffffffffffffffff1614612279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122709061557a565b60405180910390fd5b80608e8190555050565b606060018054612292906159c0565b80601f01602080910402602001604051908101604052809291908181526020018280546122be906159c0565b801561230b5780601f106122e05761010080835404028352916020019161230b565b820191906000526020600020905b8154815290600101906020018083116122ee57829003601f168201915b5050505050905090565b608e5481565b612323612939565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612391576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123889061541a565b60405180910390fd5b806005600061239e612939565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661244b612939565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161249091906152fd565b60405180910390a35050565b6124ad6124a7612939565b83612ab4565b6124ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e39061561a565b60405180910390fd5b6124f884848484612f59565b50505050565b608d5481565b606061250f826128cd565b61254e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612545906155ba565b60405180910390fd5b612556612fb5565b6092600084815260200190815260200160002060405160200161257a9291906151d5565b6040516020818303038152906040529050919050565b612598612939565b73ffffffffffffffffffffffffffffffffffffffff166125b66121d3565b73ffffffffffffffffffffffffffffffffffffffff161461260c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126039061557a565b60405180910390fd5b612617338383612a26565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b609360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b608c5481565b6126e3612939565b73ffffffffffffffffffffffffffffffffffffffff166127016121d3565b73ffffffffffffffffffffffffffffffffffffffff1614612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e9061557a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127be9061539a565b60405180910390fd5b6127d081612e76565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128c657506128c582613047565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129b48361159b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008183612a08919061581c565b905092915050565b60008183612a1e9190615872565b905092915050565b60005b82811015612aae576000612a3b610cdc565b9050608c54612a48610cdc565b1015612a9a576000612a648385612a5f9190615872565b6130b1565b905080609260008481526020019081526020016000209080519060200190612a8d929190613ff1565b50612a988683613470565b505b508080612aa6906159f2565b915050612a29565b50505050565b6000612abf826128cd565b612afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af59061547a565b60405180910390fd5b6000612b098361159b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b7857508373ffffffffffffffffffffffffffffffffffffffff16612b6084610b3f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b895750612b88818561261b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bb28261159b565b73ffffffffffffffffffffffffffffffffffffffff1614612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff9061559a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f906153fa565b60405180910390fd5b612c8383838361348e565b612c8e600082612941565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cde91906158cc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d35919061581c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612df8610cdc565b9050608c54612e05610cdc565b1015612e7157600082612e1b84600060016135a2565b604051602001612e2c9291906151b1565b604051602081830303815290604052905080609260008481526020019081526020016000209080519060200190612e64929190613ff1565b50612e6f8483613470565b505b505050565b6000608b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081608b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808290506000811215612f5057600080fd5b80915050919050565b612f64848484612b92565b612f7084848484613710565b612faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa69061537a565b60405180910390fd5b50505050565b606060908054612fc4906159c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff0906159c0565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60605b60011561346a57600060405180602001604052806000815250905060005b6001600c805490506130e491906158cc565b81101561326c576000600c8281548110613127577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805480602002602001604051908101604052809291908181526020016000905b8282101561321f5783829060005260206000209060020201604051806040016040529081600082018054613184906159c0565b80601f01602080910402602001604051908101604052809291908181526020018280546131b0906159c0565b80156131fd5780601f106131d2576101008083540402835291602001916131fd565b820191906000526020600020905b8154815290600101906020018083116131e057829003601f168201915b5050505050815260200160018201548152505081526020019060010190613151565b505050509050600061323182876138a7565b905083816040516020016132469291906151b1565b604051602081830303815290604052935050508080613264906159f2565b9150506130d2565b5060001515600b82604051613281919061519a565b908152602001604051809103902060009054906101000a900460ff1615151415613464576001600b826040516132b7919061519a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506000600c6001600c805490506132f291906158cc565b81548110613329577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805480602002602001604051908101604052809291908181526020016000905b828210156134215783829060005260206000209060020201604051806040016040529081600082018054613386906159c0565b80601f01602080910402602001604051908101604052809291908181526020018280546133b2906159c0565b80156133ff5780601f106133d4576101008083540402835291602001916133ff565b820191906000526020600020905b8154815290600101906020018083116133e257829003601f168201915b5050505050815260200160018201548152505081526020019060010190613353565b505050509050600061343382866138a7565b905082816040516020016134489291906151b1565b604051602081830303815290604052925082935050505061346b565b506130b4565b5b919050565b61348a8282604051806020016040528060008152506139ec565b5050565b6134998383836127e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134dc576134d781613a47565b61351b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461351a576135198382613a90565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561355e5761355981613bfd565b61359d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461359c5761359b8282613d40565b5b5b505050565b60606000849050600084846135b791906158cc565b67ffffffffffffffff8111156135f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136285781602001600182028036833780820191505090505b50905060008590505b8481101561370357828181518110613672577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82878361368a91906158cc565b815181106136c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806136fb906159f2565b915050613631565b5080925050509392505050565b60006137318473ffffffffffffffffffffffffffffffffffffffff166127d3565b1561389a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261375a612939565b8786866040518563ffffffff1660e01b815260040161377c949392919061526d565b602060405180830381600087803b15801561379657600080fd5b505af19250505080156137c757506040513d601f19601f820116820180604052508101906137c4919061452f565b60015b61384a573d80600081146137f7576040519150601f19603f3d011682016040523d82523d6000602084013e6137fc565b606091505b50600081511415613842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138399061537a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061389f565b600190505b949350505050565b606060006138b6836064613dbf565b90506060600080600090505b86518110156139df5783878281518110613905577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160200151116139cc57600082141561396f57868181518110613958577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001519250600191506139cb565b600061397c876002613dbf565b11156139ca578681815181106139bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015192505b5b5b80806139d7906159f2565b9150506138c2565b5081935050505092915050565b6139f68383613e23565b613a036000848484613710565b613a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a399061537a565b60405180910390fd5b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a9d84611947565b613aa791906158cc565b9050600060076000848152602001908152602001600020549050818114613b8c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c1191906158cc565b9050600060096000848152602001908152602001600020549050600060088381548110613c67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d4b83611947565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080824233600a5487604051602001613ddc9493929190615204565b6040516020818303038152906040528051906020012060001c613dff9190615a69565b9050600a6000815480929190613e14906159f2565b91905055508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8a9061553a565b60405180910390fd5b613e9c816128cd565b15613edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ed3906153ba565b60405180910390fd5b613ee86000838361348e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f38919061581c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613ffd906159c0565b90600052602060002090601f01602090048101928261401f5760008555614066565b82601f1061403857805160ff1916838001178555614066565b82800160010185558215614066579182015b8281111561406557825182559160200191906001019061404a565b5b5090506140739190614077565b5090565b5b80821115614090576000816000905550600101614078565b5090565b60006140a76140a2846156c6565b615695565b905080838252602082019050828560208602820111156140c657600080fd5b60005b858110156140f657816140dc88826142e0565b8452602084019350602083019250506001810190506140c9565b5050509392505050565b600061411361410e846156f2565b615695565b90508281526020810184848401111561412b57600080fd5b61413684828561597e565b509392505050565b600061415161414c84615722565b615695565b90508281526020810184848401111561416957600080fd5b61417484828561597e565b509392505050565b600061418f61418a84615722565b615695565b9050828152602081018484840111156141a757600080fd5b6141b284828561598d565b509392505050565b6000813590506141c981615b74565b92915050565b6000815190506141de81615b74565b92915050565b600082601f8301126141f557600080fd5b8151614205848260208601614094565b91505092915050565b60008135905061421d81615b8b565b92915050565b60008135905061423281615ba2565b92915050565b60008151905061424781615ba2565b92915050565b600082601f83011261425e57600080fd5b813561426e848260208601614100565b91505092915050565b600082601f83011261428857600080fd5b813561429884826020860161413e565b91505092915050565b600082601f8301126142b257600080fd5b81516142c284826020860161417c565b91505092915050565b6000813590506142da81615bb9565b92915050565b6000815190506142ef81615bb9565b92915050565b60006020828403121561430757600080fd5b6000614315848285016141ba565b91505092915050565b60006020828403121561433057600080fd5b600061433e848285016141cf565b91505092915050565b6000806040838503121561435a57600080fd5b6000614368858286016141ba565b9250506020614379858286016141ba565b9150509250929050565b60008060006060848603121561439857600080fd5b60006143a6868287016141ba565b93505060206143b7868287016141ba565b92505060406143c8868287016142cb565b9150509250925092565b600080600080608085870312156143e857600080fd5b60006143f6878288016141ba565b9450506020614407878288016141ba565b9350506040614418878288016142cb565b925050606085013567ffffffffffffffff81111561443557600080fd5b6144418782880161424d565b91505092959194509250565b6000806040838503121561446057600080fd5b600061446e858286016141ba565b925050602061447f8582860161420e565b9150509250929050565b6000806040838503121561449c57600080fd5b60006144aa858286016141ba565b92505060206144bb858286016142cb565b9150509250929050565b6000602082840312156144d757600080fd5b600082015167ffffffffffffffff8111156144f157600080fd5b6144fd848285016141e4565b91505092915050565b60006020828403121561451857600080fd5b600061452684828501614223565b91505092915050565b60006020828403121561454157600080fd5b600061454f84828501614238565b91505092915050565b60006020828403121561456a57600080fd5b600082013567ffffffffffffffff81111561458457600080fd5b61459084828501614277565b91505092915050565b6000602082840312156145ab57600080fd5b600082015167ffffffffffffffff8111156145c557600080fd5b6145d1848285016142a1565b91505092915050565b6000602082840312156145ec57600080fd5b60006145fa848285016142cb565b91505092915050565b6000806040838503121561461657600080fd5b6000614624858286016142cb565b9250506020614635858286016142cb565b9150509250929050565b600061464b8383614799565b60208301905092915050565b60006146638383615165565b60208301905092915050565b61467881615900565b82525050565b61468f61468a82615900565b615a3b565b82525050565b60006146a082615787565b6146aa81856157cd565b93506146b583615752565b8060005b838110156146e65781516146cd888261463f565b97506146d8836157b3565b9250506001810190506146b9565b5085935050505092915050565b60006146fe82615792565b61470881856157de565b935061471383615762565b8060005b8381101561474457815161472b8882614657565b9750614736836157c0565b925050600181019050614717565b5085935050505092915050565b61475a81615912565b82525050565b600061476b8261579d565b61477581856157ef565b935061478581856020860161598d565b61478e81615b56565b840191505092915050565b6147a28161594a565b82525050565b60006147b3826157a8565b6147bd8185615800565b93506147cd81856020860161598d565b6147d681615b56565b840191505092915050565b60006147ec826157a8565b6147f68185615811565b935061480681856020860161598d565b80840191505092915050565b6000815461481f816159c0565b6148298186615811565b94506001821660008114614844576001811461485557614888565b60ff19831686528186019350614888565b61485e85615772565b60005b8381101561488057815481890152600182019150602081019050614861565b838801955050505b50505092915050565b600061489e601383615800565b91507f4d617820697320313020617420612074696d65000000000000000000000000006000830152602082019050919050565b60006148de602b83615800565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000614944603283615800565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006149aa602683615800565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a10601c83615800565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614a50601d83615800565b91507f5468697320746f6b656e20697320616c7265616479206d696e7465642e0000006000830152602082019050919050565b6000614a90602483615800565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614af6601983615800565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614b36601683615800565b91507f536f72727920746f6f206d616e79206e6f626f647921000000000000000000006000830152602082019050919050565b6000614b76601c83615800565b91507f4e6f7420746865206f776e6572206f6620746869732064756465732e000000006000830152602082019050919050565b6000614bb6602c83615800565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614c1c601c83615800565b91507f416c6c20796f757220746f6b656e732061726520636c61696d65642e000000006000830152602082019050919050565b6000614c5c603883615800565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614cc2602a83615800565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d28602983615800565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d8e602083615800565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374216000830152602082019050919050565b6000614dce602083615800565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614e0e602c83615800565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614e74602083615800565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614eb4602983615800565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f1a602f83615800565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f80601383615800565b91507f53616c65206973206e6f742061637469766521000000000000000000000000006000830152602082019050919050565b6000614fc0602183615800565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615026603183615800565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061508c601883615800565b91507f436c61696d206973206e6f7420616374697665207965742e00000000000000006000830152602082019050919050565b60006150cc602c83615800565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000615132600183615811565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61516e81615974565b82525050565b61517d81615974565b82525050565b61519461518f82615974565b615a5f565b82525050565b60006151a682846147e1565b915081905092915050565b60006151bd82856147e1565b91506151c982846147e1565b91508190509392505050565b60006151e182856147e1565b91506151ec82615125565b91506151f88284614812565b91508190509392505050565b60006152108287615183565b602082019150615220828661467e565b6014820191506152308285615183565b6020820191506152408284615183565b60208201915081905095945050505050565b6000602082019050615267600083018461466f565b92915050565b6000608082019050615282600083018761466f565b61528f602083018661466f565b61529c6040830185615174565b81810360608301526152ae8184614760565b905095945050505050565b600060208201905081810360008301526152d38184614695565b905092915050565b600060208201905081810360008301526152f581846146f3565b905092915050565b60006020820190506153126000830184614751565b92915050565b6000602082019050818103600083015261533281846147a8565b905092915050565b6000602082019050818103600083015261535381614891565b9050919050565b60006020820190508181036000830152615373816148d1565b9050919050565b6000602082019050818103600083015261539381614937565b9050919050565b600060208201905081810360008301526153b38161499d565b9050919050565b600060208201905081810360008301526153d381614a03565b9050919050565b600060208201905081810360008301526153f381614a43565b9050919050565b6000602082019050818103600083015261541381614a83565b9050919050565b6000602082019050818103600083015261543381614ae9565b9050919050565b6000602082019050818103600083015261545381614b29565b9050919050565b6000602082019050818103600083015261547381614b69565b9050919050565b6000602082019050818103600083015261549381614ba9565b9050919050565b600060208201905081810360008301526154b381614c0f565b9050919050565b600060208201905081810360008301526154d381614c4f565b9050919050565b600060208201905081810360008301526154f381614cb5565b9050919050565b6000602082019050818103600083015261551381614d1b565b9050919050565b6000602082019050818103600083015261553381614d81565b9050919050565b6000602082019050818103600083015261555381614dc1565b9050919050565b6000602082019050818103600083015261557381614e01565b9050919050565b6000602082019050818103600083015261559381614e67565b9050919050565b600060208201905081810360008301526155b381614ea7565b9050919050565b600060208201905081810360008301526155d381614f0d565b9050919050565b600060208201905081810360008301526155f381614f73565b9050919050565b6000602082019050818103600083015261561381614fb3565b9050919050565b6000602082019050818103600083015261563381615019565b9050919050565b600060208201905081810360008301526156538161507f565b9050919050565b60006020820190508181036000830152615673816150bf565b9050919050565b600060208201905061568f6000830184615174565b92915050565b6000604051905081810181811067ffffffffffffffff821117156156bc576156bb615b27565b5b8060405250919050565b600067ffffffffffffffff8211156156e1576156e0615b27565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561570d5761570c615b27565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561573d5761573c615b27565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061582782615974565b915061583283615974565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561586757615866615a9a565b5b828201905092915050565b600061587d82615974565b915061588883615974565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158c1576158c0615a9a565b5b828202905092915050565b60006158d782615974565b91506158e283615974565b9250828210156158f5576158f4615a9a565b5b828203905092915050565b600061590b82615954565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156159ab578082015181840152602081019050615990565b838111156159ba576000848401525b50505050565b600060028204905060018216806159d857607f821691505b602082108114156159ec576159eb615af8565b5b50919050565b60006159fd82615974565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615a3057615a2f615a9a565b5b600182019050919050565b6000615a4682615a4d565b9050919050565b6000615a5882615b67565b9050919050565b6000819050919050565b6000615a7482615974565b9150615a7f83615974565b925082615a8f57615a8e615ac9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615b7d81615900565b8114615b8857600080fd5b50565b615b9481615912565b8114615b9f57600080fd5b50565b615bab8161591e565b8114615bb657600080fd5b50565b615bc281615974565b8114615bcd57600080fd5b5056fea2646970667358221220addb28b83b86bb911571d84de6a09dd27335a6d727902582d56a35409d8371a764736f6c634300080000330000000000000000000000000000000000000000000000000000000000000c8a000000000000000000000000000000000000000000000000000000000000000a

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80636d60e6c11161014457806395d89b41116100b6578063c87b56dd1161007a578063c87b56dd146108eb578063e510c03214610928578063e985e9c514610951578063eebe99ad1461098e578063f27dac42146109b9578063f2fde38b146109e45761025c565b806395d89b4114610818578063a035b1fe14610843578063a22cb4651461086e578063b88d4fde14610897578063c598e7f2146108c05761025c565b80638462151c116101085780638462151c146106d057806384b768bf1461070d578063865f48851461074a5780638903ab9d146107875780638da5cb5b146107c457806391b7f5ed146107ef5761025c565b80636d60e6c11461061157806370a0823114610628578063715018a61461066557806377329f351461067c5780637fc27803146106a55761025c565b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce71461050157806355f804b31461053e578063564566a8146105675780636352211e1461059257806365a65b4b146105cf5780636c0360eb146105e65761025c565b80632f745c591461044457806334918dfd14610481578063379607f5146104985780633ccfd60b146104c157806342842e0e146104d85761025c565b806318160ddd1161022457806318160ddd1461035a5780631b2ef1ca1461038557806323b872dd146103a15780632713727a146103ca5780632c84c31b146104075761025c565b806301ffc9a71461026157806302d05d3f1461029e57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190614506565b610a0d565b60405161029591906152fd565b60405180910390f35b3480156102aa57600080fd5b506102b3610a87565b6040516102c09190615252565b60405180910390f35b3480156102d557600080fd5b506102de610aad565b6040516102eb9190615318565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906145da565b610b3f565b6040516103289190615252565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190614489565b610bc4565b005b34801561036657600080fd5b5061036f610cdc565b60405161037c919061567a565b60405180910390f35b61039f600480360381019061039a9190614603565b610ce9565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190614383565b610e4d565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906145da565b610ead565b6040516103fe91906152fd565b60405180910390f35b34801561041357600080fd5b5061042e600480360381019061042991906145da565b610ecd565b60405161043b9190615318565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190614489565b610f6d565b604051610478919061567a565b60405180910390f35b34801561048d57600080fd5b50610496611012565b005b3480156104a457600080fd5b506104bf60048036038101906104ba91906145da565b6110ba565b005b3480156104cd57600080fd5b506104d6611370565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190614383565b61143b565b005b34801561050d57600080fd5b50610528600480360381019061052391906145da565b61145b565b604051610535919061567a565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190614558565b6114f2565b005b34801561057357600080fd5b5061057c611588565b60405161058991906152fd565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b491906145da565b61159b565b6040516105c69190615252565b60405180910390f35b3480156105db57600080fd5b506105e461164d565b005b3480156105f257600080fd5b506105fb611811565b6040516106089190615318565b60405180910390f35b34801561061d57600080fd5b5061062661189f565b005b34801561063457600080fd5b5061064f600480360381019061064a91906142f5565b611947565b60405161065c919061567a565b60405180910390f35b34801561067157600080fd5b5061067a6119ff565b005b34801561068857600080fd5b506106a3600480360381019061069e91906142f5565b611a87565b005b3480156106b157600080fd5b506106ba611c01565b6040516106c791906152fd565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906142f5565b611c14565b60405161070491906152db565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906142f5565b611d90565b60405161074191906152fd565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c9190614558565b611e3a565b60405161077e91906152fd565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906142f5565b611e70565b6040516107bb91906152b9565b60405180910390f35b3480156107d057600080fd5b506107d96121d3565b6040516107e69190615252565b60405180910390f35b3480156107fb57600080fd5b50610816600480360381019061081191906145da565b6121fd565b005b34801561082457600080fd5b5061082d612283565b60405161083a9190615318565b60405180910390f35b34801561084f57600080fd5b50610858612315565b604051610865919061567a565b60405180910390f35b34801561087a57600080fd5b506108956004803603810190610890919061444d565b61231b565b005b3480156108a357600080fd5b506108be60048036038101906108b991906143d2565b61249c565b005b3480156108cc57600080fd5b506108d56124fe565b6040516108e2919061567a565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d91906145da565b612504565b60405161091f9190615318565b60405180910390f35b34801561093457600080fd5b5061094f600480360381019061094a9190614603565b612590565b005b34801561095d57600080fd5b5061097860048036038101906109739190614347565b61261b565b60405161098591906152fd565b60405180910390f35b34801561099a57600080fd5b506109a36126af565b6040516109b09190615252565b60405180910390f35b3480156109c557600080fd5b506109ce6126d5565b6040516109db919061567a565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a0691906142f5565b6126db565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a805750610a7f826127eb565b5b9050919050565b609560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008054610abc906159c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae8906159c0565b8015610b355780601f10610b0a57610100808354040283529160200191610b35565b820191906000526020600020905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b6000610b4a826128cd565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061555a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bcf8261159b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c37906155fa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c5f612939565b73ffffffffffffffffffffffffffffffffffffffff161480610c8e5750610c8d81610c88612939565b61261b565b5b610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc4906154ba565b60405180910390fd5b610cd78383612941565b505050565b6000600880549050905090565b608f60009054906101000a900460ff16610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f906155da565b60405180910390fd5b600082118015610d4a5750608d548211155b610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d809061533a565b60405180910390fd5b608c54610da683610d98610cdc565b6129fa90919063ffffffff16565b1115610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde9061543a565b60405180910390fd5b610dfc82608e54612a1090919063ffffffff16565b341015610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359061551a565b60405180910390fd5b610e49338383612a26565b5050565b610e5e610e58612939565b82612ab4565b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e949061561a565b60405180910390fd5b610ea8838383612b92565b505050565b60916020528060005260406000206000915054906101000a900460ff1681565b60926020528060005260406000206000915090508054610eec906159c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906159c0565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b505050505081565b6000610f7883611947565b8210610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb09061535a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61101a612939565b73ffffffffffffffffffffffffffffffffffffffff166110386121d3565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110859061557a565b60405180910390fd5b608f60009054906101000a900460ff1615608f60006101000a81548160ff021916908315150217905550565b608f60019054906101000a900460ff16611109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111009061563a565b60405180910390fd5b6091600082815260200190815260200160002060009054906101000a900460ff161561116a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611161906153da565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016111dc919061567a565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122c919061431e565b73ffffffffffffffffffffffffffffffffffffffff1614611282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112799061545a565b60405180910390fd5b6000609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368633620836040518263ffffffff1660e01b81526004016112df919061567a565b60006040518083038186803b1580156112f757600080fd5b505afa15801561130b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113349190614599565b905060016091600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061136c3382612dee565b5050565b611378612939565b73ffffffffffffffffffffffffffffffffffffffff166113966121d3565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e39061557a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611437573d6000803e3d6000fd5b5050565b6114568383836040518060200160405280600081525061249c565b505050565b6000611465610cdc565b82106114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061565a565b60405180910390fd5b600882815481106114e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6114fa612939565b73ffffffffffffffffffffffffffffffffffffffff166115186121d3565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115659061557a565b60405180910390fd5b8060909080519060200190611584929190613ff1565b5050565b608f60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b906154fa565b60405180910390fd5b80915050919050565b611655612939565b73ffffffffffffffffffffffffffffffffffffffff166116736121d3565b73ffffffffffffffffffffffffffffffffffffffff16146116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c09061557a565b60405180910390fd5b60005b61020081101561180e576000609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368633620836040518263ffffffff1660e01b8152600401611733919061567a565b60006040518083038186803b15801561174b57600080fd5b505afa15801561175f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117889190614599565b905060001515600b8260405161179e919061519a565b908152602001604051809103902060009054906101000a900460ff16151514156117fa576001600b826040516117d4919061519a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505b508080611806906159f2565b9150506116cc565b50565b6090805461181e906159c0565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906159c0565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b505050505081565b6118a7612939565b73ffffffffffffffffffffffffffffffffffffffff166118c56121d3565b73ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119129061557a565b60405180910390fd5b608f60019054906101000a900460ff1615608f60016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af906154da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a07612939565b73ffffffffffffffffffffffffffffffffffffffff16611a256121d3565b73ffffffffffffffffffffffffffffffffffffffff1614611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a729061557a565b60405180910390fd5b611a856000612e76565b565b608f60019054906101000a900460ff16611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd9061563a565b60405180910390fd5b611adf81611d90565b15611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b169061549a565b60405180910390fd5b6000611b2a82611e70565b905060005b8151811015611bfc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828281518110611b92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015114611be957611be8828281518110611bdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516110ba565b5b8080611bf4906159f2565b915050611b2f565b505050565b608f60019054906101000a900460ff1681565b60606000611c2183611947565b90506000811415611ca457600067ffffffffffffffff811115611c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c9b5781602001602082028036833780820191505090505b50915050611d8b565b60008167ffffffffffffffff811115611ce6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d145781602001602082028036833780820191505090505b50905060005b82811015611d8457611d2c8582610f6d565b828281518110611d65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611d7c906159f2565b915050611d1a565b8193505050505b919050565b600080611d9c83611e70565b905060006001905060005b8251811015611e2f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff838281518110611e0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015114611e1c57600091505b8080611e27906159f2565b915050611da7565b508092505050919050565b600b818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60606000609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c846040518263ffffffff1660e01b8152600401611ecf9190615252565b60006040518083038186803b158015611ee757600080fd5b505afa158015611efb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f2491906144c5565b90506000815167ffffffffffffffff811115611f69577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f975781602001602082028036833780820191505090505b5090506000805b83518110156121c7576000848281518110611fe2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848381518110612046577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508673ffffffffffffffffffffffffffffffffffffffff16609460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016120c4919061567a565b60206040518083038186803b1580156120dc57600080fd5b505afa1580156120f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612114919061431e565b73ffffffffffffffffffffffffffffffffffffffff1614156121b3576091600082815260200190815260200160002060009054906101000a900460ff166121b25761215e81612f3c565b848481518110612197577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505082806121ae906159f2565b9350505b5b5080806121bf906159f2565b915050611f9e565b50819350505050919050565b6000608b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612205612939565b73ffffffffffffffffffffffffffffffffffffffff166122236121d3565b73ffffffffffffffffffffffffffffffffffffffff1614612279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122709061557a565b60405180910390fd5b80608e8190555050565b606060018054612292906159c0565b80601f01602080910402602001604051908101604052809291908181526020018280546122be906159c0565b801561230b5780601f106122e05761010080835404028352916020019161230b565b820191906000526020600020905b8154815290600101906020018083116122ee57829003601f168201915b5050505050905090565b608e5481565b612323612939565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612391576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123889061541a565b60405180910390fd5b806005600061239e612939565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661244b612939565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161249091906152fd565b60405180910390a35050565b6124ad6124a7612939565b83612ab4565b6124ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e39061561a565b60405180910390fd5b6124f884848484612f59565b50505050565b608d5481565b606061250f826128cd565b61254e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612545906155ba565b60405180910390fd5b612556612fb5565b6092600084815260200190815260200160002060405160200161257a9291906151d5565b6040516020818303038152906040529050919050565b612598612939565b73ffffffffffffffffffffffffffffffffffffffff166125b66121d3565b73ffffffffffffffffffffffffffffffffffffffff161461260c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126039061557a565b60405180910390fd5b612617338383612a26565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b609360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b608c5481565b6126e3612939565b73ffffffffffffffffffffffffffffffffffffffff166127016121d3565b73ffffffffffffffffffffffffffffffffffffffff1614612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e9061557a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127be9061539a565b60405180910390fd5b6127d081612e76565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128c657506128c582613047565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129b48361159b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008183612a08919061581c565b905092915050565b60008183612a1e9190615872565b905092915050565b60005b82811015612aae576000612a3b610cdc565b9050608c54612a48610cdc565b1015612a9a576000612a648385612a5f9190615872565b6130b1565b905080609260008481526020019081526020016000209080519060200190612a8d929190613ff1565b50612a988683613470565b505b508080612aa6906159f2565b915050612a29565b50505050565b6000612abf826128cd565b612afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af59061547a565b60405180910390fd5b6000612b098361159b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b7857508373ffffffffffffffffffffffffffffffffffffffff16612b6084610b3f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b895750612b88818561261b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bb28261159b565b73ffffffffffffffffffffffffffffffffffffffff1614612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff9061559a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f906153fa565b60405180910390fd5b612c8383838361348e565b612c8e600082612941565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cde91906158cc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d35919061581c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612df8610cdc565b9050608c54612e05610cdc565b1015612e7157600082612e1b84600060016135a2565b604051602001612e2c9291906151b1565b604051602081830303815290604052905080609260008481526020019081526020016000209080519060200190612e64929190613ff1565b50612e6f8483613470565b505b505050565b6000608b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081608b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808290506000811215612f5057600080fd5b80915050919050565b612f64848484612b92565b612f7084848484613710565b612faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa69061537a565b60405180910390fd5b50505050565b606060908054612fc4906159c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff0906159c0565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60605b60011561346a57600060405180602001604052806000815250905060005b6001600c805490506130e491906158cc565b81101561326c576000600c8281548110613127577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805480602002602001604051908101604052809291908181526020016000905b8282101561321f5783829060005260206000209060020201604051806040016040529081600082018054613184906159c0565b80601f01602080910402602001604051908101604052809291908181526020018280546131b0906159c0565b80156131fd5780601f106131d2576101008083540402835291602001916131fd565b820191906000526020600020905b8154815290600101906020018083116131e057829003601f168201915b5050505050815260200160018201548152505081526020019060010190613151565b505050509050600061323182876138a7565b905083816040516020016132469291906151b1565b604051602081830303815290604052935050508080613264906159f2565b9150506130d2565b5060001515600b82604051613281919061519a565b908152602001604051809103902060009054906101000a900460ff1615151415613464576001600b826040516132b7919061519a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506000600c6001600c805490506132f291906158cc565b81548110613329577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805480602002602001604051908101604052809291908181526020016000905b828210156134215783829060005260206000209060020201604051806040016040529081600082018054613386906159c0565b80601f01602080910402602001604051908101604052809291908181526020018280546133b2906159c0565b80156133ff5780601f106133d4576101008083540402835291602001916133ff565b820191906000526020600020905b8154815290600101906020018083116133e257829003601f168201915b5050505050815260200160018201548152505081526020019060010190613353565b505050509050600061343382866138a7565b905082816040516020016134489291906151b1565b604051602081830303815290604052925082935050505061346b565b506130b4565b5b919050565b61348a8282604051806020016040528060008152506139ec565b5050565b6134998383836127e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134dc576134d781613a47565b61351b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461351a576135198382613a90565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561355e5761355981613bfd565b61359d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461359c5761359b8282613d40565b5b5b505050565b60606000849050600084846135b791906158cc565b67ffffffffffffffff8111156135f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136285781602001600182028036833780820191505090505b50905060008590505b8481101561370357828181518110613672577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82878361368a91906158cc565b815181106136c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806136fb906159f2565b915050613631565b5080925050509392505050565b60006137318473ffffffffffffffffffffffffffffffffffffffff166127d3565b1561389a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261375a612939565b8786866040518563ffffffff1660e01b815260040161377c949392919061526d565b602060405180830381600087803b15801561379657600080fd5b505af19250505080156137c757506040513d601f19601f820116820180604052508101906137c4919061452f565b60015b61384a573d80600081146137f7576040519150601f19603f3d011682016040523d82523d6000602084013e6137fc565b606091505b50600081511415613842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138399061537a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061389f565b600190505b949350505050565b606060006138b6836064613dbf565b90506060600080600090505b86518110156139df5783878281518110613905577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160200151116139cc57600082141561396f57868181518110613958577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001519250600191506139cb565b600061397c876002613dbf565b11156139ca578681815181106139bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015192505b5b5b80806139d7906159f2565b9150506138c2565b5081935050505092915050565b6139f68383613e23565b613a036000848484613710565b613a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a399061537a565b60405180910390fd5b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a9d84611947565b613aa791906158cc565b9050600060076000848152602001908152602001600020549050818114613b8c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c1191906158cc565b9050600060096000848152602001908152602001600020549050600060088381548110613c67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d4b83611947565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080824233600a5487604051602001613ddc9493929190615204565b6040516020818303038152906040528051906020012060001c613dff9190615a69565b9050600a6000815480929190613e14906159f2565b91905055508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8a9061553a565b60405180910390fd5b613e9c816128cd565b15613edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ed3906153ba565b60405180910390fd5b613ee86000838361348e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f38919061581c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613ffd906159c0565b90600052602060002090601f01602090048101928261401f5760008555614066565b82601f1061403857805160ff1916838001178555614066565b82800160010185558215614066579182015b8281111561406557825182559160200191906001019061404a565b5b5090506140739190614077565b5090565b5b80821115614090576000816000905550600101614078565b5090565b60006140a76140a2846156c6565b615695565b905080838252602082019050828560208602820111156140c657600080fd5b60005b858110156140f657816140dc88826142e0565b8452602084019350602083019250506001810190506140c9565b5050509392505050565b600061411361410e846156f2565b615695565b90508281526020810184848401111561412b57600080fd5b61413684828561597e565b509392505050565b600061415161414c84615722565b615695565b90508281526020810184848401111561416957600080fd5b61417484828561597e565b509392505050565b600061418f61418a84615722565b615695565b9050828152602081018484840111156141a757600080fd5b6141b284828561598d565b509392505050565b6000813590506141c981615b74565b92915050565b6000815190506141de81615b74565b92915050565b600082601f8301126141f557600080fd5b8151614205848260208601614094565b91505092915050565b60008135905061421d81615b8b565b92915050565b60008135905061423281615ba2565b92915050565b60008151905061424781615ba2565b92915050565b600082601f83011261425e57600080fd5b813561426e848260208601614100565b91505092915050565b600082601f83011261428857600080fd5b813561429884826020860161413e565b91505092915050565b600082601f8301126142b257600080fd5b81516142c284826020860161417c565b91505092915050565b6000813590506142da81615bb9565b92915050565b6000815190506142ef81615bb9565b92915050565b60006020828403121561430757600080fd5b6000614315848285016141ba565b91505092915050565b60006020828403121561433057600080fd5b600061433e848285016141cf565b91505092915050565b6000806040838503121561435a57600080fd5b6000614368858286016141ba565b9250506020614379858286016141ba565b9150509250929050565b60008060006060848603121561439857600080fd5b60006143a6868287016141ba565b93505060206143b7868287016141ba565b92505060406143c8868287016142cb565b9150509250925092565b600080600080608085870312156143e857600080fd5b60006143f6878288016141ba565b9450506020614407878288016141ba565b9350506040614418878288016142cb565b925050606085013567ffffffffffffffff81111561443557600080fd5b6144418782880161424d565b91505092959194509250565b6000806040838503121561446057600080fd5b600061446e858286016141ba565b925050602061447f8582860161420e565b9150509250929050565b6000806040838503121561449c57600080fd5b60006144aa858286016141ba565b92505060206144bb858286016142cb565b9150509250929050565b6000602082840312156144d757600080fd5b600082015167ffffffffffffffff8111156144f157600080fd5b6144fd848285016141e4565b91505092915050565b60006020828403121561451857600080fd5b600061452684828501614223565b91505092915050565b60006020828403121561454157600080fd5b600061454f84828501614238565b91505092915050565b60006020828403121561456a57600080fd5b600082013567ffffffffffffffff81111561458457600080fd5b61459084828501614277565b91505092915050565b6000602082840312156145ab57600080fd5b600082015167ffffffffffffffff8111156145c557600080fd5b6145d1848285016142a1565b91505092915050565b6000602082840312156145ec57600080fd5b60006145fa848285016142cb565b91505092915050565b6000806040838503121561461657600080fd5b6000614624858286016142cb565b9250506020614635858286016142cb565b9150509250929050565b600061464b8383614799565b60208301905092915050565b60006146638383615165565b60208301905092915050565b61467881615900565b82525050565b61468f61468a82615900565b615a3b565b82525050565b60006146a082615787565b6146aa81856157cd565b93506146b583615752565b8060005b838110156146e65781516146cd888261463f565b97506146d8836157b3565b9250506001810190506146b9565b5085935050505092915050565b60006146fe82615792565b61470881856157de565b935061471383615762565b8060005b8381101561474457815161472b8882614657565b9750614736836157c0565b925050600181019050614717565b5085935050505092915050565b61475a81615912565b82525050565b600061476b8261579d565b61477581856157ef565b935061478581856020860161598d565b61478e81615b56565b840191505092915050565b6147a28161594a565b82525050565b60006147b3826157a8565b6147bd8185615800565b93506147cd81856020860161598d565b6147d681615b56565b840191505092915050565b60006147ec826157a8565b6147f68185615811565b935061480681856020860161598d565b80840191505092915050565b6000815461481f816159c0565b6148298186615811565b94506001821660008114614844576001811461485557614888565b60ff19831686528186019350614888565b61485e85615772565b60005b8381101561488057815481890152600182019150602081019050614861565b838801955050505b50505092915050565b600061489e601383615800565b91507f4d617820697320313020617420612074696d65000000000000000000000000006000830152602082019050919050565b60006148de602b83615800565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000614944603283615800565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006149aa602683615800565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a10601c83615800565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614a50601d83615800565b91507f5468697320746f6b656e20697320616c7265616479206d696e7465642e0000006000830152602082019050919050565b6000614a90602483615800565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614af6601983615800565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614b36601683615800565b91507f536f72727920746f6f206d616e79206e6f626f647921000000000000000000006000830152602082019050919050565b6000614b76601c83615800565b91507f4e6f7420746865206f776e6572206f6620746869732064756465732e000000006000830152602082019050919050565b6000614bb6602c83615800565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614c1c601c83615800565b91507f416c6c20796f757220746f6b656e732061726520636c61696d65642e000000006000830152602082019050919050565b6000614c5c603883615800565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614cc2602a83615800565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d28602983615800565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d8e602083615800565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374216000830152602082019050919050565b6000614dce602083615800565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614e0e602c83615800565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614e74602083615800565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614eb4602983615800565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f1a602f83615800565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f80601383615800565b91507f53616c65206973206e6f742061637469766521000000000000000000000000006000830152602082019050919050565b6000614fc0602183615800565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615026603183615800565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061508c601883615800565b91507f436c61696d206973206e6f7420616374697665207965742e00000000000000006000830152602082019050919050565b60006150cc602c83615800565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000615132600183615811565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61516e81615974565b82525050565b61517d81615974565b82525050565b61519461518f82615974565b615a5f565b82525050565b60006151a682846147e1565b915081905092915050565b60006151bd82856147e1565b91506151c982846147e1565b91508190509392505050565b60006151e182856147e1565b91506151ec82615125565b91506151f88284614812565b91508190509392505050565b60006152108287615183565b602082019150615220828661467e565b6014820191506152308285615183565b6020820191506152408284615183565b60208201915081905095945050505050565b6000602082019050615267600083018461466f565b92915050565b6000608082019050615282600083018761466f565b61528f602083018661466f565b61529c6040830185615174565b81810360608301526152ae8184614760565b905095945050505050565b600060208201905081810360008301526152d38184614695565b905092915050565b600060208201905081810360008301526152f581846146f3565b905092915050565b60006020820190506153126000830184614751565b92915050565b6000602082019050818103600083015261533281846147a8565b905092915050565b6000602082019050818103600083015261535381614891565b9050919050565b60006020820190508181036000830152615373816148d1565b9050919050565b6000602082019050818103600083015261539381614937565b9050919050565b600060208201905081810360008301526153b38161499d565b9050919050565b600060208201905081810360008301526153d381614a03565b9050919050565b600060208201905081810360008301526153f381614a43565b9050919050565b6000602082019050818103600083015261541381614a83565b9050919050565b6000602082019050818103600083015261543381614ae9565b9050919050565b6000602082019050818103600083015261545381614b29565b9050919050565b6000602082019050818103600083015261547381614b69565b9050919050565b6000602082019050818103600083015261549381614ba9565b9050919050565b600060208201905081810360008301526154b381614c0f565b9050919050565b600060208201905081810360008301526154d381614c4f565b9050919050565b600060208201905081810360008301526154f381614cb5565b9050919050565b6000602082019050818103600083015261551381614d1b565b9050919050565b6000602082019050818103600083015261553381614d81565b9050919050565b6000602082019050818103600083015261555381614dc1565b9050919050565b6000602082019050818103600083015261557381614e01565b9050919050565b6000602082019050818103600083015261559381614e67565b9050919050565b600060208201905081810360008301526155b381614ea7565b9050919050565b600060208201905081810360008301526155d381614f0d565b9050919050565b600060208201905081810360008301526155f381614f73565b9050919050565b6000602082019050818103600083015261561381614fb3565b9050919050565b6000602082019050818103600083015261563381615019565b9050919050565b600060208201905081810360008301526156538161507f565b9050919050565b60006020820190508181036000830152615673816150bf565b9050919050565b600060208201905061568f6000830184615174565b92915050565b6000604051905081810181811067ffffffffffffffff821117156156bc576156bb615b27565b5b8060405250919050565b600067ffffffffffffffff8211156156e1576156e0615b27565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561570d5761570c615b27565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561573d5761573c615b27565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061582782615974565b915061583283615974565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561586757615866615a9a565b5b828201905092915050565b600061587d82615974565b915061588883615974565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158c1576158c0615a9a565b5b828202905092915050565b60006158d782615974565b91506158e283615974565b9250828210156158f5576158f4615a9a565b5b828203905092915050565b600061590b82615954565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156159ab578082015181840152602081019050615990565b838111156159ba576000848401525b50505050565b600060028204905060018216806159d857607f821691505b602082108114156159ec576159eb615af8565b5b50919050565b60006159fd82615974565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615a3057615a2f615a9a565b5b600182019050919050565b6000615a4682615a4d565b9050919050565b6000615a5882615b67565b9050919050565b6000819050919050565b6000615a7482615974565b9150615a7f83615974565b925082615a8f57615a8e615ac9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615b7d81615900565b8114615b8857600080fd5b50565b615b9481615912565b8114615b9f57600080fd5b50565b615bab8161591e565b8114615bb657600080fd5b50565b615bc281615974565b8114615bcd57600080fd5b5056fea2646970667358221220addb28b83b86bb911571d84de6a09dd27335a6d727902582d56a35409d8371a764736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000c8a000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : _maxNobody (uint256): 3210
Arg [1] : _maxNobodyPerPurchase (uint256): 10

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000c8a
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a


Deployed Bytecode Sourcemap

56183:5696:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44063:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56854:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30951:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32510:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32033:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44703:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59290:425;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33400:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56588:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56660:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44371:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60946:87;;;;;;;;;;;;;:::i;:::-;;57508:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61335:137;;;;;;;;;;;;;:::i;:::-;;33810:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44893:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61229:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56483:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30645:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61622:250;;;;;;;;;;;;;:::i;:::-;;56558:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61039:90;;;;;;;;;;;;;:::i;:::-;;30375:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9467:94;;;;;;;;;;;;;:::i;:::-;;57139:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56520:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59721:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58979:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50820:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58358:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8816:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61135:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31120:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56421:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32803:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34066:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56379:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60165:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61478:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33169:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56705:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56346:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9716:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44063:224;44165:4;44204:35;44189:50;;;:11;:50;;;;:90;;;;44243:36;44267:11;44243:23;:36::i;:::-;44189:90;44182:97;;44063:224;;;:::o;56854:67::-;;;;;;;;;;;;;:::o;30951:100::-;31005:13;31038:5;31031:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30951:100;:::o;32510:221::-;32586:7;32614:16;32622:7;32614;:16::i;:::-;32606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32699:15;:24;32715:7;32699:24;;;;;;;;;;;;;;;;;;;;;32692:31;;32510:221;;;:::o;32033:411::-;32114:13;32130:23;32145:7;32130:14;:23::i;:::-;32114:39;;32178:5;32172:11;;:2;:11;;;;32164:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32272:5;32256:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32281:37;32298:5;32305:12;:10;:12::i;:::-;32281:16;:37::i;:::-;32256:62;32234:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32415:21;32424:2;32428:7;32415:8;:21::i;:::-;32033:411;;;:::o;44703:113::-;44764:7;44791:10;:17;;;;44784:24;;44703:113;:::o;59290:425::-;59366:12;;;;;;;;;;;59358:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;59431:1;59418:10;:14;:52;;;;;59450:20;;59436:10;:34;;59418:52;59410:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;59542:9;;59509:29;59527:10;59509:13;:11;:13::i;:::-;:17;;:29;;;;:::i;:::-;:42;;59501:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;59606:21;59616:10;59606:5;;:9;;:21;;;;:::i;:::-;59593:9;:34;;59585:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;59673:36;59679:10;59691;59703:5;59673;:36::i;:::-;59290:425;;:::o;33400:339::-;33595:41;33614:12;:10;:12::i;:::-;33628:7;33595:18;:41::i;:::-;33587:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33703:28;33713:4;33719:2;33723:7;33703:9;:28::i;:::-;33400:339;;;:::o;56588:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;56660:38::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44371:256::-;44468:7;44504:23;44521:5;44504:16;:23::i;:::-;44496:5;:31;44488:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44593:12;:19;44606:5;44593:19;;;;;;;;;;;;;;;:26;44613:5;44593:26;;;;;;;;;;;;44586:33;;44371:256;;;;:::o;60946:87::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61015:12:::1;;;;;;;;;;;61014:13;60999:12;;:28;;;;;;;;;;;;;;;;;;60946:87::o:0;57508:418::-;57563:13;;;;;;;;;;;57555:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57621:15;:25;57637:8;57621:25;;;;;;;;;;;;;;;;;;;;;57620:26;57612:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57733:10;57695:48;;:16;;;;;;;;;;;:24;;;57720:8;57695:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;57687:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;57783:25;57811:16;;;;;;;;;;;:22;;;57834:8;57811:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57783:60;;57878:4;57850:15;:25;57866:8;57850:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;57889:31;57896:10;57908:11;57889:6;:31::i;:::-;57508:418;;:::o;61335:137::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61381:15:::1;61399:21;61381:39;;61437:10;61429:28;;:37;61458:7;61429:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;9107:1;61335:137::o:0;33810:185::-;33948:39;33965:4;33971:2;33975:7;33948:39;;;;;;;;;;;;:16;:39::i;:::-;33810:185;;;:::o;44893:233::-;44968:7;45004:30;:28;:30::i;:::-;44996:5;:38;44988:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45101:10;45112:5;45101:17;;;;;;;;;;;;;;;;;;;;;;;;45094:24;;44893:233;;;:::o;61229:100::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61312:11:::1;61302:7;:21;;;;;;;;;;;;:::i;:::-;;61229:100:::0;:::o;56483:32::-;;;;;;;;;;;;;:::o;30645:239::-;30717:7;30737:13;30753:7;:16;30761:7;30753:16;;;;;;;;;;;;;;;;;;;;;30737:32;;30805:1;30788:19;;:5;:19;;;;30780:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30871:5;30864:12;;;30645:239;;;:::o;61622:250::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61676:9:::1;61671:196;61695:3;61691:1;:7;61671:196;;;61714:22;61739:16;;;;;;;;;;;:22;;;61762:1;61739:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61714:50;;61800:5;61777:28;;:9;61787:8;61777:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:28;;;61773:85;;;61842:4;61820:9;61830:8;61820:19;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;61773:85;61671:196;61700:3;;;;;:::i;:::-;;;;61671:196;;;;61622:250::o:0;56558:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61039:90::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61110:13:::1;;;;;;;;;;;61109:14;61093:13;;:30;;;;;;;;;;;;;;;;;;61039:90::o:0;30375:208::-;30447:7;30492:1;30475:19;;:5;:19;;;;30467:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30559:9;:16;30569:5;30559:16;;;;;;;;;;;;;;;;30552:23;;30375:208;;;:::o;9467:94::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9532:21:::1;9550:1;9532:9;:21::i;:::-;9467:94::o:0;57139:363::-;57195:13;;;;;;;;;;;57187:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57253:18;57264:6;57253:10;:18::i;:::-;57252:19;57244:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;57311:24;57338:19;57350:6;57338:11;:19::i;:::-;57311:46;;57369:9;57364:133;57388:8;:15;57384:1;:19;57364:133;;;57438:2;57423:8;57432:1;57423:11;;;;;;;;;;;;;;;;;;;;;;:17;57419:71;;57453:27;57467:8;57476:1;57467:11;;;;;;;;;;;;;;;;;;;;;;57453:5;:27::i;:::-;57419:71;57405:3;;;;;:::i;:::-;;;;57364:133;;;;57139:363;;:::o;56520:33::-;;;;;;;;;;;;;:::o;59721:438::-;59781:16;59806:18;59827:17;59837:6;59827:9;:17::i;:::-;59806:38;;59869:1;59855:10;:15;59851:303;;;59902:1;59888:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59881:23;;;;;59851:303;59927:23;59967:10;59953:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59927:51;;59987:13;60009:116;60033:10;60025:5;:18;60009:116;;;60081:34;60101:6;60109:5;60081:19;:34::i;:::-;60065:6;60072:5;60065:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;60045:7;;;;;:::i;:::-;;;;60009:116;;;60140:6;60133:13;;;;;59721:438;;;;:::o;58979:305::-;59036:4;59049:24;59076:19;59088:6;59076:11;:19::i;:::-;59049:46;;59102:15;59120:4;59102:22;;59136:9;59131:124;59155:8;:15;59151:1;:19;59131:124;;;59205:2;59190:8;59199:1;59190:11;;;;;;;;;;;;;;;;;;;;;;:17;59186:62;;59233:5;59220:18;;59186:62;59172:3;;;;;:::i;:::-;;;;59131:124;;;;59268:10;59261:17;;;;58979:305;;;:::o;50820:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58358:615::-;58416:15;58440:25;58468:16;;;;;;;;;;;:30;;;58499:6;58468:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58440:66;;58513:33;58562:8;:15;58549:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58513:65;;58585:13;58614:9;58609:328;58633:8;:15;58629:1;:19;58609:328;;;58664:15;58682:8;58691:1;58682:11;;;;;;;;;;;;;;;;;;;;;;58664:29;;58725:2;58702:17;58720:1;58702:20;;;;;;;;;;;;;;;;;;;;;:25;;;;;58777:6;58740:43;;:16;;;;;;;;;;;:24;;;58765:7;58740:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;58736:194;;;58801:15;:24;58817:7;58801:24;;;;;;;;;;;;;;;;;;;;;58796:125;;58867:22;:7;:20;:22::i;:::-;58840:17;58858:5;58840:24;;;;;;;;;;;;;;;;;;;;;:49;;;;;58902:7;;;;;:::i;:::-;;;;58796:125;58736:194;58609:328;58650:3;;;;;:::i;:::-;;;;58609:328;;;;58950:17;58943:24;;;;;58358:615;;;:::o;8816:87::-;8862:7;8889:6;;;;;;;;;;;8882:13;;8816:87;:::o;61135:86::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61206:9:::1;61198:5;:17;;;;61135:86:::0;:::o;31120:104::-;31176:13;31209:7;31202:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31120:104;:::o;56421:40::-;;;;:::o;32803:295::-;32918:12;:10;:12::i;:::-;32906:24;;:8;:24;;;;32898:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33018:8;32973:18;:32;32992:12;:10;:12::i;:::-;32973:32;;;;;;;;;;;;;;;:42;33006:8;32973:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33071:8;33042:48;;33057:12;:10;:12::i;:::-;33042:48;;;33081:8;33042:48;;;;;;:::i;:::-;;;;;;;;32803:295;;:::o;34066:328::-;34241:41;34260:12;:10;:12::i;:::-;34274:7;34241:18;:41::i;:::-;34233:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34347:39;34361:4;34367:2;34371:7;34380:5;34347:13;:39::i;:::-;34066:328;;;;:::o;56379:37::-;;;;:::o;60165:252::-;60239:13;60269:17;60277:8;60269:7;:17::i;:::-;60261:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;60376:10;:8;:10::i;:::-;60393:6;:16;60400:8;60393:16;;;;;;;;;;;60359:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60345:66;;60165:252;;;:::o;61478:136::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61572:36:::1;61578:10;61590;61602:5;61572;:36::i;:::-;61478:136:::0;;:::o;33169:164::-;33266:4;33290:18;:25;33309:5;33290:25;;;;;;;;;;;;;;;:35;33316:8;33290:35;;;;;;;;;;;;;;;;;;;;;;;;;33283:42;;33169:164;;;;:::o;56705:75::-;;;;;;;;;;;;;:::o;56346:28::-;;;;:::o;9716:192::-;9047:12;:10;:12::i;:::-;9036:23;;:7;:5;:7::i;:::-;:23;;;9028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9825:1:::1;9805:22;;:8;:22;;;;9797:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9881:19;9891:8;9881:9;:19::i;:::-;9716:192:::0;:::o;18272:387::-;18332:4;18540:12;18607:7;18595:20;18587:28;;18650:1;18643:4;:8;18636:15;;;18272:387;;;:::o;41996:126::-;;;;:::o;30006:305::-;30108:4;30160:25;30145:40;;;:11;:40;;;;:105;;;;30217:33;30202:48;;;:11;:48;;;;30145:105;:158;;;;30267:36;30291:11;30267:23;:36::i;:::-;30145:158;30125:178;;30006:305;;;:::o;35904:127::-;35969:4;36021:1;35993:30;;:7;:16;36001:7;35993:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35986:37;;35904:127;;;:::o;7604:98::-;7657:7;7684:10;7677:17;;7604:98;:::o;39886:174::-;39988:2;39961:15;:24;39977:7;39961:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40044:7;40040:2;40006:46;;40015:23;40030:7;40015:14;:23::i;:::-;40006:46;;;;;;;;;;;;39886:174;;:::o;2803:98::-;2861:7;2892:1;2888;:5;;;;:::i;:::-;2881:12;;2803:98;;;;:::o;3541:::-;3599:7;3630:1;3626;:5;;;;:::i;:::-;3619:12;;3541:98;;;;:::o;60425:389::-;60506:9;60501:308;60525:10;60521:1;:14;60501:308;;;60551:17;60571:13;:11;:13::i;:::-;60551:33;;60619:9;;60603:13;:11;:13::i;:::-;:25;60599:203;;;60649:22;60674:21;60693:1;60685:5;:9;;;;:::i;:::-;60674:10;:21::i;:::-;60649:46;;60734:8;60714:6;:17;60721:9;60714:17;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;60761:25;60771:3;60776:9;60761;:25::i;:::-;60599:203;;60501:308;60537:3;;;;;:::i;:::-;;;;60501:308;;;;60425:389;;;:::o;36198:348::-;36291:4;36316:16;36324:7;36316;:16::i;:::-;36308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36392:13;36408:23;36423:7;36408:14;:23::i;:::-;36392:39;;36461:5;36450:16;;:7;:16;;;:51;;;;36494:7;36470:31;;:20;36482:7;36470:11;:20::i;:::-;:31;;;36450:51;:87;;;;36505:32;36522:5;36529:7;36505:16;:32::i;:::-;36450:87;36442:96;;;36198:348;;;;:::o;39190:578::-;39349:4;39322:31;;:23;39337:7;39322:14;:23::i;:::-;:31;;;39314:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39432:1;39418:16;;:2;:16;;;;39410:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39488:39;39509:4;39515:2;39519:7;39488:20;:39::i;:::-;39592:29;39609:1;39613:7;39592:8;:29::i;:::-;39653:1;39634:9;:15;39644:4;39634:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39682:1;39665:9;:13;39675:2;39665:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39713:2;39694:7;:16;39702:7;39694:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39752:7;39748:2;39733:27;;39742:4;39733:27;;;;;;;;;;;;39190:578;;;:::o;57932:421::-;58006:17;58026:13;:11;:13::i;:::-;58006:33;;58072:9;;58056:13;:11;:13::i;:::-;:25;58052:296;;;58102:22;58151:11;58165:27;58176:11;58188:1;58190;58165:10;:27::i;:::-;58134:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58102:92;;58233:8;58213:6;:17;58220:9;58213:17;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;58307:25;58317:3;58322:9;58307;:25::i;:::-;58052:296;;57932:421;;;:::o;9916:173::-;9972:16;9991:6;;;;;;;;;;;9972:25;;10017:8;10008:6;;:17;;;;;;;;;;;;;;;;;;10072:8;10041:40;;10062:8;10041:40;;;;;;;;;;;;9916:173;;:::o;50404:134::-;50460:6;50475:8;50493:1;50475:20;;50515:1;50510;:6;;50502:15;;;;;;50531:1;50524:8;;;50404:134;;;:::o;35276:315::-;35433:28;35443:4;35449:2;35453:7;35433:9;:28::i;:::-;35480:48;35503:4;35509:2;35513:7;35522:5;35480:22;:48::i;:::-;35472:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35276:315;;;;:::o;60820:102::-;60880:13;60909:7;60902:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60820:102;:::o;28497:157::-;28582:4;28621:25;28606:40;;;:11;:40;;;;28599:47;;28497:157;;;:::o;51148:642::-;51198:13;51220:565;51227:4;51220:565;;;51242:16;:21;;;;;;;;;;;;;;51277:6;51272:221;51307:1;51289:10;:17;;;;:19;;;;:::i;:::-;51287:1;:21;51272:221;;;51326:24;51353:10;51364:1;51353:13;;;;;;;;;;;;;;;;;;;;;;;51326:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51377:21;51401:29;51413:9;51424:5;51401:11;:29::i;:::-;51377:53;;51470:2;51474:7;51453:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51441:42;;51272:221;;51310:3;;;;;:::i;:::-;;;;51272:221;;;;51522:5;51505:22;;:9;51515:2;51505:13;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:22;;;51501:275;;;51556:4;51540:9;51550:2;51540:13;;;;;;:::i;:::-;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;51571:24;51598:10;51627:1;51609:10;:17;;;;:19;;;;:::i;:::-;51598:31;;;;;;;;;;;;;;;;;;;;;;;51571:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51640:21;51664:29;51676:9;51687:5;51664:11;:29::i;:::-;51640:53;;51733:2;51737:7;51716:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51704:42;;51764:2;51757:9;;;;;;;51501:275;51220:565;;;;51148:642;;;;:::o;36888:110::-;36964:26;36974:2;36978:7;36964:26;;;;;;;;;;;;:9;:26::i;:::-;36888:110;;:::o;45739:589::-;45883:45;45910:4;45916:2;45920:7;45883:26;:45::i;:::-;45961:1;45945:18;;:4;:18;;;45941:187;;;45980:40;46012:7;45980:31;:40::i;:::-;45941:187;;;46050:2;46042:10;;:4;:10;;;46038:90;;46069:47;46102:4;46108:7;46069:32;:47::i;:::-;46038:90;45941:187;46156:1;46142:16;;:2;:16;;;46138:183;;;46175:45;46212:7;46175:36;:45::i;:::-;46138:183;;;46248:4;46242:10;;:2;:10;;;46238:83;;46269:40;46297:2;46301:7;46269:27;:40::i;:::-;46238:83;46138:183;45739:589;;;:::o;54741:346::-;54835:13;54857:21;54887:3;54857:34;;54898:19;54939:10;54930:8;:19;;;;:::i;:::-;54920:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54898:52;;54961:6;54970:10;54961:19;;54957:97;54986:8;54982:1;:12;54957:97;;;55035:8;55044:1;55035:11;;;;;;;;;;;;;;;;;;;;;;;;55012:6;55021:10;55019:1;:12;;;;:::i;:::-;55012:20;;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;54996:3;;;;;:::i;:::-;;;;54957:97;;;;55074:6;55060:21;;;;54741:346;;;;;:::o;40625:799::-;40780:4;40801:15;:2;:13;;;:15::i;:::-;40797:620;;;40853:2;40837:36;;;40874:12;:10;:12::i;:::-;40888:4;40894:7;40903:5;40837:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40833:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41096:1;41079:6;:13;:18;41075:272;;;41122:60;;;;;;;;;;:::i;:::-;;;;;;;;41075:272;41297:6;41291:13;41282:6;41278:2;41274:15;41267:38;40833:529;40970:41;;;40960:51;;;:6;:51;;;;40953:58;;;;;40797:620;41401:4;41394:11;;40625:799;;;;;;;:::o;51796:520::-;51871:13;51893:6;51902:30;51910:5;50781:3;51902:7;:30::i;:::-;51893:39;;51939:24;51970:10;51992:6;51999:1;51992:8;;51987:300;52004:7;:14;52002:1;:16;51987:300;;;52058:1;52038:7;52046:1;52038:10;;;;;;;;;;;;;;;;;;;;;;:16;;;:21;52034:246;;52085:1;52076:5;:10;52072:199;;;52114:7;52122:1;52114:10;;;;;;;;;;;;;;;;;;;;;;:13;;;52101:26;;52148:1;52140:9;;52072:199;;;52202:1;52182:17;52190:5;52197:1;52182:7;:17::i;:::-;:21;52178:82;;;52233:7;52241:1;52233:10;;;;;;;;;;;;;;;;;;;;;;:13;;;52220:26;;52178:82;52072:199;52034:246;52020:3;;;;;:::i;:::-;;;;51987:300;;;;52300:10;52293:17;;;;;51796:520;;;;:::o;37225:321::-;37355:18;37361:2;37365:7;37355:5;:18::i;:::-;37406:54;37437:1;37441:2;37445:7;37454:5;37406:22;:54::i;:::-;37384:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37225:321;;;:::o;47051:164::-;47155:10;:17;;;;47128:15;:24;47144:7;47128:24;;;;;;;;;;;:44;;;;47183:10;47199:7;47183:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47051:164;:::o;47842:988::-;48108:22;48158:1;48133:22;48150:4;48133:16;:22::i;:::-;:26;;;;:::i;:::-;48108:51;;48170:18;48191:17;:26;48209:7;48191:26;;;;;;;;;;;;48170:47;;48338:14;48324:10;:28;48320:328;;48369:19;48391:12;:18;48404:4;48391:18;;;;;;;;;;;;;;;:34;48410:14;48391:34;;;;;;;;;;;;48369:56;;48475:11;48442:12;:18;48455:4;48442:18;;;;;;;;;;;;;;;:30;48461:10;48442:30;;;;;;;;;;;:44;;;;48592:10;48559:17;:30;48577:11;48559:30;;;;;;;;;;;:43;;;;48320:328;;48744:17;:26;48762:7;48744:26;;;;;;;;;;;48737:33;;;48788:12;:18;48801:4;48788:18;;;;;;;;;;;;;;;:34;48807:14;48788:34;;;;;;;;;;;48781:41;;;47842:988;;;;:::o;49125:1079::-;49378:22;49423:1;49403:10;:17;;;;:21;;;;:::i;:::-;49378:46;;49435:18;49456:15;:24;49472:7;49456:24;;;;;;;;;;;;49435:45;;49807:19;49829:10;49840:14;49829:26;;;;;;;;;;;;;;;;;;;;;;;;49807:48;;49893:11;49868:10;49879;49868:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;50004:10;49973:15;:28;49989:11;49973:28;;;;;;;;;;;:41;;;;50145:15;:24;50161:7;50145:24;;;;;;;;;;;50138:31;;;50180:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49125:1079;;;;:::o;46629:221::-;46714:14;46731:20;46748:2;46731:16;:20::i;:::-;46714:37;;46789:7;46762:12;:16;46775:2;46762:16;;;;;;;;;;;;;;;:24;46779:6;46762:24;;;;;;;;;;;:34;;;;46836:6;46807:17;:26;46825:7;46807:26;;;;;;;;;;;:35;;;;46629:221;;;:::o;54529:204::-;54589:4;54602:6;54692;54644:15;54661:10;54673:5;;54680;54627:59;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54617:70;;;;;;54612:76;;54611:87;;;;:::i;:::-;54602:96;;54705:5;;:7;;;;;;;;;:::i;:::-;;;;;;54726:1;54719:8;;;54529:204;;;;:::o;37882:382::-;37976:1;37962:16;;:2;:16;;;;37954:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38035:16;38043:7;38035;:16::i;:::-;38034:17;38026:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38097:45;38126:1;38130:2;38134:7;38097:20;:45::i;:::-;38172:1;38155:9;:13;38165:2;38155:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38203:2;38184:7;:16;38192:7;38184:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38248:7;38244:2;38223:33;;38240:1;38223:33;;;;;;;;;;;;37882:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:644:1:-;;156:80;171:64;228:6;171:64;:::i;:::-;156:80;:::i;:::-;147:89;;256:5;284:6;277:5;270:21;310:4;303:5;299:16;292:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;402:1;399;392:12;350:2;430:1;415:247;440:6;437:1;434:13;415:247;;;507:3;535:48;579:3;567:10;535:48;:::i;:::-;530:3;523:61;613:4;608:3;604:14;597:21;;647:4;642:3;638:14;631:21;;475:187;462:1;459;455:9;450:14;;415:247;;;419:14;137:531;;;;;;;:::o;674:342::-;;776:64;791:48;832:6;791:48;:::i;:::-;776:64;:::i;:::-;767:73;;863:6;856:5;849:21;901:4;894:5;890:16;939:3;930:6;925:3;921:16;918:25;915:2;;;956:1;953;946:12;915:2;969:41;1003:6;998:3;993;969:41;:::i;:::-;757:259;;;;;;:::o;1022:344::-;;1125:65;1140:49;1182:6;1140:49;:::i;:::-;1125:65;:::i;:::-;1116:74;;1213:6;1206:5;1199:21;1251:4;1244:5;1240:16;1289:3;1280:6;1275:3;1271:16;1268:25;1265:2;;;1306:1;1303;1296:12;1265:2;1319:41;1353:6;1348:3;1343;1319:41;:::i;:::-;1106:260;;;;;;:::o;1372:353::-;;1486:65;1501:49;1543:6;1501:49;:::i;:::-;1486:65;:::i;:::-;1477:74;;1574:6;1567:5;1560:21;1612:4;1605:5;1601:16;1650:3;1641:6;1636:3;1632:16;1629:25;1626:2;;;1667:1;1664;1657:12;1626:2;1680:39;1712:6;1707:3;1702;1680:39;:::i;:::-;1467:258;;;;;;:::o;1731:139::-;;1815:6;1802:20;1793:29;;1831:33;1858:5;1831:33;:::i;:::-;1783:87;;;;:::o;1876:143::-;;1964:6;1958:13;1949:22;;1980:33;2007:5;1980:33;:::i;:::-;1939:80;;;;:::o;2042:318::-;;2173:3;2166:4;2158:6;2154:17;2150:27;2140:2;;2191:1;2188;2181:12;2140:2;2224:6;2218:13;2249:105;2350:3;2342:6;2335:4;2327:6;2323:17;2249:105;:::i;:::-;2240:114;;2130:230;;;;;:::o;2366:133::-;;2447:6;2434:20;2425:29;;2463:30;2487:5;2463:30;:::i;:::-;2415:84;;;;:::o;2505:137::-;;2588:6;2575:20;2566:29;;2604:32;2630:5;2604:32;:::i;:::-;2556:86;;;;:::o;2648:141::-;;2735:6;2729:13;2720:22;;2751:32;2777:5;2751:32;:::i;:::-;2710:79;;;;:::o;2808:271::-;;2912:3;2905:4;2897:6;2893:17;2889:27;2879:2;;2930:1;2927;2920:12;2879:2;2970:6;2957:20;2995:78;3069:3;3061:6;3054:4;3046:6;3042:17;2995:78;:::i;:::-;2986:87;;2869:210;;;;;:::o;3099:273::-;;3204:3;3197:4;3189:6;3185:17;3181:27;3171:2;;3222:1;3219;3212:12;3171:2;3262:6;3249:20;3287:79;3362:3;3354:6;3347:4;3339:6;3335:17;3287:79;:::i;:::-;3278:88;;3161:211;;;;;:::o;3392:288::-;;3508:3;3501:4;3493:6;3489:17;3485:27;3475:2;;3526:1;3523;3516:12;3475:2;3559:6;3553:13;3584:90;3670:3;3662:6;3655:4;3647:6;3643:17;3584:90;:::i;:::-;3575:99;;3465:215;;;;;:::o;3686:139::-;;3770:6;3757:20;3748:29;;3786:33;3813:5;3786:33;:::i;:::-;3738:87;;;;:::o;3831:143::-;;3919:6;3913:13;3904:22;;3935:33;3962:5;3935:33;:::i;:::-;3894:80;;;;:::o;3980:262::-;;4088:2;4076:9;4067:7;4063:23;4059:32;4056:2;;;4104:1;4101;4094:12;4056:2;4147:1;4172:53;4217:7;4208:6;4197:9;4193:22;4172:53;:::i;:::-;4162:63;;4118:117;4046:196;;;;:::o;4248:284::-;;4367:2;4355:9;4346:7;4342:23;4338:32;4335:2;;;4383:1;4380;4373:12;4335:2;4426:1;4451:64;4507:7;4498:6;4487:9;4483:22;4451:64;:::i;:::-;4441:74;;4397:128;4325:207;;;;:::o;4538:407::-;;;4663:2;4651:9;4642:7;4638:23;4634:32;4631:2;;;4679:1;4676;4669:12;4631:2;4722:1;4747:53;4792:7;4783:6;4772:9;4768:22;4747:53;:::i;:::-;4737:63;;4693:117;4849:2;4875:53;4920:7;4911:6;4900:9;4896:22;4875:53;:::i;:::-;4865:63;;4820:118;4621:324;;;;;:::o;4951:552::-;;;;5093:2;5081:9;5072:7;5068:23;5064:32;5061:2;;;5109:1;5106;5099:12;5061:2;5152:1;5177:53;5222:7;5213:6;5202:9;5198:22;5177:53;:::i;:::-;5167:63;;5123:117;5279:2;5305:53;5350:7;5341:6;5330:9;5326:22;5305:53;:::i;:::-;5295:63;;5250:118;5407:2;5433:53;5478:7;5469:6;5458:9;5454:22;5433:53;:::i;:::-;5423:63;;5378:118;5051:452;;;;;:::o;5509:809::-;;;;;5677:3;5665:9;5656:7;5652:23;5648:33;5645:2;;;5694:1;5691;5684:12;5645:2;5737:1;5762:53;5807:7;5798:6;5787:9;5783:22;5762:53;:::i;:::-;5752:63;;5708:117;5864:2;5890:53;5935:7;5926:6;5915:9;5911:22;5890:53;:::i;:::-;5880:63;;5835:118;5992:2;6018:53;6063:7;6054:6;6043:9;6039:22;6018:53;:::i;:::-;6008:63;;5963:118;6148:2;6137:9;6133:18;6120:32;6179:18;6171:6;6168:30;6165:2;;;6211:1;6208;6201:12;6165:2;6239:62;6293:7;6284:6;6273:9;6269:22;6239:62;:::i;:::-;6229:72;;6091:220;5635:683;;;;;;;:::o;6324:401::-;;;6446:2;6434:9;6425:7;6421:23;6417:32;6414:2;;;6462:1;6459;6452:12;6414:2;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6632:2;6658:50;6700:7;6691:6;6680:9;6676:22;6658:50;:::i;:::-;6648:60;;6603:115;6404:321;;;;;:::o;6731:407::-;;;6856:2;6844:9;6835:7;6831:23;6827:32;6824:2;;;6872:1;6869;6862:12;6824:2;6915:1;6940:53;6985:7;6976:6;6965:9;6961:22;6940:53;:::i;:::-;6930:63;;6886:117;7042:2;7068:53;7113:7;7104:6;7093:9;7089:22;7068:53;:::i;:::-;7058:63;;7013:118;6814:324;;;;;:::o;7144:420::-;;7288:2;7276:9;7267:7;7263:23;7259:32;7256:2;;;7304:1;7301;7294:12;7256:2;7368:1;7357:9;7353:17;7347:24;7398:18;7390:6;7387:30;7384:2;;;7430:1;7427;7420:12;7384:2;7458:89;7539:7;7530:6;7519:9;7515:22;7458:89;:::i;:::-;7448:99;;7318:239;7246:318;;;;:::o;7570:260::-;;7677:2;7665:9;7656:7;7652:23;7648:32;7645:2;;;7693:1;7690;7683:12;7645:2;7736:1;7761:52;7805:7;7796:6;7785:9;7781:22;7761:52;:::i;:::-;7751:62;;7707:116;7635:195;;;;:::o;7836:282::-;;7954:2;7942:9;7933:7;7929:23;7925:32;7922:2;;;7970:1;7967;7960:12;7922:2;8013:1;8038:63;8093:7;8084:6;8073:9;8069:22;8038:63;:::i;:::-;8028:73;;7984:127;7912:206;;;;:::o;8124:375::-;;8242:2;8230:9;8221:7;8217:23;8213:32;8210:2;;;8258:1;8255;8248:12;8210:2;8329:1;8318:9;8314:17;8301:31;8359:18;8351:6;8348:30;8345:2;;;8391:1;8388;8381:12;8345:2;8419:63;8474:7;8465:6;8454:9;8450:22;8419:63;:::i;:::-;8409:73;;8272:220;8200:299;;;;:::o;8505:390::-;;8634:2;8622:9;8613:7;8609:23;8605:32;8602:2;;;8650:1;8647;8640:12;8602:2;8714:1;8703:9;8699:17;8693:24;8744:18;8736:6;8733:30;8730:2;;;8776:1;8773;8766:12;8730:2;8804:74;8870:7;8861:6;8850:9;8846:22;8804:74;:::i;:::-;8794:84;;8664:224;8592:303;;;;:::o;8901:262::-;;9009:2;8997:9;8988:7;8984:23;8980:32;8977:2;;;9025:1;9022;9015:12;8977:2;9068:1;9093:53;9138:7;9129:6;9118:9;9114:22;9093:53;:::i;:::-;9083:63;;9039:117;8967:196;;;;:::o;9169:407::-;;;9294:2;9282:9;9273:7;9269:23;9265:32;9262:2;;;9310:1;9307;9300:12;9262:2;9353:1;9378:53;9423:7;9414:6;9403:9;9399:22;9378:53;:::i;:::-;9368:63;;9324:117;9480:2;9506:53;9551:7;9542:6;9531:9;9527:22;9506:53;:::i;:::-;9496:63;;9451:118;9252:324;;;;;:::o;9582:175::-;;9670:44;9710:3;9702:6;9670:44;:::i;:::-;9746:4;9741:3;9737:14;9723:28;;9660:97;;;;:::o;9763:179::-;;9853:46;9895:3;9887:6;9853:46;:::i;:::-;9931:4;9926:3;9922:14;9908:28;;9843:99;;;;:::o;9948:118::-;10035:24;10053:5;10035:24;:::i;:::-;10030:3;10023:37;10013:53;;:::o;10072:157::-;10177:45;10197:24;10215:5;10197:24;:::i;:::-;10177:45;:::i;:::-;10172:3;10165:58;10155:74;;:::o;10263:724::-;;10409:53;10456:5;10409:53;:::i;:::-;10478:85;10556:6;10551:3;10478:85;:::i;:::-;10471:92;;10587:55;10636:5;10587:55;:::i;:::-;10665:7;10696:1;10681:281;10706:6;10703:1;10700:13;10681:281;;;10782:6;10776:13;10809:61;10866:3;10851:13;10809:61;:::i;:::-;10802:68;;10893:59;10945:6;10893:59;:::i;:::-;10883:69;;10741:221;10728:1;10725;10721:9;10716:14;;10681:281;;;10685:14;10978:3;10971:10;;10385:602;;;;;;;:::o;11023:732::-;;11171:54;11219:5;11171:54;:::i;:::-;11241:86;11320:6;11315:3;11241:86;:::i;:::-;11234:93;;11351:56;11401:5;11351:56;:::i;:::-;11430:7;11461:1;11446:284;11471:6;11468:1;11465:13;11446:284;;;11547:6;11541:13;11574:63;11633:3;11618:13;11574:63;:::i;:::-;11567:70;;11660:60;11713:6;11660:60;:::i;:::-;11650:70;;11506:224;11493:1;11490;11486:9;11481:14;;11446:284;;;11450:14;11746:3;11739:10;;11147:608;;;;;;;:::o;11761:109::-;11842:21;11857:5;11842:21;:::i;:::-;11837:3;11830:34;11820:50;;:::o;11876:360::-;;11990:38;12022:5;11990:38;:::i;:::-;12044:70;12107:6;12102:3;12044:70;:::i;:::-;12037:77;;12123:52;12168:6;12163:3;12156:4;12149:5;12145:16;12123:52;:::i;:::-;12200:29;12222:6;12200:29;:::i;:::-;12195:3;12191:39;12184:46;;11966:270;;;;;:::o;12242:105::-;12317:23;12334:5;12317:23;:::i;:::-;12312:3;12305:36;12295:52;;:::o;12353:364::-;;12469:39;12502:5;12469:39;:::i;:::-;12524:71;12588:6;12583:3;12524:71;:::i;:::-;12517:78;;12604:52;12649:6;12644:3;12637:4;12630:5;12626:16;12604:52;:::i;:::-;12681:29;12703:6;12681:29;:::i;:::-;12676:3;12672:39;12665:46;;12445:272;;;;;:::o;12723:377::-;;12857:39;12890:5;12857:39;:::i;:::-;12912:89;12994:6;12989:3;12912:89;:::i;:::-;12905:96;;13010:52;13055:6;13050:3;13043:4;13036:5;13032:16;13010:52;:::i;:::-;13087:6;13082:3;13078:16;13071:23;;12833:267;;;;;:::o;13130:845::-;;13270:5;13264:12;13299:36;13325:9;13299:36;:::i;:::-;13351:89;13433:6;13428:3;13351:89;:::i;:::-;13344:96;;13471:1;13460:9;13456:17;13487:1;13482:137;;;;13633:1;13628:341;;;;13449:520;;13482:137;13566:4;13562:9;13551;13547:25;13542:3;13535:38;13602:6;13597:3;13593:16;13586:23;;13482:137;;13628:341;13695:38;13727:5;13695:38;:::i;:::-;13755:1;13769:154;13783:6;13780:1;13777:13;13769:154;;;13857:7;13851:14;13847:1;13842:3;13838:11;13831:35;13907:1;13898:7;13894:15;13883:26;;13805:4;13802:1;13798:12;13793:17;;13769:154;;;13952:6;13947:3;13943:16;13936:23;;13635:334;;13449:520;;13237:738;;;;;;:::o;13981:317::-;;14144:67;14208:2;14203:3;14144:67;:::i;:::-;14137:74;;14241:21;14237:1;14232:3;14228:11;14221:42;14289:2;14284:3;14280:12;14273:19;;14127:171;;;:::o;14304:375::-;;14467:67;14531:2;14526:3;14467:67;:::i;:::-;14460:74;;14564:34;14560:1;14555:3;14551:11;14544:55;14630:13;14625:2;14620:3;14616:12;14609:35;14670:2;14665:3;14661:12;14654:19;;14450:229;;;:::o;14685:382::-;;14848:67;14912:2;14907:3;14848:67;:::i;:::-;14841:74;;14945:34;14941:1;14936:3;14932:11;14925:55;15011:20;15006:2;15001:3;14997:12;14990:42;15058:2;15053:3;15049:12;15042:19;;14831:236;;;:::o;15073:370::-;;15236:67;15300:2;15295:3;15236:67;:::i;:::-;15229:74;;15333:34;15329:1;15324:3;15320:11;15313:55;15399:8;15394:2;15389:3;15385:12;15378:30;15434:2;15429:3;15425:12;15418:19;;15219:224;;;:::o;15449:326::-;;15612:67;15676:2;15671:3;15612:67;:::i;:::-;15605:74;;15709:30;15705:1;15700:3;15696:11;15689:51;15766:2;15761:3;15757:12;15750:19;;15595:180;;;:::o;15781:327::-;;15944:67;16008:2;16003:3;15944:67;:::i;:::-;15937:74;;16041:31;16037:1;16032:3;16028:11;16021:52;16099:2;16094:3;16090:12;16083:19;;15927:181;;;:::o;16114:368::-;;16277:67;16341:2;16336:3;16277:67;:::i;:::-;16270:74;;16374:34;16370:1;16365:3;16361:11;16354:55;16440:6;16435:2;16430:3;16426:12;16419:28;16473:2;16468:3;16464:12;16457:19;;16260:222;;;:::o;16488:323::-;;16651:67;16715:2;16710:3;16651:67;:::i;:::-;16644:74;;16748:27;16744:1;16739:3;16735:11;16728:48;16802:2;16797:3;16793:12;16786:19;;16634:177;;;:::o;16817:320::-;;16980:67;17044:2;17039:3;16980:67;:::i;:::-;16973:74;;17077:24;17073:1;17068:3;17064:11;17057:45;17128:2;17123:3;17119:12;17112:19;;16963:174;;;:::o;17143:326::-;;17306:67;17370:2;17365:3;17306:67;:::i;:::-;17299:74;;17403:30;17399:1;17394:3;17390:11;17383:51;17460:2;17455:3;17451:12;17444:19;;17289:180;;;:::o;17475:376::-;;17638:67;17702:2;17697:3;17638:67;:::i;:::-;17631:74;;17735:34;17731:1;17726:3;17722:11;17715:55;17801:14;17796:2;17791:3;17787:12;17780:36;17842:2;17837:3;17833:12;17826:19;;17621:230;;;:::o;17857:326::-;;18020:67;18084:2;18079:3;18020:67;:::i;:::-;18013:74;;18117:30;18113:1;18108:3;18104:11;18097:51;18174:2;18169:3;18165:12;18158:19;;18003:180;;;:::o;18189:388::-;;18352:67;18416:2;18411:3;18352:67;:::i;:::-;18345:74;;18449:34;18445:1;18440:3;18436:11;18429:55;18515:26;18510:2;18505:3;18501:12;18494:48;18568:2;18563:3;18559:12;18552:19;;18335:242;;;:::o;18583:374::-;;18746:67;18810:2;18805:3;18746:67;:::i;:::-;18739:74;;18843:34;18839:1;18834:3;18830:11;18823:55;18909:12;18904:2;18899:3;18895:12;18888:34;18948:2;18943:3;18939:12;18932:19;;18729:228;;;:::o;18963:373::-;;19126:67;19190:2;19185:3;19126:67;:::i;:::-;19119:74;;19223:34;19219:1;19214:3;19210:11;19203:55;19289:11;19284:2;19279:3;19275:12;19268:33;19327:2;19322:3;19318:12;19311:19;;19109:227;;;:::o;19342:330::-;;19505:67;19569:2;19564:3;19505:67;:::i;:::-;19498:74;;19602:34;19598:1;19593:3;19589:11;19582:55;19663:2;19658:3;19654:12;19647:19;;19488:184;;;:::o;19678:330::-;;19841:67;19905:2;19900:3;19841:67;:::i;:::-;19834:74;;19938:34;19934:1;19929:3;19925:11;19918:55;19999:2;19994:3;19990:12;19983:19;;19824:184;;;:::o;20014:376::-;;20177:67;20241:2;20236:3;20177:67;:::i;:::-;20170:74;;20274:34;20270:1;20265:3;20261:11;20254:55;20340:14;20335:2;20330:3;20326:12;20319:36;20381:2;20376:3;20372:12;20365:19;;20160:230;;;:::o;20396:330::-;;20559:67;20623:2;20618:3;20559:67;:::i;:::-;20552:74;;20656:34;20652:1;20647:3;20643:11;20636:55;20717:2;20712:3;20708:12;20701:19;;20542:184;;;:::o;20732:373::-;;20895:67;20959:2;20954:3;20895:67;:::i;:::-;20888:74;;20992:34;20988:1;20983:3;20979:11;20972:55;21058:11;21053:2;21048:3;21044:12;21037:33;21096:2;21091:3;21087:12;21080:19;;20878:227;;;:::o;21111:379::-;;21274:67;21338:2;21333:3;21274:67;:::i;:::-;21267:74;;21371:34;21367:1;21362:3;21358:11;21351:55;21437:17;21432:2;21427:3;21423:12;21416:39;21481:2;21476:3;21472:12;21465:19;;21257:233;;;:::o;21496:317::-;;21659:67;21723:2;21718:3;21659:67;:::i;:::-;21652:74;;21756:21;21752:1;21747:3;21743:11;21736:42;21804:2;21799:3;21795:12;21788:19;;21642:171;;;:::o;21819:365::-;;21982:67;22046:2;22041:3;21982:67;:::i;:::-;21975:74;;22079:34;22075:1;22070:3;22066:11;22059:55;22145:3;22140:2;22135:3;22131:12;22124:25;22175:2;22170:3;22166:12;22159:19;;21965:219;;;:::o;22190:381::-;;22353:67;22417:2;22412:3;22353:67;:::i;:::-;22346:74;;22450:34;22446:1;22441:3;22437:11;22430:55;22516:19;22511:2;22506:3;22502:12;22495:41;22562:2;22557:3;22553:12;22546:19;;22336:235;;;:::o;22577:322::-;;22740:67;22804:2;22799:3;22740:67;:::i;:::-;22733:74;;22837:26;22833:1;22828:3;22824:11;22817:47;22890:2;22885:3;22881:12;22874:19;;22723:176;;;:::o;22905:376::-;;23068:67;23132:2;23127:3;23068:67;:::i;:::-;23061:74;;23165:34;23161:1;23156:3;23152:11;23145:55;23231:14;23226:2;23221:3;23217:12;23210:36;23272:2;23267:3;23263:12;23256:19;;23051:230;;;:::o;23287:333::-;;23468:84;23550:1;23545:3;23468:84;:::i;:::-;23461:91;;23582:3;23578:1;23573:3;23569:11;23562:24;23612:1;23607:3;23603:11;23596:18;;23451:169;;;:::o;23626:108::-;23703:24;23721:5;23703:24;:::i;:::-;23698:3;23691:37;23681:53;;:::o;23740:118::-;23827:24;23845:5;23827:24;:::i;:::-;23822:3;23815:37;23805:53;;:::o;23864:157::-;23969:45;23989:24;24007:5;23989:24;:::i;:::-;23969:45;:::i;:::-;23964:3;23957:58;23947:74;;:::o;24027:275::-;;24181:95;24272:3;24263:6;24181:95;:::i;:::-;24174:102;;24293:3;24286:10;;24163:139;;;;:::o;24308:435::-;;24510:95;24601:3;24592:6;24510:95;:::i;:::-;24503:102;;24622:95;24713:3;24704:6;24622:95;:::i;:::-;24615:102;;24734:3;24727:10;;24492:251;;;;;:::o;24749:695::-;;25049:95;25140:3;25131:6;25049:95;:::i;:::-;25042:102;;25161:148;25305:3;25161:148;:::i;:::-;25154:155;;25326:92;25414:3;25405:6;25326:92;:::i;:::-;25319:99;;25435:3;25428:10;;25031:413;;;;;:::o;25450:679::-;;25661:75;25732:3;25723:6;25661:75;:::i;:::-;25761:2;25756:3;25752:12;25745:19;;25774:75;25845:3;25836:6;25774:75;:::i;:::-;25874:2;25869:3;25865:12;25858:19;;25887:75;25958:3;25949:6;25887:75;:::i;:::-;25987:2;25982:3;25978:12;25971:19;;26000:75;26071:3;26062:6;26000:75;:::i;:::-;26100:2;26095:3;26091:12;26084:19;;26120:3;26113:10;;25650:479;;;;;;;:::o;26135:222::-;;26266:2;26255:9;26251:18;26243:26;;26279:71;26347:1;26336:9;26332:17;26323:6;26279:71;:::i;:::-;26233:124;;;;:::o;26363:640::-;;26596:3;26585:9;26581:19;26573:27;;26610:71;26678:1;26667:9;26663:17;26654:6;26610:71;:::i;:::-;26691:72;26759:2;26748:9;26744:18;26735:6;26691:72;:::i;:::-;26773;26841:2;26830:9;26826:18;26817:6;26773:72;:::i;:::-;26892:9;26886:4;26882:20;26877:2;26866:9;26862:18;26855:48;26920:76;26991:4;26982:6;26920:76;:::i;:::-;26912:84;;26563:440;;;;;;;:::o;27009:369::-;;27188:2;27177:9;27173:18;27165:26;;27237:9;27231:4;27227:20;27223:1;27212:9;27208:17;27201:47;27265:106;27366:4;27357:6;27265:106;:::i;:::-;27257:114;;27155:223;;;;:::o;27384:373::-;;27565:2;27554:9;27550:18;27542:26;;27614:9;27608:4;27604:20;27600:1;27589:9;27585:17;27578:47;27642:108;27745:4;27736:6;27642:108;:::i;:::-;27634:116;;27532:225;;;;:::o;27763:210::-;;27888:2;27877:9;27873:18;27865:26;;27901:65;27963:1;27952:9;27948:17;27939:6;27901:65;:::i;:::-;27855:118;;;;:::o;27979:313::-;;28130:2;28119:9;28115:18;28107:26;;28179:9;28173:4;28169:20;28165:1;28154:9;28150:17;28143:47;28207:78;28280:4;28271:6;28207:78;:::i;:::-;28199:86;;28097:195;;;;:::o;28298:419::-;;28502:2;28491:9;28487:18;28479:26;;28551:9;28545:4;28541:20;28537:1;28526:9;28522:17;28515:47;28579:131;28705:4;28579:131;:::i;:::-;28571:139;;28469:248;;;:::o;28723:419::-;;28927:2;28916:9;28912:18;28904:26;;28976:9;28970:4;28966:20;28962:1;28951:9;28947:17;28940:47;29004:131;29130:4;29004:131;:::i;:::-;28996:139;;28894:248;;;:::o;29148:419::-;;29352:2;29341:9;29337:18;29329:26;;29401:9;29395:4;29391:20;29387:1;29376:9;29372:17;29365:47;29429:131;29555:4;29429:131;:::i;:::-;29421:139;;29319:248;;;:::o;29573:419::-;;29777:2;29766:9;29762:18;29754:26;;29826:9;29820:4;29816:20;29812:1;29801:9;29797:17;29790:47;29854:131;29980:4;29854:131;:::i;:::-;29846:139;;29744:248;;;:::o;29998:419::-;;30202:2;30191:9;30187:18;30179:26;;30251:9;30245:4;30241:20;30237:1;30226:9;30222:17;30215:47;30279:131;30405:4;30279:131;:::i;:::-;30271:139;;30169:248;;;:::o;30423:419::-;;30627:2;30616:9;30612:18;30604:26;;30676:9;30670:4;30666:20;30662:1;30651:9;30647:17;30640:47;30704:131;30830:4;30704:131;:::i;:::-;30696:139;;30594:248;;;:::o;30848:419::-;;31052:2;31041:9;31037:18;31029:26;;31101:9;31095:4;31091:20;31087:1;31076:9;31072:17;31065:47;31129:131;31255:4;31129:131;:::i;:::-;31121:139;;31019:248;;;:::o;31273:419::-;;31477:2;31466:9;31462:18;31454:26;;31526:9;31520:4;31516:20;31512:1;31501:9;31497:17;31490:47;31554:131;31680:4;31554:131;:::i;:::-;31546:139;;31444:248;;;:::o;31698:419::-;;31902:2;31891:9;31887:18;31879:26;;31951:9;31945:4;31941:20;31937:1;31926:9;31922:17;31915:47;31979:131;32105:4;31979:131;:::i;:::-;31971:139;;31869:248;;;:::o;32123:419::-;;32327:2;32316:9;32312:18;32304:26;;32376:9;32370:4;32366:20;32362:1;32351:9;32347:17;32340:47;32404:131;32530:4;32404:131;:::i;:::-;32396:139;;32294:248;;;:::o;32548:419::-;;32752:2;32741:9;32737:18;32729:26;;32801:9;32795:4;32791:20;32787:1;32776:9;32772:17;32765:47;32829:131;32955:4;32829:131;:::i;:::-;32821:139;;32719:248;;;:::o;32973:419::-;;33177:2;33166:9;33162:18;33154:26;;33226:9;33220:4;33216:20;33212:1;33201:9;33197:17;33190:47;33254:131;33380:4;33254:131;:::i;:::-;33246:139;;33144:248;;;:::o;33398:419::-;;33602:2;33591:9;33587:18;33579:26;;33651:9;33645:4;33641:20;33637:1;33626:9;33622:17;33615:47;33679:131;33805:4;33679:131;:::i;:::-;33671:139;;33569:248;;;:::o;33823:419::-;;34027:2;34016:9;34012:18;34004:26;;34076:9;34070:4;34066:20;34062:1;34051:9;34047:17;34040:47;34104:131;34230:4;34104:131;:::i;:::-;34096:139;;33994:248;;;:::o;34248:419::-;;34452:2;34441:9;34437:18;34429:26;;34501:9;34495:4;34491:20;34487:1;34476:9;34472:17;34465:47;34529:131;34655:4;34529:131;:::i;:::-;34521:139;;34419:248;;;:::o;34673:419::-;;34877:2;34866:9;34862:18;34854:26;;34926:9;34920:4;34916:20;34912:1;34901:9;34897:17;34890:47;34954:131;35080:4;34954:131;:::i;:::-;34946:139;;34844:248;;;:::o;35098:419::-;;35302:2;35291:9;35287:18;35279:26;;35351:9;35345:4;35341:20;35337:1;35326:9;35322:17;35315:47;35379:131;35505:4;35379:131;:::i;:::-;35371:139;;35269:248;;;:::o;35523:419::-;;35727:2;35716:9;35712:18;35704:26;;35776:9;35770:4;35766:20;35762:1;35751:9;35747:17;35740:47;35804:131;35930:4;35804:131;:::i;:::-;35796:139;;35694:248;;;:::o;35948:419::-;;36152:2;36141:9;36137:18;36129:26;;36201:9;36195:4;36191:20;36187:1;36176:9;36172:17;36165:47;36229:131;36355:4;36229:131;:::i;:::-;36221:139;;36119:248;;;:::o;36373:419::-;;36577:2;36566:9;36562:18;36554:26;;36626:9;36620:4;36616:20;36612:1;36601:9;36597:17;36590:47;36654:131;36780:4;36654:131;:::i;:::-;36646:139;;36544:248;;;:::o;36798:419::-;;37002:2;36991:9;36987:18;36979:26;;37051:9;37045:4;37041:20;37037:1;37026:9;37022:17;37015:47;37079:131;37205:4;37079:131;:::i;:::-;37071:139;;36969:248;;;:::o;37223:419::-;;37427:2;37416:9;37412:18;37404:26;;37476:9;37470:4;37466:20;37462:1;37451:9;37447:17;37440:47;37504:131;37630:4;37504:131;:::i;:::-;37496:139;;37394:248;;;:::o;37648:419::-;;37852:2;37841:9;37837:18;37829:26;;37901:9;37895:4;37891:20;37887:1;37876:9;37872:17;37865:47;37929:131;38055:4;37929:131;:::i;:::-;37921:139;;37819:248;;;:::o;38073:419::-;;38277:2;38266:9;38262:18;38254:26;;38326:9;38320:4;38316:20;38312:1;38301:9;38297:17;38290:47;38354:131;38480:4;38354:131;:::i;:::-;38346:139;;38244:248;;;:::o;38498:419::-;;38702:2;38691:9;38687:18;38679:26;;38751:9;38745:4;38741:20;38737:1;38726:9;38722:17;38715:47;38779:131;38905:4;38779:131;:::i;:::-;38771:139;;38669:248;;;:::o;38923:419::-;;39127:2;39116:9;39112:18;39104:26;;39176:9;39170:4;39166:20;39162:1;39151:9;39147:17;39140:47;39204:131;39330:4;39204:131;:::i;:::-;39196:139;;39094:248;;;:::o;39348:222::-;;39479:2;39468:9;39464:18;39456:26;;39492:71;39560:1;39549:9;39545:17;39536:6;39492:71;:::i;:::-;39446:124;;;;:::o;39576:283::-;;39642:2;39636:9;39626:19;;39684:4;39676:6;39672:17;39791:6;39779:10;39776:22;39755:18;39743:10;39740:34;39737:62;39734:2;;;39802:18;;:::i;:::-;39734:2;39842:10;39838:2;39831:22;39616:243;;;;:::o;39865:311::-;;40032:18;40024:6;40021:30;40018:2;;;40054:18;;:::i;:::-;40018:2;40104:4;40096:6;40092:17;40084:25;;40164:4;40158;40154:15;40146:23;;39947:229;;;:::o;40182:331::-;;40333:18;40325:6;40322:30;40319:2;;;40355:18;;:::i;:::-;40319:2;40440:4;40436:9;40429:4;40421:6;40417:17;40413:33;40405:41;;40501:4;40495;40491:15;40483:23;;40248:265;;;:::o;40519:332::-;;40671:18;40663:6;40660:30;40657:2;;;40693:18;;:::i;:::-;40657:2;40778:4;40774:9;40767:4;40759:6;40755:17;40751:33;40743:41;;40839:4;40833;40829:15;40821:23;;40586:265;;;:::o;40857:131::-;;40946:3;40938:11;;40976:4;40971:3;40967:14;40959:22;;40928:60;;;:::o;40994:132::-;;41084:3;41076:11;;41114:4;41109:3;41105:14;41097:22;;41066:60;;;:::o;41132:141::-;;41204:3;41196:11;;41227:3;41224:1;41217:14;41261:4;41258:1;41248:18;41240:26;;41186:87;;;:::o;41279:113::-;;41379:5;41373:12;41363:22;;41352:40;;;:::o;41398:114::-;;41499:5;41493:12;41483:22;;41472:40;;;:::o;41518:98::-;;41603:5;41597:12;41587:22;;41576:40;;;:::o;41622:99::-;;41708:5;41702:12;41692:22;;41681:40;;;:::o;41727:112::-;;41828:4;41823:3;41819:14;41811:22;;41801:38;;;:::o;41845:113::-;;41947:4;41942:3;41938:14;41930:22;;41920:38;;;:::o;41964:183::-;;42096:6;42091:3;42084:19;42136:4;42131:3;42127:14;42112:29;;42074:73;;;;:::o;42153:184::-;;42286:6;42281:3;42274:19;42326:4;42321:3;42317:14;42302:29;;42264:73;;;;:::o;42343:168::-;;42460:6;42455:3;42448:19;42500:4;42495:3;42491:14;42476:29;;42438:73;;;;:::o;42517:169::-;;42635:6;42630:3;42623:19;42675:4;42670:3;42666:14;42651:29;;42613:73;;;;:::o;42692:148::-;;42831:3;42816:18;;42806:34;;;;:::o;42846:305::-;;42905:20;42923:1;42905:20;:::i;:::-;42900:25;;42939:20;42957:1;42939:20;:::i;:::-;42934:25;;43093:1;43025:66;43021:74;43018:1;43015:81;43012:2;;;43099:18;;:::i;:::-;43012:2;43143:1;43140;43136:9;43129:16;;42890:261;;;;:::o;43157:348::-;;43220:20;43238:1;43220:20;:::i;:::-;43215:25;;43254:20;43272:1;43254:20;:::i;:::-;43249:25;;43442:1;43374:66;43370:74;43367:1;43364:81;43359:1;43352:9;43345:17;43341:105;43338:2;;;43449:18;;:::i;:::-;43338:2;43497:1;43494;43490:9;43479:20;;43205:300;;;;:::o;43511:191::-;;43571:20;43589:1;43571:20;:::i;:::-;43566:25;;43605:20;43623:1;43605:20;:::i;:::-;43600:25;;43644:1;43641;43638:8;43635:2;;;43649:18;;:::i;:::-;43635:2;43694:1;43691;43687:9;43679:17;;43556:146;;;;:::o;43708:96::-;;43774:24;43792:5;43774:24;:::i;:::-;43763:35;;43753:51;;;:::o;43810:90::-;;43887:5;43880:13;43873:21;43862:32;;43852:48;;;:::o;43906:149::-;;43982:66;43975:5;43971:78;43960:89;;43950:105;;;:::o;44061:76::-;;44126:5;44115:16;;44105:32;;;:::o;44143:126::-;;44220:42;44213:5;44209:54;44198:65;;44188:81;;;:::o;44275:77::-;;44341:5;44330:16;;44320:32;;;:::o;44358:154::-;44442:6;44437:3;44432;44419:30;44504:1;44495:6;44490:3;44486:16;44479:27;44409:103;;;:::o;44518:307::-;44586:1;44596:113;44610:6;44607:1;44604:13;44596:113;;;44695:1;44690:3;44686:11;44680:18;44676:1;44671:3;44667:11;44660:39;44632:2;44629:1;44625:10;44620:15;;44596:113;;;44727:6;44724:1;44721:13;44718:2;;;44807:1;44798:6;44793:3;44789:16;44782:27;44718:2;44567:258;;;;:::o;44831:320::-;;44912:1;44906:4;44902:12;44892:22;;44959:1;44953:4;44949:12;44980:18;44970:2;;45036:4;45028:6;45024:17;45014:27;;44970:2;45098;45090:6;45087:14;45067:18;45064:38;45061:2;;;45117:18;;:::i;:::-;45061:2;44882:269;;;;:::o;45157:233::-;;45219:24;45237:5;45219:24;:::i;:::-;45210:33;;45265:66;45258:5;45255:77;45252:2;;;45335:18;;:::i;:::-;45252:2;45382:1;45375:5;45371:13;45364:20;;45200:190;;;:::o;45396:100::-;;45464:26;45484:5;45464:26;:::i;:::-;45453:37;;45443:53;;;:::o;45502:94::-;;45570:20;45584:5;45570:20;:::i;:::-;45559:31;;45549:47;;;:::o;45602:79::-;;45670:5;45659:16;;45649:32;;;:::o;45687:176::-;;45736:20;45754:1;45736:20;:::i;:::-;45731:25;;45770:20;45788:1;45770:20;:::i;:::-;45765:25;;45809:1;45799:2;;45814:18;;:::i;:::-;45799:2;45855:1;45852;45848:9;45843:14;;45721:142;;;;:::o;45869:180::-;45917:77;45914:1;45907:88;46014:4;46011:1;46004:15;46038:4;46035:1;46028:15;46055:180;46103:77;46100:1;46093:88;46200:4;46197:1;46190:15;46224:4;46221:1;46214:15;46241:180;46289:77;46286:1;46279:88;46386:4;46383:1;46376:15;46410:4;46407:1;46400:15;46427:180;46475:77;46472:1;46465:88;46572:4;46569:1;46562:15;46596:4;46593:1;46586:15;46613:102;;46705:2;46701:7;46696:2;46689:5;46685:14;46681:28;46671:38;;46661:54;;;:::o;46721:94::-;;46802:5;46798:2;46794:14;46773:35;;46763:52;;;:::o;46821:122::-;46894:24;46912:5;46894:24;:::i;:::-;46887:5;46884:35;46874:2;;46933:1;46930;46923:12;46874:2;46864:79;:::o;46949:116::-;47019:21;47034:5;47019:21;:::i;:::-;47012:5;47009:32;46999:2;;47055:1;47052;47045:12;46999:2;46989:76;:::o;47071:120::-;47143:23;47160:5;47143:23;:::i;:::-;47136:5;47133:34;47123:2;;47181:1;47178;47171:12;47123:2;47113:78;:::o;47197:122::-;47270:24;47288:5;47270:24;:::i;:::-;47263:5;47260:35;47250:2;;47309:1;47306;47299:12;47250:2;47240:79;:::o

Swarm Source

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