ETH Price: $3,079.99 (+1.02%)
Gas: 3 Gwei

Token

THING (THING)
 

Overview

Max Total Supply

1,222 THING

Holders

1,031

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 THING
0x43c7813cd33a4c31decb03f84a3e48bfe7f80f79
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:
Commodity

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-01
*/

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string public constant ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    function _initializeEIP712(string memory name) internal initializer {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return keccak256(abi.encode(getDomainSeperator(), messageHash));
    }
}

contract NativeMetaTransaction is EIP712Base {
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) external payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        nonces[userAddress] += 1;

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
            }
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

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

// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

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

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

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

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

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

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

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

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

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

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

abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

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

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

// 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 generally not needed starting with Solidity 0.8, since 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;
        }
    }
}

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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()))
                : "";
    }

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

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

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

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

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {}

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {}

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {}

    /**
     * @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 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 making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is
    ERC721,
    ContextMixin,
    Pausable,
    NativeMetaTransaction,
    Ownable
{
    using Address for address;
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    // tokendcount
    Counters.Counter private _nextTokenId;

    address public proxyRegistryAddress;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _owners;
    mapping(uint256 => address) private _tokenApprovals;

    constructor(string memory _name, string memory _symbol)
        ERC721(_name, _symbol)
    {
        proxyRegistryAddress = _msgSender();
        _nextTokenId.increment();
        _initializeEIP712(_name);
    }

    modifier onlyOwnerOrProxy() {
        require(
            _isOwnerOrProxy(_msgSender()),
            "ERC721Tradable#onlyOwner: CALLER_IS_NOT_OWNER"
        );
        _;
    }

    modifier onlyApproved(address _from) {
        require(
            _from == _msgSender() || isApprovedForAll(_from, _msgSender()),
            "ERC721Tradable#onlyApproved: CALLER_NOT_ALLOWED"
        );
        _;
    }

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

        require(
            _msgSender() == owner,
            "ERC721: approve caller is not owner nor approved for all"
        );
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function pause() external onlyOwnerOrProxy {
        _pause();
    }

    function unpause() external onlyOwnerOrProxy {
        _unpause();
    }

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

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

    function exists(uint256 tokenId) public view returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function totalSupply() public view returns (uint256) {
        return _nextTokenId.current() - 1;
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override whenNotPaused {
        require(
            _isOwnerOrProxy(_msgSender()) ||
                ownerOf(tokenId) == from ||
                isApprovedForAll(ownerOf(tokenId), _msgSender()),
            "ERC721: transfer of token that is not own or Proxy"
        );
        require(to != address(0), "ERC721: transfer to the zero address");
        if (from != ownerOf(tokenId)) {
            from = ownerOf(tokenId);
        }
        _beforeTokenTransfer(from, to, tokenId);

        _tokenApprovals[tokenId] = address(0);
        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;
        require(
            checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );

        emit Transfer(from, to, tokenId);
    }

    function mintTo(address _to, bytes memory _data) internal whenNotPaused {
        uint256 currentTokenId = _nextTokenId.current();
        _nextTokenId.increment();

        require(!_exists(currentTokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), _to, currentTokenId);

        _balances[_to] += 1;
        _owners[currentTokenId] = _to;
        require(
            checkOnERC721Received(address(0), _to, currentTokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
        emit Transfer(address(0), _to, currentTokenId);
    }

    function burn(uint256 tokenId) internal whenNotPaused {
        address owner = ownerOf(tokenId);
        _beforeTokenTransfer(owner, address(0), tokenId);
        _balances[owner] -= 1;
        delete _owners[tokenId];
        emit Transfer(owner, address(0), tokenId);
    }

    function checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal 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;
        }
    }

    function _isOwnerOrProxy(address operator) internal view returns (bool) {
        return owner() == operator || _isProxyForUser(owner(), operator);
    }

    function _isProxyForUser(address owner, address operator)
        internal
        view
        returns (bool)
    {
        if (!proxyRegistryAddress.isContract()) {
            return false;
        }
        return
            address(ProxyRegistry(proxyRegistryAddress).proxies(owner)) ==
            operator;
    }

    function baseTokenURI() public view virtual returns (string memory);

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId))
            );
    }

    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }

    function _exists(uint256 tokenId)
        internal
        view
        virtual
        override
        returns (bool)
    {
        return _owners[tokenId] != address(0);
    }
}

contract AssetContract is ERC721Tradable, ReentrancyGuard {
    using SafeMath for uint256;
    using Strings for uint256;
    event PermanentURI(string _value, uint256 indexed _id);

    string public templateURI;

    uint256 public PRODUCE_TOKEN_MAX = 1;

    address public mineAcceptAddr;

    address public mintAddr;

    mapping(string => uint256[]) private _tokenSell;

    mapping(string => uint256) private tokenPrice;

    mapping(uint256 => string) private _idTokenType;

    mapping(string => uint256) private _tokenTypeProduce;

    mapping(uint256 => string) private _tokenURI;

    mapping(uint256 => bool) private _isPermanentURI;

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _tokenPrice,
        string memory _tokentype,
        string memory _templateURI,
        address _mintAddr
    ) ERC721Tradable(_name, _symbol) {
        if (bytes(_templateURI).length > 0) {
            setTemplateURI(_templateURI);
        }
        mintAddr = _mintAddr;
        mineAcceptAddr = _msgSender();
        putSell(_tokentype, PRODUCE_TOKEN_MAX, _tokenPrice);
    }

    modifier onlyOwnerOrThis() {
        require(
            owner() == _msgSender() || address(this) == _msgSender(),
            "Ownable: caller is not the owner"
        );
        _;
    }

    function functionCall(
        address target,
        bytes memory data,
        uint256 value
    ) public payable onlyOwnerOrProxy returns (bytes memory) {
        return Address.functionCallWithValue(target, data, value);
    }

    function changeAcceptAddr(address acceptAddr) public onlyOwnerOrProxy {
        mineAcceptAddr = acceptAddr;
    }

    function setTemplateURI(string memory _uri) public onlyOwnerOrProxy {
        templateURI = _uri;
    }

    function tokenPriceOf(string memory _tokenType)
        public
        view
        returns (uint256)
    {
        return tokenPrice[_tokenType];
    }

    function balanceOf(address _owner) public view override returns (uint256) {
        return
            _isOwnerOrProxy(_owner)
                ? super.totalSupply()
                : super.balanceOf(_owner);
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return super.ownerOf(tokenId);
    }

    modifier onlyTokenAmountOwned(address _from, uint256 _id) {
        require(
            _ownsTokenAmount(_from, _id),
            "AssetContract#onlyTokenAmountOwned: ONLY_TOKEN_AMOUNT_OWNED_ALLOWED"
        );
        _;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id
    ) public virtual override {
        safeTransferFrom(_from, _to, _id, "");
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        bytes memory _data
    ) public virtual override {
        require(
            _ownsTokenAmount(_msgSender(), _id),
            "AssetContract#onlyTokenAmountOwned: ONLY_TOKEN_AMOUNT_OWNED_ALLOWED"
        );
        if (_isOwnerOrProxy(_msgSender())) {
            _from = ownerOf(_id);
        }
        require(_from != _to, "AssetContract#ownerOfToken: from equal to addr");
        super.safeTransferFrom(_from, _to, _id, _data);
    }

    function tokenSell(string memory _tokenType, uint256 index)
        public
        view
        returns (uint256)
    {
        return _tokenSell[_tokenType][index];
    }

    function tokenTypeOf(string memory tokenType)
        public
        view
        returns (uint256)
    {
        return _tokenTypeProduce[tokenType];
    }

    function mintTo(
        string memory _tokenType,
        uint256 numberOfTokens,
        bytes memory _data
    ) public payable nonReentrant {
        require(
            tokenPrice[_tokenType].mul(numberOfTokens) == msg.value,
            "Ether value is not correct"
        );
        _mint(_tokenType, numberOfTokens, _data);
        payable(mineAcceptAddr).transfer(msg.value);
    }

    function tokenMake(string memory _tokenType, uint256 numberOfTokens)
        public
        payable
        nonReentrant
    {
        require(
            tokenPrice[_tokenType].mul(numberOfTokens) == msg.value,
            "Ether value is not correct"
        );
        uint256 count = tokenTypeOf(_tokenType);
        require(count >= numberOfTokens, " token number surplus not enough");
        uint256 index = 1;
        for (uint256 i = numberOfTokens; i > 0; i--) {
            require(i >= 0, " token number i not enough");
            uint256 tokenId = _tokenSell[_tokenType][count - index];
            super.safeTransferFrom(owner(), _msgSender(), tokenId, "");
            index++;
        }
        _tokenTypeProduce[_tokenType] = count - numberOfTokens;
        payable(mineAcceptAddr).transfer(msg.value);
    }

    function setTokenPriceOf(string memory _tokenType, uint256 _tokenPrice)
        public
        onlyOwnerOrProxy
        returns (uint256)
    {
        return tokenPrice[_tokenType] = _tokenPrice;
    }

    function putSell(
        string memory _tokenType,
        uint256 numberOfTokens,
        uint256 _tokenPrice
    ) public onlyOwnerOrProxy {
        tokenPrice[_tokenType] = _tokenPrice;
        _tokenTypeProduce[_tokenType] = numberOfTokens;
        _mint(_tokenType, numberOfTokens, bytes(baseTokenURI()));
    }

    function _mint(
        string memory _tokenType,
        uint256 numberOfTokens,
        bytes memory _data
    ) private {
        uint256[] memory array = new uint256[](numberOfTokens);
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _idTokenType[totalSupply() + 1] = _tokenType;
            array[i] = totalSupply() + 1;
            mintTo(mintAddr, _data);
        }
        _tokenSell[_tokenType] = array;
    }

    function burn(address _from, uint256 _id)
        public
        onlyTokenAmountOwned(_from, _id)
    {
        super.burn(_id);
    }

    function _ownsTokenAmount(address _from, uint256 _id)
        internal
        view
        returns (bool)
    {
        return
            _isOwnerOrProxy(_from)
                ? true
                : (ownerOf(_id) == _from ||
                    isApprovedForAll(ownerOf(_id), _msgSender()));
    }

    modifier onlyImpermanentURI(uint256 id) {
        require(
            !isPermanentURI(id),
            "AssetContract#onlyImpermanentURI: URI_CANNOT_BE_CHANGED"
        );
        _;
    }

    function setPermanentURI(uint256 _id, string memory _uri)
        public
        onlyOwnerOrProxy
        onlyImpermanentURI(_id)
    {
        _setPermanentURI(_id, _uri);
    }

    function isPermanentURI(uint256 _id) public view returns (bool) {
        return _isPermanentURI[_id];
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        string memory tokenUri = _tokenURI[tokenId];
        if (bytes(baseTokenURI()).length == 0) {
            return tokenUri;
        }
        if (bytes(tokenUri).length > 0) {
            return string(tokenUri);
        }

        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return
            string(
                abi.encodePacked(
                    baseTokenURI(),
                    (_idTokenType[tokenId]),
                    "/",
                    (tokenId.toString())
                )
            );
    }

    function setURI(uint256 _id, string memory _uri)
        public
        onlyOwnerOrProxy
        onlyImpermanentURI(_id)
    {
        _tokenURI[_id] = _uri;
    }

    function _setPermanentURI(uint256 _id, string memory _uri) internal {
        require(
            bytes(_uri).length > 0,
            "AssetContract#setPermanentURI: ONLY_VALID_URI"
        );
        _isPermanentURI[_id] = true;
        _setURI(_id, _uri);
        emit PermanentURI(_uri, _id);
    }

    function _setURI(uint256 _id, string memory _uri) internal {
        _tokenURI[_id] = _uri;
    }

    function baseTokenURI() public view override returns (string memory) {
        return templateURI;
    }
}

contract Commodity is AssetContract {
    constructor()
        AssetContract(
            "THING",
            "THING",
            10 * 10**18,
            "hotsales",
            "http://164.155.49.105/api/thing/info/",
            0x85FE87E86024B24dBc64DbaE43882bA56f302726
        )
    {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRODUCE_TOKEN_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"acceptAddr","type":"address"}],"name":"changeAcceptAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"functionCall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"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":"uint256","name":"_id","type":"uint256"}],"name":"isPermanentURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mineAcceptAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenType","type":"string"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenType","type":"string"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"putSell","outputs":[],"stateMutability":"nonpayable","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":"_id","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":"_id","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":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setPermanentURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setTemplateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenType","type":"string"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"setTokenPriceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"templateURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenType","type":"string"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"tokenMake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenType","type":"string"}],"name":"tokenPriceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenType","type":"string"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenType","type":"string"}],"name":"tokenTypeOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600660016101000a81548160ff02191690831515021790555060016011553480156200003157600080fd5b506040518060400160405280600581526020017f5448494e470000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5448494e47000000000000000000000000000000000000000000000000000000815250678ac7230489e800006040518060400160405280600881526020017f686f7473616c6573000000000000000000000000000000000000000000000000815250604051806060016040528060258152602001620075ec602591397385fe87e86024b24dbc64dbae43882ba56f3027268585818181600090805190602001906200012892919062000fe0565b5080600190805190602001906200014192919062000fe0565b5050506000600660006101000a81548160ff0219169083151502179055506200017f62000173620002d060201b60201c565b620002ec60201b60201c565b6200018f620002d060201b60201c565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001e6600a620003b260201b6200242b1760201c565b620001f782620003c860201b60201c565b50506001600f819055506000825111156200021e576200021d826200044a60201b60201c565b5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200026f620002d060201b60201c565b601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002c48360115486620004c860201b60201c565b5050505050506200189b565b6000620002e76200059b60201b620024411760201c565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600660019054906101000a900460ff16156200041b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004129062001143565b60405180910390fd5b6200042c816200064e60201b60201c565b6001600660016101000a81548160ff02191690831515021790555050565b6200046a6200045e620002d060201b60201c565b620006fd60201b60201c565b620004ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a390620011db565b60405180910390fd5b8060109080519060200190620004c492919062000fe0565b5050565b620004e8620004dc620002d060201b60201c565b620006fd60201b60201c565b6200052a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052190620011db565b60405180910390fd5b806015846040516200053d919062001280565b9081526020016040518091039020819055508160178460405162000562919062001280565b9081526020016040518091039020819055506200059683836200058a6200076d60201b60201c565b6200080760201b60201c565b505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200064757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506200064b565b3390505b90565b6040518060800160405280604f81526020016200759d604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620006c56200097360201b60201c565b60001b604051602001620006de959493929190620012f9565b6040516020818303038152906040528051906020012060078190555050565b60008173ffffffffffffffffffffffffffffffffffffffff16620007266200098060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16148062000766575062000765620007586200098060201b60201c565b83620009aa60201b60201c565b5b9050919050565b6060601080546200077e9062001385565b80601f0160208091040260200160405190810160405280929190818152602001828054620007ac9062001385565b8015620007fd5780601f10620007d157610100808354040283529160200191620007fd565b820191906000526020600020905b815481529060010190602001808311620007df57829003601f168201915b5050505050905090565b60008267ffffffffffffffff811115620008265762000825620013bb565b5b604051908082528060200260200182016040528015620008555781602001602082028036833780820191505090505b50905060005b838110156200093557846016600060016200087b62000af160201b60201c565b62000887919062001423565b81526020019081526020016000209080519060200190620008aa92919062000fe0565b506001620008bd62000af160201b60201c565b620008c9919062001423565b828281518110620008df57620008de62001480565b5b6020026020010181815250506200091f601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168462000b1d60201b60201c565b80806200092c90620014af565b9150506200085b565b508060148560405162000949919062001280565b908152602001604051809103902090805190602001906200096c92919062001071565b5050505050565b6000804690508091505090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000620009fa600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662000d6d60201b620024f21760201c565b62000a09576000905062000aeb565b8173ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4552791856040518263ffffffff1660e01b815260040162000a7d9190620014fd565b60206040518083038186803b15801562000a9657600080fd5b505afa15801562000aab573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ad1919062001550565b73ffffffffffffffffffffffffffffffffffffffff161490505b92915050565b6000600162000b0c600a62000d9060201b620025151760201c565b62000b18919062001582565b905090565b62000b2d62000d9e60201b60201c565b1562000b70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b67906200160d565b60405180910390fd5b600062000b89600a62000d9060201b620025151760201c565b905062000ba2600a620003b260201b6200242b1760201c565b62000bb38162000db560201b60201c565b1562000bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000bed906200167f565b60405180910390fd5b62000c0a6000848362000e2160201b60201c565b6001600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000c5c919062001423565b9250508190555082600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000cca600084838562000e2660201b60201c565b62000d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d039062001717565b60405180910390fd5b808373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600081600001549050919050565b6000600660009054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600062000e548473ffffffffffffffffffffffffffffffffffffffff1662000d6d60201b620024f21760201c565b1562000fd3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000e86620002d060201b60201c565b8786866040518563ffffffff1660e01b815260040162000eaa9493929190620017b8565b602060405180830381600087803b15801562000ec557600080fd5b505af192505050801562000ef957506040513d601f19601f8201168201806040525081019062000ef6919062001869565b60015b62000f82573d806000811462000f2c576040519150601f19603f3d011682016040523d82523d6000602084013e62000f31565b606091505b5060008151141562000f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f719062001717565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000fd8565b600190505b949350505050565b82805462000fee9062001385565b90600052602060002090601f0160209004810192826200101257600085556200105e565b82601f106200102d57805160ff19168380011785556200105e565b828001600101855582156200105e579182015b828111156200105d57825182559160200191906001019062001040565b5b5090506200106d9190620010c3565b5090565b828054828255906000526020600020908101928215620010b0579160200282015b82811115620010af57825182559160200191906001019062001092565b5b509050620010bf9190620010c3565b5090565b5b80821115620010de576000816000905550600101620010c4565b5090565b600082825260208201905092915050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b60006200112b600e83620010e2565b91506200113882620010f3565b602082019050919050565b600060208201905081810360008301526200115e816200111c565b9050919050565b7f4552433732315472616461626c65236f6e6c794f776e65723a2043414c4c455260008201527f5f49535f4e4f545f4f574e455200000000000000000000000000000000000000602082015250565b6000620011c3602d83620010e2565b9150620011d08262001165565b604082019050919050565b60006020820190508181036000830152620011f681620011b4565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156200123357808201518184015260208101905062001216565b8381111562001243576000848401525b50505050565b60006200125682620011fd565b62001262818562001208565b93506200127481856020860162001213565b80840191505092915050565b60006200128e828462001249565b915081905092915050565b6000819050919050565b620012ae8162001299565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620012e182620012b4565b9050919050565b620012f381620012d4565b82525050565b600060a082019050620013106000830188620012a3565b6200131f6020830187620012a3565b6200132e6040830186620012a3565b6200133d6060830185620012e8565b6200134c6080830184620012a3565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200139e57607f821691505b60208210811415620013b557620013b462001356565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200143082620013ea565b91506200143d83620013ea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620014755762001474620013f4565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620014bc82620013ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620014f257620014f1620013f4565b5b600182019050919050565b6000602082019050620015146000830184620012e8565b92915050565b600080fd5b6200152a81620012d4565b81146200153657600080fd5b50565b6000815190506200154a816200151f565b92915050565b6000602082840312156200156957620015686200151a565b5b6000620015798482850162001539565b91505092915050565b60006200158f82620013ea565b91506200159c83620013ea565b925082821015620015b257620015b1620013f4565b5b828203905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620015f5601083620010e2565b91506200160282620015bd565b602082019050919050565b600060208201905081810360008301526200162881620015e6565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062001667601c83620010e2565b915062001674826200162f565b602082019050919050565b600060208201905081810360008301526200169a8162001658565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000620016ff603283620010e2565b91506200170c82620016a1565b604082019050919050565b600060208201905081810360008301526200173281620016f0565b9050919050565b6200174481620013ea565b82525050565b600081519050919050565b600082825260208201905092915050565b6000601f19601f8301169050919050565b600062001784826200174a565b62001790818562001755565b9350620017a281856020860162001213565b620017ad8162001766565b840191505092915050565b6000608082019050620017cf6000830187620012e8565b620017de6020830186620012e8565b620017ed604083018562001739565b818103606083015262001801818462001777565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62001843816200180c565b81146200184f57600080fd5b50565b600081519050620018638162001838565b92915050565b6000602082840312156200188257620018816200151a565b5b6000620018928482850162001852565b91505092915050565b615cf280620018ab6000396000f3fe60806040526004361061027d5760003560e01c80634a94d4871161014f57806395d89b41116100c1578063d547cfb71161007a578063d547cfb7146109a9578063d54aacd3146109d4578063e985e9c514610a11578063ed92377c14610a4e578063f2fde38b14610a6a578063f923e8c314610a935761027d565b806395d89b411461089b5780639dc29fac146108c6578063a22cb465146108ef578063b88d4fde14610918578063c87b56dd14610941578063cd7c03261461097e5761027d565b80636352211e116101135780636352211e1461079f57806370a08231146107dc578063715018a6146108195780638456cb5914610830578063862440e2146108475780638da5cb5b146108705761027d565b80634a94d4871461069f5780634f558e79146106cf57806353de9ae61461070c5780635c975abb146107375780635dd7a93d146107625761027d565b806323b872dd116101f35780633588ad7c116101ac5780633588ad7c146105b45780633a5a2f29146105dd5780633f4ba83a1461060657806341facdf11461061d57806342842e0e1461063957806346bdd5b7146106625761027d565b806323b872dd146104a657806324d88785146104cf578063261cb92a146104f85780632b1d65b6146105235780632d0335ab1461054c5780633408e470146105895761027d565b80630c53c51c116102455780630c53c51c1461038d5780630f7e5970146103bd5780631570b77c146103e857806318160ddd146104135780631e7d9dbb1461043e57806320379ee51461047b5761027d565b806301ffc9a71461028257806304efcc40146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b314610364575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613c6f565b610abe565b6040516102b69190613cb7565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613e4e565b610ba0565b6040516102f39190613eb9565b60405180910390f35b34801561030857600080fd5b50610311610c1b565b60405161031e9190613f5c565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613f7e565b610cad565b60405161035b9190613fec565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190614033565b610d32565b005b6103a760048036038101906103a29190614183565b610ed5565b6040516103b4919061426f565b60405180910390f35b3480156103c957600080fd5b506103d2611108565b6040516103df9190613f5c565b60405180910390f35b3480156103f457600080fd5b506103fd611141565b60405161040a9190613fec565b60405180910390f35b34801561041f57600080fd5b50610428611167565b6040516104359190613eb9565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190613f7e565b611184565b6040516104729190613cb7565b60405180910390f35b34801561048757600080fd5b506104906111ae565b60405161049d91906142a0565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906142bb565b6111b8565b005b3480156104db57600080fd5b506104f660048036038101906104f1919061430e565b6111d8565b005b34801561050457600080fd5b5061050d611241565b60405161051a9190613fec565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190614357565b611267565b005b34801561055857600080fd5b50610573600480360381019061056e91906143c6565b611313565b6040516105809190613eb9565b60405180910390f35b34801561059557600080fd5b5061059e61135c565b6040516105ab9190613eb9565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d691906143f3565b611369565b005b3480156105e957600080fd5b5061060460048036038101906105ff91906143c6565b611411565b005b34801561061257600080fd5b5061061b6114a4565b005b6106376004803603810190610632919061444f565b6114fd565b005b34801561064557600080fd5b50610660600480360381019061065b91906142bb565b61163e565b005b34801561066e57600080fd5b506106896004803603810190610684919061430e565b61165e565b6040516106969190613eb9565b60405180910390f35b6106b960048036038101906106b491906144da565b611686565b6040516106c6919061426f565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613f7e565b6116eb565b6040516107039190613cb7565b60405180910390f35b34801561071857600080fd5b50610721611757565b60405161072e9190613eb9565b60405180910390f35b34801561074357600080fd5b5061074c61175d565b6040516107599190613cb7565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613e4e565b611774565b6040516107969190613eb9565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613f7e565b6117b9565b6040516107d39190613fec565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906143c6565b6117cb565b6040516108109190613eb9565b60405180910390f35b34801561082557600080fd5b5061082e6117f8565b005b34801561083c57600080fd5b50610845611880565b005b34801561085357600080fd5b5061086e600480360381019061086991906143f3565b6118d9565b005b34801561087c57600080fd5b5061088561199f565b6040516108929190613fec565b60405180910390f35b3480156108a757600080fd5b506108b06119c9565b6040516108bd9190613f5c565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190614033565b611a5b565b005b3480156108fb57600080fd5b5061091660048036038101906109119190614575565b611ab5565b005b34801561092457600080fd5b5061093f600480360381019061093a91906145b5565b611c36565b005b34801561094d57600080fd5b5061096860048036038101906109639190613f7e565b611d28565b6040516109759190613f5c565b60405180910390f35b34801561098a57600080fd5b50610993611e8d565b6040516109a09190613fec565b60405180910390f35b3480156109b557600080fd5b506109be611eb3565b6040516109cb9190613f5c565b60405180910390f35b3480156109e057600080fd5b506109fb60048036038101906109f6919061430e565b611f45565b604051610a089190613eb9565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190614638565b611f6d565b604051610a459190613cb7565b60405180910390f35b610a686004803603810190610a639190613e4e565b612001565b005b348015610a7657600080fd5b50610a916004803603810190610a8c91906143c6565b6122a5565b005b348015610a9f57600080fd5b50610aa861239d565b604051610ab59190613f5c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b995750610b9882612523565b5b9050919050565b6000610bb2610bad61258d565b61259c565b610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be8906146ea565b60405180910390fd5b81601584604051610c029190614746565b9081526020016040518091039020819055905092915050565b606060008054610c2a9061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c569061478c565b8015610ca35780601f10610c7857610100808354040283529160200191610ca3565b820191906000526020600020905b815481529060010190602001808311610c8657829003601f168201915b5050505050905090565b6000610cb8826125f3565b610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90614830565b60405180910390fd5b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3d826117b9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906148c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dcd61258d565b73ffffffffffffffffffffffffffffffffffffffff1614610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a90614954565b60405180910390fd5b82600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610f58878287878761265f565b610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e906149e6565b60405180910390fd5b6001600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fe79190614a35565b925050819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b87338860405161102193929190614aac565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001611056929190614b6e565b6040516020818303038152906040526040516110729190614b96565b6000604051808303816000865af19150503d80600081146110af576040519150601f19603f3d011682016040523d82523d6000602084013e6110b4565b606091505b5091509150816110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090614bf9565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001611175600a612515565b61117f9190614c19565b905090565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600754905090565b6111d383838360405180602001604052806000815250611c36565b505050565b6111e86111e361258d565b61259c565b611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e906146ea565b60405180910390fd5b806010908051906020019061123d929190613b13565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61127761127261258d565b61259c565b6112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad906146ea565b60405180910390fd5b806015846040516112c79190614746565b908152602001604051809103902081905550816017846040516112ea9190614746565b90815260200160405180910390208190555061130e8383611309611eb3565b612768565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000804690508091505090565b61137961137461258d565b61259c565b6113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af906146ea565b60405180910390fd5b816113c281611184565b15611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614cbf565b60405180910390fd5b61140c83836128a7565b505050565b61142161141c61258d565b61259c565b611460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611457906146ea565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114b46114af61258d565b61259c565b6114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea906146ea565b60405180910390fd5b6114fb61295d565b565b6002600f541415611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90614d2b565b60405180910390fd5b6002600f819055503461157d836015866040516115609190614746565b9081526020016040518091039020546129ff90919063ffffffff16565b146115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490614d97565b60405180910390fd5b6115c8838383612768565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611630573d6000803e3d6000fd5b506001600f81905550505050565b61165983838360405180602001604052806000815250611c36565b505050565b60006015826040516116709190614746565b9081526020016040518091039020549050919050565b606061169861169361258d565b61259c565b6116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce906146ea565b60405180910390fd5b6116e2848484612a15565b90509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60115481565b6000600660009054906101000a900460ff16905090565b60006014836040516117869190614746565b908152602001604051809103902082815481106117a6576117a5614db7565b5b9060005260206000200154905092915050565b60006117c482612a44565b9050919050565b60006117d68261259c565b6117e8576117e382612af6565b6117f1565b6117f0611167565b5b9050919050565b61180061258d565b73ffffffffffffffffffffffffffffffffffffffff1661181e61199f565b73ffffffffffffffffffffffffffffffffffffffff1614611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90614e32565b60405180910390fd5b61187e6000612bae565b565b61189061188b61258d565b61259c565b6118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906146ea565b60405180910390fd5b6118d7612c74565b565b6118e96118e461258d565b61259c565b611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906146ea565b60405180910390fd5b8161193281611184565b15611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990614cbf565b60405180910390fd5b81601860008581526020019081526020016000209080519060200190611999929190613b13565b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119d89061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a049061478c565b8015611a515780601f10611a2657610100808354040283529160200191611a51565b820191906000526020600020905b815481529060010190602001808311611a3457829003601f168201915b5050505050905090565b8181611a678282612d17565b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90614eea565b60405180910390fd5b611aaf83612d8d565b50505050565b611abd61258d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2290614f56565b60405180910390fd5b8060056000611b3861258d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be561258d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2a9190613cb7565b60405180910390a35050565b611c47611c4161258d565b83612d17565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614eea565b60405180910390fd5b611c96611c9161258d565b61259c565b15611ca757611ca4826117b9565b93505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90614fe8565b60405180910390fd5b611d2284848484612edb565b50505050565b6060611d33826125f3565b611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061507a565b60405180910390fd5b6000601860008481526020019081526020016000208054611d929061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbe9061478c565b8015611e0b5780601f10611de057610100808354040283529160200191611e0b565b820191906000526020600020905b815481529060010190602001808311611dee57829003601f168201915b505050505090506000611e1c611eb3565b511415611e2c5780915050611e88565b600081511115611e3f5780915050611e88565b611e47611eb3565b60166000858152602001908152602001600020611e6385613291565b604051602001611e759392919061517a565b6040516020818303038152906040529150505b919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060108054611ec29061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054611eee9061478c565b8015611f3b5780601f10611f1057610100808354040283529160200191611f3b565b820191906000526020600020905b815481529060010190602001808311611f1e57829003601f168201915b5050505050905090565b6000601782604051611f579190614746565b9081526020016040518091039020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6002600f541415612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614d2b565b60405180910390fd5b6002600f8190555034612081826015856040516120649190614746565b9081526020016040518091039020546129ff90919063ffffffff16565b146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890614d97565b60405180910390fd5b60006120cc83611f45565b905081811015612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890615202565b60405180910390fd5b60006001905060008390505b60008111156121ff57600081101561216a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121619061526e565b60405180910390fd5b600060148660405161217c9190614746565b908152602001604051809103902083856121969190614c19565b815481106121a7576121a6614db7565b5b906000526020600020015490506121dd6121bf61199f565b6121c761258d565b8360405180602001604052806000815250612edb565b82806121e89061528e565b9350505080806121f7906152d7565b91505061211d565b50828261220c9190614c19565b60178560405161221c9190614746565b908152602001604051809103902081905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612296573d6000803e3d6000fd5b5050506001600f819055505050565b6122ad61258d565b73ffffffffffffffffffffffffffffffffffffffff166122cb61199f565b73ffffffffffffffffffffffffffffffffffffffff1614612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890614e32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238890615373565b60405180910390fd5b61239a81612bae565b50565b601080546123aa9061478c565b80601f01602080910402602001604051908101604052809291908181526020018280546123d69061478c565b80156124235780601f106123f857610100808354040283529160200191612423565b820191906000526020600020905b81548152906001019060200180831161240657829003601f168201915b505050505081565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156124eb57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506124ef565b3390505b90565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612597612441565b905090565b60008173ffffffffffffffffffffffffffffffffffffffff166125bd61199f565b73ffffffffffffffffffffffffffffffffffffffff1614806125ec57506125eb6125e561199f565b836133f2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790615405565b60405180910390fd5b60016126e36126de87613524565b61358c565b838686604051600081526020016040526040516127039493929190615434565b6020604051602081039080840390855afa158015612725573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008267ffffffffffffffff81111561278457612783613ced565b5b6040519080825280602002602001820160405280156127b25781602001602082028036833780820191505090505b50905060005b8381101561286d57846016600060016127cf611167565b6127d99190614a35565b815260200190815260200160002090805190602001906127fa929190613b13565b506001612805611167565b61280f9190614a35565b82828151811061282257612821614db7565b5b60200260200101818152505061285a601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846135c5565b80806128659061528e565b9150506127b8565b508060148560405161287f9190614746565b908152602001604051809103902090805190602001906128a0929190613b99565b5050505050565b60008151116128eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e2906154eb565b60405180910390fd5b60016019600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061292182826137d0565b817fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b55657207826040516129519190613f5c565b60405180910390a25050565b61296561175d565b6129a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299b90615557565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129e861258d565b6040516129f59190613fec565b60405180910390a1565b60008183612a0d9190615577565b905092915050565b6060612a3b848484604051806060016040528060298152602001615c94602991396137fc565b90509392505050565b600080600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490615643565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5e906156d5565b60405180910390fd5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c7c61175d565b15612cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb390615741565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d0061258d565b604051612d0d9190613fec565b60405180910390a1565b6000612d228361259c565b612d82578273ffffffffffffffffffffffffffffffffffffffff16612d46836117b9565b73ffffffffffffffffffffffffffffffffffffffff161480612d7d5750612d7c612d6f836117b9565b612d7761258d565b611f6d565b5b612d85565b60015b905092915050565b612d9561175d565b15612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc90615741565b60405180910390fd5b6000612de0826117b9565b9050612dee81600084613910565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e3e9190614c19565b92505081905550600d600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612ee361175d565b15612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90615741565b60405180910390fd5b612f33612f2e61258d565b61259c565b80612f7157508373ffffffffffffffffffffffffffffffffffffffff16612f59836117b9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f915750612f90612f83836117b9565b612f8b61258d565b611f6d565b5b612fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc7906157d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303790615865565b60405180910390fd5b613049826117b9565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461308757613084826117b9565b93505b613092848484613910565b6000600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131359190614c19565b925050819055506001600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461318c9190614a35565b9250508190555082600d600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506131f184848484613915565b613230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613227906158f7565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b606060008214156132d9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133ed565b600082905060005b6000821461330b5780806132f49061528e565b915050600a826133049190615946565b91506132e1565b60008167ffffffffffffffff81111561332757613326613ced565b5b6040519080825280601f01601f1916602001820160405280156133595781602001600182028036833780820191505090505b5090505b600085146133e6576001826133729190614c19565b9150600a856133819190615977565b603061338d9190614a35565b60f81b8183815181106133a3576133a2614db7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133df9190615946565b945061335d565b8093505050505b919050565b6000613435600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124f2565b613442576000905061351e565b8173ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4552791856040518263ffffffff1660e01b81526004016134b49190613fec565b60206040518083038186803b1580156134cc57600080fd5b505afa1580156134e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350491906159bd565b73ffffffffffffffffffffffffffffffffffffffff161490505b92915050565b6000604051806080016040528060438152602001615c5160439139805190602001208260000151836020015184604001518051906020012060405160200161356f94939291906159ea565b604051602081830303815290604052805190602001209050919050565b60006135966111ae565b826040516020016135a8929190615a2f565b604051602081830303815290604052805190602001209050919050565b6135cd61175d565b1561360d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360490615741565b60405180910390fd5b6000613619600a612515565b9050613625600a61242b565b61362e816125f3565b1561366e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366590615aa4565b60405180910390fd5b61367a60008483613910565b6001600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136ca9190614a35565b9250508190555082600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506137306000848385613915565b61376f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613766906158f7565b60405180910390fd5b808373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b806018600084815260200190815260200160002090805190602001906137f7929190613b13565b505050565b606082471015613841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383890615b36565b60405180910390fd5b61384a856124f2565b613889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388090615ba2565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138b29190614b96565b60006040518083038185875af1925050503d80600081146138ef576040519150601f19603f3d011682016040523d82523d6000602084013e6138f4565b606091505b5091509150613904828286613aac565b92505050949350505050565b505050565b60006139368473ffffffffffffffffffffffffffffffffffffffff166124f2565b15613a9f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261395f61258d565b8786866040518563ffffffff1660e01b81526004016139819493929190615bc2565b602060405180830381600087803b15801561399b57600080fd5b505af19250505080156139cc57506040513d601f19601f820116820180604052508101906139c99190615c23565b60015b613a4f573d80600081146139fc576040519150601f19603f3d011682016040523d82523d6000602084013e613a01565b606091505b50600081511415613a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3e906158f7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613aa4565b600190505b949350505050565b60608315613abc57829050613b0c565b600083511115613acf5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b039190613f5c565b60405180910390fd5b9392505050565b828054613b1f9061478c565b90600052602060002090601f016020900481019282613b415760008555613b88565b82601f10613b5a57805160ff1916838001178555613b88565b82800160010185558215613b88579182015b82811115613b87578251825591602001919060010190613b6c565b5b509050613b959190613be6565b5090565b828054828255906000526020600020908101928215613bd5579160200282015b82811115613bd4578251825591602001919060010190613bb9565b5b509050613be29190613be6565b5090565b5b80821115613bff576000816000905550600101613be7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c4c81613c17565b8114613c5757600080fd5b50565b600081359050613c6981613c43565b92915050565b600060208284031215613c8557613c84613c0d565b5b6000613c9384828501613c5a565b91505092915050565b60008115159050919050565b613cb181613c9c565b82525050565b6000602082019050613ccc6000830184613ca8565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d2582613cdc565b810181811067ffffffffffffffff82111715613d4457613d43613ced565b5b80604052505050565b6000613d57613c03565b9050613d638282613d1c565b919050565b600067ffffffffffffffff821115613d8357613d82613ced565b5b613d8c82613cdc565b9050602081019050919050565b82818337600083830152505050565b6000613dbb613db684613d68565b613d4d565b905082815260208101848484011115613dd757613dd6613cd7565b5b613de2848285613d99565b509392505050565b600082601f830112613dff57613dfe613cd2565b5b8135613e0f848260208601613da8565b91505092915050565b6000819050919050565b613e2b81613e18565b8114613e3657600080fd5b50565b600081359050613e4881613e22565b92915050565b60008060408385031215613e6557613e64613c0d565b5b600083013567ffffffffffffffff811115613e8357613e82613c12565b5b613e8f85828601613dea565b9250506020613ea085828601613e39565b9150509250929050565b613eb381613e18565b82525050565b6000602082019050613ece6000830184613eaa565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f0e578082015181840152602081019050613ef3565b83811115613f1d576000848401525b50505050565b6000613f2e82613ed4565b613f388185613edf565b9350613f48818560208601613ef0565b613f5181613cdc565b840191505092915050565b60006020820190508181036000830152613f768184613f23565b905092915050565b600060208284031215613f9457613f93613c0d565b5b6000613fa284828501613e39565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fd682613fab565b9050919050565b613fe681613fcb565b82525050565b60006020820190506140016000830184613fdd565b92915050565b61401081613fcb565b811461401b57600080fd5b50565b60008135905061402d81614007565b92915050565b6000806040838503121561404a57614049613c0d565b5b60006140588582860161401e565b925050602061406985828601613e39565b9150509250929050565b600067ffffffffffffffff82111561408e5761408d613ced565b5b61409782613cdc565b9050602081019050919050565b60006140b76140b284614073565b613d4d565b9050828152602081018484840111156140d3576140d2613cd7565b5b6140de848285613d99565b509392505050565b600082601f8301126140fb576140fa613cd2565b5b813561410b8482602086016140a4565b91505092915050565b6000819050919050565b61412781614114565b811461413257600080fd5b50565b6000813590506141448161411e565b92915050565b600060ff82169050919050565b6141608161414a565b811461416b57600080fd5b50565b60008135905061417d81614157565b92915050565b600080600080600060a0868803121561419f5761419e613c0d565b5b60006141ad8882890161401e565b955050602086013567ffffffffffffffff8111156141ce576141cd613c12565b5b6141da888289016140e6565b94505060406141eb88828901614135565b93505060606141fc88828901614135565b925050608061420d8882890161416e565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60006142418261421a565b61424b8185614225565b935061425b818560208601613ef0565b61426481613cdc565b840191505092915050565b600060208201905081810360008301526142898184614236565b905092915050565b61429a81614114565b82525050565b60006020820190506142b56000830184614291565b92915050565b6000806000606084860312156142d4576142d3613c0d565b5b60006142e28682870161401e565b93505060206142f38682870161401e565b925050604061430486828701613e39565b9150509250925092565b60006020828403121561432457614323613c0d565b5b600082013567ffffffffffffffff81111561434257614341613c12565b5b61434e84828501613dea565b91505092915050565b6000806000606084860312156143705761436f613c0d565b5b600084013567ffffffffffffffff81111561438e5761438d613c12565b5b61439a86828701613dea565b93505060206143ab86828701613e39565b92505060406143bc86828701613e39565b9150509250925092565b6000602082840312156143dc576143db613c0d565b5b60006143ea8482850161401e565b91505092915050565b6000806040838503121561440a57614409613c0d565b5b600061441885828601613e39565b925050602083013567ffffffffffffffff81111561443957614438613c12565b5b61444585828601613dea565b9150509250929050565b60008060006060848603121561446857614467613c0d565b5b600084013567ffffffffffffffff81111561448657614485613c12565b5b61449286828701613dea565b93505060206144a386828701613e39565b925050604084013567ffffffffffffffff8111156144c4576144c3613c12565b5b6144d0868287016140e6565b9150509250925092565b6000806000606084860312156144f3576144f2613c0d565b5b60006145018682870161401e565b935050602084013567ffffffffffffffff81111561452257614521613c12565b5b61452e868287016140e6565b925050604061453f86828701613e39565b9150509250925092565b61455281613c9c565b811461455d57600080fd5b50565b60008135905061456f81614549565b92915050565b6000806040838503121561458c5761458b613c0d565b5b600061459a8582860161401e565b92505060206145ab85828601614560565b9150509250929050565b600080600080608085870312156145cf576145ce613c0d565b5b60006145dd8782880161401e565b94505060206145ee8782880161401e565b93505060406145ff87828801613e39565b925050606085013567ffffffffffffffff8111156146205761461f613c12565b5b61462c878288016140e6565b91505092959194509250565b6000806040838503121561464f5761464e613c0d565b5b600061465d8582860161401e565b925050602061466e8582860161401e565b9150509250929050565b7f4552433732315472616461626c65236f6e6c794f776e65723a2043414c4c455260008201527f5f49535f4e4f545f4f574e455200000000000000000000000000000000000000602082015250565b60006146d4602d83613edf565b91506146df82614678565b604082019050919050565b60006020820190508181036000830152614703816146c7565b9050919050565b600081905092915050565b600061472082613ed4565b61472a818561470a565b935061473a818560208601613ef0565b80840191505092915050565b60006147528284614715565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147a457607f821691505b602082108114156147b8576147b761475d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061481a602c83613edf565b9150614825826147be565b604082019050919050565b600060208201905081810360008301526148498161480d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006148ac602183613edf565b91506148b782614850565b604082019050919050565b600060208201905081810360008301526148db8161489f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061493e603883613edf565b9150614949826148e2565b604082019050919050565b6000602082019050818103600083015261496d81614931565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006149d0602183613edf565b91506149db82614974565b604082019050919050565b600060208201905081810360008301526149ff816149c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a4082613e18565b9150614a4b83613e18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a8057614a7f614a06565b5b828201905092915050565b6000614a9682613fab565b9050919050565b614aa681614a8b565b82525050565b6000606082019050614ac16000830186613fdd565b614ace6020830185614a9d565b8181036040830152614ae08184614236565b9050949350505050565b600081905092915050565b6000614b008261421a565b614b0a8185614aea565b9350614b1a818560208601613ef0565b80840191505092915050565b60008160601b9050919050565b6000614b3e82614b26565b9050919050565b6000614b5082614b33565b9050919050565b614b68614b6382613fcb565b614b45565b82525050565b6000614b7a8285614af5565b9150614b868284614b57565b6014820191508190509392505050565b6000614ba28284614af5565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000614be3601c83613edf565b9150614bee82614bad565b602082019050919050565b60006020820190508181036000830152614c1281614bd6565b9050919050565b6000614c2482613e18565b9150614c2f83613e18565b925082821015614c4257614c41614a06565b5b828203905092915050565b7f4173736574436f6e7472616374236f6e6c79496d7065726d616e656e7455524960008201527f3a205552495f43414e4e4f545f42455f4348414e474544000000000000000000602082015250565b6000614ca9603783613edf565b9150614cb482614c4d565b604082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614d15601f83613edf565b9150614d2082614cdf565b602082019050919050565b60006020820190508181036000830152614d4481614d08565b9050919050565b7f45746865722076616c7565206973206e6f7420636f7272656374000000000000600082015250565b6000614d81601a83613edf565b9150614d8c82614d4b565b602082019050919050565b60006020820190508181036000830152614db081614d74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e1c602083613edf565b9150614e2782614de6565b602082019050919050565b60006020820190508181036000830152614e4b81614e0f565b9050919050565b7f4173736574436f6e7472616374236f6e6c79546f6b656e416d6f756e744f776e60008201527f65643a204f4e4c595f544f4b454e5f414d4f554e545f4f574e45445f414c4c4f60208201527f5745440000000000000000000000000000000000000000000000000000000000604082015250565b6000614ed4604383613edf565b9150614edf82614e52565b606082019050919050565b60006020820190508181036000830152614f0381614ec7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614f40601983613edf565b9150614f4b82614f0a565b602082019050919050565b60006020820190508181036000830152614f6f81614f33565b9050919050565b7f4173736574436f6e7472616374236f776e65724f66546f6b656e3a2066726f6d60008201527f20657175616c20746f2061646472000000000000000000000000000000000000602082015250565b6000614fd2602e83613edf565b9150614fdd82614f76565b604082019050919050565b6000602082019050818103600083015261500181614fc5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615064602f83613edf565b915061506f82615008565b604082019050919050565b6000602082019050818103600083015261509381615057565b9050919050565b60008190508160005260206000209050919050565b600081546150bc8161478c565b6150c6818661470a565b945060018216600081146150e157600181146150f257615125565b60ff19831686528186019350615125565b6150fb8561509a565b60005b8381101561511d578154818901526001820191506020810190506150fe565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061516460018361470a565b915061516f8261512e565b600182019050919050565b60006151868286614715565b915061519282856150af565b915061519d82615157565b91506151a98284614715565b9150819050949350505050565b7f20746f6b656e206e756d62657220737572706c7573206e6f7420656e6f756768600082015250565b60006151ec602083613edf565b91506151f7826151b6565b602082019050919050565b6000602082019050818103600083015261521b816151df565b9050919050565b7f20746f6b656e206e756d6265722069206e6f7420656e6f756768000000000000600082015250565b6000615258601a83613edf565b915061526382615222565b602082019050919050565b600060208201905081810360008301526152878161524b565b9050919050565b600061529982613e18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152cc576152cb614a06565b5b600182019050919050565b60006152e282613e18565b915060008214156152f6576152f5614a06565b5b600182039050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061535d602683613edf565b915061536882615301565b604082019050919050565b6000602082019050818103600083015261538c81615350565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b60006153ef602583613edf565b91506153fa82615393565b604082019050919050565b6000602082019050818103600083015261541e816153e2565b9050919050565b61542e8161414a565b82525050565b60006080820190506154496000830187614291565b6154566020830186615425565b6154636040830185614291565b6154706060830184614291565b95945050505050565b7f4173736574436f6e7472616374237365745065726d616e656e745552493a204f60008201527f4e4c595f56414c49445f55524900000000000000000000000000000000000000602082015250565b60006154d5602d83613edf565b91506154e082615479565b604082019050919050565b60006020820190508181036000830152615504816154c8565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615541601483613edf565b915061554c8261550b565b602082019050919050565b6000602082019050818103600083015261557081615534565b9050919050565b600061558282613e18565b915061558d83613e18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155c6576155c5614a06565b5b828202905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061562d602983613edf565b9150615638826155d1565b604082019050919050565b6000602082019050818103600083015261565c81615620565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006156bf602a83613edf565b91506156ca82615663565b604082019050919050565b600060208201905081810360008301526156ee816156b2565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061572b601083613edf565b9150615736826156f5565b602082019050919050565b6000602082019050818103600083015261575a8161571e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e206f722050726f78790000000000000000000000000000602082015250565b60006157bd603283613edf565b91506157c882615761565b604082019050919050565b600060208201905081810360008301526157ec816157b0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061584f602483613edf565b915061585a826157f3565b604082019050919050565b6000602082019050818103600083015261587e81615842565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006158e1603283613edf565b91506158ec82615885565b604082019050919050565b60006020820190508181036000830152615910816158d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061595182613e18565b915061595c83613e18565b92508261596c5761596b615917565b5b828204905092915050565b600061598282613e18565b915061598d83613e18565b92508261599d5761599c615917565b5b828206905092915050565b6000815190506159b781614007565b92915050565b6000602082840312156159d3576159d2613c0d565b5b60006159e1848285016159a8565b91505092915050565b60006080820190506159ff6000830187614291565b615a0c6020830186613eaa565b615a196040830185613fdd565b615a266060830184614291565b95945050505050565b6000604082019050615a446000830185614291565b615a516020830184614291565b9392505050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a8e601c83613edf565b9150615a9982615a58565b602082019050919050565b60006020820190508181036000830152615abd81615a81565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615b20602683613edf565b9150615b2b82615ac4565b604082019050919050565b60006020820190508181036000830152615b4f81615b13565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615b8c601d83613edf565b9150615b9782615b56565b602082019050919050565b60006020820190508181036000830152615bbb81615b7f565b9050919050565b6000608082019050615bd76000830187613fdd565b615be46020830186613fdd565b615bf16040830185613eaa565b8181036060830152615c038184614236565b905095945050505050565b600081519050615c1d81613c43565b92915050565b600060208284031215615c3957615c38613c0d565b5b6000615c4784828501615c0e565b9150509291505056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220f29d3e2fdd17d84f0b756f98ec9e8f8fbdb9536d13270ec63de89d54b1beaa7b64736f6c63430008090033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429687474703a2f2f3136342e3135352e34392e3130352f6170692f7468696e672f696e666f2f

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80634a94d4871161014f57806395d89b41116100c1578063d547cfb71161007a578063d547cfb7146109a9578063d54aacd3146109d4578063e985e9c514610a11578063ed92377c14610a4e578063f2fde38b14610a6a578063f923e8c314610a935761027d565b806395d89b411461089b5780639dc29fac146108c6578063a22cb465146108ef578063b88d4fde14610918578063c87b56dd14610941578063cd7c03261461097e5761027d565b80636352211e116101135780636352211e1461079f57806370a08231146107dc578063715018a6146108195780638456cb5914610830578063862440e2146108475780638da5cb5b146108705761027d565b80634a94d4871461069f5780634f558e79146106cf57806353de9ae61461070c5780635c975abb146107375780635dd7a93d146107625761027d565b806323b872dd116101f35780633588ad7c116101ac5780633588ad7c146105b45780633a5a2f29146105dd5780633f4ba83a1461060657806341facdf11461061d57806342842e0e1461063957806346bdd5b7146106625761027d565b806323b872dd146104a657806324d88785146104cf578063261cb92a146104f85780632b1d65b6146105235780632d0335ab1461054c5780633408e470146105895761027d565b80630c53c51c116102455780630c53c51c1461038d5780630f7e5970146103bd5780631570b77c146103e857806318160ddd146104135780631e7d9dbb1461043e57806320379ee51461047b5761027d565b806301ffc9a71461028257806304efcc40146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b314610364575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613c6f565b610abe565b6040516102b69190613cb7565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613e4e565b610ba0565b6040516102f39190613eb9565b60405180910390f35b34801561030857600080fd5b50610311610c1b565b60405161031e9190613f5c565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613f7e565b610cad565b60405161035b9190613fec565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190614033565b610d32565b005b6103a760048036038101906103a29190614183565b610ed5565b6040516103b4919061426f565b60405180910390f35b3480156103c957600080fd5b506103d2611108565b6040516103df9190613f5c565b60405180910390f35b3480156103f457600080fd5b506103fd611141565b60405161040a9190613fec565b60405180910390f35b34801561041f57600080fd5b50610428611167565b6040516104359190613eb9565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190613f7e565b611184565b6040516104729190613cb7565b60405180910390f35b34801561048757600080fd5b506104906111ae565b60405161049d91906142a0565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906142bb565b6111b8565b005b3480156104db57600080fd5b506104f660048036038101906104f1919061430e565b6111d8565b005b34801561050457600080fd5b5061050d611241565b60405161051a9190613fec565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190614357565b611267565b005b34801561055857600080fd5b50610573600480360381019061056e91906143c6565b611313565b6040516105809190613eb9565b60405180910390f35b34801561059557600080fd5b5061059e61135c565b6040516105ab9190613eb9565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d691906143f3565b611369565b005b3480156105e957600080fd5b5061060460048036038101906105ff91906143c6565b611411565b005b34801561061257600080fd5b5061061b6114a4565b005b6106376004803603810190610632919061444f565b6114fd565b005b34801561064557600080fd5b50610660600480360381019061065b91906142bb565b61163e565b005b34801561066e57600080fd5b506106896004803603810190610684919061430e565b61165e565b6040516106969190613eb9565b60405180910390f35b6106b960048036038101906106b491906144da565b611686565b6040516106c6919061426f565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613f7e565b6116eb565b6040516107039190613cb7565b60405180910390f35b34801561071857600080fd5b50610721611757565b60405161072e9190613eb9565b60405180910390f35b34801561074357600080fd5b5061074c61175d565b6040516107599190613cb7565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613e4e565b611774565b6040516107969190613eb9565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613f7e565b6117b9565b6040516107d39190613fec565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906143c6565b6117cb565b6040516108109190613eb9565b60405180910390f35b34801561082557600080fd5b5061082e6117f8565b005b34801561083c57600080fd5b50610845611880565b005b34801561085357600080fd5b5061086e600480360381019061086991906143f3565b6118d9565b005b34801561087c57600080fd5b5061088561199f565b6040516108929190613fec565b60405180910390f35b3480156108a757600080fd5b506108b06119c9565b6040516108bd9190613f5c565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190614033565b611a5b565b005b3480156108fb57600080fd5b5061091660048036038101906109119190614575565b611ab5565b005b34801561092457600080fd5b5061093f600480360381019061093a91906145b5565b611c36565b005b34801561094d57600080fd5b5061096860048036038101906109639190613f7e565b611d28565b6040516109759190613f5c565b60405180910390f35b34801561098a57600080fd5b50610993611e8d565b6040516109a09190613fec565b60405180910390f35b3480156109b557600080fd5b506109be611eb3565b6040516109cb9190613f5c565b60405180910390f35b3480156109e057600080fd5b506109fb60048036038101906109f6919061430e565b611f45565b604051610a089190613eb9565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190614638565b611f6d565b604051610a459190613cb7565b60405180910390f35b610a686004803603810190610a639190613e4e565b612001565b005b348015610a7657600080fd5b50610a916004803603810190610a8c91906143c6565b6122a5565b005b348015610a9f57600080fd5b50610aa861239d565b604051610ab59190613f5c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b995750610b9882612523565b5b9050919050565b6000610bb2610bad61258d565b61259c565b610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be8906146ea565b60405180910390fd5b81601584604051610c029190614746565b9081526020016040518091039020819055905092915050565b606060008054610c2a9061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c569061478c565b8015610ca35780601f10610c7857610100808354040283529160200191610ca3565b820191906000526020600020905b815481529060010190602001808311610c8657829003601f168201915b5050505050905090565b6000610cb8826125f3565b610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90614830565b60405180910390fd5b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3d826117b9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906148c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dcd61258d565b73ffffffffffffffffffffffffffffffffffffffff1614610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a90614954565b60405180910390fd5b82600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610f58878287878761265f565b610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e906149e6565b60405180910390fd5b6001600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fe79190614a35565b925050819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b87338860405161102193929190614aac565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001611056929190614b6e565b6040516020818303038152906040526040516110729190614b96565b6000604051808303816000865af19150503d80600081146110af576040519150601f19603f3d011682016040523d82523d6000602084013e6110b4565b606091505b5091509150816110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090614bf9565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001611175600a612515565b61117f9190614c19565b905090565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600754905090565b6111d383838360405180602001604052806000815250611c36565b505050565b6111e86111e361258d565b61259c565b611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e906146ea565b60405180910390fd5b806010908051906020019061123d929190613b13565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61127761127261258d565b61259c565b6112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad906146ea565b60405180910390fd5b806015846040516112c79190614746565b908152602001604051809103902081905550816017846040516112ea9190614746565b90815260200160405180910390208190555061130e8383611309611eb3565b612768565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000804690508091505090565b61137961137461258d565b61259c565b6113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af906146ea565b60405180910390fd5b816113c281611184565b15611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614cbf565b60405180910390fd5b61140c83836128a7565b505050565b61142161141c61258d565b61259c565b611460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611457906146ea565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114b46114af61258d565b61259c565b6114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea906146ea565b60405180910390fd5b6114fb61295d565b565b6002600f541415611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90614d2b565b60405180910390fd5b6002600f819055503461157d836015866040516115609190614746565b9081526020016040518091039020546129ff90919063ffffffff16565b146115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490614d97565b60405180910390fd5b6115c8838383612768565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611630573d6000803e3d6000fd5b506001600f81905550505050565b61165983838360405180602001604052806000815250611c36565b505050565b60006015826040516116709190614746565b9081526020016040518091039020549050919050565b606061169861169361258d565b61259c565b6116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce906146ea565b60405180910390fd5b6116e2848484612a15565b90509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60115481565b6000600660009054906101000a900460ff16905090565b60006014836040516117869190614746565b908152602001604051809103902082815481106117a6576117a5614db7565b5b9060005260206000200154905092915050565b60006117c482612a44565b9050919050565b60006117d68261259c565b6117e8576117e382612af6565b6117f1565b6117f0611167565b5b9050919050565b61180061258d565b73ffffffffffffffffffffffffffffffffffffffff1661181e61199f565b73ffffffffffffffffffffffffffffffffffffffff1614611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90614e32565b60405180910390fd5b61187e6000612bae565b565b61189061188b61258d565b61259c565b6118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906146ea565b60405180910390fd5b6118d7612c74565b565b6118e96118e461258d565b61259c565b611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906146ea565b60405180910390fd5b8161193281611184565b15611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990614cbf565b60405180910390fd5b81601860008581526020019081526020016000209080519060200190611999929190613b13565b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119d89061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a049061478c565b8015611a515780601f10611a2657610100808354040283529160200191611a51565b820191906000526020600020905b815481529060010190602001808311611a3457829003601f168201915b5050505050905090565b8181611a678282612d17565b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90614eea565b60405180910390fd5b611aaf83612d8d565b50505050565b611abd61258d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2290614f56565b60405180910390fd5b8060056000611b3861258d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be561258d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2a9190613cb7565b60405180910390a35050565b611c47611c4161258d565b83612d17565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614eea565b60405180910390fd5b611c96611c9161258d565b61259c565b15611ca757611ca4826117b9565b93505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90614fe8565b60405180910390fd5b611d2284848484612edb565b50505050565b6060611d33826125f3565b611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061507a565b60405180910390fd5b6000601860008481526020019081526020016000208054611d929061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbe9061478c565b8015611e0b5780601f10611de057610100808354040283529160200191611e0b565b820191906000526020600020905b815481529060010190602001808311611dee57829003601f168201915b505050505090506000611e1c611eb3565b511415611e2c5780915050611e88565b600081511115611e3f5780915050611e88565b611e47611eb3565b60166000858152602001908152602001600020611e6385613291565b604051602001611e759392919061517a565b6040516020818303038152906040529150505b919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060108054611ec29061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054611eee9061478c565b8015611f3b5780601f10611f1057610100808354040283529160200191611f3b565b820191906000526020600020905b815481529060010190602001808311611f1e57829003601f168201915b5050505050905090565b6000601782604051611f579190614746565b9081526020016040518091039020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6002600f541415612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614d2b565b60405180910390fd5b6002600f8190555034612081826015856040516120649190614746565b9081526020016040518091039020546129ff90919063ffffffff16565b146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890614d97565b60405180910390fd5b60006120cc83611f45565b905081811015612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890615202565b60405180910390fd5b60006001905060008390505b60008111156121ff57600081101561216a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121619061526e565b60405180910390fd5b600060148660405161217c9190614746565b908152602001604051809103902083856121969190614c19565b815481106121a7576121a6614db7565b5b906000526020600020015490506121dd6121bf61199f565b6121c761258d565b8360405180602001604052806000815250612edb565b82806121e89061528e565b9350505080806121f7906152d7565b91505061211d565b50828261220c9190614c19565b60178560405161221c9190614746565b908152602001604051809103902081905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612296573d6000803e3d6000fd5b5050506001600f819055505050565b6122ad61258d565b73ffffffffffffffffffffffffffffffffffffffff166122cb61199f565b73ffffffffffffffffffffffffffffffffffffffff1614612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890614e32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238890615373565b60405180910390fd5b61239a81612bae565b50565b601080546123aa9061478c565b80601f01602080910402602001604051908101604052809291908181526020018280546123d69061478c565b80156124235780601f106123f857610100808354040283529160200191612423565b820191906000526020600020905b81548152906001019060200180831161240657829003601f168201915b505050505081565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156124eb57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506124ef565b3390505b90565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612597612441565b905090565b60008173ffffffffffffffffffffffffffffffffffffffff166125bd61199f565b73ffffffffffffffffffffffffffffffffffffffff1614806125ec57506125eb6125e561199f565b836133f2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790615405565b60405180910390fd5b60016126e36126de87613524565b61358c565b838686604051600081526020016040526040516127039493929190615434565b6020604051602081039080840390855afa158015612725573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008267ffffffffffffffff81111561278457612783613ced565b5b6040519080825280602002602001820160405280156127b25781602001602082028036833780820191505090505b50905060005b8381101561286d57846016600060016127cf611167565b6127d99190614a35565b815260200190815260200160002090805190602001906127fa929190613b13565b506001612805611167565b61280f9190614a35565b82828151811061282257612821614db7565b5b60200260200101818152505061285a601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846135c5565b80806128659061528e565b9150506127b8565b508060148560405161287f9190614746565b908152602001604051809103902090805190602001906128a0929190613b99565b5050505050565b60008151116128eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e2906154eb565b60405180910390fd5b60016019600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061292182826137d0565b817fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b55657207826040516129519190613f5c565b60405180910390a25050565b61296561175d565b6129a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299b90615557565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129e861258d565b6040516129f59190613fec565b60405180910390a1565b60008183612a0d9190615577565b905092915050565b6060612a3b848484604051806060016040528060298152602001615c94602991396137fc565b90509392505050565b600080600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490615643565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5e906156d5565b60405180910390fd5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c7c61175d565b15612cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb390615741565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d0061258d565b604051612d0d9190613fec565b60405180910390a1565b6000612d228361259c565b612d82578273ffffffffffffffffffffffffffffffffffffffff16612d46836117b9565b73ffffffffffffffffffffffffffffffffffffffff161480612d7d5750612d7c612d6f836117b9565b612d7761258d565b611f6d565b5b612d85565b60015b905092915050565b612d9561175d565b15612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc90615741565b60405180910390fd5b6000612de0826117b9565b9050612dee81600084613910565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e3e9190614c19565b92505081905550600d600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612ee361175d565b15612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90615741565b60405180910390fd5b612f33612f2e61258d565b61259c565b80612f7157508373ffffffffffffffffffffffffffffffffffffffff16612f59836117b9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f915750612f90612f83836117b9565b612f8b61258d565b611f6d565b5b612fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc7906157d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303790615865565b60405180910390fd5b613049826117b9565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461308757613084826117b9565b93505b613092848484613910565b6000600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131359190614c19565b925050819055506001600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461318c9190614a35565b9250508190555082600d600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506131f184848484613915565b613230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613227906158f7565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b606060008214156132d9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133ed565b600082905060005b6000821461330b5780806132f49061528e565b915050600a826133049190615946565b91506132e1565b60008167ffffffffffffffff81111561332757613326613ced565b5b6040519080825280601f01601f1916602001820160405280156133595781602001600182028036833780820191505090505b5090505b600085146133e6576001826133729190614c19565b9150600a856133819190615977565b603061338d9190614a35565b60f81b8183815181106133a3576133a2614db7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133df9190615946565b945061335d565b8093505050505b919050565b6000613435600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124f2565b613442576000905061351e565b8173ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4552791856040518263ffffffff1660e01b81526004016134b49190613fec565b60206040518083038186803b1580156134cc57600080fd5b505afa1580156134e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350491906159bd565b73ffffffffffffffffffffffffffffffffffffffff161490505b92915050565b6000604051806080016040528060438152602001615c5160439139805190602001208260000151836020015184604001518051906020012060405160200161356f94939291906159ea565b604051602081830303815290604052805190602001209050919050565b60006135966111ae565b826040516020016135a8929190615a2f565b604051602081830303815290604052805190602001209050919050565b6135cd61175d565b1561360d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360490615741565b60405180910390fd5b6000613619600a612515565b9050613625600a61242b565b61362e816125f3565b1561366e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366590615aa4565b60405180910390fd5b61367a60008483613910565b6001600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136ca9190614a35565b9250508190555082600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506137306000848385613915565b61376f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613766906158f7565b60405180910390fd5b808373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b806018600084815260200190815260200160002090805190602001906137f7929190613b13565b505050565b606082471015613841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383890615b36565b60405180910390fd5b61384a856124f2565b613889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388090615ba2565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138b29190614b96565b60006040518083038185875af1925050503d80600081146138ef576040519150601f19603f3d011682016040523d82523d6000602084013e6138f4565b606091505b5091509150613904828286613aac565b92505050949350505050565b505050565b60006139368473ffffffffffffffffffffffffffffffffffffffff166124f2565b15613a9f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261395f61258d565b8786866040518563ffffffff1660e01b81526004016139819493929190615bc2565b602060405180830381600087803b15801561399b57600080fd5b505af19250505080156139cc57506040513d601f19601f820116820180604052508101906139c99190615c23565b60015b613a4f573d80600081146139fc576040519150601f19603f3d011682016040523d82523d6000602084013e613a01565b606091505b50600081511415613a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3e906158f7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613aa4565b600190505b949350505050565b60608315613abc57829050613b0c565b600083511115613acf5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b039190613f5c565b60405180910390fd5b9392505050565b828054613b1f9061478c565b90600052602060002090601f016020900481019282613b415760008555613b88565b82601f10613b5a57805160ff1916838001178555613b88565b82800160010185558215613b88579182015b82811115613b87578251825591602001919060010190613b6c565b5b509050613b959190613be6565b5090565b828054828255906000526020600020908101928215613bd5579160200282015b82811115613bd4578251825591602001919060010190613bb9565b5b509050613be29190613be6565b5090565b5b80821115613bff576000816000905550600101613be7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c4c81613c17565b8114613c5757600080fd5b50565b600081359050613c6981613c43565b92915050565b600060208284031215613c8557613c84613c0d565b5b6000613c9384828501613c5a565b91505092915050565b60008115159050919050565b613cb181613c9c565b82525050565b6000602082019050613ccc6000830184613ca8565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d2582613cdc565b810181811067ffffffffffffffff82111715613d4457613d43613ced565b5b80604052505050565b6000613d57613c03565b9050613d638282613d1c565b919050565b600067ffffffffffffffff821115613d8357613d82613ced565b5b613d8c82613cdc565b9050602081019050919050565b82818337600083830152505050565b6000613dbb613db684613d68565b613d4d565b905082815260208101848484011115613dd757613dd6613cd7565b5b613de2848285613d99565b509392505050565b600082601f830112613dff57613dfe613cd2565b5b8135613e0f848260208601613da8565b91505092915050565b6000819050919050565b613e2b81613e18565b8114613e3657600080fd5b50565b600081359050613e4881613e22565b92915050565b60008060408385031215613e6557613e64613c0d565b5b600083013567ffffffffffffffff811115613e8357613e82613c12565b5b613e8f85828601613dea565b9250506020613ea085828601613e39565b9150509250929050565b613eb381613e18565b82525050565b6000602082019050613ece6000830184613eaa565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f0e578082015181840152602081019050613ef3565b83811115613f1d576000848401525b50505050565b6000613f2e82613ed4565b613f388185613edf565b9350613f48818560208601613ef0565b613f5181613cdc565b840191505092915050565b60006020820190508181036000830152613f768184613f23565b905092915050565b600060208284031215613f9457613f93613c0d565b5b6000613fa284828501613e39565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fd682613fab565b9050919050565b613fe681613fcb565b82525050565b60006020820190506140016000830184613fdd565b92915050565b61401081613fcb565b811461401b57600080fd5b50565b60008135905061402d81614007565b92915050565b6000806040838503121561404a57614049613c0d565b5b60006140588582860161401e565b925050602061406985828601613e39565b9150509250929050565b600067ffffffffffffffff82111561408e5761408d613ced565b5b61409782613cdc565b9050602081019050919050565b60006140b76140b284614073565b613d4d565b9050828152602081018484840111156140d3576140d2613cd7565b5b6140de848285613d99565b509392505050565b600082601f8301126140fb576140fa613cd2565b5b813561410b8482602086016140a4565b91505092915050565b6000819050919050565b61412781614114565b811461413257600080fd5b50565b6000813590506141448161411e565b92915050565b600060ff82169050919050565b6141608161414a565b811461416b57600080fd5b50565b60008135905061417d81614157565b92915050565b600080600080600060a0868803121561419f5761419e613c0d565b5b60006141ad8882890161401e565b955050602086013567ffffffffffffffff8111156141ce576141cd613c12565b5b6141da888289016140e6565b94505060406141eb88828901614135565b93505060606141fc88828901614135565b925050608061420d8882890161416e565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60006142418261421a565b61424b8185614225565b935061425b818560208601613ef0565b61426481613cdc565b840191505092915050565b600060208201905081810360008301526142898184614236565b905092915050565b61429a81614114565b82525050565b60006020820190506142b56000830184614291565b92915050565b6000806000606084860312156142d4576142d3613c0d565b5b60006142e28682870161401e565b93505060206142f38682870161401e565b925050604061430486828701613e39565b9150509250925092565b60006020828403121561432457614323613c0d565b5b600082013567ffffffffffffffff81111561434257614341613c12565b5b61434e84828501613dea565b91505092915050565b6000806000606084860312156143705761436f613c0d565b5b600084013567ffffffffffffffff81111561438e5761438d613c12565b5b61439a86828701613dea565b93505060206143ab86828701613e39565b92505060406143bc86828701613e39565b9150509250925092565b6000602082840312156143dc576143db613c0d565b5b60006143ea8482850161401e565b91505092915050565b6000806040838503121561440a57614409613c0d565b5b600061441885828601613e39565b925050602083013567ffffffffffffffff81111561443957614438613c12565b5b61444585828601613dea565b9150509250929050565b60008060006060848603121561446857614467613c0d565b5b600084013567ffffffffffffffff81111561448657614485613c12565b5b61449286828701613dea565b93505060206144a386828701613e39565b925050604084013567ffffffffffffffff8111156144c4576144c3613c12565b5b6144d0868287016140e6565b9150509250925092565b6000806000606084860312156144f3576144f2613c0d565b5b60006145018682870161401e565b935050602084013567ffffffffffffffff81111561452257614521613c12565b5b61452e868287016140e6565b925050604061453f86828701613e39565b9150509250925092565b61455281613c9c565b811461455d57600080fd5b50565b60008135905061456f81614549565b92915050565b6000806040838503121561458c5761458b613c0d565b5b600061459a8582860161401e565b92505060206145ab85828601614560565b9150509250929050565b600080600080608085870312156145cf576145ce613c0d565b5b60006145dd8782880161401e565b94505060206145ee8782880161401e565b93505060406145ff87828801613e39565b925050606085013567ffffffffffffffff8111156146205761461f613c12565b5b61462c878288016140e6565b91505092959194509250565b6000806040838503121561464f5761464e613c0d565b5b600061465d8582860161401e565b925050602061466e8582860161401e565b9150509250929050565b7f4552433732315472616461626c65236f6e6c794f776e65723a2043414c4c455260008201527f5f49535f4e4f545f4f574e455200000000000000000000000000000000000000602082015250565b60006146d4602d83613edf565b91506146df82614678565b604082019050919050565b60006020820190508181036000830152614703816146c7565b9050919050565b600081905092915050565b600061472082613ed4565b61472a818561470a565b935061473a818560208601613ef0565b80840191505092915050565b60006147528284614715565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147a457607f821691505b602082108114156147b8576147b761475d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061481a602c83613edf565b9150614825826147be565b604082019050919050565b600060208201905081810360008301526148498161480d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006148ac602183613edf565b91506148b782614850565b604082019050919050565b600060208201905081810360008301526148db8161489f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061493e603883613edf565b9150614949826148e2565b604082019050919050565b6000602082019050818103600083015261496d81614931565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006149d0602183613edf565b91506149db82614974565b604082019050919050565b600060208201905081810360008301526149ff816149c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a4082613e18565b9150614a4b83613e18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a8057614a7f614a06565b5b828201905092915050565b6000614a9682613fab565b9050919050565b614aa681614a8b565b82525050565b6000606082019050614ac16000830186613fdd565b614ace6020830185614a9d565b8181036040830152614ae08184614236565b9050949350505050565b600081905092915050565b6000614b008261421a565b614b0a8185614aea565b9350614b1a818560208601613ef0565b80840191505092915050565b60008160601b9050919050565b6000614b3e82614b26565b9050919050565b6000614b5082614b33565b9050919050565b614b68614b6382613fcb565b614b45565b82525050565b6000614b7a8285614af5565b9150614b868284614b57565b6014820191508190509392505050565b6000614ba28284614af5565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000614be3601c83613edf565b9150614bee82614bad565b602082019050919050565b60006020820190508181036000830152614c1281614bd6565b9050919050565b6000614c2482613e18565b9150614c2f83613e18565b925082821015614c4257614c41614a06565b5b828203905092915050565b7f4173736574436f6e7472616374236f6e6c79496d7065726d616e656e7455524960008201527f3a205552495f43414e4e4f545f42455f4348414e474544000000000000000000602082015250565b6000614ca9603783613edf565b9150614cb482614c4d565b604082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614d15601f83613edf565b9150614d2082614cdf565b602082019050919050565b60006020820190508181036000830152614d4481614d08565b9050919050565b7f45746865722076616c7565206973206e6f7420636f7272656374000000000000600082015250565b6000614d81601a83613edf565b9150614d8c82614d4b565b602082019050919050565b60006020820190508181036000830152614db081614d74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e1c602083613edf565b9150614e2782614de6565b602082019050919050565b60006020820190508181036000830152614e4b81614e0f565b9050919050565b7f4173736574436f6e7472616374236f6e6c79546f6b656e416d6f756e744f776e60008201527f65643a204f4e4c595f544f4b454e5f414d4f554e545f4f574e45445f414c4c4f60208201527f5745440000000000000000000000000000000000000000000000000000000000604082015250565b6000614ed4604383613edf565b9150614edf82614e52565b606082019050919050565b60006020820190508181036000830152614f0381614ec7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614f40601983613edf565b9150614f4b82614f0a565b602082019050919050565b60006020820190508181036000830152614f6f81614f33565b9050919050565b7f4173736574436f6e7472616374236f776e65724f66546f6b656e3a2066726f6d60008201527f20657175616c20746f2061646472000000000000000000000000000000000000602082015250565b6000614fd2602e83613edf565b9150614fdd82614f76565b604082019050919050565b6000602082019050818103600083015261500181614fc5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615064602f83613edf565b915061506f82615008565b604082019050919050565b6000602082019050818103600083015261509381615057565b9050919050565b60008190508160005260206000209050919050565b600081546150bc8161478c565b6150c6818661470a565b945060018216600081146150e157600181146150f257615125565b60ff19831686528186019350615125565b6150fb8561509a565b60005b8381101561511d578154818901526001820191506020810190506150fe565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061516460018361470a565b915061516f8261512e565b600182019050919050565b60006151868286614715565b915061519282856150af565b915061519d82615157565b91506151a98284614715565b9150819050949350505050565b7f20746f6b656e206e756d62657220737572706c7573206e6f7420656e6f756768600082015250565b60006151ec602083613edf565b91506151f7826151b6565b602082019050919050565b6000602082019050818103600083015261521b816151df565b9050919050565b7f20746f6b656e206e756d6265722069206e6f7420656e6f756768000000000000600082015250565b6000615258601a83613edf565b915061526382615222565b602082019050919050565b600060208201905081810360008301526152878161524b565b9050919050565b600061529982613e18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152cc576152cb614a06565b5b600182019050919050565b60006152e282613e18565b915060008214156152f6576152f5614a06565b5b600182039050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061535d602683613edf565b915061536882615301565b604082019050919050565b6000602082019050818103600083015261538c81615350565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b60006153ef602583613edf565b91506153fa82615393565b604082019050919050565b6000602082019050818103600083015261541e816153e2565b9050919050565b61542e8161414a565b82525050565b60006080820190506154496000830187614291565b6154566020830186615425565b6154636040830185614291565b6154706060830184614291565b95945050505050565b7f4173736574436f6e7472616374237365745065726d616e656e745552493a204f60008201527f4e4c595f56414c49445f55524900000000000000000000000000000000000000602082015250565b60006154d5602d83613edf565b91506154e082615479565b604082019050919050565b60006020820190508181036000830152615504816154c8565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615541601483613edf565b915061554c8261550b565b602082019050919050565b6000602082019050818103600083015261557081615534565b9050919050565b600061558282613e18565b915061558d83613e18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155c6576155c5614a06565b5b828202905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061562d602983613edf565b9150615638826155d1565b604082019050919050565b6000602082019050818103600083015261565c81615620565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006156bf602a83613edf565b91506156ca82615663565b604082019050919050565b600060208201905081810360008301526156ee816156b2565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061572b601083613edf565b9150615736826156f5565b602082019050919050565b6000602082019050818103600083015261575a8161571e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e206f722050726f78790000000000000000000000000000602082015250565b60006157bd603283613edf565b91506157c882615761565b604082019050919050565b600060208201905081810360008301526157ec816157b0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061584f602483613edf565b915061585a826157f3565b604082019050919050565b6000602082019050818103600083015261587e81615842565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006158e1603283613edf565b91506158ec82615885565b604082019050919050565b60006020820190508181036000830152615910816158d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061595182613e18565b915061595c83613e18565b92508261596c5761596b615917565b5b828204905092915050565b600061598282613e18565b915061598d83613e18565b92508261599d5761599c615917565b5b828206905092915050565b6000815190506159b781614007565b92915050565b6000602082840312156159d3576159d2613c0d565b5b60006159e1848285016159a8565b91505092915050565b60006080820190506159ff6000830187614291565b615a0c6020830186613eaa565b615a196040830185613fdd565b615a266060830184614291565b95945050505050565b6000604082019050615a446000830185614291565b615a516020830184614291565b9392505050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a8e601c83613edf565b9150615a9982615a58565b602082019050919050565b60006020820190508181036000830152615abd81615a81565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615b20602683613edf565b9150615b2b82615ac4565b604082019050919050565b60006020820190508181036000830152615b4f81615b13565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615b8c601d83613edf565b9150615b9782615b56565b602082019050919050565b60006020820190508181036000830152615bbb81615b7f565b9050919050565b6000608082019050615bd76000830187613fdd565b615be46020830186613fdd565b615bf16040830185613eaa565b8181036060830152615c038184614236565b905095945050505050565b600081519050615c1d81613c43565b92915050565b600060208284031215615c3957615c38613c0d565b5b6000615c4784828501615c0e565b9150509291505056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220f29d3e2fdd17d84f0b756f98ec9e8f8fbdb9536d13270ec63de89d54b1beaa7b64736f6c63430008090033

Deployed Bytecode Sourcemap

69454:307:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39265:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65905:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40265:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55282:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54861:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9600:978;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7742:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61032:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56519:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67772:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8545:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63342:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62466:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60994:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66121:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11004:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8654:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67580:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62342:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55676:74;;;;;;;;;;;;;:::i;:::-;;64639:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63531:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62579:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62097:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56395:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60949:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29293:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64284:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62971:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62745:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27396:103;;;;;;;;;;;;;:::i;:::-;;55598:70;;;;;;;;;;;;;:::i;:::-;;68739:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26745:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40373:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66910:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41798:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63720:556;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67890:841;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53948:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69341:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64469:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42133:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65050:847;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27654:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60915:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39265:355;39412:4;39469:25;39454:40;;;:11;:40;;;;:105;;;;39526:33;39511:48;;;:11;:48;;;;39454:105;:158;;;;39576:36;39600:11;39576:23;:36::i;:::-;39454:158;39434:178;;39265:355;;;:::o;65905:208::-;66037:7;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;66094:11:::1;66069:10;66080;66069:22;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;66062:43;;65905:208:::0;;;;:::o;40265:100::-;40319:13;40352:5;40345:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40265:100;:::o;55282:308::-;55403:7;55450:16;55458:7;55450;:16::i;:::-;55428:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;55558:15;:24;55574:7;55558:24;;;;;;;;;;;;;;;;;;;;;55551:31;;55282:308;;;:::o;54861:413::-;54942:13;54958:16;54966:7;54958;:16::i;:::-;54942:32;;54999:5;54993:11;;:2;:11;;;;54985:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55093:5;55077:21;;:12;:10;:12::i;:::-;:21;;;55055:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;55220:2;55193:15;:24;55209:7;55193:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55258:7;55254:2;55238:28;;55247:5;55238:28;;;;;;;;;;;;54931:343;54861:413;;:::o;9600:978::-;9803:12;9828:29;9860:152;;;;;;;;9898:6;:19;9905:11;9898:19;;;;;;;;;;;;;;;;9860:152;;;;9938:11;9860:152;;;;;;9983:17;9860:152;;;9828:184;;10047:45;10054:11;10067:6;10075:4;10081;10087;10047:6;:45::i;:::-;10025:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;10189:1;10166:6;:19;10173:11;10166:19;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;10208:126;10246:11;10280:10;10306:17;10208:126;;;;;;;;:::i;:::-;;;;;;;;10348:12;10362:23;10397:4;10389:18;;10439:17;10458:11;10422:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10389:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10347:134;;;;10500:7;10492:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;10560:10;10553:17;;;;;9600:978;;;;;;;:::o;7742:43::-;;;;;;;;;;;;;;;;;;;:::o;61032:23::-;;;;;;;;;;;;;:::o;56519:105::-;56563:7;56615:1;56590:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;56583:33;;56519:105;:::o;67772:110::-;67830:4;67854:15;:20;67870:3;67854:20;;;;;;;;;;;;;;;;;;;;;67847:27;;67772:110;;;:::o;8545:101::-;8596:7;8623:15;;8616:22;;8545:101;:::o;63342:181::-;63476:39;63493:4;63499:2;63503:7;63476:39;;;;;;;;;;;;:16;:39::i;:::-;63342:181;;;:::o;62466:105::-;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;62559:4:::1;62545:11;:18;;;;;;;;;;;;:::i;:::-;;62466:105:::0;:::o;60994:29::-;;;;;;;;;;;;;:::o;66121:325::-;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;66303:11:::1;66278:10;66289;66278:22;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;;66357:14;66325:17;66343:10;66325:29;;;;;;:::i;:::-;;;;;;;;;;;;;:46;;;;66382:56;66388:10;66400:14;66422;:12;:14::i;:::-;66382:5;:56::i;:::-;66121:325:::0;;;:::o;11004:107::-;11057:13;11091:6;:12;11098:4;11091:12;;;;;;;;;;;;;;;;11083:20;;11004:107;;;:::o;8654:161::-;8697:7;8717:10;8768:9;8762:15;;8805:2;8798:9;;;8654:161;:::o;67580:184::-;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;67708:3:::1;67451:18;67466:2;67451:14;:18::i;:::-;67450:19;67428:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;67729:27:::2;67746:3;67751:4;67729:16;:27::i;:::-;54555:1:::1;67580:184:::0;;:::o;62342:116::-;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;62440:10:::1;62423:14;;:27;;;;;;;;;;;;;;;;;;62342:116:::0;:::o;55676:74::-;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;55732:10:::1;:8;:10::i;:::-;55676:74::o:0;64639:403::-;52555:1;53153:7;;:19;;53145:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52555:1;53286:7;:18;;;;64866:9:::1;64820:42;64847:14;64820:10;64831;64820:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;:42;;;;:::i;:::-;:55;64798:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;64940:40;64946:10;64958:14;64974:5;64940;:40::i;:::-;64999:14;;;;;;;;;;;64991:32;;:43;65024:9;64991:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52511:1:::0;53465:7;:22;;;;64639:403;;;:::o;63531:181::-;63667:37;63684:5;63691:3;63696;63667:37;;;;;;;;;;;;:16;:37::i;:::-;63531:181;;;:::o;62579:158::-;62675:7;62707:10;62718;62707:22;;;;;;:::i;:::-;;;;;;;;;;;;;;62700:29;;62579:158;;;:::o;62097:237::-;62244:12;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;62276:50:::1;62306:6;62314:4;62320:5;62276:29;:50::i;:::-;62269:57;;62097:237:::0;;;;;:::o;56395:116::-;56449:4;56501:1;56473:30;;:7;:16;56481:7;56473:16;;;;;;;;;;;;;;;;;;;;;:30;;;;56466:37;;56395:116;;;:::o;60949:36::-;;;;:::o;29293:86::-;29340:4;29364:7;;;;;;;;;;;29357:14;;29293:86;:::o;64284:177::-;64392:7;64424:10;64435;64424:22;;;;;;:::i;:::-;;;;;;;;;;;;;64447:5;64424:29;;;;;;;;:::i;:::-;;;;;;;;;;64417:36;;64284:177;;;;:::o;62971:121::-;63035:7;63062:22;63076:7;63062:13;:22::i;:::-;63055:29;;62971:121;;;:::o;62745:218::-;62810:7;62850:23;62866:6;62850:15;:23::i;:::-;:105;;62932:23;62948:6;62932:15;:23::i;:::-;62850:105;;;62893:19;:17;:19::i;:::-;62850:105;62830:125;;62745:218;;;:::o;27396:103::-;26976:12;:10;:12::i;:::-;26965:23;;:7;:5;:7::i;:::-;:23;;;26957:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27461:30:::1;27488:1;27461:18;:30::i;:::-;27396:103::o:0;55598:70::-;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;55652:8:::1;:6;:8::i;:::-;55598:70::o:0;68739:169::-;54442:29;54458:12;:10;:12::i;:::-;54442:15;:29::i;:::-;54420:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;68858:3:::1;67451:18;67466:2;67451:14;:18::i;:::-;67450:19;67428:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;68896:4:::2;68879:9;:14;68889:3;68879:14;;;;;;;;;;;:21;;;;;;;;;;;;:::i;:::-;;54555:1:::1;68739:169:::0;;:::o;26745:87::-;26791:7;26818:6;;;;;;;;;;;26811:13;;26745:87;:::o;40373:104::-;40429:13;40462:7;40455:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40373:104;:::o;66910:139::-;66998:5;67005:3;63191:28;63208:5;63215:3;63191:16;:28::i;:::-;63169:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;67026:15:::1;67037:3;67026:10;:15::i;:::-;66910:139:::0;;;;:::o;41798:327::-;41945:12;:10;:12::i;:::-;41933:24;;:8;:24;;;;41925:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;42045:8;42000:18;:32;42019:12;:10;:12::i;:::-;42000:32;;;;;;;;;;;;;;;:42;42033:8;42000:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;42098:8;42069:48;;42084:12;:10;:12::i;:::-;42069:48;;;42108:8;42069:48;;;;;;:::i;:::-;;;;;;;;41798:327;;:::o;63720:556::-;63907:35;63924:12;:10;:12::i;:::-;63938:3;63907:16;:35::i;:::-;63885:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;64052:29;64068:12;:10;:12::i;:::-;64052:15;:29::i;:::-;64048:82;;;64106:12;64114:3;64106:7;:12::i;:::-;64098:20;;64048:82;64157:3;64148:12;;:5;:12;;;;64140:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64222:46;64245:5;64252:3;64257;64262:5;64222:22;:46::i;:::-;63720:556;;;;:::o;67890:841::-;67991:13;68044:16;68052:7;68044;:16::i;:::-;68022:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;68146:22;68171:9;:18;68181:7;68171:18;;;;;;;;;;;68146:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68236:1;68210:14;:12;:14::i;:::-;68204:28;:33;68200:81;;;68261:8;68254:15;;;;;68200:81;68320:1;68301:8;68295:22;:26;68291:82;;;68352:8;68338:23;;;;;68291:82;68560:14;:12;:14::i;:::-;68598:12;:21;68611:7;68598:21;;;;;;;;;;;68670:18;:7;:16;:18::i;:::-;68521:187;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68476:247;;;67890:841;;;;:::o;53948:35::-;;;;;;;;;;;;;:::o;69341:106::-;69395:13;69428:11;69421:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69341:106;:::o;64469:162::-;64563:7;64595:17;64613:9;64595:28;;;;;;:::i;:::-;;;;;;;;;;;;;;64588:35;;64469:162;;;:::o;42133:214::-;42275:4;42304:18;:25;42323:5;42304:25;;;;;;;;;;;;;;;:35;42330:8;42304:35;;;;;;;;;;;;;;;;;;;;;;;;;42297:42;;42133:214;;;;:::o;65050:847::-;52555:1;53153:7;;:19;;53145:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52555:1;53286:7;:18;;;;65258:9:::1;65212:42;65239:14;65212:10;65223;65212:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;:42;;;;:::i;:::-;:55;65190:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;65332:13;65348:23;65360:10;65348:11;:23::i;:::-;65332:39;;65399:14;65390:5;:23;;65382:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65461:13;65477:1;65461:17;;65494:9;65506:14;65494:26;;65489:282;65526:1;65522;:5;65489:282;;;65562:1;65557;:6;;65549:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;65609:15;65627:10;65638;65627:22;;;;;;:::i;:::-;;;;;;;;;;;;;65658:5;65650;:13;;;;:::i;:::-;65627:37;;;;;;;;:::i;:::-;;;;;;;;;;65609:55;;65679:58;65702:7;:5;:7::i;:::-;65711:12;:10;:12::i;:::-;65725:7;65679:58;;;;;;;;;;;::::0;:22:::1;:58::i;:::-;65752:7;;;;;:::i;:::-;;;;65534:237;65529:3;;;;;:::i;:::-;;;;65489:282;;;;65821:14;65813:5;:22;;;;:::i;:::-;65781:17;65799:10;65781:29;;;;;;:::i;:::-;;;;;;;;;;;;;:54;;;;65854:14;;;;;;;;;;;65846:32;;:43;65879:9;65846:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65179:718;;52511:1:::0;53465:7;:22;;;;65050:847;;:::o;27654:238::-;26976:12;:10;:12::i;:::-;26965:23;;:7;:5;:7::i;:::-;:23;;;26957:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27777:1:::1;27757:22;;:8;:22;;;;27735:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27856:28;27875:8;27856:18;:28::i;:::-;27654:238:::0;:::o;60915:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23482:127::-;23589:1;23571:7;:14;;;:19;;;;;;;;;;;23482:127;:::o;30517:507::-;30561:22;30622:4;30600:27;;:10;:27;;;30596:397;;;30644:18;30665:8;;30644:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30688:13;30704:8;;:15;;30688:31;;30845:42;30815:5;30808;30804:17;30798:24;30772:134;30762:144;;30743:178;;30596:397;;;30970:10;30953:28;;30596:397;30517:507;:::o;12762:326::-;12822:4;13079:1;13057:7;:19;;;:23;13050:30;;12762:326;;;:::o;23360:114::-;23425:7;23452;:14;;;23445:21;;23360:114;;;:::o;24720:207::-;24850:4;24894:25;24879:40;;;:11;:40;;;;24872:47;;24720:207;;;:::o;60401:120::-;60455:14;60489:24;:22;:24::i;:::-;60482:31;;60401:120;:::o;59537:155::-;59603:4;59638:8;59627:19;;:7;:5;:7::i;:::-;:19;;;:57;;;;59650:34;59666:7;:5;:7::i;:::-;59675:8;59650:15;:34::i;:::-;59627:57;59620:64;;59537:155;;;:::o;60529:186::-;60648:4;60705:1;60677:30;;:7;:16;60685:7;60677:16;;;;;;;;;;;;;;;;;;;;;:30;;;;60670:37;;60529:186;;;:::o;11119:486::-;11297:4;11340:1;11322:20;;:6;:20;;;;11314:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11438:159;11466:47;11485:27;11505:6;11485:19;:27::i;:::-;11466:18;:47::i;:::-;11532:4;11555;11578;11438:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11415:182;;:6;:182;;;11395:202;;11119:486;;;;;;;:::o;66454:448::-;66592:22;66631:14;66617:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66592:54;;66662:9;66657:197;66681:14;66677:1;:18;66657:197;;;66751:10;66717:12;:31;66746:1;66730:13;:11;:13::i;:::-;:17;;;;:::i;:::-;66717:31;;;;;;;;;;;:44;;;;;;;;;;;;:::i;:::-;;66803:1;66787:13;:11;:13::i;:::-;:17;;;;:::i;:::-;66776:5;66782:1;66776:8;;;;;;;;:::i;:::-;;;;;;;:28;;;;;66819:23;66826:8;;;;;;;;;;;66836:5;66819:6;:23::i;:::-;66697:3;;;;;:::i;:::-;;;;66657:197;;;;66889:5;66864:10;66875;66864:22;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;;;;;;;;;;;:::i;:::-;;66581:321;66454:448;;;:::o;68916:310::-;69038:1;69023:4;69017:18;:22;68995:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;69146:4;69123:15;:20;69139:3;69123:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;69161:18;69169:3;69174:4;69161:7;:18::i;:::-;69214:3;69195:23;69208:4;69195:23;;;;;;:::i;:::-;;;;;;;;68916:310;;:::o;30352:120::-;29896:8;:6;:8::i;:::-;29888:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;30421:5:::1;30411:7;;:15;;;;;;;;;;;;;;;;;;30442:22;30451:12;:10;:12::i;:::-;30442:22;;;;;;:::i;:::-;;;;;;;;30352:120::o:0;34791:98::-;34849:7;34880:1;34876;:5;;;;:::i;:::-;34869:12;;34791:98;;;;:::o;16208:356::-;16341:12;16386:170;16426:6;16451:4;16474:5;16386:170;;;;;;;;;;;;;;;;;:21;:170::i;:::-;16366:190;;16208:356;;;;;:::o;56061:326::-;56178:7;56203:13;56219:7;:16;56227:7;56219:16;;;;;;;;;;;;;;;;;;;;;56203:32;;56285:1;56268:19;;:5;:19;;;;56246:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;56374:5;56367:12;;;56061:326;;;:::o;55758:295::-;55875:7;55939:1;55922:19;;:5;:19;;;;55900:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56029:9;:16;56039:5;56029:16;;;;;;;;;;;;;;;;56022:23;;55758:295;;;:::o;28052:191::-;28126:16;28145:6;;;;;;;;;;;28126:25;;28171:8;28162:6;;:17;;;;;;;;;;;;;;;;;;28226:8;28195:40;;28216:8;28195:40;;;;;;;;;;;;28115:128;28052:191;:::o;30093:118::-;29619:8;:6;:8::i;:::-;29618:9;29610:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;30163:4:::1;30153:7;;:14;;;;;;;;;;;;;;;;;;30183:20;30190:12;:10;:12::i;:::-;30183:20;;;;;;:::i;:::-;;;;;;;;30093:118::o:0;67057:312::-;67161:4;67203:22;67219:5;67203:15;:22::i;:::-;:158;;67286:5;67270:21;;:12;67278:3;67270:7;:12::i;:::-;:21;;;:90;;;;67316:44;67333:12;67341:3;67333:7;:12::i;:::-;67347;:10;:12::i;:::-;67316:16;:44::i;:::-;67270:90;67203:158;;;67245:4;67203:158;67183:178;;67057:312;;;;:::o;58259:282::-;29619:8;:6;:8::i;:::-;29618:9;29610:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;58324:13:::1;58340:16;58348:7;58340;:16::i;:::-;58324:32;;58367:48;58388:5;58403:1;58407:7;58367:20;:48::i;:::-;58446:1;58426:9;:16;58436:5;58426:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;58465:7;:16;58473:7;58465:16;;;;;;;;;;;;58458:23;;;;;;;;;;;58525:7;58521:1;58497:36;;58506:5;58497:36;;;;;;;;;;;;58313:228;58259:282:::0;:::o;56632:993::-;29619:8;:6;:8::i;:::-;29618:9;29610:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56835:29:::1;56851:12;:10;:12::i;:::-;56835:15;:29::i;:::-;:74;;;;56905:4;56885:24;;:16;56893:7;56885;:16::i;:::-;:24;;;56835:74;:143;;;;56930:48;56947:16;56955:7;56947;:16::i;:::-;56965:12;:10;:12::i;:::-;56930:16;:48::i;:::-;56835:143;56813:243;;;;;;;;;;;;:::i;:::-;;;;;;;;;57089:1;57075:16;;:2;:16;;;;57067:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57155:16;57163:7;57155;:16::i;:::-;57147:24;;:4;:24;;;57143:80;;57195:16;57203:7;57195;:16::i;:::-;57188:23;;57143:80;57233:39;57254:4;57260:2;57264:7;57233:20;:39::i;:::-;57320:1;57285:15;:24;57301:7;57285:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;57352:1;57333:9;:15;57343:4;57333:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;57381:1;57364:9;:13;57374:2;57364:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;57412:2;57393:7;:16;57401:7;57393:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57447:47;57469:4;57475:2;57479:7;57488:5;57447:21;:47::i;:::-;57425:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;57609:7;57605:2;57590:27;;57599:4;57590:27;;;;;;;;;;;;56632:993:::0;;;;:::o;20781:723::-;20837:13;21067:1;21058:5;:10;21054:53;;;21085:10;;;;;;;;;;;;;;;;;;;;;21054:53;21117:12;21132:5;21117:20;;21148:14;21173:78;21188:1;21180:4;:9;21173:78;;21206:8;;;;;:::i;:::-;;;;21237:2;21229:10;;;;;:::i;:::-;;;21173:78;;;21261:19;21293:6;21283:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21261:39;;21311:154;21327:1;21318:5;:10;21311:154;;21355:1;21345:11;;;;;:::i;:::-;;;21422:2;21414:5;:10;;;;:::i;:::-;21401:2;:24;;;;:::i;:::-;21388:39;;21371:6;21378;21371:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21451:2;21442:11;;;;;:::i;:::-;;;21311:154;;;21489:6;21475:21;;;;;20781:723;;;;:::o;59700:331::-;59808:4;59835:33;:20;;;;;;;;;;;:31;;;:33::i;:::-;59830:79;;59892:5;59885:12;;;;59830:79;60015:8;59939:84;;59961:20;;;;;;;;;;;59947:43;;;59991:5;59947:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59939:84;;;59919:104;;59700:331;;;;;:::o;10586:410::-;10696:7;9163:108;;;;;;;;;;;;;;;;;9139:143;;;;;;10850:6;:12;;;10885:6;:11;;;10929:6;:24;;;10919:35;;;;;;10769:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10741:247;;;;;;10721:267;;10586:410;;;:::o;8823:195::-;8922:7;8975:20;:18;:20::i;:::-;8997:11;8964:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8954:56;;;;;;8947:63;;8823:195;;;:::o;57633:618::-;29619:8;:6;:8::i;:::-;29618:9;29610:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57716:22:::1;57741;:12;:20;:22::i;:::-;57716:47;;57774:24;:12;:22;:24::i;:::-;57820:23;57828:14;57820:7;:23::i;:::-;57819:24;57811:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57889:53;57918:1;57922:3;57927:14;57889:20;:53::i;:::-;57973:1;57955:9;:14;57965:3;57955:14;;;;;;;;;;;;;;;;:19;;;;;;;:::i;:::-;;;;;;;;58011:3;57985:7;:23;57993:14;57985:23;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58047:61;58077:1;58081:3;58086:14;58102:5;58047:21;:61::i;:::-;58025:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;58228:14;58223:3;58202:41;;58219:1;58202:41;;;;;;;;;;;;57705:546;57633:618:::0;;:::o;69234:99::-;69321:4;69304:9;:14;69314:3;69304:14;;;;;;;;;;;:21;;;;;;;;;;;;:::i;:::-;;69234:99;;:::o;16820:571::-;16990:12;17062:5;17037:21;:30;;17015:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;17152:18;17163:6;17152:10;:18::i;:::-;17144:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;17218:12;17232:23;17259:6;:11;;17278:5;17299:4;17259:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17217:97;;;;17332:51;17349:7;17358:10;17370:12;17332:16;:51::i;:::-;17325:58;;;;16820:571;;;;;;:::o;50744:126::-;;;;:::o;58549:980::-;58704:4;58725:15;:2;:13;;;:15::i;:::-;58721:801;;;58794:2;58778:36;;;58837:12;:10;:12::i;:::-;58872:4;58899:7;58929:5;58778:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58757:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59153:1;59136:6;:13;:18;59132:320;;;59179:108;;;;;;;;;;:::i;:::-;;;;;;;;59132:320;59402:6;59396:13;59387:6;59383:2;59379:15;59372:38;58757:710;59027:41;;;59017:51;;;:6;:51;;;;59010:58;;;;;58721:801;59506:4;59499:11;;58549:980;;;;;;;:::o;19780:712::-;19930:12;19959:7;19955:530;;;19990:10;19983:17;;;;19955:530;20124:1;20104:10;:17;:21;20100:374;;;20302:10;20296:17;20363:15;20350:10;20346:2;20342:19;20335:44;20100:374;20445:12;20438:20;;;;;;;;;;;:::i;:::-;;;;;;;;19780:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:77::-;3769:7;3798:5;3787:16;;3732:77;;;:::o;3815:122::-;3888:24;3906:5;3888:24;:::i;:::-;3881:5;3878:35;3868:63;;3927:1;3924;3917:12;3868:63;3815:122;:::o;3943:139::-;3989:5;4027:6;4014:20;4005:29;;4043:33;4070:5;4043:33;:::i;:::-;3943:139;;;;:::o;4088:654::-;4166:6;4174;4223:2;4211:9;4202:7;4198:23;4194:32;4191:119;;;4229:79;;:::i;:::-;4191:119;4377:1;4366:9;4362:17;4349:31;4407:18;4399:6;4396:30;4393:117;;;4429:79;;:::i;:::-;4393:117;4534:63;4589:7;4580:6;4569:9;4565:22;4534:63;:::i;:::-;4524:73;;4320:287;4646:2;4672:53;4717:7;4708:6;4697:9;4693:22;4672:53;:::i;:::-;4662:63;;4617:118;4088:654;;;;;:::o;4748:118::-;4835:24;4853:5;4835:24;:::i;:::-;4830:3;4823:37;4748:118;;:::o;4872:222::-;4965:4;5003:2;4992:9;4988:18;4980:26;;5016:71;5084:1;5073:9;5069:17;5060:6;5016:71;:::i;:::-;4872:222;;;;:::o;5100:99::-;5152:6;5186:5;5180:12;5170:22;;5100:99;;;:::o;5205:169::-;5289:11;5323:6;5318:3;5311:19;5363:4;5358:3;5354:14;5339:29;;5205:169;;;;:::o;5380:307::-;5448:1;5458:113;5472:6;5469:1;5466:13;5458:113;;;5557:1;5552:3;5548:11;5542:18;5538:1;5533:3;5529:11;5522:39;5494:2;5491:1;5487:10;5482:15;;5458:113;;;5589:6;5586:1;5583:13;5580:101;;;5669:1;5660:6;5655:3;5651:16;5644:27;5580:101;5429:258;5380:307;;;:::o;5693:364::-;5781:3;5809:39;5842:5;5809:39;:::i;:::-;5864:71;5928:6;5923:3;5864:71;:::i;:::-;5857:78;;5944:52;5989:6;5984:3;5977:4;5970:5;5966:16;5944:52;:::i;:::-;6021:29;6043:6;6021:29;:::i;:::-;6016:3;6012:39;6005:46;;5785:272;5693:364;;;;:::o;6063:313::-;6176:4;6214:2;6203:9;6199:18;6191:26;;6263:9;6257:4;6253:20;6249:1;6238:9;6234:17;6227:47;6291:78;6364:4;6355:6;6291:78;:::i;:::-;6283:86;;6063:313;;;;:::o;6382:329::-;6441:6;6490:2;6478:9;6469:7;6465:23;6461:32;6458:119;;;6496:79;;:::i;:::-;6458:119;6616:1;6641:53;6686:7;6677:6;6666:9;6662:22;6641:53;:::i;:::-;6631:63;;6587:117;6382:329;;;;:::o;6717:126::-;6754:7;6794:42;6787:5;6783:54;6772:65;;6717:126;;;:::o;6849:96::-;6886:7;6915:24;6933:5;6915:24;:::i;:::-;6904:35;;6849:96;;;:::o;6951:118::-;7038:24;7056:5;7038:24;:::i;:::-;7033:3;7026:37;6951:118;;:::o;7075:222::-;7168:4;7206:2;7195:9;7191:18;7183:26;;7219:71;7287:1;7276:9;7272:17;7263:6;7219:71;:::i;:::-;7075:222;;;;:::o;7303:122::-;7376:24;7394:5;7376:24;:::i;:::-;7369:5;7366:35;7356:63;;7415:1;7412;7405:12;7356:63;7303:122;:::o;7431:139::-;7477:5;7515:6;7502:20;7493:29;;7531:33;7558:5;7531:33;:::i;:::-;7431:139;;;;:::o;7576:474::-;7644:6;7652;7701:2;7689:9;7680:7;7676:23;7672:32;7669:119;;;7707:79;;:::i;:::-;7669:119;7827:1;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7798:117;7954:2;7980:53;8025:7;8016:6;8005:9;8001:22;7980:53;:::i;:::-;7970:63;;7925:118;7576:474;;;;;:::o;8056:307::-;8117:4;8207:18;8199:6;8196:30;8193:56;;;8229:18;;:::i;:::-;8193:56;8267:29;8289:6;8267:29;:::i;:::-;8259:37;;8351:4;8345;8341:15;8333:23;;8056:307;;;:::o;8369:410::-;8446:5;8471:65;8487:48;8528:6;8487:48;:::i;:::-;8471:65;:::i;:::-;8462:74;;8559:6;8552:5;8545:21;8597:4;8590:5;8586:16;8635:3;8626:6;8621:3;8617:16;8614:25;8611:112;;;8642:79;;:::i;:::-;8611:112;8732:41;8766:6;8761:3;8756;8732:41;:::i;:::-;8452:327;8369:410;;;;;:::o;8798:338::-;8853:5;8902:3;8895:4;8887:6;8883:17;8879:27;8869:122;;8910:79;;:::i;:::-;8869:122;9027:6;9014:20;9052:78;9126:3;9118:6;9111:4;9103:6;9099:17;9052:78;:::i;:::-;9043:87;;8859:277;8798:338;;;;:::o;9142:77::-;9179:7;9208:5;9197:16;;9142:77;;;:::o;9225:122::-;9298:24;9316:5;9298:24;:::i;:::-;9291:5;9288:35;9278:63;;9337:1;9334;9327:12;9278:63;9225:122;:::o;9353:139::-;9399:5;9437:6;9424:20;9415:29;;9453:33;9480:5;9453:33;:::i;:::-;9353:139;;;;:::o;9498:86::-;9533:7;9573:4;9566:5;9562:16;9551:27;;9498:86;;;:::o;9590:118::-;9661:22;9677:5;9661:22;:::i;:::-;9654:5;9651:33;9641:61;;9698:1;9695;9688:12;9641:61;9590:118;:::o;9714:135::-;9758:5;9796:6;9783:20;9774:29;;9812:31;9837:5;9812:31;:::i;:::-;9714:135;;;;:::o;9855:1085::-;9957:6;9965;9973;9981;9989;10038:3;10026:9;10017:7;10013:23;10009:33;10006:120;;;10045:79;;:::i;:::-;10006:120;10165:1;10190:53;10235:7;10226:6;10215:9;10211:22;10190:53;:::i;:::-;10180:63;;10136:117;10320:2;10309:9;10305:18;10292:32;10351:18;10343:6;10340:30;10337:117;;;10373:79;;:::i;:::-;10337:117;10478:62;10532:7;10523:6;10512:9;10508:22;10478:62;:::i;:::-;10468:72;;10263:287;10589:2;10615:53;10660:7;10651:6;10640:9;10636:22;10615:53;:::i;:::-;10605:63;;10560:118;10717:2;10743:53;10788:7;10779:6;10768:9;10764:22;10743:53;:::i;:::-;10733:63;;10688:118;10845:3;10872:51;10915:7;10906:6;10895:9;10891:22;10872:51;:::i;:::-;10862:61;;10816:117;9855:1085;;;;;;;;:::o;10946:98::-;10997:6;11031:5;11025:12;11015:22;;10946:98;;;:::o;11050:168::-;11133:11;11167:6;11162:3;11155:19;11207:4;11202:3;11198:14;11183:29;;11050:168;;;;:::o;11224:360::-;11310:3;11338:38;11370:5;11338:38;:::i;:::-;11392:70;11455:6;11450:3;11392:70;:::i;:::-;11385:77;;11471:52;11516:6;11511:3;11504:4;11497:5;11493:16;11471:52;:::i;:::-;11548:29;11570:6;11548:29;:::i;:::-;11543:3;11539:39;11532:46;;11314:270;11224:360;;;;:::o;11590:309::-;11701:4;11739:2;11728:9;11724:18;11716:26;;11788:9;11782:4;11778:20;11774:1;11763:9;11759:17;11752:47;11816:76;11887:4;11878:6;11816:76;:::i;:::-;11808:84;;11590:309;;;;:::o;11905:118::-;11992:24;12010:5;11992:24;:::i;:::-;11987:3;11980:37;11905:118;;:::o;12029:222::-;12122:4;12160:2;12149:9;12145:18;12137:26;;12173:71;12241:1;12230:9;12226:17;12217:6;12173:71;:::i;:::-;12029:222;;;;:::o;12257:619::-;12334:6;12342;12350;12399:2;12387:9;12378:7;12374:23;12370:32;12367:119;;;12405:79;;:::i;:::-;12367:119;12525:1;12550:53;12595:7;12586:6;12575:9;12571:22;12550:53;:::i;:::-;12540:63;;12496:117;12652:2;12678:53;12723:7;12714:6;12703:9;12699:22;12678:53;:::i;:::-;12668:63;;12623:118;12780:2;12806:53;12851:7;12842:6;12831:9;12827:22;12806:53;:::i;:::-;12796:63;;12751:118;12257:619;;;;;:::o;12882:509::-;12951:6;13000:2;12988:9;12979:7;12975:23;12971:32;12968:119;;;13006:79;;:::i;:::-;12968:119;13154:1;13143:9;13139:17;13126:31;13184:18;13176:6;13173:30;13170:117;;;13206:79;;:::i;:::-;13170:117;13311:63;13366:7;13357:6;13346:9;13342:22;13311:63;:::i;:::-;13301:73;;13097:287;12882:509;;;;:::o;13397:799::-;13484:6;13492;13500;13549:2;13537:9;13528:7;13524:23;13520:32;13517:119;;;13555:79;;:::i;:::-;13517:119;13703:1;13692:9;13688:17;13675:31;13733:18;13725:6;13722:30;13719:117;;;13755:79;;:::i;:::-;13719:117;13860:63;13915:7;13906:6;13895:9;13891:22;13860:63;:::i;:::-;13850:73;;13646:287;13972:2;13998:53;14043:7;14034:6;14023:9;14019:22;13998:53;:::i;:::-;13988:63;;13943:118;14100:2;14126:53;14171:7;14162:6;14151:9;14147:22;14126:53;:::i;:::-;14116:63;;14071:118;13397:799;;;;;:::o;14202:329::-;14261:6;14310:2;14298:9;14289:7;14285:23;14281:32;14278:119;;;14316:79;;:::i;:::-;14278:119;14436:1;14461:53;14506:7;14497:6;14486:9;14482:22;14461:53;:::i;:::-;14451:63;;14407:117;14202:329;;;;:::o;14537:654::-;14615:6;14623;14672:2;14660:9;14651:7;14647:23;14643:32;14640:119;;;14678:79;;:::i;:::-;14640:119;14798:1;14823:53;14868:7;14859:6;14848:9;14844:22;14823:53;:::i;:::-;14813:63;;14769:117;14953:2;14942:9;14938:18;14925:32;14984:18;14976:6;14973:30;14970:117;;;15006:79;;:::i;:::-;14970:117;15111:63;15166:7;15157:6;15146:9;15142:22;15111:63;:::i;:::-;15101:73;;14896:288;14537:654;;;;;:::o;15197:977::-;15293:6;15301;15309;15358:2;15346:9;15337:7;15333:23;15329:32;15326:119;;;15364:79;;:::i;:::-;15326:119;15512:1;15501:9;15497:17;15484:31;15542:18;15534:6;15531:30;15528:117;;;15564:79;;:::i;:::-;15528:117;15669:63;15724:7;15715:6;15704:9;15700:22;15669:63;:::i;:::-;15659:73;;15455:287;15781:2;15807:53;15852:7;15843:6;15832:9;15828:22;15807:53;:::i;:::-;15797:63;;15752:118;15937:2;15926:9;15922:18;15909:32;15968:18;15960:6;15957:30;15954:117;;;15990:79;;:::i;:::-;15954:117;16095:62;16149:7;16140:6;16129:9;16125:22;16095:62;:::i;:::-;16085:72;;15880:287;15197:977;;;;;:::o;16180:797::-;16266:6;16274;16282;16331:2;16319:9;16310:7;16306:23;16302:32;16299:119;;;16337:79;;:::i;:::-;16299:119;16457:1;16482:53;16527:7;16518:6;16507:9;16503:22;16482:53;:::i;:::-;16472:63;;16428:117;16612:2;16601:9;16597:18;16584:32;16643:18;16635:6;16632:30;16629:117;;;16665:79;;:::i;:::-;16629:117;16770:62;16824:7;16815:6;16804:9;16800:22;16770:62;:::i;:::-;16760:72;;16555:287;16881:2;16907:53;16952:7;16943:6;16932:9;16928:22;16907:53;:::i;:::-;16897:63;;16852:118;16180:797;;;;;:::o;16983:116::-;17053:21;17068:5;17053:21;:::i;:::-;17046:5;17043:32;17033:60;;17089:1;17086;17079:12;17033:60;16983:116;:::o;17105:133::-;17148:5;17186:6;17173:20;17164:29;;17202:30;17226:5;17202:30;:::i;:::-;17105:133;;;;:::o;17244:468::-;17309:6;17317;17366:2;17354:9;17345:7;17341:23;17337:32;17334:119;;;17372:79;;:::i;:::-;17334:119;17492:1;17517:53;17562:7;17553:6;17542:9;17538:22;17517:53;:::i;:::-;17507:63;;17463:117;17619:2;17645:50;17687:7;17678:6;17667:9;17663:22;17645:50;:::i;:::-;17635:60;;17590:115;17244:468;;;;;:::o;17718:943::-;17813:6;17821;17829;17837;17886:3;17874:9;17865:7;17861:23;17857:33;17854:120;;;17893:79;;:::i;:::-;17854:120;18013:1;18038:53;18083:7;18074:6;18063:9;18059:22;18038:53;:::i;:::-;18028:63;;17984:117;18140:2;18166:53;18211:7;18202:6;18191:9;18187:22;18166:53;:::i;:::-;18156:63;;18111:118;18268:2;18294:53;18339:7;18330:6;18319:9;18315:22;18294:53;:::i;:::-;18284:63;;18239:118;18424:2;18413:9;18409:18;18396:32;18455:18;18447:6;18444:30;18441:117;;;18477:79;;:::i;:::-;18441:117;18582:62;18636:7;18627:6;18616:9;18612:22;18582:62;:::i;:::-;18572:72;;18367:287;17718:943;;;;;;;:::o;18667:474::-;18735:6;18743;18792:2;18780:9;18771:7;18767:23;18763:32;18760:119;;;18798:79;;:::i;:::-;18760:119;18918:1;18943:53;18988:7;18979:6;18968:9;18964:22;18943:53;:::i;:::-;18933:63;;18889:117;19045:2;19071:53;19116:7;19107:6;19096:9;19092:22;19071:53;:::i;:::-;19061:63;;19016:118;18667:474;;;;;:::o;19147:232::-;19287:34;19283:1;19275:6;19271:14;19264:58;19356:15;19351:2;19343:6;19339:15;19332:40;19147:232;:::o;19385:366::-;19527:3;19548:67;19612:2;19607:3;19548:67;:::i;:::-;19541:74;;19624:93;19713:3;19624:93;:::i;:::-;19742:2;19737:3;19733:12;19726:19;;19385:366;;;:::o;19757:419::-;19923:4;19961:2;19950:9;19946:18;19938:26;;20010:9;20004:4;20000:20;19996:1;19985:9;19981:17;19974:47;20038:131;20164:4;20038:131;:::i;:::-;20030:139;;19757:419;;;:::o;20182:148::-;20284:11;20321:3;20306:18;;20182:148;;;;:::o;20336:377::-;20442:3;20470:39;20503:5;20470:39;:::i;:::-;20525:89;20607:6;20602:3;20525:89;:::i;:::-;20518:96;;20623:52;20668:6;20663:3;20656:4;20649:5;20645:16;20623:52;:::i;:::-;20700:6;20695:3;20691:16;20684:23;;20446:267;20336:377;;;;:::o;20719:275::-;20851:3;20873:95;20964:3;20955:6;20873:95;:::i;:::-;20866:102;;20985:3;20978:10;;20719:275;;;;:::o;21000:180::-;21048:77;21045:1;21038:88;21145:4;21142:1;21135:15;21169:4;21166:1;21159:15;21186:320;21230:6;21267:1;21261:4;21257:12;21247:22;;21314:1;21308:4;21304:12;21335:18;21325:81;;21391:4;21383:6;21379:17;21369:27;;21325:81;21453:2;21445:6;21442:14;21422:18;21419:38;21416:84;;;21472:18;;:::i;:::-;21416:84;21237:269;21186:320;;;:::o;21512:231::-;21652:34;21648:1;21640:6;21636:14;21629:58;21721:14;21716:2;21708:6;21704:15;21697:39;21512:231;:::o;21749:366::-;21891:3;21912:67;21976:2;21971:3;21912:67;:::i;:::-;21905:74;;21988:93;22077:3;21988:93;:::i;:::-;22106:2;22101:3;22097:12;22090:19;;21749:366;;;:::o;22121:419::-;22287:4;22325:2;22314:9;22310:18;22302:26;;22374:9;22368:4;22364:20;22360:1;22349:9;22345:17;22338:47;22402:131;22528:4;22402:131;:::i;:::-;22394:139;;22121:419;;;:::o;22546:220::-;22686:34;22682:1;22674:6;22670:14;22663:58;22755:3;22750:2;22742:6;22738:15;22731:28;22546:220;:::o;22772:366::-;22914:3;22935:67;22999:2;22994:3;22935:67;:::i;:::-;22928:74;;23011:93;23100:3;23011:93;:::i;:::-;23129:2;23124:3;23120:12;23113:19;;22772:366;;;:::o;23144:419::-;23310:4;23348:2;23337:9;23333:18;23325:26;;23397:9;23391:4;23387:20;23383:1;23372:9;23368:17;23361:47;23425:131;23551:4;23425:131;:::i;:::-;23417:139;;23144:419;;;:::o;23569:243::-;23709:34;23705:1;23697:6;23693:14;23686:58;23778:26;23773:2;23765:6;23761:15;23754:51;23569:243;:::o;23818:366::-;23960:3;23981:67;24045:2;24040:3;23981:67;:::i;:::-;23974:74;;24057:93;24146:3;24057:93;:::i;:::-;24175:2;24170:3;24166:12;24159:19;;23818:366;;;:::o;24190:419::-;24356:4;24394:2;24383:9;24379:18;24371:26;;24443:9;24437:4;24433:20;24429:1;24418:9;24414:17;24407:47;24471:131;24597:4;24471:131;:::i;:::-;24463:139;;24190:419;;;:::o;24615:220::-;24755:34;24751:1;24743:6;24739:14;24732:58;24824:3;24819:2;24811:6;24807:15;24800:28;24615:220;:::o;24841:366::-;24983:3;25004:67;25068:2;25063:3;25004:67;:::i;:::-;24997:74;;25080:93;25169:3;25080:93;:::i;:::-;25198:2;25193:3;25189:12;25182:19;;24841:366;;;:::o;25213:419::-;25379:4;25417:2;25406:9;25402:18;25394:26;;25466:9;25460:4;25456:20;25452:1;25441:9;25437:17;25430:47;25494:131;25620:4;25494:131;:::i;:::-;25486:139;;25213:419;;;:::o;25638:180::-;25686:77;25683:1;25676:88;25783:4;25780:1;25773:15;25807:4;25804:1;25797:15;25824:305;25864:3;25883:20;25901:1;25883:20;:::i;:::-;25878:25;;25917:20;25935:1;25917:20;:::i;:::-;25912:25;;26071:1;26003:66;25999:74;25996:1;25993:81;25990:107;;;26077:18;;:::i;:::-;25990:107;26121:1;26118;26114:9;26107:16;;25824:305;;;;:::o;26135:104::-;26180:7;26209:24;26227:5;26209:24;:::i;:::-;26198:35;;26135:104;;;:::o;26245:142::-;26348:32;26374:5;26348:32;:::i;:::-;26343:3;26336:45;26245:142;;:::o;26393:561::-;26576:4;26614:2;26603:9;26599:18;26591:26;;26627:71;26695:1;26684:9;26680:17;26671:6;26627:71;:::i;:::-;26708:88;26792:2;26781:9;26777:18;26768:6;26708:88;:::i;:::-;26843:9;26837:4;26833:20;26828:2;26817:9;26813:18;26806:48;26871:76;26942:4;26933:6;26871:76;:::i;:::-;26863:84;;26393:561;;;;;;:::o;26960:147::-;27061:11;27098:3;27083:18;;26960:147;;;;:::o;27113:373::-;27217:3;27245:38;27277:5;27245:38;:::i;:::-;27299:88;27380:6;27375:3;27299:88;:::i;:::-;27292:95;;27396:52;27441:6;27436:3;27429:4;27422:5;27418:16;27396:52;:::i;:::-;27473:6;27468:3;27464:16;27457:23;;27221:265;27113:373;;;;:::o;27492:94::-;27525:8;27573:5;27569:2;27565:14;27544:35;;27492:94;;;:::o;27592:::-;27631:7;27660:20;27674:5;27660:20;:::i;:::-;27649:31;;27592:94;;;:::o;27692:100::-;27731:7;27760:26;27780:5;27760:26;:::i;:::-;27749:37;;27692:100;;;:::o;27798:157::-;27903:45;27923:24;27941:5;27923:24;:::i;:::-;27903:45;:::i;:::-;27898:3;27891:58;27798:157;;:::o;27961:412::-;28119:3;28141:93;28230:3;28221:6;28141:93;:::i;:::-;28134:100;;28244:75;28315:3;28306:6;28244:75;:::i;:::-;28344:2;28339:3;28335:12;28328:19;;28364:3;28357:10;;27961:412;;;;;:::o;28379:271::-;28509:3;28531:93;28620:3;28611:6;28531:93;:::i;:::-;28524:100;;28641:3;28634:10;;28379:271;;;;:::o;28656:178::-;28796:30;28792:1;28784:6;28780:14;28773:54;28656:178;:::o;28840:366::-;28982:3;29003:67;29067:2;29062:3;29003:67;:::i;:::-;28996:74;;29079:93;29168:3;29079:93;:::i;:::-;29197:2;29192:3;29188:12;29181:19;;28840:366;;;:::o;29212:419::-;29378:4;29416:2;29405:9;29401:18;29393:26;;29465:9;29459:4;29455:20;29451:1;29440:9;29436:17;29429:47;29493:131;29619:4;29493:131;:::i;:::-;29485:139;;29212:419;;;:::o;29637:191::-;29677:4;29697:20;29715:1;29697:20;:::i;:::-;29692:25;;29731:20;29749:1;29731:20;:::i;:::-;29726:25;;29770:1;29767;29764:8;29761:34;;;29775:18;;:::i;:::-;29761:34;29820:1;29817;29813:9;29805:17;;29637:191;;;;:::o;29834:242::-;29974:34;29970:1;29962:6;29958:14;29951:58;30043:25;30038:2;30030:6;30026:15;30019:50;29834:242;:::o;30082:366::-;30224:3;30245:67;30309:2;30304:3;30245:67;:::i;:::-;30238:74;;30321:93;30410:3;30321:93;:::i;:::-;30439:2;30434:3;30430:12;30423:19;;30082:366;;;:::o;30454:419::-;30620:4;30658:2;30647:9;30643:18;30635:26;;30707:9;30701:4;30697:20;30693:1;30682:9;30678:17;30671:47;30735:131;30861:4;30735:131;:::i;:::-;30727:139;;30454:419;;;:::o;30879:181::-;31019:33;31015:1;31007:6;31003:14;30996:57;30879:181;:::o;31066:366::-;31208:3;31229:67;31293:2;31288:3;31229:67;:::i;:::-;31222:74;;31305:93;31394:3;31305:93;:::i;:::-;31423:2;31418:3;31414:12;31407:19;;31066:366;;;:::o;31438:419::-;31604:4;31642:2;31631:9;31627:18;31619:26;;31691:9;31685:4;31681:20;31677:1;31666:9;31662:17;31655:47;31719:131;31845:4;31719:131;:::i;:::-;31711:139;;31438:419;;;:::o;31863:176::-;32003:28;31999:1;31991:6;31987:14;31980:52;31863:176;:::o;32045:366::-;32187:3;32208:67;32272:2;32267:3;32208:67;:::i;:::-;32201:74;;32284:93;32373:3;32284:93;:::i;:::-;32402:2;32397:3;32393:12;32386:19;;32045:366;;;:::o;32417:419::-;32583:4;32621:2;32610:9;32606:18;32598:26;;32670:9;32664:4;32660:20;32656:1;32645:9;32641:17;32634:47;32698:131;32824:4;32698:131;:::i;:::-;32690:139;;32417:419;;;:::o;32842:180::-;32890:77;32887:1;32880:88;32987:4;32984:1;32977:15;33011:4;33008:1;33001:15;33028:182;33168:34;33164:1;33156:6;33152:14;33145:58;33028:182;:::o;33216:366::-;33358:3;33379:67;33443:2;33438:3;33379:67;:::i;:::-;33372:74;;33455:93;33544:3;33455:93;:::i;:::-;33573:2;33568:3;33564:12;33557:19;;33216:366;;;:::o;33588:419::-;33754:4;33792:2;33781:9;33777:18;33769:26;;33841:9;33835:4;33831:20;33827:1;33816:9;33812:17;33805:47;33869:131;33995:4;33869:131;:::i;:::-;33861:139;;33588:419;;;:::o;34013:291::-;34153:34;34149:1;34141:6;34137:14;34130:58;34222:34;34217:2;34209:6;34205:15;34198:59;34291:5;34286:2;34278:6;34274:15;34267:30;34013:291;:::o;34310:366::-;34452:3;34473:67;34537:2;34532:3;34473:67;:::i;:::-;34466:74;;34549:93;34638:3;34549:93;:::i;:::-;34667:2;34662:3;34658:12;34651:19;;34310:366;;;:::o;34682:419::-;34848:4;34886:2;34875:9;34871:18;34863:26;;34935:9;34929:4;34925:20;34921:1;34910:9;34906:17;34899:47;34963:131;35089:4;34963:131;:::i;:::-;34955:139;;34682:419;;;:::o;35107:175::-;35247:27;35243:1;35235:6;35231:14;35224:51;35107:175;:::o;35288:366::-;35430:3;35451:67;35515:2;35510:3;35451:67;:::i;:::-;35444:74;;35527:93;35616:3;35527:93;:::i;:::-;35645:2;35640:3;35636:12;35629:19;;35288:366;;;:::o;35660:419::-;35826:4;35864:2;35853:9;35849:18;35841:26;;35913:9;35907:4;35903:20;35899:1;35888:9;35884:17;35877:47;35941:131;36067:4;35941:131;:::i;:::-;35933:139;;35660:419;;;:::o;36085:233::-;36225:34;36221:1;36213:6;36209:14;36202:58;36294:16;36289:2;36281:6;36277:15;36270:41;36085:233;:::o;36324:366::-;36466:3;36487:67;36551:2;36546:3;36487:67;:::i;:::-;36480:74;;36563:93;36652:3;36563:93;:::i;:::-;36681:2;36676:3;36672:12;36665:19;;36324:366;;;:::o;36696:419::-;36862:4;36900:2;36889:9;36885:18;36877:26;;36949:9;36943:4;36939:20;36935:1;36924:9;36920:17;36913:47;36977:131;37103:4;36977:131;:::i;:::-;36969:139;;36696:419;;;:::o;37121:234::-;37261:34;37257:1;37249:6;37245:14;37238:58;37330:17;37325:2;37317:6;37313:15;37306:42;37121:234;:::o;37361:366::-;37503:3;37524:67;37588:2;37583:3;37524:67;:::i;:::-;37517:74;;37600:93;37689:3;37600:93;:::i;:::-;37718:2;37713:3;37709:12;37702:19;;37361:366;;;:::o;37733:419::-;37899:4;37937:2;37926:9;37922:18;37914:26;;37986:9;37980:4;37976:20;37972:1;37961:9;37957:17;37950:47;38014:131;38140:4;38014:131;:::i;:::-;38006:139;;37733:419;;;:::o;38158:141::-;38207:4;38230:3;38222:11;;38253:3;38250:1;38243:14;38287:4;38284:1;38274:18;38266:26;;38158:141;;;:::o;38329:845::-;38432:3;38469:5;38463:12;38498:36;38524:9;38498:36;:::i;:::-;38550:89;38632:6;38627:3;38550:89;:::i;:::-;38543:96;;38670:1;38659:9;38655:17;38686:1;38681:137;;;;38832:1;38827:341;;;;38648:520;;38681:137;38765:4;38761:9;38750;38746:25;38741:3;38734:38;38801:6;38796:3;38792:16;38785:23;;38681:137;;38827:341;38894:38;38926:5;38894:38;:::i;:::-;38954:1;38968:154;38982:6;38979:1;38976:13;38968:154;;;39056:7;39050:14;39046:1;39041:3;39037:11;39030:35;39106:1;39097:7;39093:15;39082:26;;39004:4;39001:1;38997:12;38992:17;;38968:154;;;39151:6;39146:3;39142:16;39135:23;;38834:334;;38648:520;;38436:738;;38329:845;;;;:::o;39180:151::-;39320:3;39316:1;39308:6;39304:14;39297:27;39180:151;:::o;39337:400::-;39497:3;39518:84;39600:1;39595:3;39518:84;:::i;:::-;39511:91;;39611:93;39700:3;39611:93;:::i;:::-;39729:1;39724:3;39720:11;39713:18;;39337:400;;;:::o;39743:855::-;40069:3;40091:95;40182:3;40173:6;40091:95;:::i;:::-;40084:102;;40203:92;40291:3;40282:6;40203:92;:::i;:::-;40196:99;;40312:148;40456:3;40312:148;:::i;:::-;40305:155;;40477:95;40568:3;40559:6;40477:95;:::i;:::-;40470:102;;40589:3;40582:10;;39743:855;;;;;;:::o;40604:182::-;40744:34;40740:1;40732:6;40728:14;40721:58;40604:182;:::o;40792:366::-;40934:3;40955:67;41019:2;41014:3;40955:67;:::i;:::-;40948:74;;41031:93;41120:3;41031:93;:::i;:::-;41149:2;41144:3;41140:12;41133:19;;40792:366;;;:::o;41164:419::-;41330:4;41368:2;41357:9;41353:18;41345:26;;41417:9;41411:4;41407:20;41403:1;41392:9;41388:17;41381:47;41445:131;41571:4;41445:131;:::i;:::-;41437:139;;41164:419;;;:::o;41589:176::-;41729:28;41725:1;41717:6;41713:14;41706:52;41589:176;:::o;41771:366::-;41913:3;41934:67;41998:2;41993:3;41934:67;:::i;:::-;41927:74;;42010:93;42099:3;42010:93;:::i;:::-;42128:2;42123:3;42119:12;42112:19;;41771:366;;;:::o;42143:419::-;42309:4;42347:2;42336:9;42332:18;42324:26;;42396:9;42390:4;42386:20;42382:1;42371:9;42367:17;42360:47;42424:131;42550:4;42424:131;:::i;:::-;42416:139;;42143:419;;;:::o;42568:233::-;42607:3;42630:24;42648:5;42630:24;:::i;:::-;42621:33;;42676:66;42669:5;42666:77;42663:103;;;42746:18;;:::i;:::-;42663:103;42793:1;42786:5;42782:13;42775:20;;42568:233;;;:::o;42807:171::-;42846:3;42869:24;42887:5;42869:24;:::i;:::-;42860:33;;42915:4;42908:5;42905:15;42902:41;;;42923:18;;:::i;:::-;42902:41;42970:1;42963:5;42959:13;42952:20;;42807:171;;;:::o;42984:225::-;43124:34;43120:1;43112:6;43108:14;43101:58;43193:8;43188:2;43180:6;43176:15;43169:33;42984:225;:::o;43215:366::-;43357:3;43378:67;43442:2;43437:3;43378:67;:::i;:::-;43371:74;;43454:93;43543:3;43454:93;:::i;:::-;43572:2;43567:3;43563:12;43556:19;;43215:366;;;:::o;43587:419::-;43753:4;43791:2;43780:9;43776:18;43768:26;;43840:9;43834:4;43830:20;43826:1;43815:9;43811:17;43804:47;43868:131;43994:4;43868:131;:::i;:::-;43860:139;;43587:419;;;:::o;44012:224::-;44152:34;44148:1;44140:6;44136:14;44129:58;44221:7;44216:2;44208:6;44204:15;44197:32;44012:224;:::o;44242:366::-;44384:3;44405:67;44469:2;44464:3;44405:67;:::i;:::-;44398:74;;44481:93;44570:3;44481:93;:::i;:::-;44599:2;44594:3;44590:12;44583:19;;44242:366;;;:::o;44614:419::-;44780:4;44818:2;44807:9;44803:18;44795:26;;44867:9;44861:4;44857:20;44853:1;44842:9;44838:17;44831:47;44895:131;45021:4;44895:131;:::i;:::-;44887:139;;44614:419;;;:::o;45039:112::-;45122:22;45138:5;45122:22;:::i;:::-;45117:3;45110:35;45039:112;;:::o;45157:545::-;45330:4;45368:3;45357:9;45353:19;45345:27;;45382:71;45450:1;45439:9;45435:17;45426:6;45382:71;:::i;:::-;45463:68;45527:2;45516:9;45512:18;45503:6;45463:68;:::i;:::-;45541:72;45609:2;45598:9;45594:18;45585:6;45541:72;:::i;:::-;45623;45691:2;45680:9;45676:18;45667:6;45623:72;:::i;:::-;45157:545;;;;;;;:::o;45708:232::-;45848:34;45844:1;45836:6;45832:14;45825:58;45917:15;45912:2;45904:6;45900:15;45893:40;45708:232;:::o;45946:366::-;46088:3;46109:67;46173:2;46168:3;46109:67;:::i;:::-;46102:74;;46185:93;46274:3;46185:93;:::i;:::-;46303:2;46298:3;46294:12;46287:19;;45946:366;;;:::o;46318:419::-;46484:4;46522:2;46511:9;46507:18;46499:26;;46571:9;46565:4;46561:20;46557:1;46546:9;46542:17;46535:47;46599:131;46725:4;46599:131;:::i;:::-;46591:139;;46318:419;;;:::o;46743:170::-;46883:22;46879:1;46871:6;46867:14;46860:46;46743:170;:::o;46919:366::-;47061:3;47082:67;47146:2;47141:3;47082:67;:::i;:::-;47075:74;;47158:93;47247:3;47158:93;:::i;:::-;47276:2;47271:3;47267:12;47260:19;;46919:366;;;:::o;47291:419::-;47457:4;47495:2;47484:9;47480:18;47472:26;;47544:9;47538:4;47534:20;47530:1;47519:9;47515:17;47508:47;47572:131;47698:4;47572:131;:::i;:::-;47564:139;;47291:419;;;:::o;47716:348::-;47756:7;47779:20;47797:1;47779:20;:::i;:::-;47774:25;;47813:20;47831:1;47813:20;:::i;:::-;47808:25;;48001:1;47933:66;47929:74;47926:1;47923:81;47918:1;47911:9;47904:17;47900:105;47897:131;;;48008:18;;:::i;:::-;47897:131;48056:1;48053;48049:9;48038:20;;47716:348;;;;:::o;48070:228::-;48210:34;48206:1;48198:6;48194:14;48187:58;48279:11;48274:2;48266:6;48262:15;48255:36;48070:228;:::o;48304:366::-;48446:3;48467:67;48531:2;48526:3;48467:67;:::i;:::-;48460:74;;48543:93;48632:3;48543:93;:::i;:::-;48661:2;48656:3;48652:12;48645:19;;48304:366;;;:::o;48676:419::-;48842:4;48880:2;48869:9;48865:18;48857:26;;48929:9;48923:4;48919:20;48915:1;48904:9;48900:17;48893:47;48957:131;49083:4;48957:131;:::i;:::-;48949:139;;48676:419;;;:::o;49101:229::-;49241:34;49237:1;49229:6;49225:14;49218:58;49310:12;49305:2;49297:6;49293:15;49286:37;49101:229;:::o;49336:366::-;49478:3;49499:67;49563:2;49558:3;49499:67;:::i;:::-;49492:74;;49575:93;49664:3;49575:93;:::i;:::-;49693:2;49688:3;49684:12;49677:19;;49336:366;;;:::o;49708:419::-;49874:4;49912:2;49901:9;49897:18;49889:26;;49961:9;49955:4;49951:20;49947:1;49936:9;49932:17;49925:47;49989:131;50115:4;49989:131;:::i;:::-;49981:139;;49708:419;;;:::o;50133:166::-;50273:18;50269:1;50261:6;50257:14;50250:42;50133:166;:::o;50305:366::-;50447:3;50468:67;50532:2;50527:3;50468:67;:::i;:::-;50461:74;;50544:93;50633:3;50544:93;:::i;:::-;50662:2;50657:3;50653:12;50646:19;;50305:366;;;:::o;50677:419::-;50843:4;50881:2;50870:9;50866:18;50858:26;;50930:9;50924:4;50920:20;50916:1;50905:9;50901:17;50894:47;50958:131;51084:4;50958:131;:::i;:::-;50950:139;;50677:419;;;:::o;51102:237::-;51242:34;51238:1;51230:6;51226:14;51219:58;51311:20;51306:2;51298:6;51294:15;51287:45;51102:237;:::o;51345:366::-;51487:3;51508:67;51572:2;51567:3;51508:67;:::i;:::-;51501:74;;51584:93;51673:3;51584:93;:::i;:::-;51702:2;51697:3;51693:12;51686:19;;51345:366;;;:::o;51717:419::-;51883:4;51921:2;51910:9;51906:18;51898:26;;51970:9;51964:4;51960:20;51956:1;51945:9;51941:17;51934:47;51998:131;52124:4;51998:131;:::i;:::-;51990:139;;51717:419;;;:::o;52142:223::-;52282:34;52278:1;52270:6;52266:14;52259:58;52351:6;52346:2;52338:6;52334:15;52327:31;52142:223;:::o;52371:366::-;52513:3;52534:67;52598:2;52593:3;52534:67;:::i;:::-;52527:74;;52610:93;52699:3;52610:93;:::i;:::-;52728:2;52723:3;52719:12;52712:19;;52371:366;;;:::o;52743:419::-;52909:4;52947:2;52936:9;52932:18;52924:26;;52996:9;52990:4;52986:20;52982:1;52971:9;52967:17;52960:47;53024:131;53150:4;53024:131;:::i;:::-;53016:139;;52743:419;;;:::o;53168:237::-;53308:34;53304:1;53296:6;53292:14;53285:58;53377:20;53372:2;53364:6;53360:15;53353:45;53168:237;:::o;53411:366::-;53553:3;53574:67;53638:2;53633:3;53574:67;:::i;:::-;53567:74;;53650:93;53739:3;53650:93;:::i;:::-;53768:2;53763:3;53759:12;53752:19;;53411:366;;;:::o;53783:419::-;53949:4;53987:2;53976:9;53972:18;53964:26;;54036:9;54030:4;54026:20;54022:1;54011:9;54007:17;54000:47;54064:131;54190:4;54064:131;:::i;:::-;54056:139;;53783:419;;;:::o;54208:180::-;54256:77;54253:1;54246:88;54353:4;54350:1;54343:15;54377:4;54374:1;54367:15;54394:185;54434:1;54451:20;54469:1;54451:20;:::i;:::-;54446:25;;54485:20;54503:1;54485:20;:::i;:::-;54480:25;;54524:1;54514:35;;54529:18;;:::i;:::-;54514:35;54571:1;54568;54564:9;54559:14;;54394:185;;;;:::o;54585:176::-;54617:1;54634:20;54652:1;54634:20;:::i;:::-;54629:25;;54668:20;54686:1;54668:20;:::i;:::-;54663:25;;54707:1;54697:35;;54712:18;;:::i;:::-;54697:35;54753:1;54750;54746:9;54741:14;;54585:176;;;;:::o;54767:143::-;54824:5;54855:6;54849:13;54840:22;;54871:33;54898:5;54871:33;:::i;:::-;54767:143;;;;:::o;54916:351::-;54986:6;55035:2;55023:9;55014:7;55010:23;55006:32;55003:119;;;55041:79;;:::i;:::-;55003:119;55161:1;55186:64;55242:7;55233:6;55222:9;55218:22;55186:64;:::i;:::-;55176:74;;55132:128;54916:351;;;;:::o;55273:553::-;55450:4;55488:3;55477:9;55473:19;55465:27;;55502:71;55570:1;55559:9;55555:17;55546:6;55502:71;:::i;:::-;55583:72;55651:2;55640:9;55636:18;55627:6;55583:72;:::i;:::-;55665;55733:2;55722:9;55718:18;55709:6;55665:72;:::i;:::-;55747;55815:2;55804:9;55800:18;55791:6;55747:72;:::i;:::-;55273:553;;;;;;;:::o;55832:332::-;55953:4;55991:2;55980:9;55976:18;55968:26;;56004:71;56072:1;56061:9;56057:17;56048:6;56004:71;:::i;:::-;56085:72;56153:2;56142:9;56138:18;56129:6;56085:72;:::i;:::-;55832:332;;;;;:::o;56170:178::-;56310:30;56306:1;56298:6;56294:14;56287:54;56170:178;:::o;56354:366::-;56496:3;56517:67;56581:2;56576:3;56517:67;:::i;:::-;56510:74;;56593:93;56682:3;56593:93;:::i;:::-;56711:2;56706:3;56702:12;56695:19;;56354:366;;;:::o;56726:419::-;56892:4;56930:2;56919:9;56915:18;56907:26;;56979:9;56973:4;56969:20;56965:1;56954:9;56950:17;56943:47;57007:131;57133:4;57007:131;:::i;:::-;56999:139;;56726:419;;;:::o;57151:225::-;57291:34;57287:1;57279:6;57275:14;57268:58;57360:8;57355:2;57347:6;57343:15;57336:33;57151:225;:::o;57382:366::-;57524:3;57545:67;57609:2;57604:3;57545:67;:::i;:::-;57538:74;;57621:93;57710:3;57621:93;:::i;:::-;57739:2;57734:3;57730:12;57723:19;;57382:366;;;:::o;57754:419::-;57920:4;57958:2;57947:9;57943:18;57935:26;;58007:9;58001:4;57997:20;57993:1;57982:9;57978:17;57971:47;58035:131;58161:4;58035:131;:::i;:::-;58027:139;;57754:419;;;:::o;58179:179::-;58319:31;58315:1;58307:6;58303:14;58296:55;58179:179;:::o;58364:366::-;58506:3;58527:67;58591:2;58586:3;58527:67;:::i;:::-;58520:74;;58603:93;58692:3;58603:93;:::i;:::-;58721:2;58716:3;58712:12;58705:19;;58364:366;;;:::o;58736:419::-;58902:4;58940:2;58929:9;58925:18;58917:26;;58989:9;58983:4;58979:20;58975:1;58964:9;58960:17;58953:47;59017:131;59143:4;59017:131;:::i;:::-;59009:139;;58736:419;;;:::o;59161:640::-;59356:4;59394:3;59383:9;59379:19;59371:27;;59408:71;59476:1;59465:9;59461:17;59452:6;59408:71;:::i;:::-;59489:72;59557:2;59546:9;59542:18;59533:6;59489:72;:::i;:::-;59571;59639:2;59628:9;59624:18;59615:6;59571:72;:::i;:::-;59690:9;59684:4;59680:20;59675:2;59664:9;59660:18;59653:48;59718:76;59789:4;59780:6;59718:76;:::i;:::-;59710:84;;59161:640;;;;;;;:::o;59807:141::-;59863:5;59894:6;59888:13;59879:22;;59910:32;59936:5;59910:32;:::i;:::-;59807:141;;;;:::o;59954:349::-;60023:6;60072:2;60060:9;60051:7;60047:23;60043:32;60040:119;;;60078:79;;:::i;:::-;60040:119;60198:1;60223:63;60278:7;60269:6;60258:9;60254:22;60223:63;:::i;:::-;60213:73;;60169:127;59954:349;;;;:::o

Swarm Source

ipfs://f29d3e2fdd17d84f0b756f98ec9e8f8fbdb9536d13270ec63de89d54b1beaa7b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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