ETH Price: $2,311.71 (-6.04%)

Token

 

Overview

Max Total Supply

9

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1
0x11619596c5e7498b8420c2b05c8a901cbea28dc6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
ShabuTownShibas

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol


pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol


pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol


pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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);
    }

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

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

// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


pragma solidity ^0.8.0;


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

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol


pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol


pragma solidity ^0.8.0;



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

    function __ERC165_init_unchained() internal initializer {
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165Upgradeable).interfaceId;
    }
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol


pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
    using AddressUpgradeable for address;
    using StringsUpgradeable 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.
     */
    function __ERC721_init(string memory name_, string memory symbol_) internal initializer {
        __Context_init_unchained();
        __ERC165_init_unchained();
        __ERC721_init_unchained(name_, symbol_);
    }

    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
        return
            interfaceId == type(IERC721Upgradeable).interfaceId ||
            interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(ERC721Upgradeable.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(ERC721Upgradeable.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 IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721ReceiverUpgradeable(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 {}
    uint256[44] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol


pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol


pragma solidity ^0.8.0;




/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable {
    function __ERC721Enumerable_init() internal initializer {
        __Context_init_unchained();
        __ERC165_init_unchained();
        __ERC721Enumerable_init_unchained();
    }

    function __ERC721Enumerable_init_unchained() internal initializer {
    }
    // 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(IERC165Upgradeable, ERC721Upgradeable) returns (bool) {
        return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Upgradeable.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 < ERC721EnumerableUpgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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();
    }
    uint256[46] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol


pragma solidity ^0.8.0;



/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    function __Pausable_init() internal initializer {
        __Context_init_unchained();
        __Pausable_init_unchained();
    }

    function __Pausable_init_unchained() internal initializer {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


pragma solidity ^0.8.0;



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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        _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);
    }
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol


pragma solidity ^0.8.0;

/**
 * @dev This is the interface that {BeaconProxy} expects of its beacon.
 */
interface IBeaconUpgradeable {
    /**
     * @dev Must return an address that can be used as a delegate call target.
     *
     * {BeaconProxy} will check that this address is a contract.
     */
    function implementation() external view returns (address);
}

// File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol


pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
 */
library StorageSlotUpgradeable {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        assembly {
            r.slot := slot
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol


pragma solidity ^0.8.2;





/**
 * @dev This abstract contract provides getters and event emitting update functions for
 * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
 *
 * _Available since v4.1._
 *
 * @custom:oz-upgrades-unsafe-allow delegatecall
 */
abstract contract ERC1967UpgradeUpgradeable is Initializable {
    function __ERC1967Upgrade_init() internal initializer {
        __ERC1967Upgrade_init_unchained();
    }

    function __ERC1967Upgrade_init_unchained() internal initializer {
    }
    // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Emitted when the implementation is upgraded.
     */
    event Upgraded(address indexed implementation);

    /**
     * @dev Returns the current implementation address.
     */
    function _getImplementation() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 implementation slot.
     */
    function _setImplementation(address newImplementation) private {
        require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract");
        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
    }

    /**
     * @dev Perform implementation upgrade
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeTo(address newImplementation) internal {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Perform implementation upgrade with additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCall(
        address newImplementation,
        bytes memory data,
        bool forceCall
    ) internal {
        _upgradeTo(newImplementation);
        if (data.length > 0 || forceCall) {
            _functionDelegateCall(newImplementation, data);
        }
    }

    /**
     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCallSecure(
        address newImplementation,
        bytes memory data,
        bool forceCall
    ) internal {
        address oldImplementation = _getImplementation();

        // Initial upgrade and setup call
        _setImplementation(newImplementation);
        if (data.length > 0 || forceCall) {
            _functionDelegateCall(newImplementation, data);
        }

        // Perform rollback test if not already in progress
        StorageSlotUpgradeable.BooleanSlot storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT);
        if (!rollbackTesting.value) {
            // Trigger rollback using upgradeTo from the new implementation
            rollbackTesting.value = true;
            _functionDelegateCall(
                newImplementation,
                abi.encodeWithSignature("upgradeTo(address)", oldImplementation)
            );
            rollbackTesting.value = false;
            // Check rollback was effective
            require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades");
            // Finally reset to the new implementation and log the upgrade
            _upgradeTo(newImplementation);
        }
    }

    /**
     * @dev Storage slot with the admin of the contract.
     * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

    /**
     * @dev Emitted when the admin account has changed.
     */
    event AdminChanged(address previousAdmin, address newAdmin);

    /**
     * @dev Returns the current admin.
     */
    function _getAdmin() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 admin slot.
     */
    function _setAdmin(address newAdmin) private {
        require(newAdmin != address(0), "ERC1967: new admin is the zero address");
        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
    }

    /**
     * @dev Changes the admin of the proxy.
     *
     * Emits an {AdminChanged} event.
     */
    function _changeAdmin(address newAdmin) internal {
        emit AdminChanged(_getAdmin(), newAdmin);
        _setAdmin(newAdmin);
    }

    /**
     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
     */
    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;

    /**
     * @dev Emitted when the beacon is upgraded.
     */
    event BeaconUpgraded(address indexed beacon);

    /**
     * @dev Returns the current beacon.
     */
    function _getBeacon() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;
    }

    /**
     * @dev Stores a new beacon in the EIP1967 beacon slot.
     */
    function _setBeacon(address newBeacon) private {
        require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract");
        require(
            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),
            "ERC1967: beacon implementation is not a contract"
        );
        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;
    }

    /**
     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
     *
     * Emits a {BeaconUpgraded} event.
     */
    function _upgradeBeaconToAndCall(
        address newBeacon,
        bytes memory data,
        bool forceCall
    ) internal {
        _setBeacon(newBeacon);
        emit BeaconUpgraded(newBeacon);
        if (data.length > 0 || forceCall) {
            _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);
        }
    }

    /**
     * @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) private returns (bytes memory) {
        require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, "Address: low-level delegate call failed");
    }

    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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol


pragma solidity ^0.8.0;



/**
 * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
 * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
 *
 * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
 * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
 * `UUPSUpgradeable` with a custom implementation of upgrades.
 *
 * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
 *
 * _Available since v4.1._
 */
abstract contract UUPSUpgradeable is Initializable, ERC1967UpgradeUpgradeable {
    function __UUPSUpgradeable_init() internal initializer {
        __ERC1967Upgrade_init_unchained();
        __UUPSUpgradeable_init_unchained();
    }

    function __UUPSUpgradeable_init_unchained() internal initializer {
    }
    /**
     * @dev Upgrade the implementation of the proxy to `newImplementation`.
     *
     * Calls {_authorizeUpgrade}.
     *
     * Emits an {Upgraded} event.
     */
    function upgradeTo(address newImplementation) external virtual {
        _authorizeUpgrade(newImplementation);
        _upgradeToAndCallSecure(newImplementation, bytes(""), false);
    }

    /**
     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
     * encoded in `data`.
     *
     * Calls {_authorizeUpgrade}.
     *
     * Emits an {Upgraded} event.
     */
    function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual {
        _authorizeUpgrade(newImplementation);
        _upgradeToAndCallSecure(newImplementation, data, true);
    }

    /**
     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
     * {upgradeTo} and {upgradeToAndCall}.
     *
     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
     *
     * ```solidity
     * function _authorizeUpgrade(address) internal override onlyOwner {}
     * ```
     */
    function _authorizeUpgrade(address newImplementation) internal virtual;
    uint256[50] private __gap;
}

// File: contracts/ShabuTownShibas.sol

pragma solidity ^0.8.0;







contract ShabuTownShibas is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, PausableUpgradeable, OwnableUpgradeable, UUPSUpgradeable {

    string _baseTokenURI;
    uint256 private _reserved;
    uint256 private _price;
    address w1;

    function initialize() initializer public {
        __ERC721_init("Shabu Town Shibas", "STS");
        __ERC721Enumerable_init();
        __Pausable_init();
        __Ownable_init();
        __UUPSUpgradeable_init();

        _baseTokenURI = "https://shabu.town/api/nft/shiba/";
        _reserved = 10000;
        _price = 0.05 ether;
        w1 = 0x54e35a069FF7916D594c4b7FD404Bd7688f589da;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

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

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721Upgradeable, ERC721EnumerableUpgradeable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _authorizeUpgrade(address newImplementation)
        internal
        onlyOwner
        override
    {}

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721Upgradeable, ERC721EnumerableUpgradeable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }

    function getPrice() public view returns (uint256){
        return _price;
    }

    function setReserved(uint256 _newReserved) public onlyOwner() {
        _reserved = _newReserved;
    }

    function getReserved() public view returns (uint256){
        return _reserved;
    }

    function adopt(uint256 num) public payable {
        uint256 supply = totalSupply();
        require( num < 21,                              "Cannot adopt more than 20 Shibas" );
        require( supply + num < 10000 - _reserved,      "Exceeds maximum supply" );
        require( msg.value >= _price * num,             "Insufficient Ether for adoption" );

        for(uint256 i; i < num; i++){
            _safeMint( msg.sender, supply + i );
        }
    }

    function giveAway(address _to, uint256 _amount) external onlyOwner() {
        require( _amount <= _reserved, "Exceeds maximum supply" );
        _reserved -= _amount;

        uint256 supply = totalSupply();
        for(uint256 i; i < _amount; i++){
            _safeMint( _to, supply + i );
        }
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(w1).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":"beacon","type":"address"}],"name":"BeaconUpgraded","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adopt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newReserved","type":"uint256"}],"name":"setReserved","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"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

608060405234801561001057600080fd5b50615a8480620000216000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d57806391b7f5ed116100a0578063b88d4fde1161006f578063b88d4fde146106bc578063c87b56dd146106e5578063ca80014414610722578063e985e9c51461074b578063f2fde38b14610788576101f9565b806391b7f5ed1461061457806395d89b411461063d57806398d5fdca14610668578063a22cb46514610693576101f9565b80638456cb59116100dc5780638456cb59146105ac578063853828b6146105c35780638588b2c5146105cd5780638da5cb5b146105e9576101f9565b80636352211e1461050457806370a0823114610541578063715018a61461057e5780638129fc1c14610595576101f9565b80632f745c5911610190578063438b63001161015f578063438b63001461041a5780634f1ef286146104575780634f6ccce71461047357806355f804b3146104b05780635c975abb146104d9576101f9565b80632f745c59146103745780633659cfe6146103b15780633f4ba83a146103da57806342842e0e146103f1576101f9565b80630d9639ba116101cc5780630d9639ba146102cc57806318160ddd146102f757806323b872dd146103225780632d6e71b61461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190614333565b6107b1565b60405161023291906149fe565b60405180910390f35b34801561024757600080fd5b506102506107c3565b60405161025d9190614a19565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906143d6565b610855565b60405161029a9190614975565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906142f3565b6108da565b005b3480156102d857600080fd5b506102e16109f2565b6040516102ee9190614d9b565b60405180910390f35b34801561030357600080fd5b5061030c6109fd565b6040516103199190614d9b565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190614181565b610a0a565b005b34801561035757600080fd5b50610372600480360381019061036d91906143d6565b610a6a565b005b34801561038057600080fd5b5061039b600480360381019061039691906142f3565b610af1565b6040516103a89190614d9b565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190614114565b610b96565b005b3480156103e657600080fd5b506103ef610bbd565b005b3480156103fd57600080fd5b5061041860048036038101906104139190614181565b610c43565b005b34801561042657600080fd5b50610441600480360381019061043c9190614114565b610c63565b60405161044e91906149dc565b60405180910390f35b610471600480360381019061046c9190614297565b610d11565b005b34801561047f57600080fd5b5061049a600480360381019061049591906143d6565b610d2a565b6040516104a79190614d9b565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061438d565b610d9b565b005b3480156104e557600080fd5b506104ee610e32565b6040516104fb91906149fe565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906143d6565b610e49565b6040516105389190614975565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190614114565b610efb565b6040516105759190614d9b565b60405180910390f35b34801561058a57600080fd5b50610593610fb3565b005b3480156105a157600080fd5b506105aa61103b565b005b3480156105b857600080fd5b506105c1611247565b005b6105cb6112cd565b005b6105e760048036038101906105e291906143d6565b6113ac565b005b3480156105f557600080fd5b506105fe6114e1565b60405161060b9190614975565b60405180910390f35b34801561062057600080fd5b5061063b600480360381019061063691906143d6565b61150b565b005b34801561064957600080fd5b50610652611592565b60405161065f9190614a19565b60405180910390f35b34801561067457600080fd5b5061067d611624565b60405161068a9190614d9b565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190614257565b61162f565b005b3480156106c857600080fd5b506106e360048036038101906106de91906141d4565b6117b0565b005b3480156106f157600080fd5b5061070c600480360381019061070791906143d6565b611812565b6040516107199190614a19565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906142f3565b6118b9565b005b34801561075757600080fd5b50610772600480360381019061076d9190614141565b6119da565b60405161077f91906149fe565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190614114565b611a6e565b005b60006107bc82611b66565b9050919050565b6060606580546107d29061508f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe9061508f565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b5050505050905090565b600061086082611be0565b61089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690614c3b565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e582610e49565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d90614cdb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610975611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614806109a457506109a38161099e611c4c565b6119da565b5b6109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da90614b9b565b60405180910390fd5b6109ed8383611c54565b505050565b600061019254905090565b6000609980549050905090565b610a1b610a15611c4c565b82611d0d565b610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190614d5b565b60405180910390fd5b610a65838383611deb565b505050565b610a72611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610a906114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90614c7b565b60405180910390fd5b806101928190555050565b6000610afc83610efb565b8210610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490614a5b565b60405180910390fd5b609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b9f81612047565b610bba816040518060200160405280600081525060006120c6565b50565b610bc5611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610be36114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3090614c7b565b60405180910390fd5b610c41612297565b565b610c5e838383604051806020016040528060008152506117b0565b505050565b60606000610c7083610efb565b905060008167ffffffffffffffff811115610c8e57610c8d615257565b5b604051908082528060200260200182016040528015610cbc5781602001602082028036833780820191505090505b50905060005b82811015610d0657610cd48582610af1565b828281518110610ce757610ce6615228565b5b6020026020010181815250508080610cfe906150f2565b915050610cc2565b508092505050919050565b610d1a82612047565b610d26828260016120c6565b5050565b6000610d346109fd565b8210610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c90614d7b565b60405180910390fd5b60998281548110610d8957610d88615228565b5b90600052602060002001549050919050565b610da3611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610dc16114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90614c7b565b60405180910390fd5b806101919080519060200190610e2e929190613f28565b5050565b600060c960009054906101000a900460ff16905090565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee990614bdb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390614bbb565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fbb611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610fd96114e1565b73ffffffffffffffffffffffffffffffffffffffff161461102f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102690614c7b565b60405180910390fd5b6110396000612339565b565b600060019054906101000a900460ff1680611061575060008054906101000a900460ff16155b6110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156110f0576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6111646040518060400160405280601181526020017f536861627520546f776e205368696261730000000000000000000000000000008152506040518060400160405280600381526020017f53545300000000000000000000000000000000000000000000000000000000008152506123ff565b61116c6124f4565b6111746125e5565b61117c6126ce565b6111846127b7565b604051806060016040528060218152602001615a076021913961019190805190602001906111b3929190613f28565b506127106101928190555066b1a2bc2ec50000610193819055507354e35a069ff7916d594c4b7fd404bd7688f589da61019460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156112445760008060016101000a81548160ff0219169083151502179055505b50565b61124f611c4c565b73ffffffffffffffffffffffffffffffffffffffff1661126d6114e1565b73ffffffffffffffffffffffffffffffffffffffff16146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90614c7b565b60405180910390fd5b6112cb6128a0565b565b6112d5611c4c565b73ffffffffffffffffffffffffffffffffffffffff166112f36114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614c7b565b60405180910390fd5b61019460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506113aa57600080fd5b565b60006113b66109fd565b9050601582106113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290614b3b565b60405180910390fd5b6101925461271061140c9190614fa5565b82826114189190614ec4565b10611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90614d1b565b60405180910390fd5b81610193546114679190614f4b565b3410156114a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a090614cfb565b60405180910390fd5b60005b828110156114dc576114c93382846114c49190614ec4565b612943565b80806114d4906150f2565b9150506114ac565b505050565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611513611c4c565b73ffffffffffffffffffffffffffffffffffffffff166115316114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614c7b565b60405180910390fd5b806101938190555050565b6060606680546115a19061508f565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd9061508f565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b5050505050905090565b600061019354905090565b611637611c4c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90614b1b565b60405180910390fd5b80606a60006116b2611c4c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175f611c4c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117a491906149fe565b60405180910390a35050565b6117c16117bb611c4c565b83611d0d565b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614d5b565b60405180910390fd5b61180c84848484612961565b50505050565b606061181d82611be0565b61185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390614cbb565b60405180910390fd5b60006118666129bd565b9050600081511161188657604051806020016040528060008152506118b1565b8061189084612a50565b6040516020016118a1929190614951565b6040516020818303038152906040525b915050919050565b6118c1611c4c565b73ffffffffffffffffffffffffffffffffffffffff166118df6114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c90614c7b565b60405180910390fd5b6101925481111561197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614d1b565b60405180910390fd5b80610192600082825461198e9190614fa5565b92505081905550600061199f6109fd565b905060005b828110156119d4576119c18482846119bc9190614ec4565b612943565b80806119cc906150f2565b9150506119a4565b50505050565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a76611c4c565b73ffffffffffffffffffffffffffffffffffffffff16611a946114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae190614c7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190614abb565b60405180910390fd5b611b6381612339565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bd95750611bd882612bb1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cc783610e49565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d1882611be0565b611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90614b5b565b60405180910390fd5b6000611d6283610e49565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dd157508373ffffffffffffffffffffffffffffffffffffffff16611db984610855565b73ffffffffffffffffffffffffffffffffffffffff16145b80611de25750611de181856119da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e0b82610e49565b73ffffffffffffffffffffffffffffffffffffffff1614611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890614c9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614afb565b60405180910390fd5b611edc838383612c93565b611ee7600082611c54565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f379190614fa5565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f8e9190614ec4565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61204f611c4c565b73ffffffffffffffffffffffffffffffffffffffff1661206d6114e1565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614c7b565b60405180910390fd5b50565b60006120d0612ceb565b90506120db84612d42565b6000835111806120e85750815b156120f9576120f78484612dfb565b505b60006121277f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b612edf565b90508060000160009054906101000a900460ff166122905760018160000160006101000a81548160ff0219169083151502179055506121f385836040516024016121719190614975565b6040516020818303038152906040527f3659cfe6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dfb565b5060008160000160006101000a81548160ff021916908315150217905550612219612ceb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614a9b565b60405180910390fd5b61228f85612ee9565b5b5050505050565b61229f610e32565b6122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590614a3b565b60405180910390fd5b600060c960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612322611c4c565b60405161232f9190614975565b60405180910390a1565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160fb60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060019054906101000a900460ff1680612425575060008054906101000a900460ff16155b612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156124b4576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6124bc612f38565b6124c4613011565b6124ce83836130ea565b80156124ef5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff168061251a575060008054906101000a900460ff16155b612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156125a9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6125b1612f38565b6125b9613011565b6125c16131f3565b80156125e25760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff168061260b575060008054906101000a900460ff16155b61264a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264190614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561269a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6126a2612f38565b6126aa6132cc565b80156126cb5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806126f4575060008054906101000a900460ff16155b612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015612783576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61278b612f38565b6127936133c0565b80156127b45760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806127dd575060008054906101000a900460ff16155b61281c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281390614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561286c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6128746134a9565b61287c613582565b801561289d5760008060016101000a81548160ff0219169083151502179055505b50565b6128a8610e32565b156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df90614b7b565b60405180910390fd5b600160c960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861292c611c4c565b6040516129399190614975565b60405180910390a1565b61295d82826040518060200160405280600081525061365b565b5050565b61296c848484611deb565b612978848484846136b6565b6129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae90614a7b565b60405180910390fd5b50505050565b606061019180546129cd9061508f565b80601f01602080910402602001604051908101604052809291908181526020018280546129f99061508f565b8015612a465780601f10612a1b57610100808354040283529160200191612a46565b820191906000526020600020905b815481529060010190602001808311612a2957829003601f168201915b5050505050905090565b60606000821415612a98576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bac565b600082905060005b60008214612aca578080612ab3906150f2565b915050600a82612ac39190614f1a565b9150612aa0565b60008167ffffffffffffffff811115612ae657612ae5615257565b5b6040519080825280601f01601f191660200182016040528015612b185781602001600182028036833780820191505090505b5090505b60008514612ba557600182612b319190614fa5565b9150600a85612b40919061513b565b6030612b4c9190614ec4565b60f81b818381518110612b6257612b61615228565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b9e9190614f1a565b9450612b1c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c7c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c8c5750612c8b8261384d565b5b9050919050565b612c9b610e32565b15612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd290614b7b565b60405180910390fd5b612ce68383836138b7565b505050565b6000612d197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6139cb565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612d4b816139d5565b612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190614c5b565b60405180910390fd5b80612db77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6139cb565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060612e06836139d5565b612e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3c90614d3b565b60405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1684604051612e6d919061493a565b600060405180830381855af49150503d8060008114612ea8576040519150601f19603f3d011682016040523d82523d6000602084013e612ead565b606091505b5091509150612ed58282604051806060016040528060278152602001615a28602791396139e8565b9250505092915050565b6000819050919050565b612ef281612d42565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b600060019054906101000a900460ff1680612f5e575060008054906101000a900460ff16155b612f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9490614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015612fed576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561300e5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613037575060008054906101000a900460ff16155b613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d90614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156130c6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156130e75760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613110575060008054906101000a900460ff16155b61314f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314690614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561319f576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b82606590805190602001906131b5929190613f28565b5081606690805190602001906131cc929190613f28565b5080156131ee5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680613219575060008054906101000a900460ff16155b613258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324f90614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156132a8576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156132c95760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806132f2575060008054906101000a900460ff16155b613331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332890614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613381576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600060c960006101000a81548160ff02191690831515021790555080156133bd5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806133e6575060008054906101000a900460ff16155b613425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341c90614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613475576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b613485613480611c4c565b612339565b80156134a65760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134cf575060008054906101000a900460ff16155b61350e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350590614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561355e576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561357f5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806135a8575060008054906101000a900460ff16155b6135e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135de90614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613637576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156136585760008060016101000a81548160ff0219169083151502179055505b50565b6136658383613a4f565b61367260008484846136b6565b6136b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a890614a7b565b60405180910390fd5b505050565b60006136d78473ffffffffffffffffffffffffffffffffffffffff166139d5565b15613840578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613700611c4c565b8786866040518563ffffffff1660e01b81526004016137229493929190614990565b602060405180830381600087803b15801561373c57600080fd5b505af192505050801561376d57506040513d601f19601f8201168201806040525081019061376a9190614360565b60015b6137f0573d806000811461379d576040519150601f19603f3d011682016040523d82523d6000602084013e6137a2565b606091505b506000815114156137e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137df90614a7b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613845565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138c2838383613c1d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139055761390081613c22565b613944565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613943576139428382613c6b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139875761398281613dd8565b6139c6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139c5576139c48282613ea9565b5b5b505050565b6000819050919050565b600080823b905060008111915050919050565b606083156139f857829050613a48565b600083511115613a0b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3f9190614a19565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab690614c1b565b60405180910390fd5b613ac881611be0565b15613b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aff90614adb565b60405180910390fd5b613b1460008383612c93565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b649190614ec4565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b609980549050609a600083815260200190815260200160002081905550609981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c7884610efb565b613c829190614fa5565b9050600060986000848152602001908152602001600020549050818114613d67576000609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080609760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816098600083815260200190815260200160002081905550505b6098600084815260200190815260200160002060009055609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001609980549050613dec9190614fa5565b90506000609a6000848152602001908152602001600020549050600060998381548110613e1c57613e1b615228565b5b906000526020600020015490508060998381548110613e3e57613e3d615228565b5b906000526020600020018190555081609a600083815260200190815260200160002081905550609a6000858152602001908152602001600020600090556099805480613e8d57613e8c6151f9565b5b6001900381819060005260206000200160009055905550505050565b6000613eb483610efb565b905081609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806098600084815260200190815260200160002081905550505050565b828054613f349061508f565b90600052602060002090601f016020900481019282613f565760008555613f9d565b82601f10613f6f57805160ff1916838001178555613f9d565b82800160010185558215613f9d579182015b82811115613f9c578251825591602001919060010190613f81565b5b509050613faa9190613fae565b5090565b5b80821115613fc7576000816000905550600101613faf565b5090565b6000613fde613fd984614ddb565b614db6565b905082815260208101848484011115613ffa57613ff961528b565b5b61400584828561504d565b509392505050565b600061402061401b84614e0c565b614db6565b90508281526020810184848401111561403c5761403b61528b565b5b61404784828561504d565b509392505050565b60008135905061405e816159aa565b92915050565b600081359050614073816159c1565b92915050565b600081359050614088816159d8565b92915050565b60008151905061409d816159d8565b92915050565b600082601f8301126140b8576140b7615286565b5b81356140c8848260208601613fcb565b91505092915050565b600082601f8301126140e6576140e5615286565b5b81356140f684826020860161400d565b91505092915050565b60008135905061410e816159ef565b92915050565b60006020828403121561412a57614129615295565b5b60006141388482850161404f565b91505092915050565b6000806040838503121561415857614157615295565b5b60006141668582860161404f565b92505060206141778582860161404f565b9150509250929050565b60008060006060848603121561419a57614199615295565b5b60006141a88682870161404f565b93505060206141b98682870161404f565b92505060406141ca868287016140ff565b9150509250925092565b600080600080608085870312156141ee576141ed615295565b5b60006141fc8782880161404f565b945050602061420d8782880161404f565b935050604061421e878288016140ff565b925050606085013567ffffffffffffffff81111561423f5761423e615290565b5b61424b878288016140a3565b91505092959194509250565b6000806040838503121561426e5761426d615295565b5b600061427c8582860161404f565b925050602061428d85828601614064565b9150509250929050565b600080604083850312156142ae576142ad615295565b5b60006142bc8582860161404f565b925050602083013567ffffffffffffffff8111156142dd576142dc615290565b5b6142e9858286016140a3565b9150509250929050565b6000806040838503121561430a57614309615295565b5b60006143188582860161404f565b9250506020614329858286016140ff565b9150509250929050565b60006020828403121561434957614348615295565b5b600061435784828501614079565b91505092915050565b60006020828403121561437657614375615295565b5b60006143848482850161408e565b91505092915050565b6000602082840312156143a3576143a2615295565b5b600082013567ffffffffffffffff8111156143c1576143c0615290565b5b6143cd848285016140d1565b91505092915050565b6000602082840312156143ec576143eb615295565b5b60006143fa848285016140ff565b91505092915050565b600061440f838361491c565b60208301905092915050565b61442481614fd9565b82525050565b600061443582614e4d565b61443f8185614e7b565b935061444a83614e3d565b8060005b8381101561447b5781516144628882614403565b975061446d83614e6e565b92505060018101905061444e565b5085935050505092915050565b61449181614feb565b82525050565b60006144a282614e58565b6144ac8185614e8c565b93506144bc81856020860161505c565b6144c58161529a565b840191505092915050565b60006144db82614e58565b6144e58185614e9d565b93506144f581856020860161505c565b80840191505092915050565b600061450c82614e63565b6145168185614ea8565b935061452681856020860161505c565b61452f8161529a565b840191505092915050565b600061454582614e63565b61454f8185614eb9565b935061455f81856020860161505c565b80840191505092915050565b6000614578601483614ea8565b9150614583826152ab565b602082019050919050565b600061459b602b83614ea8565b91506145a6826152d4565b604082019050919050565b60006145be603283614ea8565b91506145c982615323565b604082019050919050565b60006145e1602f83614ea8565b91506145ec82615372565b604082019050919050565b6000614604602683614ea8565b915061460f826153c1565b604082019050919050565b6000614627601c83614ea8565b915061463282615410565b602082019050919050565b600061464a602483614ea8565b915061465582615439565b604082019050919050565b600061466d601983614ea8565b915061467882615488565b602082019050919050565b6000614690602083614ea8565b915061469b826154b1565b602082019050919050565b60006146b3602c83614ea8565b91506146be826154da565b604082019050919050565b60006146d6601083614ea8565b91506146e182615529565b602082019050919050565b60006146f9603883614ea8565b915061470482615552565b604082019050919050565b600061471c602a83614ea8565b9150614727826155a1565b604082019050919050565b600061473f602983614ea8565b915061474a826155f0565b604082019050919050565b6000614762602e83614ea8565b915061476d8261563f565b604082019050919050565b6000614785602083614ea8565b91506147908261568e565b602082019050919050565b60006147a8602c83614ea8565b91506147b3826156b7565b604082019050919050565b60006147cb602d83614ea8565b91506147d682615706565b604082019050919050565b60006147ee602083614ea8565b91506147f982615755565b602082019050919050565b6000614811602983614ea8565b915061481c8261577e565b604082019050919050565b6000614834602f83614ea8565b915061483f826157cd565b604082019050919050565b6000614857602183614ea8565b91506148628261581c565b604082019050919050565b600061487a601f83614ea8565b91506148858261586b565b602082019050919050565b600061489d601683614ea8565b91506148a882615894565b602082019050919050565b60006148c0602683614ea8565b91506148cb826158bd565b604082019050919050565b60006148e3603183614ea8565b91506148ee8261590c565b604082019050919050565b6000614906602c83614ea8565b91506149118261595b565b604082019050919050565b61492581615043565b82525050565b61493481615043565b82525050565b600061494682846144d0565b915081905092915050565b600061495d828561453a565b9150614969828461453a565b91508190509392505050565b600060208201905061498a600083018461441b565b92915050565b60006080820190506149a5600083018761441b565b6149b2602083018661441b565b6149bf604083018561492b565b81810360608301526149d18184614497565b905095945050505050565b600060208201905081810360008301526149f6818461442a565b905092915050565b6000602082019050614a136000830184614488565b92915050565b60006020820190508181036000830152614a338184614501565b905092915050565b60006020820190508181036000830152614a548161456b565b9050919050565b60006020820190508181036000830152614a748161458e565b9050919050565b60006020820190508181036000830152614a94816145b1565b9050919050565b60006020820190508181036000830152614ab4816145d4565b9050919050565b60006020820190508181036000830152614ad4816145f7565b9050919050565b60006020820190508181036000830152614af48161461a565b9050919050565b60006020820190508181036000830152614b148161463d565b9050919050565b60006020820190508181036000830152614b3481614660565b9050919050565b60006020820190508181036000830152614b5481614683565b9050919050565b60006020820190508181036000830152614b74816146a6565b9050919050565b60006020820190508181036000830152614b94816146c9565b9050919050565b60006020820190508181036000830152614bb4816146ec565b9050919050565b60006020820190508181036000830152614bd48161470f565b9050919050565b60006020820190508181036000830152614bf481614732565b9050919050565b60006020820190508181036000830152614c1481614755565b9050919050565b60006020820190508181036000830152614c3481614778565b9050919050565b60006020820190508181036000830152614c548161479b565b9050919050565b60006020820190508181036000830152614c74816147be565b9050919050565b60006020820190508181036000830152614c94816147e1565b9050919050565b60006020820190508181036000830152614cb481614804565b9050919050565b60006020820190508181036000830152614cd481614827565b9050919050565b60006020820190508181036000830152614cf48161484a565b9050919050565b60006020820190508181036000830152614d148161486d565b9050919050565b60006020820190508181036000830152614d3481614890565b9050919050565b60006020820190508181036000830152614d54816148b3565b9050919050565b60006020820190508181036000830152614d74816148d6565b9050919050565b60006020820190508181036000830152614d94816148f9565b9050919050565b6000602082019050614db0600083018461492b565b92915050565b6000614dc0614dd1565b9050614dcc82826150c1565b919050565b6000604051905090565b600067ffffffffffffffff821115614df657614df5615257565b5b614dff8261529a565b9050602081019050919050565b600067ffffffffffffffff821115614e2757614e26615257565b5b614e308261529a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ecf82615043565b9150614eda83615043565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f0f57614f0e61516c565b5b828201905092915050565b6000614f2582615043565b9150614f3083615043565b925082614f4057614f3f61519b565b5b828204905092915050565b6000614f5682615043565b9150614f6183615043565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f9a57614f9961516c565b5b828202905092915050565b6000614fb082615043565b9150614fbb83615043565b925082821015614fce57614fcd61516c565b5b828203905092915050565b6000614fe482615023565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561507a57808201518184015260208101905061505f565b83811115615089576000848401525b50505050565b600060028204905060018216806150a757607f821691505b602082108114156150bb576150ba6151ca565b5b50919050565b6150ca8261529a565b810181811067ffffffffffffffff821117156150e9576150e8615257565b5b80604052505050565b60006150fd82615043565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151305761512f61516c565b5b600182019050919050565b600061514682615043565b915061515183615043565b9250826151615761516061519b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f45524331393637557067726164653a207570677261646520627265616b73206660008201527f7572746865722075706772616465730000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e6e6f742061646f7074206d6f7265207468616e20323020536869626173600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420457468657220666f722061646f7074696f6e00600082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6159b381614fd9565b81146159be57600080fd5b50565b6159ca81614feb565b81146159d557600080fd5b50565b6159e181614ff7565b81146159ec57600080fd5b50565b6159f881615043565b8114615a0357600080fd5b5056fe68747470733a2f2f73686162752e746f776e2f6170692f6e66742f73686962612f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204c219a5a248fc93f7d01c30a352a3480e9bdde6d4dddb52b58adddc6e72b1f9a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80636352211e1161010d57806391b7f5ed116100a0578063b88d4fde1161006f578063b88d4fde146106bc578063c87b56dd146106e5578063ca80014414610722578063e985e9c51461074b578063f2fde38b14610788576101f9565b806391b7f5ed1461061457806395d89b411461063d57806398d5fdca14610668578063a22cb46514610693576101f9565b80638456cb59116100dc5780638456cb59146105ac578063853828b6146105c35780638588b2c5146105cd5780638da5cb5b146105e9576101f9565b80636352211e1461050457806370a0823114610541578063715018a61461057e5780638129fc1c14610595576101f9565b80632f745c5911610190578063438b63001161015f578063438b63001461041a5780634f1ef286146104575780634f6ccce71461047357806355f804b3146104b05780635c975abb146104d9576101f9565b80632f745c59146103745780633659cfe6146103b15780633f4ba83a146103da57806342842e0e146103f1576101f9565b80630d9639ba116101cc5780630d9639ba146102cc57806318160ddd146102f757806323b872dd146103225780632d6e71b61461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190614333565b6107b1565b60405161023291906149fe565b60405180910390f35b34801561024757600080fd5b506102506107c3565b60405161025d9190614a19565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906143d6565b610855565b60405161029a9190614975565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906142f3565b6108da565b005b3480156102d857600080fd5b506102e16109f2565b6040516102ee9190614d9b565b60405180910390f35b34801561030357600080fd5b5061030c6109fd565b6040516103199190614d9b565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190614181565b610a0a565b005b34801561035757600080fd5b50610372600480360381019061036d91906143d6565b610a6a565b005b34801561038057600080fd5b5061039b600480360381019061039691906142f3565b610af1565b6040516103a89190614d9b565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190614114565b610b96565b005b3480156103e657600080fd5b506103ef610bbd565b005b3480156103fd57600080fd5b5061041860048036038101906104139190614181565b610c43565b005b34801561042657600080fd5b50610441600480360381019061043c9190614114565b610c63565b60405161044e91906149dc565b60405180910390f35b610471600480360381019061046c9190614297565b610d11565b005b34801561047f57600080fd5b5061049a600480360381019061049591906143d6565b610d2a565b6040516104a79190614d9b565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061438d565b610d9b565b005b3480156104e557600080fd5b506104ee610e32565b6040516104fb91906149fe565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906143d6565b610e49565b6040516105389190614975565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190614114565b610efb565b6040516105759190614d9b565b60405180910390f35b34801561058a57600080fd5b50610593610fb3565b005b3480156105a157600080fd5b506105aa61103b565b005b3480156105b857600080fd5b506105c1611247565b005b6105cb6112cd565b005b6105e760048036038101906105e291906143d6565b6113ac565b005b3480156105f557600080fd5b506105fe6114e1565b60405161060b9190614975565b60405180910390f35b34801561062057600080fd5b5061063b600480360381019061063691906143d6565b61150b565b005b34801561064957600080fd5b50610652611592565b60405161065f9190614a19565b60405180910390f35b34801561067457600080fd5b5061067d611624565b60405161068a9190614d9b565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190614257565b61162f565b005b3480156106c857600080fd5b506106e360048036038101906106de91906141d4565b6117b0565b005b3480156106f157600080fd5b5061070c600480360381019061070791906143d6565b611812565b6040516107199190614a19565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906142f3565b6118b9565b005b34801561075757600080fd5b50610772600480360381019061076d9190614141565b6119da565b60405161077f91906149fe565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190614114565b611a6e565b005b60006107bc82611b66565b9050919050565b6060606580546107d29061508f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe9061508f565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b5050505050905090565b600061086082611be0565b61089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690614c3b565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e582610e49565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d90614cdb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610975611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614806109a457506109a38161099e611c4c565b6119da565b5b6109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da90614b9b565b60405180910390fd5b6109ed8383611c54565b505050565b600061019254905090565b6000609980549050905090565b610a1b610a15611c4c565b82611d0d565b610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190614d5b565b60405180910390fd5b610a65838383611deb565b505050565b610a72611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610a906114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90614c7b565b60405180910390fd5b806101928190555050565b6000610afc83610efb565b8210610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490614a5b565b60405180910390fd5b609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b9f81612047565b610bba816040518060200160405280600081525060006120c6565b50565b610bc5611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610be36114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3090614c7b565b60405180910390fd5b610c41612297565b565b610c5e838383604051806020016040528060008152506117b0565b505050565b60606000610c7083610efb565b905060008167ffffffffffffffff811115610c8e57610c8d615257565b5b604051908082528060200260200182016040528015610cbc5781602001602082028036833780820191505090505b50905060005b82811015610d0657610cd48582610af1565b828281518110610ce757610ce6615228565b5b6020026020010181815250508080610cfe906150f2565b915050610cc2565b508092505050919050565b610d1a82612047565b610d26828260016120c6565b5050565b6000610d346109fd565b8210610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c90614d7b565b60405180910390fd5b60998281548110610d8957610d88615228565b5b90600052602060002001549050919050565b610da3611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610dc16114e1565b73ffffffffffffffffffffffffffffffffffffffff1614610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90614c7b565b60405180910390fd5b806101919080519060200190610e2e929190613f28565b5050565b600060c960009054906101000a900460ff16905090565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee990614bdb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390614bbb565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fbb611c4c565b73ffffffffffffffffffffffffffffffffffffffff16610fd96114e1565b73ffffffffffffffffffffffffffffffffffffffff161461102f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102690614c7b565b60405180910390fd5b6110396000612339565b565b600060019054906101000a900460ff1680611061575060008054906101000a900460ff16155b6110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156110f0576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6111646040518060400160405280601181526020017f536861627520546f776e205368696261730000000000000000000000000000008152506040518060400160405280600381526020017f53545300000000000000000000000000000000000000000000000000000000008152506123ff565b61116c6124f4565b6111746125e5565b61117c6126ce565b6111846127b7565b604051806060016040528060218152602001615a076021913961019190805190602001906111b3929190613f28565b506127106101928190555066b1a2bc2ec50000610193819055507354e35a069ff7916d594c4b7fd404bd7688f589da61019460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156112445760008060016101000a81548160ff0219169083151502179055505b50565b61124f611c4c565b73ffffffffffffffffffffffffffffffffffffffff1661126d6114e1565b73ffffffffffffffffffffffffffffffffffffffff16146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90614c7b565b60405180910390fd5b6112cb6128a0565b565b6112d5611c4c565b73ffffffffffffffffffffffffffffffffffffffff166112f36114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614c7b565b60405180910390fd5b61019460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506113aa57600080fd5b565b60006113b66109fd565b9050601582106113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290614b3b565b60405180910390fd5b6101925461271061140c9190614fa5565b82826114189190614ec4565b10611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90614d1b565b60405180910390fd5b81610193546114679190614f4b565b3410156114a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a090614cfb565b60405180910390fd5b60005b828110156114dc576114c93382846114c49190614ec4565b612943565b80806114d4906150f2565b9150506114ac565b505050565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611513611c4c565b73ffffffffffffffffffffffffffffffffffffffff166115316114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614c7b565b60405180910390fd5b806101938190555050565b6060606680546115a19061508f565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd9061508f565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b5050505050905090565b600061019354905090565b611637611c4c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90614b1b565b60405180910390fd5b80606a60006116b2611c4c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175f611c4c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117a491906149fe565b60405180910390a35050565b6117c16117bb611c4c565b83611d0d565b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614d5b565b60405180910390fd5b61180c84848484612961565b50505050565b606061181d82611be0565b61185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390614cbb565b60405180910390fd5b60006118666129bd565b9050600081511161188657604051806020016040528060008152506118b1565b8061189084612a50565b6040516020016118a1929190614951565b6040516020818303038152906040525b915050919050565b6118c1611c4c565b73ffffffffffffffffffffffffffffffffffffffff166118df6114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c90614c7b565b60405180910390fd5b6101925481111561197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614d1b565b60405180910390fd5b80610192600082825461198e9190614fa5565b92505081905550600061199f6109fd565b905060005b828110156119d4576119c18482846119bc9190614ec4565b612943565b80806119cc906150f2565b9150506119a4565b50505050565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a76611c4c565b73ffffffffffffffffffffffffffffffffffffffff16611a946114e1565b73ffffffffffffffffffffffffffffffffffffffff1614611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae190614c7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190614abb565b60405180910390fd5b611b6381612339565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bd95750611bd882612bb1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cc783610e49565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d1882611be0565b611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90614b5b565b60405180910390fd5b6000611d6283610e49565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dd157508373ffffffffffffffffffffffffffffffffffffffff16611db984610855565b73ffffffffffffffffffffffffffffffffffffffff16145b80611de25750611de181856119da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e0b82610e49565b73ffffffffffffffffffffffffffffffffffffffff1614611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890614c9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614afb565b60405180910390fd5b611edc838383612c93565b611ee7600082611c54565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f379190614fa5565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f8e9190614ec4565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61204f611c4c565b73ffffffffffffffffffffffffffffffffffffffff1661206d6114e1565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614c7b565b60405180910390fd5b50565b60006120d0612ceb565b90506120db84612d42565b6000835111806120e85750815b156120f9576120f78484612dfb565b505b60006121277f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b612edf565b90508060000160009054906101000a900460ff166122905760018160000160006101000a81548160ff0219169083151502179055506121f385836040516024016121719190614975565b6040516020818303038152906040527f3659cfe6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dfb565b5060008160000160006101000a81548160ff021916908315150217905550612219612ceb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614a9b565b60405180910390fd5b61228f85612ee9565b5b5050505050565b61229f610e32565b6122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590614a3b565b60405180910390fd5b600060c960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612322611c4c565b60405161232f9190614975565b60405180910390a1565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160fb60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060019054906101000a900460ff1680612425575060008054906101000a900460ff16155b612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156124b4576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6124bc612f38565b6124c4613011565b6124ce83836130ea565b80156124ef5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff168061251a575060008054906101000a900460ff16155b612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156125a9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6125b1612f38565b6125b9613011565b6125c16131f3565b80156125e25760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff168061260b575060008054906101000a900460ff16155b61264a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264190614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561269a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6126a2612f38565b6126aa6132cc565b80156126cb5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806126f4575060008054906101000a900460ff16155b612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015612783576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61278b612f38565b6127936133c0565b80156127b45760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806127dd575060008054906101000a900460ff16155b61281c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281390614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561286c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6128746134a9565b61287c613582565b801561289d5760008060016101000a81548160ff0219169083151502179055505b50565b6128a8610e32565b156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df90614b7b565b60405180910390fd5b600160c960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861292c611c4c565b6040516129399190614975565b60405180910390a1565b61295d82826040518060200160405280600081525061365b565b5050565b61296c848484611deb565b612978848484846136b6565b6129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae90614a7b565b60405180910390fd5b50505050565b606061019180546129cd9061508f565b80601f01602080910402602001604051908101604052809291908181526020018280546129f99061508f565b8015612a465780601f10612a1b57610100808354040283529160200191612a46565b820191906000526020600020905b815481529060010190602001808311612a2957829003601f168201915b5050505050905090565b60606000821415612a98576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bac565b600082905060005b60008214612aca578080612ab3906150f2565b915050600a82612ac39190614f1a565b9150612aa0565b60008167ffffffffffffffff811115612ae657612ae5615257565b5b6040519080825280601f01601f191660200182016040528015612b185781602001600182028036833780820191505090505b5090505b60008514612ba557600182612b319190614fa5565b9150600a85612b40919061513b565b6030612b4c9190614ec4565b60f81b818381518110612b6257612b61615228565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b9e9190614f1a565b9450612b1c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c7c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c8c5750612c8b8261384d565b5b9050919050565b612c9b610e32565b15612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd290614b7b565b60405180910390fd5b612ce68383836138b7565b505050565b6000612d197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6139cb565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612d4b816139d5565b612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190614c5b565b60405180910390fd5b80612db77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6139cb565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060612e06836139d5565b612e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3c90614d3b565b60405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1684604051612e6d919061493a565b600060405180830381855af49150503d8060008114612ea8576040519150601f19603f3d011682016040523d82523d6000602084013e612ead565b606091505b5091509150612ed58282604051806060016040528060278152602001615a28602791396139e8565b9250505092915050565b6000819050919050565b612ef281612d42565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b600060019054906101000a900460ff1680612f5e575060008054906101000a900460ff16155b612f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9490614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015612fed576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561300e5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613037575060008054906101000a900460ff16155b613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d90614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156130c6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156130e75760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613110575060008054906101000a900460ff16155b61314f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314690614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561319f576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b82606590805190602001906131b5929190613f28565b5081606690805190602001906131cc929190613f28565b5080156131ee5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680613219575060008054906101000a900460ff16155b613258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324f90614bfb565b60405180910390fd5b60008060019054906101000a900460ff1615905080156132a8576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156132c95760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806132f2575060008054906101000a900460ff16155b613331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332890614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613381576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600060c960006101000a81548160ff02191690831515021790555080156133bd5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806133e6575060008054906101000a900460ff16155b613425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341c90614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613475576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b613485613480611c4c565b612339565b80156134a65760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134cf575060008054906101000a900460ff16155b61350e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350590614bfb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561355e576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561357f5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806135a8575060008054906101000a900460ff16155b6135e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135de90614bfb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613637576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156136585760008060016101000a81548160ff0219169083151502179055505b50565b6136658383613a4f565b61367260008484846136b6565b6136b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a890614a7b565b60405180910390fd5b505050565b60006136d78473ffffffffffffffffffffffffffffffffffffffff166139d5565b15613840578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613700611c4c565b8786866040518563ffffffff1660e01b81526004016137229493929190614990565b602060405180830381600087803b15801561373c57600080fd5b505af192505050801561376d57506040513d601f19601f8201168201806040525081019061376a9190614360565b60015b6137f0573d806000811461379d576040519150601f19603f3d011682016040523d82523d6000602084013e6137a2565b606091505b506000815114156137e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137df90614a7b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613845565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138c2838383613c1d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139055761390081613c22565b613944565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613943576139428382613c6b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139875761398281613dd8565b6139c6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139c5576139c48282613ea9565b5b5b505050565b6000819050919050565b600080823b905060008111915050919050565b606083156139f857829050613a48565b600083511115613a0b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3f9190614a19565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab690614c1b565b60405180910390fd5b613ac881611be0565b15613b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aff90614adb565b60405180910390fd5b613b1460008383612c93565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b649190614ec4565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b609980549050609a600083815260200190815260200160002081905550609981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c7884610efb565b613c829190614fa5565b9050600060986000848152602001908152602001600020549050818114613d67576000609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080609760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816098600083815260200190815260200160002081905550505b6098600084815260200190815260200160002060009055609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001609980549050613dec9190614fa5565b90506000609a6000848152602001908152602001600020549050600060998381548110613e1c57613e1b615228565b5b906000526020600020015490508060998381548110613e3e57613e3d615228565b5b906000526020600020018190555081609a600083815260200190815260200160002081905550609a6000858152602001908152602001600020600090556099805480613e8d57613e8c6151f9565b5b6001900381819060005260206000200160009055905550505050565b6000613eb483610efb565b905081609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806098600084815260200190815260200160002081905550505050565b828054613f349061508f565b90600052602060002090601f016020900481019282613f565760008555613f9d565b82601f10613f6f57805160ff1916838001178555613f9d565b82800160010185558215613f9d579182015b82811115613f9c578251825591602001919060010190613f81565b5b509050613faa9190613fae565b5090565b5b80821115613fc7576000816000905550600101613faf565b5090565b6000613fde613fd984614ddb565b614db6565b905082815260208101848484011115613ffa57613ff961528b565b5b61400584828561504d565b509392505050565b600061402061401b84614e0c565b614db6565b90508281526020810184848401111561403c5761403b61528b565b5b61404784828561504d565b509392505050565b60008135905061405e816159aa565b92915050565b600081359050614073816159c1565b92915050565b600081359050614088816159d8565b92915050565b60008151905061409d816159d8565b92915050565b600082601f8301126140b8576140b7615286565b5b81356140c8848260208601613fcb565b91505092915050565b600082601f8301126140e6576140e5615286565b5b81356140f684826020860161400d565b91505092915050565b60008135905061410e816159ef565b92915050565b60006020828403121561412a57614129615295565b5b60006141388482850161404f565b91505092915050565b6000806040838503121561415857614157615295565b5b60006141668582860161404f565b92505060206141778582860161404f565b9150509250929050565b60008060006060848603121561419a57614199615295565b5b60006141a88682870161404f565b93505060206141b98682870161404f565b92505060406141ca868287016140ff565b9150509250925092565b600080600080608085870312156141ee576141ed615295565b5b60006141fc8782880161404f565b945050602061420d8782880161404f565b935050604061421e878288016140ff565b925050606085013567ffffffffffffffff81111561423f5761423e615290565b5b61424b878288016140a3565b91505092959194509250565b6000806040838503121561426e5761426d615295565b5b600061427c8582860161404f565b925050602061428d85828601614064565b9150509250929050565b600080604083850312156142ae576142ad615295565b5b60006142bc8582860161404f565b925050602083013567ffffffffffffffff8111156142dd576142dc615290565b5b6142e9858286016140a3565b9150509250929050565b6000806040838503121561430a57614309615295565b5b60006143188582860161404f565b9250506020614329858286016140ff565b9150509250929050565b60006020828403121561434957614348615295565b5b600061435784828501614079565b91505092915050565b60006020828403121561437657614375615295565b5b60006143848482850161408e565b91505092915050565b6000602082840312156143a3576143a2615295565b5b600082013567ffffffffffffffff8111156143c1576143c0615290565b5b6143cd848285016140d1565b91505092915050565b6000602082840312156143ec576143eb615295565b5b60006143fa848285016140ff565b91505092915050565b600061440f838361491c565b60208301905092915050565b61442481614fd9565b82525050565b600061443582614e4d565b61443f8185614e7b565b935061444a83614e3d565b8060005b8381101561447b5781516144628882614403565b975061446d83614e6e565b92505060018101905061444e565b5085935050505092915050565b61449181614feb565b82525050565b60006144a282614e58565b6144ac8185614e8c565b93506144bc81856020860161505c565b6144c58161529a565b840191505092915050565b60006144db82614e58565b6144e58185614e9d565b93506144f581856020860161505c565b80840191505092915050565b600061450c82614e63565b6145168185614ea8565b935061452681856020860161505c565b61452f8161529a565b840191505092915050565b600061454582614e63565b61454f8185614eb9565b935061455f81856020860161505c565b80840191505092915050565b6000614578601483614ea8565b9150614583826152ab565b602082019050919050565b600061459b602b83614ea8565b91506145a6826152d4565b604082019050919050565b60006145be603283614ea8565b91506145c982615323565b604082019050919050565b60006145e1602f83614ea8565b91506145ec82615372565b604082019050919050565b6000614604602683614ea8565b915061460f826153c1565b604082019050919050565b6000614627601c83614ea8565b915061463282615410565b602082019050919050565b600061464a602483614ea8565b915061465582615439565b604082019050919050565b600061466d601983614ea8565b915061467882615488565b602082019050919050565b6000614690602083614ea8565b915061469b826154b1565b602082019050919050565b60006146b3602c83614ea8565b91506146be826154da565b604082019050919050565b60006146d6601083614ea8565b91506146e182615529565b602082019050919050565b60006146f9603883614ea8565b915061470482615552565b604082019050919050565b600061471c602a83614ea8565b9150614727826155a1565b604082019050919050565b600061473f602983614ea8565b915061474a826155f0565b604082019050919050565b6000614762602e83614ea8565b915061476d8261563f565b604082019050919050565b6000614785602083614ea8565b91506147908261568e565b602082019050919050565b60006147a8602c83614ea8565b91506147b3826156b7565b604082019050919050565b60006147cb602d83614ea8565b91506147d682615706565b604082019050919050565b60006147ee602083614ea8565b91506147f982615755565b602082019050919050565b6000614811602983614ea8565b915061481c8261577e565b604082019050919050565b6000614834602f83614ea8565b915061483f826157cd565b604082019050919050565b6000614857602183614ea8565b91506148628261581c565b604082019050919050565b600061487a601f83614ea8565b91506148858261586b565b602082019050919050565b600061489d601683614ea8565b91506148a882615894565b602082019050919050565b60006148c0602683614ea8565b91506148cb826158bd565b604082019050919050565b60006148e3603183614ea8565b91506148ee8261590c565b604082019050919050565b6000614906602c83614ea8565b91506149118261595b565b604082019050919050565b61492581615043565b82525050565b61493481615043565b82525050565b600061494682846144d0565b915081905092915050565b600061495d828561453a565b9150614969828461453a565b91508190509392505050565b600060208201905061498a600083018461441b565b92915050565b60006080820190506149a5600083018761441b565b6149b2602083018661441b565b6149bf604083018561492b565b81810360608301526149d18184614497565b905095945050505050565b600060208201905081810360008301526149f6818461442a565b905092915050565b6000602082019050614a136000830184614488565b92915050565b60006020820190508181036000830152614a338184614501565b905092915050565b60006020820190508181036000830152614a548161456b565b9050919050565b60006020820190508181036000830152614a748161458e565b9050919050565b60006020820190508181036000830152614a94816145b1565b9050919050565b60006020820190508181036000830152614ab4816145d4565b9050919050565b60006020820190508181036000830152614ad4816145f7565b9050919050565b60006020820190508181036000830152614af48161461a565b9050919050565b60006020820190508181036000830152614b148161463d565b9050919050565b60006020820190508181036000830152614b3481614660565b9050919050565b60006020820190508181036000830152614b5481614683565b9050919050565b60006020820190508181036000830152614b74816146a6565b9050919050565b60006020820190508181036000830152614b94816146c9565b9050919050565b60006020820190508181036000830152614bb4816146ec565b9050919050565b60006020820190508181036000830152614bd48161470f565b9050919050565b60006020820190508181036000830152614bf481614732565b9050919050565b60006020820190508181036000830152614c1481614755565b9050919050565b60006020820190508181036000830152614c3481614778565b9050919050565b60006020820190508181036000830152614c548161479b565b9050919050565b60006020820190508181036000830152614c74816147be565b9050919050565b60006020820190508181036000830152614c94816147e1565b9050919050565b60006020820190508181036000830152614cb481614804565b9050919050565b60006020820190508181036000830152614cd481614827565b9050919050565b60006020820190508181036000830152614cf48161484a565b9050919050565b60006020820190508181036000830152614d148161486d565b9050919050565b60006020820190508181036000830152614d3481614890565b9050919050565b60006020820190508181036000830152614d54816148b3565b9050919050565b60006020820190508181036000830152614d74816148d6565b9050919050565b60006020820190508181036000830152614d94816148f9565b9050919050565b6000602082019050614db0600083018461492b565b92915050565b6000614dc0614dd1565b9050614dcc82826150c1565b919050565b6000604051905090565b600067ffffffffffffffff821115614df657614df5615257565b5b614dff8261529a565b9050602081019050919050565b600067ffffffffffffffff821115614e2757614e26615257565b5b614e308261529a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ecf82615043565b9150614eda83615043565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f0f57614f0e61516c565b5b828201905092915050565b6000614f2582615043565b9150614f3083615043565b925082614f4057614f3f61519b565b5b828204905092915050565b6000614f5682615043565b9150614f6183615043565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f9a57614f9961516c565b5b828202905092915050565b6000614fb082615043565b9150614fbb83615043565b925082821015614fce57614fcd61516c565b5b828203905092915050565b6000614fe482615023565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561507a57808201518184015260208101905061505f565b83811115615089576000848401525b50505050565b600060028204905060018216806150a757607f821691505b602082108114156150bb576150ba6151ca565b5b50919050565b6150ca8261529a565b810181811067ffffffffffffffff821117156150e9576150e8615257565b5b80604052505050565b60006150fd82615043565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151305761512f61516c565b5b600182019050919050565b600061514682615043565b915061515183615043565b9250826151615761516061519b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f45524331393637557067726164653a207570677261646520627265616b73206660008201527f7572746865722075706772616465730000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e6e6f742061646f7074206d6f7265207468616e20323020536869626173600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420457468657220666f722061646f7074696f6e00600082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6159b381614fd9565b81146159be57600080fd5b50565b6159ca81614feb565b81146159d557600080fd5b50565b6159e181614ff7565b81146159ec57600080fd5b50565b6159f881615043565b8114615a0357600080fd5b5056fe68747470733a2f2f73686162752e746f776e2f6170692f6e66742f73686962612f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204c219a5a248fc93f7d01c30a352a3480e9bdde6d4dddb52b58adddc6e72b1f9a64736f6c63430008070033

Deployed Bytecode Sourcemap

62504:3342:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63828:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23398:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24968:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24480:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64483:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37679:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25858:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64370:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37336:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61228:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63252:65;;;;;;;;;;;;;:::i;:::-;;26268:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65378:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61676:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37869:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64070:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44569:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23092:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22822:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47676:94;;;;;;;;;;;;;:::i;:::-;;62768:407;;;;;;;;;;;;;:::i;:::-;;63183:61;;;;;;;;;;;;;:::i;:::-;;65728:115;;;:::i;:::-;;64578:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47025:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64180:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23567:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64281:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25261:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26524:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23742:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65054:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25627:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47925:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63828:234;63989:4;64018:36;64042:11;64018:23;:36::i;:::-;64011:43;;63828:234;;;:::o;23398:100::-;23452:13;23485:5;23478:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23398:100;:::o;24968:221::-;25044:7;25072:16;25080:7;25072;:16::i;:::-;25064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25157:15;:24;25173:7;25157:24;;;;;;;;;;;;;;;;;;;;;25150:31;;24968:221;;;:::o;24480:422::-;24561:13;24577:34;24603:7;24577:25;:34::i;:::-;24561:50;;24636:5;24630:11;;:2;:11;;;;24622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24730:5;24714:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24739:37;24756:5;24763:12;:10;:12::i;:::-;24739:16;:37::i;:::-;24714:62;24692:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24873:21;24882:2;24886:7;24873:8;:21::i;:::-;24550:352;24480:422;;:::o;64483:87::-;64527:7;64553:9;;64546:16;;64483:87;:::o;37679:113::-;37740:7;37767:10;:17;;;;37760:24;;37679:113;:::o;25858:339::-;26053:41;26072:12;:10;:12::i;:::-;26086:7;26053:18;:41::i;:::-;26045:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26161:28;26171:4;26177:2;26181:7;26161:9;:28::i;:::-;25858:339;;;:::o;64370:105::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64455:12:::1;64443:9;:24;;;;64370:105:::0;:::o;37336:267::-;37433:7;37469:34;37497:5;37469:27;:34::i;:::-;37461:5;:42;37453:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;37569:12;:19;37582:5;37569:19;;;;;;;;;;;;;;;:26;37589:5;37569:26;;;;;;;;;;;;37562:33;;37336:267;;;;:::o;61228:189::-;61302:36;61320:17;61302;:36::i;:::-;61349:60;61373:17;61392:9;;;;;;;;;;;;61403:5;61349:23;:60::i;:::-;61228:189;:::o;63252:65::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63299:10:::1;:8;:10::i;:::-;63252:65::o:0;26268:185::-;26406:39;26423:4;26429:2;26433:7;26406:39;;;;;;;;;;;;:16;:39::i;:::-;26268:185;;;:::o;65378:342::-;65437:16;65466:18;65487:17;65497:6;65487:9;:17::i;:::-;65466:38;;65517:25;65559:10;65545:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65517:53;;65585:9;65581:106;65600:10;65596:1;:14;65581:106;;;65645:30;65665:6;65673:1;65645:19;:30::i;:::-;65631:8;65640:1;65631:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;65612:3;;;;;:::i;:::-;;;;65581:106;;;;65704:8;65697:15;;;;65378:342;;;:::o;61676:217::-;61784:36;61802:17;61784;:36::i;:::-;61831:54;61855:17;61874:4;61880;61831:23;:54::i;:::-;61676:217;;:::o;37869:244::-;37944:7;37980:41;:39;:41::i;:::-;37972:5;:49;37964:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;38088:10;38099:5;38088:17;;;;;;;;:::i;:::-;;;;;;;;;;38081:24;;37869:244;;;:::o;64070:102::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64157:7:::1;64141:13;:23;;;;;;;;;;;;:::i;:::-;;64070:102:::0;:::o;44569:86::-;44616:4;44640:7;;;;;;;;;;;44633:14;;44569:86;:::o;23092:239::-;23164:7;23184:13;23200:7;:16;23208:7;23200:16;;;;;;;;;;;;;;;;;;;;;23184:32;;23252:1;23235:19;;:5;:19;;;;23227:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23318:5;23311:12;;;23092:239;;;:::o;22822:208::-;22894:7;22939:1;22922:19;;:5;:19;;;;22914:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23006:9;:16;23016:5;23006:16;;;;;;;;;;;;;;;;22999:23;;22822:208;;;:::o;47676:94::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47741:21:::1;47759:1;47741:9;:21::i;:::-;47676:94::o:0;62768:407::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;62820:41:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:13:::1;:41::i;:::-;62872:25;:23;:25::i;:::-;62908:17;:15;:17::i;:::-;62936:16;:14;:16::i;:::-;62963:24;:22;:24::i;:::-;63000:51;;;;;;;;;;;;;;;;;:13;:51;;;;;;;;;;;;:::i;:::-;;63074:5;63062:9;:17;;;;63099:10;63090:6;:19;;;;63125:42;63120:2;;:47;;;;;;;;;;;;;;;;;;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;62768:407::o;63183:61::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63228:8:::1;:6;:8::i;:::-;63183:61::o:0;65728:115::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65803:2:::1;;;;;;;;;;;65795:16;;:39;65812:21;65795:39;;;;;;;;;;;;;;;;;;;;;;;65787:48;;;::::0;::::1;;65728:115::o:0;64578:468::-;64632:14;64649:13;:11;:13::i;:::-;64632:30;;64688:2;64682:3;:8;64673:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;64800:9;;64792:5;:17;;;;:::i;:::-;64786:3;64777:6;:12;;;;:::i;:::-;:32;64768:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;64884:3;64875:6;;:12;;;;:::i;:::-;64862:9;:25;;64853:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;64953:9;64949:90;64968:3;64964:1;:7;64949:90;;;64992:35;65003:10;65024:1;65015:6;:10;;;;:::i;:::-;64992:9;:35::i;:::-;64973:3;;;;;:::i;:::-;;;;64949:90;;;;64621:425;64578:468;:::o;47025:87::-;47071:7;47098:6;;;;;;;;;;;47091:13;;47025:87;:::o;64180:93::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64256:9:::1;64247:6;:18;;;;64180:93:::0;:::o;23567:104::-;23623:13;23656:7;23649:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23567:104;:::o;64281:81::-;64322:7;64348:6;;64341:13;;64281:81;:::o;25261:295::-;25376:12;:10;:12::i;:::-;25364:24;;:8;:24;;;;25356:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25476:8;25431:18;:32;25450:12;:10;:12::i;:::-;25431:32;;;;;;;;;;;;;;;:42;25464:8;25431:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25529:8;25500:48;;25515:12;:10;:12::i;:::-;25500:48;;;25539:8;25500:48;;;;;;:::i;:::-;;;;;;;;25261:295;;:::o;26524:328::-;26699:41;26718:12;:10;:12::i;:::-;26732:7;26699:18;:41::i;:::-;26691:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26805:39;26819:4;26825:2;26829:7;26838:5;26805:13;:39::i;:::-;26524:328;;;;:::o;23742:334::-;23815:13;23849:16;23857:7;23849;:16::i;:::-;23841:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23930:21;23954:10;:8;:10::i;:::-;23930:34;;24006:1;23988:7;23982:21;:25;:86;;;;;;;;;;;;;;;;;24034:7;24043:18;:7;:16;:18::i;:::-;24017:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23982:86;23975:93;;;23742:334;;;:::o;65054:316::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65154:9:::1;;65143:7;:20;;65134:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65215:7;65202:9;;:20;;;;;;;:::i;:::-;;;;;;;;65235:14;65252:13;:11;:13::i;:::-;65235:30;;65280:9;65276:87;65295:7;65291:1;:11;65276:87;;;65323:28;65334:3;65348:1;65339:6;:10;;;;:::i;:::-;65323:9;:28::i;:::-;65304:3;;;;;:::i;:::-;;;;65276:87;;;;65123:247;65054:316:::0;;:::o;25627:164::-;25724:4;25748:18;:25;25767:5;25748:25;;;;;;;;;;;;;;;:35;25774:8;25748:35;;;;;;;;;;;;;;;;;;;;;;;;;25741:42;;25627:164;;;;:::o;47925:192::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48034:1:::1;48014:22;;:8;:22;;;;48006:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48090:19;48100:8;48090:9;:19::i;:::-;47925:192:::0;:::o;36995:257::-;37119:4;37158:46;37143:61;;;:11;:61;;;;:101;;;;37208:36;37232:11;37208:23;:36::i;:::-;37143:101;37136:108;;36995:257;;;:::o;28362:127::-;28427:4;28479:1;28451:30;;:7;:16;28459:7;28451:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28444:37;;28362:127;;;:::o;17112:98::-;17165:7;17192:10;17185:17;;17112:98;:::o;32377:185::-;32479:2;32452:15;:24;32468:7;32452:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32546:7;32542:2;32497:57;;32506:34;32532:7;32506:25;:34::i;:::-;32497:57;;;;;;;;;;;;32377:185;;:::o;28656:359::-;28749:4;28774:16;28782:7;28774;:16::i;:::-;28766:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28850:13;28866:34;28892:7;28866:25;:34::i;:::-;28850:50;;28930:5;28919:16;;:7;:16;;;:51;;;;28963:7;28939:31;;:20;28951:7;28939:11;:20::i;:::-;:31;;;28919:51;:87;;;;28974:32;28991:5;28998:7;28974:16;:32::i;:::-;28919:87;28911:96;;;28656:359;;;;:::o;31670:589::-;31840:4;31802:42;;:34;31828:7;31802:25;:34::i;:::-;:42;;;31794:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;31923:1;31909:16;;:2;:16;;;;31901:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31979:39;32000:4;32006:2;32010:7;31979:20;:39::i;:::-;32083:29;32100:1;32104:7;32083:8;:29::i;:::-;32144:1;32125:9;:15;32135:4;32125:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32173:1;32156:9;:13;32166:2;32156:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32204:2;32185:7;:16;32193:7;32185:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32243:7;32239:2;32224:27;;32233:4;32224:27;;;;;;;;;;;;31670:589;;;:::o;63704:116::-;47256:12;:10;:12::i;:::-;47245:23;;:7;:5;:7::i;:::-;:23;;;47237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63704:116;:::o;54180:1268::-;54329:25;54357:20;:18;:20::i;:::-;54329:48;;54433:37;54452:17;54433:18;:37::i;:::-;54499:1;54485:4;:11;:15;:28;;;;54504:9;54485:28;54481:107;;;54530:46;54552:17;54571:4;54530:21;:46::i;:::-;;54481:107;54661:58;54722:53;52133:66;54760:14;;54722:37;:53::i;:::-;54661:114;;54791:15;:21;;;;;;;;;;;;54786:655;;54930:4;54906:15;:21;;;:28;;;;;;;;;;;;;;;;;;54949:155;54989:17;55071;55025:64;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54949:21;:155::i;:::-;;55143:5;55119:15;:21;;;:29;;;;;;;;;;;;;;;;;;55237:20;:18;:20::i;:::-;55216:41;;:17;:41;;;55208:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;55400:29;55411:17;55400:10;:29::i;:::-;54786:655;54318:1130;;54180:1268;;;:::o;45628:120::-;45172:8;:6;:8::i;:::-;45164:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45697:5:::1;45687:7;;:15;;;;;;;;;;;;;;;;;;45718:22;45727:12;:10;:12::i;:::-;45718:22;;;;;;:::i;:::-;;;;;;;;45628:120::o:0;48125:173::-;48181:16;48200:6;;;;;;;;;;;48181:25;;48226:8;48217:6;;:17;;;;;;;;;;;;;;;;;;48281:8;48250:40;;48271:8;48250:40;;;;;;;;;;;;48170:128;48125:173;:::o;21952:219::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;22051:26:::1;:24;:26::i;:::-;22088:25;:23;:25::i;:::-;22124:39;22148:5;22155:7;22124:23;:39::i;:::-;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;21952:219;;:::o;36186:183::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;36253:26:::1;:24;:26::i;:::-;36290:25;:23;:25::i;:::-;36326:35;:33;:35::i;:::-;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;36186:183::o;44238:131::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;44297:26:::1;:24;:26::i;:::-;44334:27;:25;:27::i;:::-;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;44238:131::o;46708:129::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;46766:26:::1;:24;:26::i;:::-;46803;:24;:26::i;:::-;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;46708:129::o;60808:152::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;60874:33:::1;:31;:33::i;:::-;60918:34;:32;:34::i;:::-;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;60808:152::o;45369:118::-;44895:8;:6;:8::i;:::-;44894:9;44886:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45439:4:::1;45429:7;;:14;;;;;;;;;;;;;;;;;;45459:20;45466:12;:10;:12::i;:::-;45459:20;;;;;;:::i;:::-;;;;;;;;45369:118::o:0;29357:110::-;29433:26;29443:2;29447:7;29433:26;;;;;;;;;;;;:9;:26::i;:::-;29357:110;;:::o;27734:315::-;27891:28;27901:4;27907:2;27911:7;27891:9;:28::i;:::-;27938:48;27961:4;27967:2;27971:7;27980:5;27938:22;:48::i;:::-;27930:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27734:315;;;;:::o;63325:114::-;63385:13;63418;63411:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63325:114;:::o;17701:723::-;17757:13;17987:1;17978:5;:10;17974:53;;;18005:10;;;;;;;;;;;;;;;;;;;;;17974:53;18037:12;18052:5;18037:20;;18068:14;18093:78;18108:1;18100:4;:9;18093:78;;18126:8;;;;;:::i;:::-;;;;18157:2;18149:10;;;;;:::i;:::-;;;18093:78;;;18181:19;18213:6;18203:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18181:39;;18231:154;18247:1;18238:5;:10;18231:154;;18275:1;18265:11;;;;;:::i;:::-;;;18342:2;18334:5;:10;;;;:::i;:::-;18321:2;:24;;;;:::i;:::-;18308:39;;18291:6;18298;18291:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18371:2;18362:11;;;;;:::i;:::-;;;18231:154;;;18409:6;18395:21;;;;;17701:723;;;;:::o;22409:349::-;22533:4;22585:36;22570:51;;;:11;:51;;;;:127;;;;22653:44;22638:59;;;:11;:59;;;;22570:127;:180;;;;22714:36;22738:11;22714:23;:36::i;:::-;22570:180;22550:200;;22409:349;;;:::o;63447:249::-;44895:8;:6;:8::i;:::-;44894:9;44886:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;63643:45:::1;63670:4;63676:2;63680:7;63643:26;:45::i;:::-;63447:249:::0;;;:::o;52762:153::-;52815:7;52842:59;52481:66;52880:20;;52842:37;:59::i;:::-;:65;;;;;;;;;;;;52835:72;;52762:153;:::o;53011:284::-;53093:48;53123:17;53093:29;:48::i;:::-;53085:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;53270:17;53202:59;52481:66;53240:20;;53202:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;53011:284;:::o;58717:443::-;58800:12;58833:37;58863:6;58833:29;:37::i;:::-;58825:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;58987:12;59001:23;59028:6;:19;;59048:4;59028:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58986:67;;;;59071:81;59089:7;59098:10;59071:81;;;;;;;;;;;;;;;;;:17;:81::i;:::-;59064:88;;;;58717:443;;;;:::o;50711:151::-;50772:21;50840:4;50830:14;;50711:151;;;:::o;53408:155::-;53475:37;53494:17;53475:18;:37::i;:::-;53537:17;53528:27;;;;;;;;;;;;53408:155;:::o;17041:65::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;16188:14;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;17041:65::o;20352:64::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;16188:14;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;20352:64::o;22179:158::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;22296:5:::1;22288;:13;;;;;;;;;;;;:::i;:::-;;22322:7;22312;:17;;;;;;;;;;;;:::i;:::-;;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;22179:158;;:::o;36377:74::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;16188:14;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;36377:74::o;44377:92::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;44456:5:::1;44446:7;;:15;;;;;;;;;;;;;;;;;;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;44377:92::o;46845:99::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;46913:23:::1;46923:12;:10;:12::i;:::-;46913:9;:23::i;:::-;16188:14:::0;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;46845:99::o;51933:72::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;16188:14;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;51933:72::o;60968:73::-;15916:13;;;;;;;;;;;:30;;;;15934:12;;;;;;;;;;15933:13;15916:30;15908:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;16010:19;16033:13;;;;;;;;;;;16032:14;16010:36;;16061:14;16057:101;;;16108:4;16092:13;;:20;;;;;;;;;;;;;;;;;;16142:4;16127:12;;:19;;;;;;;;;;;;;;;;;;16057:101;16188:14;16184:68;;;16235:5;16219:13;;:21;;;;;;;;;;;;;;;;;;16184:68;15897:362;60968:73::o;29694:321::-;29824:18;29830:2;29834:7;29824:5;:18::i;:::-;29875:54;29906:1;29910:2;29914:7;29923:5;29875:22;:54::i;:::-;29853:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29694:321;;;:::o;33127:825::-;33282:4;33303:15;:2;:13;;;:15::i;:::-;33299:646;;;33366:2;33339:47;;;33387:12;:10;:12::i;:::-;33401:4;33407:7;33416:5;33339:83;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33335:555;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33624:1;33607:6;:13;:18;33603:272;;;33650:60;;;;;;;;;;:::i;:::-;;;;;;;;33603:272;33825:6;33819:13;33810:6;33806:2;33802:15;33795:38;33335:555;33483:56;;;33473:66;;;:6;:66;;;;33466:73;;;;;33299:646;33929:4;33922:11;;33127:825;;;;;;;:::o;20486:168::-;20571:4;20610:36;20595:51;;;:11;:51;;;;20588:58;;20486:168;;;:::o;38726:589::-;38870:45;38897:4;38903:2;38907:7;38870:26;:45::i;:::-;38948:1;38932:18;;:4;:18;;;38928:187;;;38967:40;38999:7;38967:31;:40::i;:::-;38928:187;;;39037:2;39029:10;;:4;:10;;;39025:90;;39056:47;39089:4;39095:7;39056:32;:47::i;:::-;39025:90;38928:187;39143:1;39129:16;;:2;:16;;;39125:183;;;39162:45;39199:7;39162:36;:45::i;:::-;39125:183;;;39235:4;39229:10;;:2;:10;;;39225:83;;39256:40;39284:2;39288:7;39256:27;:40::i;:::-;39225:83;39125:183;38726:589;;;:::o;50457:151::-;50518:21;50586:4;50576:14;;50457:151;;;:::o;8295:387::-;8355:4;8563:12;8630:7;8618:20;8610:28;;8673:1;8666:4;:8;8659:15;;;8295:387;;;:::o;59168:742::-;59283:12;59312:7;59308:595;;;59343:10;59336:17;;;;59308:595;59477:1;59457:10;:17;:21;59453:439;;;59720:10;59714:17;59781:15;59768:10;59764:2;59760:19;59753:44;59453:439;59863:12;59856:20;;;;;;;;;;;:::i;:::-;;;;;;;;59168:742;;;;;;:::o;30351:382::-;30445:1;30431:16;;:2;:16;;;;30423:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30504:16;30512:7;30504;:16::i;:::-;30503:17;30495:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30566:45;30595:1;30599:2;30603:7;30566:20;:45::i;:::-;30641:1;30624:9;:13;30634:2;30624:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30672:2;30653:7;:16;30661:7;30653:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30717:7;30713:2;30692:33;;30709:1;30692:33;;;;;;;;;;;;30351:382;;:::o;34524:126::-;;;;:::o;40049:164::-;40153:10;:17;;;;40126:15;:24;40142:7;40126:24;;;;;;;;;;;:44;;;;40181:10;40197:7;40181:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40049:164;:::o;40840:999::-;41106:22;41167:1;41131:33;41159:4;41131:27;:33::i;:::-;:37;;;;:::i;:::-;41106:62;;41179:18;41200:17;:26;41218:7;41200:26;;;;;;;;;;;;41179:47;;41347:14;41333:10;:28;41329:328;;41378:19;41400:12;:18;41413:4;41400:18;;;;;;;;;;;;;;;:34;41419:14;41400:34;;;;;;;;;;;;41378:56;;41484:11;41451:12;:18;41464:4;41451:18;;;;;;;;;;;;;;;:30;41470:10;41451:30;;;;;;;;;;;:44;;;;41601:10;41568:17;:30;41586:11;41568:30;;;;;;;;;;;:43;;;;41363:294;41329:328;41753:17;:26;41771:7;41753:26;;;;;;;;;;;41746:33;;;41797:12;:18;41810:4;41797:18;;;;;;;;;;;;;;;:34;41816:14;41797:34;;;;;;;;;;;41790:41;;;40921:918;;40840:999;;:::o;42134:1079::-;42387:22;42432:1;42412:10;:17;;;;:21;;;;:::i;:::-;42387:46;;42444:18;42465:15;:24;42481:7;42465:24;;;;;;;;;;;;42444:45;;42816:19;42838:10;42849:14;42838:26;;;;;;;;:::i;:::-;;;;;;;;;;42816:48;;42902:11;42877:10;42888;42877:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43013:10;42982:15;:28;42998:11;42982:28;;;;;;;;;;;:41;;;;43154:15;:24;43170:7;43154:24;;;;;;;;;;;43147:31;;;43189:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42205:1008;;;42134:1079;:::o;39616:232::-;39701:14;39718:31;39746:2;39718:27;:31::i;:::-;39701:48;;39787:7;39760:12;:16;39773:2;39760:16;;;;;;;;;;;;;;;:24;39777:6;39760:24;;;;;;;;;;;:34;;;;39834:6;39805:17;:26;39823:7;39805:26;;;;;;;;;;;:35;;;;39690:158;39616:232;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:652::-;5217:6;5225;5274:2;5262:9;5253:7;5249:23;5245:32;5242:119;;;5280:79;;:::i;:::-;5242:119;5400:1;5425:53;5470:7;5461:6;5450:9;5446:22;5425:53;:::i;:::-;5415:63;;5371:117;5555:2;5544:9;5540:18;5527:32;5586:18;5578:6;5575:30;5572:117;;;5608:79;;:::i;:::-;5572:117;5713:62;5767:7;5758:6;5747:9;5743:22;5713:62;:::i;:::-;5703:72;;5498:287;5140:652;;;;;:::o;5798:474::-;5866:6;5874;5923:2;5911:9;5902:7;5898:23;5894:32;5891:119;;;5929:79;;:::i;:::-;5891:119;6049:1;6074:53;6119:7;6110:6;6099:9;6095:22;6074:53;:::i;:::-;6064:63;;6020:117;6176:2;6202:53;6247:7;6238:6;6227:9;6223:22;6202:53;:::i;:::-;6192:63;;6147:118;5798:474;;;;;:::o;6278:327::-;6336:6;6385:2;6373:9;6364:7;6360:23;6356:32;6353:119;;;6391:79;;:::i;:::-;6353:119;6511:1;6536:52;6580:7;6571:6;6560:9;6556:22;6536:52;:::i;:::-;6526:62;;6482:116;6278:327;;;;:::o;6611:349::-;6680:6;6729:2;6717:9;6708:7;6704:23;6700:32;6697:119;;;6735:79;;:::i;:::-;6697:119;6855:1;6880:63;6935:7;6926:6;6915:9;6911:22;6880:63;:::i;:::-;6870:73;;6826:127;6611:349;;;;:::o;6966:509::-;7035:6;7084:2;7072:9;7063:7;7059:23;7055:32;7052:119;;;7090:79;;:::i;:::-;7052:119;7238:1;7227:9;7223:17;7210:31;7268:18;7260:6;7257:30;7254:117;;;7290:79;;:::i;:::-;7254:117;7395:63;7450:7;7441:6;7430:9;7426:22;7395:63;:::i;:::-;7385:73;;7181:287;6966:509;;;;:::o;7481:329::-;7540:6;7589:2;7577:9;7568:7;7564:23;7560:32;7557:119;;;7595:79;;:::i;:::-;7557:119;7715:1;7740:53;7785:7;7776:6;7765:9;7761:22;7740:53;:::i;:::-;7730:63;;7686:117;7481:329;;;;:::o;7816:179::-;7885:10;7906:46;7948:3;7940:6;7906:46;:::i;:::-;7984:4;7979:3;7975:14;7961:28;;7816:179;;;;:::o;8001:118::-;8088:24;8106:5;8088:24;:::i;:::-;8083:3;8076:37;8001:118;;:::o;8155:732::-;8274:3;8303:54;8351:5;8303:54;:::i;:::-;8373:86;8452:6;8447:3;8373:86;:::i;:::-;8366:93;;8483:56;8533:5;8483:56;:::i;:::-;8562:7;8593:1;8578:284;8603:6;8600:1;8597:13;8578:284;;;8679:6;8673:13;8706:63;8765:3;8750:13;8706:63;:::i;:::-;8699:70;;8792:60;8845:6;8792:60;:::i;:::-;8782:70;;8638:224;8625:1;8622;8618:9;8613:14;;8578:284;;;8582:14;8878:3;8871:10;;8279:608;;;8155:732;;;;:::o;8893:109::-;8974:21;8989:5;8974:21;:::i;:::-;8969:3;8962:34;8893:109;;:::o;9008:360::-;9094:3;9122:38;9154:5;9122:38;:::i;:::-;9176:70;9239:6;9234:3;9176:70;:::i;:::-;9169:77;;9255:52;9300:6;9295:3;9288:4;9281:5;9277:16;9255:52;:::i;:::-;9332:29;9354:6;9332:29;:::i;:::-;9327:3;9323:39;9316:46;;9098:270;9008:360;;;;:::o;9374:373::-;9478:3;9506:38;9538:5;9506:38;:::i;:::-;9560:88;9641:6;9636:3;9560:88;:::i;:::-;9553:95;;9657:52;9702:6;9697:3;9690:4;9683:5;9679:16;9657:52;:::i;:::-;9734:6;9729:3;9725:16;9718:23;;9482:265;9374:373;;;;:::o;9753:364::-;9841:3;9869:39;9902:5;9869:39;:::i;:::-;9924:71;9988:6;9983:3;9924:71;:::i;:::-;9917:78;;10004:52;10049:6;10044:3;10037:4;10030:5;10026:16;10004:52;:::i;:::-;10081:29;10103:6;10081:29;:::i;:::-;10076:3;10072:39;10065:46;;9845:272;9753:364;;;;:::o;10123:377::-;10229:3;10257:39;10290:5;10257:39;:::i;:::-;10312:89;10394:6;10389:3;10312:89;:::i;:::-;10305:96;;10410:52;10455:6;10450:3;10443:4;10436:5;10432:16;10410:52;:::i;:::-;10487:6;10482:3;10478:16;10471:23;;10233:267;10123:377;;;;:::o;10506:366::-;10648:3;10669:67;10733:2;10728:3;10669:67;:::i;:::-;10662:74;;10745:93;10834:3;10745:93;:::i;:::-;10863:2;10858:3;10854:12;10847:19;;10506:366;;;:::o;10878:::-;11020:3;11041:67;11105:2;11100:3;11041:67;:::i;:::-;11034:74;;11117:93;11206:3;11117:93;:::i;:::-;11235:2;11230:3;11226:12;11219:19;;10878:366;;;:::o;11250:::-;11392:3;11413:67;11477:2;11472:3;11413:67;:::i;:::-;11406:74;;11489:93;11578:3;11489:93;:::i;:::-;11607:2;11602:3;11598:12;11591:19;;11250:366;;;:::o;11622:::-;11764:3;11785:67;11849:2;11844:3;11785:67;:::i;:::-;11778:74;;11861:93;11950:3;11861:93;:::i;:::-;11979:2;11974:3;11970:12;11963:19;;11622:366;;;:::o;11994:::-;12136:3;12157:67;12221:2;12216:3;12157:67;:::i;:::-;12150:74;;12233:93;12322:3;12233:93;:::i;:::-;12351:2;12346:3;12342:12;12335:19;;11994:366;;;:::o;12366:::-;12508:3;12529:67;12593:2;12588:3;12529:67;:::i;:::-;12522:74;;12605:93;12694:3;12605:93;:::i;:::-;12723:2;12718:3;12714:12;12707:19;;12366:366;;;:::o;12738:::-;12880:3;12901:67;12965:2;12960:3;12901:67;:::i;:::-;12894:74;;12977:93;13066:3;12977:93;:::i;:::-;13095:2;13090:3;13086:12;13079:19;;12738:366;;;:::o;13110:::-;13252:3;13273:67;13337:2;13332:3;13273:67;:::i;:::-;13266:74;;13349:93;13438:3;13349:93;:::i;:::-;13467:2;13462:3;13458:12;13451:19;;13110:366;;;:::o;13482:::-;13624:3;13645:67;13709:2;13704:3;13645:67;:::i;:::-;13638:74;;13721:93;13810:3;13721:93;:::i;:::-;13839:2;13834:3;13830:12;13823:19;;13482:366;;;:::o;13854:::-;13996:3;14017:67;14081:2;14076:3;14017:67;:::i;:::-;14010:74;;14093:93;14182:3;14093:93;:::i;:::-;14211:2;14206:3;14202:12;14195:19;;13854:366;;;:::o;14226:::-;14368:3;14389:67;14453:2;14448:3;14389:67;:::i;:::-;14382:74;;14465:93;14554:3;14465:93;:::i;:::-;14583:2;14578:3;14574:12;14567:19;;14226:366;;;:::o;14598:::-;14740:3;14761:67;14825:2;14820:3;14761:67;:::i;:::-;14754:74;;14837:93;14926:3;14837:93;:::i;:::-;14955:2;14950:3;14946:12;14939:19;;14598:366;;;:::o;14970:::-;15112:3;15133:67;15197:2;15192:3;15133:67;:::i;:::-;15126:74;;15209:93;15298:3;15209:93;:::i;:::-;15327:2;15322:3;15318:12;15311:19;;14970:366;;;:::o;15342:::-;15484:3;15505:67;15569:2;15564:3;15505:67;:::i;:::-;15498:74;;15581:93;15670:3;15581:93;:::i;:::-;15699:2;15694:3;15690:12;15683:19;;15342:366;;;:::o;15714:::-;15856:3;15877:67;15941:2;15936:3;15877:67;:::i;:::-;15870:74;;15953:93;16042:3;15953:93;:::i;:::-;16071:2;16066:3;16062:12;16055:19;;15714:366;;;:::o;16086:::-;16228:3;16249:67;16313:2;16308:3;16249:67;:::i;:::-;16242:74;;16325:93;16414:3;16325:93;:::i;:::-;16443:2;16438:3;16434:12;16427:19;;16086:366;;;:::o;16458:::-;16600:3;16621:67;16685:2;16680:3;16621:67;:::i;:::-;16614:74;;16697:93;16786:3;16697:93;:::i;:::-;16815:2;16810:3;16806:12;16799:19;;16458:366;;;:::o;16830:::-;16972:3;16993:67;17057:2;17052:3;16993:67;:::i;:::-;16986:74;;17069:93;17158:3;17069:93;:::i;:::-;17187:2;17182:3;17178:12;17171:19;;16830:366;;;:::o;17202:::-;17344:3;17365:67;17429:2;17424:3;17365:67;:::i;:::-;17358:74;;17441:93;17530:3;17441:93;:::i;:::-;17559:2;17554:3;17550:12;17543:19;;17202:366;;;:::o;17574:::-;17716:3;17737:67;17801:2;17796:3;17737:67;:::i;:::-;17730:74;;17813:93;17902:3;17813:93;:::i;:::-;17931:2;17926:3;17922:12;17915:19;;17574:366;;;:::o;17946:::-;18088:3;18109:67;18173:2;18168:3;18109:67;:::i;:::-;18102:74;;18185:93;18274:3;18185:93;:::i;:::-;18303:2;18298:3;18294:12;18287:19;;17946:366;;;:::o;18318:::-;18460:3;18481:67;18545:2;18540:3;18481:67;:::i;:::-;18474:74;;18557:93;18646:3;18557:93;:::i;:::-;18675:2;18670:3;18666:12;18659:19;;18318:366;;;:::o;18690:::-;18832:3;18853:67;18917:2;18912:3;18853:67;:::i;:::-;18846:74;;18929:93;19018:3;18929:93;:::i;:::-;19047:2;19042:3;19038:12;19031:19;;18690:366;;;:::o;19062:::-;19204:3;19225:67;19289:2;19284:3;19225:67;:::i;:::-;19218:74;;19301:93;19390:3;19301:93;:::i;:::-;19419:2;19414:3;19410:12;19403:19;;19062:366;;;:::o;19434:::-;19576:3;19597:67;19661:2;19656:3;19597:67;:::i;:::-;19590:74;;19673:93;19762:3;19673:93;:::i;:::-;19791:2;19786:3;19782:12;19775:19;;19434:366;;;:::o;19806:::-;19948:3;19969:67;20033:2;20028:3;19969:67;:::i;:::-;19962:74;;20045:93;20134:3;20045:93;:::i;:::-;20163:2;20158:3;20154:12;20147:19;;19806:366;;;:::o;20178:::-;20320:3;20341:67;20405:2;20400:3;20341:67;:::i;:::-;20334:74;;20417:93;20506:3;20417:93;:::i;:::-;20535:2;20530:3;20526:12;20519:19;;20178:366;;;:::o;20550:108::-;20627:24;20645:5;20627:24;:::i;:::-;20622:3;20615:37;20550:108;;:::o;20664:118::-;20751:24;20769:5;20751:24;:::i;:::-;20746:3;20739:37;20664:118;;:::o;20788:271::-;20918:3;20940:93;21029:3;21020:6;20940:93;:::i;:::-;20933:100;;21050:3;21043:10;;20788:271;;;;:::o;21065:435::-;21245:3;21267:95;21358:3;21349:6;21267:95;:::i;:::-;21260:102;;21379:95;21470:3;21461:6;21379:95;:::i;:::-;21372:102;;21491:3;21484:10;;21065:435;;;;;:::o;21506:222::-;21599:4;21637:2;21626:9;21622:18;21614:26;;21650:71;21718:1;21707:9;21703:17;21694:6;21650:71;:::i;:::-;21506:222;;;;:::o;21734:640::-;21929:4;21967:3;21956:9;21952:19;21944:27;;21981:71;22049:1;22038:9;22034:17;22025:6;21981:71;:::i;:::-;22062:72;22130:2;22119:9;22115:18;22106:6;22062:72;:::i;:::-;22144;22212:2;22201:9;22197:18;22188:6;22144:72;:::i;:::-;22263:9;22257:4;22253:20;22248:2;22237:9;22233:18;22226:48;22291:76;22362:4;22353:6;22291:76;:::i;:::-;22283:84;;21734:640;;;;;;;:::o;22380:373::-;22523:4;22561:2;22550:9;22546:18;22538:26;;22610:9;22604:4;22600:20;22596:1;22585:9;22581:17;22574:47;22638:108;22741:4;22732:6;22638:108;:::i;:::-;22630:116;;22380:373;;;;:::o;22759:210::-;22846:4;22884:2;22873:9;22869:18;22861:26;;22897:65;22959:1;22948:9;22944:17;22935:6;22897:65;:::i;:::-;22759:210;;;;:::o;22975:313::-;23088:4;23126:2;23115:9;23111:18;23103:26;;23175:9;23169:4;23165:20;23161:1;23150:9;23146:17;23139:47;23203:78;23276:4;23267:6;23203:78;:::i;:::-;23195:86;;22975:313;;;;:::o;23294:419::-;23460:4;23498:2;23487:9;23483:18;23475:26;;23547:9;23541:4;23537:20;23533:1;23522:9;23518:17;23511:47;23575:131;23701:4;23575:131;:::i;:::-;23567:139;;23294:419;;;:::o;23719:::-;23885:4;23923:2;23912:9;23908:18;23900:26;;23972:9;23966:4;23962:20;23958:1;23947:9;23943:17;23936:47;24000:131;24126:4;24000:131;:::i;:::-;23992:139;;23719:419;;;:::o;24144:::-;24310:4;24348:2;24337:9;24333:18;24325:26;;24397:9;24391:4;24387:20;24383:1;24372:9;24368:17;24361:47;24425:131;24551:4;24425:131;:::i;:::-;24417:139;;24144:419;;;:::o;24569:::-;24735:4;24773:2;24762:9;24758:18;24750:26;;24822:9;24816:4;24812:20;24808:1;24797:9;24793:17;24786:47;24850:131;24976:4;24850:131;:::i;:::-;24842:139;;24569:419;;;:::o;24994:::-;25160:4;25198:2;25187:9;25183:18;25175:26;;25247:9;25241:4;25237:20;25233:1;25222:9;25218:17;25211:47;25275:131;25401:4;25275:131;:::i;:::-;25267:139;;24994:419;;;:::o;25419:::-;25585:4;25623:2;25612:9;25608:18;25600:26;;25672:9;25666:4;25662:20;25658:1;25647:9;25643:17;25636:47;25700:131;25826:4;25700:131;:::i;:::-;25692:139;;25419:419;;;:::o;25844:::-;26010:4;26048:2;26037:9;26033:18;26025:26;;26097:9;26091:4;26087:20;26083:1;26072:9;26068:17;26061:47;26125:131;26251:4;26125:131;:::i;:::-;26117:139;;25844:419;;;:::o;26269:::-;26435:4;26473:2;26462:9;26458:18;26450:26;;26522:9;26516:4;26512:20;26508:1;26497:9;26493:17;26486:47;26550:131;26676:4;26550:131;:::i;:::-;26542:139;;26269:419;;;:::o;26694:::-;26860:4;26898:2;26887:9;26883:18;26875:26;;26947:9;26941:4;26937:20;26933:1;26922:9;26918:17;26911:47;26975:131;27101:4;26975:131;:::i;:::-;26967:139;;26694:419;;;:::o;27119:::-;27285:4;27323:2;27312:9;27308:18;27300:26;;27372:9;27366:4;27362:20;27358:1;27347:9;27343:17;27336:47;27400:131;27526:4;27400:131;:::i;:::-;27392:139;;27119:419;;;:::o;27544:::-;27710:4;27748:2;27737:9;27733:18;27725:26;;27797:9;27791:4;27787:20;27783:1;27772:9;27768:17;27761:47;27825:131;27951:4;27825:131;:::i;:::-;27817:139;;27544:419;;;:::o;27969:::-;28135:4;28173:2;28162:9;28158:18;28150:26;;28222:9;28216:4;28212:20;28208:1;28197:9;28193:17;28186:47;28250:131;28376:4;28250:131;:::i;:::-;28242:139;;27969:419;;;:::o;28394:::-;28560:4;28598:2;28587:9;28583:18;28575:26;;28647:9;28641:4;28637:20;28633:1;28622:9;28618:17;28611:47;28675:131;28801:4;28675:131;:::i;:::-;28667:139;;28394:419;;;:::o;28819:::-;28985:4;29023:2;29012:9;29008:18;29000:26;;29072:9;29066:4;29062:20;29058:1;29047:9;29043:17;29036:47;29100:131;29226:4;29100:131;:::i;:::-;29092:139;;28819:419;;;:::o;29244:::-;29410:4;29448:2;29437:9;29433:18;29425:26;;29497:9;29491:4;29487:20;29483:1;29472:9;29468:17;29461:47;29525:131;29651:4;29525:131;:::i;:::-;29517:139;;29244:419;;;:::o;29669:::-;29835:4;29873:2;29862:9;29858:18;29850:26;;29922:9;29916:4;29912:20;29908:1;29897:9;29893:17;29886:47;29950:131;30076:4;29950:131;:::i;:::-;29942:139;;29669:419;;;:::o;30094:::-;30260:4;30298:2;30287:9;30283:18;30275:26;;30347:9;30341:4;30337:20;30333:1;30322:9;30318:17;30311:47;30375:131;30501:4;30375:131;:::i;:::-;30367:139;;30094:419;;;:::o;30519:::-;30685:4;30723:2;30712:9;30708:18;30700:26;;30772:9;30766:4;30762:20;30758:1;30747:9;30743:17;30736:47;30800:131;30926:4;30800:131;:::i;:::-;30792:139;;30519:419;;;:::o;30944:::-;31110:4;31148:2;31137:9;31133:18;31125:26;;31197:9;31191:4;31187:20;31183:1;31172:9;31168:17;31161:47;31225:131;31351:4;31225:131;:::i;:::-;31217:139;;30944:419;;;:::o;31369:::-;31535:4;31573:2;31562:9;31558:18;31550:26;;31622:9;31616:4;31612:20;31608:1;31597:9;31593:17;31586:47;31650:131;31776:4;31650:131;:::i;:::-;31642:139;;31369:419;;;:::o;31794:::-;31960:4;31998:2;31987:9;31983:18;31975:26;;32047:9;32041:4;32037:20;32033:1;32022:9;32018:17;32011:47;32075:131;32201:4;32075:131;:::i;:::-;32067:139;;31794:419;;;:::o;32219:::-;32385:4;32423:2;32412:9;32408:18;32400:26;;32472:9;32466:4;32462:20;32458:1;32447:9;32443:17;32436:47;32500:131;32626:4;32500:131;:::i;:::-;32492:139;;32219:419;;;:::o;32644:::-;32810:4;32848:2;32837:9;32833:18;32825:26;;32897:9;32891:4;32887:20;32883:1;32872:9;32868:17;32861:47;32925:131;33051:4;32925:131;:::i;:::-;32917:139;;32644:419;;;:::o;33069:::-;33235:4;33273:2;33262:9;33258:18;33250:26;;33322:9;33316:4;33312:20;33308:1;33297:9;33293:17;33286:47;33350:131;33476:4;33350:131;:::i;:::-;33342:139;;33069:419;;;:::o;33494:::-;33660:4;33698:2;33687:9;33683:18;33675:26;;33747:9;33741:4;33737:20;33733:1;33722:9;33718:17;33711:47;33775:131;33901:4;33775:131;:::i;:::-;33767:139;;33494:419;;;:::o;33919:::-;34085:4;34123:2;34112:9;34108:18;34100:26;;34172:9;34166:4;34162:20;34158:1;34147:9;34143:17;34136:47;34200:131;34326:4;34200:131;:::i;:::-;34192:139;;33919:419;;;:::o;34344:::-;34510:4;34548:2;34537:9;34533:18;34525:26;;34597:9;34591:4;34587:20;34583:1;34572:9;34568:17;34561:47;34625:131;34751:4;34625:131;:::i;:::-;34617:139;;34344:419;;;:::o;34769:222::-;34862:4;34900:2;34889:9;34885:18;34877:26;;34913:71;34981:1;34970:9;34966:17;34957:6;34913:71;:::i;:::-;34769:222;;;;:::o;34997:129::-;35031:6;35058:20;;:::i;:::-;35048:30;;35087:33;35115:4;35107:6;35087:33;:::i;:::-;34997:129;;;:::o;35132:75::-;35165:6;35198:2;35192:9;35182:19;;35132:75;:::o;35213:307::-;35274:4;35364:18;35356:6;35353:30;35350:56;;;35386:18;;:::i;:::-;35350:56;35424:29;35446:6;35424:29;:::i;:::-;35416:37;;35508:4;35502;35498:15;35490:23;;35213:307;;;:::o;35526:308::-;35588:4;35678:18;35670:6;35667:30;35664:56;;;35700:18;;:::i;:::-;35664:56;35738:29;35760:6;35738:29;:::i;:::-;35730:37;;35822:4;35816;35812:15;35804:23;;35526:308;;;:::o;35840:132::-;35907:4;35930:3;35922:11;;35960:4;35955:3;35951:14;35943:22;;35840:132;;;:::o;35978:114::-;36045:6;36079:5;36073:12;36063:22;;35978:114;;;:::o;36098:98::-;36149:6;36183:5;36177:12;36167:22;;36098:98;;;:::o;36202:99::-;36254:6;36288:5;36282:12;36272:22;;36202:99;;;:::o;36307:113::-;36377:4;36409;36404:3;36400:14;36392:22;;36307:113;;;:::o;36426:184::-;36525:11;36559:6;36554:3;36547:19;36599:4;36594:3;36590:14;36575:29;;36426:184;;;;:::o;36616:168::-;36699:11;36733:6;36728:3;36721:19;36773:4;36768:3;36764:14;36749:29;;36616:168;;;;:::o;36790:147::-;36891:11;36928:3;36913:18;;36790:147;;;;:::o;36943:169::-;37027:11;37061:6;37056:3;37049:19;37101:4;37096:3;37092:14;37077:29;;36943:169;;;;:::o;37118:148::-;37220:11;37257:3;37242:18;;37118:148;;;;:::o;37272:305::-;37312:3;37331:20;37349:1;37331:20;:::i;:::-;37326:25;;37365:20;37383:1;37365:20;:::i;:::-;37360:25;;37519:1;37451:66;37447:74;37444:1;37441:81;37438:107;;;37525:18;;:::i;:::-;37438:107;37569:1;37566;37562:9;37555:16;;37272:305;;;;:::o;37583:185::-;37623:1;37640:20;37658:1;37640:20;:::i;:::-;37635:25;;37674:20;37692:1;37674:20;:::i;:::-;37669:25;;37713:1;37703:35;;37718:18;;:::i;:::-;37703:35;37760:1;37757;37753:9;37748:14;;37583:185;;;;:::o;37774:348::-;37814:7;37837:20;37855:1;37837:20;:::i;:::-;37832:25;;37871:20;37889:1;37871:20;:::i;:::-;37866:25;;38059:1;37991:66;37987:74;37984:1;37981:81;37976:1;37969:9;37962:17;37958:105;37955:131;;;38066:18;;:::i;:::-;37955:131;38114:1;38111;38107:9;38096:20;;37774:348;;;;:::o;38128:191::-;38168:4;38188:20;38206:1;38188:20;:::i;:::-;38183:25;;38222:20;38240:1;38222:20;:::i;:::-;38217:25;;38261:1;38258;38255:8;38252:34;;;38266:18;;:::i;:::-;38252:34;38311:1;38308;38304:9;38296:17;;38128:191;;;;:::o;38325:96::-;38362:7;38391:24;38409:5;38391:24;:::i;:::-;38380:35;;38325:96;;;:::o;38427:90::-;38461:7;38504:5;38497:13;38490:21;38479:32;;38427:90;;;:::o;38523:149::-;38559:7;38599:66;38592:5;38588:78;38577:89;;38523:149;;;:::o;38678:126::-;38715:7;38755:42;38748:5;38744:54;38733:65;;38678:126;;;:::o;38810:77::-;38847:7;38876:5;38865:16;;38810:77;;;:::o;38893:154::-;38977:6;38972:3;38967;38954:30;39039:1;39030:6;39025:3;39021:16;39014:27;38893:154;;;:::o;39053:307::-;39121:1;39131:113;39145:6;39142:1;39139:13;39131:113;;;39230:1;39225:3;39221:11;39215:18;39211:1;39206:3;39202:11;39195:39;39167:2;39164:1;39160:10;39155:15;;39131:113;;;39262:6;39259:1;39256:13;39253:101;;;39342:1;39333:6;39328:3;39324:16;39317:27;39253:101;39102:258;39053:307;;;:::o;39366:320::-;39410:6;39447:1;39441:4;39437:12;39427:22;;39494:1;39488:4;39484:12;39515:18;39505:81;;39571:4;39563:6;39559:17;39549:27;;39505:81;39633:2;39625:6;39622:14;39602:18;39599:38;39596:84;;;39652:18;;:::i;:::-;39596:84;39417:269;39366:320;;;:::o;39692:281::-;39775:27;39797:4;39775:27;:::i;:::-;39767:6;39763:40;39905:6;39893:10;39890:22;39869:18;39857:10;39854:34;39851:62;39848:88;;;39916:18;;:::i;:::-;39848:88;39956:10;39952:2;39945:22;39735:238;39692:281;;:::o;39979:233::-;40018:3;40041:24;40059:5;40041:24;:::i;:::-;40032:33;;40087:66;40080:5;40077:77;40074:103;;;40157:18;;:::i;:::-;40074:103;40204:1;40197:5;40193:13;40186:20;;39979:233;;;:::o;40218:176::-;40250:1;40267:20;40285:1;40267:20;:::i;:::-;40262:25;;40301:20;40319:1;40301:20;:::i;:::-;40296:25;;40340:1;40330:35;;40345:18;;:::i;:::-;40330:35;40386:1;40383;40379:9;40374:14;;40218:176;;;;:::o;40400:180::-;40448:77;40445:1;40438:88;40545:4;40542:1;40535:15;40569:4;40566:1;40559:15;40586:180;40634:77;40631:1;40624:88;40731:4;40728:1;40721:15;40755:4;40752:1;40745:15;40772:180;40820:77;40817:1;40810:88;40917:4;40914:1;40907:15;40941:4;40938:1;40931:15;40958:180;41006:77;41003:1;40996:88;41103:4;41100:1;41093:15;41127:4;41124:1;41117:15;41144:180;41192:77;41189:1;41182:88;41289:4;41286:1;41279:15;41313:4;41310:1;41303:15;41330:180;41378:77;41375:1;41368:88;41475:4;41472:1;41465:15;41499:4;41496:1;41489:15;41516:117;41625:1;41622;41615:12;41639:117;41748:1;41745;41738:12;41762:117;41871:1;41868;41861:12;41885:117;41994:1;41991;41984:12;42008:102;42049:6;42100:2;42096:7;42091:2;42084:5;42080:14;42076:28;42066:38;;42008:102;;;:::o;42116:170::-;42256:22;42252:1;42244:6;42240:14;42233:46;42116:170;:::o;42292:230::-;42432:34;42428:1;42420:6;42416:14;42409:58;42501:13;42496:2;42488:6;42484:15;42477:38;42292:230;:::o;42528:237::-;42668:34;42664:1;42656:6;42652:14;42645:58;42737:20;42732:2;42724:6;42720:15;42713:45;42528:237;:::o;42771:234::-;42911:34;42907:1;42899:6;42895:14;42888:58;42980:17;42975:2;42967:6;42963:15;42956:42;42771:234;:::o;43011:225::-;43151:34;43147:1;43139:6;43135:14;43128:58;43220:8;43215:2;43207:6;43203:15;43196:33;43011:225;:::o;43242:178::-;43382:30;43378:1;43370:6;43366:14;43359:54;43242:178;:::o;43426:223::-;43566:34;43562:1;43554:6;43550:14;43543:58;43635:6;43630:2;43622:6;43618:15;43611:31;43426:223;:::o;43655:175::-;43795:27;43791:1;43783:6;43779:14;43772:51;43655:175;:::o;43836:182::-;43976:34;43972:1;43964:6;43960:14;43953:58;43836:182;:::o;44024:231::-;44164:34;44160:1;44152:6;44148:14;44141:58;44233:14;44228:2;44220:6;44216:15;44209:39;44024:231;:::o;44261:166::-;44401:18;44397:1;44389:6;44385:14;44378:42;44261:166;:::o;44433:243::-;44573:34;44569:1;44561:6;44557:14;44550:58;44642:26;44637:2;44629:6;44625:15;44618:51;44433:243;:::o;44682:229::-;44822:34;44818:1;44810:6;44806:14;44799:58;44891:12;44886:2;44878:6;44874:15;44867:37;44682:229;:::o;44917:228::-;45057:34;45053:1;45045:6;45041:14;45034:58;45126:11;45121:2;45113:6;45109:15;45102:36;44917:228;:::o;45151:233::-;45291:34;45287:1;45279:6;45275:14;45268:58;45360:16;45355:2;45347:6;45343:15;45336:41;45151:233;:::o;45390:182::-;45530:34;45526:1;45518:6;45514:14;45507:58;45390:182;:::o;45578:231::-;45718:34;45714:1;45706:6;45702:14;45695:58;45787:14;45782:2;45774:6;45770:15;45763:39;45578:231;:::o;45815:232::-;45955:34;45951:1;45943:6;45939:14;45932:58;46024:15;46019:2;46011:6;46007:15;46000:40;45815:232;:::o;46053:182::-;46193:34;46189:1;46181:6;46177:14;46170:58;46053:182;:::o;46241:228::-;46381:34;46377:1;46369:6;46365:14;46358:58;46450:11;46445:2;46437:6;46433:15;46426:36;46241:228;:::o;46475:234::-;46615:34;46611:1;46603:6;46599:14;46592:58;46684:17;46679:2;46671:6;46667:15;46660:42;46475:234;:::o;46715:220::-;46855:34;46851:1;46843:6;46839:14;46832:58;46924:3;46919:2;46911:6;46907:15;46900:28;46715:220;:::o;46941:181::-;47081:33;47077:1;47069:6;47065:14;47058:57;46941:181;:::o;47128:172::-;47268:24;47264:1;47256:6;47252:14;47245:48;47128:172;:::o;47306:225::-;47446:34;47442:1;47434:6;47430:14;47423:58;47515:8;47510:2;47502:6;47498:15;47491:33;47306:225;:::o;47537:236::-;47677:34;47673:1;47665:6;47661:14;47654:58;47746:19;47741:2;47733:6;47729:15;47722:44;47537:236;:::o;47779:231::-;47919:34;47915:1;47907:6;47903:14;47896:58;47988:14;47983:2;47975:6;47971:15;47964:39;47779:231;:::o;48016:122::-;48089:24;48107:5;48089:24;:::i;:::-;48082:5;48079:35;48069:63;;48128:1;48125;48118:12;48069:63;48016:122;:::o;48144:116::-;48214:21;48229:5;48214:21;:::i;:::-;48207:5;48204:32;48194:60;;48250:1;48247;48240:12;48194:60;48144:116;:::o;48266:120::-;48338:23;48355:5;48338:23;:::i;:::-;48331:5;48328:34;48318:62;;48376:1;48373;48366:12;48318:62;48266:120;:::o;48392:122::-;48465:24;48483:5;48465:24;:::i;:::-;48458:5;48455:35;48445:63;;48504:1;48501;48494:12;48445:63;48392:122;:::o

Swarm Source

ipfs://4c219a5a248fc93f7d01c30a352a3480e9bdde6d4dddb52b58adddc6e72b1f9a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.