APE Price: $1.35 (+8.69%)

Token

OnChainAPE (OCAPE)

Overview

Max Total Supply

9,750 OCAPE

Holders

300

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Balance
66 OCAPE
0x7a69a43f4246b8ccef5af90641b09752a30f5b19
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
OnChainAPE

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-10-22
*/

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// @title: OnChainAPE
// @author: ape
//
// On chain PFP collection of 10k unique profile images with the following properties:
//   - a single Ethereum transaction created everything
//   - all metadata on chain
//   - all images on chain in svg format
//   - all created in the constraints of a single txn without need of any other txns to load additional data
//   - no use of other deployed contracts
//   - all 10,000 OnChain Monkeys are unique
//   - there are 7 traits with 171 values (including 3 traits of no hat, no clothes, and no earring)
//   - the traits have distribution and rarities interesting for collecting
//   - everything on chain can be used in other apps and collections in the future
// And did I say, Monkeys?

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);
        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)
            for {
                let i := 0
            } lt(i, len) {
            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)
                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)
                mstore(resultPtr, out)
                resultPtr := add(resultPtr, 4)
            }
            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
            mstore(result, encodedLen)
        }
        return string(result);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Bring on the OnChain APE!
contract OnChainAPE is ERC721Enumerable, ReentrancyGuard, Ownable {
  using Strings for uint256;

  uint256 public constant maxSupply = 10000;
  uint256 public numClaimed = 0;
  string[] private background = ["656","dda","e92","1eb","663","9de","367","ccc"]; // only trait that is uniform, no need for rarity weights
  string[] private fur1 = ["653","532","444","a71","ffc","ca9","f89","777","049","901","fc5","ffe","574","bcc","d04","222","889","7f9","fd1"];
  string[] private fur2 = ["532","653","653","653","653","653","653","653","653","653","110","653","711","344","799","555","8a8","32f","653"];
  uint8[] private fur_w =[249, 246, 223, 141, 116, 114, 93, 90, 89, 86, 74, 72, 55, 48, 39, 32, 28, 14, 8];
  string[] private eyes = ["abe","0a0","653","888","be7","abe","0a0","653","888","be7","cef","abe","0a0","653","888","be7","cef","abe","0a0","653","888","be7","cef"];
  uint8[] private eyes_w = [245, 121, 107, 101, 79, 78, 70, 68, 62, 58, 56, 51, 50, 48, 44, 38, 35, 33, 31, 22, 15, 10, 7];
  string[] private mouth = ["653","ffc","f89","777","049","901","bcc","d04","fd1","ffc","653","f89","777","049","bcc","901","901","bcc","653","d04","ffc","f89","777","049","fd1","f89","777","bcc","d04","049","ffc","901","fd1"];
  uint8[] private mouth_w = [252, 172, 80, 79, 56, 49, 37, 33, 31, 30, 28, 27, 26, 23, 22, 18, 15, 14, 13, 12, 11, 10, 10, 10, 9, 8, 7, 7, 6, 5, 5, 4, 3];
  string[] private earring = ["999","fe7","999","999","fe7","bdd"];
  uint8[] private earring_w = [251, 32, 29, 17, 16, 8, 5];
  string[] private clothes1 = ["f00","f00","222","f00","f00","f00","f00","f00","f00","00f","00f","00f","00f","00f","00f","00f","222","00f","f0f","222","f0f","f0f","f0f","f0f","f0f","f0f","f0f","f80","f80","f80","f80","f80","f00","f80","f80","f80","90f","90f","00f","90f","90f","90f","222"];
  string[] private clothes2 = ["d00","00f","f00","f0f","f80","90f","f48","0f0","ff0","f00","00d","f0f","f80","90f","f48","0f0","ddd","ff0","f00","653","00f","d0d","f80","90f","f48","0f0","ff0","f00","f0f","00f","d60","f48","ddd","90f","0f0","ff0","f00","00f","fd1","f0f","f80","70d","fd1"];
  uint8[] private clothes_w = [251, 55, 45, 43, 38, 37, 34, 33, 32, 31, 31, 31, 31, 31, 30, 30, 29, 29, 28, 27, 27, 27, 26, 25, 24, 22, 21, 20, 19, 19, 19, 19, 19, 19, 18, 17, 16, 15, 14, 13, 11, 9, 8, 6];
  string[] private hat1 = ["f00","f00","f00","f00","f00","f00","f00","00f","00f","00f","00f","00f","00f","00f","f00","f0f","f0f","f0f","f0f","f0f","f0f","f0f","f80","f80","f80","f80","f80","f80","f00","f80","90f","f48","22d","90f","90f","ff0",""];
  string[] private hat2 = ["0f0","00f","f80","ff0","90f","f0f","f48","f00","0f0","00f","f80","ff0","90f","f0f","000","f00","0f0","00f","f80","ff0","90f","f0f","f00","0f0","00f","f80","ff0","90f","f00","f0f","f00","000","000","0f0","00f","f48",""];  
  uint8[] private hat_w = [251, 64, 47, 42, 39, 38, 36, 35, 34, 34, 33, 29, 28, 26, 26, 25, 25, 25, 22, 21, 20, 20, 18, 17, 17, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 8, 7];
  string[] private z = ['<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 500 500"><rect x="0" y="0" width="500" height="500" style="fill:#',
    '"/><rect width="300" height="120" x="99" y="400" style="fill:#', '"/><circle cx="190" cy="470" r="5" style="fill:#', '"/><circle cx="310" cy="470" r="5" style="fill:#',
    '"/><circle cx="100" cy="250" r="50" style="fill:#', '"/><circle cx="100" cy="250" r="20" style="fill:#', '"/><circle cx="400" cy="250" r="50" style="fill:#',
    '"/><circle cx="400" cy="250" r="20" style="fill:#', '"/><circle cx="250" cy="250" r="150" style="fill:#', '"/><circle cx="250" cy="250" r="120" style="fill:#',
    '"/><circle cx="200" cy="215" r="35" style="fill:#fff"/><circle cx="305" cy="222" r="31" style="fill:#fff"/><circle cx="200" cy="220" r="20" style="fill:#',
    '"/><circle cx="300" cy="220" r="20" style="fill:#', '"/><circle cx="200" cy="220" r="7" style="fill:#000"/><circle cx="300" cy="220" r="7" style="fill:#000"/>',
    '<ellipse cx="250" cy="315" rx="84" ry="34" style="fill:#',
     '"/><rect x="195" y="330" width="110" height="3" style="fill:#000"/><circle cx="268" cy="295" r="5" style="fill:#000"/><circle cx="232" cy="295" r="5" style="fill:#000"/>',
    '</svg>'];
  string private cross='<rect x="95" y="275" width="10" height="40" style="fill:#872"/><rect x="85" y="285" width="30" height="10" style="fill:#872"/>';
  string private clo1='<rect width="300" height="120" x="99" y="400" style="fill:#';
  string private clo2='"/><rect width="50" height="55" x="280" y="430" style="fill:#';
  string private hh1='<rect width="200" height="99" x="150" y="40" style="fill:#';
  string private hh2='"/><rect width="200" height="33" x="150" y="106" style="fill:#';
  string private sl1='<rect x="150" y="190" width="200" height="30" style="fill:#';
  string private sl2='"/><rect x="160" y="170" width="180" height="50" style="fill:#';
  string private mou='<line x1="287" y1="331" x2="320" y2="366" style="stroke:#000;stroke-width:5"/>';
  string private ey1='<rect x="160" y="190" width="75" height="15" style="fill:#';
  string private ey2='"/><rect x="275" y="190" width="65" height="15" style="fill:#';
  string private ey3='<rect x="160" y="235" width="180" height="50" style="fill:#';
  string private zz='"/>';
  string private ea1='<circle cx="100" cy="290" r="14" style="fill:#';
  string private ea2='fe7';
  string private ea3='999';
  string private ea4='"/><circle cx="100" cy="290" r="4" style="fill:#000"/>';
  string private ea5='<circle cx="100" cy="290" r="12" style="fill:#';
  string private ea6='bdd';
  string private mo1='<line x1="';
  string private mo2='" y1="307" x2="';
  string private mo3='" y2="312" style="stroke:#000;stroke-width:2"/>';
  string private mo4='" y1="317" x2="';
  string private mo5='" y2="322" style="stroke:#000;stroke-width:2"/>';
  string private tr1='", "attributes": [{"trait_type": "Background","value": "';
  string private tr2='"},{"trait_type": "Fur","value": "';
  string private tr3='"},{"trait_type": "Earring","value": "';
  string private tr4='"},{"trait_type": "Hat","value": "';
  string private tr5='"},{"trait_type": "Eyes","value": "';
  string private tr6='"},{"trait_type": "Clothes","value": "';
  string private tr7='"},{"trait_type": "Mouth","value": "';
  string private tr8='"}],"image": "data:image/svg+xml;base64,';
  string private ra1='A';
  string private ra2='C';
  string private ra3='D';
  string private ra4='E';
  string private ra5='F';
  string private ra6='G';
  string private co1=', ';
  string private rl1='{"name": "OnChain Monkey #';
  string private rl3='"}';
  string private rl4='data:application/json;base64,';

  struct Ape { // a nod to BAYC, "ape" was shorter to type than monkey
    uint8 bg;
    uint8 fur;
    uint8 eyes;
    uint8 mouth;
    uint8 earring;
    uint8 clothes;
    uint8 hat;
  }

  // this was used to create the distributon of 10,000 and tested for uniqueness for the given parameters of this collection
  function random(string memory input) internal pure returns (uint256) {
    return uint256(keccak256(abi.encodePacked(input)));
  }

  function usew(uint8[] memory w,uint256 i) internal pure returns (uint8) {
    uint8 ind=0;
    uint256 j=uint256(w[0]);
    while (j<=i) {
      ind++;
      j+=uint256(w[ind]);
    }
    return ind;
  }

  function randomOne(uint256 tokenId) internal view returns (Ape memory) {
    tokenId=12839-tokenId; // avoid dupes
    Ape memory ape;
    ape.bg = uint8(random(string(abi.encodePacked(ra1,tokenId.toString()))) % 8);
    ape.fur = usew(fur_w,random(string(abi.encodePacked(clo1,tokenId.toString())))%1817);
    ape.eyes = usew(eyes_w,random(string(abi.encodePacked(ra2,tokenId.toString())))%1429);
    ape.mouth = usew(mouth_w,random(string(abi.encodePacked(ra3,tokenId.toString())))%1112);
    ape.earring = usew(earring_w,random(string(abi.encodePacked(ra4,tokenId.toString())))%358);
    ape.clothes = usew(clothes_w,random(string(abi.encodePacked(ra5,tokenId.toString())))%1329);
    ape.hat = usew(hat_w,random(string(abi.encodePacked(ra6,tokenId.toString())))%1111);
    if (tokenId==7403) {
      ape.hat++; // perturb dupe
    }
    return ape;
  }

  // get string attributes of properties, used in tokenURI call
  function getTraits(Ape memory ape) internal view returns (string memory) {
    string memory o=string(abi.encodePacked(tr1,uint256(ape.bg).toString(),tr2,uint256(ape.fur).toString(),tr3,uint256(ape.earring).toString()));
    return string(abi.encodePacked(o,tr4,uint256(ape.hat).toString(),tr5,uint256(ape.eyes).toString(),tr6,uint256(ape.clothes).toString(),tr7,uint256(ape.mouth).toString(),tr8));
  }

  // return comma separated traits in order: hat, fur, clothes, eyes, earring, mouth, background
  function getAttributes(uint256 tokenId) public view returns (string memory) {
    Ape memory ape = randomOne(tokenId);
    string memory o=string(abi.encodePacked(uint256(ape.hat).toString(),co1,uint256(ape.fur).toString(),co1,uint256(ape.clothes).toString(),co1));
    return string(abi.encodePacked(o,uint256(ape.eyes).toString(),co1,uint256(ape.earring).toString(),co1,uint256(ape.mouth).toString(),co1,uint256(ape.bg).toString()));
  }

  function genEye(string memory a,string memory b,uint8 h) internal view returns (string memory) {
    string memory out = '';
    if (h>4) { out = string(abi.encodePacked(sl1,a,sl2,a,zz)); }
    if (h>10) { out = string(abi.encodePacked(out,ey1,b,ey2,b,zz)); }
    if (h>16) { out = string(abi.encodePacked(out,ey3,a,zz)); }
    return out;
  }

  function genMouth(uint8 h) internal view returns (string memory) {
    string memory out = '';
    uint i;
    if ((h>24) || ((h>8) && (h<16))) {
      for (i=0;i<7;i++) {
        out = string(abi.encodePacked(out,mo1,(175+i*25).toString(),mo2,(175+i*25).toString(),mo3));
      }
      for (i=0;i<6;i++) {
        out = string(abi.encodePacked(out,mo1,(187+i*25).toString(),mo4,(187+i*25).toString(),mo5));
      }
    }
    if (h>15) {
      out = string(abi.encodePacked(out,mou));
    }
    return out;
  }

  function genEarring(uint8 h) internal view returns (string memory) {
    if (h==0) {
      return '';
    }
    if (h<3) {
      if (h>1) {
        return string(abi.encodePacked(ea1,ea2,ea4));
      } 
      return string(abi.encodePacked(ea1,ea3,ea4));
    }
    if (h>3) {
      if (h>5) {
        return string(abi.encodePacked(ea5,ea6,zz));
      } 
      if (h>4) {
        return string(abi.encodePacked(ea5,ea2,zz));
      } 
      return string(abi.encodePacked(ea5,ea3,zz));
    }
    return cross;
  }

  function genSVG(Ape memory ape) internal view returns (string memory) {
    string memory a=fur1[ape.fur];
    string memory b=fur2[ape.fur];
    string memory hatst='';
    string memory clost='';
    if (ape.clothes>0) {
      clost=string(abi.encodePacked(clo1,clothes1[ape.clothes-1],clo2,clothes2[ape.clothes-1],zz));
    }
    if (ape.hat>0) {
      hatst=string(abi.encodePacked(hh1,hat1[ape.hat-1],hh2,hat2[ape.hat-1],zz));
    }
    string memory output = string(abi.encodePacked(z[0],background[ape.bg],z[1],b,z[2]));
    output = string(abi.encodePacked(output,a,z[3],a,z[4],b,z[5],a,z[6]));
    output = string(abi.encodePacked(output,b,z[7],a,z[8],b,z[9],a,z[10]));
    output = string(abi.encodePacked(output,eyes[ape.eyes],z[11],eyes[ape.eyes],z[12],genEye(a,b,ape.eyes),z[13],mouth[ape.mouth],z[14]));
    return string(abi.encodePacked(output,genMouth(ape.mouth),genEarring(ape.earring),hatst,clost,z[15]));
  }

  function tokenURI(uint256 tokenId) override public view returns (string memory) {
    Ape memory ape = randomOne(tokenId);
    return string(abi.encodePacked(rl4,Base64.encode(bytes(string(abi.encodePacked(rl1,tokenId.toString(),getTraits(ape),Base64.encode(bytes(genSVG(ape))),rl3))))));
  }

  function claim() public nonReentrant {
    require(numClaimed >= 0 && numClaimed < 9500, "invalid claim");
    _safeMint(_msgSender(), numClaimed + 1);
    numClaimed += 1;
  }
    
  function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
    require(tokenId > 9500 && tokenId < 10001, "invalid claim");
    _safeMint(owner(), tokenId);
  }
    
  constructor() ERC721("OnChainAPE", "OCAPE") Ownable() {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c556040518061010001604052806040518060400160405280600381526020017f363536000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646461000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f653932000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f316562000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363633000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f396465000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333637000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6363630000000000000000000000000000000000000000000000000000000000815250815250600d906008620001fd92919062005231565b506040518061026001604052806040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353332000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f343434000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f613731000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636139000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666335000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666665000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353734000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f376639000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6664310000000000000000000000000000000000000000000000000000000000815250815250600e9060136200067b92919062005291565b506040518061026001604052806040518060400160405280600381526020017f353332000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373131000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333434000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353535000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f386138000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333266000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3635330000000000000000000000000000000000000000000000000000000000815250815250600f90601362000af992919062005291565b5060405180610260016040528060f960ff16815260200160f660ff16815260200160df60ff168152602001608d60ff168152602001607460ff168152602001607260ff168152602001605d60ff168152602001605a60ff168152602001605960ff168152602001605660ff168152602001604a60ff168152602001604860ff168152602001603760ff168152602001603060ff168152602001602760ff168152602001602060ff168152602001601c60ff168152602001600e60ff168152602001600860ff16815250601090601362000bd4929190620052f1565b50604051806102e001604052806040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081525060119060176200113e9291906200539f565b50604051806102e0016040528060f560ff168152602001607960ff168152602001606b60ff168152602001606560ff168152602001604f60ff168152602001604e60ff168152602001604660ff168152602001604460ff168152602001603e60ff168152602001603a60ff168152602001603860ff168152602001603360ff168152602001603260ff168152602001603060ff168152602001602c60ff168152602001602660ff168152602001602360ff168152602001602160ff168152602001601f60ff168152602001601660ff168152602001600f60ff168152602001600a60ff168152602001600760ff16815250601290601762001241929190620053ff565b506040518061042001604052806040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f66643100000000000000000000000000000000000000000000000000000000008152508152506013906021620019f9929190620054ad565b5060405180610420016040528060fc60ff16815260200160ac60ff168152602001605060ff168152602001604f60ff168152602001603860ff168152602001603160ff168152602001602560ff168152602001602160ff168152602001601f60ff168152602001601e60ff168152602001601c60ff168152602001601b60ff168152602001601a60ff168152602001601760ff168152602001601660ff168152602001601260ff168152602001600f60ff168152602001600e60ff168152602001600d60ff168152602001600c60ff168152602001600b60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600960ff168152602001600860ff168152602001600760ff168152602001600760ff168152602001600660ff168152602001600560ff168152602001600560ff168152602001600460ff168152602001600360ff16815250601490602162001b609291906200550d565b506040518060c001604052806040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6264640000000000000000000000000000000000000000000000000000000000815250815250601590600662001cde929190620055bb565b506040518060e0016040528060fb60ff168152602001602060ff168152602001601d60ff168152602001601160ff168152602001601060ff168152602001600860ff168152602001600560ff16815250601690600762001d409291906200561b565b506040518061056001604052806040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3232320000000000000000000000000000000000000000000000000000000000815250815250601790602b62002746929190620056c9565b506040518061056001604052806040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6664310000000000000000000000000000000000000000000000000000000000815250815250601890602b6200314c929190620056c9565b5060405180610580016040528060fb60ff168152602001603760ff168152602001602d60ff168152602001602b60ff168152602001602660ff168152602001602560ff168152602001602260ff168152602001602160ff168152602001602060ff168152602001601f60ff168152602001601f60ff168152602001601f60ff168152602001601f60ff168152602001601f60ff168152602001601e60ff168152602001601e60ff168152602001601d60ff168152602001601d60ff168152602001601c60ff168152602001601b60ff168152602001601b60ff168152602001601b60ff168152602001601a60ff168152602001601960ff168152602001601860ff168152602001601660ff168152602001601560ff168152602001601460ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601260ff168152602001601160ff168152602001601060ff168152602001600f60ff168152602001600e60ff168152602001600d60ff168152602001600b60ff168152602001600960ff168152602001600860ff168152602001600660ff16815250601990602c6200332192919062005729565b50604051806104a001604052806040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6666300000000000000000000000000000000000000000000000000000000000815250815260200160405180602001604052806000815250815250601a90602562003b9f929190620057d7565b50604051806104a001604052806040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6634380000000000000000000000000000000000000000000000000000000000815250815260200160405180602001604052806000815250815250601b9060256200441d929190620057d7565b50604051806104a0016040528060fb60ff168152602001604060ff168152602001602f60ff168152602001602a60ff168152602001602760ff168152602001602660ff168152602001602460ff168152602001602360ff168152602001602260ff168152602001602260ff168152602001602160ff168152602001601d60ff168152602001601c60ff168152602001601a60ff168152602001601a60ff168152602001601960ff168152602001601960ff168152602001601960ff168152602001601660ff168152602001601560ff168152602001601460ff168152602001601460ff168152602001601260ff168152602001601160ff168152602001601160ff168152602001600f60ff168152602001600e60ff168152602001600e60ff168152602001600d60ff168152602001600d60ff168152602001600c60ff168152602001600c60ff168152602001600c60ff168152602001600a60ff168152602001600960ff168152602001600860ff168152602001600760ff16815250601c906025620045ac92919062005837565b506040518061020001604052806040518060c00160405280609a81526020016200aed4609a913981526020016040518060600160405280603e81526020016200b30e603e913981526020016040518060600160405280603081526020016200ada96030913981526020016040518060600160405280603081526020016200b2206030913981526020016040518060600160405280603181526020016200b1ef6031913981526020016040518060600160405280603181526020016200b0256031913981526020016040518060600160405280603181526020016200aea36031913981526020016040518060600160405280603181526020016200b5d16031913981526020016040518060600160405280603281526020016200b14c6032913981526020016040518060600160405280603281526020016200b6026032913981526020016040518060c00160405280609981526020016200ae0a6099913981526020016040518060600160405280603181526020016200add96031913981526020016040518060a00160405280606981526020016200b2a56069913981526020016040518060600160405280603881526020016200b46d6038913981526020016040518060e0016040528060a981526020016200b34c60a9913981526020016040518060400160405280600681526020017f3c2f7376673e0000000000000000000000000000000000000000000000000000815250815250601d906010620047d5929190620058e5565b506040518060a00160405280607e81526020016200b093607e9139601e908162004800919062005c4c565b506040518060600160405280603b81526020016200afea603b9139601f90816200482b919062005c4c565b506040518060600160405280603d81526020016200b056603d91396020908162004856919062005c4c565b506040518060600160405280603a81526020016200b3f5603a91396021908162004881919062005c4c565b506040518060600160405280603e81526020016200b42f603e913960229081620048ac919062005c4c565b506040518060600160405280603b81526020016200b111603b913960239081620048d7919062005c4c565b506040518060600160405280603e81526020016200b4df603e91396024908162004902919062005c4c565b506040518060800160405280604e81526020016200b17e604e9139602590816200492d919062005c4c565b506040518060600160405280603a81526020016200b4a5603a91396026908162004958919062005c4c565b506040518060600160405280603d81526020016200b53f603d91396027908162004983919062005c4c565b506040518060600160405280603b81526020016200b690603b913960289081620049ae919062005c4c565b506040518060400160405280600381526020017f222f3e000000000000000000000000000000000000000000000000000000000081525060299081620049f5919062005c4c565b506040518060600160405280602e81526020016200b634602e9139602a908162004a20919062005c4c565b506040518060400160405280600381526020017f6665370000000000000000000000000000000000000000000000000000000000815250602b908162004a67919062005c4c565b506040518060400160405280600381526020017f3939390000000000000000000000000000000000000000000000000000000000815250602c908162004aae919062005c4c565b506040518060600160405280603681526020016200afb460369139602d908162004ad9919062005c4c565b506040518060600160405280602e81526020016200b662602e9139602e908162004b04919062005c4c565b506040518060400160405280600381526020017f6264640000000000000000000000000000000000000000000000000000000000815250602f908162004b4b919062005c4c565b506040518060400160405280600a81526020017f3c6c696e652078313d22000000000000000000000000000000000000000000008152506030908162004b92919062005c4c565b506040518060400160405280600f81526020017f222079313d22333037222078323d2200000000000000000000000000000000008152506031908162004bd9919062005c4c565b506040518060600160405280602f81526020016200b5a2602f91396032908162004c04919062005c4c565b506040518060400160405280600f81526020017f222079313d22333137222078323d2200000000000000000000000000000000008152506033908162004c4b919062005c4c565b506040518060600160405280602f81526020016200b250602f91396034908162004c76919062005c4c565b506040518060600160405280603881526020016200ad71603891396035908162004ca1919062005c4c565b506040518060600160405280602281526020016200af92602291396036908162004ccc919062005c4c565b506040518060600160405280602681526020016200b57c602691396037908162004cf7919062005c4c565b506040518060600160405280602281526020016200b51d602291396038908162004d22919062005c4c565b506040518060600160405280602381526020016200b1cc602391396039908162004d4d919062005c4c565b506040518060600160405280602681526020016200b27f60269139603a908162004d78919062005c4c565b506040518060600160405280602481526020016200af6e60249139603b908162004da3919062005c4c565b506040518060600160405280602881526020016200ad4960289139603c908162004dce919062005c4c565b506040518060400160405280600181526020017f4100000000000000000000000000000000000000000000000000000000000000815250603d908162004e15919062005c4c565b506040518060400160405280600181526020017f4300000000000000000000000000000000000000000000000000000000000000815250603e908162004e5c919062005c4c565b506040518060400160405280600181526020017f4400000000000000000000000000000000000000000000000000000000000000815250603f908162004ea3919062005c4c565b506040518060400160405280600181526020017f45000000000000000000000000000000000000000000000000000000000000008152506040908162004eea919062005c4c565b506040518060400160405280600181526020017f46000000000000000000000000000000000000000000000000000000000000008152506041908162004f31919062005c4c565b506040518060400160405280600181526020017f47000000000000000000000000000000000000000000000000000000000000008152506042908162004f78919062005c4c565b506040518060400160405280600281526020017f2c200000000000000000000000000000000000000000000000000000000000008152506043908162004fbf919062005c4c565b506040518060400160405280601a81526020017f7b226e616d65223a20224f6e436861696e204d6f6e6b657920230000000000008152506044908162005006919062005c4c565b506040518060400160405280600281526020017f227d000000000000000000000000000000000000000000000000000000000000815250604590816200504d919062005c4c565b506040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152506046908162005094919062005c4c565b50348015620050a257600080fd5b506040518060400160405280600a81526020017f4f6e436861696e415045000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4f43415045000000000000000000000000000000000000000000000000000000815250816000908162005120919062005c4c565b50806001908162005132919062005c4c565b5050506001600a819055506200515d620051516200516360201b60201c565b6200516b60201b60201c565b62005d33565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280548282559060005260206000209081019282156200527e579160200282015b828111156200527d5782518290816200526c919062005c4c565b509160200191906001019062005252565b5b5090506200528d919062005945565b5090565b828054828255906000526020600020908101928215620052de579160200282015b82811115620052dd578251829081620052cc919062005c4c565b5091602001919060010190620052b2565b5b509050620052ed919062005945565b5090565b82805482825590600052602060002090601f016020900481019282156200538c5791602002820160005b838211156200535b57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200531b565b80156200538a5782816101000a81549060ff02191690556001016020816000010492830192600103026200535b565b505b5090506200539b91906200596d565b5090565b828054828255906000526020600020908101928215620053ec579160200282015b82811115620053eb578251829081620053da919062005c4c565b5091602001919060010190620053c0565b5b509050620053fb919062005945565b5090565b82805482825590600052602060002090601f016020900481019282156200549a5791602002820160005b838211156200546957835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005429565b8015620054985782816101000a81549060ff021916905560010160208160000104928301926001030262005469565b505b509050620054a991906200596d565b5090565b828054828255906000526020600020908101928215620054fa579160200282015b82811115620054f9578251829081620054e8919062005c4c565b5091602001919060010190620054ce565b5b50905062005509919062005945565b5090565b82805482825590600052602060002090601f01602090048101928215620055a85791602002820160005b838211156200557757835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005537565b8015620055a65782816101000a81549060ff021916905560010160208160000104928301926001030262005577565b505b509050620055b791906200596d565b5090565b82805482825590600052602060002090810192821562005608579160200282015b8281111562005607578251829081620055f6919062005c4c565b5091602001919060010190620055dc565b5b50905062005617919062005945565b5090565b82805482825590600052602060002090601f01602090048101928215620056b65791602002820160005b838211156200568557835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005645565b8015620056b45782816101000a81549060ff021916905560010160208160000104928301926001030262005685565b505b509050620056c591906200596d565b5090565b82805482825590600052602060002090810192821562005716579160200282015b828111156200571557825182908162005704919062005c4c565b5091602001919060010190620056ea565b5b50905062005725919062005945565b5090565b82805482825590600052602060002090601f01602090048101928215620057c45791602002820160005b838211156200579357835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005753565b8015620057c25782816101000a81549060ff021916905560010160208160000104928301926001030262005793565b505b509050620057d391906200596d565b5090565b82805482825590600052602060002090810192821562005824579160200282015b828111156200582357825182908162005812919062005c4c565b5091602001919060010190620057f8565b5b50905062005833919062005945565b5090565b82805482825590600052602060002090601f01602090048101928215620058d25791602002820160005b83821115620058a157835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005861565b8015620058d05782816101000a81549060ff0219169055600101602081600001049283019260010302620058a1565b505b509050620058e191906200596d565b5090565b82805482825590600052602060002090810192821562005932579160200282015b828111156200593157825182908162005920919062005c4c565b509160200191906001019062005906565b5b50905062005941919062005945565b5090565b5b808211156200596957600081816200595f91906200598c565b5060010162005946565b5090565b5b80821115620059885760008160009055506001016200596e565b5090565b5080546200599a9062005a3b565b6000825580601f10620059ae5750620059cf565b601f016020900490600052602060002090810190620059ce91906200596d565b5b50565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062005a5457607f821691505b60208210810362005a6a5762005a6962005a0c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262005ad47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262005a95565b62005ae0868362005a95565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062005b2d62005b2762005b218462005af8565b62005b02565b62005af8565b9050919050565b6000819050919050565b62005b498362005b0c565b62005b6162005b588262005b34565b84845462005aa2565b825550505050565b600090565b62005b7862005b69565b62005b8581848462005b3e565b505050565b5b8181101562005bad5762005ba160008262005b6e565b60018101905062005b8b565b5050565b601f82111562005bfc5762005bc68162005a70565b62005bd18462005a85565b8101602085101562005be1578190505b62005bf962005bf08562005a85565b83018262005b8a565b50505b505050565b600082821c905092915050565b600062005c216000198460080262005c01565b1980831691505092915050565b600062005c3c838362005c0e565b9150826002028217905092915050565b62005c5782620059d2565b67ffffffffffffffff81111562005c735762005c72620059dd565b5b62005c7f825462005a3b565b62005c8c82828562005bb1565b600060209050601f83116001811462005cc4576000841562005caf578287015190505b62005cbb858262005c2e565b86555062005d2b565b601f19841662005cd48662005a70565b60005b8281101562005cfe5784890151825560018201915060208501945060208101905062005cd7565b8683101562005d1e578489015162005d1a601f89168262005c0e565b8355505b6001600288020188555050505b505050505050565b6150068062005d436000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb465146103c7578063b88d4fde146103e3578063c87b56dd146103ff578063d5abeb011461042f578063e985e9c51461044d578063f2fde38b1461047d57610158565b80636352211e1461030357806370a0823114610333578063715018a6146103635780638da5cb5b1461036d57806395d89b411461038b5780639c2f2a42146103a957610158565b80632f745c59116101155780632f745c591461023157806342842e0e14610261578063434f48c41461027d5780634378a6e3146102995780634e71d92d146102c95780634f6ccce7146102d357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806318160ddd146101f757806323b872dd14610215575b600080fd5b610177600480360381019061017291906136c0565b610499565b6040516101849190613708565b60405180910390f35b610195610513565b6040516101a291906137b3565b60405180910390f35b6101c560048036038101906101c0919061380b565b6105a5565b6040516101d29190613879565b60405180910390f35b6101f560048036038101906101f091906138c0565b61062a565b005b6101ff610741565b60405161020c919061390f565b60405180910390f35b61022f600480360381019061022a919061392a565b61074e565b005b61024b600480360381019061024691906138c0565b6107ae565b604051610258919061390f565b60405180910390f35b61027b6004803603810190610276919061392a565b610853565b005b6102976004803603810190610292919061380b565b610873565b005b6102b360048036038101906102ae919061380b565b6109a9565b6040516102c091906137b3565b60405180910390f35b6102d1610a8c565b005b6102ed60048036038101906102e8919061380b565b610b71565b6040516102fa919061390f565b60405180910390f35b61031d6004803603810190610318919061380b565b610be2565b60405161032a9190613879565b60405180910390f35b61034d6004803603810190610348919061397d565b610c93565b60405161035a919061390f565b60405180910390f35b61036b610d4a565b005b610375610dd2565b6040516103829190613879565b60405180910390f35b610393610dfc565b6040516103a091906137b3565b60405180910390f35b6103b1610e8e565b6040516103be919061390f565b60405180910390f35b6103e160048036038101906103dc91906139d6565b610e94565b005b6103fd60048036038101906103f89190613b4b565b611014565b005b6104196004803603810190610414919061380b565b611076565b60405161042691906137b3565b60405180910390f35b610437611101565b604051610444919061390f565b60405180910390f35b61046760048036038101906104629190613bce565b611107565b6040516104749190613708565b60405180910390f35b6104976004803603810190610492919061397d565b61119b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050c575061050b82611292565b5b9050919050565b60606000805461052290613c3d565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90613c3d565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b082611374565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690613ce0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063582610be2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069c90613d72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c46113e0565b73ffffffffffffffffffffffffffffffffffffffff1614806106f357506106f2816106ed6113e0565b611107565b5b610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990613e04565b60405180910390fd5b61073c83836113e8565b505050565b6000600880549050905090565b61075f6107596113e0565b826114a1565b61079e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079590613e96565b60405180910390fd5b6107a983838361157f565b505050565b60006107b983610c93565b82106107fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f190613f28565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61086e83838360405180602001604052806000815250611014565b505050565b6002600a54036108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90613f94565b60405180910390fd5b6002600a819055506108c86113e0565b73ffffffffffffffffffffffffffffffffffffffff166108e6610dd2565b73ffffffffffffffffffffffffffffffffffffffff161461093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390614000565b60405180910390fd5b61251c8111801561094e575061271181105b61098d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109849061406c565b60405180910390fd5b61099e610998610dd2565b826117da565b6001600a8190555050565b606060006109b6836117f8565b905060006109ca8260c0015160ff16611d77565b60436109dc846020015160ff16611d77565b60436109ee8660a0015160ff16611d77565b6043604051602001610a0596959493929190614160565b604051602081830303815290604052905080610a27836040015160ff16611d77565b6043610a39856080015160ff16611d77565b6043610a4b876060015160ff16611d77565b6043610a5d896000015160ff16611d77565b604051602001610a749897969594939291906141b8565b60405160208183030381529060405292505050919050565b6002600a5403610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613f94565b60405180910390fd5b6002600a819055506000600c5410158015610aef575061251c600c54105b610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b259061406c565b60405180910390fd5b610b4d610b396113e0565b6001600c54610b489190614259565b6117da565b6001600c6000828254610b609190614259565b925050819055506001600a81905550565b6000610b7b610741565b8210610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb3906142ff565b60405180910390fd5b60088281548110610bd057610bcf61431f565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906143c0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa90614452565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d526113e0565b73ffffffffffffffffffffffffffffffffffffffff16610d70610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614000565b60405180910390fd5b610dd06000611ed7565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0b90613c3d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3790613c3d565b8015610e845780601f10610e5957610100808354040283529160200191610e84565b820191906000526020600020905b815481529060010190602001808311610e6757829003601f168201915b5050505050905090565b600c5481565b610e9c6113e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f00906144be565b60405180910390fd5b8060056000610f166113e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc36113e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110089190613708565b60405180910390a35050565b61102561101f6113e0565b836114a1565b611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90613e96565b60405180910390fd5b61107084848484611f9d565b50505050565b60606000611083836117f8565b905060466110d9604461109586611d77565b61109e85611ff9565b6110af6110aa876120d4565b61272c565b60456040516020016110c59594939291906144de565b60405160208183030381529060405261272c565b6040516020016110ea929190614529565b604051602081830303815290604052915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a36113e0565b73ffffffffffffffffffffffffffffffffffffffff166111c1610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614000565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d906145bf565b60405180910390fd5b61128f81611ed7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061135d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061136d575061136c826128c3565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661145b83610be2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114ac82611374565b6114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290614651565b60405180910390fd5b60006114f683610be2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061156557508373ffffffffffffffffffffffffffffffffffffffff1661154d846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061157657506115758185611107565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661159f82610be2565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906146e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90614775565b60405180910390fd5b61166f83838361292d565b61167a6000826113e8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116ca9190614795565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117219190614259565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6117f4828260405180602001604052806000815250612a3f565b5050565b611800613602565b8161322761180e9190614795565b9150611818613602565b600861184d603d61182886611d77565b604051602001611839929190614529565b604051602081830303815290604052612a9a565b61185791906147f8565b816000019060ff16908160ff168152505061192760108054806020026020016040519081016040528092919081815260200182805480156118dd57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116118a65790505b5050505050610719611918601f6118f388611d77565b604051602001611904929190614529565b604051602081830303815290604052612a9a565b61192291906147f8565b612acd565b816020019060ff16908160ff16815250506119f760128054806020026020016040519081016040528092919081815260200182805480156119ad57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116119765790505b50505050506105956119e8603e6119c388611d77565b6040516020016119d4929190614529565b604051602081830303815290604052612a9a565b6119f291906147f8565b612acd565b816040019060ff16908160ff1681525050611ac76014805480602002602001604051908101604052809291908181526020018280548015611a7d57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a465790505b5050505050610458611ab8603f611a9388611d77565b604051602001611aa4929190614529565b604051602081830303815290604052612a9a565b611ac291906147f8565b612acd565b816060019060ff16908160ff1681525050611b976016805480602002602001604051908101604052809291908181526020018280548015611b4d57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611b165790505b5050505050610166611b886040611b6388611d77565b604051602001611b74929190614529565b604051602081830303815290604052612a9a565b611b9291906147f8565b612acd565b816080019060ff16908160ff1681525050611c676019805480602002602001604051908101604052809291908181526020018280548015611c1d57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611be65790505b5050505050610531611c586041611c3388611d77565b604051602001611c44929190614529565b604051602081830303815290604052612a9a565b611c6291906147f8565b612acd565b8160a0019060ff16908160ff1681525050611d37601c805480602002602001604051908101604052809291908181526020018280548015611ced57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611cb65790505b5050505050610457611d286042611d0388611d77565b604051602001611d14929190614529565b604051602081830303815290604052612a9a565b611d3291906147f8565b612acd565b8160c0019060ff16908160ff1681525050611ceb8303611d6e578060c0018051809190611d6390614836565b60ff1660ff16815250505b80915050919050565b606060008203611dbe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ed2565b600082905060005b60008214611df0578080611dd99061485f565b915050600a82611de991906148a7565b9150611dc6565b60008167ffffffffffffffff811115611e0c57611e0b613a20565b5b6040519080825280601f01601f191660200182016040528015611e3e5781602001600182028036833780820191505090505b5090505b60008514611ecb57600182611e579190614795565b9150600a85611e6691906147f8565b6030611e729190614259565b60f81b818381518110611e8857611e8761431f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ec491906148a7565b9450611e42565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa884848461157f565b611fb484848484612b4b565b611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea9061494a565b60405180910390fd5b50505050565b60606000603561200f846000015160ff16611d77565b6036612021866020015160ff16611d77565b6037612033886080015160ff16611d77565b6040516020016120489695949392919061496a565b604051602081830303815290604052905080603861206c8560c0015160ff16611d77565b603961207e876040015160ff16611d77565b603a6120908960a0015160ff16611d77565b603b6120a28b6060015160ff16611d77565b603c6040516020016120bd9a999897969594939291906149c2565b604051602081830303815290604052915050919050565b60606000600e836020015160ff16815481106120f3576120f261431f565b5b90600052602060002001805461210890613c3d565b80601f016020809104026020016040519081016040528092919081815260200182805461213490613c3d565b80156121815780601f1061215657610100808354040283529160200191612181565b820191906000526020600020905b81548152906001019060200180831161216457829003601f168201915b505050505090506000600f846020015160ff16815481106121a5576121a461431f565b5b9060005260206000200180546121ba90613c3d565b80601f01602080910402602001604051908101604052809291908181526020018280546121e690613c3d565b80156122335780601f1061220857610100808354040283529160200191612233565b820191906000526020600020905b81548152906001019060200180831161221657829003601f168201915b505050505090506000604051806020016040528060008152509050600060405180602001604052806000815250905060008660a0015160ff16111561230057601f601760018860a001516122879190614a4e565b60ff168154811061229b5761229a61431f565b5b906000526020600020016020601860018a60a001516122ba9190614a4e565b60ff16815481106122ce576122cd61431f565b5b9060005260206000200160296040516020016122ee959493929190614a83565b60405160208183030381529060405290505b60008660c0015160ff16111561239e576021601a60018860c001516123259190614a4e565b60ff16815481106123395761233861431f565b5b906000526020600020016022601b60018a60c001516123589190614a4e565b60ff168154811061236c5761236b61431f565b5b90600052602060002001602960405160200161238c959493929190614a83565b60405160208183030381529060405291505b6000601d6000815481106123b5576123b461431f565b5b90600052602060002001600d886000015160ff16815481106123da576123d961431f565b5b90600052602060002001601d6001815481106123f9576123f861431f565b5b9060005260206000200186601d6002815481106124195761241861431f565b5b90600052602060002001604051602001612437959493929190614ace565b60405160208183030381529060405290508085601d60038154811061245f5761245e61431f565b5b9060005260206000200187601d60048154811061247f5761247e61431f565b5b9060005260206000200188601d60058154811061249f5761249e61431f565b5b906000526020600020018b601d6006815481106124bf576124be61431f565b5b906000526020600020016040516020016124e199989796959493929190614b19565b60405160208183030381529060405290508084601d6007815481106125095761250861431f565b5b9060005260206000200187601d6008815481106125295761252861431f565b5b9060005260206000200188601d6009815481106125495761254861431f565b5b906000526020600020018b601d600a815481106125695761256861431f565b5b9060005260206000200160405160200161258b99989796959493929190614b19565b6040516020818303038152906040529050806011886040015160ff16815481106125b8576125b761431f565b5b90600052602060002001601d600b815481106125d7576125d661431f565b5b9060005260206000200160118a6040015160ff16815481106125fc576125fb61431f565b5b90600052602060002001601d600c8154811061261b5761261a61431f565b5b906000526020600020016126348a8a8e60400151612cd2565b601d600d815481106126495761264861431f565b5b9060005260206000200160138e6060015160ff168154811061266e5761266d61431f565b5b90600052602060002001601d600e8154811061268d5761268c61431f565b5b906000526020600020016040516020016126af99989796959493929190614b98565b6040516020818303038152906040529050806126ce8860600151612da0565b6126db8960800151612f3e565b8585601d600f815481106126f2576126f161431f565b5b9060005260206000200160405160200161271196959493929190614c17565b60405160208183030381529060405295505050505050919050565b60606000825190506000810361275457604051806020016040528060008152509150506128be565b600060036002836127659190614259565b61276f91906148a7565b600461277b9190614c6f565b9050600060208261278c9190614259565b67ffffffffffffffff8111156127a5576127a4613a20565b5b6040519080825280601f01601f1916602001820160405280156127d75781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614f91604091399050600181016020830160005b8681101561287b5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612802565b50600386066001811461289557600281146128a5576128b0565b613d3d60f01b60028303526128b0565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612938838383613117565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361297a576129758161311c565b6129b9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129b8576129b78382613165565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129fb576129f6816132d2565b612a3a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a3957612a3882826133a3565b5b5b505050565b612a498383613422565b612a566000848484612b4b565b612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c9061494a565b60405180910390fd5b505050565b600081604051602001612aad9190614cb1565b6040516020818303038152906040528051906020012060001c9050919050565b60008060009050600084600081518110612aea57612ae961431f565b5b602002602001015160ff1690505b838111612b40578180612b0a90614836565b925050848260ff1681518110612b2357612b2261431f565b5b602002602001015160ff1681612b399190614259565b9050612af8565b819250505092915050565b6000612b6c8473ffffffffffffffffffffffffffffffffffffffff166135ef565b15612cc5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b956113e0565b8786866040518563ffffffff1660e01b8152600401612bb79493929190614d1d565b6020604051808303816000875af1925050508015612bf357506040513d601f19601f82011682018060405250810190612bf09190614d7e565b60015b612c75573d8060008114612c23576040519150601f19603f3d011682016040523d82523d6000602084013e612c28565b606091505b506000815103612c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c649061494a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cca565b600190505b949350505050565b6060600060405180602001604052806000815250905060048360ff161115612d22576023856024876029604051602001612d10959493929190614dab565b60405160208183030381529060405290505b600a8360ff161115612d5e57806026856027876029604051602001612d4c96959493929190614160565b60405160208183030381529060405290505b60108360ff161115612d9557806028866029604051602001612d839493929190614df6565b60405160208183030381529060405290505b809150509392505050565b60606000604051806020016040528060008152509050600060188460ff161180612ddc575060088460ff16118015612ddb575060108460ff16105b5b15612f0257600090505b6007811015612e7157816030612e13601984612e029190614c6f565b60af612e0e9190614259565b611d77565b6031612e36601986612e259190614c6f565b60af612e319190614259565b611d77565b6032604051602001612e4d96959493929190614160565b60405160208183030381529060405291508080612e699061485f565b915050612de6565b600090505b6006811015612f0157816030612ea3601984612e929190614c6f565b60bb612e9e9190614259565b611d77565b6033612ec6601986612eb59190614c6f565b60bb612ec19190614259565b611d77565b6034604051602001612edd96959493929190614160565b60405160208183030381529060405291508080612ef99061485f565b915050612e76565b5b600f8460ff161115612f3457816025604051602001612f22929190614e34565b60405160208183030381529060405291505b8192505050919050565b606060008260ff1603612f6257604051806020016040528060008152509050613112565b60038260ff161015612fd65760018260ff161115612fa857602a602b602d604051602001612f9293929190614e58565b6040516020818303038152906040529050613112565b602a602c602d604051602001612fc093929190614e58565b6040516020818303038152906040529050613112565b60038260ff1611156130845760058260ff16111561301c57602e602f602960405160200161300693929190614e58565b6040516020818303038152906040529050613112565b60048260ff16111561305657602e602b602960405160200161304093929190614e58565b6040516020818303038152906040529050613112565b602e602c602960405160200161306e93929190614e58565b6040516020818303038152906040529050613112565b601e805461309190613c3d565b80601f01602080910402602001604051908101604052809291908181526020018280546130bd90613c3d565b801561310a5780601f106130df5761010080835404028352916020019161310a565b820191906000526020600020905b8154815290600101906020018083116130ed57829003601f168201915b505050505090505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161317284610c93565b61317c9190614795565b9050600060076000848152602001908152602001600020549050818114613261576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132e69190614795565b90506000600960008481526020019081526020016000205490506000600883815481106133165761331561431f565b5b9060005260206000200154905080600883815481106133385761333761431f565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061338757613386614e89565b5b6001900381819060005260206000200160009055905550505050565b60006133ae83610c93565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348890614f04565b60405180910390fd5b61349a81611374565b156134da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d190614f70565b60405180910390fd5b6134e66000838361292d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135369190614259565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060e00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61369d81613668565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b6000602082840312156136d6576136d561365e565b5b60006136e4848285016136ab565b91505092915050565b60008115159050919050565b613702816136ed565b82525050565b600060208201905061371d60008301846136f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561375d578082015181840152602081019050613742565b60008484015250505050565b6000601f19601f8301169050919050565b600061378582613723565b61378f818561372e565b935061379f81856020860161373f565b6137a881613769565b840191505092915050565b600060208201905081810360008301526137cd818461377a565b905092915050565b6000819050919050565b6137e8816137d5565b81146137f357600080fd5b50565b600081359050613805816137df565b92915050565b6000602082840312156138215761382061365e565b5b600061382f848285016137f6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061386382613838565b9050919050565b61387381613858565b82525050565b600060208201905061388e600083018461386a565b92915050565b61389d81613858565b81146138a857600080fd5b50565b6000813590506138ba81613894565b92915050565b600080604083850312156138d7576138d661365e565b5b60006138e5858286016138ab565b92505060206138f6858286016137f6565b9150509250929050565b613909816137d5565b82525050565b60006020820190506139246000830184613900565b92915050565b6000806000606084860312156139435761394261365e565b5b6000613951868287016138ab565b9350506020613962868287016138ab565b9250506040613973868287016137f6565b9150509250925092565b6000602082840312156139935761399261365e565b5b60006139a1848285016138ab565b91505092915050565b6139b3816136ed565b81146139be57600080fd5b50565b6000813590506139d0816139aa565b92915050565b600080604083850312156139ed576139ec61365e565b5b60006139fb858286016138ab565b9250506020613a0c858286016139c1565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a5882613769565b810181811067ffffffffffffffff82111715613a7757613a76613a20565b5b80604052505050565b6000613a8a613654565b9050613a968282613a4f565b919050565b600067ffffffffffffffff821115613ab657613ab5613a20565b5b613abf82613769565b9050602081019050919050565b82818337600083830152505050565b6000613aee613ae984613a9b565b613a80565b905082815260208101848484011115613b0a57613b09613a1b565b5b613b15848285613acc565b509392505050565b600082601f830112613b3257613b31613a16565b5b8135613b42848260208601613adb565b91505092915050565b60008060008060808587031215613b6557613b6461365e565b5b6000613b73878288016138ab565b9450506020613b84878288016138ab565b9350506040613b95878288016137f6565b925050606085013567ffffffffffffffff811115613bb657613bb5613663565b5b613bc287828801613b1d565b91505092959194509250565b60008060408385031215613be557613be461365e565b5b6000613bf3858286016138ab565b9250506020613c04858286016138ab565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c5557607f821691505b602082108103613c6857613c67613c0e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613cca602c8361372e565b9150613cd582613c6e565b604082019050919050565b60006020820190508181036000830152613cf981613cbd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d5c60218361372e565b9150613d6782613d00565b604082019050919050565b60006020820190508181036000830152613d8b81613d4f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613dee60388361372e565b9150613df982613d92565b604082019050919050565b60006020820190508181036000830152613e1d81613de1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e8060318361372e565b9150613e8b82613e24565b604082019050919050565b60006020820190508181036000830152613eaf81613e73565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613f12602b8361372e565b9150613f1d82613eb6565b604082019050919050565b60006020820190508181036000830152613f4181613f05565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f7e601f8361372e565b9150613f8982613f48565b602082019050919050565b60006020820190508181036000830152613fad81613f71565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fea60208361372e565b9150613ff582613fb4565b602082019050919050565b6000602082019050818103600083015261401981613fdd565b9050919050565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b6000614056600d8361372e565b915061406182614020565b602082019050919050565b6000602082019050818103600083015261408581614049565b9050919050565b600081905092915050565b60006140a282613723565b6140ac818561408c565b93506140bc81856020860161373f565b80840191505092915050565b60008190508160005260206000209050919050565b600081546140ea81613c3d565b6140f4818661408c565b9450600182166000811461410f576001811461412457614157565b60ff1983168652811515820286019350614157565b61412d856140c8565b60005b8381101561414f57815481890152600182019150602081019050614130565b838801955050505b50505092915050565b600061416c8289614097565b915061417882886140dd565b91506141848287614097565b915061419082866140dd565b915061419c8285614097565b91506141a882846140dd565b9150819050979650505050505050565b60006141c4828b614097565b91506141d0828a614097565b91506141dc82896140dd565b91506141e88288614097565b91506141f482876140dd565b91506142008286614097565b915061420c82856140dd565b91506142188284614097565b91508190509998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614264826137d5565b915061426f836137d5565b92508282019050808211156142875761428661422a565b5b92915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142e9602c8361372e565b91506142f48261428d565b604082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143aa60298361372e565b91506143b58261434e565b604082019050919050565b600060208201905081810360008301526143d98161439d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061443c602a8361372e565b9150614447826143e0565b604082019050919050565b6000602082019050818103600083015261446b8161442f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144a860198361372e565b91506144b382614472565b602082019050919050565b600060208201905081810360008301526144d78161449b565b9050919050565b60006144ea82886140dd565b91506144f68287614097565b91506145028286614097565b915061450e8285614097565b915061451a82846140dd565b91508190509695505050505050565b600061453582856140dd565b91506145418284614097565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145a960268361372e565b91506145b48261454d565b604082019050919050565b600060208201905081810360008301526145d88161459c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061463b602c8361372e565b9150614646826145df565b604082019050919050565b6000602082019050818103600083015261466a8161462e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146cd60298361372e565b91506146d882614671565b604082019050919050565b600060208201905081810360008301526146fc816146c0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475f60248361372e565b915061476a82614703565b604082019050919050565b6000602082019050818103600083015261478e81614752565b9050919050565b60006147a0826137d5565b91506147ab836137d5565b92508282039050818111156147c3576147c261422a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614803826137d5565b915061480e836137d5565b92508261481e5761481d6147c9565b5b828206905092915050565b600060ff82169050919050565b600061484182614829565b915060ff82036148545761485361422a565b5b600182019050919050565b600061486a826137d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361489c5761489b61422a565b5b600182019050919050565b60006148b2826137d5565b91506148bd836137d5565b9250826148cd576148cc6147c9565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061493460328361372e565b915061493f826148d8565b604082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b600061497682896140dd565b91506149828288614097565b915061498e82876140dd565b915061499a8286614097565b91506149a682856140dd565b91506149b28284614097565b9150819050979650505050505050565b60006149ce828d614097565b91506149da828c6140dd565b91506149e6828b614097565b91506149f2828a6140dd565b91506149fe8289614097565b9150614a0a82886140dd565b9150614a168287614097565b9150614a2282866140dd565b9150614a2e8285614097565b9150614a3a82846140dd565b91508190509b9a5050505050505050505050565b6000614a5982614829565b9150614a6483614829565b9250828203905060ff811115614a7d57614a7c61422a565b5b92915050565b6000614a8f82886140dd565b9150614a9b82876140dd565b9150614aa782866140dd565b9150614ab382856140dd565b9150614abf82846140dd565b91508190509695505050505050565b6000614ada82886140dd565b9150614ae682876140dd565b9150614af282866140dd565b9150614afe8285614097565b9150614b0a82846140dd565b91508190509695505050505050565b6000614b25828c614097565b9150614b31828b614097565b9150614b3d828a6140dd565b9150614b498289614097565b9150614b5582886140dd565b9150614b618287614097565b9150614b6d82866140dd565b9150614b798285614097565b9150614b8582846140dd565b91508190509a9950505050505050505050565b6000614ba4828c614097565b9150614bb0828b6140dd565b9150614bbc828a6140dd565b9150614bc882896140dd565b9150614bd482886140dd565b9150614be08287614097565b9150614bec82866140dd565b9150614bf882856140dd565b9150614c0482846140dd565b91508190509a9950505050505050505050565b6000614c238289614097565b9150614c2f8288614097565b9150614c3b8287614097565b9150614c478286614097565b9150614c538285614097565b9150614c5f82846140dd565b9150819050979650505050505050565b6000614c7a826137d5565b9150614c85836137d5565b9250828202614c93816137d5565b91508282048414831517614caa57614ca961422a565b5b5092915050565b6000614cbd8284614097565b915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000614cef82614cc8565b614cf98185614cd3565b9350614d0981856020860161373f565b614d1281613769565b840191505092915050565b6000608082019050614d32600083018761386a565b614d3f602083018661386a565b614d4c6040830185613900565b8181036060830152614d5e8184614ce4565b905095945050505050565b600081519050614d7881613694565b92915050565b600060208284031215614d9457614d9361365e565b5b6000614da284828501614d69565b91505092915050565b6000614db782886140dd565b9150614dc38287614097565b9150614dcf82866140dd565b9150614ddb8285614097565b9150614de782846140dd565b91508190509695505050505050565b6000614e028287614097565b9150614e0e82866140dd565b9150614e1a8285614097565b9150614e2682846140dd565b915081905095945050505050565b6000614e408285614097565b9150614e4c82846140dd565b91508190509392505050565b6000614e6482866140dd565b9150614e7082856140dd565b9150614e7c82846140dd565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614eee60208361372e565b9150614ef982614eb8565b602082019050919050565b60006020820190508181036000830152614f1d81614ee1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f5a601c8361372e565b9150614f6582614f24565b602082019050919050565b60006020820190508181036000830152614f8981614f4d565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f0cb6a092535ab7f5c108863939d3554ab36d9b3b3067435be51c7c3459ddb0564736f6c63430008130033227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c222c202261747472696275746573223a205b7b2274726169745f74797065223a20224261636b67726f756e64222c2276616c7565223a2022222f3e3c636972636c652063783d22313930222063793d223437302220723d223522207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22333030222063793d223232302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323030222063793d223231352220723d22333522207374796c653d2266696c6c3a23666666222f3e3c636972636c652063783d22333035222063793d223232322220723d22333122207374796c653d2266696c6c3a23666666222f3e3c636972636c652063783d22323030222063793d223232302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22343030222063793d223235302220723d22353022207374796c653d2266696c6c3a233c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302035303020353030223e3c7265637420783d22302220793d2230222077696474683d2235303022206865696768743d2235303022207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022227d2c7b2274726169745f74797065223a2022467572222c2276616c7565223a2022222f3e3c636972636c652063783d22313030222063793d223239302220723d223422207374796c653d2266696c6c3a23303030222f3e3c726563742077696474683d2233303022206865696768743d223132302220783d2239392220793d2234303022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22313030222063793d223235302220723d22323022207374796c653d2266696c6c3a23222f3e3c726563742077696474683d22353022206865696768743d2235352220783d223238302220793d2234333022207374796c653d2266696c6c3a233c7265637420783d2239352220793d22323735222077696474683d22313022206865696768743d22343022207374796c653d2266696c6c3a23383732222f3e3c7265637420783d2238352220793d22323835222077696474683d22333022206865696768743d22313022207374796c653d2266696c6c3a23383732222f3e3c7265637420783d223135302220793d22313930222077696474683d2232303022206865696768743d22333022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323530222063793d223235302220723d2231353022207374796c653d2266696c6c3a233c6c696e652078313d22323837222079313d22333331222078323d22333230222079323d2233363622207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a35222f3e227d2c7b2274726169745f74797065223a202245796573222c2276616c7565223a2022222f3e3c636972636c652063783d22313030222063793d223235302220723d22353022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22333130222063793d223437302220723d223522207374796c653d2266696c6c3a23222079323d2233323222207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a32222f3e227d2c7b2274726169745f74797065223a2022436c6f74686573222c2276616c7565223a2022222f3e3c636972636c652063783d22323030222063793d223232302220723d223722207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22333030222063793d223232302220723d223722207374796c653d2266696c6c3a23303030222f3e222f3e3c726563742077696474683d2233303022206865696768743d223132302220783d2239392220793d2234303022207374796c653d2266696c6c3a23222f3e3c7265637420783d223139352220793d22333330222077696474683d2231313022206865696768743d223322207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22323638222063793d223239352220723d223522207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22323332222063793d223239352220723d223522207374796c653d2266696c6c3a23303030222f3e3c726563742077696474683d2232303022206865696768743d2239392220783d223135302220793d22343022207374796c653d2266696c6c3a23222f3e3c726563742077696474683d2232303022206865696768743d2233332220783d223135302220793d2231303622207374796c653d2266696c6c3a233c656c6c697073652063783d22323530222063793d22333135222072783d223834222072793d22333422207374796c653d2266696c6c3a233c7265637420783d223136302220793d22313930222077696474683d22373522206865696768743d22313522207374796c653d2266696c6c3a23222f3e3c7265637420783d223136302220793d22313730222077696474683d2231383022206865696768743d22353022207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a2022486174222c2276616c7565223a2022222f3e3c7265637420783d223237352220793d22313930222077696474683d22363522206865696768743d22313522207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a202245617272696e67222c2276616c7565223a2022222079323d2233313222207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a32222f3e222f3e3c636972636c652063783d22343030222063793d223235302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323530222063793d223235302220723d2231323022207374796c653d2266696c6c3a233c636972636c652063783d22313030222063793d223239302220723d22313422207374796c653d2266696c6c3a233c636972636c652063783d22313030222063793d223239302220723d22313222207374796c653d2266696c6c3a233c7265637420783d223136302220793d22323335222077696474683d2231383022206865696768743d22353022207374796c653d2266696c6c3a23

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb465146103c7578063b88d4fde146103e3578063c87b56dd146103ff578063d5abeb011461042f578063e985e9c51461044d578063f2fde38b1461047d57610158565b80636352211e1461030357806370a0823114610333578063715018a6146103635780638da5cb5b1461036d57806395d89b411461038b5780639c2f2a42146103a957610158565b80632f745c59116101155780632f745c591461023157806342842e0e14610261578063434f48c41461027d5780634378a6e3146102995780634e71d92d146102c95780634f6ccce7146102d357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806318160ddd146101f757806323b872dd14610215575b600080fd5b610177600480360381019061017291906136c0565b610499565b6040516101849190613708565b60405180910390f35b610195610513565b6040516101a291906137b3565b60405180910390f35b6101c560048036038101906101c0919061380b565b6105a5565b6040516101d29190613879565b60405180910390f35b6101f560048036038101906101f091906138c0565b61062a565b005b6101ff610741565b60405161020c919061390f565b60405180910390f35b61022f600480360381019061022a919061392a565b61074e565b005b61024b600480360381019061024691906138c0565b6107ae565b604051610258919061390f565b60405180910390f35b61027b6004803603810190610276919061392a565b610853565b005b6102976004803603810190610292919061380b565b610873565b005b6102b360048036038101906102ae919061380b565b6109a9565b6040516102c091906137b3565b60405180910390f35b6102d1610a8c565b005b6102ed60048036038101906102e8919061380b565b610b71565b6040516102fa919061390f565b60405180910390f35b61031d6004803603810190610318919061380b565b610be2565b60405161032a9190613879565b60405180910390f35b61034d6004803603810190610348919061397d565b610c93565b60405161035a919061390f565b60405180910390f35b61036b610d4a565b005b610375610dd2565b6040516103829190613879565b60405180910390f35b610393610dfc565b6040516103a091906137b3565b60405180910390f35b6103b1610e8e565b6040516103be919061390f565b60405180910390f35b6103e160048036038101906103dc91906139d6565b610e94565b005b6103fd60048036038101906103f89190613b4b565b611014565b005b6104196004803603810190610414919061380b565b611076565b60405161042691906137b3565b60405180910390f35b610437611101565b604051610444919061390f565b60405180910390f35b61046760048036038101906104629190613bce565b611107565b6040516104749190613708565b60405180910390f35b6104976004803603810190610492919061397d565b61119b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050c575061050b82611292565b5b9050919050565b60606000805461052290613c3d565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90613c3d565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b082611374565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690613ce0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063582610be2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069c90613d72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c46113e0565b73ffffffffffffffffffffffffffffffffffffffff1614806106f357506106f2816106ed6113e0565b611107565b5b610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990613e04565b60405180910390fd5b61073c83836113e8565b505050565b6000600880549050905090565b61075f6107596113e0565b826114a1565b61079e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079590613e96565b60405180910390fd5b6107a983838361157f565b505050565b60006107b983610c93565b82106107fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f190613f28565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61086e83838360405180602001604052806000815250611014565b505050565b6002600a54036108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90613f94565b60405180910390fd5b6002600a819055506108c86113e0565b73ffffffffffffffffffffffffffffffffffffffff166108e6610dd2565b73ffffffffffffffffffffffffffffffffffffffff161461093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390614000565b60405180910390fd5b61251c8111801561094e575061271181105b61098d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109849061406c565b60405180910390fd5b61099e610998610dd2565b826117da565b6001600a8190555050565b606060006109b6836117f8565b905060006109ca8260c0015160ff16611d77565b60436109dc846020015160ff16611d77565b60436109ee8660a0015160ff16611d77565b6043604051602001610a0596959493929190614160565b604051602081830303815290604052905080610a27836040015160ff16611d77565b6043610a39856080015160ff16611d77565b6043610a4b876060015160ff16611d77565b6043610a5d896000015160ff16611d77565b604051602001610a749897969594939291906141b8565b60405160208183030381529060405292505050919050565b6002600a5403610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613f94565b60405180910390fd5b6002600a819055506000600c5410158015610aef575061251c600c54105b610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b259061406c565b60405180910390fd5b610b4d610b396113e0565b6001600c54610b489190614259565b6117da565b6001600c6000828254610b609190614259565b925050819055506001600a81905550565b6000610b7b610741565b8210610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb3906142ff565b60405180910390fd5b60088281548110610bd057610bcf61431f565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906143c0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa90614452565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d526113e0565b73ffffffffffffffffffffffffffffffffffffffff16610d70610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614000565b60405180910390fd5b610dd06000611ed7565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0b90613c3d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3790613c3d565b8015610e845780601f10610e5957610100808354040283529160200191610e84565b820191906000526020600020905b815481529060010190602001808311610e6757829003601f168201915b5050505050905090565b600c5481565b610e9c6113e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f00906144be565b60405180910390fd5b8060056000610f166113e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc36113e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110089190613708565b60405180910390a35050565b61102561101f6113e0565b836114a1565b611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90613e96565b60405180910390fd5b61107084848484611f9d565b50505050565b60606000611083836117f8565b905060466110d9604461109586611d77565b61109e85611ff9565b6110af6110aa876120d4565b61272c565b60456040516020016110c59594939291906144de565b60405160208183030381529060405261272c565b6040516020016110ea929190614529565b604051602081830303815290604052915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a36113e0565b73ffffffffffffffffffffffffffffffffffffffff166111c1610dd2565b73ffffffffffffffffffffffffffffffffffffffff1614611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614000565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d906145bf565b60405180910390fd5b61128f81611ed7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061135d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061136d575061136c826128c3565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661145b83610be2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114ac82611374565b6114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290614651565b60405180910390fd5b60006114f683610be2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061156557508373ffffffffffffffffffffffffffffffffffffffff1661154d846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061157657506115758185611107565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661159f82610be2565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906146e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90614775565b60405180910390fd5b61166f83838361292d565b61167a6000826113e8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116ca9190614795565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117219190614259565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6117f4828260405180602001604052806000815250612a3f565b5050565b611800613602565b8161322761180e9190614795565b9150611818613602565b600861184d603d61182886611d77565b604051602001611839929190614529565b604051602081830303815290604052612a9a565b61185791906147f8565b816000019060ff16908160ff168152505061192760108054806020026020016040519081016040528092919081815260200182805480156118dd57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116118a65790505b5050505050610719611918601f6118f388611d77565b604051602001611904929190614529565b604051602081830303815290604052612a9a565b61192291906147f8565b612acd565b816020019060ff16908160ff16815250506119f760128054806020026020016040519081016040528092919081815260200182805480156119ad57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116119765790505b50505050506105956119e8603e6119c388611d77565b6040516020016119d4929190614529565b604051602081830303815290604052612a9a565b6119f291906147f8565b612acd565b816040019060ff16908160ff1681525050611ac76014805480602002602001604051908101604052809291908181526020018280548015611a7d57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a465790505b5050505050610458611ab8603f611a9388611d77565b604051602001611aa4929190614529565b604051602081830303815290604052612a9a565b611ac291906147f8565b612acd565b816060019060ff16908160ff1681525050611b976016805480602002602001604051908101604052809291908181526020018280548015611b4d57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611b165790505b5050505050610166611b886040611b6388611d77565b604051602001611b74929190614529565b604051602081830303815290604052612a9a565b611b9291906147f8565b612acd565b816080019060ff16908160ff1681525050611c676019805480602002602001604051908101604052809291908181526020018280548015611c1d57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611be65790505b5050505050610531611c586041611c3388611d77565b604051602001611c44929190614529565b604051602081830303815290604052612a9a565b611c6291906147f8565b612acd565b8160a0019060ff16908160ff1681525050611d37601c805480602002602001604051908101604052809291908181526020018280548015611ced57602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611cb65790505b5050505050610457611d286042611d0388611d77565b604051602001611d14929190614529565b604051602081830303815290604052612a9a565b611d3291906147f8565b612acd565b8160c0019060ff16908160ff1681525050611ceb8303611d6e578060c0018051809190611d6390614836565b60ff1660ff16815250505b80915050919050565b606060008203611dbe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ed2565b600082905060005b60008214611df0578080611dd99061485f565b915050600a82611de991906148a7565b9150611dc6565b60008167ffffffffffffffff811115611e0c57611e0b613a20565b5b6040519080825280601f01601f191660200182016040528015611e3e5781602001600182028036833780820191505090505b5090505b60008514611ecb57600182611e579190614795565b9150600a85611e6691906147f8565b6030611e729190614259565b60f81b818381518110611e8857611e8761431f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ec491906148a7565b9450611e42565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa884848461157f565b611fb484848484612b4b565b611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea9061494a565b60405180910390fd5b50505050565b60606000603561200f846000015160ff16611d77565b6036612021866020015160ff16611d77565b6037612033886080015160ff16611d77565b6040516020016120489695949392919061496a565b604051602081830303815290604052905080603861206c8560c0015160ff16611d77565b603961207e876040015160ff16611d77565b603a6120908960a0015160ff16611d77565b603b6120a28b6060015160ff16611d77565b603c6040516020016120bd9a999897969594939291906149c2565b604051602081830303815290604052915050919050565b60606000600e836020015160ff16815481106120f3576120f261431f565b5b90600052602060002001805461210890613c3d565b80601f016020809104026020016040519081016040528092919081815260200182805461213490613c3d565b80156121815780601f1061215657610100808354040283529160200191612181565b820191906000526020600020905b81548152906001019060200180831161216457829003601f168201915b505050505090506000600f846020015160ff16815481106121a5576121a461431f565b5b9060005260206000200180546121ba90613c3d565b80601f01602080910402602001604051908101604052809291908181526020018280546121e690613c3d565b80156122335780601f1061220857610100808354040283529160200191612233565b820191906000526020600020905b81548152906001019060200180831161221657829003601f168201915b505050505090506000604051806020016040528060008152509050600060405180602001604052806000815250905060008660a0015160ff16111561230057601f601760018860a001516122879190614a4e565b60ff168154811061229b5761229a61431f565b5b906000526020600020016020601860018a60a001516122ba9190614a4e565b60ff16815481106122ce576122cd61431f565b5b9060005260206000200160296040516020016122ee959493929190614a83565b60405160208183030381529060405290505b60008660c0015160ff16111561239e576021601a60018860c001516123259190614a4e565b60ff16815481106123395761233861431f565b5b906000526020600020016022601b60018a60c001516123589190614a4e565b60ff168154811061236c5761236b61431f565b5b90600052602060002001602960405160200161238c959493929190614a83565b60405160208183030381529060405291505b6000601d6000815481106123b5576123b461431f565b5b90600052602060002001600d886000015160ff16815481106123da576123d961431f565b5b90600052602060002001601d6001815481106123f9576123f861431f565b5b9060005260206000200186601d6002815481106124195761241861431f565b5b90600052602060002001604051602001612437959493929190614ace565b60405160208183030381529060405290508085601d60038154811061245f5761245e61431f565b5b9060005260206000200187601d60048154811061247f5761247e61431f565b5b9060005260206000200188601d60058154811061249f5761249e61431f565b5b906000526020600020018b601d6006815481106124bf576124be61431f565b5b906000526020600020016040516020016124e199989796959493929190614b19565b60405160208183030381529060405290508084601d6007815481106125095761250861431f565b5b9060005260206000200187601d6008815481106125295761252861431f565b5b9060005260206000200188601d6009815481106125495761254861431f565b5b906000526020600020018b601d600a815481106125695761256861431f565b5b9060005260206000200160405160200161258b99989796959493929190614b19565b6040516020818303038152906040529050806011886040015160ff16815481106125b8576125b761431f565b5b90600052602060002001601d600b815481106125d7576125d661431f565b5b9060005260206000200160118a6040015160ff16815481106125fc576125fb61431f565b5b90600052602060002001601d600c8154811061261b5761261a61431f565b5b906000526020600020016126348a8a8e60400151612cd2565b601d600d815481106126495761264861431f565b5b9060005260206000200160138e6060015160ff168154811061266e5761266d61431f565b5b90600052602060002001601d600e8154811061268d5761268c61431f565b5b906000526020600020016040516020016126af99989796959493929190614b98565b6040516020818303038152906040529050806126ce8860600151612da0565b6126db8960800151612f3e565b8585601d600f815481106126f2576126f161431f565b5b9060005260206000200160405160200161271196959493929190614c17565b60405160208183030381529060405295505050505050919050565b60606000825190506000810361275457604051806020016040528060008152509150506128be565b600060036002836127659190614259565b61276f91906148a7565b600461277b9190614c6f565b9050600060208261278c9190614259565b67ffffffffffffffff8111156127a5576127a4613a20565b5b6040519080825280601f01601f1916602001820160405280156127d75781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614f91604091399050600181016020830160005b8681101561287b5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612802565b50600386066001811461289557600281146128a5576128b0565b613d3d60f01b60028303526128b0565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612938838383613117565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361297a576129758161311c565b6129b9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129b8576129b78382613165565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129fb576129f6816132d2565b612a3a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a3957612a3882826133a3565b5b5b505050565b612a498383613422565b612a566000848484612b4b565b612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c9061494a565b60405180910390fd5b505050565b600081604051602001612aad9190614cb1565b6040516020818303038152906040528051906020012060001c9050919050565b60008060009050600084600081518110612aea57612ae961431f565b5b602002602001015160ff1690505b838111612b40578180612b0a90614836565b925050848260ff1681518110612b2357612b2261431f565b5b602002602001015160ff1681612b399190614259565b9050612af8565b819250505092915050565b6000612b6c8473ffffffffffffffffffffffffffffffffffffffff166135ef565b15612cc5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b956113e0565b8786866040518563ffffffff1660e01b8152600401612bb79493929190614d1d565b6020604051808303816000875af1925050508015612bf357506040513d601f19601f82011682018060405250810190612bf09190614d7e565b60015b612c75573d8060008114612c23576040519150601f19603f3d011682016040523d82523d6000602084013e612c28565b606091505b506000815103612c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c649061494a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cca565b600190505b949350505050565b6060600060405180602001604052806000815250905060048360ff161115612d22576023856024876029604051602001612d10959493929190614dab565b60405160208183030381529060405290505b600a8360ff161115612d5e57806026856027876029604051602001612d4c96959493929190614160565b60405160208183030381529060405290505b60108360ff161115612d9557806028866029604051602001612d839493929190614df6565b60405160208183030381529060405290505b809150509392505050565b60606000604051806020016040528060008152509050600060188460ff161180612ddc575060088460ff16118015612ddb575060108460ff16105b5b15612f0257600090505b6007811015612e7157816030612e13601984612e029190614c6f565b60af612e0e9190614259565b611d77565b6031612e36601986612e259190614c6f565b60af612e319190614259565b611d77565b6032604051602001612e4d96959493929190614160565b60405160208183030381529060405291508080612e699061485f565b915050612de6565b600090505b6006811015612f0157816030612ea3601984612e929190614c6f565b60bb612e9e9190614259565b611d77565b6033612ec6601986612eb59190614c6f565b60bb612ec19190614259565b611d77565b6034604051602001612edd96959493929190614160565b60405160208183030381529060405291508080612ef99061485f565b915050612e76565b5b600f8460ff161115612f3457816025604051602001612f22929190614e34565b60405160208183030381529060405291505b8192505050919050565b606060008260ff1603612f6257604051806020016040528060008152509050613112565b60038260ff161015612fd65760018260ff161115612fa857602a602b602d604051602001612f9293929190614e58565b6040516020818303038152906040529050613112565b602a602c602d604051602001612fc093929190614e58565b6040516020818303038152906040529050613112565b60038260ff1611156130845760058260ff16111561301c57602e602f602960405160200161300693929190614e58565b6040516020818303038152906040529050613112565b60048260ff16111561305657602e602b602960405160200161304093929190614e58565b6040516020818303038152906040529050613112565b602e602c602960405160200161306e93929190614e58565b6040516020818303038152906040529050613112565b601e805461309190613c3d565b80601f01602080910402602001604051908101604052809291908181526020018280546130bd90613c3d565b801561310a5780601f106130df5761010080835404028352916020019161310a565b820191906000526020600020905b8154815290600101906020018083116130ed57829003601f168201915b505050505090505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161317284610c93565b61317c9190614795565b9050600060076000848152602001908152602001600020549050818114613261576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132e69190614795565b90506000600960008481526020019081526020016000205490506000600883815481106133165761331561431f565b5b9060005260206000200154905080600883815481106133385761333761431f565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061338757613386614e89565b5b6001900381819060005260206000200160009055905550505050565b60006133ae83610c93565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348890614f04565b60405180910390fd5b61349a81611374565b156134da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d190614f70565b60405180910390fd5b6134e66000838361292d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135369190614259565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060e00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61369d81613668565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b6000602082840312156136d6576136d561365e565b5b60006136e4848285016136ab565b91505092915050565b60008115159050919050565b613702816136ed565b82525050565b600060208201905061371d60008301846136f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561375d578082015181840152602081019050613742565b60008484015250505050565b6000601f19601f8301169050919050565b600061378582613723565b61378f818561372e565b935061379f81856020860161373f565b6137a881613769565b840191505092915050565b600060208201905081810360008301526137cd818461377a565b905092915050565b6000819050919050565b6137e8816137d5565b81146137f357600080fd5b50565b600081359050613805816137df565b92915050565b6000602082840312156138215761382061365e565b5b600061382f848285016137f6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061386382613838565b9050919050565b61387381613858565b82525050565b600060208201905061388e600083018461386a565b92915050565b61389d81613858565b81146138a857600080fd5b50565b6000813590506138ba81613894565b92915050565b600080604083850312156138d7576138d661365e565b5b60006138e5858286016138ab565b92505060206138f6858286016137f6565b9150509250929050565b613909816137d5565b82525050565b60006020820190506139246000830184613900565b92915050565b6000806000606084860312156139435761394261365e565b5b6000613951868287016138ab565b9350506020613962868287016138ab565b9250506040613973868287016137f6565b9150509250925092565b6000602082840312156139935761399261365e565b5b60006139a1848285016138ab565b91505092915050565b6139b3816136ed565b81146139be57600080fd5b50565b6000813590506139d0816139aa565b92915050565b600080604083850312156139ed576139ec61365e565b5b60006139fb858286016138ab565b9250506020613a0c858286016139c1565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a5882613769565b810181811067ffffffffffffffff82111715613a7757613a76613a20565b5b80604052505050565b6000613a8a613654565b9050613a968282613a4f565b919050565b600067ffffffffffffffff821115613ab657613ab5613a20565b5b613abf82613769565b9050602081019050919050565b82818337600083830152505050565b6000613aee613ae984613a9b565b613a80565b905082815260208101848484011115613b0a57613b09613a1b565b5b613b15848285613acc565b509392505050565b600082601f830112613b3257613b31613a16565b5b8135613b42848260208601613adb565b91505092915050565b60008060008060808587031215613b6557613b6461365e565b5b6000613b73878288016138ab565b9450506020613b84878288016138ab565b9350506040613b95878288016137f6565b925050606085013567ffffffffffffffff811115613bb657613bb5613663565b5b613bc287828801613b1d565b91505092959194509250565b60008060408385031215613be557613be461365e565b5b6000613bf3858286016138ab565b9250506020613c04858286016138ab565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c5557607f821691505b602082108103613c6857613c67613c0e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613cca602c8361372e565b9150613cd582613c6e565b604082019050919050565b60006020820190508181036000830152613cf981613cbd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d5c60218361372e565b9150613d6782613d00565b604082019050919050565b60006020820190508181036000830152613d8b81613d4f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613dee60388361372e565b9150613df982613d92565b604082019050919050565b60006020820190508181036000830152613e1d81613de1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e8060318361372e565b9150613e8b82613e24565b604082019050919050565b60006020820190508181036000830152613eaf81613e73565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613f12602b8361372e565b9150613f1d82613eb6565b604082019050919050565b60006020820190508181036000830152613f4181613f05565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f7e601f8361372e565b9150613f8982613f48565b602082019050919050565b60006020820190508181036000830152613fad81613f71565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fea60208361372e565b9150613ff582613fb4565b602082019050919050565b6000602082019050818103600083015261401981613fdd565b9050919050565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b6000614056600d8361372e565b915061406182614020565b602082019050919050565b6000602082019050818103600083015261408581614049565b9050919050565b600081905092915050565b60006140a282613723565b6140ac818561408c565b93506140bc81856020860161373f565b80840191505092915050565b60008190508160005260206000209050919050565b600081546140ea81613c3d565b6140f4818661408c565b9450600182166000811461410f576001811461412457614157565b60ff1983168652811515820286019350614157565b61412d856140c8565b60005b8381101561414f57815481890152600182019150602081019050614130565b838801955050505b50505092915050565b600061416c8289614097565b915061417882886140dd565b91506141848287614097565b915061419082866140dd565b915061419c8285614097565b91506141a882846140dd565b9150819050979650505050505050565b60006141c4828b614097565b91506141d0828a614097565b91506141dc82896140dd565b91506141e88288614097565b91506141f482876140dd565b91506142008286614097565b915061420c82856140dd565b91506142188284614097565b91508190509998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614264826137d5565b915061426f836137d5565b92508282019050808211156142875761428661422a565b5b92915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142e9602c8361372e565b91506142f48261428d565b604082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143aa60298361372e565b91506143b58261434e565b604082019050919050565b600060208201905081810360008301526143d98161439d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061443c602a8361372e565b9150614447826143e0565b604082019050919050565b6000602082019050818103600083015261446b8161442f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144a860198361372e565b91506144b382614472565b602082019050919050565b600060208201905081810360008301526144d78161449b565b9050919050565b60006144ea82886140dd565b91506144f68287614097565b91506145028286614097565b915061450e8285614097565b915061451a82846140dd565b91508190509695505050505050565b600061453582856140dd565b91506145418284614097565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145a960268361372e565b91506145b48261454d565b604082019050919050565b600060208201905081810360008301526145d88161459c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061463b602c8361372e565b9150614646826145df565b604082019050919050565b6000602082019050818103600083015261466a8161462e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146cd60298361372e565b91506146d882614671565b604082019050919050565b600060208201905081810360008301526146fc816146c0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475f60248361372e565b915061476a82614703565b604082019050919050565b6000602082019050818103600083015261478e81614752565b9050919050565b60006147a0826137d5565b91506147ab836137d5565b92508282039050818111156147c3576147c261422a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614803826137d5565b915061480e836137d5565b92508261481e5761481d6147c9565b5b828206905092915050565b600060ff82169050919050565b600061484182614829565b915060ff82036148545761485361422a565b5b600182019050919050565b600061486a826137d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361489c5761489b61422a565b5b600182019050919050565b60006148b2826137d5565b91506148bd836137d5565b9250826148cd576148cc6147c9565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061493460328361372e565b915061493f826148d8565b604082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b600061497682896140dd565b91506149828288614097565b915061498e82876140dd565b915061499a8286614097565b91506149a682856140dd565b91506149b28284614097565b9150819050979650505050505050565b60006149ce828d614097565b91506149da828c6140dd565b91506149e6828b614097565b91506149f2828a6140dd565b91506149fe8289614097565b9150614a0a82886140dd565b9150614a168287614097565b9150614a2282866140dd565b9150614a2e8285614097565b9150614a3a82846140dd565b91508190509b9a5050505050505050505050565b6000614a5982614829565b9150614a6483614829565b9250828203905060ff811115614a7d57614a7c61422a565b5b92915050565b6000614a8f82886140dd565b9150614a9b82876140dd565b9150614aa782866140dd565b9150614ab382856140dd565b9150614abf82846140dd565b91508190509695505050505050565b6000614ada82886140dd565b9150614ae682876140dd565b9150614af282866140dd565b9150614afe8285614097565b9150614b0a82846140dd565b91508190509695505050505050565b6000614b25828c614097565b9150614b31828b614097565b9150614b3d828a6140dd565b9150614b498289614097565b9150614b5582886140dd565b9150614b618287614097565b9150614b6d82866140dd565b9150614b798285614097565b9150614b8582846140dd565b91508190509a9950505050505050505050565b6000614ba4828c614097565b9150614bb0828b6140dd565b9150614bbc828a6140dd565b9150614bc882896140dd565b9150614bd482886140dd565b9150614be08287614097565b9150614bec82866140dd565b9150614bf882856140dd565b9150614c0482846140dd565b91508190509a9950505050505050505050565b6000614c238289614097565b9150614c2f8288614097565b9150614c3b8287614097565b9150614c478286614097565b9150614c538285614097565b9150614c5f82846140dd565b9150819050979650505050505050565b6000614c7a826137d5565b9150614c85836137d5565b9250828202614c93816137d5565b91508282048414831517614caa57614ca961422a565b5b5092915050565b6000614cbd8284614097565b915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000614cef82614cc8565b614cf98185614cd3565b9350614d0981856020860161373f565b614d1281613769565b840191505092915050565b6000608082019050614d32600083018761386a565b614d3f602083018661386a565b614d4c6040830185613900565b8181036060830152614d5e8184614ce4565b905095945050505050565b600081519050614d7881613694565b92915050565b600060208284031215614d9457614d9361365e565b5b6000614da284828501614d69565b91505092915050565b6000614db782886140dd565b9150614dc38287614097565b9150614dcf82866140dd565b9150614ddb8285614097565b9150614de782846140dd565b91508190509695505050505050565b6000614e028287614097565b9150614e0e82866140dd565b9150614e1a8285614097565b9150614e2682846140dd565b915081905095945050505050565b6000614e408285614097565b9150614e4c82846140dd565b91508190509392505050565b6000614e6482866140dd565b9150614e7082856140dd565b9150614e7c82846140dd565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614eee60208361372e565b9150614ef982614eb8565b602082019050919050565b60006020820190508181036000830152614f1d81614ee1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f5a601c8361372e565b9150614f6582614f24565b602082019050919050565b60006020820190508181036000830152614f8981614f4d565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f0cb6a092535ab7f5c108863939d3554ab36d9b3b3067435be51c7c3459ddb0564736f6c63430008130033

Deployed Bytecode Sourcemap

47169:12443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40991:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28119:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29678:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29201:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41631:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30568:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41299:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30978:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59370:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56056:443;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59180:180;;;:::i;:::-;;41821:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27813:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27543:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12583:94;;;:::i;:::-;;11932:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28288:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47318:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29971:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31234:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58879:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47272:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30337:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12832:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40991:224;41093:4;41132:35;41117:50;;;:11;:50;;;;:90;;;;41171:36;41195:11;41171:23;:36::i;:::-;41117:90;41110:97;;40991:224;;;:::o;28119:100::-;28173:13;28206:5;28199:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28119:100;:::o;29678:221::-;29754:7;29782:16;29790:7;29782;:16::i;:::-;29774:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29867:15;:24;29883:7;29867:24;;;;;;;;;;;;;;;;;;;;;29860:31;;29678:221;;;:::o;29201:411::-;29282:13;29298:23;29313:7;29298:14;:23::i;:::-;29282:39;;29346:5;29340:11;;:2;:11;;;29332:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29440:5;29424:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29449:37;29466:5;29473:12;:10;:12::i;:::-;29449:16;:37::i;:::-;29424:62;29402:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29583:21;29592:2;29596:7;29583:8;:21::i;:::-;29271:341;29201:411;;:::o;41631:113::-;41692:7;41719:10;:17;;;;41712:24;;41631:113;:::o;30568:339::-;30763:41;30782:12;:10;:12::i;:::-;30796:7;30763:18;:41::i;:::-;30755:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30871:28;30881:4;30887:2;30891:7;30871:9;:28::i;:::-;30568:339;;;:::o;41299:256::-;41396:7;41432:23;41449:5;41432:16;:23::i;:::-;41424:5;:31;41416:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41521:12;:19;41534:5;41521:19;;;;;;;;;;;;;;;:26;41541:5;41521:26;;;;;;;;;;;;41514:33;;41299:256;;;;:::o;30978:185::-;31116:39;31133:4;31139:2;31143:7;31116:39;;;;;;;;;;;;:16;:39::i;:::-;30978:185;;;:::o;59370:173::-;14863:1;15459:7;;:19;15451:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14863:1;15592:7;:18;;;;12163:12:::1;:10;:12::i;:::-;12152:23;;:7;:5;:7::i;:::-;:23;;;12144:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59462:4:::2;59452:7;:14;:33;;;;;59480:5;59470:7;:15;59452:33;59444:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59510:27;59520:7;:5;:7::i;:::-;59529;59510:9;:27::i;:::-;14819:1:::0;15771:7;:22;;;;59370:173;:::o;56056:443::-;56117:13;56139:14;56156:18;56166:7;56156:9;:18::i;:::-;56139:35;;56181:15;56221:27;56229:3;:7;;;56221:16;;:25;:27::i;:::-;56249:3;56253:27;56261:3;:7;;;56253:16;;:25;:27::i;:::-;56281:3;56285:31;56293:3;:11;;;56285:20;;:29;:31::i;:::-;56317:3;56204:117;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56181:141;;56360:1;56362:28;56370:3;:8;;;56362:17;;:26;:28::i;:::-;56391:3;56395:31;56403:3;:11;;;56395:20;;:29;:31::i;:::-;56427:3;56431:29;56439:3;:9;;;56431:18;;:27;:29::i;:::-;56461:3;56465:26;56473:3;:6;;;56465:15;;:24;:26::i;:::-;56343:149;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56329:164;;;;56056:443;;;:::o;59180:180::-;14863:1;15459:7;;:19;15451:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14863:1;15592:7;:18;;;;59246:1:::1;59232:10;;:15;;:36;;;;;59264:4;59251:10;;:17;59232:36;59224:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59293:39;59303:12;:10;:12::i;:::-;59330:1;59317:10;;:14;;;;:::i;:::-;59293:9;:39::i;:::-;59353:1;59339:10;;:15;;;;;;;:::i;:::-;;;;;;;;14819:1:::0;15771:7;:22;;;;59180:180::o;41821:233::-;41896:7;41932:30;:28;:30::i;:::-;41924:5;:38;41916:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;42029:10;42040:5;42029:17;;;;;;;;:::i;:::-;;;;;;;;;;42022:24;;41821:233;;;:::o;27813:239::-;27885:7;27905:13;27921:7;:16;27929:7;27921:16;;;;;;;;;;;;;;;;;;;;;27905:32;;27973:1;27956:19;;:5;:19;;;27948:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28039:5;28032:12;;;27813:239;;;:::o;27543:208::-;27615:7;27660:1;27643:19;;:5;:19;;;27635:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27727:9;:16;27737:5;27727:16;;;;;;;;;;;;;;;;27720:23;;27543:208;;;:::o;12583:94::-;12163:12;:10;:12::i;:::-;12152:23;;:7;:5;:7::i;:::-;:23;;;12144:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12648:21:::1;12666:1;12648:9;:21::i;:::-;12583:94::o:0;11932:87::-;11978:7;12005:6;;;;;;;;;;;11998:13;;11932:87;:::o;28288:104::-;28344:13;28377:7;28370:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28288:104;:::o;47318:29::-;;;;:::o;29971:295::-;30086:12;:10;:12::i;:::-;30074:24;;:8;:24;;;30066:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30186:8;30141:18;:32;30160:12;:10;:12::i;:::-;30141:32;;;;;;;;;;;;;;;:42;30174:8;30141:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30239:8;30210:48;;30225:12;:10;:12::i;:::-;30210:48;;;30249:8;30210:48;;;;;;:::i;:::-;;;;;;;;29971:295;;:::o;31234:328::-;31409:41;31428:12;:10;:12::i;:::-;31442:7;31409:18;:41::i;:::-;31401:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31515:39;31529:4;31535:2;31539:7;31548:5;31515:13;:39::i;:::-;31234:328;;;;:::o;58879:295::-;58944:13;58966:14;58983:18;58993:7;58983:9;:18::i;:::-;58966:35;;59039:3;59043:123;59087:3;59091:18;:7;:16;:18::i;:::-;59110:14;59120:3;59110:9;:14::i;:::-;59125:33;59145:11;59152:3;59145:6;:11::i;:::-;59125:13;:33::i;:::-;59159:3;59070:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59043:13;:123::i;:::-;59022:145;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59008:160;;;58879:295;;;:::o;47272:41::-;47308:5;47272:41;:::o;30337:164::-;30434:4;30458:18;:25;30477:5;30458:25;;;;;;;;;;;;;;;:35;30484:8;30458:35;;;;;;;;;;;;;;;;;;;;;;;;;30451:42;;30337:164;;;;:::o;12832:192::-;12163:12;:10;:12::i;:::-;12152:23;;:7;:5;:7::i;:::-;:23;;;12144:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12941:1:::1;12921:22;;:8;:22;;::::0;12913:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;12997:19;13007:8;12997:9;:19::i;:::-;12832:192:::0;:::o;27174:305::-;27276:4;27328:25;27313:40;;;:11;:40;;;;:105;;;;27385:33;27370:48;;;:11;:48;;;;27313:105;:158;;;;27435:36;27459:11;27435:23;:36::i;:::-;27313:158;27293:178;;27174:305;;;:::o;33072:127::-;33137:4;33189:1;33161:30;;:7;:16;33169:7;33161:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33154:37;;33072:127;;;:::o;10808:98::-;10861:7;10888:10;10881:17;;10808:98;:::o;37054:174::-;37156:2;37129:15;:24;37145:7;37129:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37212:7;37208:2;37174:46;;37183:23;37198:7;37183:14;:23::i;:::-;37174:46;;;;;;;;;;;;37054:174;;:::o;33366:348::-;33459:4;33484:16;33492:7;33484;:16::i;:::-;33476:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33560:13;33576:23;33591:7;33576:14;:23::i;:::-;33560:39;;33629:5;33618:16;;:7;:16;;;:51;;;;33662:7;33638:31;;:20;33650:7;33638:11;:20::i;:::-;:31;;;33618:51;:87;;;;33673:32;33690:5;33697:7;33673:16;:32::i;:::-;33618:87;33610:96;;;33366:348;;;;:::o;36358:578::-;36517:4;36490:31;;:23;36505:7;36490:14;:23::i;:::-;:31;;;36482:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36600:1;36586:16;;:2;:16;;;36578:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36656:39;36677:4;36683:2;36687:7;36656:20;:39::i;:::-;36760:29;36777:1;36781:7;36760:8;:29::i;:::-;36821:1;36802:9;:15;36812:4;36802:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36850:1;36833:9;:13;36843:2;36833:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36881:2;36862:7;:16;36870:7;36862:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36920:7;36916:2;36901:27;;36910:4;36901:27;;;;;;;;;;;;36358:578;;;:::o;34056:110::-;34132:26;34142:2;34146:7;34132:26;;;;;;;;;;;;:9;:26::i;:::-;34056:110;;:::o;54605:870::-;54664:10;;:::i;:::-;54697:7;54691:5;:13;;;;:::i;:::-;54683:21;;54726:14;;:::i;:::-;54821:1;54762:56;54793:3;54797:18;:7;:16;:18::i;:::-;54776:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54762:6;:56::i;:::-;:60;;;;:::i;:::-;54747:3;:6;;:76;;;;;;;;;;;54840:74;54845:5;54840:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54909:4;54851:57;54882:4;54887:18;:7;:16;:18::i;:::-;54865:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54851:6;:57::i;:::-;:62;;;;:::i;:::-;54840:4;:74::i;:::-;54830:3;:7;;:84;;;;;;;;;;;54932:74;54937:6;54932:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55001:4;54944:56;54975:3;54979:18;:7;:16;:18::i;:::-;54958:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54944:6;:56::i;:::-;:61;;;;:::i;:::-;54932:4;:74::i;:::-;54921:3;:8;;:85;;;;;;;;;;;55025:75;55030:7;55025:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55095:4;55038:56;55069:3;55073:18;:7;:16;:18::i;:::-;55052:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55038:6;:56::i;:::-;:61;;;;:::i;:::-;55025:4;:75::i;:::-;55013:3;:9;;:87;;;;;;;;;;;55121:76;55126:9;55121:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55193:3;55136:56;55167:3;55171:18;:7;:16;:18::i;:::-;55150:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55136:6;:56::i;:::-;:60;;;;:::i;:::-;55121:4;:76::i;:::-;55107:3;:11;;:90;;;;;;;;;;;55218:77;55223:9;55218:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55290:4;55233:56;55264:3;55268:18;:7;:16;:18::i;:::-;55247:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55233:6;:56::i;:::-;:61;;;;:::i;:::-;55218:4;:77::i;:::-;55204:3;:11;;:91;;;;;;;;;;;55312:73;55317:5;55312:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55380:4;55323:56;55354:3;55358:18;:7;:16;:18::i;:::-;55337:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55323:6;:56::i;:::-;:61;;;;:::i;:::-;55312:4;:73::i;:::-;55302:3;:7;;:83;;;;;;;;;;;55405:4;55396:7;:13;55392:61;;55420:3;:7;;:9;;;;;;;;:::i;:::-;;;;;;;;;55392:61;55466:3;55459:10;;;54605:870;;;:::o;8510:723::-;8566:13;8796:1;8787:5;:10;8783:53;;8814:10;;;;;;;;;;;;;;;;;;;;;8783:53;8846:12;8861:5;8846:20;;8877:14;8902:78;8917:1;8909:4;:9;8902:78;;8935:8;;;;;:::i;:::-;;;;8966:2;8958:10;;;;;:::i;:::-;;;8902:78;;;8990:19;9022:6;9012:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:39;;9040:154;9056:1;9047:5;:10;9040:154;;9084:1;9074:11;;;;;:::i;:::-;;;9151:2;9143:5;:10;;;;:::i;:::-;9130:2;:24;;;;:::i;:::-;9117:39;;9100:6;9107;9100:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9180:2;9171:11;;;;;:::i;:::-;;;9040:154;;;9218:6;9204:21;;;;;8510:723;;;;:::o;13032:173::-;13088:16;13107:6;;;;;;;;;;;13088:25;;13133:8;13124:6;;:17;;;;;;;;;;;;;;;;;;13188:8;13157:40;;13178:8;13157:40;;;;;;;;;;;;13077:128;13032:173;:::o;32444:315::-;32601:28;32611:4;32617:2;32621:7;32601:9;:28::i;:::-;32648:48;32671:4;32677:2;32681:7;32690:5;32648:22;:48::i;:::-;32640:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32444:315;;;;:::o;55546:406::-;55604:13;55626:15;55666:3;55670:26;55678:3;:6;;;55670:15;;:24;:26::i;:::-;55697:3;55701:27;55709:3;:7;;;55701:16;;:25;:27::i;:::-;55729:3;55733:31;55741:3;:11;;;55733:20;;:29;:31::i;:::-;55649:116;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55626:140;;55804:1;55806:3;55810:27;55818:3;:7;;;55810:16;;:25;:27::i;:::-;55838:3;55842:28;55850:3;:8;;;55842:17;;:26;:28::i;:::-;55871:3;55875:31;55883:3;:11;;;55875:20;;:29;:31::i;:::-;55907:3;55911:29;55919:3;:9;;;55911:18;;:27;:29::i;:::-;55941:3;55787:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55773:173;;;55546:406;;;:::o;57929:944::-;57984:13;58006:15;58022:4;58027:3;:7;;;58022:13;;;;;;;;;;:::i;:::-;;;;;;;;;58006:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58042:15;58058:4;58063:3;:7;;;58058:13;;;;;;;;;;:::i;:::-;;;;;;;;;58042:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58078:19;:22;;;;;;;;;;;;;;58107:19;:22;;;;;;;;;;;;;;58152:1;58140:3;:11;;;:13;;;58136:128;;;58194:4;58199:8;58220:1;58208:3;:11;;;:13;;;;:::i;:::-;58199:23;;;;;;;;;;:::i;:::-;;;;;;;;;58223:4;58228:8;58249:1;58237:3;:11;;;:13;;;;:::i;:::-;58228:23;;;;;;;;;;:::i;:::-;;;;;;;;;58252:2;58177:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58164:92;;58136:128;58282:1;58274:3;:7;;;:9;;;58270:106;;;58324:3;58328:4;58341:1;58333:3;:7;;;:9;;;;:::i;:::-;58328:15;;;;;;;;;;:::i;:::-;;;;;;;;;58344:3;58348:4;58361:1;58353:3;:7;;;:9;;;;:::i;:::-;58348:15;;;;;;;;;;:::i;:::-;;;;;;;;;58364:2;58307:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58294:74;;58270:106;58382:20;58429:1;58431;58429:4;;;;;;;;:::i;:::-;;;;;;;;;58434:10;58445:3;:6;;;58434:18;;;;;;;;;;:::i;:::-;;;;;;;;;58453:1;58455;58453:4;;;;;;;;:::i;:::-;;;;;;;;;58458:1;58460;58462;58460:4;;;;;;;;:::i;:::-;;;;;;;;;58412:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58382:84;;58506:6;58513:1;58515;58517;58515:4;;;;;;;;:::i;:::-;;;;;;;;;58520:1;58522;58524;58522:4;;;;;;;;:::i;:::-;;;;;;;;;58527:1;58529;58531;58529:4;;;;;;;;:::i;:::-;;;;;;;;;58534:1;58536;58538;58536:4;;;;;;;;:::i;:::-;;;;;;;;;58489:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58473:69;;58582:6;58589:1;58591;58593;58591:4;;;;;;;;:::i;:::-;;;;;;;;;58596:1;58598;58600;58598:4;;;;;;;;:::i;:::-;;;;;;;;;58603:1;58605;58607;58605:4;;;;;;;;:::i;:::-;;;;;;;;;58610:1;58612;58614:2;58612:5;;;;;;;;:::i;:::-;;;;;;;;;58565:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58549:70;;58659:6;58666:4;58671:3;:8;;;58666:14;;;;;;;;;;:::i;:::-;;;;;;;;;58681:1;58683:2;58681:5;;;;;;;;:::i;:::-;;;;;;;;;58687:4;58692:3;:8;;;58687:14;;;;;;;;;;:::i;:::-;;;;;;;;;58702:1;58704:2;58702:5;;;;;;;;:::i;:::-;;;;;;;;;58708:20;58715:1;58717;58719:3;:8;;;58708:6;:20::i;:::-;58729:1;58731:2;58729:5;;;;;;;;:::i;:::-;;;;;;;;;58735;58741:3;:9;;;58735:16;;;;;;;;;;:::i;:::-;;;;;;;;;58752:1;58754:2;58752:5;;;;;;;;:::i;:::-;;;;;;;;;58642:116;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58626:133;;58797:6;58804:19;58813:3;:9;;;58804:8;:19::i;:::-;58824:23;58835:3;:11;;;58824:10;:23::i;:::-;58848:5;58854;58860:1;58862:2;58860:5;;;;;;;;:::i;:::-;;;;;;;;;58780:86;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58766:101;;;;;;;57929:944;;;:::o;1231:1589::-;1289:13;1315:11;1329:4;:11;1315:25;;1362:1;1355:3;:8;1351:23;;1365:9;;;;;;;;;;;;;;;;;1351:23;1426:18;1464:1;1459;1453:3;:7;;;;:::i;:::-;1452:13;;;;:::i;:::-;1447:1;:19;;;;:::i;:::-;1426:40;;1524:19;1569:2;1556:10;:15;;;;:::i;:::-;1546:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1524:48;;1583:18;1604:5;;;;;;;;;;;;;;;;;1583:26;;1673:1;1666:5;1662:13;1718:2;1710:6;1706:15;1767:1;1735:769;1790:3;1787:1;1784:10;1735:769;;;1843:1;1840;1836:9;1831:14;;1901:8;1896:1;1890:4;1886:12;1880:19;1876:34;1979:4;1971:5;1967:2;1963:14;1959:25;1949:8;1945:40;1939:47;2018:3;2015:1;2011:11;2004:18;;2109:4;2100;2092:5;2088:2;2084:14;2080:25;2070:8;2066:40;2060:47;2056:58;2051:3;2047:68;2040:75;;2147:3;2144:1;2140:11;2133:18;;2237:4;2228;2220:5;2217:1;2213:13;2209:24;2199:8;2195:39;2189:46;2185:57;2180:3;2176:67;2169:74;;2275:3;2272:1;2268:11;2261:18;;2357:4;2348;2341:5;2337:16;2327:8;2323:31;2317:38;2313:49;2308:3;2304:59;2297:66;;2397:3;2392;2388:13;2381:20;;2437:3;2426:9;2419:22;2487:1;2476:9;2472:17;2459:30;;1812:692;;1735:769;;;1739:44;2534:1;2529:3;2525:11;2555:1;2550:84;;;;2653:1;2648:82;;;;2518:212;;2550:84;2611:6;2606:3;2602:16;2598:1;2587:9;2583:17;2576:43;2550:84;;2648:82;2709:4;2704:3;2700:14;2696:1;2685:9;2681:17;2674:41;2518:212;;2759:10;2751:6;2744:26;1631:1150;;2805:6;2791:21;;;;;;1231:1589;;;;:::o;25783:157::-;25868:4;25907:25;25892:40;;;:11;:40;;;;25885:47;;25783:157;;;:::o;42667:589::-;42811:45;42838:4;42844:2;42848:7;42811:26;:45::i;:::-;42889:1;42873:18;;:4;:18;;;42869:187;;42908:40;42940:7;42908:31;:40::i;:::-;42869:187;;;42978:2;42970:10;;:4;:10;;;42966:90;;42997:47;43030:4;43036:7;42997:32;:47::i;:::-;42966:90;42869:187;43084:1;43070:16;;:2;:16;;;43066:183;;43103:45;43140:7;43103:36;:45::i;:::-;43066:183;;;43176:4;43170:10;;:2;:10;;;43166:83;;43197:40;43225:2;43229:7;43197:27;:40::i;:::-;43166:83;43066:183;42667:589;;;:::o;34393:321::-;34523:18;34529:2;34533:7;34523:5;:18::i;:::-;34574:54;34605:1;34609:2;34613:7;34622:5;34574:22;:54::i;:::-;34552:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34393:321;;;:::o;54250:132::-;54310:7;54368:5;54351:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;54341:34;;;;;;54333:43;;54326:50;;54250:132;;;:::o;54388:211::-;54453:5;54467:9;54477:1;54467:11;;54485:9;54503:1;54505;54503:4;;;;;;;;:::i;:::-;;;;;;;;54495:13;;54485:23;;54515:62;54525:1;54522;:4;54515:62;;54537:5;;;;;:::i;:::-;;;;54562:1;54564:3;54562:6;;;;;;;;;;:::i;:::-;;;;;;;;54554:15;;54551:18;;;;;:::i;:::-;;;54515:62;;;54590:3;54583:10;;;;54388:211;;;;:::o;37793:803::-;37948:4;37969:15;:2;:13;;;:15::i;:::-;37965:624;;;38021:2;38005:36;;;38042:12;:10;:12::i;:::-;38056:4;38062:7;38071:5;38005:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38001:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38268:1;38251:6;:13;:18;38247:272;;38294:60;;;;;;;;;;:::i;:::-;;;;;;;;38247:272;38469:6;38463:13;38454:6;38450:2;38446:15;38439:38;38001:533;38138:45;;;38128:55;;;:6;:55;;;;38121:62;;;;;37965:624;38573:4;38566:11;;37793:803;;;;;;;:::o;56505:349::-;56585:13;56607:17;:22;;;;;;;;;;;;;;56642:1;56640;:3;;;56636:60;;;56677:3;56681:1;56683:3;56687:1;56689:2;56660:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56647:46;;56636:60;56708:2;56706:1;:4;;;56702:65;;;56744:3;56748;56752:1;56754:3;56758:1;56760:2;56727:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56714:50;;56702:65;56779:2;56777:1;:4;;;56773:59;;;56815:3;56819;56823:1;56825:2;56798:30;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56785:44;;56773:59;56845:3;56838:10;;;56505:349;;;;;:::o;56860:525::-;56910:13;56932:17;:22;;;;;;;;;;;;;;56961:6;56981:2;56979:1;:4;;;56978:27;;;;56992:1;56990;:3;;;56989:15;;;;;57001:2;56999:1;:4;;;56989:15;56978:27;56974:317;;;57023:1;57021:3;;57016:130;57027:1;57025;:3;57016:130;;;57075:3;57079;57083:21;57090:2;57088:1;:4;;;;:::i;:::-;57084:3;:8;;;;:::i;:::-;57083:19;:21::i;:::-;57105:3;57109:21;57116:2;57114:1;:4;;;;:::i;:::-;57110:3;:8;;;;:::i;:::-;57109:19;:21::i;:::-;57131:3;57058:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57045:91;;57029:3;;;;;:::i;:::-;;;;57016:130;;;57161:1;57159:3;;57154:130;57165:1;57163;:3;57154:130;;;57213:3;57217;57221:21;57228:2;57226:1;:4;;;;:::i;:::-;57222:3;:8;;;;:::i;:::-;57221:19;:21::i;:::-;57243:3;57247:21;57254:2;57252:1;:4;;;;:::i;:::-;57248:3;:8;;;;:::i;:::-;57247:19;:21::i;:::-;57269:3;57196:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57183:91;;57167:3;;;;;:::i;:::-;;;;57154:130;;;56974:317;57303:2;57301:1;:4;;;57297:66;;;57346:3;57350;57329:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57316:39;;57297:66;57376:3;57369:10;;;;56860:525;;;:::o;57391:532::-;57443:13;57472:1;57469;:4;;;57465:36;;57484:9;;;;;;;;;;;;;;;;57465:36;57513:1;57511;:3;;;57507:153;;;57531:1;57529;:3;;;57525:74;;;57576:3;57580;57584;57559:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57545:44;;;;57525:74;57639:3;57643;57647;57622:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57608:44;;;;57507:153;57672:1;57670;:3;;;57666:233;;;57690:1;57688;:3;;;57684:73;;;57735:3;57739;57743:2;57718:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57704:43;;;;57684:73;57772:1;57770;:3;;;57766:73;;;57817:3;57821;57825:2;57800:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57786:43;;;;57766:73;57879:3;57883;57887:2;57862:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57848:43;;;;57666:233;57912:5;57905:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57391:532;;;;:::o;39168:126::-;;;;:::o;43979:164::-;44083:10;:17;;;;44056:15;:24;44072:7;44056:24;;;;;;;;;;;:44;;;;44111:10;44127:7;44111:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43979:164;:::o;44770:988::-;45036:22;45086:1;45061:22;45078:4;45061:16;:22::i;:::-;:26;;;;:::i;:::-;45036:51;;45098:18;45119:17;:26;45137:7;45119:26;;;;;;;;;;;;45098:47;;45266:14;45252:10;:28;45248:328;;45297:19;45319:12;:18;45332:4;45319:18;;;;;;;;;;;;;;;:34;45338:14;45319:34;;;;;;;;;;;;45297:56;;45403:11;45370:12;:18;45383:4;45370:18;;;;;;;;;;;;;;;:30;45389:10;45370:30;;;;;;;;;;;:44;;;;45520:10;45487:17;:30;45505:11;45487:30;;;;;;;;;;;:43;;;;45282:294;45248:328;45672:17;:26;45690:7;45672:26;;;;;;;;;;;45665:33;;;45716:12;:18;45729:4;45716:18;;;;;;;;;;;;;;;:34;45735:14;45716:34;;;;;;;;;;;45709:41;;;44851:907;;44770:988;;:::o;46053:1079::-;46306:22;46351:1;46331:10;:17;;;;:21;;;;:::i;:::-;46306:46;;46363:18;46384:15;:24;46400:7;46384:24;;;;;;;;;;;;46363:45;;46735:19;46757:10;46768:14;46757:26;;;;;;;;:::i;:::-;;;;;;;;;;46735:48;;46821:11;46796:10;46807;46796:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46932:10;46901:15;:28;46917:11;46901:28;;;;;;;;;;;:41;;;;47073:15;:24;47089:7;47073:24;;;;;;;;;;;47066:31;;;47108:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46124:1008;;;46053:1079;:::o;43557:221::-;43642:14;43659:20;43676:2;43659:16;:20::i;:::-;43642:37;;43717:7;43690:12;:16;43703:2;43690:16;;;;;;;;;;;;;;;:24;43707:6;43690:24;;;;;;;;;;;:34;;;;43764:6;43735:17;:26;43753:7;43735:26;;;;;;;;;;;:35;;;;43631:147;43557:221;;:::o;35050:382::-;35144:1;35130:16;;:2;:16;;;35122:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35203:16;35211:7;35203;:16::i;:::-;35202:17;35194:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35265:45;35294:1;35298:2;35302:7;35265:20;:45::i;:::-;35340:1;35323:9;:13;35333:2;35323:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35371:2;35352:7;:16;35360:7;35352:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35416:7;35412:2;35391:33;;35408:1;35391:33;;;;;;;;;;;;35050:382;;:::o;17971:387::-;18031:4;18239:12;18306:7;18294:20;18286:28;;18349:1;18342:4;:8;18335:15;;;17971:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:116::-;6272:21;6287:5;6272:21;:::i;:::-;6265:5;6262:32;6252:60;;6308:1;6305;6298:12;6252:60;6202:116;:::o;6324:133::-;6367:5;6405:6;6392:20;6383:29;;6421:30;6445:5;6421:30;:::i;:::-;6324:133;;;;:::o;6463:468::-;6528:6;6536;6585:2;6573:9;6564:7;6560:23;6556:32;6553:119;;;6591:79;;:::i;:::-;6553:119;6711:1;6736:53;6781:7;6772:6;6761:9;6757:22;6736:53;:::i;:::-;6726:63;;6682:117;6838:2;6864:50;6906:7;6897:6;6886:9;6882:22;6864:50;:::i;:::-;6854:60;;6809:115;6463:468;;;;;:::o;6937:117::-;7046:1;7043;7036:12;7060:117;7169:1;7166;7159:12;7183:180;7231:77;7228:1;7221:88;7328:4;7325:1;7318:15;7352:4;7349:1;7342:15;7369:281;7452:27;7474:4;7452:27;:::i;:::-;7444:6;7440:40;7582:6;7570:10;7567:22;7546:18;7534:10;7531:34;7528:62;7525:88;;;7593:18;;:::i;:::-;7525:88;7633:10;7629:2;7622:22;7412:238;7369:281;;:::o;7656:129::-;7690:6;7717:20;;:::i;:::-;7707:30;;7746:33;7774:4;7766:6;7746:33;:::i;:::-;7656:129;;;:::o;7791:307::-;7852:4;7942:18;7934:6;7931:30;7928:56;;;7964:18;;:::i;:::-;7928:56;8002:29;8024:6;8002:29;:::i;:::-;7994:37;;8086:4;8080;8076:15;8068:23;;7791:307;;;:::o;8104:146::-;8201:6;8196:3;8191;8178:30;8242:1;8233:6;8228:3;8224:16;8217:27;8104:146;;;:::o;8256:423::-;8333:5;8358:65;8374:48;8415:6;8374:48;:::i;:::-;8358:65;:::i;:::-;8349:74;;8446:6;8439:5;8432:21;8484:4;8477:5;8473:16;8522:3;8513:6;8508:3;8504:16;8501:25;8498:112;;;8529:79;;:::i;:::-;8498:112;8619:54;8666:6;8661:3;8656;8619:54;:::i;:::-;8339:340;8256:423;;;;;:::o;8698:338::-;8753:5;8802:3;8795:4;8787:6;8783:17;8779:27;8769:122;;8810:79;;:::i;:::-;8769:122;8927:6;8914:20;8952:78;9026:3;9018:6;9011:4;9003:6;8999:17;8952:78;:::i;:::-;8943:87;;8759:277;8698:338;;;;:::o;9042:943::-;9137:6;9145;9153;9161;9210:3;9198:9;9189:7;9185:23;9181:33;9178:120;;;9217:79;;:::i;:::-;9178:120;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:53;9535:7;9526:6;9515:9;9511:22;9490:53;:::i;:::-;9480:63;;9435:118;9592:2;9618:53;9663:7;9654:6;9643:9;9639:22;9618:53;:::i;:::-;9608:63;;9563:118;9748:2;9737:9;9733:18;9720:32;9779:18;9771:6;9768:30;9765:117;;;9801:79;;:::i;:::-;9765:117;9906:62;9960:7;9951:6;9940:9;9936:22;9906:62;:::i;:::-;9896:72;;9691:287;9042:943;;;;;;;:::o;9991:474::-;10059:6;10067;10116:2;10104:9;10095:7;10091:23;10087:32;10084:119;;;10122:79;;:::i;:::-;10084:119;10242:1;10267:53;10312:7;10303:6;10292:9;10288:22;10267:53;:::i;:::-;10257:63;;10213:117;10369:2;10395:53;10440:7;10431:6;10420:9;10416:22;10395:53;:::i;:::-;10385:63;;10340:118;9991:474;;;;;:::o;10471:180::-;10519:77;10516:1;10509:88;10616:4;10613:1;10606:15;10640:4;10637:1;10630:15;10657:320;10701:6;10738:1;10732:4;10728:12;10718:22;;10785:1;10779:4;10775:12;10806:18;10796:81;;10862:4;10854:6;10850:17;10840:27;;10796:81;10924:2;10916:6;10913:14;10893:18;10890:38;10887:84;;10943:18;;:::i;:::-;10887:84;10708:269;10657:320;;;:::o;10983:231::-;11123:34;11119:1;11111:6;11107:14;11100:58;11192:14;11187:2;11179:6;11175:15;11168:39;10983:231;:::o;11220:366::-;11362:3;11383:67;11447:2;11442:3;11383:67;:::i;:::-;11376:74;;11459:93;11548:3;11459:93;:::i;:::-;11577:2;11572:3;11568:12;11561:19;;11220:366;;;:::o;11592:419::-;11758:4;11796:2;11785:9;11781:18;11773:26;;11845:9;11839:4;11835:20;11831:1;11820:9;11816:17;11809:47;11873:131;11999:4;11873:131;:::i;:::-;11865:139;;11592:419;;;:::o;12017:220::-;12157:34;12153:1;12145:6;12141:14;12134:58;12226:3;12221:2;12213:6;12209:15;12202:28;12017:220;:::o;12243:366::-;12385:3;12406:67;12470:2;12465:3;12406:67;:::i;:::-;12399:74;;12482:93;12571:3;12482:93;:::i;:::-;12600:2;12595:3;12591:12;12584:19;;12243:366;;;:::o;12615:419::-;12781:4;12819:2;12808:9;12804:18;12796:26;;12868:9;12862:4;12858:20;12854:1;12843:9;12839:17;12832:47;12896:131;13022:4;12896:131;:::i;:::-;12888:139;;12615:419;;;:::o;13040:243::-;13180:34;13176:1;13168:6;13164:14;13157:58;13249:26;13244:2;13236:6;13232:15;13225:51;13040:243;:::o;13289:366::-;13431:3;13452:67;13516:2;13511:3;13452:67;:::i;:::-;13445:74;;13528:93;13617:3;13528:93;:::i;:::-;13646:2;13641:3;13637:12;13630:19;;13289:366;;;:::o;13661:419::-;13827:4;13865:2;13854:9;13850:18;13842:26;;13914:9;13908:4;13904:20;13900:1;13889:9;13885:17;13878:47;13942:131;14068:4;13942:131;:::i;:::-;13934:139;;13661:419;;;:::o;14086:236::-;14226:34;14222:1;14214:6;14210:14;14203:58;14295:19;14290:2;14282:6;14278:15;14271:44;14086:236;:::o;14328:366::-;14470:3;14491:67;14555:2;14550:3;14491:67;:::i;:::-;14484:74;;14567:93;14656:3;14567:93;:::i;:::-;14685:2;14680:3;14676:12;14669:19;;14328:366;;;:::o;14700:419::-;14866:4;14904:2;14893:9;14889:18;14881:26;;14953:9;14947:4;14943:20;14939:1;14928:9;14924:17;14917:47;14981:131;15107:4;14981:131;:::i;:::-;14973:139;;14700:419;;;:::o;15125:230::-;15265:34;15261:1;15253:6;15249:14;15242:58;15334:13;15329:2;15321:6;15317:15;15310:38;15125:230;:::o;15361:366::-;15503:3;15524:67;15588:2;15583:3;15524:67;:::i;:::-;15517:74;;15600:93;15689:3;15600:93;:::i;:::-;15718:2;15713:3;15709:12;15702:19;;15361:366;;;:::o;15733:419::-;15899:4;15937:2;15926:9;15922:18;15914:26;;15986:9;15980:4;15976:20;15972:1;15961:9;15957:17;15950:47;16014:131;16140:4;16014:131;:::i;:::-;16006:139;;15733:419;;;:::o;16158:181::-;16298:33;16294:1;16286:6;16282:14;16275:57;16158:181;:::o;16345:366::-;16487:3;16508:67;16572:2;16567:3;16508:67;:::i;:::-;16501:74;;16584:93;16673:3;16584:93;:::i;:::-;16702:2;16697:3;16693:12;16686:19;;16345:366;;;:::o;16717:419::-;16883:4;16921:2;16910:9;16906:18;16898:26;;16970:9;16964:4;16960:20;16956:1;16945:9;16941:17;16934:47;16998:131;17124:4;16998:131;:::i;:::-;16990:139;;16717:419;;;:::o;17142:182::-;17282:34;17278:1;17270:6;17266:14;17259:58;17142:182;:::o;17330:366::-;17472:3;17493:67;17557:2;17552:3;17493:67;:::i;:::-;17486:74;;17569:93;17658:3;17569:93;:::i;:::-;17687:2;17682:3;17678:12;17671:19;;17330:366;;;:::o;17702:419::-;17868:4;17906:2;17895:9;17891:18;17883:26;;17955:9;17949:4;17945:20;17941:1;17930:9;17926:17;17919:47;17983:131;18109:4;17983:131;:::i;:::-;17975:139;;17702:419;;;:::o;18127:163::-;18267:15;18263:1;18255:6;18251:14;18244:39;18127:163;:::o;18296:366::-;18438:3;18459:67;18523:2;18518:3;18459:67;:::i;:::-;18452:74;;18535:93;18624:3;18535:93;:::i;:::-;18653:2;18648:3;18644:12;18637:19;;18296:366;;;:::o;18668:419::-;18834:4;18872:2;18861:9;18857:18;18849:26;;18921:9;18915:4;18911:20;18907:1;18896:9;18892:17;18885:47;18949:131;19075:4;18949:131;:::i;:::-;18941:139;;18668:419;;;:::o;19093:148::-;19195:11;19232:3;19217:18;;19093:148;;;;:::o;19247:390::-;19353:3;19381:39;19414:5;19381:39;:::i;:::-;19436:89;19518:6;19513:3;19436:89;:::i;:::-;19429:96;;19534:65;19592:6;19587:3;19580:4;19573:5;19569:16;19534:65;:::i;:::-;19624:6;19619:3;19615:16;19608:23;;19357:280;19247:390;;;;:::o;19643:141::-;19692:4;19715:3;19707:11;;19738:3;19735:1;19728:14;19772:4;19769:1;19759:18;19751:26;;19643:141;;;:::o;19814:874::-;19917:3;19954:5;19948:12;19983:36;20009:9;19983:36;:::i;:::-;20035:89;20117:6;20112:3;20035:89;:::i;:::-;20028:96;;20155:1;20144:9;20140:17;20171:1;20166:166;;;;20346:1;20341:341;;;;20133:549;;20166:166;20250:4;20246:9;20235;20231:25;20226:3;20219:38;20312:6;20305:14;20298:22;20290:6;20286:35;20281:3;20277:45;20270:52;;20166:166;;20341:341;20408:38;20440:5;20408:38;:::i;:::-;20468:1;20482:154;20496:6;20493:1;20490:13;20482:154;;;20570:7;20564:14;20560:1;20555:3;20551:11;20544:35;20620:1;20611:7;20607:15;20596:26;;20518:4;20515:1;20511:12;20506:17;;20482:154;;;20665:6;20660:3;20656:16;20649:23;;20348:334;;20133:549;;19921:767;;19814:874;;;;:::o;20694:1057::-;21057:3;21079:95;21170:3;21161:6;21079:95;:::i;:::-;21072:102;;21191:92;21279:3;21270:6;21191:92;:::i;:::-;21184:99;;21300:95;21391:3;21382:6;21300:95;:::i;:::-;21293:102;;21412:92;21500:3;21491:6;21412:92;:::i;:::-;21405:99;;21521:95;21612:3;21603:6;21521:95;:::i;:::-;21514:102;;21633:92;21721:3;21712:6;21633:92;:::i;:::-;21626:99;;21742:3;21735:10;;20694:1057;;;;;;;;;:::o;21757:1377::-;22216:3;22238:95;22329:3;22320:6;22238:95;:::i;:::-;22231:102;;22350:95;22441:3;22432:6;22350:95;:::i;:::-;22343:102;;22462:92;22550:3;22541:6;22462:92;:::i;:::-;22455:99;;22571:95;22662:3;22653:6;22571:95;:::i;:::-;22564:102;;22683:92;22771:3;22762:6;22683:92;:::i;:::-;22676:99;;22792:95;22883:3;22874:6;22792:95;:::i;:::-;22785:102;;22904:92;22992:3;22983:6;22904:92;:::i;:::-;22897:99;;23013:95;23104:3;23095:6;23013:95;:::i;:::-;23006:102;;23125:3;23118:10;;21757:1377;;;;;;;;;;;:::o;23140:180::-;23188:77;23185:1;23178:88;23285:4;23282:1;23275:15;23309:4;23306:1;23299:15;23326:191;23366:3;23385:20;23403:1;23385:20;:::i;:::-;23380:25;;23419:20;23437:1;23419:20;:::i;:::-;23414:25;;23462:1;23459;23455:9;23448:16;;23483:3;23480:1;23477:10;23474:36;;;23490:18;;:::i;:::-;23474:36;23326:191;;;;:::o;23523:231::-;23663:34;23659:1;23651:6;23647:14;23640:58;23732:14;23727:2;23719:6;23715:15;23708:39;23523:231;:::o;23760:366::-;23902:3;23923:67;23987:2;23982:3;23923:67;:::i;:::-;23916:74;;23999:93;24088:3;23999:93;:::i;:::-;24117:2;24112:3;24108:12;24101:19;;23760:366;;;:::o;24132:419::-;24298:4;24336:2;24325:9;24321:18;24313:26;;24385:9;24379:4;24375:20;24371:1;24360:9;24356:17;24349:47;24413:131;24539:4;24413:131;:::i;:::-;24405:139;;24132:419;;;:::o;24557:180::-;24605:77;24602:1;24595:88;24702:4;24699:1;24692:15;24726:4;24723:1;24716:15;24743:228;24883:34;24879:1;24871:6;24867:14;24860:58;24952:11;24947:2;24939:6;24935:15;24928:36;24743:228;:::o;24977:366::-;25119:3;25140:67;25204:2;25199:3;25140:67;:::i;:::-;25133:74;;25216:93;25305:3;25216:93;:::i;:::-;25334:2;25329:3;25325:12;25318:19;;24977:366;;;:::o;25349:419::-;25515:4;25553:2;25542:9;25538:18;25530:26;;25602:9;25596:4;25592:20;25588:1;25577:9;25573:17;25566:47;25630:131;25756:4;25630:131;:::i;:::-;25622:139;;25349:419;;;:::o;25774:229::-;25914:34;25910:1;25902:6;25898:14;25891:58;25983:12;25978:2;25970:6;25966:15;25959:37;25774:229;:::o;26009:366::-;26151:3;26172:67;26236:2;26231:3;26172:67;:::i;:::-;26165:74;;26248:93;26337:3;26248:93;:::i;:::-;26366:2;26361:3;26357:12;26350:19;;26009:366;;;:::o;26381:419::-;26547:4;26585:2;26574:9;26570:18;26562:26;;26634:9;26628:4;26624:20;26620:1;26609:9;26605:17;26598:47;26662:131;26788:4;26662:131;:::i;:::-;26654:139;;26381:419;;;:::o;26806:175::-;26946:27;26942:1;26934:6;26930:14;26923:51;26806:175;:::o;26987:366::-;27129:3;27150:67;27214:2;27209:3;27150:67;:::i;:::-;27143:74;;27226:93;27315:3;27226:93;:::i;:::-;27344:2;27339:3;27335:12;27328:19;;26987:366;;;:::o;27359:419::-;27525:4;27563:2;27552:9;27548:18;27540:26;;27612:9;27606:4;27602:20;27598:1;27587:9;27583:17;27576:47;27640:131;27766:4;27640:131;:::i;:::-;27632:139;;27359:419;;;:::o;27784:903::-;28102:3;28124:92;28212:3;28203:6;28124:92;:::i;:::-;28117:99;;28233:95;28324:3;28315:6;28233:95;:::i;:::-;28226:102;;28345:95;28436:3;28427:6;28345:95;:::i;:::-;28338:102;;28457:95;28548:3;28539:6;28457:95;:::i;:::-;28450:102;;28569:92;28657:3;28648:6;28569:92;:::i;:::-;28562:99;;28678:3;28671:10;;27784:903;;;;;;;;:::o;28693:429::-;28870:3;28892:92;28980:3;28971:6;28892:92;:::i;:::-;28885:99;;29001:95;29092:3;29083:6;29001:95;:::i;:::-;28994:102;;29113:3;29106:10;;28693:429;;;;;:::o;29128:225::-;29268:34;29264:1;29256:6;29252:14;29245:58;29337:8;29332:2;29324:6;29320:15;29313:33;29128:225;:::o;29359:366::-;29501:3;29522:67;29586:2;29581:3;29522:67;:::i;:::-;29515:74;;29598:93;29687:3;29598:93;:::i;:::-;29716:2;29711:3;29707:12;29700:19;;29359:366;;;:::o;29731:419::-;29897:4;29935:2;29924:9;29920:18;29912:26;;29984:9;29978:4;29974:20;29970:1;29959:9;29955:17;29948:47;30012:131;30138:4;30012:131;:::i;:::-;30004:139;;29731:419;;;:::o;30156:231::-;30296:34;30292:1;30284:6;30280:14;30273:58;30365:14;30360:2;30352:6;30348:15;30341:39;30156:231;:::o;30393:366::-;30535:3;30556:67;30620:2;30615:3;30556:67;:::i;:::-;30549:74;;30632:93;30721:3;30632:93;:::i;:::-;30750:2;30745:3;30741:12;30734:19;;30393:366;;;:::o;30765:419::-;30931:4;30969:2;30958:9;30954:18;30946:26;;31018:9;31012:4;31008:20;31004:1;30993:9;30989:17;30982:47;31046:131;31172:4;31046:131;:::i;:::-;31038:139;;30765:419;;;:::o;31190:228::-;31330:34;31326:1;31318:6;31314:14;31307:58;31399:11;31394:2;31386:6;31382:15;31375:36;31190:228;:::o;31424:366::-;31566:3;31587:67;31651:2;31646:3;31587:67;:::i;:::-;31580:74;;31663:93;31752:3;31663:93;:::i;:::-;31781:2;31776:3;31772:12;31765:19;;31424:366;;;:::o;31796:419::-;31962:4;32000:2;31989:9;31985:18;31977:26;;32049:9;32043:4;32039:20;32035:1;32024:9;32020:17;32013:47;32077:131;32203:4;32077:131;:::i;:::-;32069:139;;31796:419;;;:::o;32221:223::-;32361:34;32357:1;32349:6;32345:14;32338:58;32430:6;32425:2;32417:6;32413:15;32406:31;32221:223;:::o;32450:366::-;32592:3;32613:67;32677:2;32672:3;32613:67;:::i;:::-;32606:74;;32689:93;32778:3;32689:93;:::i;:::-;32807:2;32802:3;32798:12;32791:19;;32450:366;;;:::o;32822:419::-;32988:4;33026:2;33015:9;33011:18;33003:26;;33075:9;33069:4;33065:20;33061:1;33050:9;33046:17;33039:47;33103:131;33229:4;33103:131;:::i;:::-;33095:139;;32822:419;;;:::o;33247:194::-;33287:4;33307:20;33325:1;33307:20;:::i;:::-;33302:25;;33341:20;33359:1;33341:20;:::i;:::-;33336:25;;33385:1;33382;33378:9;33370:17;;33409:1;33403:4;33400:11;33397:37;;;33414:18;;:::i;:::-;33397:37;33247:194;;;;:::o;33447:180::-;33495:77;33492:1;33485:88;33592:4;33589:1;33582:15;33616:4;33613:1;33606:15;33633:176;33665:1;33682:20;33700:1;33682:20;:::i;:::-;33677:25;;33716:20;33734:1;33716:20;:::i;:::-;33711:25;;33755:1;33745:35;;33760:18;;:::i;:::-;33745:35;33801:1;33798;33794:9;33789:14;;33633:176;;;;:::o;33815:86::-;33850:7;33890:4;33883:5;33879:16;33868:27;;33815:86;;;:::o;33907:167::-;33944:3;33967:22;33983:5;33967:22;:::i;:::-;33958:31;;34011:4;34004:5;34001:15;33998:41;;34019:18;;:::i;:::-;33998:41;34066:1;34059:5;34055:13;34048:20;;33907:167;;;:::o;34080:233::-;34119:3;34142:24;34160:5;34142:24;:::i;:::-;34133:33;;34188:66;34181:5;34178:77;34175:103;;34258:18;;:::i;:::-;34175:103;34305:1;34298:5;34294:13;34287:20;;34080:233;;;:::o;34319:185::-;34359:1;34376:20;34394:1;34376:20;:::i;:::-;34371:25;;34410:20;34428:1;34410:20;:::i;:::-;34405:25;;34449:1;34439:35;;34454:18;;:::i;:::-;34439:35;34496:1;34493;34489:9;34484:14;;34319:185;;;;:::o;34510:237::-;34650:34;34646:1;34638:6;34634:14;34627:58;34719:20;34714:2;34706:6;34702:15;34695:45;34510:237;:::o;34753:366::-;34895:3;34916:67;34980:2;34975:3;34916:67;:::i;:::-;34909:74;;34992:93;35081:3;34992:93;:::i;:::-;35110:2;35105:3;35101:12;35094:19;;34753:366;;;:::o;35125:419::-;35291:4;35329:2;35318:9;35314:18;35306:26;;35378:9;35372:4;35368:20;35364:1;35353:9;35349:17;35342:47;35406:131;35532:4;35406:131;:::i;:::-;35398:139;;35125:419;;;:::o;35550:1057::-;35913:3;35935:92;36023:3;36014:6;35935:92;:::i;:::-;35928:99;;36044:95;36135:3;36126:6;36044:95;:::i;:::-;36037:102;;36156:92;36244:3;36235:6;36156:92;:::i;:::-;36149:99;;36265:95;36356:3;36347:6;36265:95;:::i;:::-;36258:102;;36377:92;36465:3;36456:6;36377:92;:::i;:::-;36370:99;;36486:95;36577:3;36568:6;36486:95;:::i;:::-;36479:102;;36598:3;36591:10;;35550:1057;;;;;;;;;:::o;36613:1685::-;37162:3;37184:95;37275:3;37266:6;37184:95;:::i;:::-;37177:102;;37296:92;37384:3;37375:6;37296:92;:::i;:::-;37289:99;;37405:95;37496:3;37487:6;37405:95;:::i;:::-;37398:102;;37517:92;37605:3;37596:6;37517:92;:::i;:::-;37510:99;;37626:95;37717:3;37708:6;37626:95;:::i;:::-;37619:102;;37738:92;37826:3;37817:6;37738:92;:::i;:::-;37731:99;;37847:95;37938:3;37929:6;37847:95;:::i;:::-;37840:102;;37959:92;38047:3;38038:6;37959:92;:::i;:::-;37952:99;;38068:95;38159:3;38150:6;38068:95;:::i;:::-;38061:102;;38180:92;38268:3;38259:6;38180:92;:::i;:::-;38173:99;;38289:3;38282:10;;36613:1685;;;;;;;;;;;;;:::o;38304:191::-;38342:4;38362:18;38378:1;38362:18;:::i;:::-;38357:23;;38394:18;38410:1;38394:18;:::i;:::-;38389:23;;38436:1;38433;38429:9;38421:17;;38460:4;38454;38451:14;38448:40;;;38468:18;;:::i;:::-;38448:40;38304:191;;;;:::o;38501:885::-;38810:3;38832:92;38920:3;38911:6;38832:92;:::i;:::-;38825:99;;38941:92;39029:3;39020:6;38941:92;:::i;:::-;38934:99;;39050:92;39138:3;39129:6;39050:92;:::i;:::-;39043:99;;39159:92;39247:3;39238:6;39159:92;:::i;:::-;39152:99;;39268:92;39356:3;39347:6;39268:92;:::i;:::-;39261:99;;39377:3;39370:10;;38501:885;;;;;;;;:::o;39392:891::-;39704:3;39726:92;39814:3;39805:6;39726:92;:::i;:::-;39719:99;;39835:92;39923:3;39914:6;39835:92;:::i;:::-;39828:99;;39944:92;40032:3;40023:6;39944:92;:::i;:::-;39937:99;;40053:95;40144:3;40135:6;40053:95;:::i;:::-;40046:102;;40165:92;40253:3;40244:6;40165:92;:::i;:::-;40158:99;;40274:3;40267:10;;39392:891;;;;;;;;:::o;40289:1531::-;40793:3;40815:95;40906:3;40897:6;40815:95;:::i;:::-;40808:102;;40927:95;41018:3;41009:6;40927:95;:::i;:::-;40920:102;;41039:92;41127:3;41118:6;41039:92;:::i;:::-;41032:99;;41148:95;41239:3;41230:6;41148:95;:::i;:::-;41141:102;;41260:92;41348:3;41339:6;41260:92;:::i;:::-;41253:99;;41369:95;41460:3;41451:6;41369:95;:::i;:::-;41362:102;;41481:92;41569:3;41560:6;41481:92;:::i;:::-;41474:99;;41590:95;41681:3;41672:6;41590:95;:::i;:::-;41583:102;;41702:92;41790:3;41781:6;41702:92;:::i;:::-;41695:99;;41811:3;41804:10;;40289:1531;;;;;;;;;;;;:::o;41826:1513::-;42321:3;42343:95;42434:3;42425:6;42343:95;:::i;:::-;42336:102;;42455:92;42543:3;42534:6;42455:92;:::i;:::-;42448:99;;42564:92;42652:3;42643:6;42564:92;:::i;:::-;42557:99;;42673:92;42761:3;42752:6;42673:92;:::i;:::-;42666:99;;42782:92;42870:3;42861:6;42782:92;:::i;:::-;42775:99;;42891:95;42982:3;42973:6;42891:95;:::i;:::-;42884:102;;43003:92;43091:3;43082:6;43003:92;:::i;:::-;42996:99;;43112:92;43200:3;43191:6;43112:92;:::i;:::-;43105:99;;43221:92;43309:3;43300:6;43221:92;:::i;:::-;43214:99;;43330:3;43323:10;;41826:1513;;;;;;;;;;;;:::o;43345:1069::-;43714:3;43736:95;43827:3;43818:6;43736:95;:::i;:::-;43729:102;;43848:95;43939:3;43930:6;43848:95;:::i;:::-;43841:102;;43960:95;44051:3;44042:6;43960:95;:::i;:::-;43953:102;;44072:95;44163:3;44154:6;44072:95;:::i;:::-;44065:102;;44184:95;44275:3;44266:6;44184:95;:::i;:::-;44177:102;;44296:92;44384:3;44375:6;44296:92;:::i;:::-;44289:99;;44405:3;44398:10;;43345:1069;;;;;;;;;:::o;44420:410::-;44460:7;44483:20;44501:1;44483:20;:::i;:::-;44478:25;;44517:20;44535:1;44517:20;:::i;:::-;44512:25;;44572:1;44569;44565:9;44594:30;44612:11;44594:30;:::i;:::-;44583:41;;44773:1;44764:7;44760:15;44757:1;44754:22;44734:1;44727:9;44707:83;44684:139;;44803:18;;:::i;:::-;44684:139;44468:362;44420:410;;;;:::o;44836:275::-;44968:3;44990:95;45081:3;45072:6;44990:95;:::i;:::-;44983:102;;45102:3;45095:10;;44836:275;;;;:::o;45117:98::-;45168:6;45202:5;45196:12;45186:22;;45117:98;;;:::o;45221:168::-;45304:11;45338:6;45333:3;45326:19;45378:4;45373:3;45369:14;45354:29;;45221:168;;;;:::o;45395:373::-;45481:3;45509:38;45541:5;45509:38;:::i;:::-;45563:70;45626:6;45621:3;45563:70;:::i;:::-;45556:77;;45642:65;45700:6;45695:3;45688:4;45681:5;45677:16;45642:65;:::i;:::-;45732:29;45754:6;45732:29;:::i;:::-;45727:3;45723:39;45716:46;;45485:283;45395:373;;;;:::o;45774:640::-;45969:4;46007:3;45996:9;45992:19;45984:27;;46021:71;46089:1;46078:9;46074:17;46065:6;46021:71;:::i;:::-;46102:72;46170:2;46159:9;46155:18;46146:6;46102:72;:::i;:::-;46184;46252:2;46241:9;46237:18;46228:6;46184:72;:::i;:::-;46303:9;46297:4;46293:20;46288:2;46277:9;46273:18;46266:48;46331:76;46402:4;46393:6;46331:76;:::i;:::-;46323:84;;45774:640;;;;;;;:::o;46420:141::-;46476:5;46507:6;46501:13;46492:22;;46523:32;46549:5;46523:32;:::i;:::-;46420:141;;;;:::o;46567:349::-;46636:6;46685:2;46673:9;46664:7;46660:23;46656:32;46653:119;;;46691:79;;:::i;:::-;46653:119;46811:1;46836:63;46891:7;46882:6;46871:9;46867:22;46836:63;:::i;:::-;46826:73;;46782:127;46567:349;;;;:::o;46922:897::-;47237:3;47259:92;47347:3;47338:6;47259:92;:::i;:::-;47252:99;;47368:95;47459:3;47450:6;47368:95;:::i;:::-;47361:102;;47480:92;47568:3;47559:6;47480:92;:::i;:::-;47473:99;;47589:95;47680:3;47671:6;47589:95;:::i;:::-;47582:102;;47701:92;47789:3;47780:6;47701:92;:::i;:::-;47694:99;;47810:3;47803:10;;46922:897;;;;;;;;:::o;47825:743::-;48095:3;48117:95;48208:3;48199:6;48117:95;:::i;:::-;48110:102;;48229:92;48317:3;48308:6;48229:92;:::i;:::-;48222:99;;48338:95;48429:3;48420:6;48338:95;:::i;:::-;48331:102;;48450:92;48538:3;48529:6;48450:92;:::i;:::-;48443:99;;48559:3;48552:10;;47825:743;;;;;;;:::o;48574:429::-;48751:3;48773:95;48864:3;48855:6;48773:95;:::i;:::-;48766:102;;48885:92;48973:3;48964:6;48885:92;:::i;:::-;48878:99;;48994:3;48987:10;;48574:429;;;;;:::o;49009:577::-;49228:3;49250:92;49338:3;49329:6;49250:92;:::i;:::-;49243:99;;49359:92;49447:3;49438:6;49359:92;:::i;:::-;49352:99;;49468:92;49556:3;49547:6;49468:92;:::i;:::-;49461:99;;49577:3;49570:10;;49009:577;;;;;;:::o;49592:180::-;49640:77;49637:1;49630:88;49737:4;49734:1;49727:15;49761:4;49758:1;49751:15;49778:182;49918:34;49914:1;49906:6;49902:14;49895:58;49778:182;:::o;49966:366::-;50108:3;50129:67;50193:2;50188:3;50129:67;:::i;:::-;50122:74;;50205:93;50294:3;50205:93;:::i;:::-;50323:2;50318:3;50314:12;50307:19;;49966:366;;;:::o;50338:419::-;50504:4;50542:2;50531:9;50527:18;50519:26;;50591:9;50585:4;50581:20;50577:1;50566:9;50562:17;50555:47;50619:131;50745:4;50619:131;:::i;:::-;50611:139;;50338:419;;;:::o;50763:178::-;50903:30;50899:1;50891:6;50887:14;50880:54;50763:178;:::o;50947:366::-;51089:3;51110:67;51174:2;51169:3;51110:67;:::i;:::-;51103:74;;51186:93;51275:3;51186:93;:::i;:::-;51304:2;51299:3;51295:12;51288:19;;50947:366;;;:::o;51319:419::-;51485:4;51523:2;51512:9;51508:18;51500:26;;51572:9;51566:4;51562:20;51558:1;51547:9;51543:17;51536:47;51600:131;51726:4;51600:131;:::i;:::-;51592:139;;51319:419;;;:::o

Swarm Source

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