ETH Price: $3,917.51 (+0.88%)

Crazy Cookie (CC)
 

Overview

TokenID

10

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CrazyCookie

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



// File: @openzeppelin/contracts/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}
// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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



pragma solidity ^0.8.0;


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

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

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

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




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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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



pragma solidity ^0.8.0;

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

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





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





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



pragma solidity ^0.8.0;









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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol



pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: cmain.sol


pragma solidity ^0.8.0;








interface ICCData {
    function getImg(uint256) external view returns(string memory);
}

contract CrazyCookie is ERC721Enumerable, Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using Strings for uint256;
    using Counters for Counters.Counter;
    
    ICCData public ccData;

    uint256 public max_supply = 3333;
    uint256 public mint_price = 50000000000000000;
    string private _contractURI;

    address payable admin;

    ProxyRegistry private _proxyRegistry;
    Counters.Counter private _tokenIds;

    string[] public A = ["One","He","She","An influencer","A moonboy","A paper hand"];
    string[] public B = ["who","whom","that","which"];
    string[] public C = ["sleeps","runs","dives","jogs","farts","coughs","wears","thinks","fidgets","masticates","fights","looks","over looks","judges","tweets","trades","hodls","shorts","slides","slips","smells","solves","speaks","stirs","swears","tiptoes","disagrees","denys","promises","realises","appears","impresses","imagines","satisfies","doubts","involves","changes","speculates"];
    string[] public D = ["too","more","most","least","best","worst"];
    string[] public E = ["quickly","loudly","grumbly","abruptly","long","short","frequently","often","usually","generally","occasionally","rarely","normally","secretly","easily","carefully","quietly","specifically","cheerfully","strongly","worriedly","wishfully","eagerly","badly","poorly","barely"];
    string[] public F = ["will soon find","will soon discover","will soon seek","will soon loose"];
    string[] public G = ["great","terrible","considerable","enormous","extreme","huge","immense","strong","tremendous","vast","abundant","ample","insufficiant","limited","meager","scant","slight","diminutive","dinky","infintesimal","their"];
    string[] public H = ["wealth","affluence","cash","property","prosperity","revenue","riches","richness","security","treasure","crypto","worth","assets","belogings","capital","substance","desire","life"];

    modifier onlyAdmin() {
        require(admin == msg.sender, "Only Admin allowed");
        _;
    }

    constructor(
        address _ccData,
        address payable _admin,
        address openseaProxyRegistry_
    ) ERC721("Crazy Cookie", "CC") {
        ccData = ICCData(_ccData);
        admin = _admin;
        if (address(0) != openseaProxyRegistry_) {
            _setOpenSeaRegistry(openseaProxyRegistry_);
        }
    }

    function mint(uint256 _amount) public payable nonReentrant {
        require(uint256(mint_price).mul(_amount) == msg.value);
        require(_amount <= 5);
        require(
            _tokenIds.current().add(_amount) <= max_supply
        );
        for (uint256 i = 0; i < _amount; i++) {
            _tokenIds.increment();
            uint256 newNftTokenId = _tokenIds.current();
            _safeMint(msg.sender, newNftTokenId);
        }
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_tokenId));
        string memory t1;
        string memory t2;
        (t1, t2) = getFortune(_tokenId);
        string memory svgData = string(
            abi.encodePacked(
                "<svg width='1024' height='1024' preserveAspectRatio='xMinYMin meet' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>",
                "<defs><filter id='c'><feImage x='0' y='0' height='1024px' width='1024px' ",
                "xlink:href='data:image/svg+xml;base64,",
                ccData.getImg(_tokenId),
                "'/></filter></defs>",
                "<rect x='0' y='0' height='1024' width='1024' style='filter:url(#c);' />",
                "<text x='508' y='515' font-size='1.25em' transform='translate(-30,30) rotate(-5)' textLength='440'>",
                t1,
                "</text>",
                "<text x='508' y='550' font-size='1.25em' transform='translate(-30,30) rotate(-5)' textLength='440'>",
                t2,
                "</text>",
                "<text x='680' y='590' font-size='1.25em' transform='translate(-30,30) rotate(-5)' textLength='265'>Lucky Numbers: ",
                _tokenId.toString(),
                " - ",
                ((determineInt(string(abi.encodePacked("Lucky2", _tokenId.toString()))) % 9999) + 1).toString(),
                " - ",
                ((determineInt(string(abi.encodePacked("Lucky3", _tokenId.toString()))) % 9999) + 1).toString(),
                "</text>",
                "</svg>"
            )
        );
        return
            string(
                abi.encodePacked(
                   'data:application/json;utf8,{"name":"Fortune #',
                    _tokenId.toString(),
                    '","image":"data:image/svg+xml;utf8,',
                    svgData,
                    '"}'
                )
            );
    }

    function determineInt(string memory _in) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(_in)));
    }

    function getFortune(uint256 _tokenId)
        public
        view
        returns (string memory, string memory)
    {
        string memory tokenStr = _tokenId.toString();
        string memory f1 = "";
        string memory f2 = "";
        f1 = concat(
            f1,
            A[
                (determineInt(
                    string(abi.encodePacked("A", tokenStr))
                ) % A.length)
            ]
        );
        f1 = concat(f1, " ");
        f1 = concat(
            f1,
            B[
                (determineInt(
                    string(abi.encodePacked("B", tokenStr))
                ) % B.length)
            ]
        );
        f1 = concat(f1, " ");
        f1 = concat(
            f1,
            C[
                (determineInt(
                    string(abi.encodePacked("C", tokenStr))
                ) % C.length)
            ]
        );
        f1 = concat(f1, " ");
        f1 = concat(
            f1,
            D[
                (determineInt(
                    string(abi.encodePacked("D", tokenStr))
                ) % D.length)
            ]
        );
        f2 = concat(
            f2,
            E[
                (determineInt(
                    string(abi.encodePacked("E", tokenStr))
                ) % E.length)
            ]
        );
        f2 = concat(f2, " ");
        f2 = concat(
            f2,
            F[
                (determineInt(
                    string(abi.encodePacked("F", tokenStr))
                ) % F.length)
            ]
        );
        f2 = concat(f2, " ");
        f2 = concat(
            f2,
            G[
                (determineInt(
                    string(abi.encodePacked("G", tokenStr))
                ) % G.length)
            ]
        );
        f2 = concat(f2, " ");
        f2 = concat(
            f2,
            H[
                (determineInt(
                    string(abi.encodePacked("H", tokenStr))
                ) % H.length)
            ]
        );
        f2 = concat(f2, " ");
        return (f1, f2);
    }

    function updateCCData(address _ccData) public onlyAdmin {
        ccData = ICCData(_ccData);
    }

    function concat(string memory _base, string memory _value)
        internal
        pure
        returns (string memory)
    {
        bytes memory _baseBytes = bytes(_base);
        bytes memory _valueBytes = bytes(_value);

        string memory _tmpValue = new string(
            _baseBytes.length + _valueBytes.length
        );
        bytes memory _newValue = bytes(_tmpValue);

        uint256 i;
        uint256 j;

        for (i = 0; i < _baseBytes.length; i++) {
            _newValue[j++] = _baseBytes[i];
        }

        for (i = 0; i < _valueBytes.length; i++) {
            _newValue[j++] = _valueBytes[i];
        }

        return string(_newValue);
    }

    function withdraw(uint256 amount) external payable onlyAdmin {
        require(amount <= address(this).balance);    
        admin.call{value:address(this).balance}('');
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function isOwnersOpenSeaProxy(address owner, address operator)
        public
        view
        returns (bool)
    {
        ProxyRegistry proxyRegistry = _proxyRegistry;
        return
            address(proxyRegistry) != address(0) &&
            address(proxyRegistry.proxies(owner)) == operator;
    }

    function _setOpenSeaRegistry(address proxyRegistryAddress) internal {
        _proxyRegistry = ProxyRegistry(proxyRegistryAddress);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        if (isOwnersOpenSeaProxy(owner, operator)) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    function setOpenSeaRegistry(address proxyRegistryAddress)
        external
        onlyAdmin
    {
        _proxyRegistry = ProxyRegistry(proxyRegistryAddress);
    }

}

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_ccData","type":"address"},{"internalType":"address payable","name":"_admin","type":"address"},{"internalType":"address","name":"openseaProxyRegistry_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"A","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"B","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"C","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"D","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"E","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"F","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"G","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"H","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccData","outputs":[{"internalType":"contract ICCData","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFortune","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isOwnersOpenSeaProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"address","name":"proxyRegistryAddress","type":"address"}],"name":"setOpenSeaRegistry","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":[{"internalType":"address","name":"_ccData","type":"address"}],"name":"updateCCData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052610d05600d5566b1a2bc2ec50000600e556040518060c001604052806040518060400160405280600381526020017f4f6e65000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f486500000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f536865000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f416e20696e666c75656e6365720000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41206d6f6f6e626f79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f412070617065722068616e64000000000000000000000000000000000000000081525081525060139060066200019292919062002031565b5060405180608001604052806040518060400160405280600381526020017f77686f000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f77686f6d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f746861740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776869636800000000000000000000000000000000000000000000000000000081525081525060149060046200029a92919062002098565b50604051806104c001604052806040518060400160405280600681526020017f736c65657073000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f72756e730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f646976657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6a6f67730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f666172747300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f636f75676873000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776561727300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f7468696e6b73000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f666964676574730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6d6173746963617465730000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666967687473000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c6f6f6b7300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6f766572206c6f6f6b730000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6a7564676573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f747765657473000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f747261646573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f686f646c7300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f73686f727473000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736c69646573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736c69707300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736d656c6c73000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736f6c766573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f737065616b73000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f737469727300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f737765617273000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f746970746f65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f646973616772656573000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64656e797300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f70726f6d6973657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f7265616c6973657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f617070656172730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f696d70726573736573000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f696d6167696e657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f736174697366696573000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f646f75627473000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f696e766f6c76657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6368616e6765730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f73706563756c6174657300000000000000000000000000000000000000000000815250815250601590602662000b79929190620020ff565b506040518060c001604052806040518060400160405280600381526020017f746f6f000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d6f72650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d6f73740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c6561737400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626573740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776f727374000000000000000000000000000000000000000000000000000000815250815250601690600662000cf792919062002031565b506040518061034001604052806040518060400160405280600781526020017f717569636b6c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6c6f75646c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6772756d626c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6162727570746c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6c6f6e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f73686f727400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6672657175656e746c790000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6f6674656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f757375616c6c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f67656e6572616c6c79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f63636173696f6e616c6c79000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f726172656c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6e6f726d616c6c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f7365637265746c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f656173696c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6361726566756c6c79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f71756965746c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f7370656369666963616c6c79000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f636865657266756c6c790000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f7374726f6e676c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f776f72726965646c79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f7769736866756c6c79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f65616765726c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6261646c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f706f6f726c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f626172656c790000000000000000000000000000000000000000000000000000815250815250601790601a6200131292919062002166565b5060405180608001604052806040518060400160405280600e81526020017f77696c6c20736f6f6e2066696e6400000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f77696c6c20736f6f6e20646973636f766572000000000000000000000000000081525081526020016040518060400160405280600e81526020017f77696c6c20736f6f6e207365656b00000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f77696c6c20736f6f6e206c6f6f7365000000000000000000000000000000000081525081525060189060046200141a92919062002098565b50604051806102a001604052806040518060400160405280600581526020017f677265617400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f7465727269626c6500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f636f6e736964657261626c65000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f656e6f726d6f757300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f65787472656d650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f687567650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f696d6d656e73650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f7374726f6e67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f7472656d656e646f75730000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f766173740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6162756e64616e7400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616d706c6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f696e73756666696369616e74000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6c696d697465640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6d6561676572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f7363616e7400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736c69676874000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f64696d696e75746976650000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64696e6b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f696e66696e746573696d616c000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746865697200000000000000000000000000000000000000000000000000000081525081525060199060156200190e929190620021cd565b506040518061024001604052806040518060400160405280600681526020017f7765616c7468000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6166666c75656e6365000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f636173680000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f70726f706572747900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f70726f737065726974790000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f726576656e75650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f726963686573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f726963686e65737300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f736563757269747900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f747265617375726500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f63727970746f000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776f72746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f617373657473000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f62656c6f67696e6773000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6361706974616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f7375627374616e6365000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f646573697265000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6c69666500000000000000000000000000000000000000000000000000000000815250815250601a90601262001d5192919062002234565b5034801562001d5f57600080fd5b506040516200848c3803806200848c833981810160405281019062001d859190620023e7565b6040518060400160405280600c81526020017f4372617a7920436f6f6b696500000000000000000000000000000000000000008152506040518060400160405280600281526020017f4343000000000000000000000000000000000000000000000000000000000000815250816000908051906020019062001e099291906200229b565b50806001908051906020019062001e229291906200229b565b50505062001e4562001e3962001f1f60201b60201c565b62001f2760201b60201c565b6001600b8190555082600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161462001f165762001f158162001fed60201b60201c565b5b50505062002529565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b82805482825590600052602060002090810192821562002085579160200282015b8281111562002084578251829080519060200190620020739291906200229b565b509160200191906001019062002052565b5b5090506200209491906200232c565b5090565b828054828255906000526020600020908101928215620020ec579160200282015b82811115620020eb578251829080519060200190620020da9291906200229b565b5091602001919060010190620020b9565b5b509050620020fb91906200232c565b5090565b82805482825590600052602060002090810192821562002153579160200282015b8281111562002152578251829080519060200190620021419291906200229b565b509160200191906001019062002120565b5b5090506200216291906200232c565b5090565b828054828255906000526020600020908101928215620021ba579160200282015b82811115620021b9578251829080519060200190620021a89291906200229b565b509160200191906001019062002187565b5b509050620021c991906200232c565b5090565b82805482825590600052602060002090810192821562002221579160200282015b82811115620022205782518290805190602001906200220f9291906200229b565b5091602001919060010190620021ee565b5b5090506200223091906200232c565b5090565b82805482825590600052602060002090810192821562002288579160200282015b8281111562002287578251829080519060200190620022769291906200229b565b509160200191906001019062002255565b5b5090506200229791906200232c565b5090565b828054620022a9906200248b565b90600052602060002090601f016020900481019282620022cd576000855562002319565b82601f10620022e857805160ff191683800117855562002319565b8280016001018555821562002319579182015b8281111562002318578251825591602001919060010190620022fb565b5b50905062002328919062002354565b5090565b5b8082111562002350576000818162002346919062002373565b506001016200232d565b5090565b5b808211156200236f57600081600090555060010162002355565b5090565b50805462002381906200248b565b6000825580601f10620023955750620023b6565b601f016020900490600052602060002090810190620023b5919062002354565b5b50565b600081519050620023ca81620024f5565b92915050565b600081519050620023e1816200250f565b92915050565b600080600060608486031215620024035762002402620024f0565b5b60006200241386828701620023b9565b93505060206200242686828701620023d0565b92505060406200243986828701620023b9565b9150509250925092565b600062002450826200246b565b9050919050565b600062002464826200246b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620024a457607f821691505b60208210811415620024bb57620024ba620024c1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620025008162002443565b81146200250c57600080fd5b50565b6200251a8162002457565b81146200252657600080fd5b50565b615f5380620025396000396000f3fe6080604052600436106102195760003560e01c80637cb63ec811610123578063b5f49759116100ab578063e2314d851161006f578063e2314d851461085f578063e2b687961461088a578063e8a3d485146108c7578063e985e9c5146108f2578063f2fde38b1461092f57610219565b8063b5f4975914610756578063b88d4fde1461077f578063bb314009146107a8578063c87b56dd146107e5578063dac0eb071461082257610219565b80638da5cb5b116100f25780638da5cb5b1461067e57806395d89b41146106a9578063a0712d68146106d4578063a17a9e66146106f0578063a22cb4651461072d57610219565b80637cb63ec8146105b05780638a333b50146105ed5780638c273de4146106185780638d949c8b1461064157610219565b80632f745c59116101a65780636102de98116101755780636102de98146104a55780636352211e146104e25780636e9ed8cf1461051f57806370a082311461055c578063715018a61461059957610219565b80632f745c59146103c45780632fdd653e1461040157806342842e0e1461043f5780634f6ccce71461046857610219565b8063095ea7b3116101ed578063095ea7b31461030057806318160ddd146103295780631a4231a41461035457806323b872dd1461037f5780632e1a7d4d146103a857610219565b80622ff0671461021e57806301ffc9a71461025b57806306fdde0314610298578063081812fc146102c3575b600080fd5b34801561022a57600080fd5b506102456004803603810190610240919061407c565b610958565b6040516102529190614ae0565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613fac565b610a04565b60405161028f9190614aaa565b60405180910390f35b3480156102a457600080fd5b506102ad610a7e565b6040516102ba9190614ae0565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e5919061407c565b610b10565b6040516102f79190614a43565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190613f6c565b610b95565b005b34801561033557600080fd5b5061033e610cad565b60405161034b9190614d99565b60405180910390f35b34801561036057600080fd5b50610369610cba565b6040516103769190614d99565b60405180910390f35b34801561038b57600080fd5b506103a660048036038101906103a19190613e56565b610cc0565b005b6103c260048036038101906103bd919061407c565b610d20565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613f6c565b610e4b565b6040516103f89190614d99565b60405180910390f35b34801561040d57600080fd5b506104286004803603810190610423919061407c565b610ef0565b604051610436929190614b02565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613e56565b61183d565b005b34801561047457600080fd5b5061048f600480360381019061048a919061407c565b61185d565b60405161049c9190614d99565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190613e16565b6118ce565b6040516104d99190614aaa565b60405180910390f35b3480156104ee57600080fd5b506105096004803603810190610504919061407c565b6119ef565b6040516105169190614a43565b60405180910390f35b34801561052b57600080fd5b506105466004803603810190610541919061407c565b611aa1565b6040516105539190614ae0565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613de9565b611b4d565b6040516105909190614d99565b60405180910390f35b3480156105a557600080fd5b506105ae611c05565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061407c565b611c8d565b6040516105e49190614ae0565b60405180910390f35b3480156105f957600080fd5b50610602611d39565b60405161060f9190614d99565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a9190613de9565b611d3f565b005b34801561064d57600080fd5b506106686004803603810190610663919061407c565b611e13565b6040516106759190614ae0565b60405180910390f35b34801561068a57600080fd5b50610693611ebf565b6040516106a09190614a43565b60405180910390f35b3480156106b557600080fd5b506106be611ee9565b6040516106cb9190614ae0565b60405180910390f35b6106ee60048036038101906106e9919061407c565b611f7b565b005b3480156106fc57600080fd5b506107176004803603810190610712919061407c565b61206e565b6040516107249190614ae0565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f9190613f2c565b61211a565b005b34801561076257600080fd5b5061077d60048036038101906107789190613de9565b61229b565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613ea9565b61236f565b005b3480156107b457600080fd5b506107cf60048036038101906107ca919061407c565b6123d1565b6040516107dc9190614ae0565b60405180910390f35b3480156107f157600080fd5b5061080c6004803603810190610807919061407c565b61247d565b6040516108199190614ae0565b60405180910390f35b34801561082e57600080fd5b506108496004803603810190610844919061407c565b61265e565b6040516108569190614ae0565b60405180910390f35b34801561086b57600080fd5b5061087461270a565b6040516108819190614ac5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061407c565b612730565b6040516108be9190614ae0565b60405180910390f35b3480156108d357600080fd5b506108dc6127dc565b6040516108e99190614ae0565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190613e16565b61286e565b6040516109269190614aaa565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613de9565b61289b565b005b6017818154811061096857600080fd5b9060005260206000200160009150905080546109839061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546109af9061509c565b80156109fc5780601f106109d1576101008083540402835291602001916109fc565b820191906000526020600020905b8154815290600101906020018083116109df57829003601f168201915b505050505081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a775750610a7682612993565b5b9050919050565b606060008054610a8d9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab99061509c565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b6000610b1b82612a75565b610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5190614c99565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba0826119ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890614d19565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c30612ae1565b73ffffffffffffffffffffffffffffffffffffffff161480610c5f5750610c5e81610c59612ae1565b61286e565b5b610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590614c19565b60405180910390fd5b610ca88383612ae9565b505050565b6000600880549050905090565b600e5481565b610cd1610ccb612ae1565b82612ba2565b610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0790614d39565b60405180910390fd5b610d1b838383612c80565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790614cf9565b60405180910390fd5b47811115610dbd57600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e039061491a565b60006040518083038185875af1925050503d8060008114610e40576040519150601f19603f3d011682016040523d82523d6000602084013e610e45565b606091505b50505050565b6000610e5683611b4d565b8210610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614b39565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060806000610efe84612edc565b90506000604051806020016040528060008152509050600060405180602001604052806000815250905061100e8260138080549050610f5b87604051602001610f4791906147c5565b60405160208183030381529060405261303d565b610f659190615148565b81548110610f7657610f75615235565b5b906000526020600020018054610f8b9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb79061509c565b80156110045780601f10610fd957610100808354040283529160200191611004565b820191906000526020600020905b815481529060010190602001808311610fe757829003601f168201915b5050505050613070565b915061104f826040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b9150611137826014808054905061108487604051602001611070919061482b565b60405160208183030381529060405261303d565b61108e9190615148565b8154811061109f5761109e615235565b5b9060005260206000200180546110b49061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546110e09061509c565b801561112d5780601f106111025761010080835404028352916020019161112d565b820191906000526020600020905b81548152906001019060200180831161111057829003601f168201915b5050505050613070565b9150611178826040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b915061126082601580805490506111ad8760405160200161119991906147a3565b60405160208183030381529060405261303d565b6111b79190615148565b815481106111c8576111c7615235565b5b9060005260206000200180546111dd9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546112099061509c565b80156112565780601f1061122b57610100808354040283529160200191611256565b820191906000526020600020905b81548152906001019060200180831161123957829003601f168201915b5050505050613070565b91506112a1826040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b915061138982601680805490506112d6876040516020016112c291906148d6565b60405160208183030381529060405261303d565b6112e09190615148565b815481106112f1576112f0615235565b5b9060005260206000200180546113069061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546113329061509c565b801561137f5780601f106113545761010080835404028352916020019161137f565b820191906000526020600020905b81548152906001019060200180831161136257829003601f168201915b5050505050613070565b915061147181601780805490506113be876040516020016113aa91906148b4565b60405160208183030381529060405261303d565b6113c89190615148565b815481106113d9576113d8615235565b5b9060005260206000200180546113ee9061509c565b80601f016020809104026020016040519081016040528092919081815260200182805461141a9061509c565b80156114675780601f1061143c57610100808354040283529160200191611467565b820191906000526020600020905b81548152906001019060200180831161144a57829003601f168201915b5050505050613070565b90506114b2816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b905061159a81601880805490506114e7876040516020016114d3919061492f565b60405160208183030381529060405261303d565b6114f19190615148565b8154811061150257611501615235565b5b9060005260206000200180546115179061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546115439061509c565b80156115905780601f1061156557610100808354040283529160200191611590565b820191906000526020600020905b81548152906001019060200180831161157357829003601f168201915b5050505050613070565b90506115db816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b90506116c38160198080549050611610876040516020016115fc91906147e7565b60405160208183030381529060405261303d565b61161a9190615148565b8154811061162b5761162a615235565b5b9060005260206000200180546116409061509c565b80601f016020809104026020016040519081016040528092919081815260200182805461166c9061509c565b80156116b95780601f1061168e576101008083540402835291602001916116b9565b820191906000526020600020905b81548152906001019060200180831161169c57829003601f168201915b5050505050613070565b9050611704816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b90506117ec81601a808054905061173987604051602001611725919061484d565b60405160208183030381529060405261303d565b6117439190615148565b8154811061175457611753615235565b5b9060005260206000200180546117699061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546117959061509c565b80156117e25780601f106117b7576101008083540402835291602001916117e2565b820191906000526020600020905b8154815290600101906020018083116117c557829003601f168201915b5050505050613070565b905061182d816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b9050818194509450505050915091565b6118588383836040518060200160405280600081525061236f565b505050565b6000611867610cad565b82106118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f90614d59565b60405180910390fd5b600882815481106118bc576118bb615235565b5b90600052602060002001549050919050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156119e657508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161197e9190614a43565b60206040518083038186803b15801561199657600080fd5b505afa1580156119aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ce9190614006565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f90614c59565b60405180910390fd5b80915050919050565b60158181548110611ab157600080fd5b906000526020600020016000915090508054611acc9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611af89061509c565b8015611b455780601f10611b1a57610100808354040283529160200191611b45565b820191906000526020600020905b815481529060010190602001808311611b2857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590614c39565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c0d612ae1565b73ffffffffffffffffffffffffffffffffffffffff16611c2b611ebf565b73ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614cb9565b60405180910390fd5b611c8b600061320b565b565b60198181548110611c9d57600080fd5b906000526020600020016000915090508054611cb89061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce49061509c565b8015611d315780601f10611d0657610100808354040283529160200191611d31565b820191906000526020600020905b815481529060010190602001808311611d1457829003601f168201915b505050505081565b600d5481565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614cf9565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60168181548110611e2357600080fd5b906000526020600020016000915090508054611e3e9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6a9061509c565b8015611eb75780601f10611e8c57610100808354040283529160200191611eb7565b820191906000526020600020905b815481529060010190602001808311611e9a57829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ef89061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f249061509c565b8015611f715780601f10611f4657610100808354040283529160200191611f71565b820191906000526020600020905b815481529060010190602001808311611f5457829003601f168201915b5050505050905090565b6002600b541415611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890614d79565b60405180910390fd5b6002600b8190555034611fdf82600e546132d190919063ffffffff16565b14611fe957600080fd5b6005811115611ff757600080fd5b600d546120168261200860126132e7565b6132f590919063ffffffff16565b111561202157600080fd5b60005b8181101561206257612036601261330b565b600061204260126132e7565b905061204e3382613321565b50808061205a906150ff565b915050612024565b506001600b8190555050565b6013818154811061207e57600080fd5b9060005260206000200160009150905080546120999061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546120c59061509c565b80156121125780601f106120e757610100808354040283529160200191612112565b820191906000526020600020905b8154815290600101906020018083116120f557829003601f168201915b505050505081565b612122612ae1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790614bd9565b60405180910390fd5b806005600061219d612ae1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661224a612ae1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161228f9190614aaa565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461232b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232290614cf9565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61238061237a612ae1565b83612ba2565b6123bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b690614d39565b60405180910390fd5b6123cb8484848461333f565b50505050565b601a81815481106123e157600080fd5b9060005260206000200160009150905080546123fc9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546124289061509c565b80156124755780601f1061244a57610100808354040283529160200191612475565b820191906000526020600020905b81548152906001019060200180831161245857829003601f168201915b505050505081565b606061248882612a75565b61249157600080fd5b60608061249d84610ef0565b80925081935050506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d07b7d6866040518263ffffffff1660e01b81526004016125029190614d99565b60006040518083038186803b15801561251a57600080fd5b505afa15801561252e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906125579190614033565b838361256288612edc565b6125b3600161270f61259a6125768d612edc565b60405160200161258691906148f8565b60405160208183030381529060405261303d565b6125a49190615148565b6125ae9190614e89565b612edc565b612604600161270f6125eb6125c78e612edc565b6040516020016125d79190614809565b60405160208183030381529060405261303d565b6125f59190615148565b6125ff9190614e89565b612edc565b60405160200161261996959493929190614951565b604051602081830303815290604052905061263385612edc565b8160405160200161264592919061486f565b6040516020818303038152906040529350505050919050565b6014818154811061266e57600080fd5b9060005260206000200160009150905080546126899061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546126b59061509c565b80156127025780601f106126d757610100808354040283529160200191612702565b820191906000526020600020905b8154815290600101906020018083116126e557829003601f168201915b505050505081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6018818154811061274057600080fd5b90600052602060002001600091509050805461275b9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546127879061509c565b80156127d45780601f106127a9576101008083540402835291602001916127d4565b820191906000526020600020905b8154815290600101906020018083116127b757829003601f168201915b505050505081565b6060600f80546127eb9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546128179061509c565b80156128645780601f1061283957610100808354040283529160200191612864565b820191906000526020600020905b81548152906001019060200180831161284757829003601f168201915b5050505050905090565b600061287a83836118ce565b156128885760019050612895565b612892838361339b565b90505b92915050565b6128a3612ae1565b73ffffffffffffffffffffffffffffffffffffffff166128c1611ebf565b73ffffffffffffffffffffffffffffffffffffffff1614612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90614cb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e90614b79565b60405180910390fd5b6129908161320b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a6e5750612a6d8261342f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b5c836119ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bad82612a75565b612bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be390614bf9565b60405180910390fd5b6000612bf7836119ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c6657508373ffffffffffffffffffffffffffffffffffffffff16612c4e84610b10565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c775750612c76818561286e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ca0826119ef565b73ffffffffffffffffffffffffffffffffffffffff1614612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90614cd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90614bb9565b60405180910390fd5b612d71838383613499565b612d7c600082612ae9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dcc9190614f6a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e239190614e89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000821415612f24576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613038565b600082905060005b60008214612f56578080612f3f906150ff565b915050600a82612f4f9190614edf565b9150612f2c565b60008167ffffffffffffffff811115612f7257612f71615264565b5b6040519080825280601f01601f191660200182016040528015612fa45781602001600182028036833780820191505090505b5090505b6000851461303157600182612fbd9190614f6a565b9150600a85612fcc9190615148565b6030612fd89190614e89565b60f81b818381518110612fee57612fed615235565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561302a9190614edf565b9450612fa8565b8093505050505b919050565b600081604051602001613050919061478c565b6040516020818303038152906040528051906020012060001c9050919050565b60606000839050600083905060008151835161308c9190614e89565b67ffffffffffffffff8111156130a5576130a4615264565b5b6040519080825280601f01601f1916602001820160405280156130d75781602001600182028036833780820191505090505b5090506000819050600080600091505b855182101561316f5785828151811061310357613102615235565b5b602001015160f81c60f81b83828061311a906150ff565b93508151811061312d5761312c615235565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180613167906150ff565b9250506130e7565b600091505b84518210156131fc578482815181106131905761318f615235565b5b602001015160f81c60f81b8382806131a7906150ff565b9350815181106131ba576131b9615235565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806131f4906150ff565b925050613174565b82965050505050505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836132df9190614f10565b905092915050565b600081600001549050919050565b600081836133039190614e89565b905092915050565b6001816000016000828254019250508190555050565b61333b8282604051806020016040528060008152506135ad565b5050565b61334a848484612c80565b61335684848484613608565b613395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338c90614b59565b60405180910390fd5b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134a483838361379f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134e7576134e2816137a4565b613526565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135255761352483826137ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613569576135648161395a565b6135a8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135a7576135a68282613a2b565b5b5b505050565b6135b78383613aaa565b6135c46000848484613608565b613603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fa90614b59565b60405180910390fd5b505050565b60006136298473ffffffffffffffffffffffffffffffffffffffff16613c78565b15613792578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613652612ae1565b8786866040518563ffffffff1660e01b81526004016136749493929190614a5e565b602060405180830381600087803b15801561368e57600080fd5b505af19250505080156136bf57506040513d601f19601f820116820180604052508101906136bc9190613fd9565b60015b613742573d80600081146136ef576040519150601f19603f3d011682016040523d82523d6000602084013e6136f4565b606091505b5060008151141561373a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373190614b59565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613797565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137fa84611b4d565b6138049190614f6a565b90506000600760008481526020019081526020016000205490508181146138e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061396e9190614f6a565b905060006009600084815260200190815260200160002054905060006008838154811061399e5761399d615235565b5b9060005260206000200154905080600883815481106139c0576139bf615235565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a0f57613a0e615206565b5b6001900381819060005260206000200160009055905550505050565b6000613a3683611b4d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1190614c79565b60405180910390fd5b613b2381612a75565b15613b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5a90614b99565b60405180910390fd5b613b6f60008383613499565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bbf9190614e89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000613c9e613c9984614dd9565b614db4565b905082815260208101848484011115613cba57613cb9615298565b5b613cc584828561505a565b509392505050565b6000613ce0613cdb84614e0a565b614db4565b905082815260208101848484011115613cfc57613cfb615298565b5b613d07848285615069565b509392505050565b600081359050613d1e81615eaa565b92915050565b600081359050613d3381615ec1565b92915050565b600081359050613d4881615ed8565b92915050565b600081519050613d5d81615ed8565b92915050565b600082601f830112613d7857613d77615293565b5b8135613d88848260208601613c8b565b91505092915050565b600081519050613da081615eef565b92915050565b600082601f830112613dbb57613dba615293565b5b8151613dcb848260208601613ccd565b91505092915050565b600081359050613de381615f06565b92915050565b600060208284031215613dff57613dfe6152a2565b5b6000613e0d84828501613d0f565b91505092915050565b60008060408385031215613e2d57613e2c6152a2565b5b6000613e3b85828601613d0f565b9250506020613e4c85828601613d0f565b9150509250929050565b600080600060608486031215613e6f57613e6e6152a2565b5b6000613e7d86828701613d0f565b9350506020613e8e86828701613d0f565b9250506040613e9f86828701613dd4565b9150509250925092565b60008060008060808587031215613ec357613ec26152a2565b5b6000613ed187828801613d0f565b9450506020613ee287828801613d0f565b9350506040613ef387828801613dd4565b925050606085013567ffffffffffffffff811115613f1457613f1361529d565b5b613f2087828801613d63565b91505092959194509250565b60008060408385031215613f4357613f426152a2565b5b6000613f5185828601613d0f565b9250506020613f6285828601613d24565b9150509250929050565b60008060408385031215613f8357613f826152a2565b5b6000613f9185828601613d0f565b9250506020613fa285828601613dd4565b9150509250929050565b600060208284031215613fc257613fc16152a2565b5b6000613fd084828501613d39565b91505092915050565b600060208284031215613fef57613fee6152a2565b5b6000613ffd84828501613d4e565b91505092915050565b60006020828403121561401c5761401b6152a2565b5b600061402a84828501613d91565b91505092915050565b600060208284031215614049576140486152a2565b5b600082015167ffffffffffffffff8111156140675761406661529d565b5b61407384828501613da6565b91505092915050565b600060208284031215614092576140916152a2565b5b60006140a084828501613dd4565b91505092915050565b6140b281614f9e565b82525050565b6140c181614fb0565b82525050565b60006140d282614e3b565b6140dc8185614e51565b93506140ec818560208601615069565b6140f5816152a7565b840191505092915050565b61410981615024565b82525050565b600061411a82614e46565b6141248185614e6d565b9350614134818560208601615069565b61413d816152a7565b840191505092915050565b600061415382614e46565b61415d8185614e7e565b935061416d818560208601615069565b80840191505092915050565b6000614186600183614e7e565b9150614191826152b8565b600182019050919050565b60006141a9600183614e7e565b91506141b4826152e1565b600182019050919050565b60006141cc600183614e7e565b91506141d78261530a565b600182019050919050565b60006141ef600683614e7e565b91506141fa82615333565b600682019050919050565b6000614212602b83614e6d565b915061421d8261535c565b604082019050919050565b6000614235603283614e6d565b9150614240826153ab565b604082019050919050565b6000614258600183614e7e565b9150614263826153fa565b600182019050919050565b600061427b602683614e6d565b915061428682615423565b604082019050919050565b600061429e602383614e7e565b91506142a982615472565b602382019050919050565b60006142c1601c83614e6d565b91506142cc826154c1565b602082019050919050565b60006142e4600183614e7e565b91506142ef826154ea565b600182019050919050565b6000614307602d83614e7e565b915061431282615513565b602d82019050919050565b600061432a602683614e7e565b915061433582615562565b602682019050919050565b600061434d600183614e7e565b9150614358826155b1565b600182019050919050565b6000614370602483614e6d565b915061437b826155da565b604082019050919050565b6000614393601983614e6d565b915061439e82615629565b602082019050919050565b60006143b6604983614e7e565b91506143c182615652565b604982019050919050565b60006143d9602c83614e6d565b91506143e4826156c7565b604082019050919050565b60006143fc600183614e7e565b915061440782615716565b600182019050919050565b600061441f603883614e6d565b915061442a8261573f565b604082019050919050565b6000614442602a83614e6d565b915061444d8261578e565b604082019050919050565b6000614465602983614e6d565b9150614470826157dd565b604082019050919050565b6000614488600283614e7e565b91506144938261582c565b600282019050919050565b60006144ab600783614e7e565b91506144b682615855565b600782019050919050565b60006144ce602083614e6d565b91506144d98261587e565b602082019050919050565b60006144f1600683614e7e565b91506144fc826158a7565b600682019050919050565b6000614514602c83614e6d565b915061451f826158d0565b604082019050919050565b6000614537602083614e6d565b91506145428261591f565b602082019050919050565b600061455a600383614e7e565b915061456582615948565b600382019050919050565b600061457d602983614e6d565b915061458882615971565b604082019050919050565b60006145a0601283614e6d565b91506145ab826159c0565b602082019050919050565b60006145c3607283614e7e565b91506145ce826159e9565b607282019050919050565b60006145e6602183614e6d565b91506145f182615a84565b604082019050919050565b6000614609606383614e7e565b915061461482615ad3565b606382019050919050565b600061462c600083614e62565b915061463782615b6e565b600082019050919050565b600061464f601383614e7e565b915061465a82615b71565b601382019050919050565b6000614672603183614e6d565b915061467d82615b9a565b604082019050919050565b6000614695604783614e7e565b91506146a082615be9565b604782019050919050565b60006146b8602c83614e6d565b91506146c382615c5e565b604082019050919050565b60006146db600183614e7e565b91506146e682615cad565b600182019050919050565b60006146fe60aa83614e7e565b915061470982615cd6565b60aa82019050919050565b6000614721601f83614e6d565b915061472c82615dbd565b602082019050919050565b6000614744600683614e7e565b915061474f82615de6565b600682019050919050565b6000614767606383614e7e565b915061477282615e0f565b606382019050919050565b6147868161501a565b82525050565b60006147988284614148565b915081905092915050565b60006147ae82614179565b91506147ba8284614148565b915081905092915050565b60006147d08261419c565b91506147dc8284614148565b915081905092915050565b60006147f2826141bf565b91506147fe8284614148565b915081905092915050565b6000614814826141e2565b91506148208284614148565b915081905092915050565b60006148368261424b565b91506148428284614148565b915081905092915050565b6000614858826142d7565b91506148648284614148565b915081905092915050565b600061487a826142fa565b91506148868285614148565b915061489182614291565b915061489d8284614148565b91506148a88261447b565b91508190509392505050565b60006148bf82614340565b91506148cb8284614148565b915081905092915050565b60006148e1826143ef565b91506148ed8284614148565b915081905092915050565b6000614903826144e4565b915061490f8284614148565b915081905092915050565b60006149258261461f565b9150819050919050565b600061493a826146ce565b91506149468284614148565b915081905092915050565b600061495c826146f1565b9150614967826143a9565b91506149728261431d565b915061497e8289614148565b915061498982614642565b915061499482614688565b915061499f8261475a565b91506149ab8288614148565b91506149b68261449e565b91506149c1826145fc565b91506149cd8287614148565b91506149d88261449e565b91506149e3826145b6565b91506149ef8286614148565b91506149fa8261454d565b9150614a068285614148565b9150614a118261454d565b9150614a1d8284614148565b9150614a288261449e565b9150614a3382614737565b9150819050979650505050505050565b6000602082019050614a5860008301846140a9565b92915050565b6000608082019050614a7360008301876140a9565b614a8060208301866140a9565b614a8d604083018561477d565b8181036060830152614a9f81846140c7565b905095945050505050565b6000602082019050614abf60008301846140b8565b92915050565b6000602082019050614ada6000830184614100565b92915050565b60006020820190508181036000830152614afa818461410f565b905092915050565b60006040820190508181036000830152614b1c818561410f565b90508181036020830152614b30818461410f565b90509392505050565b60006020820190508181036000830152614b5281614205565b9050919050565b60006020820190508181036000830152614b7281614228565b9050919050565b60006020820190508181036000830152614b928161426e565b9050919050565b60006020820190508181036000830152614bb2816142b4565b9050919050565b60006020820190508181036000830152614bd281614363565b9050919050565b60006020820190508181036000830152614bf281614386565b9050919050565b60006020820190508181036000830152614c12816143cc565b9050919050565b60006020820190508181036000830152614c3281614412565b9050919050565b60006020820190508181036000830152614c5281614435565b9050919050565b60006020820190508181036000830152614c7281614458565b9050919050565b60006020820190508181036000830152614c92816144c1565b9050919050565b60006020820190508181036000830152614cb281614507565b9050919050565b60006020820190508181036000830152614cd28161452a565b9050919050565b60006020820190508181036000830152614cf281614570565b9050919050565b60006020820190508181036000830152614d1281614593565b9050919050565b60006020820190508181036000830152614d32816145d9565b9050919050565b60006020820190508181036000830152614d5281614665565b9050919050565b60006020820190508181036000830152614d72816146ab565b9050919050565b60006020820190508181036000830152614d9281614714565b9050919050565b6000602082019050614dae600083018461477d565b92915050565b6000614dbe614dcf565b9050614dca82826150ce565b919050565b6000604051905090565b600067ffffffffffffffff821115614df457614df3615264565b5b614dfd826152a7565b9050602081019050919050565b600067ffffffffffffffff821115614e2557614e24615264565b5b614e2e826152a7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e948261501a565b9150614e9f8361501a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ed457614ed3615179565b5b828201905092915050565b6000614eea8261501a565b9150614ef58361501a565b925082614f0557614f046151a8565b5b828204905092915050565b6000614f1b8261501a565b9150614f268361501a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f5f57614f5e615179565b5b828202905092915050565b6000614f758261501a565b9150614f808361501a565b925082821015614f9357614f92615179565b5b828203905092915050565b6000614fa982614ffa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614ff382614f9e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061502f82615036565b9050919050565b600061504182615048565b9050919050565b600061505382614ffa565b9050919050565b82818337600083830152505050565b60005b8381101561508757808201518184015260208101905061506c565b83811115615096576000848401525b50505050565b600060028204905060018216806150b457607f821691505b602082108114156150c8576150c76151d7565b5b50919050565b6150d7826152a7565b810181811067ffffffffffffffff821117156150f6576150f5615264565b5b80604052505050565b600061510a8261501a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561513d5761513c615179565b5b600182019050919050565b60006151538261501a565b915061515e8361501a565b92508261516e5761516d6151a8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4100000000000000000000000000000000000000000000000000000000000000600082015250565b7f4700000000000000000000000000000000000000000000000000000000000000600082015250565b7f4c75636b79330000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b757460008201527f66382c0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4800000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a22466f7274756e65202300000000000000000000000000000000000000602082015250565b7f786c696e6b3a687265663d27646174613a696d6167652f7376672b786d6c3b6260008201527f61736536342c0000000000000000000000000000000000000000000000000000602082015250565b7f4500000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c646566733e3c66696c7465722069643d2763273e3c6665496d61676520783d60008201527f27302720793d273027206865696768743d27313032347078272077696474683d60208201527f2731303234707827200000000000000000000000000000000000000000000000604082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4400000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c2f746578743e00000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4c75636b79320000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f202d200000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792041646d696e20616c6c6f7765640000000000000000000000000000600082015250565b7f3c7465787420783d273638302720793d273539302720666f6e742d73697a653d60008201527f27312e3235656d27207472616e73666f726d3d277472616e736c617465282d3360208201527f302c33302920726f74617465282d35292720746578744c656e6774683d27323660408201527f35273e4c75636b79204e756d626572733a200000000000000000000000000000606082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c7465787420783d273530382720793d273535302720666f6e742d73697a653d60008201527f27312e3235656d27207472616e73666f726d3d277472616e736c617465282d3360208201527f302c33302920726f74617465282d35292720746578744c656e6774683d27343460408201527f30273e0000000000000000000000000000000000000000000000000000000000606082015250565b50565b7f272f3e3c2f66696c7465723e3c2f646566733e00000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3c7265637420783d27302720793d273027206865696768743d2731303234272060008201527f77696474683d273130323427207374796c653d2766696c7465723a75726c282360208201527f63293b27202f3e00000000000000000000000000000000000000000000000000604082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4600000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7376672077696474683d273130323427206865696768743d2731303234272060008201527f7072657365727665417370656374526174696f3d27784d696e594d696e206d6560208201527f6574272076696577426f783d27302030203130323420313032342720786d6c6e60408201527f733d27687474703a2f2f7777772e77332e6f72672f323030302f73766727207860608201527f6d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313960808201527f39392f786c696e6b273e0000000000000000000000000000000000000000000060a082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b7f3c7465787420783d273530382720793d273531352720666f6e742d73697a653d60008201527f27312e3235656d27207472616e73666f726d3d277472616e736c617465282d3360208201527f302c33302920726f74617465282d35292720746578744c656e6774683d27343460408201527f30273e0000000000000000000000000000000000000000000000000000000000606082015250565b615eb381614f9e565b8114615ebe57600080fd5b50565b615eca81614fb0565b8114615ed557600080fd5b50565b615ee181614fbc565b8114615eec57600080fd5b50565b615ef881614fe8565b8114615f0357600080fd5b50565b615f0f8161501a565b8114615f1a57600080fd5b5056fea2646970667358221220844ed5d62ddbb326393d917220a832012941d2706101709dbd174a69642c75ea64736f6c634300080700330000000000000000000000001d485868251ba82b6462f83774bfdae8e998243e0000000000000000000000007682969b74d73dd72963fdb353476a5c3cecf786000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x6080604052600436106102195760003560e01c80637cb63ec811610123578063b5f49759116100ab578063e2314d851161006f578063e2314d851461085f578063e2b687961461088a578063e8a3d485146108c7578063e985e9c5146108f2578063f2fde38b1461092f57610219565b8063b5f4975914610756578063b88d4fde1461077f578063bb314009146107a8578063c87b56dd146107e5578063dac0eb071461082257610219565b80638da5cb5b116100f25780638da5cb5b1461067e57806395d89b41146106a9578063a0712d68146106d4578063a17a9e66146106f0578063a22cb4651461072d57610219565b80637cb63ec8146105b05780638a333b50146105ed5780638c273de4146106185780638d949c8b1461064157610219565b80632f745c59116101a65780636102de98116101755780636102de98146104a55780636352211e146104e25780636e9ed8cf1461051f57806370a082311461055c578063715018a61461059957610219565b80632f745c59146103c45780632fdd653e1461040157806342842e0e1461043f5780634f6ccce71461046857610219565b8063095ea7b3116101ed578063095ea7b31461030057806318160ddd146103295780631a4231a41461035457806323b872dd1461037f5780632e1a7d4d146103a857610219565b80622ff0671461021e57806301ffc9a71461025b57806306fdde0314610298578063081812fc146102c3575b600080fd5b34801561022a57600080fd5b506102456004803603810190610240919061407c565b610958565b6040516102529190614ae0565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613fac565b610a04565b60405161028f9190614aaa565b60405180910390f35b3480156102a457600080fd5b506102ad610a7e565b6040516102ba9190614ae0565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e5919061407c565b610b10565b6040516102f79190614a43565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190613f6c565b610b95565b005b34801561033557600080fd5b5061033e610cad565b60405161034b9190614d99565b60405180910390f35b34801561036057600080fd5b50610369610cba565b6040516103769190614d99565b60405180910390f35b34801561038b57600080fd5b506103a660048036038101906103a19190613e56565b610cc0565b005b6103c260048036038101906103bd919061407c565b610d20565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613f6c565b610e4b565b6040516103f89190614d99565b60405180910390f35b34801561040d57600080fd5b506104286004803603810190610423919061407c565b610ef0565b604051610436929190614b02565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613e56565b61183d565b005b34801561047457600080fd5b5061048f600480360381019061048a919061407c565b61185d565b60405161049c9190614d99565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190613e16565b6118ce565b6040516104d99190614aaa565b60405180910390f35b3480156104ee57600080fd5b506105096004803603810190610504919061407c565b6119ef565b6040516105169190614a43565b60405180910390f35b34801561052b57600080fd5b506105466004803603810190610541919061407c565b611aa1565b6040516105539190614ae0565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613de9565b611b4d565b6040516105909190614d99565b60405180910390f35b3480156105a557600080fd5b506105ae611c05565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061407c565b611c8d565b6040516105e49190614ae0565b60405180910390f35b3480156105f957600080fd5b50610602611d39565b60405161060f9190614d99565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a9190613de9565b611d3f565b005b34801561064d57600080fd5b506106686004803603810190610663919061407c565b611e13565b6040516106759190614ae0565b60405180910390f35b34801561068a57600080fd5b50610693611ebf565b6040516106a09190614a43565b60405180910390f35b3480156106b557600080fd5b506106be611ee9565b6040516106cb9190614ae0565b60405180910390f35b6106ee60048036038101906106e9919061407c565b611f7b565b005b3480156106fc57600080fd5b506107176004803603810190610712919061407c565b61206e565b6040516107249190614ae0565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f9190613f2c565b61211a565b005b34801561076257600080fd5b5061077d60048036038101906107789190613de9565b61229b565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613ea9565b61236f565b005b3480156107b457600080fd5b506107cf60048036038101906107ca919061407c565b6123d1565b6040516107dc9190614ae0565b60405180910390f35b3480156107f157600080fd5b5061080c6004803603810190610807919061407c565b61247d565b6040516108199190614ae0565b60405180910390f35b34801561082e57600080fd5b506108496004803603810190610844919061407c565b61265e565b6040516108569190614ae0565b60405180910390f35b34801561086b57600080fd5b5061087461270a565b6040516108819190614ac5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061407c565b612730565b6040516108be9190614ae0565b60405180910390f35b3480156108d357600080fd5b506108dc6127dc565b6040516108e99190614ae0565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190613e16565b61286e565b6040516109269190614aaa565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613de9565b61289b565b005b6017818154811061096857600080fd5b9060005260206000200160009150905080546109839061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546109af9061509c565b80156109fc5780601f106109d1576101008083540402835291602001916109fc565b820191906000526020600020905b8154815290600101906020018083116109df57829003601f168201915b505050505081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a775750610a7682612993565b5b9050919050565b606060008054610a8d9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab99061509c565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b6000610b1b82612a75565b610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5190614c99565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba0826119ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890614d19565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c30612ae1565b73ffffffffffffffffffffffffffffffffffffffff161480610c5f5750610c5e81610c59612ae1565b61286e565b5b610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590614c19565b60405180910390fd5b610ca88383612ae9565b505050565b6000600880549050905090565b600e5481565b610cd1610ccb612ae1565b82612ba2565b610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0790614d39565b60405180910390fd5b610d1b838383612c80565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790614cf9565b60405180910390fd5b47811115610dbd57600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e039061491a565b60006040518083038185875af1925050503d8060008114610e40576040519150601f19603f3d011682016040523d82523d6000602084013e610e45565b606091505b50505050565b6000610e5683611b4d565b8210610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614b39565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060806000610efe84612edc565b90506000604051806020016040528060008152509050600060405180602001604052806000815250905061100e8260138080549050610f5b87604051602001610f4791906147c5565b60405160208183030381529060405261303d565b610f659190615148565b81548110610f7657610f75615235565b5b906000526020600020018054610f8b9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb79061509c565b80156110045780601f10610fd957610100808354040283529160200191611004565b820191906000526020600020905b815481529060010190602001808311610fe757829003601f168201915b5050505050613070565b915061104f826040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b9150611137826014808054905061108487604051602001611070919061482b565b60405160208183030381529060405261303d565b61108e9190615148565b8154811061109f5761109e615235565b5b9060005260206000200180546110b49061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546110e09061509c565b801561112d5780601f106111025761010080835404028352916020019161112d565b820191906000526020600020905b81548152906001019060200180831161111057829003601f168201915b5050505050613070565b9150611178826040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b915061126082601580805490506111ad8760405160200161119991906147a3565b60405160208183030381529060405261303d565b6111b79190615148565b815481106111c8576111c7615235565b5b9060005260206000200180546111dd9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546112099061509c565b80156112565780601f1061122b57610100808354040283529160200191611256565b820191906000526020600020905b81548152906001019060200180831161123957829003601f168201915b5050505050613070565b91506112a1826040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b915061138982601680805490506112d6876040516020016112c291906148d6565b60405160208183030381529060405261303d565b6112e09190615148565b815481106112f1576112f0615235565b5b9060005260206000200180546113069061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546113329061509c565b801561137f5780601f106113545761010080835404028352916020019161137f565b820191906000526020600020905b81548152906001019060200180831161136257829003601f168201915b5050505050613070565b915061147181601780805490506113be876040516020016113aa91906148b4565b60405160208183030381529060405261303d565b6113c89190615148565b815481106113d9576113d8615235565b5b9060005260206000200180546113ee9061509c565b80601f016020809104026020016040519081016040528092919081815260200182805461141a9061509c565b80156114675780601f1061143c57610100808354040283529160200191611467565b820191906000526020600020905b81548152906001019060200180831161144a57829003601f168201915b5050505050613070565b90506114b2816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b905061159a81601880805490506114e7876040516020016114d3919061492f565b60405160208183030381529060405261303d565b6114f19190615148565b8154811061150257611501615235565b5b9060005260206000200180546115179061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546115439061509c565b80156115905780601f1061156557610100808354040283529160200191611590565b820191906000526020600020905b81548152906001019060200180831161157357829003601f168201915b5050505050613070565b90506115db816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b90506116c38160198080549050611610876040516020016115fc91906147e7565b60405160208183030381529060405261303d565b61161a9190615148565b8154811061162b5761162a615235565b5b9060005260206000200180546116409061509c565b80601f016020809104026020016040519081016040528092919081815260200182805461166c9061509c565b80156116b95780601f1061168e576101008083540402835291602001916116b9565b820191906000526020600020905b81548152906001019060200180831161169c57829003601f168201915b5050505050613070565b9050611704816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b90506117ec81601a808054905061173987604051602001611725919061484d565b60405160208183030381529060405261303d565b6117439190615148565b8154811061175457611753615235565b5b9060005260206000200180546117699061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546117959061509c565b80156117e25780601f106117b7576101008083540402835291602001916117e2565b820191906000526020600020905b8154815290600101906020018083116117c557829003601f168201915b5050505050613070565b905061182d816040518060400160405280600181526020017f2000000000000000000000000000000000000000000000000000000000000000815250613070565b9050818194509450505050915091565b6118588383836040518060200160405280600081525061236f565b505050565b6000611867610cad565b82106118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f90614d59565b60405180910390fd5b600882815481106118bc576118bb615235565b5b90600052602060002001549050919050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156119e657508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161197e9190614a43565b60206040518083038186803b15801561199657600080fd5b505afa1580156119aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ce9190614006565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f90614c59565b60405180910390fd5b80915050919050565b60158181548110611ab157600080fd5b906000526020600020016000915090508054611acc9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611af89061509c565b8015611b455780601f10611b1a57610100808354040283529160200191611b45565b820191906000526020600020905b815481529060010190602001808311611b2857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590614c39565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c0d612ae1565b73ffffffffffffffffffffffffffffffffffffffff16611c2b611ebf565b73ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614cb9565b60405180910390fd5b611c8b600061320b565b565b60198181548110611c9d57600080fd5b906000526020600020016000915090508054611cb89061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce49061509c565b8015611d315780601f10611d0657610100808354040283529160200191611d31565b820191906000526020600020905b815481529060010190602001808311611d1457829003601f168201915b505050505081565b600d5481565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614cf9565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60168181548110611e2357600080fd5b906000526020600020016000915090508054611e3e9061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6a9061509c565b8015611eb75780601f10611e8c57610100808354040283529160200191611eb7565b820191906000526020600020905b815481529060010190602001808311611e9a57829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ef89061509c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f249061509c565b8015611f715780601f10611f4657610100808354040283529160200191611f71565b820191906000526020600020905b815481529060010190602001808311611f5457829003601f168201915b5050505050905090565b6002600b541415611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890614d79565b60405180910390fd5b6002600b8190555034611fdf82600e546132d190919063ffffffff16565b14611fe957600080fd5b6005811115611ff757600080fd5b600d546120168261200860126132e7565b6132f590919063ffffffff16565b111561202157600080fd5b60005b8181101561206257612036601261330b565b600061204260126132e7565b905061204e3382613321565b50808061205a906150ff565b915050612024565b506001600b8190555050565b6013818154811061207e57600080fd5b9060005260206000200160009150905080546120999061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546120c59061509c565b80156121125780601f106120e757610100808354040283529160200191612112565b820191906000526020600020905b8154815290600101906020018083116120f557829003601f168201915b505050505081565b612122612ae1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790614bd9565b60405180910390fd5b806005600061219d612ae1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661224a612ae1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161228f9190614aaa565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461232b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232290614cf9565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61238061237a612ae1565b83612ba2565b6123bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b690614d39565b60405180910390fd5b6123cb8484848461333f565b50505050565b601a81815481106123e157600080fd5b9060005260206000200160009150905080546123fc9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546124289061509c565b80156124755780601f1061244a57610100808354040283529160200191612475565b820191906000526020600020905b81548152906001019060200180831161245857829003601f168201915b505050505081565b606061248882612a75565b61249157600080fd5b60608061249d84610ef0565b80925081935050506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d07b7d6866040518263ffffffff1660e01b81526004016125029190614d99565b60006040518083038186803b15801561251a57600080fd5b505afa15801561252e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906125579190614033565b838361256288612edc565b6125b3600161270f61259a6125768d612edc565b60405160200161258691906148f8565b60405160208183030381529060405261303d565b6125a49190615148565b6125ae9190614e89565b612edc565b612604600161270f6125eb6125c78e612edc565b6040516020016125d79190614809565b60405160208183030381529060405261303d565b6125f59190615148565b6125ff9190614e89565b612edc565b60405160200161261996959493929190614951565b604051602081830303815290604052905061263385612edc565b8160405160200161264592919061486f565b6040516020818303038152906040529350505050919050565b6014818154811061266e57600080fd5b9060005260206000200160009150905080546126899061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546126b59061509c565b80156127025780601f106126d757610100808354040283529160200191612702565b820191906000526020600020905b8154815290600101906020018083116126e557829003601f168201915b505050505081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6018818154811061274057600080fd5b90600052602060002001600091509050805461275b9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546127879061509c565b80156127d45780601f106127a9576101008083540402835291602001916127d4565b820191906000526020600020905b8154815290600101906020018083116127b757829003601f168201915b505050505081565b6060600f80546127eb9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546128179061509c565b80156128645780601f1061283957610100808354040283529160200191612864565b820191906000526020600020905b81548152906001019060200180831161284757829003601f168201915b5050505050905090565b600061287a83836118ce565b156128885760019050612895565b612892838361339b565b90505b92915050565b6128a3612ae1565b73ffffffffffffffffffffffffffffffffffffffff166128c1611ebf565b73ffffffffffffffffffffffffffffffffffffffff1614612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90614cb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e90614b79565b60405180910390fd5b6129908161320b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a6e5750612a6d8261342f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b5c836119ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bad82612a75565b612bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be390614bf9565b60405180910390fd5b6000612bf7836119ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c6657508373ffffffffffffffffffffffffffffffffffffffff16612c4e84610b10565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c775750612c76818561286e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ca0826119ef565b73ffffffffffffffffffffffffffffffffffffffff1614612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90614cd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90614bb9565b60405180910390fd5b612d71838383613499565b612d7c600082612ae9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dcc9190614f6a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e239190614e89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000821415612f24576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613038565b600082905060005b60008214612f56578080612f3f906150ff565b915050600a82612f4f9190614edf565b9150612f2c565b60008167ffffffffffffffff811115612f7257612f71615264565b5b6040519080825280601f01601f191660200182016040528015612fa45781602001600182028036833780820191505090505b5090505b6000851461303157600182612fbd9190614f6a565b9150600a85612fcc9190615148565b6030612fd89190614e89565b60f81b818381518110612fee57612fed615235565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561302a9190614edf565b9450612fa8565b8093505050505b919050565b600081604051602001613050919061478c565b6040516020818303038152906040528051906020012060001c9050919050565b60606000839050600083905060008151835161308c9190614e89565b67ffffffffffffffff8111156130a5576130a4615264565b5b6040519080825280601f01601f1916602001820160405280156130d75781602001600182028036833780820191505090505b5090506000819050600080600091505b855182101561316f5785828151811061310357613102615235565b5b602001015160f81c60f81b83828061311a906150ff565b93508151811061312d5761312c615235565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180613167906150ff565b9250506130e7565b600091505b84518210156131fc578482815181106131905761318f615235565b5b602001015160f81c60f81b8382806131a7906150ff565b9350815181106131ba576131b9615235565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806131f4906150ff565b925050613174565b82965050505050505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836132df9190614f10565b905092915050565b600081600001549050919050565b600081836133039190614e89565b905092915050565b6001816000016000828254019250508190555050565b61333b8282604051806020016040528060008152506135ad565b5050565b61334a848484612c80565b61335684848484613608565b613395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338c90614b59565b60405180910390fd5b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134a483838361379f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134e7576134e2816137a4565b613526565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135255761352483826137ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613569576135648161395a565b6135a8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135a7576135a68282613a2b565b5b5b505050565b6135b78383613aaa565b6135c46000848484613608565b613603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fa90614b59565b60405180910390fd5b505050565b60006136298473ffffffffffffffffffffffffffffffffffffffff16613c78565b15613792578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613652612ae1565b8786866040518563ffffffff1660e01b81526004016136749493929190614a5e565b602060405180830381600087803b15801561368e57600080fd5b505af19250505080156136bf57506040513d601f19601f820116820180604052508101906136bc9190613fd9565b60015b613742573d80600081146136ef576040519150601f19603f3d011682016040523d82523d6000602084013e6136f4565b606091505b5060008151141561373a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373190614b59565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613797565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137fa84611b4d565b6138049190614f6a565b90506000600760008481526020019081526020016000205490508181146138e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061396e9190614f6a565b905060006009600084815260200190815260200160002054905060006008838154811061399e5761399d615235565b5b9060005260206000200154905080600883815481106139c0576139bf615235565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a0f57613a0e615206565b5b6001900381819060005260206000200160009055905550505050565b6000613a3683611b4d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1190614c79565b60405180910390fd5b613b2381612a75565b15613b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5a90614b99565b60405180910390fd5b613b6f60008383613499565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bbf9190614e89565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000613c9e613c9984614dd9565b614db4565b905082815260208101848484011115613cba57613cb9615298565b5b613cc584828561505a565b509392505050565b6000613ce0613cdb84614e0a565b614db4565b905082815260208101848484011115613cfc57613cfb615298565b5b613d07848285615069565b509392505050565b600081359050613d1e81615eaa565b92915050565b600081359050613d3381615ec1565b92915050565b600081359050613d4881615ed8565b92915050565b600081519050613d5d81615ed8565b92915050565b600082601f830112613d7857613d77615293565b5b8135613d88848260208601613c8b565b91505092915050565b600081519050613da081615eef565b92915050565b600082601f830112613dbb57613dba615293565b5b8151613dcb848260208601613ccd565b91505092915050565b600081359050613de381615f06565b92915050565b600060208284031215613dff57613dfe6152a2565b5b6000613e0d84828501613d0f565b91505092915050565b60008060408385031215613e2d57613e2c6152a2565b5b6000613e3b85828601613d0f565b9250506020613e4c85828601613d0f565b9150509250929050565b600080600060608486031215613e6f57613e6e6152a2565b5b6000613e7d86828701613d0f565b9350506020613e8e86828701613d0f565b9250506040613e9f86828701613dd4565b9150509250925092565b60008060008060808587031215613ec357613ec26152a2565b5b6000613ed187828801613d0f565b9450506020613ee287828801613d0f565b9350506040613ef387828801613dd4565b925050606085013567ffffffffffffffff811115613f1457613f1361529d565b5b613f2087828801613d63565b91505092959194509250565b60008060408385031215613f4357613f426152a2565b5b6000613f5185828601613d0f565b9250506020613f6285828601613d24565b9150509250929050565b60008060408385031215613f8357613f826152a2565b5b6000613f9185828601613d0f565b9250506020613fa285828601613dd4565b9150509250929050565b600060208284031215613fc257613fc16152a2565b5b6000613fd084828501613d39565b91505092915050565b600060208284031215613fef57613fee6152a2565b5b6000613ffd84828501613d4e565b91505092915050565b60006020828403121561401c5761401b6152a2565b5b600061402a84828501613d91565b91505092915050565b600060208284031215614049576140486152a2565b5b600082015167ffffffffffffffff8111156140675761406661529d565b5b61407384828501613da6565b91505092915050565b600060208284031215614092576140916152a2565b5b60006140a084828501613dd4565b91505092915050565b6140b281614f9e565b82525050565b6140c181614fb0565b82525050565b60006140d282614e3b565b6140dc8185614e51565b93506140ec818560208601615069565b6140f5816152a7565b840191505092915050565b61410981615024565b82525050565b600061411a82614e46565b6141248185614e6d565b9350614134818560208601615069565b61413d816152a7565b840191505092915050565b600061415382614e46565b61415d8185614e7e565b935061416d818560208601615069565b80840191505092915050565b6000614186600183614e7e565b9150614191826152b8565b600182019050919050565b60006141a9600183614e7e565b91506141b4826152e1565b600182019050919050565b60006141cc600183614e7e565b91506141d78261530a565b600182019050919050565b60006141ef600683614e7e565b91506141fa82615333565b600682019050919050565b6000614212602b83614e6d565b915061421d8261535c565b604082019050919050565b6000614235603283614e6d565b9150614240826153ab565b604082019050919050565b6000614258600183614e7e565b9150614263826153fa565b600182019050919050565b600061427b602683614e6d565b915061428682615423565b604082019050919050565b600061429e602383614e7e565b91506142a982615472565b602382019050919050565b60006142c1601c83614e6d565b91506142cc826154c1565b602082019050919050565b60006142e4600183614e7e565b91506142ef826154ea565b600182019050919050565b6000614307602d83614e7e565b915061431282615513565b602d82019050919050565b600061432a602683614e7e565b915061433582615562565b602682019050919050565b600061434d600183614e7e565b9150614358826155b1565b600182019050919050565b6000614370602483614e6d565b915061437b826155da565b604082019050919050565b6000614393601983614e6d565b915061439e82615629565b602082019050919050565b60006143b6604983614e7e565b91506143c182615652565b604982019050919050565b60006143d9602c83614e6d565b91506143e4826156c7565b604082019050919050565b60006143fc600183614e7e565b915061440782615716565b600182019050919050565b600061441f603883614e6d565b915061442a8261573f565b604082019050919050565b6000614442602a83614e6d565b915061444d8261578e565b604082019050919050565b6000614465602983614e6d565b9150614470826157dd565b604082019050919050565b6000614488600283614e7e565b91506144938261582c565b600282019050919050565b60006144ab600783614e7e565b91506144b682615855565b600782019050919050565b60006144ce602083614e6d565b91506144d98261587e565b602082019050919050565b60006144f1600683614e7e565b91506144fc826158a7565b600682019050919050565b6000614514602c83614e6d565b915061451f826158d0565b604082019050919050565b6000614537602083614e6d565b91506145428261591f565b602082019050919050565b600061455a600383614e7e565b915061456582615948565b600382019050919050565b600061457d602983614e6d565b915061458882615971565b604082019050919050565b60006145a0601283614e6d565b91506145ab826159c0565b602082019050919050565b60006145c3607283614e7e565b91506145ce826159e9565b607282019050919050565b60006145e6602183614e6d565b91506145f182615a84565b604082019050919050565b6000614609606383614e7e565b915061461482615ad3565b606382019050919050565b600061462c600083614e62565b915061463782615b6e565b600082019050919050565b600061464f601383614e7e565b915061465a82615b71565b601382019050919050565b6000614672603183614e6d565b915061467d82615b9a565b604082019050919050565b6000614695604783614e7e565b91506146a082615be9565b604782019050919050565b60006146b8602c83614e6d565b91506146c382615c5e565b604082019050919050565b60006146db600183614e7e565b91506146e682615cad565b600182019050919050565b60006146fe60aa83614e7e565b915061470982615cd6565b60aa82019050919050565b6000614721601f83614e6d565b915061472c82615dbd565b602082019050919050565b6000614744600683614e7e565b915061474f82615de6565b600682019050919050565b6000614767606383614e7e565b915061477282615e0f565b606382019050919050565b6147868161501a565b82525050565b60006147988284614148565b915081905092915050565b60006147ae82614179565b91506147ba8284614148565b915081905092915050565b60006147d08261419c565b91506147dc8284614148565b915081905092915050565b60006147f2826141bf565b91506147fe8284614148565b915081905092915050565b6000614814826141e2565b91506148208284614148565b915081905092915050565b60006148368261424b565b91506148428284614148565b915081905092915050565b6000614858826142d7565b91506148648284614148565b915081905092915050565b600061487a826142fa565b91506148868285614148565b915061489182614291565b915061489d8284614148565b91506148a88261447b565b91508190509392505050565b60006148bf82614340565b91506148cb8284614148565b915081905092915050565b60006148e1826143ef565b91506148ed8284614148565b915081905092915050565b6000614903826144e4565b915061490f8284614148565b915081905092915050565b60006149258261461f565b9150819050919050565b600061493a826146ce565b91506149468284614148565b915081905092915050565b600061495c826146f1565b9150614967826143a9565b91506149728261431d565b915061497e8289614148565b915061498982614642565b915061499482614688565b915061499f8261475a565b91506149ab8288614148565b91506149b68261449e565b91506149c1826145fc565b91506149cd8287614148565b91506149d88261449e565b91506149e3826145b6565b91506149ef8286614148565b91506149fa8261454d565b9150614a068285614148565b9150614a118261454d565b9150614a1d8284614148565b9150614a288261449e565b9150614a3382614737565b9150819050979650505050505050565b6000602082019050614a5860008301846140a9565b92915050565b6000608082019050614a7360008301876140a9565b614a8060208301866140a9565b614a8d604083018561477d565b8181036060830152614a9f81846140c7565b905095945050505050565b6000602082019050614abf60008301846140b8565b92915050565b6000602082019050614ada6000830184614100565b92915050565b60006020820190508181036000830152614afa818461410f565b905092915050565b60006040820190508181036000830152614b1c818561410f565b90508181036020830152614b30818461410f565b90509392505050565b60006020820190508181036000830152614b5281614205565b9050919050565b60006020820190508181036000830152614b7281614228565b9050919050565b60006020820190508181036000830152614b928161426e565b9050919050565b60006020820190508181036000830152614bb2816142b4565b9050919050565b60006020820190508181036000830152614bd281614363565b9050919050565b60006020820190508181036000830152614bf281614386565b9050919050565b60006020820190508181036000830152614c12816143cc565b9050919050565b60006020820190508181036000830152614c3281614412565b9050919050565b60006020820190508181036000830152614c5281614435565b9050919050565b60006020820190508181036000830152614c7281614458565b9050919050565b60006020820190508181036000830152614c92816144c1565b9050919050565b60006020820190508181036000830152614cb281614507565b9050919050565b60006020820190508181036000830152614cd28161452a565b9050919050565b60006020820190508181036000830152614cf281614570565b9050919050565b60006020820190508181036000830152614d1281614593565b9050919050565b60006020820190508181036000830152614d32816145d9565b9050919050565b60006020820190508181036000830152614d5281614665565b9050919050565b60006020820190508181036000830152614d72816146ab565b9050919050565b60006020820190508181036000830152614d9281614714565b9050919050565b6000602082019050614dae600083018461477d565b92915050565b6000614dbe614dcf565b9050614dca82826150ce565b919050565b6000604051905090565b600067ffffffffffffffff821115614df457614df3615264565b5b614dfd826152a7565b9050602081019050919050565b600067ffffffffffffffff821115614e2557614e24615264565b5b614e2e826152a7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e948261501a565b9150614e9f8361501a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ed457614ed3615179565b5b828201905092915050565b6000614eea8261501a565b9150614ef58361501a565b925082614f0557614f046151a8565b5b828204905092915050565b6000614f1b8261501a565b9150614f268361501a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f5f57614f5e615179565b5b828202905092915050565b6000614f758261501a565b9150614f808361501a565b925082821015614f9357614f92615179565b5b828203905092915050565b6000614fa982614ffa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614ff382614f9e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061502f82615036565b9050919050565b600061504182615048565b9050919050565b600061505382614ffa565b9050919050565b82818337600083830152505050565b60005b8381101561508757808201518184015260208101905061506c565b83811115615096576000848401525b50505050565b600060028204905060018216806150b457607f821691505b602082108114156150c8576150c76151d7565b5b50919050565b6150d7826152a7565b810181811067ffffffffffffffff821117156150f6576150f5615264565b5b80604052505050565b600061510a8261501a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561513d5761513c615179565b5b600182019050919050565b60006151538261501a565b915061515e8361501a565b92508261516e5761516d6151a8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4100000000000000000000000000000000000000000000000000000000000000600082015250565b7f4700000000000000000000000000000000000000000000000000000000000000600082015250565b7f4c75636b79330000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b757460008201527f66382c0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4800000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a22466f7274756e65202300000000000000000000000000000000000000602082015250565b7f786c696e6b3a687265663d27646174613a696d6167652f7376672b786d6c3b6260008201527f61736536342c0000000000000000000000000000000000000000000000000000602082015250565b7f4500000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c646566733e3c66696c7465722069643d2763273e3c6665496d61676520783d60008201527f27302720793d273027206865696768743d27313032347078272077696474683d60208201527f2731303234707827200000000000000000000000000000000000000000000000604082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4400000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c2f746578743e00000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4c75636b79320000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f202d200000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792041646d696e20616c6c6f7765640000000000000000000000000000600082015250565b7f3c7465787420783d273638302720793d273539302720666f6e742d73697a653d60008201527f27312e3235656d27207472616e73666f726d3d277472616e736c617465282d3360208201527f302c33302920726f74617465282d35292720746578744c656e6774683d27323660408201527f35273e4c75636b79204e756d626572733a200000000000000000000000000000606082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c7465787420783d273530382720793d273535302720666f6e742d73697a653d60008201527f27312e3235656d27207472616e73666f726d3d277472616e736c617465282d3360208201527f302c33302920726f74617465282d35292720746578744c656e6774683d27343460408201527f30273e0000000000000000000000000000000000000000000000000000000000606082015250565b50565b7f272f3e3c2f66696c7465723e3c2f646566733e00000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3c7265637420783d27302720793d273027206865696768743d2731303234272060008201527f77696474683d273130323427207374796c653d2766696c7465723a75726c282360208201527f63293b27202f3e00000000000000000000000000000000000000000000000000604082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4600000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7376672077696474683d273130323427206865696768743d2731303234272060008201527f7072657365727665417370656374526174696f3d27784d696e594d696e206d6560208201527f6574272076696577426f783d27302030203130323420313032342720786d6c6e60408201527f733d27687474703a2f2f7777772e77332e6f72672f323030302f73766727207860608201527f6d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313960808201527f39392f786c696e6b273e0000000000000000000000000000000000000000000060a082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b7f3c7465787420783d273530382720793d273531352720666f6e742d73697a653d60008201527f27312e3235656d27207472616e73666f726d3d277472616e736c617465282d3360208201527f302c33302920726f74617465282d35292720746578744c656e6774683d27343460408201527f30273e0000000000000000000000000000000000000000000000000000000000606082015250565b615eb381614f9e565b8114615ebe57600080fd5b50565b615eca81614fb0565b8114615ed557600080fd5b50565b615ee181614fbc565b8114615eec57600080fd5b50565b615ef881614fe8565b8114615f0357600080fd5b50565b615f0f8161501a565b8114615f1a57600080fd5b5056fea2646970667358221220844ed5d62ddbb326393d917220a832012941d2706101709dbd174a69642c75ea64736f6c63430008070033

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

0000000000000000000000001d485868251ba82b6462f83774bfdae8e998243e0000000000000000000000007682969b74d73dd72963fdb353476a5c3cecf786000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _ccData (address): 0x1d485868251Ba82b6462F83774BFDae8E998243E
Arg [1] : _admin (address): 0x7682969b74d73dd72963Fdb353476a5C3cecf786
Arg [2] : openseaProxyRegistry_ (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d485868251ba82b6462f83774bfdae8e998243e
Arg [1] : 0000000000000000000000007682969b74d73dd72963fdb353476a5c3cecf786
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

57501:9294:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58567:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43011:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14249:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15808:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15331:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43651:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57757:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16698:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65536:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43319:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62572:2139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;17108:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43841:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65827:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13943:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58105:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13673:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32055:94;;;;;;;;;;;;;:::i;:::-;;58970:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57718:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64719:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58496:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31404:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14418:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59877:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57961:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16101:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66619:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17364:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59213:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60344:2072;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58049:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57688:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58869:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65722:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66300:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32304:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58567:295;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43011:224::-;43113:4;43152:35;43137:50;;;:11;:50;;;;:90;;;;43191:36;43215:11;43191:23;:36::i;:::-;43137:90;43130:97;;43011:224;;;:::o;14249:100::-;14303:13;14336:5;14329:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14249:100;:::o;15808:221::-;15884:7;15912:16;15920:7;15912;:16::i;:::-;15904:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15997:15;:24;16013:7;15997:24;;;;;;;;;;;;;;;;;;;;;15990:31;;15808:221;;;:::o;15331:411::-;15412:13;15428:23;15443:7;15428:14;:23::i;:::-;15412:39;;15476:5;15470:11;;:2;:11;;;;15462:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;15570:5;15554:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;15579:37;15596:5;15603:12;:10;:12::i;:::-;15579:16;:37::i;:::-;15554:62;15532:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;15713:21;15722:2;15726:7;15713:8;:21::i;:::-;15401:341;15331:411;;:::o;43651:113::-;43712:7;43739:10;:17;;;;43732:24;;43651:113;:::o;57757:45::-;;;;:::o;16698:339::-;16893:41;16912:12;:10;:12::i;:::-;16926:7;16893:18;:41::i;:::-;16885:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;17001:28;17011:4;17017:2;17021:7;17001:9;:28::i;:::-;16698:339;;;:::o;65536:178::-;59472:10;59463:19;;:5;;;;;;;;;;;:19;;;59455:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;65626:21:::1;65616:6;:31;;65608:40;;;::::0;::::1;;65663:5;;;;;;;;;;;:10;;65680:21;65663:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65536:178:::0;:::o;43319:256::-;43416:7;43452:23;43469:5;43452:16;:23::i;:::-;43444:5;:31;43436:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43541:12;:19;43554:5;43541:19;;;;;;;;;;;;;;;:26;43561:5;43541:26;;;;;;;;;;;;43534:33;;43319:256;;;;:::o;62572:2139::-;62658:13;62673;62704:22;62729:19;:8;:17;:19::i;:::-;62704:44;;62759:16;:21;;;;;;;;;;;;;;62791:16;:21;;;;;;;;;;;;;;62828:190;62849:2;62866:1;62983;:8;;;;62887:93;62951:8;62929:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;62887:12;:93::i;:::-;:104;;;;:::i;:::-;62866:141;;;;;;;;:::i;:::-;;;;;;;;;62828:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;62823:195;;63034:15;63041:2;63034:15;;;;;;;;;;;;;;;;;:6;:15::i;:::-;63029:20;;63065:190;63086:2;63103:1;63220;:8;;;;63124:93;63188:8;63166:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;63124:12;:93::i;:::-;:104;;;;:::i;:::-;63103:141;;;;;;;;:::i;:::-;;;;;;;;;63065:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;63060:195;;63271:15;63278:2;63271:15;;;;;;;;;;;;;;;;;:6;:15::i;:::-;63266:20;;63302:190;63323:2;63340:1;63457;:8;;;;63361:93;63425:8;63403:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;63361:12;:93::i;:::-;:104;;;;:::i;:::-;63340:141;;;;;;;;:::i;:::-;;;;;;;;;63302:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;63297:195;;63508:15;63515:2;63508:15;;;;;;;;;;;;;;;;;:6;:15::i;:::-;63503:20;;63539:190;63560:2;63577:1;63694;:8;;;;63598:93;63662:8;63640:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;63598:12;:93::i;:::-;:104;;;;:::i;:::-;63577:141;;;;;;;;:::i;:::-;;;;;;;;;63539:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;63534:195;;63745:190;63766:2;63783:1;63900;:8;;;;63804:93;63868:8;63846:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;63804:12;:93::i;:::-;:104;;;;:::i;:::-;63783:141;;;;;;;;:::i;:::-;;;;;;;;;63745:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;63740:195;;63951:15;63958:2;63951:15;;;;;;;;;;;;;;;;;:6;:15::i;:::-;63946:20;;63982:190;64003:2;64020:1;64137;:8;;;;64041:93;64105:8;64083:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;64041:12;:93::i;:::-;:104;;;;:::i;:::-;64020:141;;;;;;;;:::i;:::-;;;;;;;;;63982:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;63977:195;;64188:15;64195:2;64188:15;;;;;;;;;;;;;;;;;:6;:15::i;:::-;64183:20;;64219:190;64240:2;64257:1;64374;:8;;;;64278:93;64342:8;64320:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;64278:12;:93::i;:::-;:104;;;;:::i;:::-;64257:141;;;;;;;;:::i;:::-;;;;;;;;;64219:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;64214:195;;64425:15;64432:2;64425:15;;;;;;;;;;;;;;;;;:6;:15::i;:::-;64420:20;;64456:190;64477:2;64494:1;64611;:8;;;;64515:93;64579:8;64557:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;64515:12;:93::i;:::-;:104;;;;:::i;:::-;64494:141;;;;;;;;:::i;:::-;;;;;;;;;64456:190;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:190::i;:::-;64451:195;;64662:15;64669:2;64662:15;;;;;;;;;;;;;;;;;:6;:15::i;:::-;64657:20;;64696:2;64700;64688:15;;;;;;;62572:2139;;;:::o;17108:185::-;17246:39;17263:4;17269:2;17273:7;17246:39;;;;;;;;;;;;:16;:39::i;:::-;17108:185;;;:::o;43841:233::-;43916:7;43952:30;:28;:30::i;:::-;43944:5;:38;43936:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44049:10;44060:5;44049:17;;;;;;;;:::i;:::-;;;;;;;;;;44042:24;;43841:233;;;:::o;65827:318::-;65938:4;65960:27;65990:14;;;;;;;;;;;65960:44;;66069:1;66035:36;;66043:13;66035:36;;;;:102;;;;;66129:8;66088:49;;66096:13;:21;;;66118:5;66096:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66088:49;;;66035:102;66015:122;;;65827:318;;;;:::o;13943:239::-;14015:7;14035:13;14051:7;:16;14059:7;14051:16;;;;;;;;;;;;;;;;;;;;;14035:32;;14103:1;14086:19;;:5;:19;;;;14078:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14169:5;14162:12;;;13943:239;;;:::o;58105:384::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13673:208::-;13745:7;13790:1;13773:19;;:5;:19;;;;13765:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;13857:9;:16;13867:5;13857:16;;;;;;;;;;;;;;;;13850:23;;13673:208;;;:::o;32055:94::-;31635:12;:10;:12::i;:::-;31624:23;;:7;:5;:7::i;:::-;:23;;;31616:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32120:21:::1;32138:1;32120:9;:21::i;:::-;32055:94::o:0;58970:236::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57718:32::-;;;;:::o;64719:100::-;59472:10;59463:19;;:5;;;;;;;;;;;:19;;;59455:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;64803:7:::1;64786:6;;:25;;;;;;;;;;;;;;;;;;64719:100:::0;:::o;58496:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31404:87::-;31450:7;31477:6;;;;;;;;;;;31470:13;;31404:87;:::o;14418:104::-;14474:13;14507:7;14500:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14418:104;:::o;59877:459::-;1747:1;2343:7;;:19;;2335:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1;2476:7;:18;;;;59991:9:::1;59955:32;59979:7;59963:10;;59955:23;;:32;;;;:::i;:::-;:45;59947:54;;;::::0;::::1;;60031:1;60020:7;:12;;60012:21;;;::::0;::::1;;60102:10;;60066:32;60090:7;60066:19;:9;:17;:19::i;:::-;:23;;:32;;;;:::i;:::-;:46;;60044:79;;;::::0;::::1;;60139:9;60134:195;60158:7;60154:1;:11;60134:195;;;60187:21;:9;:19;:21::i;:::-;60223;60247:19;:9;:17;:19::i;:::-;60223:43;;60281:36;60291:10;60303:13;60281:9;:36::i;:::-;60172:157;60167:3;;;;;:::i;:::-;;;;60134:195;;;;1703:1:::0;2655:7;:22;;;;59877:459;:::o;57961:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16101:295::-;16216:12;:10;:12::i;:::-;16204:24;;:8;:24;;;;16196:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;16316:8;16271:18;:32;16290:12;:10;:12::i;:::-;16271:32;;;;;;;;;;;;;;;:42;16304:8;16271:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;16369:8;16340:48;;16355:12;:10;:12::i;:::-;16340:48;;;16379:8;16340:48;;;;;;:::i;:::-;;;;;;;;16101:295;;:::o;66619:171::-;59472:10;59463:19;;:5;;;;;;;;;;;:19;;;59455:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;66761:20:::1;66730:14;;:52;;;;;;;;;;;;;;;;;;66619:171:::0;:::o;17364:328::-;17539:41;17558:12;:10;:12::i;:::-;17572:7;17539:18;:41::i;:::-;17531:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;17645:39;17659:4;17665:2;17669:7;17678:5;17645:13;:39::i;:::-;17364:328;;;;:::o;59213:201::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60344:2072::-;60463:13;60502:17;60510:8;60502:7;:17::i;:::-;60494:26;;;;;;60531:16;60558;60596:20;60607:8;60596:10;:20::i;:::-;60585:31;;;;;;;;60627:21;61051:6;;;;;;;;;;;:13;;;61065:8;61051:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61345:2;61514;61698:19;:8;:17;:19::i;:::-;61760:95;61842:1;61834:4;61762:69;61809:19;:8;:17;:19::i;:::-;61782:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;61762:12;:69::i;:::-;:76;;;;:::i;:::-;61761:82;;;;:::i;:::-;61760:93;:95::i;:::-;61898;61980:1;61972:4;61900:69;61947:19;:8;:17;:19::i;:::-;61920:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;61900:12;:69::i;:::-;:76;;;;:::i;:::-;61899:82;;;;:::i;:::-;61898:93;:95::i;:::-;60672:1391;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60627:1447;;62238:19;:8;:17;:19::i;:::-;62340:7;62130:263;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62085:323;;;;;60344:2072;;;:::o;58049:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57688:21::-;;;;;;;;;;;;;:::o;58869:94::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65722:97::-;65766:13;65799:12;65792:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65722:97;:::o;66300:311::-;66442:4;66468:37;66489:5;66496:8;66468:20;:37::i;:::-;66464:81;;;66529:4;66522:11;;;;66464:81;66564:39;66587:5;66594:8;66564:22;:39::i;:::-;66557:46;;66300:311;;;;;:::o;32304:192::-;31635:12;:10;:12::i;:::-;31624:23;;:7;:5;:7::i;:::-;:23;;;31616:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32413:1:::1;32393:22;;:8;:22;;;;32385:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32469:19;32479:8;32469:9;:19::i;:::-;32304:192:::0;:::o;13304:305::-;13406:4;13458:25;13443:40;;;:11;:40;;;;:105;;;;13515:33;13500:48;;;:11;:48;;;;13443:105;:158;;;;13565:36;13589:11;13565:23;:36::i;:::-;13443:158;13423:178;;13304:305;;;:::o;19202:127::-;19267:4;19319:1;19291:30;;:7;:16;19299:7;19291:16;;;;;;;;;;;;;;;;;;;;;:30;;;;19284:37;;19202:127;;;:::o;4729:98::-;4782:7;4809:10;4802:17;;4729:98;:::o;23184:174::-;23286:2;23259:15;:24;23275:7;23259:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;23342:7;23338:2;23304:46;;23313:23;23328:7;23313:14;:23::i;:::-;23304:46;;;;;;;;;;;;23184:174;;:::o;19496:348::-;19589:4;19614:16;19622:7;19614;:16::i;:::-;19606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19690:13;19706:23;19721:7;19706:14;:23::i;:::-;19690:39;;19759:5;19748:16;;:7;:16;;;:51;;;;19792:7;19768:31;;:20;19780:7;19768:11;:20::i;:::-;:31;;;19748:51;:87;;;;19803:32;19820:5;19827:7;19803:16;:32::i;:::-;19748:87;19740:96;;;19496:348;;;;:::o;22488:578::-;22647:4;22620:31;;:23;22635:7;22620:14;:23::i;:::-;:31;;;22612:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;22730:1;22716:16;;:2;:16;;;;22708:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;22786:39;22807:4;22813:2;22817:7;22786:20;:39::i;:::-;22890:29;22907:1;22911:7;22890:8;:29::i;:::-;22951:1;22932:9;:15;22942:4;22932:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;22980:1;22963:9;:13;22973:2;22963:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;23011:2;22992:7;:16;23000:7;22992:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;23050:7;23046:2;23031:27;;23040:4;23031:27;;;;;;;;;;;;22488:578;;;:::o;28645:723::-;28701:13;28931:1;28922:5;:10;28918:53;;;28949:10;;;;;;;;;;;;;;;;;;;;;28918:53;28981:12;28996:5;28981:20;;29012:14;29037:78;29052:1;29044:4;:9;29037:78;;29070:8;;;;;:::i;:::-;;;;29101:2;29093:10;;;;;:::i;:::-;;;29037:78;;;29125:19;29157:6;29147:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29125:39;;29175:154;29191:1;29182:5;:10;29175:154;;29219:1;29209:11;;;;;:::i;:::-;;;29286:2;29278:5;:10;;;;:::i;:::-;29265:2;:24;;;;:::i;:::-;29252:39;;29235:6;29242;29235:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;29315:2;29306:11;;;;;:::i;:::-;;;29175:154;;;29353:6;29339:21;;;;;28645:723;;;;:::o;62424:140::-;62488:7;62550:3;62533:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;62523:32;;;;;;62515:41;;62508:48;;62424:140;;;:::o;64827:701::-;64936:13;64967:23;64999:5;64967:38;;65016:24;65049:6;65016:40;;65069:23;65140:11;:18;65120:10;:17;:38;;;;:::i;:::-;65095:74;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65069:100;;65180:22;65211:9;65180:41;;65234:9;65254;65285:1;65281:5;;65276:97;65292:10;:17;65288:1;:21;65276:97;;;65348:10;65359:1;65348:13;;;;;;;;:::i;:::-;;;;;;;;;;65331:9;65341:3;;;;;:::i;:::-;;;65331:14;;;;;;;;:::i;:::-;;;;;:30;;;;;;;;;;;65311:3;;;;;:::i;:::-;;;;65276:97;;;65394:1;65390:5;;65385:99;65401:11;:18;65397:1;:22;65385:99;;;65458:11;65470:1;65458:14;;;;;;;;:::i;:::-;;;;;;;;;;65441:9;65451:3;;;;;:::i;:::-;;;65441:14;;;;;;;;:::i;:::-;;;;;:31;;;;;;;;;;;65421:3;;;;;:::i;:::-;;;;65385:99;;;65510:9;65496:24;;;;;;;;64827:701;;;;:::o;32504:173::-;32560:16;32579:6;;;;;;;;;;;32560:25;;32605:8;32596:6;;:17;;;;;;;;;;;;;;;;;;32660:8;32629:40;;32650:8;32629:40;;;;;;;;;;;;32549:128;32504:173;:::o;53915:98::-;53973:7;54004:1;54000;:5;;;;:::i;:::-;53993:12;;53915:98;;;;:::o;3513:114::-;3578:7;3605;:14;;;3598:21;;3513:114;;;:::o;53177:98::-;53235:7;53266:1;53262;:5;;;;:::i;:::-;53255:12;;53177:98;;;;:::o;3635:127::-;3742:1;3724:7;:14;;;:19;;;;;;;;;;;3635:127;:::o;20186:110::-;20262:26;20272:2;20276:7;20262:26;;;;;;;;;;;;:9;:26::i;:::-;20186:110;;:::o;18574:315::-;18731:28;18741:4;18747:2;18751:7;18731:9;:28::i;:::-;18778:48;18801:4;18807:2;18811:7;18820:5;18778:22;:48::i;:::-;18770:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;18574:315;;;;:::o;16467:164::-;16564:4;16588:18;:25;16607:5;16588:25;;;;;;;;;;;;;;;:35;16614:8;16588:35;;;;;;;;;;;;;;;;;;;;;;;;;16581:42;;16467:164;;;;:::o;6447:157::-;6532:4;6571:25;6556:40;;;:11;:40;;;;6549:47;;6447:157;;;:::o;44687:589::-;44831:45;44858:4;44864:2;44868:7;44831:26;:45::i;:::-;44909:1;44893:18;;:4;:18;;;44889:187;;;44928:40;44960:7;44928:31;:40::i;:::-;44889:187;;;44998:2;44990:10;;:4;:10;;;44986:90;;45017:47;45050:4;45056:7;45017:32;:47::i;:::-;44986:90;44889:187;45104:1;45090:16;;:2;:16;;;45086:183;;;45123:45;45160:7;45123:36;:45::i;:::-;45086:183;;;45196:4;45190:10;;:2;:10;;;45186:83;;45217:40;45245:2;45249:7;45217:27;:40::i;:::-;45186:83;45086:183;44687:589;;;:::o;20523:321::-;20653:18;20659:2;20663:7;20653:5;:18::i;:::-;20704:54;20735:1;20739:2;20743:7;20752:5;20704:22;:54::i;:::-;20682:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;20523:321;;;:::o;23923:799::-;24078:4;24099:15;:2;:13;;;:15::i;:::-;24095:620;;;24151:2;24135:36;;;24172:12;:10;:12::i;:::-;24186:4;24192:7;24201:5;24135:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;24131:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24394:1;24377:6;:13;:18;24373:272;;;24420:60;;;;;;;;;;:::i;:::-;;;;;;;;24373:272;24595:6;24589:13;24580:6;24576:2;24572:15;24565:38;24131:529;24268:41;;;24258:51;;;:6;:51;;;;24251:58;;;;;24095:620;24699:4;24692:11;;23923:799;;;;;;;:::o;25294:126::-;;;;:::o;45999:164::-;46103:10;:17;;;;46076:15;:24;46092:7;46076:24;;;;;;;;;;;:44;;;;46131:10;46147:7;46131:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45999:164;:::o;46790:988::-;47056:22;47106:1;47081:22;47098:4;47081:16;:22::i;:::-;:26;;;;:::i;:::-;47056:51;;47118:18;47139:17;:26;47157:7;47139:26;;;;;;;;;;;;47118:47;;47286:14;47272:10;:28;47268:328;;47317:19;47339:12;:18;47352:4;47339:18;;;;;;;;;;;;;;;:34;47358:14;47339:34;;;;;;;;;;;;47317:56;;47423:11;47390:12;:18;47403:4;47390:18;;;;;;;;;;;;;;;:30;47409:10;47390:30;;;;;;;;;;;:44;;;;47540:10;47507:17;:30;47525:11;47507:30;;;;;;;;;;;:43;;;;47302:294;47268:328;47692:17;:26;47710:7;47692:26;;;;;;;;;;;47685:33;;;47736:12;:18;47749:4;47736:18;;;;;;;;;;;;;;;:34;47755:14;47736:34;;;;;;;;;;;47729:41;;;46871:907;;46790:988;;:::o;48073:1079::-;48326:22;48371:1;48351:10;:17;;;;:21;;;;:::i;:::-;48326:46;;48383:18;48404:15;:24;48420:7;48404:24;;;;;;;;;;;;48383:45;;48755:19;48777:10;48788:14;48777:26;;;;;;;;:::i;:::-;;;;;;;;;;48755:48;;48841:11;48816:10;48827;48816:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48952:10;48921:15;:28;48937:11;48921:28;;;;;;;;;;;:41;;;;49093:15;:24;49109:7;49093:24;;;;;;;;;;;49086:31;;;49128:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48144:1008;;;48073:1079;:::o;45577:221::-;45662:14;45679:20;45696:2;45679:16;:20::i;:::-;45662:37;;45737:7;45710:12;:16;45723:2;45710:16;;;;;;;;;;;;;;;:24;45727:6;45710:24;;;;;;;;;;;:34;;;;45784:6;45755:17;:26;45773:7;45755:26;;;;;;;;;;;:35;;;;45651:147;45577:221;;:::o;21180:382::-;21274:1;21260:16;;:2;:16;;;;21252:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;21333:16;21341:7;21333;:16::i;:::-;21332:17;21324:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;21395:45;21424:1;21428:2;21432:7;21395:20;:45::i;:::-;21470:1;21453:9;:13;21463:2;21453:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;21501:2;21482:7;:16;21490:7;21482:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;21546:7;21542:2;21521:33;;21538:1;21521:33;;;;;;;;;;;;21180:382;;:::o;33450:387::-;33510:4;33718:12;33785:7;33773:20;33765:28;;33828:1;33821:4;:8;33814:15;;;33450:387;;;:::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:421::-;512:5;537:66;553:49;595:6;553:49;:::i;:::-;537:66;:::i;:::-;528:75;;626:6;619:5;612:21;664:4;657:5;653:16;702:3;693:6;688:3;684:16;681:25;678:112;;;709:79;;:::i;:::-;678:112;799:39;831:6;826:3;821;799:39;:::i;:::-;518:326;423:421;;;;;:::o;850:139::-;896:5;934:6;921:20;912:29;;950:33;977:5;950:33;:::i;:::-;850:139;;;;:::o;995:133::-;1038:5;1076:6;1063:20;1054:29;;1092:30;1116:5;1092:30;:::i;:::-;995:133;;;;:::o;1134:137::-;1179:5;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1134:137;;;;:::o;1277:141::-;1333:5;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1277:141;;;;:::o;1437:338::-;1492:5;1541:3;1534:4;1526:6;1522:17;1518:27;1508:122;;1549:79;;:::i;:::-;1508:122;1666:6;1653:20;1691:78;1765:3;1757:6;1750:4;1742:6;1738:17;1691:78;:::i;:::-;1682:87;;1498:277;1437:338;;;;:::o;1781:201::-;1867:5;1898:6;1892:13;1883:22;;1914:62;1970:5;1914:62;:::i;:::-;1781:201;;;;:::o;2002:355::-;2069:5;2118:3;2111:4;2103:6;2099:17;2095:27;2085:122;;2126:79;;:::i;:::-;2085:122;2236:6;2230:13;2261:90;2347:3;2339:6;2332:4;2324:6;2320:17;2261:90;:::i;:::-;2252:99;;2075:282;2002:355;;;;:::o;2363:139::-;2409:5;2447:6;2434:20;2425:29;;2463:33;2490:5;2463:33;:::i;:::-;2363:139;;;;:::o;2508:329::-;2567:6;2616:2;2604:9;2595:7;2591:23;2587:32;2584:119;;;2622:79;;:::i;:::-;2584:119;2742:1;2767:53;2812:7;2803:6;2792:9;2788:22;2767:53;:::i;:::-;2757:63;;2713:117;2508:329;;;;:::o;2843:474::-;2911:6;2919;2968:2;2956:9;2947:7;2943:23;2939:32;2936:119;;;2974:79;;:::i;:::-;2936:119;3094:1;3119:53;3164:7;3155:6;3144:9;3140:22;3119:53;:::i;:::-;3109:63;;3065:117;3221:2;3247:53;3292:7;3283:6;3272:9;3268:22;3247:53;:::i;:::-;3237:63;;3192:118;2843:474;;;;;:::o;3323:619::-;3400:6;3408;3416;3465:2;3453:9;3444:7;3440:23;3436:32;3433:119;;;3471:79;;:::i;:::-;3433:119;3591:1;3616:53;3661:7;3652:6;3641:9;3637:22;3616:53;:::i;:::-;3606:63;;3562:117;3718:2;3744:53;3789:7;3780:6;3769:9;3765:22;3744:53;:::i;:::-;3734:63;;3689:118;3846:2;3872:53;3917:7;3908:6;3897:9;3893:22;3872:53;:::i;:::-;3862:63;;3817:118;3323:619;;;;;:::o;3948:943::-;4043:6;4051;4059;4067;4116:3;4104:9;4095:7;4091:23;4087:33;4084:120;;;4123:79;;:::i;:::-;4084:120;4243:1;4268:53;4313:7;4304:6;4293:9;4289:22;4268:53;:::i;:::-;4258:63;;4214:117;4370:2;4396:53;4441:7;4432:6;4421:9;4417:22;4396:53;:::i;:::-;4386:63;;4341:118;4498:2;4524:53;4569:7;4560:6;4549:9;4545:22;4524:53;:::i;:::-;4514:63;;4469:118;4654:2;4643:9;4639:18;4626:32;4685:18;4677:6;4674:30;4671:117;;;4707:79;;:::i;:::-;4671:117;4812:62;4866:7;4857:6;4846:9;4842:22;4812:62;:::i;:::-;4802:72;;4597:287;3948:943;;;;;;;:::o;4897:468::-;4962:6;4970;5019:2;5007:9;4998:7;4994:23;4990:32;4987:119;;;5025:79;;:::i;:::-;4987:119;5145:1;5170:53;5215:7;5206:6;5195:9;5191:22;5170:53;:::i;:::-;5160:63;;5116:117;5272:2;5298:50;5340:7;5331:6;5320:9;5316:22;5298:50;:::i;:::-;5288:60;;5243:115;4897:468;;;;;:::o;5371:474::-;5439:6;5447;5496:2;5484:9;5475:7;5471:23;5467:32;5464:119;;;5502:79;;:::i;:::-;5464:119;5622:1;5647:53;5692:7;5683:6;5672:9;5668:22;5647:53;:::i;:::-;5637:63;;5593:117;5749:2;5775:53;5820:7;5811:6;5800:9;5796:22;5775:53;:::i;:::-;5765:63;;5720:118;5371:474;;;;;:::o;5851:327::-;5909:6;5958:2;5946:9;5937:7;5933:23;5929:32;5926:119;;;5964:79;;:::i;:::-;5926:119;6084:1;6109:52;6153:7;6144:6;6133:9;6129:22;6109:52;:::i;:::-;6099:62;;6055:116;5851:327;;;;:::o;6184:349::-;6253:6;6302:2;6290:9;6281:7;6277:23;6273:32;6270:119;;;6308:79;;:::i;:::-;6270:119;6428:1;6453:63;6508:7;6499:6;6488:9;6484:22;6453:63;:::i;:::-;6443:73;;6399:127;6184:349;;;;:::o;6539:409::-;6638:6;6687:2;6675:9;6666:7;6662:23;6658:32;6655:119;;;6693:79;;:::i;:::-;6655:119;6813:1;6838:93;6923:7;6914:6;6903:9;6899:22;6838:93;:::i;:::-;6828:103;;6784:157;6539:409;;;;:::o;6954:524::-;7034:6;7083:2;7071:9;7062:7;7058:23;7054:32;7051:119;;;7089:79;;:::i;:::-;7051:119;7230:1;7219:9;7215:17;7209:24;7260:18;7252:6;7249:30;7246:117;;;7282:79;;:::i;:::-;7246:117;7387:74;7453:7;7444:6;7433:9;7429:22;7387:74;:::i;:::-;7377:84;;7180:291;6954:524;;;;:::o;7484:329::-;7543:6;7592:2;7580:9;7571:7;7567:23;7563:32;7560:119;;;7598:79;;:::i;:::-;7560:119;7718:1;7743:53;7788:7;7779:6;7768:9;7764:22;7743:53;:::i;:::-;7733:63;;7689:117;7484:329;;;;:::o;7819:118::-;7906:24;7924:5;7906:24;:::i;:::-;7901:3;7894:37;7819:118;;:::o;7943:109::-;8024:21;8039:5;8024:21;:::i;:::-;8019:3;8012:34;7943:109;;:::o;8058:360::-;8144:3;8172:38;8204:5;8172:38;:::i;:::-;8226:70;8289:6;8284:3;8226:70;:::i;:::-;8219:77;;8305:52;8350:6;8345:3;8338:4;8331:5;8327:16;8305:52;:::i;:::-;8382:29;8404:6;8382:29;:::i;:::-;8377:3;8373:39;8366:46;;8148:270;8058:360;;;;:::o;8424:163::-;8527:53;8574:5;8527:53;:::i;:::-;8522:3;8515:66;8424:163;;:::o;8593:364::-;8681:3;8709:39;8742:5;8709:39;:::i;:::-;8764:71;8828:6;8823:3;8764:71;:::i;:::-;8757:78;;8844:52;8889:6;8884:3;8877:4;8870:5;8866:16;8844:52;:::i;:::-;8921:29;8943:6;8921:29;:::i;:::-;8916:3;8912:39;8905:46;;8685:272;8593:364;;;;:::o;8963:377::-;9069:3;9097:39;9130:5;9097:39;:::i;:::-;9152:89;9234:6;9229:3;9152:89;:::i;:::-;9145:96;;9250:52;9295:6;9290:3;9283:4;9276:5;9272:16;9250:52;:::i;:::-;9327:6;9322:3;9318:16;9311:23;;9073:267;8963:377;;;;:::o;9346:400::-;9506:3;9527:84;9609:1;9604:3;9527:84;:::i;:::-;9520:91;;9620:93;9709:3;9620:93;:::i;:::-;9738:1;9733:3;9729:11;9722:18;;9346:400;;;:::o;9752:::-;9912:3;9933:84;10015:1;10010:3;9933:84;:::i;:::-;9926:91;;10026:93;10115:3;10026:93;:::i;:::-;10144:1;10139:3;10135:11;10128:18;;9752:400;;;:::o;10158:::-;10318:3;10339:84;10421:1;10416:3;10339:84;:::i;:::-;10332:91;;10432:93;10521:3;10432:93;:::i;:::-;10550:1;10545:3;10541:11;10534:18;;10158:400;;;:::o;10564:::-;10724:3;10745:84;10827:1;10822:3;10745:84;:::i;:::-;10738:91;;10838:93;10927:3;10838:93;:::i;:::-;10956:1;10951:3;10947:11;10940:18;;10564:400;;;:::o;10970:366::-;11112:3;11133:67;11197:2;11192:3;11133:67;:::i;:::-;11126:74;;11209:93;11298:3;11209:93;:::i;:::-;11327:2;11322:3;11318:12;11311:19;;10970:366;;;:::o;11342:::-;11484:3;11505:67;11569:2;11564:3;11505:67;:::i;:::-;11498:74;;11581:93;11670:3;11581:93;:::i;:::-;11699:2;11694:3;11690:12;11683:19;;11342:366;;;:::o;11714:400::-;11874:3;11895:84;11977:1;11972:3;11895:84;:::i;:::-;11888:91;;11988:93;12077:3;11988:93;:::i;:::-;12106:1;12101:3;12097:11;12090:18;;11714:400;;;:::o;12120:366::-;12262:3;12283:67;12347:2;12342:3;12283:67;:::i;:::-;12276:74;;12359:93;12448:3;12359:93;:::i;:::-;12477:2;12472:3;12468:12;12461:19;;12120:366;;;:::o;12492:402::-;12652:3;12673:85;12755:2;12750:3;12673:85;:::i;:::-;12666:92;;12767:93;12856:3;12767:93;:::i;:::-;12885:2;12880:3;12876:12;12869:19;;12492:402;;;:::o;12900:366::-;13042:3;13063:67;13127:2;13122:3;13063:67;:::i;:::-;13056:74;;13139:93;13228:3;13139:93;:::i;:::-;13257:2;13252:3;13248:12;13241:19;;12900:366;;;:::o;13272:400::-;13432:3;13453:84;13535:1;13530:3;13453:84;:::i;:::-;13446:91;;13546:93;13635:3;13546:93;:::i;:::-;13664:1;13659:3;13655:11;13648:18;;13272:400;;;:::o;13678:402::-;13838:3;13859:85;13941:2;13936:3;13859:85;:::i;:::-;13852:92;;13953:93;14042:3;13953:93;:::i;:::-;14071:2;14066:3;14062:12;14055:19;;13678:402;;;:::o;14086:::-;14246:3;14267:85;14349:2;14344:3;14267:85;:::i;:::-;14260:92;;14361:93;14450:3;14361:93;:::i;:::-;14479:2;14474:3;14470:12;14463:19;;14086:402;;;:::o;14494:400::-;14654:3;14675:84;14757:1;14752:3;14675:84;:::i;:::-;14668:91;;14768:93;14857:3;14768:93;:::i;:::-;14886:1;14881:3;14877:11;14870:18;;14494:400;;;:::o;14900:366::-;15042:3;15063:67;15127:2;15122:3;15063:67;:::i;:::-;15056:74;;15139:93;15228:3;15139:93;:::i;:::-;15257:2;15252:3;15248:12;15241:19;;14900:366;;;:::o;15272:::-;15414:3;15435:67;15499:2;15494:3;15435:67;:::i;:::-;15428:74;;15511:93;15600:3;15511:93;:::i;:::-;15629:2;15624:3;15620:12;15613:19;;15272:366;;;:::o;15644:402::-;15804:3;15825:85;15907:2;15902:3;15825:85;:::i;:::-;15818:92;;15919:93;16008:3;15919:93;:::i;:::-;16037:2;16032:3;16028:12;16021:19;;15644:402;;;:::o;16052:366::-;16194:3;16215:67;16279:2;16274:3;16215:67;:::i;:::-;16208:74;;16291:93;16380:3;16291:93;:::i;:::-;16409:2;16404:3;16400:12;16393:19;;16052:366;;;:::o;16424:400::-;16584:3;16605:84;16687:1;16682:3;16605:84;:::i;:::-;16598:91;;16698:93;16787:3;16698:93;:::i;:::-;16816:1;16811:3;16807:11;16800:18;;16424:400;;;:::o;16830:366::-;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:400::-;18106:3;18127:84;18209:1;18204:3;18127:84;:::i;:::-;18120:91;;18220:93;18309:3;18220:93;:::i;:::-;18338:1;18333:3;18329:11;18322:18;;17946:400;;;:::o;18352:::-;18512:3;18533:84;18615:1;18610:3;18533:84;:::i;:::-;18526:91;;18626:93;18715:3;18626:93;:::i;:::-;18744:1;18739:3;18735:11;18728:18;;18352:400;;;:::o;18758:366::-;18900:3;18921:67;18985:2;18980:3;18921:67;:::i;:::-;18914:74;;18997:93;19086:3;18997:93;:::i;:::-;19115:2;19110:3;19106:12;19099:19;;18758:366;;;:::o;19130:400::-;19290:3;19311:84;19393:1;19388:3;19311:84;:::i;:::-;19304:91;;19404:93;19493:3;19404:93;:::i;:::-;19522:1;19517:3;19513:11;19506:18;;19130:400;;;:::o;19536:366::-;19678:3;19699:67;19763:2;19758:3;19699:67;:::i;:::-;19692:74;;19775:93;19864:3;19775:93;:::i;:::-;19893:2;19888:3;19884:12;19877:19;;19536:366;;;:::o;19908:::-;20050:3;20071:67;20135:2;20130:3;20071:67;:::i;:::-;20064:74;;20147:93;20236:3;20147:93;:::i;:::-;20265:2;20260:3;20256:12;20249:19;;19908:366;;;:::o;20280:400::-;20440:3;20461:84;20543:1;20538:3;20461:84;:::i;:::-;20454:91;;20554:93;20643:3;20554:93;:::i;:::-;20672:1;20667:3;20663:11;20656:18;;20280:400;;;:::o;20686:366::-;20828:3;20849:67;20913:2;20908:3;20849:67;:::i;:::-;20842:74;;20925:93;21014:3;20925:93;:::i;:::-;21043:2;21038:3;21034:12;21027:19;;20686:366;;;:::o;21058:::-;21200:3;21221:67;21285:2;21280:3;21221:67;:::i;:::-;21214:74;;21297:93;21386:3;21297:93;:::i;:::-;21415:2;21410:3;21406:12;21399:19;;21058:366;;;:::o;21430:404::-;21590:3;21611:86;21693:3;21688;21611:86;:::i;:::-;21604:93;;21706;21795:3;21706:93;:::i;:::-;21824:3;21819;21815:13;21808:20;;21430:404;;;:::o;21840:366::-;21982:3;22003:67;22067:2;22062:3;22003:67;:::i;:::-;21996:74;;22079:93;22168:3;22079:93;:::i;:::-;22197:2;22192:3;22188:12;22181:19;;21840:366;;;:::o;22212:402::-;22372:3;22393:85;22475:2;22470:3;22393:85;:::i;:::-;22386:92;;22487:93;22576:3;22487:93;:::i;:::-;22605:2;22600:3;22596:12;22589:19;;22212:402;;;:::o;22620:398::-;22779:3;22800:83;22881:1;22876:3;22800:83;:::i;:::-;22793:90;;22892:93;22981:3;22892:93;:::i;:::-;23010:1;23005:3;23001:11;22994:18;;22620:398;;;:::o;23024:402::-;23184:3;23205:85;23287:2;23282:3;23205:85;:::i;:::-;23198:92;;23299:93;23388:3;23299:93;:::i;:::-;23417:2;23412:3;23408:12;23401:19;;23024:402;;;:::o;23432:366::-;23574:3;23595:67;23659:2;23654:3;23595:67;:::i;:::-;23588:74;;23671:93;23760:3;23671:93;:::i;:::-;23789:2;23784:3;23780:12;23773:19;;23432:366;;;:::o;23804:402::-;23964:3;23985:85;24067:2;24062:3;23985:85;:::i;:::-;23978:92;;24079:93;24168:3;24079:93;:::i;:::-;24197:2;24192:3;24188:12;24181:19;;23804:402;;;:::o;24212:366::-;24354:3;24375:67;24439:2;24434:3;24375:67;:::i;:::-;24368:74;;24451:93;24540:3;24451:93;:::i;:::-;24569:2;24564:3;24560:12;24553:19;;24212:366;;;:::o;24584:400::-;24744:3;24765:84;24847:1;24842:3;24765:84;:::i;:::-;24758:91;;24858:93;24947:3;24858:93;:::i;:::-;24976:1;24971:3;24967:11;24960:18;;24584:400;;;:::o;24990:404::-;25150:3;25171:86;25253:3;25248;25171:86;:::i;:::-;25164:93;;25266;25355:3;25266:93;:::i;:::-;25384:3;25379;25375:13;25368:20;;24990:404;;;:::o;25400:366::-;25542:3;25563:67;25627:2;25622:3;25563:67;:::i;:::-;25556:74;;25639:93;25728:3;25639:93;:::i;:::-;25757:2;25752:3;25748:12;25741:19;;25400:366;;;:::o;25772:400::-;25932:3;25953:84;26035:1;26030:3;25953:84;:::i;:::-;25946:91;;26046:93;26135:3;26046:93;:::i;:::-;26164:1;26159:3;26155:11;26148:18;;25772:400;;;:::o;26178:402::-;26338:3;26359:85;26441:2;26436:3;26359:85;:::i;:::-;26352:92;;26453:93;26542:3;26453:93;:::i;:::-;26571:2;26566:3;26562:12;26555:19;;26178:402;;;:::o;26586:118::-;26673:24;26691:5;26673:24;:::i;:::-;26668:3;26661:37;26586:118;;:::o;26710:275::-;26842:3;26864:95;26955:3;26946:6;26864:95;:::i;:::-;26857:102;;26976:3;26969:10;;26710:275;;;;:::o;26991:541::-;27224:3;27246:148;27390:3;27246:148;:::i;:::-;27239:155;;27411:95;27502:3;27493:6;27411:95;:::i;:::-;27404:102;;27523:3;27516:10;;26991:541;;;;:::o;27538:::-;27771:3;27793:148;27937:3;27793:148;:::i;:::-;27786:155;;27958:95;28049:3;28040:6;27958:95;:::i;:::-;27951:102;;28070:3;28063:10;;27538:541;;;;:::o;28085:::-;28318:3;28340:148;28484:3;28340:148;:::i;:::-;28333:155;;28505:95;28596:3;28587:6;28505:95;:::i;:::-;28498:102;;28617:3;28610:10;;28085:541;;;;:::o;28632:::-;28865:3;28887:148;29031:3;28887:148;:::i;:::-;28880:155;;29052:95;29143:3;29134:6;29052:95;:::i;:::-;29045:102;;29164:3;29157:10;;28632:541;;;;:::o;29179:::-;29412:3;29434:148;29578:3;29434:148;:::i;:::-;29427:155;;29599:95;29690:3;29681:6;29599:95;:::i;:::-;29592:102;;29711:3;29704:10;;29179:541;;;;:::o;29726:::-;29959:3;29981:148;30125:3;29981:148;:::i;:::-;29974:155;;30146:95;30237:3;30228:6;30146:95;:::i;:::-;30139:102;;30258:3;30251:10;;29726:541;;;;:::o;30273:1233::-;30756:3;30778:148;30922:3;30778:148;:::i;:::-;30771:155;;30943:95;31034:3;31025:6;30943:95;:::i;:::-;30936:102;;31055:148;31199:3;31055:148;:::i;:::-;31048:155;;31220:95;31311:3;31302:6;31220:95;:::i;:::-;31213:102;;31332:148;31476:3;31332:148;:::i;:::-;31325:155;;31497:3;31490:10;;30273:1233;;;;;:::o;31512:541::-;31745:3;31767:148;31911:3;31767:148;:::i;:::-;31760:155;;31932:95;32023:3;32014:6;31932:95;:::i;:::-;31925:102;;32044:3;32037:10;;31512:541;;;;:::o;32059:::-;32292:3;32314:148;32458:3;32314:148;:::i;:::-;32307:155;;32479:95;32570:3;32561:6;32479:95;:::i;:::-;32472:102;;32591:3;32584:10;;32059:541;;;;:::o;32606:::-;32839:3;32861:148;33005:3;32861:148;:::i;:::-;32854:155;;33026:95;33117:3;33108:6;33026:95;:::i;:::-;33019:102;;33138:3;33131:10;;32606:541;;;;:::o;33153:379::-;33337:3;33359:147;33502:3;33359:147;:::i;:::-;33352:154;;33523:3;33516:10;;33153:379;;;:::o;33538:541::-;33771:3;33793:148;33937:3;33793:148;:::i;:::-;33786:155;;33958:95;34049:3;34040:6;33958:95;:::i;:::-;33951:102;;34070:3;34063:10;;33538:541;;;;:::o;34085:4799::-;35871:3;35893:148;36037:3;35893:148;:::i;:::-;35886:155;;36058:148;36202:3;36058:148;:::i;:::-;36051:155;;36223:148;36367:3;36223:148;:::i;:::-;36216:155;;36388:95;36479:3;36470:6;36388:95;:::i;:::-;36381:102;;36500:148;36644:3;36500:148;:::i;:::-;36493:155;;36665:148;36809:3;36665:148;:::i;:::-;36658:155;;36830:148;36974:3;36830:148;:::i;:::-;36823:155;;36995:95;37086:3;37077:6;36995:95;:::i;:::-;36988:102;;37107:148;37251:3;37107:148;:::i;:::-;37100:155;;37272:148;37416:3;37272:148;:::i;:::-;37265:155;;37437:95;37528:3;37519:6;37437:95;:::i;:::-;37430:102;;37549:148;37693:3;37549:148;:::i;:::-;37542:155;;37714:148;37858:3;37714:148;:::i;:::-;37707:155;;37879:95;37970:3;37961:6;37879:95;:::i;:::-;37872:102;;37991:148;38135:3;37991:148;:::i;:::-;37984:155;;38156:95;38247:3;38238:6;38156:95;:::i;:::-;38149:102;;38268:148;38412:3;38268:148;:::i;:::-;38261:155;;38433:95;38524:3;38515:6;38433:95;:::i;:::-;38426:102;;38545:148;38689:3;38545:148;:::i;:::-;38538:155;;38710:148;38854:3;38710:148;:::i;:::-;38703:155;;38875:3;38868:10;;34085:4799;;;;;;;;;:::o;38890:222::-;38983:4;39021:2;39010:9;39006:18;38998:26;;39034:71;39102:1;39091:9;39087:17;39078:6;39034:71;:::i;:::-;38890:222;;;;:::o;39118:640::-;39313:4;39351:3;39340:9;39336:19;39328:27;;39365:71;39433:1;39422:9;39418:17;39409:6;39365:71;:::i;:::-;39446:72;39514:2;39503:9;39499:18;39490:6;39446:72;:::i;:::-;39528;39596:2;39585:9;39581:18;39572:6;39528:72;:::i;:::-;39647:9;39641:4;39637:20;39632:2;39621:9;39617:18;39610:48;39675:76;39746:4;39737:6;39675:76;:::i;:::-;39667:84;;39118:640;;;;;;;:::o;39764:210::-;39851:4;39889:2;39878:9;39874:18;39866:26;;39902:65;39964:1;39953:9;39949:17;39940:6;39902:65;:::i;:::-;39764:210;;;;:::o;39980:254::-;40089:4;40127:2;40116:9;40112:18;40104:26;;40140:87;40224:1;40213:9;40209:17;40200:6;40140:87;:::i;:::-;39980:254;;;;:::o;40240:313::-;40353:4;40391:2;40380:9;40376:18;40368:26;;40440:9;40434:4;40430:20;40426:1;40415:9;40411:17;40404:47;40468:78;40541:4;40532:6;40468:78;:::i;:::-;40460:86;;40240:313;;;;:::o;40559:514::-;40720:4;40758:2;40747:9;40743:18;40735:26;;40807:9;40801:4;40797:20;40793:1;40782:9;40778:17;40771:47;40835:78;40908:4;40899:6;40835:78;:::i;:::-;40827:86;;40960:9;40954:4;40950:20;40945:2;40934:9;40930:18;40923:48;40988:78;41061:4;41052:6;40988:78;:::i;:::-;40980:86;;40559:514;;;;;:::o;41079:419::-;41245:4;41283:2;41272:9;41268:18;41260:26;;41332:9;41326:4;41322:20;41318:1;41307:9;41303:17;41296:47;41360:131;41486:4;41360:131;:::i;:::-;41352:139;;41079:419;;;:::o;41504:::-;41670:4;41708:2;41697:9;41693:18;41685:26;;41757:9;41751:4;41747:20;41743:1;41732:9;41728:17;41721:47;41785:131;41911:4;41785:131;:::i;:::-;41777:139;;41504:419;;;:::o;41929:::-;42095:4;42133:2;42122:9;42118:18;42110:26;;42182:9;42176:4;42172:20;42168:1;42157:9;42153:17;42146:47;42210:131;42336:4;42210:131;:::i;:::-;42202:139;;41929:419;;;:::o;42354:::-;42520:4;42558:2;42547:9;42543:18;42535:26;;42607:9;42601:4;42597:20;42593:1;42582:9;42578:17;42571:47;42635:131;42761:4;42635:131;:::i;:::-;42627:139;;42354:419;;;:::o;42779:::-;42945:4;42983:2;42972:9;42968:18;42960:26;;43032:9;43026:4;43022:20;43018:1;43007:9;43003:17;42996:47;43060:131;43186:4;43060:131;:::i;:::-;43052:139;;42779:419;;;:::o;43204:::-;43370:4;43408:2;43397:9;43393:18;43385:26;;43457:9;43451:4;43447:20;43443:1;43432:9;43428:17;43421:47;43485:131;43611:4;43485:131;:::i;:::-;43477:139;;43204:419;;;:::o;43629:::-;43795:4;43833:2;43822:9;43818:18;43810:26;;43882:9;43876:4;43872:20;43868:1;43857:9;43853:17;43846:47;43910:131;44036:4;43910:131;:::i;:::-;43902:139;;43629:419;;;:::o;44054:::-;44220:4;44258:2;44247:9;44243:18;44235:26;;44307:9;44301:4;44297:20;44293:1;44282:9;44278:17;44271:47;44335:131;44461:4;44335:131;:::i;:::-;44327:139;;44054:419;;;:::o;44479:::-;44645:4;44683:2;44672:9;44668:18;44660:26;;44732:9;44726:4;44722:20;44718:1;44707:9;44703:17;44696:47;44760:131;44886:4;44760:131;:::i;:::-;44752:139;;44479:419;;;:::o;44904:::-;45070:4;45108:2;45097:9;45093:18;45085:26;;45157:9;45151:4;45147:20;45143:1;45132:9;45128:17;45121:47;45185:131;45311:4;45185:131;:::i;:::-;45177:139;;44904:419;;;:::o;45329:::-;45495:4;45533:2;45522:9;45518:18;45510:26;;45582:9;45576:4;45572:20;45568:1;45557:9;45553:17;45546:47;45610:131;45736:4;45610:131;:::i;:::-;45602:139;;45329:419;;;:::o;45754:::-;45920:4;45958:2;45947:9;45943:18;45935:26;;46007:9;46001:4;45997:20;45993:1;45982:9;45978:17;45971:47;46035:131;46161:4;46035:131;:::i;:::-;46027:139;;45754:419;;;:::o;46179:::-;46345:4;46383:2;46372:9;46368:18;46360:26;;46432:9;46426:4;46422:20;46418:1;46407:9;46403:17;46396:47;46460:131;46586:4;46460:131;:::i;:::-;46452:139;;46179:419;;;:::o;46604:::-;46770:4;46808:2;46797:9;46793:18;46785:26;;46857:9;46851:4;46847:20;46843:1;46832:9;46828:17;46821:47;46885:131;47011:4;46885:131;:::i;:::-;46877:139;;46604:419;;;:::o;47029:::-;47195:4;47233:2;47222:9;47218:18;47210:26;;47282:9;47276:4;47272:20;47268:1;47257:9;47253:17;47246:47;47310:131;47436:4;47310:131;:::i;:::-;47302:139;;47029:419;;;:::o;47454:::-;47620:4;47658:2;47647:9;47643:18;47635:26;;47707:9;47701:4;47697:20;47693:1;47682:9;47678:17;47671:47;47735:131;47861:4;47735:131;:::i;:::-;47727:139;;47454:419;;;:::o;47879:::-;48045:4;48083:2;48072:9;48068:18;48060:26;;48132:9;48126:4;48122:20;48118:1;48107:9;48103:17;48096:47;48160:131;48286:4;48160:131;:::i;:::-;48152:139;;47879:419;;;:::o;48304:::-;48470:4;48508:2;48497:9;48493:18;48485:26;;48557:9;48551:4;48547:20;48543:1;48532:9;48528:17;48521:47;48585:131;48711:4;48585:131;:::i;:::-;48577:139;;48304:419;;;:::o;48729:::-;48895:4;48933:2;48922:9;48918:18;48910:26;;48982:9;48976:4;48972:20;48968:1;48957:9;48953:17;48946:47;49010:131;49136:4;49010:131;:::i;:::-;49002:139;;48729:419;;;:::o;49154:222::-;49247:4;49285:2;49274:9;49270:18;49262:26;;49298:71;49366:1;49355:9;49351:17;49342:6;49298:71;:::i;:::-;49154:222;;;;:::o;49382:129::-;49416:6;49443:20;;:::i;:::-;49433:30;;49472:33;49500:4;49492:6;49472:33;:::i;:::-;49382:129;;;:::o;49517:75::-;49550:6;49583:2;49577:9;49567:19;;49517:75;:::o;49598:307::-;49659:4;49749:18;49741:6;49738:30;49735:56;;;49771:18;;:::i;:::-;49735:56;49809:29;49831:6;49809:29;:::i;:::-;49801:37;;49893:4;49887;49883:15;49875:23;;49598:307;;;:::o;49911:308::-;49973:4;50063:18;50055:6;50052:30;50049:56;;;50085:18;;:::i;:::-;50049:56;50123:29;50145:6;50123:29;:::i;:::-;50115:37;;50207:4;50201;50197:15;50189:23;;49911:308;;;:::o;50225:98::-;50276:6;50310:5;50304:12;50294:22;;50225:98;;;:::o;50329:99::-;50381:6;50415:5;50409:12;50399:22;;50329:99;;;:::o;50434:168::-;50517:11;50551:6;50546:3;50539:19;50591:4;50586:3;50582:14;50567:29;;50434:168;;;;:::o;50608:147::-;50709:11;50746:3;50731:18;;50608:147;;;;:::o;50761:169::-;50845:11;50879:6;50874:3;50867:19;50919:4;50914:3;50910:14;50895:29;;50761:169;;;;:::o;50936:148::-;51038:11;51075:3;51060:18;;50936:148;;;;:::o;51090:305::-;51130:3;51149:20;51167:1;51149:20;:::i;:::-;51144:25;;51183:20;51201:1;51183:20;:::i;:::-;51178:25;;51337:1;51269:66;51265:74;51262:1;51259:81;51256:107;;;51343:18;;:::i;:::-;51256:107;51387:1;51384;51380:9;51373:16;;51090:305;;;;:::o;51401:185::-;51441:1;51458:20;51476:1;51458:20;:::i;:::-;51453:25;;51492:20;51510:1;51492:20;:::i;:::-;51487:25;;51531:1;51521:35;;51536:18;;:::i;:::-;51521:35;51578:1;51575;51571:9;51566:14;;51401:185;;;;:::o;51592:348::-;51632:7;51655:20;51673:1;51655:20;:::i;:::-;51650:25;;51689:20;51707:1;51689:20;:::i;:::-;51684:25;;51877:1;51809:66;51805:74;51802:1;51799:81;51794:1;51787:9;51780:17;51776:105;51773:131;;;51884:18;;:::i;:::-;51773:131;51932:1;51929;51925:9;51914:20;;51592:348;;;;:::o;51946:191::-;51986:4;52006:20;52024:1;52006:20;:::i;:::-;52001:25;;52040:20;52058:1;52040:20;:::i;:::-;52035:25;;52079:1;52076;52073:8;52070:34;;;52084:18;;:::i;:::-;52070:34;52129:1;52126;52122:9;52114:17;;51946:191;;;;:::o;52143:96::-;52180:7;52209:24;52227:5;52209:24;:::i;:::-;52198:35;;52143:96;;;:::o;52245:90::-;52279:7;52322:5;52315:13;52308:21;52297:32;;52245:90;;;:::o;52341:149::-;52377:7;52417:66;52410:5;52406:78;52395:89;;52341:149;;;:::o;52496:125::-;52562:7;52591:24;52609:5;52591:24;:::i;:::-;52580:35;;52496:125;;;:::o;52627:126::-;52664:7;52704:42;52697:5;52693:54;52682:65;;52627:126;;;:::o;52759:77::-;52796:7;52825:5;52814:16;;52759:77;;;:::o;52842:142::-;52908:9;52941:37;52972:5;52941:37;:::i;:::-;52928:50;;52842:142;;;:::o;52990:126::-;53040:9;53073:37;53104:5;53073:37;:::i;:::-;53060:50;;52990:126;;;:::o;53122:113::-;53172:9;53205:24;53223:5;53205:24;:::i;:::-;53192:37;;53122:113;;;:::o;53241:154::-;53325:6;53320:3;53315;53302:30;53387:1;53378:6;53373:3;53369:16;53362:27;53241:154;;;:::o;53401:307::-;53469:1;53479:113;53493:6;53490:1;53487:13;53479:113;;;53578:1;53573:3;53569:11;53563:18;53559:1;53554:3;53550:11;53543:39;53515:2;53512:1;53508:10;53503:15;;53479:113;;;53610:6;53607:1;53604:13;53601:101;;;53690:1;53681:6;53676:3;53672:16;53665:27;53601:101;53450:258;53401:307;;;:::o;53714:320::-;53758:6;53795:1;53789:4;53785:12;53775:22;;53842:1;53836:4;53832:12;53863:18;53853:81;;53919:4;53911:6;53907:17;53897:27;;53853:81;53981:2;53973:6;53970:14;53950:18;53947:38;53944:84;;;54000:18;;:::i;:::-;53944:84;53765:269;53714:320;;;:::o;54040:281::-;54123:27;54145:4;54123:27;:::i;:::-;54115:6;54111:40;54253:6;54241:10;54238:22;54217:18;54205:10;54202:34;54199:62;54196:88;;;54264:18;;:::i;:::-;54196:88;54304:10;54300:2;54293:22;54083:238;54040:281;;:::o;54327:233::-;54366:3;54389:24;54407:5;54389:24;:::i;:::-;54380:33;;54435:66;54428:5;54425:77;54422:103;;;54505:18;;:::i;:::-;54422:103;54552:1;54545:5;54541:13;54534:20;;54327:233;;;:::o;54566:176::-;54598:1;54615:20;54633:1;54615:20;:::i;:::-;54610:25;;54649:20;54667:1;54649:20;:::i;:::-;54644:25;;54688:1;54678:35;;54693:18;;:::i;:::-;54678:35;54734:1;54731;54727:9;54722:14;;54566:176;;;;:::o;54748:180::-;54796:77;54793:1;54786:88;54893:4;54890:1;54883:15;54917:4;54914:1;54907:15;54934:180;54982:77;54979:1;54972:88;55079:4;55076:1;55069:15;55103:4;55100:1;55093:15;55120:180;55168:77;55165:1;55158:88;55265:4;55262:1;55255:15;55289:4;55286:1;55279:15;55306:180;55354:77;55351:1;55344:88;55451:4;55448:1;55441:15;55475:4;55472:1;55465:15;55492:180;55540:77;55537:1;55530:88;55637:4;55634:1;55627:15;55661:4;55658:1;55651:15;55678:180;55726:77;55723:1;55716:88;55823:4;55820:1;55813:15;55847:4;55844:1;55837:15;55864:117;55973:1;55970;55963:12;55987:117;56096:1;56093;56086:12;56110:117;56219:1;56216;56209:12;56233:117;56342:1;56339;56332:12;56356:102;56397:6;56448:2;56444:7;56439:2;56432:5;56428:14;56424:28;56414:38;;56356:102;;;:::o;56464:151::-;56604:3;56600:1;56592:6;56588:14;56581:27;56464:151;:::o;56621:::-;56761:3;56757:1;56749:6;56745:14;56738:27;56621:151;:::o;56778:::-;56918:3;56914:1;56906:6;56902:14;56895:27;56778:151;:::o;56935:156::-;57075:8;57071:1;57063:6;57059:14;57052:32;56935:156;:::o;57097:230::-;57237:34;57233:1;57225:6;57221:14;57214:58;57306:13;57301:2;57293:6;57289:15;57282:38;57097:230;:::o;57333:237::-;57473:34;57469:1;57461:6;57457:14;57450:58;57542:20;57537:2;57529:6;57525:15;57518:45;57333:237;:::o;57576:151::-;57716:3;57712:1;57704:6;57700:14;57693:27;57576:151;:::o;57733:225::-;57873:34;57869:1;57861:6;57857:14;57850:58;57942:8;57937:2;57929:6;57925:15;57918:33;57733:225;:::o;57964:254::-;58104:66;58100:1;58092:6;58088:14;58081:90;58205:5;58200:2;58192:6;58188:15;58181:30;57964:254;:::o;58224:178::-;58364:30;58360:1;58352:6;58348:14;58341:54;58224:178;:::o;58408:151::-;58548:3;58544:1;58536:6;58532:14;58525:27;58408:151;:::o;58565:315::-;58705:66;58701:1;58693:6;58689:14;58682:90;58806:66;58801:2;58793:6;58789:15;58782:91;58565:315;:::o;58886:225::-;59026:34;59022:1;59014:6;59010:14;59003:58;59095:8;59090:2;59082:6;59078:15;59071:33;58886:225;:::o;59117:151::-;59257:3;59253:1;59245:6;59241:14;59234:27;59117:151;:::o;59274:223::-;59414:34;59410:1;59402:6;59398:14;59391:58;59483:6;59478:2;59470:6;59466:15;59459:31;59274:223;:::o;59503:175::-;59643:27;59639:1;59631:6;59627:14;59620:51;59503:175;:::o;59684:297::-;59824:34;59820:1;59812:6;59808:14;59801:58;59893:34;59888:2;59880:6;59876:15;59869:59;59962:11;59957:2;59949:6;59945:15;59938:36;59684:297;:::o;59987:231::-;60127:34;60123:1;60115:6;60111:14;60104:58;60196:14;60191:2;60183:6;60179:15;60172:39;59987:231;:::o;60224:151::-;60364:3;60360:1;60352:6;60348:14;60341:27;60224:151;:::o;60381:243::-;60521:34;60517:1;60509:6;60505:14;60498:58;60590:26;60585:2;60577:6;60573:15;60566:51;60381:243;:::o;60630:229::-;60770:34;60766:1;60758:6;60754:14;60747:58;60839:12;60834:2;60826:6;60822:15;60815:37;60630:229;:::o;60865:228::-;61005:34;61001:1;60993:6;60989:14;60982:58;61074:11;61069:2;61061:6;61057:15;61050:36;60865:228;:::o;61099:214::-;61239:66;61235:1;61227:6;61223:14;61216:90;61099:214;:::o;61319:157::-;61459:9;61455:1;61447:6;61443:14;61436:33;61319:157;:::o;61482:182::-;61622:34;61618:1;61610:6;61606:14;61599:58;61482:182;:::o;61670:156::-;61810:8;61806:1;61798:6;61794:14;61787:32;61670:156;:::o;61832:231::-;61972:34;61968:1;61960:6;61956:14;61949:58;62041:14;62036:2;62028:6;62024:15;62017:39;61832:231;:::o;62069:182::-;62209:34;62205:1;62197:6;62193:14;62186:58;62069:182;:::o;62257:153::-;62397:5;62393:1;62385:6;62381:14;62374:29;62257:153;:::o;62416:228::-;62556:34;62552:1;62544:6;62540:14;62533:58;62625:11;62620:2;62612:6;62608:15;62601:36;62416:228;:::o;62650:168::-;62790:20;62786:1;62778:6;62774:14;62767:44;62650:168;:::o;62824:375::-;62964:34;62960:1;62952:6;62948:14;62941:58;63033:34;63028:2;63020:6;63016:15;63009:59;63102:34;63097:2;63089:6;63085:15;63078:59;63171:20;63166:2;63158:6;63154:15;63147:45;62824:375;:::o;63205:220::-;63345:34;63341:1;63333:6;63329:14;63322:58;63414:3;63409:2;63401:6;63397:15;63390:28;63205:220;:::o;63431:360::-;63571:34;63567:1;63559:6;63555:14;63548:58;63640:34;63635:2;63627:6;63623:15;63616:59;63709:34;63704:2;63696:6;63692:15;63685:59;63778:5;63773:2;63765:6;63761:15;63754:30;63431:360;:::o;63797:114::-;;:::o;63917:169::-;64057:21;64053:1;64045:6;64041:14;64034:45;63917:169;:::o;64092:236::-;64232:34;64228:1;64220:6;64216:14;64209:58;64301:19;64296:2;64288:6;64284:15;64277:44;64092:236;:::o;64334:295::-;64474:34;64470:1;64462:6;64458:14;64451:58;64543:34;64538:2;64530:6;64526:15;64519:59;64612:9;64607:2;64599:6;64595:15;64588:34;64334:295;:::o;64635:231::-;64775:34;64771:1;64763:6;64759:14;64752:58;64844:14;64839:2;64831:6;64827:15;64820:39;64635:231;:::o;64872:151::-;65012:3;65008:1;65000:6;64996:14;64989:27;64872:151;:::o;65029:527::-;65169:34;65165:1;65157:6;65153:14;65146:58;65238:34;65233:2;65225:6;65221:15;65214:59;65307:34;65302:2;65294:6;65290:15;65283:59;65376:34;65371:2;65363:6;65359:15;65352:59;65450:34;65444:3;65436:6;65432:16;65425:60;65528:12;65522:3;65514:6;65510:16;65503:38;65029:527;:::o;65570:197::-;65718:33;65714:1;65706:6;65702:14;65695:57;65570:197;:::o;65781:172::-;65929:8;65925:1;65917:6;65913:14;65906:32;65781:172;:::o;65967:400::-;66115:34;66111:1;66103:6;66099:14;66092:58;66192:34;66187:2;66179:6;66175:15;66168:59;66269:34;66264:2;66256:6;66252:15;66245:59;66346:5;66341:2;66333:6;66329:15;66322:30;65967:400;:::o;66381:138::-;66462:24;66480:5;66462:24;:::i;:::-;66455:5;66452:35;66442:63;;66501:1;66498;66491:12;66442:63;66381:138;:::o;66533:132::-;66611:21;66626:5;66611:21;:::i;:::-;66604:5;66601:32;66591:60;;66647:1;66644;66637:12;66591:60;66533:132;:::o;66679:136::-;66759:23;66776:5;66759:23;:::i;:::-;66752:5;66749:34;66739:62;;66797:1;66794;66787:12;66739:62;66679:136;:::o;66829:196::-;66939:53;66986:5;66939:53;:::i;:::-;66932:5;66929:64;66919:92;;67007:1;67004;66997:12;66919:92;66829:196;:::o;67039:138::-;67120:24;67138:5;67120:24;:::i;:::-;67113:5;67110:35;67100:63;;67159:1;67156;67149:12;67100:63;67039:138;:::o

Swarm Source

ipfs://844ed5d62ddbb326393d917220a832012941d2706101709dbd174a69642c75ea
Loading...
Loading
Loading...
Loading
[ 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.