Overview
ETH Balance
0.000011052441805343 ETH
Eth Value
$0.03 (@ $2,524.45/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 52 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 15043958 | 794 days ago | IN | 0 ETH | 0.00096826 | ||||
Repay ETH | 14767091 | 841 days ago | IN | 39.522032 ETH | 0.00780811 | ||||
Repay ETH | 14767007 | 841 days ago | IN | 39.521629 ETH | 0.0089849 | ||||
Borrow ETH | 14766634 | 841 days ago | IN | 0 ETH | 0.01308624 | ||||
Borrow ETH | 14766607 | 841 days ago | IN | 0 ETH | 0.01343333 | ||||
Repay ETH | 14710502 | 850 days ago | IN | 32.061129 ETH | 0.007558 | ||||
Repay ETH | 14707908 | 850 days ago | IN | 18 ETH | 0.00701056 | ||||
Repay ETH | 14697594 | 852 days ago | IN | 50.008046 ETH | 0.00808413 | ||||
Borrow ETH | 14695879 | 852 days ago | IN | 0 ETH | 0.00881121 | ||||
Borrow ETH | 14695866 | 852 days ago | IN | 0 ETH | 0.00991495 | ||||
Repay ETH | 14694780 | 852 days ago | IN | 0.053914 ETH | 0.00706123 | ||||
Repay ETH | 14694775 | 852 days ago | IN | 49.287151 ETH | 0.00548636 | ||||
Repay ETH | 14692483 | 852 days ago | IN | 50.941025 ETH | 0.01058475 | ||||
Borrow ETH | 14692415 | 852 days ago | IN | 0 ETH | 0.01238636 | ||||
Borrow ETH | 14690958 | 853 days ago | IN | 0 ETH | 0.00966772 | ||||
Repay ETH | 14658168 | 858 days ago | IN | 54.800555 ETH | 0.00589326 | ||||
Borrow ETH | 14658152 | 858 days ago | IN | 0 ETH | 0.00792482 | ||||
Repay ETH | 14645930 | 860 days ago | IN | 52.015481 ETH | 0.00405971 | ||||
Borrow ETH | 14641753 | 860 days ago | IN | 0 ETH | 0.01408122 | ||||
Repay ETH | 14552501 | 874 days ago | IN | 44.451608 ETH | 0.00623252 | ||||
Repay ETH | 14537765 | 877 days ago | IN | 22.053904 ETH | 0.00696401 | ||||
Borrow ETH | 14537759 | 877 days ago | IN | 0 ETH | 0.00993851 | ||||
Repay ETH | 14510281 | 881 days ago | IN | 22.000229 ETH | 0.0073317 | ||||
Borrow ETH | 14510270 | 881 days ago | IN | 0 ETH | 0.00786644 | ||||
Repay ETH | 14510263 | 881 days ago | IN | 22.053955 ETH | 0.01162544 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15043958 | 794 days ago | 100.4142 ETH | ||||
14767091 | 841 days ago | 0.00033346 ETH | ||||
14767007 | 841 days ago | 0.00032 ETH | ||||
14766634 | 841 days ago | 39.52 ETH | ||||
14766607 | 841 days ago | 39.52 ETH | ||||
14710502 | 850 days ago | 0.00027909 ETH | ||||
14697594 | 852 days ago | 0.0004314 ETH | ||||
14695879 | 852 days ago | 50 ETH | ||||
14695866 | 852 days ago | 50 ETH | ||||
14694780 | 852 days ago | 0.00000083 ETH | ||||
14692483 | 852 days ago | 0.00044356 ETH | ||||
14692415 | 852 days ago | 49.330726 ETH | ||||
14690958 | 853 days ago | 50.933684 ETH | ||||
14658168 | 858 days ago | 0.00047714 ETH | ||||
14658152 | 858 days ago | 54.8 ETH | ||||
14645930 | 860 days ago | 0.00019476 ETH | ||||
14641753 | 860 days ago | 51.996 ETH | ||||
14552501 | 874 days ago | 0.00037142 ETH | ||||
14537765 | 877 days ago | 0.00018976 ETH | ||||
14537759 | 877 days ago | 44.393122 ETH | ||||
14510281 | 881 days ago | 0.00018797 ETH | ||||
14510270 | 881 days ago | 22 ETH | ||||
14510263 | 881 days ago | 0.00019454 ETH | ||||
14510260 | 881 days ago | 22 ETH | ||||
14503274 | 882 days ago | 0.00036927 ETH |
Loading...
Loading
Contract Name:
ERC721LendingPoolETH01
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-23 */ // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { __Context_init_unchained(); } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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); } uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File: contracts/VerifySignaturePool01.sol pragma solidity 0.8.3; /* Signature Verification How to Sign and Verify # Signing 1. Create message to sign 2. Hash the message 3. Sign the hash (off chain, keep your private key secret) # Verify 1. Recreate hash from the original message 2. Recover signer from signature and hash 3. Compare recovered signer to claimed signer */ contract VerifySignaturePool01 { /* 1. Unlock MetaMask account ethereum.enable() */ /* 2. Get message hash to sign getMessageHash( 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C, 123, "coffee and donuts", 1 ) hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd" */ function getMessageHash( address nft, uint punkID, uint valuation, uint expireAtBlock ) public pure returns (bytes32) { return keccak256(abi.encodePacked(nft, punkID, valuation, expireAtBlock)); } /* 3. Sign message hash # using browser account = "copy paste account of signer here" ethereum.request({ method: "personal_sign", params: [account, hash]}).then(console.log) # using web3 web3.personal.sign(hash, web3.eth.defaultAccount, console.log) Signature will be different for different accounts 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b */ function getEthSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) { /* Signature is produced by signing a keccak256 hash with the following format: "\x19Ethereum Signed Message\n" + len(msg) + msg */ return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) ); } /* 4. Verify signature signer = 0xB273216C05A8c0D4F0a4Dd0d7Bae1D2EfFE636dd to = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C amount = 123 message = "coffee and donuts" nonce = 1 signature = 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b */ function verify( address nft, uint punkID, uint valuation, uint expireAtBlock, address _signer, bytes memory signature ) public pure returns (bool) { bytes32 messageHash = getMessageHash(nft,punkID, valuation, expireAtBlock); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, signature) == _signer; } function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) internal pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature(bytes memory sig) internal pure returns ( bytes32 r, bytes32 s, uint8 v ) { require(sig.length == 65, "invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } // implicitly return (r, s, v) } } // File: contracts/ERC721LendingPoolETH01.sol pragma solidity 0.8.3; contract ERC721LendingPoolETH01 is VerifySignaturePool01, OwnableUpgradeable, IERC721Receiver, PausableUpgradeable { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) public pure override returns (bytes4) { return bytes4( keccak256("onERC721Received(address,address,uint256,bytes)") ); } /** * Pool Constants */ address public _valuationSigner; address public _supportedCollection; struct PoolParams { uint32 interestBPS1000000XBlock; uint32 collateralFactorBPS; } mapping(uint256 => PoolParams) public durationSeconds_poolParam; /** * Pool Setup */ function initialize(address supportedCollection) public initializer { __Ownable_init(); __Pausable_init(); _supportedCollection = supportedCollection; } function setDurationParam(uint256 duration, PoolParams calldata ppm) public onlyOwner { durationSeconds_poolParam[duration] = ppm; } function setValuationSigner(address valuationSigner) public onlyOwner { _valuationSigner = valuationSigner; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } /** * Storage and Events */ struct LoanTerms { uint256 loanStartBlock; uint256 loanExpireTimestamp; uint32 interestBPS1000000XBlock; uint32 maxLTVBPS; uint256 borrowedWei; uint256 returnedWei; uint256 accuredInterestWei; uint256 repaidInterestWei; address borrower; } mapping(uint256 => LoanTerms) public _loans; event LoanInitiated( address indexed user, address indexed erc721, uint256 indexed nftID, LoanTerms loan ); event LoanTermsChanged( address indexed user, address indexed erc721, uint256 indexed nftID, LoanTerms oldTerms, LoanTerms newTerms ); event Liquidation( address indexed user, address indexed erc721, uint256 indexed nftID, uint256 liquidated_at, address liquidator, uint256 reason ); /** * View functions */ function nftHasLoan(uint256 nftID) internal view returns (bool) { return _loans[nftID].borrowedWei > _loans[nftID].returnedWei; } function outstanding(uint256 nftID) public view returns (uint256) { // do not lump the interest if (_loans[nftID].borrowedWei <= _loans[nftID].returnedWei) return 0; uint256 newAccuredInterestWei = ((block.number - _loans[nftID].loanStartBlock) * (_loans[nftID].borrowedWei - _loans[nftID].returnedWei) * _loans[nftID].interestBPS1000000XBlock) / 10000000000; return (_loans[nftID].borrowedWei - _loans[nftID].returnedWei) + (_loans[nftID].accuredInterestWei - _loans[nftID].repaidInterestWei) + newAccuredInterestWei; } function isUnHealthyLoan(uint256 nftID) public view returns (bool, uint256) { require(nftHasLoan(nftID), "nft does not have active loan"); bool isExpired = block.timestamp > _loans[nftID].loanExpireTimestamp && outstanding(nftID) > 0; return (isExpired, 0); } /** * Loan origination */ function borrowETH( uint256 valuation, uint256 nftID, uint256 loanDurationSeconds, uint256 expireAtBlock, uint256 borrowedWei, bytes memory signature ) public whenNotPaused { require( verify( _supportedCollection, nftID, valuation, expireAtBlock, _valuationSigner, signature ), "SignatureVerifier: fake valuation provided!" ); require(!nftHasLoan(nftID), "NFT already has loan!"); uint32 maxLTVBPS = durationSeconds_poolParam[loanDurationSeconds] .collateralFactorBPS; require(maxLTVBPS > 0, "Duration not supported"); require( IERC721(_supportedCollection).ownerOf(nftID) == msg.sender, "Stealer!" ); require(block.number < expireAtBlock, "Valuation expired"); require( borrowedWei <= (valuation * maxLTVBPS) / 10_000, "Can't borrow more than max LTV" ); require(borrowedWei < address(this).balance, "not enough money"); _loans[nftID] = LoanTerms( block.number, block.timestamp + loanDurationSeconds, durationSeconds_poolParam[loanDurationSeconds].interestBPS1000000XBlock, maxLTVBPS, borrowedWei, 0, 0, 0, msg.sender ); emit LoanInitiated( msg.sender, _supportedCollection, nftID, _loans[nftID] ); IERC721(_supportedCollection).transferFrom( msg.sender, address(this), nftID ); (bool success, ) = msg.sender.call{value: borrowedWei}(""); require(success, "cannot send ether"); } /** * Repay */ // repay change loan terms, renew loan start, fix interest to borrowed amount, dont renew loan expiry function repayETH(uint256 nftID) public payable whenNotPaused { require(nftHasLoan(nftID), "NFT does not have active loan"); uint256 repayAmount = msg.value; LoanTerms memory oldLoanTerms = _loans[nftID]; // require(repayAmount > outstanding(nftID), "repay amount exceed outstanding"); if (repayAmount >= outstanding(nftID)) { uint256 toBeTransferred = repayAmount - outstanding(nftID); repayAmount = outstanding(nftID); // _loans[nftID].accuredInterestWei = // outstanding(nftID) - // _loans[nftID].borrowedWei; _loans[nftID].returnedWei = _loans[nftID].borrowedWei; // _loans[nftID].repaidInterestWei = _loans[nftID].accuredInterestWei; IERC721(_supportedCollection).transferFrom( address(this), _loans[nftID].borrower, nftID ); (bool success, ) = msg.sender.call{value: toBeTransferred}(""); require(success, "cannot send ether"); } else { // lump in interest //_loans[nftID].previousBorrowedWei = _loans[nftID].borrowedWei; _loans[nftID].accuredInterestWei += ((block.number - _loans[nftID].loanStartBlock) * (_loans[nftID].borrowedWei - _loans[nftID].returnedWei) * _loans[nftID].interestBPS1000000XBlock) / 10000000000; uint256 outstandingInterest = _loans[nftID].accuredInterestWei - _loans[nftID].repaidInterestWei; if (repayAmount > outstandingInterest) { _loans[nftID].repaidInterestWei = _loans[nftID] .accuredInterestWei; _loans[nftID].returnedWei += (repayAmount - outstandingInterest); } else { _loans[nftID].repaidInterestWei += repayAmount; } // restart interest calculation _loans[nftID].loanStartBlock = block.number; } emit LoanTermsChanged( _loans[nftID].borrower, _supportedCollection, nftID, oldLoanTerms, _loans[nftID] ); } /** * Liquidation ( warning! If it is not only owner. miners can always fast forward the clock by 15 seconds to liquidate anything before us) */ function liquidateLoan(uint256 nftID) public onlyOwner { require(nftHasLoan(nftID), "nft does not have active loan"); (bool unhealthy, uint256 reason) = isUnHealthyLoan(nftID); require(unhealthy, "can't liquidate this loan"); LoanTerms memory oldLoanTerms = _loans[nftID]; _loans[nftID].returnedWei = _loans[nftID].borrowedWei; emit Liquidation( _loans[nftID].borrower, _supportedCollection, nftID, block.timestamp, msg.sender, reason ); IERC721(_supportedCollection).safeTransferFrom( address(this), owner(), nftID ); emit LoanTermsChanged( _loans[nftID].borrower, _supportedCollection, nftID, oldLoanTerms, _loans[nftID] ); } receive() external payable { // React to receiving ether } /** * Admin functions */ function withdraw(uint256 amount) public onlyOwner { (bool success, ) = owner().call{value: amount}(""); require(success, "cannot send ether"); } function withdrawERC20(address currency, uint256 amount) public onlyOwner { IERC20(currency).transfer(owner(), amount); } function withdrawERC721(address collection, uint256 nftID) public onlyOwner { require( !(collection == _supportedCollection && nftHasLoan(nftID)), "no stealing" ); IERC721(collection).safeTransferFrom(address(this), owner(), nftID); } /** * Pool is not supposed to be used again after calling this function */ function emergencyWithdrawLoanCollateral(uint256 nftID, bytes memory signature, uint8 withdrawToOwner) public whenPaused onlyOwner { require( nftHasLoan(nftID), "could be withdrawn using withdrawERC721" ); require( verify( _supportedCollection, nftID, 238888 + withdrawToOwner, 238888 + withdrawToOwner, _loans[nftID].borrower, signature ), "SignatureVerifier: fake signature provided!" ); if (withdrawToOwner == 1) { IERC721(_supportedCollection).safeTransferFrom(address(this), owner(), nftID); } else if (withdrawToOwner == 0) { IERC721(_supportedCollection).safeTransferFrom(address(this), _loans[nftID].borrower, nftID); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"erc721","type":"address"},{"indexed":true,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidated_at","type":"uint256"},{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"uint256","name":"reason","type":"uint256"}],"name":"Liquidation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"erc721","type":"address"},{"indexed":true,"internalType":"uint256","name":"nftID","type":"uint256"},{"components":[{"internalType":"uint256","name":"loanStartBlock","type":"uint256"},{"internalType":"uint256","name":"loanExpireTimestamp","type":"uint256"},{"internalType":"uint32","name":"interestBPS1000000XBlock","type":"uint32"},{"internalType":"uint32","name":"maxLTVBPS","type":"uint32"},{"internalType":"uint256","name":"borrowedWei","type":"uint256"},{"internalType":"uint256","name":"returnedWei","type":"uint256"},{"internalType":"uint256","name":"accuredInterestWei","type":"uint256"},{"internalType":"uint256","name":"repaidInterestWei","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"}],"indexed":false,"internalType":"struct ERC721LendingPoolETH01.LoanTerms","name":"loan","type":"tuple"}],"name":"LoanInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"erc721","type":"address"},{"indexed":true,"internalType":"uint256","name":"nftID","type":"uint256"},{"components":[{"internalType":"uint256","name":"loanStartBlock","type":"uint256"},{"internalType":"uint256","name":"loanExpireTimestamp","type":"uint256"},{"internalType":"uint32","name":"interestBPS1000000XBlock","type":"uint32"},{"internalType":"uint32","name":"maxLTVBPS","type":"uint32"},{"internalType":"uint256","name":"borrowedWei","type":"uint256"},{"internalType":"uint256","name":"returnedWei","type":"uint256"},{"internalType":"uint256","name":"accuredInterestWei","type":"uint256"},{"internalType":"uint256","name":"repaidInterestWei","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"}],"indexed":false,"internalType":"struct ERC721LendingPoolETH01.LoanTerms","name":"oldTerms","type":"tuple"},{"components":[{"internalType":"uint256","name":"loanStartBlock","type":"uint256"},{"internalType":"uint256","name":"loanExpireTimestamp","type":"uint256"},{"internalType":"uint32","name":"interestBPS1000000XBlock","type":"uint32"},{"internalType":"uint32","name":"maxLTVBPS","type":"uint32"},{"internalType":"uint256","name":"borrowedWei","type":"uint256"},{"internalType":"uint256","name":"returnedWei","type":"uint256"},{"internalType":"uint256","name":"accuredInterestWei","type":"uint256"},{"internalType":"uint256","name":"repaidInterestWei","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"}],"indexed":false,"internalType":"struct ERC721LendingPoolETH01.LoanTerms","name":"newTerms","type":"tuple"}],"name":"LoanTermsChanged","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_loans","outputs":[{"internalType":"uint256","name":"loanStartBlock","type":"uint256"},{"internalType":"uint256","name":"loanExpireTimestamp","type":"uint256"},{"internalType":"uint32","name":"interestBPS1000000XBlock","type":"uint32"},{"internalType":"uint32","name":"maxLTVBPS","type":"uint32"},{"internalType":"uint256","name":"borrowedWei","type":"uint256"},{"internalType":"uint256","name":"returnedWei","type":"uint256"},{"internalType":"uint256","name":"accuredInterestWei","type":"uint256"},{"internalType":"uint256","name":"repaidInterestWei","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_supportedCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_valuationSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"uint256","name":"nftID","type":"uint256"},{"internalType":"uint256","name":"loanDurationSeconds","type":"uint256"},{"internalType":"uint256","name":"expireAtBlock","type":"uint256"},{"internalType":"uint256","name":"borrowedWei","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"borrowETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"durationSeconds_poolParam","outputs":[{"internalType":"uint32","name":"interestBPS1000000XBlock","type":"uint32"},{"internalType":"uint32","name":"collateralFactorBPS","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftID","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint8","name":"withdrawToOwner","type":"uint8"}],"name":"emergencyWithdrawLoanCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"}],"name":"getEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"punkID","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"uint256","name":"expireAtBlock","type":"uint256"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"supportedCollection","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"isUnHealthyLoan","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"liquidateLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"outstanding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"repayETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint32","name":"interestBPS1000000XBlock","type":"uint32"},{"internalType":"uint32","name":"collateralFactorBPS","type":"uint32"}],"internalType":"struct ERC721LendingPoolETH01.PoolParams","name":"ppm","type":"tuple"}],"name":"setDurationParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"valuationSigner","type":"address"}],"name":"setValuationSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"punkID","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"uint256","name":"expireAtBlock","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506148ea806100206000396000f3fe6080604052600436106101855760003560e01c8063874a0e73116100d1578063c6600e9a1161008a578063f2fde38b11610064578063f2fde38b1461055e578063f3e414f814610587578063f440be04146105b0578063fa540801146105ed5761018c565b8063c6600e9a146104e3578063cad0f9141461050c578063ccdd9f5d146105355761018c565b8063874a0e73146103b95780638da5cb5b146103f657806394bfd7b014610421578063a1db97821461044c578063bd5c569b14610475578063c4d66de8146104ba5761018c565b80633f4ba83a1161013e578063562f2f1a11610118578063562f2f1a146103375780635c975abb14610360578063715018a61461038b5780638456cb59146103a25761018c565b80633f4ba83a146102b95780634b5f01bf146102d05780634fa22448146102f95761018c565b80630f3f9bbf14610191578063150b7a02146101ce5780631e7d92571461020b5780632247463e146102495780632e1a7d4d146102655780633e22c0081461028e5761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101b860048036038101906101b39190613056565b61062a565b6040516101c59190613985565b60405180910390f35b3480156101da57600080fd5b506101f560048036038101906101f09190612f37565b61068e565b6040516102029190613a29565b60405180910390f35b34801561021757600080fd5b50610232600480360381019061022d9190613149565b6106bc565b6040516102409291906139a0565b60405180910390f35b610263600480360381019061025e9190613149565b610745565b005b34801561027157600080fd5b5061028c60048036038101906102879190613149565b610d63565b005b34801561029a57600080fd5b506102a3610e96565b6040516102b0919061390a565b60405180910390f35b3480156102c557600080fd5b506102ce610ebc565b005b3480156102dc57600080fd5b506102f760048036038101906102f29190612ee5565b610f42565b005b34801561030557600080fd5b50610320600480360381019061031b9190613149565b611002565b60405161032e929190613e0a565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190613215565b611046565b005b34801561036c57600080fd5b50610375611738565b6040516103829190613985565b60405180910390f35b34801561039757600080fd5b506103a061174f565b005b3480156103ae57600080fd5b506103b76117d7565b005b3480156103c557600080fd5b506103e060048036038101906103db9190613149565b61185d565b6040516103ed9190613d2b565b60405180910390f35b34801561040257600080fd5b5061040b6119d8565b604051610418919061390a565b60405180910390f35b34801561042d57600080fd5b50610436611a02565b604051610443919061390a565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612fb7565b611a28565b005b34801561048157600080fd5b5061049c60048036038101906104979190613149565b611b3d565b6040516104b199989796959493929190613d7d565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190612ee5565b611bcb565b005b3480156104ef57600080fd5b5061050a600480360381019061050591906131d9565b611d01565b005b34801561051857600080fd5b50610533600480360381019061052e9190613172565b611da4565b005b34801561054157600080fd5b5061055c60048036038101906105579190613149565b612103565b005b34801561056a57600080fd5b5061058560048036038101906105809190612ee5565b61257b565b005b34801561059357600080fd5b506105ae60048036038101906105a99190612fb7565b612673565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190612ff3565b61280b565b6040516105e491906139c9565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190613120565b612844565b60405161062191906139c9565b60405180910390f35b6000806106398888888861280b565b9050600061064682612844565b90508473ffffffffffffffffffffffffffffffffffffffff166106698286612874565b73ffffffffffffffffffffffffffffffffffffffff1614925050509695505050505050565b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b6000806106c8836128e3565b610707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fe90613aa4565b60405180910390fd5b6000609a60008581526020019081526020016000206001015442118015610736575060006107348561185d565b115b90508060009250925050915091565b61074d611738565b1561078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078490613b04565b60405180910390fd5b610796816128e3565b6107d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cc90613ac4565b60405180910390fd5b60003490506000609a60008481526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090506108e48361185d565b8210610ab85760006108f58461185d565b836109009190613fca565b905061090b8461185d565b9250609a600085815260200190815260200160002060030154609a600086815260200190815260200160002060040181905550609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30609a600088815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b81526004016109d393929190613925565b600060405180830381600087803b1580156109ed57600080fd5b505af1158015610a01573d6000803e3d6000fd5b5050505060003373ffffffffffffffffffffffffffffffffffffffff1682604051610a2b906138f5565b60006040518083038185875af1925050503d8060008114610a68576040519150601f19603f3d011682016040523d82523d6000602084013e610a6d565b606091505b5050905080610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa890613b44565b60405180910390fd5b5050610c8c565b6402540be400609a600085815260200190815260200160002060020160009054906101000a900463ffffffff1663ffffffff16609a600086815260200190815260200160002060040154609a600087815260200190815260200160002060030154610b239190613fca565b609a60008781526020019081526020016000206000015443610b459190613fca565b610b4f9190613f70565b610b599190613f70565b610b639190613f3f565b609a60008581526020019081526020016000206005016000828254610b889190613ee9565b925050819055506000609a600085815260200190815260200160002060060154609a600086815260200190815260200160002060050154610bc99190613fca565b905080831115610c4157609a600085815260200190815260200160002060050154609a6000868152602001908152602001600020600601819055508083610c109190613fca565b609a60008681526020019081526020016000206004016000828254610c359190613ee9565b92505081905550610c6f565b82609a60008681526020019081526020016000206006016000828254610c679190613ee9565b925050819055505b43609a600086815260200190815260200160002060000181905550505b82609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16609a600086815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb7faaf58a53a3a4bdfdd90dff44b713036c882f23772663c180bf72866f44c1c84609a6000898152602001908152602001600020604051610d56929190613ce4565b60405180910390a4505050565b610d6b61291b565b73ffffffffffffffffffffffffffffffffffffffff16610d896119d8565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690613bc4565b60405180910390fd5b6000610de96119d8565b73ffffffffffffffffffffffffffffffffffffffff1682604051610e0c906138f5565b60006040518083038185875af1925050503d8060008114610e49576040519150601f19603f3d011682016040523d82523d6000602084013e610e4e565b606091505b5050905080610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613b44565b60405180910390fd5b5050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ec461291b565b73ffffffffffffffffffffffffffffffffffffffff16610ee26119d8565b73ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613bc4565b60405180910390fd5b610f40612923565b565b610f4a61291b565b73ffffffffffffffffffffffffffffffffffffffff16610f686119d8565b73ffffffffffffffffffffffffffffffffffffffff1614610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613bc4565b60405180910390fd5b80609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60996020528060005260406000206000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16905082565b61104e611738565b1561108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590613b04565b60405180910390fd5b6110e0609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868886609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168661062a565b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690613be4565b60405180910390fd5b611128856128e3565b15611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613a44565b60405180910390fd5b60006099600086815260200190815260200160002060000160049054906101000a900463ffffffff16905060008163ffffffff16116111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613b84565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b815260040161124e9190613d2b565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190612f0e565b73ffffffffffffffffffffffffffffffffffffffff16146112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90613c64565b60405180910390fd5b834310611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90613ba4565b60405180910390fd5b6127108163ffffffff168861134b9190613f70565b6113559190613f3f565b831115611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e90613c44565b60405180910390fd5b4783106113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090613c24565b60405180910390fd5b60405180610120016040528043815260200186426113f79190613ee9565b81526020016099600088815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1681526020018263ffffffff1681526020018481526020016000815260200160008152602001600081526020013373ffffffffffffffffffffffffffffffffffffffff16815250609a6000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055506080820151816003015560a0820151816004015560c0820151816005015560e082015181600601556101008201518160070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505085609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f872dc93aead2083e073cc885fd9a73e19b414626890d68c6251f12ba51f8a3bd609a60008b81526020019081526020016000206040516115e99190613d0f565b60405180910390a4609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b815260040161165093929190613925565b600060405180830381600087803b15801561166a57600080fd5b505af115801561167e573d6000803e3d6000fd5b5050505060003373ffffffffffffffffffffffffffffffffffffffff16846040516116a8906138f5565b60006040518083038185875af1925050503d80600081146116e5576040519150601f19603f3d011682016040523d82523d6000602084013e6116ea565b606091505b505090508061172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590613b44565b60405180910390fd5b5050505050505050565b6000606560009054906101000a900460ff16905090565b61175761291b565b73ffffffffffffffffffffffffffffffffffffffff166117756119d8565b73ffffffffffffffffffffffffffffffffffffffff16146117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613bc4565b60405180910390fd5b6117d560006129c5565b565b6117df61291b565b73ffffffffffffffffffffffffffffffffffffffff166117fd6119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613bc4565b60405180910390fd5b61185b612a8b565b565b6000609a600083815260200190815260200160002060040154609a6000848152602001908152602001600020600301541161189b57600090506119d3565b60006402540be400609a600085815260200190815260200160002060020160009054906101000a900463ffffffff1663ffffffff16609a600086815260200190815260200160002060040154609a6000878152602001908152602001600020600301546119089190613fca565b609a6000878152602001908152602001600020600001544361192a9190613fca565b6119349190613f70565b61193e9190613f70565b6119489190613f3f565b905080609a600085815260200190815260200160002060060154609a6000868152602001908152602001600020600501546119839190613fca565b609a600086815260200190815260200160002060040154609a6000878152602001908152602001600020600301546119bb9190613fca565b6119c59190613ee9565b6119cf9190613ee9565b9150505b919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a3061291b565b73ffffffffffffffffffffffffffffffffffffffff16611a4e6119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9b90613bc4565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611ac86119d8565b836040518363ffffffff1660e01b8152600401611ae692919061395c565b602060405180830381600087803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3891906130f7565b505050565b609a6020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900463ffffffff16908060020160049054906101000a900463ffffffff16908060030154908060040154908060050154908060060154908060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b600060019054906101000a900460ff16611bf35760008054906101000a900460ff1615611bfc565b611bfb612b2e565b5b611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3290613b64565b60405180910390fd5b60008060019054906101000a900460ff161590508015611c8b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b611c93612b3f565b611c9b612ba0565b81609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508015611cfd5760008060016101000a81548160ff0219169083151502179055505b5050565b611d0961291b565b73ffffffffffffffffffffffffffffffffffffffff16611d276119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613bc4565b60405180910390fd5b80609960008481526020019081526020016000208181611d9d91906147d6565b9050505050565b611dac611738565b611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290613a64565b60405180910390fd5b611df361291b565b73ffffffffffffffffffffffffffffffffffffffff16611e116119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90613bc4565b60405180910390fd5b611e70836128e3565b611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690613c04565b60405180910390fd5b611f41609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848360ff166203a528611ee89190613eb0565b62ffffff168460ff166203a528611eff9190613eb0565b62ffffff16609a600089815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168761062a565b611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790613ae4565b60405180910390fd5b60018160ff16141561202957609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30611fd36119d8565b866040518463ffffffff1660e01b8152600401611ff293929190613925565b600060405180830381600087803b15801561200c57600080fd5b505af1158015612020573d6000803e3d6000fd5b505050506120fe565b60008160ff1614156120fd57609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30609a600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b81526004016120ca93929190613925565b600060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b505050505b5b505050565b61210b61291b565b73ffffffffffffffffffffffffffffffffffffffff166121296119d8565b73ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217690613bc4565b60405180910390fd5b612188816128e3565b6121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be90613aa4565b60405180910390fd5b6000806121d3836106bc565b9150915081612217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220e90613c84565b60405180910390fd5b6000609a60008581526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050609a600085815260200190815260200160002060030154609a60008681526020019081526020016000206004018190555083609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16609a600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f680ce85e4f810f64123666acc47e4075544c11a42dbed669dd30fbb7b0b83f0642338760405161240393929190613d46565b60405180910390a4609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e306124526119d8565b876040518463ffffffff1660e01b815260040161247193929190613925565b600060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b5050505083609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16609a600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb7faaf58a53a3a4bdfdd90dff44b713036c882f23772663c180bf72866f44c1c84609a60008a815260200190815260200160002060405161256d929190613ce4565b60405180910390a450505050565b61258361291b565b73ffffffffffffffffffffffffffffffffffffffff166125a16119d8565b73ffffffffffffffffffffffffffffffffffffffff16146125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613bc4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90613a84565b60405180910390fd5b612670816129c5565b50565b61267b61291b565b73ffffffffffffffffffffffffffffffffffffffff166126996119d8565b73ffffffffffffffffffffffffffffffffffffffff16146126ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e690613bc4565b60405180910390fd5b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480156127515750612750816128e3565b5b15612791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278890613b24565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e306127b66119d8565b846040518463ffffffff1660e01b81526004016127d593929190613925565b600060405180830381600087803b1580156127ef57600080fd5b505af1158015612803573d6000803e3d6000fd5b505050505050565b6000848484846040516020016128249493929190613881565b604051602081830303815290604052805190602001209050949350505050565b60008160405160200161285791906138cf565b604051602081830303815290604052805190602001209050919050565b60008060008061288385612c01565b925092509250600186828585604051600081526020016040526040516128ac94939291906139e4565b6020604051602081039080840390855afa1580156128ce573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000609a600083815260200190815260200160002060040154609a600084815260200190815260200160002060030154119050919050565b600033905090565b61292b611738565b61296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296190613a64565b60405180910390fd5b6000606560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129ae61291b565b6040516129bb919061390a565b60405180910390a1565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a93611738565b15612ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aca90613b04565b60405180910390fd5b6001606560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b1761291b565b604051612b24919061390a565b60405180910390a1565b6000612b3930612c69565b15905090565b600060019054906101000a900460ff16612b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8590613ca4565b60405180910390fd5b612b96612c7c565b612b9e612ccd565b565b600060019054906101000a900460ff16612bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be690613ca4565b60405180910390fd5b612bf7612c7c565b612bff612d2e565b565b60008060006041845114612c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4190613cc4565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b600080823b905060008111915050919050565b600060019054906101000a900460ff16612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc290613ca4565b60405180910390fd5b565b600060019054906101000a900460ff16612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1390613ca4565b60405180910390fd5b612d2c612d2761291b565b6129c5565b565b600060019054906101000a900460ff16612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490613ca4565b60405180910390fd5b6000606560006101000a81548160ff021916908315150217905550565b6000612dad612da884613e58565b613e33565b905082815260208101848484011115612dc557600080fd5b612dd08482856140f4565b509392505050565b600081359050612de78161482a565b92915050565b600081519050612dfc8161482a565b92915050565b600081519050612e1181614841565b92915050565b600081359050612e2681614858565b92915050565b60008083601f840112612e3e57600080fd5b8235905067ffffffffffffffff811115612e5757600080fd5b602083019150836001820283011115612e6f57600080fd5b9250929050565b600082601f830112612e8757600080fd5b8135612e97848260208601612d9a565b91505092915050565b600060408284031215612eb257600080fd5b81905092915050565b600081359050612eca8161486f565b92915050565b600081359050612edf8161489d565b92915050565b600060208284031215612ef757600080fd5b6000612f0584828501612dd8565b91505092915050565b600060208284031215612f2057600080fd5b6000612f2e84828501612ded565b91505092915050565b600080600080600060808688031215612f4f57600080fd5b6000612f5d88828901612dd8565b9550506020612f6e88828901612dd8565b9450506040612f7f88828901612ebb565b935050606086013567ffffffffffffffff811115612f9c57600080fd5b612fa888828901612e2c565b92509250509295509295909350565b60008060408385031215612fca57600080fd5b6000612fd885828601612dd8565b9250506020612fe985828601612ebb565b9150509250929050565b6000806000806080858703121561300957600080fd5b600061301787828801612dd8565b945050602061302887828801612ebb565b935050604061303987828801612ebb565b925050606061304a87828801612ebb565b91505092959194509250565b60008060008060008060c0878903121561306f57600080fd5b600061307d89828a01612dd8565b965050602061308e89828a01612ebb565b955050604061309f89828a01612ebb565b94505060606130b089828a01612ebb565b93505060806130c189828a01612dd8565b92505060a087013567ffffffffffffffff8111156130de57600080fd5b6130ea89828a01612e76565b9150509295509295509295565b60006020828403121561310957600080fd5b600061311784828501612e02565b91505092915050565b60006020828403121561313257600080fd5b600061314084828501612e17565b91505092915050565b60006020828403121561315b57600080fd5b600061316984828501612ebb565b91505092915050565b60008060006060848603121561318757600080fd5b600061319586828701612ebb565b935050602084013567ffffffffffffffff8111156131b257600080fd5b6131be86828701612e76565b92505060406131cf86828701612ed0565b9150509250925092565b600080606083850312156131ec57600080fd5b60006131fa85828601612ebb565b925050602061320b85828601612ea0565b9150509250929050565b60008060008060008060c0878903121561322e57600080fd5b600061323c89828a01612ebb565b965050602061324d89828a01612ebb565b955050604061325e89828a01612ebb565b945050606061326f89828a01612ebb565b935050608061328089828a01612ebb565b92505060a087013567ffffffffffffffff81111561329d57600080fd5b6132a989828a01612e76565b9150509295509295509295565b6132bf81614038565b82525050565b6132ce81614038565b82525050565b6132e56132e082614038565b6141e2565b82525050565b6132f48161404a565b82525050565b61330381614056565b82525050565b61331a61331582614056565b6141f4565b82525050565b61332981614060565b82525050565b600061333c601583613e94565b915061334782614319565b602082019050919050565b600061335f601483613e94565b915061336a82614342565b602082019050919050565b6000613382601c83613ea5565b915061338d8261436b565b601c82019050919050565b60006133a5602683613e94565b91506133b082614394565b604082019050919050565b60006133c8601d83613e94565b91506133d3826143e3565b602082019050919050565b60006133eb601d83613e94565b91506133f68261440c565b602082019050919050565b600061340e602b83613e94565b915061341982614435565b604082019050919050565b6000613431601083613e94565b915061343c82614484565b602082019050919050565b6000613454600b83613e94565b915061345f826144ad565b602082019050919050565b6000613477601183613e94565b9150613482826144d6565b602082019050919050565b600061349a602e83613e94565b91506134a5826144ff565b604082019050919050565b60006134bd601683613e94565b91506134c88261454e565b602082019050919050565b60006134e0601183613e94565b91506134eb82614577565b602082019050919050565b6000613503602083613e94565b915061350e826145a0565b602082019050919050565b6000613526602b83613e94565b9150613531826145c9565b604082019050919050565b6000613549602783613e94565b915061355482614618565b604082019050919050565b600061356c601083613e94565b915061357782614667565b602082019050919050565b600061358f601e83613e94565b915061359a82614690565b602082019050919050565b60006135b2600083613e89565b91506135bd826146b9565b600082019050919050565b60006135d5600883613e94565b91506135e0826146bc565b602082019050919050565b60006135f8601983613e94565b9150613603826146e5565b602082019050919050565b600061361b602b83613e94565b91506136268261470e565b604082019050919050565b600061363e601883613e94565b91506136498261475d565b602082019050919050565b6101208201600082015161366b600085018261381f565b50602082015161367e602085018261381f565b5060408201516136916040850182613854565b5060608201516136a46060850182613854565b5060808201516136b7608085018261381f565b5060a08201516136ca60a085018261381f565b5060c08201516136dd60c085018261381f565b5060e08201516136f060e085018261381f565b506101008201516137056101008501826132b6565b50505050565b6101208201600080830154905061372181614163565b61372e600086018261381f565b506001830154905061373f81614163565b61374c602086018261381f565b506002830154905061375d8161417d565b61376a6040860182613854565b5061377481614197565b6137816060860182613854565b506003830154905061379281614163565b61379f608086018261381f565b50600483015490506137b081614163565b6137bd60a086018261381f565b50600583015490506137ce81614163565b6137db60c086018261381f565b50600683015490506137ec81614163565b6137f960e086018261381f565b506007830154905061380a81614149565b6138186101008601826132b6565b5050505050565b613828816140bb565b82525050565b613837816140bb565b82525050565b61384e613849826140bb565b614210565b82525050565b61385d816140c5565b82525050565b61386c816140c5565b82525050565b61387b816140d5565b82525050565b600061388d82876132d4565b60148201915061389d828661383d565b6020820191506138ad828561383d565b6020820191506138bd828461383d565b60208201915081905095945050505050565b60006138da82613375565b91506138e68284613309565b60208201915081905092915050565b6000613900826135a5565b9150819050919050565b600060208201905061391f60008301846132c5565b92915050565b600060608201905061393a60008301866132c5565b61394760208301856132c5565b613954604083018461382e565b949350505050565b600060408201905061397160008301856132c5565b61397e602083018461382e565b9392505050565b600060208201905061399a60008301846132eb565b92915050565b60006040820190506139b560008301856132eb565b6139c2602083018461382e565b9392505050565b60006020820190506139de60008301846132fa565b92915050565b60006080820190506139f960008301876132fa565b613a066020830186613872565b613a1360408301856132fa565b613a2060608301846132fa565b95945050505050565b6000602082019050613a3e6000830184613320565b92915050565b60006020820190508181036000830152613a5d8161332f565b9050919050565b60006020820190508181036000830152613a7d81613352565b9050919050565b60006020820190508181036000830152613a9d81613398565b9050919050565b60006020820190508181036000830152613abd816133bb565b9050919050565b60006020820190508181036000830152613add816133de565b9050919050565b60006020820190508181036000830152613afd81613401565b9050919050565b60006020820190508181036000830152613b1d81613424565b9050919050565b60006020820190508181036000830152613b3d81613447565b9050919050565b60006020820190508181036000830152613b5d8161346a565b9050919050565b60006020820190508181036000830152613b7d8161348d565b9050919050565b60006020820190508181036000830152613b9d816134b0565b9050919050565b60006020820190508181036000830152613bbd816134d3565b9050919050565b60006020820190508181036000830152613bdd816134f6565b9050919050565b60006020820190508181036000830152613bfd81613519565b9050919050565b60006020820190508181036000830152613c1d8161353c565b9050919050565b60006020820190508181036000830152613c3d8161355f565b9050919050565b60006020820190508181036000830152613c5d81613582565b9050919050565b60006020820190508181036000830152613c7d816135c8565b9050919050565b60006020820190508181036000830152613c9d816135eb565b9050919050565b60006020820190508181036000830152613cbd8161360e565b9050919050565b60006020820190508181036000830152613cdd81613631565b9050919050565b600061024082019050613cfa6000830185613654565b613d0861012083018461370b565b9392505050565b600061012082019050613d25600083018461370b565b92915050565b6000602082019050613d40600083018461382e565b92915050565b6000606082019050613d5b600083018661382e565b613d6860208301856132c5565b613d75604083018461382e565b949350505050565b600061012082019050613d93600083018c61382e565b613da0602083018b61382e565b613dad604083018a613863565b613dba6060830189613863565b613dc7608083018861382e565b613dd460a083018761382e565b613de160c083018661382e565b613dee60e083018561382e565b613dfc6101008301846132c5565b9a9950505050505050505050565b6000604082019050613e1f6000830185613863565b613e2c6020830184613863565b9392505050565b6000613e3d613e4e565b9050613e4982826141b1565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7357613e72614278565b5b613e7c826142c7565b9050602081019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ebb826140ac565b9150613ec6836140ac565b92508262ffffff03821115613ede57613edd61421a565b5b828201905092915050565b6000613ef4826140bb565b9150613eff836140bb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3457613f3361421a565b5b828201905092915050565b6000613f4a826140bb565b9150613f55836140bb565b925082613f6557613f64614249565b5b828204905092915050565b6000613f7b826140bb565b9150613f86836140bb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fbf57613fbe61421a565b5b828202905092915050565b6000613fd5826140bb565b9150613fe0836140bb565b925082821015613ff357613ff261421a565b5b828203905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60006140438261408c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006140ed826140c5565b9050919050565b82818337600083830152505050565b600081016000830180614115816142b1565b905061412181846147e4565b505050600081016020830180614136816142b1565b90506141428184614807565b5050505050565b600061415c614157836142ff565b613ffe565b9050919050565b6000614176614171836142ff565b61401e565b9050919050565b600061419061418b836142ff565b614028565b9050919050565b60006141aa6141a58361430c565b614028565b9050919050565b6141ba826142c7565b810181811067ffffffffffffffff821117156141d9576141d8614278565b5b80604052505050565b60006141ed826141fe565b9050919050565b6000819050919050565b6000614209826142f2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b600081356142be81614886565b80915050919050565b6000601f19601f8301169050919050565b60008160001b9050919050565b60008160201b9050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160201c9050919050565b7f4e465420616c726561647920686173206c6f616e210000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6e667420646f6573206e6f74206861766520616374697665206c6f616e000000600082015250565b7f4e465420646f6573206e6f74206861766520616374697665206c6f616e000000600082015250565b7f5369676e617475726556657269666965723a2066616b65207369676e6174757260008201527f652070726f766964656421000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6e6f20737465616c696e67000000000000000000000000000000000000000000600082015250565b7f63616e6e6f742073656e64206574686572000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4475726174696f6e206e6f7420737570706f7274656400000000000000000000600082015250565b7f56616c756174696f6e2065787069726564000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5369676e617475726556657269666965723a2066616b652076616c756174696f60008201527f6e2070726f766964656421000000000000000000000000000000000000000000602082015250565b7f636f756c642062652077697468647261776e207573696e67207769746864726160008201527f7745524337323100000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d6f6e657900000000000000000000000000000000600082015250565b7f43616e277420626f72726f77206d6f7265207468616e206d6178204c54560000600082015250565b50565b7f537465616c657221000000000000000000000000000000000000000000000000600082015250565b7f63616e2774206c69717569646174652074686973206c6f616e00000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b600063ffffffff614796846142d8565b9350801983169250808416831791505092915050565b600067ffffffff000000006147c0846142e5565b9350801983169250808416831791505092915050565b6147e08282614103565b5050565b6147ed826140e2565b6148006147f9826142a7565b8354614786565b8255505050565b614810826140e2565b61482361481c826142a7565b83546147ac565b8255505050565b61483381614038565b811461483e57600080fd5b50565b61484a8161404a565b811461485557600080fd5b50565b61486181614056565b811461486c57600080fd5b50565b614878816140bb565b811461488357600080fd5b50565b61488f816140c5565b811461489a57600080fd5b50565b6148a6816140d5565b81146148b157600080fd5b5056fea26469706673582212209e81baf7dbe876dd29f6cefadac0597d6c699355ee86977f027e322e42e03a7b64736f6c63430008030033
Deployed Bytecode
0x6080604052600436106101855760003560e01c8063874a0e73116100d1578063c6600e9a1161008a578063f2fde38b11610064578063f2fde38b1461055e578063f3e414f814610587578063f440be04146105b0578063fa540801146105ed5761018c565b8063c6600e9a146104e3578063cad0f9141461050c578063ccdd9f5d146105355761018c565b8063874a0e73146103b95780638da5cb5b146103f657806394bfd7b014610421578063a1db97821461044c578063bd5c569b14610475578063c4d66de8146104ba5761018c565b80633f4ba83a1161013e578063562f2f1a11610118578063562f2f1a146103375780635c975abb14610360578063715018a61461038b5780638456cb59146103a25761018c565b80633f4ba83a146102b95780634b5f01bf146102d05780634fa22448146102f95761018c565b80630f3f9bbf14610191578063150b7a02146101ce5780631e7d92571461020b5780632247463e146102495780632e1a7d4d146102655780633e22c0081461028e5761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101b860048036038101906101b39190613056565b61062a565b6040516101c59190613985565b60405180910390f35b3480156101da57600080fd5b506101f560048036038101906101f09190612f37565b61068e565b6040516102029190613a29565b60405180910390f35b34801561021757600080fd5b50610232600480360381019061022d9190613149565b6106bc565b6040516102409291906139a0565b60405180910390f35b610263600480360381019061025e9190613149565b610745565b005b34801561027157600080fd5b5061028c60048036038101906102879190613149565b610d63565b005b34801561029a57600080fd5b506102a3610e96565b6040516102b0919061390a565b60405180910390f35b3480156102c557600080fd5b506102ce610ebc565b005b3480156102dc57600080fd5b506102f760048036038101906102f29190612ee5565b610f42565b005b34801561030557600080fd5b50610320600480360381019061031b9190613149565b611002565b60405161032e929190613e0a565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190613215565b611046565b005b34801561036c57600080fd5b50610375611738565b6040516103829190613985565b60405180910390f35b34801561039757600080fd5b506103a061174f565b005b3480156103ae57600080fd5b506103b76117d7565b005b3480156103c557600080fd5b506103e060048036038101906103db9190613149565b61185d565b6040516103ed9190613d2b565b60405180910390f35b34801561040257600080fd5b5061040b6119d8565b604051610418919061390a565b60405180910390f35b34801561042d57600080fd5b50610436611a02565b604051610443919061390a565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612fb7565b611a28565b005b34801561048157600080fd5b5061049c60048036038101906104979190613149565b611b3d565b6040516104b199989796959493929190613d7d565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190612ee5565b611bcb565b005b3480156104ef57600080fd5b5061050a600480360381019061050591906131d9565b611d01565b005b34801561051857600080fd5b50610533600480360381019061052e9190613172565b611da4565b005b34801561054157600080fd5b5061055c60048036038101906105579190613149565b612103565b005b34801561056a57600080fd5b5061058560048036038101906105809190612ee5565b61257b565b005b34801561059357600080fd5b506105ae60048036038101906105a99190612fb7565b612673565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190612ff3565b61280b565b6040516105e491906139c9565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190613120565b612844565b60405161062191906139c9565b60405180910390f35b6000806106398888888861280b565b9050600061064682612844565b90508473ffffffffffffffffffffffffffffffffffffffff166106698286612874565b73ffffffffffffffffffffffffffffffffffffffff1614925050509695505050505050565b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b6000806106c8836128e3565b610707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fe90613aa4565b60405180910390fd5b6000609a60008581526020019081526020016000206001015442118015610736575060006107348561185d565b115b90508060009250925050915091565b61074d611738565b1561078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078490613b04565b60405180910390fd5b610796816128e3565b6107d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cc90613ac4565b60405180910390fd5b60003490506000609a60008481526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090506108e48361185d565b8210610ab85760006108f58461185d565b836109009190613fca565b905061090b8461185d565b9250609a600085815260200190815260200160002060030154609a600086815260200190815260200160002060040181905550609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30609a600088815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b81526004016109d393929190613925565b600060405180830381600087803b1580156109ed57600080fd5b505af1158015610a01573d6000803e3d6000fd5b5050505060003373ffffffffffffffffffffffffffffffffffffffff1682604051610a2b906138f5565b60006040518083038185875af1925050503d8060008114610a68576040519150601f19603f3d011682016040523d82523d6000602084013e610a6d565b606091505b5050905080610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa890613b44565b60405180910390fd5b5050610c8c565b6402540be400609a600085815260200190815260200160002060020160009054906101000a900463ffffffff1663ffffffff16609a600086815260200190815260200160002060040154609a600087815260200190815260200160002060030154610b239190613fca565b609a60008781526020019081526020016000206000015443610b459190613fca565b610b4f9190613f70565b610b599190613f70565b610b639190613f3f565b609a60008581526020019081526020016000206005016000828254610b889190613ee9565b925050819055506000609a600085815260200190815260200160002060060154609a600086815260200190815260200160002060050154610bc99190613fca565b905080831115610c4157609a600085815260200190815260200160002060050154609a6000868152602001908152602001600020600601819055508083610c109190613fca565b609a60008681526020019081526020016000206004016000828254610c359190613ee9565b92505081905550610c6f565b82609a60008681526020019081526020016000206006016000828254610c679190613ee9565b925050819055505b43609a600086815260200190815260200160002060000181905550505b82609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16609a600086815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb7faaf58a53a3a4bdfdd90dff44b713036c882f23772663c180bf72866f44c1c84609a6000898152602001908152602001600020604051610d56929190613ce4565b60405180910390a4505050565b610d6b61291b565b73ffffffffffffffffffffffffffffffffffffffff16610d896119d8565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690613bc4565b60405180910390fd5b6000610de96119d8565b73ffffffffffffffffffffffffffffffffffffffff1682604051610e0c906138f5565b60006040518083038185875af1925050503d8060008114610e49576040519150601f19603f3d011682016040523d82523d6000602084013e610e4e565b606091505b5050905080610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613b44565b60405180910390fd5b5050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ec461291b565b73ffffffffffffffffffffffffffffffffffffffff16610ee26119d8565b73ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613bc4565b60405180910390fd5b610f40612923565b565b610f4a61291b565b73ffffffffffffffffffffffffffffffffffffffff16610f686119d8565b73ffffffffffffffffffffffffffffffffffffffff1614610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613bc4565b60405180910390fd5b80609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60996020528060005260406000206000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16905082565b61104e611738565b1561108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590613b04565b60405180910390fd5b6110e0609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868886609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168661062a565b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690613be4565b60405180910390fd5b611128856128e3565b15611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613a44565b60405180910390fd5b60006099600086815260200190815260200160002060000160049054906101000a900463ffffffff16905060008163ffffffff16116111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613b84565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b815260040161124e9190613d2b565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190612f0e565b73ffffffffffffffffffffffffffffffffffffffff16146112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90613c64565b60405180910390fd5b834310611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90613ba4565b60405180910390fd5b6127108163ffffffff168861134b9190613f70565b6113559190613f3f565b831115611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e90613c44565b60405180910390fd5b4783106113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090613c24565b60405180910390fd5b60405180610120016040528043815260200186426113f79190613ee9565b81526020016099600088815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1681526020018263ffffffff1681526020018481526020016000815260200160008152602001600081526020013373ffffffffffffffffffffffffffffffffffffffff16815250609a6000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055506080820151816003015560a0820151816004015560c0820151816005015560e082015181600601556101008201518160070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505085609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f872dc93aead2083e073cc885fd9a73e19b414626890d68c6251f12ba51f8a3bd609a60008b81526020019081526020016000206040516115e99190613d0f565b60405180910390a4609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b815260040161165093929190613925565b600060405180830381600087803b15801561166a57600080fd5b505af115801561167e573d6000803e3d6000fd5b5050505060003373ffffffffffffffffffffffffffffffffffffffff16846040516116a8906138f5565b60006040518083038185875af1925050503d80600081146116e5576040519150601f19603f3d011682016040523d82523d6000602084013e6116ea565b606091505b505090508061172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590613b44565b60405180910390fd5b5050505050505050565b6000606560009054906101000a900460ff16905090565b61175761291b565b73ffffffffffffffffffffffffffffffffffffffff166117756119d8565b73ffffffffffffffffffffffffffffffffffffffff16146117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613bc4565b60405180910390fd5b6117d560006129c5565b565b6117df61291b565b73ffffffffffffffffffffffffffffffffffffffff166117fd6119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613bc4565b60405180910390fd5b61185b612a8b565b565b6000609a600083815260200190815260200160002060040154609a6000848152602001908152602001600020600301541161189b57600090506119d3565b60006402540be400609a600085815260200190815260200160002060020160009054906101000a900463ffffffff1663ffffffff16609a600086815260200190815260200160002060040154609a6000878152602001908152602001600020600301546119089190613fca565b609a6000878152602001908152602001600020600001544361192a9190613fca565b6119349190613f70565b61193e9190613f70565b6119489190613f3f565b905080609a600085815260200190815260200160002060060154609a6000868152602001908152602001600020600501546119839190613fca565b609a600086815260200190815260200160002060040154609a6000878152602001908152602001600020600301546119bb9190613fca565b6119c59190613ee9565b6119cf9190613ee9565b9150505b919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a3061291b565b73ffffffffffffffffffffffffffffffffffffffff16611a4e6119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9b90613bc4565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611ac86119d8565b836040518363ffffffff1660e01b8152600401611ae692919061395c565b602060405180830381600087803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3891906130f7565b505050565b609a6020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900463ffffffff16908060020160049054906101000a900463ffffffff16908060030154908060040154908060050154908060060154908060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b600060019054906101000a900460ff16611bf35760008054906101000a900460ff1615611bfc565b611bfb612b2e565b5b611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3290613b64565b60405180910390fd5b60008060019054906101000a900460ff161590508015611c8b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b611c93612b3f565b611c9b612ba0565b81609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508015611cfd5760008060016101000a81548160ff0219169083151502179055505b5050565b611d0961291b565b73ffffffffffffffffffffffffffffffffffffffff16611d276119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613bc4565b60405180910390fd5b80609960008481526020019081526020016000208181611d9d91906147d6565b9050505050565b611dac611738565b611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290613a64565b60405180910390fd5b611df361291b565b73ffffffffffffffffffffffffffffffffffffffff16611e116119d8565b73ffffffffffffffffffffffffffffffffffffffff1614611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90613bc4565b60405180910390fd5b611e70836128e3565b611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690613c04565b60405180910390fd5b611f41609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848360ff166203a528611ee89190613eb0565b62ffffff168460ff166203a528611eff9190613eb0565b62ffffff16609a600089815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168761062a565b611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790613ae4565b60405180910390fd5b60018160ff16141561202957609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30611fd36119d8565b866040518463ffffffff1660e01b8152600401611ff293929190613925565b600060405180830381600087803b15801561200c57600080fd5b505af1158015612020573d6000803e3d6000fd5b505050506120fe565b60008160ff1614156120fd57609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30609a600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b81526004016120ca93929190613925565b600060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b505050505b5b505050565b61210b61291b565b73ffffffffffffffffffffffffffffffffffffffff166121296119d8565b73ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217690613bc4565b60405180910390fd5b612188816128e3565b6121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be90613aa4565b60405180910390fd5b6000806121d3836106bc565b9150915081612217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220e90613c84565b60405180910390fd5b6000609a60008581526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050609a600085815260200190815260200160002060030154609a60008681526020019081526020016000206004018190555083609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16609a600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f680ce85e4f810f64123666acc47e4075544c11a42dbed669dd30fbb7b0b83f0642338760405161240393929190613d46565b60405180910390a4609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e306124526119d8565b876040518463ffffffff1660e01b815260040161247193929190613925565b600060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b5050505083609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16609a600087815260200190815260200160002060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb7faaf58a53a3a4bdfdd90dff44b713036c882f23772663c180bf72866f44c1c84609a60008a815260200190815260200160002060405161256d929190613ce4565b60405180910390a450505050565b61258361291b565b73ffffffffffffffffffffffffffffffffffffffff166125a16119d8565b73ffffffffffffffffffffffffffffffffffffffff16146125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613bc4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90613a84565b60405180910390fd5b612670816129c5565b50565b61267b61291b565b73ffffffffffffffffffffffffffffffffffffffff166126996119d8565b73ffffffffffffffffffffffffffffffffffffffff16146126ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e690613bc4565b60405180910390fd5b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480156127515750612750816128e3565b5b15612791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278890613b24565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e306127b66119d8565b846040518463ffffffff1660e01b81526004016127d593929190613925565b600060405180830381600087803b1580156127ef57600080fd5b505af1158015612803573d6000803e3d6000fd5b505050505050565b6000848484846040516020016128249493929190613881565b604051602081830303815290604052805190602001209050949350505050565b60008160405160200161285791906138cf565b604051602081830303815290604052805190602001209050919050565b60008060008061288385612c01565b925092509250600186828585604051600081526020016040526040516128ac94939291906139e4565b6020604051602081039080840390855afa1580156128ce573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000609a600083815260200190815260200160002060040154609a600084815260200190815260200160002060030154119050919050565b600033905090565b61292b611738565b61296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296190613a64565b60405180910390fd5b6000606560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129ae61291b565b6040516129bb919061390a565b60405180910390a1565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a93611738565b15612ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aca90613b04565b60405180910390fd5b6001606560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b1761291b565b604051612b24919061390a565b60405180910390a1565b6000612b3930612c69565b15905090565b600060019054906101000a900460ff16612b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8590613ca4565b60405180910390fd5b612b96612c7c565b612b9e612ccd565b565b600060019054906101000a900460ff16612bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be690613ca4565b60405180910390fd5b612bf7612c7c565b612bff612d2e565b565b60008060006041845114612c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4190613cc4565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b600080823b905060008111915050919050565b600060019054906101000a900460ff16612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc290613ca4565b60405180910390fd5b565b600060019054906101000a900460ff16612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1390613ca4565b60405180910390fd5b612d2c612d2761291b565b6129c5565b565b600060019054906101000a900460ff16612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490613ca4565b60405180910390fd5b6000606560006101000a81548160ff021916908315150217905550565b6000612dad612da884613e58565b613e33565b905082815260208101848484011115612dc557600080fd5b612dd08482856140f4565b509392505050565b600081359050612de78161482a565b92915050565b600081519050612dfc8161482a565b92915050565b600081519050612e1181614841565b92915050565b600081359050612e2681614858565b92915050565b60008083601f840112612e3e57600080fd5b8235905067ffffffffffffffff811115612e5757600080fd5b602083019150836001820283011115612e6f57600080fd5b9250929050565b600082601f830112612e8757600080fd5b8135612e97848260208601612d9a565b91505092915050565b600060408284031215612eb257600080fd5b81905092915050565b600081359050612eca8161486f565b92915050565b600081359050612edf8161489d565b92915050565b600060208284031215612ef757600080fd5b6000612f0584828501612dd8565b91505092915050565b600060208284031215612f2057600080fd5b6000612f2e84828501612ded565b91505092915050565b600080600080600060808688031215612f4f57600080fd5b6000612f5d88828901612dd8565b9550506020612f6e88828901612dd8565b9450506040612f7f88828901612ebb565b935050606086013567ffffffffffffffff811115612f9c57600080fd5b612fa888828901612e2c565b92509250509295509295909350565b60008060408385031215612fca57600080fd5b6000612fd885828601612dd8565b9250506020612fe985828601612ebb565b9150509250929050565b6000806000806080858703121561300957600080fd5b600061301787828801612dd8565b945050602061302887828801612ebb565b935050604061303987828801612ebb565b925050606061304a87828801612ebb565b91505092959194509250565b60008060008060008060c0878903121561306f57600080fd5b600061307d89828a01612dd8565b965050602061308e89828a01612ebb565b955050604061309f89828a01612ebb565b94505060606130b089828a01612ebb565b93505060806130c189828a01612dd8565b92505060a087013567ffffffffffffffff8111156130de57600080fd5b6130ea89828a01612e76565b9150509295509295509295565b60006020828403121561310957600080fd5b600061311784828501612e02565b91505092915050565b60006020828403121561313257600080fd5b600061314084828501612e17565b91505092915050565b60006020828403121561315b57600080fd5b600061316984828501612ebb565b91505092915050565b60008060006060848603121561318757600080fd5b600061319586828701612ebb565b935050602084013567ffffffffffffffff8111156131b257600080fd5b6131be86828701612e76565b92505060406131cf86828701612ed0565b9150509250925092565b600080606083850312156131ec57600080fd5b60006131fa85828601612ebb565b925050602061320b85828601612ea0565b9150509250929050565b60008060008060008060c0878903121561322e57600080fd5b600061323c89828a01612ebb565b965050602061324d89828a01612ebb565b955050604061325e89828a01612ebb565b945050606061326f89828a01612ebb565b935050608061328089828a01612ebb565b92505060a087013567ffffffffffffffff81111561329d57600080fd5b6132a989828a01612e76565b9150509295509295509295565b6132bf81614038565b82525050565b6132ce81614038565b82525050565b6132e56132e082614038565b6141e2565b82525050565b6132f48161404a565b82525050565b61330381614056565b82525050565b61331a61331582614056565b6141f4565b82525050565b61332981614060565b82525050565b600061333c601583613e94565b915061334782614319565b602082019050919050565b600061335f601483613e94565b915061336a82614342565b602082019050919050565b6000613382601c83613ea5565b915061338d8261436b565b601c82019050919050565b60006133a5602683613e94565b91506133b082614394565b604082019050919050565b60006133c8601d83613e94565b91506133d3826143e3565b602082019050919050565b60006133eb601d83613e94565b91506133f68261440c565b602082019050919050565b600061340e602b83613e94565b915061341982614435565b604082019050919050565b6000613431601083613e94565b915061343c82614484565b602082019050919050565b6000613454600b83613e94565b915061345f826144ad565b602082019050919050565b6000613477601183613e94565b9150613482826144d6565b602082019050919050565b600061349a602e83613e94565b91506134a5826144ff565b604082019050919050565b60006134bd601683613e94565b91506134c88261454e565b602082019050919050565b60006134e0601183613e94565b91506134eb82614577565b602082019050919050565b6000613503602083613e94565b915061350e826145a0565b602082019050919050565b6000613526602b83613e94565b9150613531826145c9565b604082019050919050565b6000613549602783613e94565b915061355482614618565b604082019050919050565b600061356c601083613e94565b915061357782614667565b602082019050919050565b600061358f601e83613e94565b915061359a82614690565b602082019050919050565b60006135b2600083613e89565b91506135bd826146b9565b600082019050919050565b60006135d5600883613e94565b91506135e0826146bc565b602082019050919050565b60006135f8601983613e94565b9150613603826146e5565b602082019050919050565b600061361b602b83613e94565b91506136268261470e565b604082019050919050565b600061363e601883613e94565b91506136498261475d565b602082019050919050565b6101208201600082015161366b600085018261381f565b50602082015161367e602085018261381f565b5060408201516136916040850182613854565b5060608201516136a46060850182613854565b5060808201516136b7608085018261381f565b5060a08201516136ca60a085018261381f565b5060c08201516136dd60c085018261381f565b5060e08201516136f060e085018261381f565b506101008201516137056101008501826132b6565b50505050565b6101208201600080830154905061372181614163565b61372e600086018261381f565b506001830154905061373f81614163565b61374c602086018261381f565b506002830154905061375d8161417d565b61376a6040860182613854565b5061377481614197565b6137816060860182613854565b506003830154905061379281614163565b61379f608086018261381f565b50600483015490506137b081614163565b6137bd60a086018261381f565b50600583015490506137ce81614163565b6137db60c086018261381f565b50600683015490506137ec81614163565b6137f960e086018261381f565b506007830154905061380a81614149565b6138186101008601826132b6565b5050505050565b613828816140bb565b82525050565b613837816140bb565b82525050565b61384e613849826140bb565b614210565b82525050565b61385d816140c5565b82525050565b61386c816140c5565b82525050565b61387b816140d5565b82525050565b600061388d82876132d4565b60148201915061389d828661383d565b6020820191506138ad828561383d565b6020820191506138bd828461383d565b60208201915081905095945050505050565b60006138da82613375565b91506138e68284613309565b60208201915081905092915050565b6000613900826135a5565b9150819050919050565b600060208201905061391f60008301846132c5565b92915050565b600060608201905061393a60008301866132c5565b61394760208301856132c5565b613954604083018461382e565b949350505050565b600060408201905061397160008301856132c5565b61397e602083018461382e565b9392505050565b600060208201905061399a60008301846132eb565b92915050565b60006040820190506139b560008301856132eb565b6139c2602083018461382e565b9392505050565b60006020820190506139de60008301846132fa565b92915050565b60006080820190506139f960008301876132fa565b613a066020830186613872565b613a1360408301856132fa565b613a2060608301846132fa565b95945050505050565b6000602082019050613a3e6000830184613320565b92915050565b60006020820190508181036000830152613a5d8161332f565b9050919050565b60006020820190508181036000830152613a7d81613352565b9050919050565b60006020820190508181036000830152613a9d81613398565b9050919050565b60006020820190508181036000830152613abd816133bb565b9050919050565b60006020820190508181036000830152613add816133de565b9050919050565b60006020820190508181036000830152613afd81613401565b9050919050565b60006020820190508181036000830152613b1d81613424565b9050919050565b60006020820190508181036000830152613b3d81613447565b9050919050565b60006020820190508181036000830152613b5d8161346a565b9050919050565b60006020820190508181036000830152613b7d8161348d565b9050919050565b60006020820190508181036000830152613b9d816134b0565b9050919050565b60006020820190508181036000830152613bbd816134d3565b9050919050565b60006020820190508181036000830152613bdd816134f6565b9050919050565b60006020820190508181036000830152613bfd81613519565b9050919050565b60006020820190508181036000830152613c1d8161353c565b9050919050565b60006020820190508181036000830152613c3d8161355f565b9050919050565b60006020820190508181036000830152613c5d81613582565b9050919050565b60006020820190508181036000830152613c7d816135c8565b9050919050565b60006020820190508181036000830152613c9d816135eb565b9050919050565b60006020820190508181036000830152613cbd8161360e565b9050919050565b60006020820190508181036000830152613cdd81613631565b9050919050565b600061024082019050613cfa6000830185613654565b613d0861012083018461370b565b9392505050565b600061012082019050613d25600083018461370b565b92915050565b6000602082019050613d40600083018461382e565b92915050565b6000606082019050613d5b600083018661382e565b613d6860208301856132c5565b613d75604083018461382e565b949350505050565b600061012082019050613d93600083018c61382e565b613da0602083018b61382e565b613dad604083018a613863565b613dba6060830189613863565b613dc7608083018861382e565b613dd460a083018761382e565b613de160c083018661382e565b613dee60e083018561382e565b613dfc6101008301846132c5565b9a9950505050505050505050565b6000604082019050613e1f6000830185613863565b613e2c6020830184613863565b9392505050565b6000613e3d613e4e565b9050613e4982826141b1565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7357613e72614278565b5b613e7c826142c7565b9050602081019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ebb826140ac565b9150613ec6836140ac565b92508262ffffff03821115613ede57613edd61421a565b5b828201905092915050565b6000613ef4826140bb565b9150613eff836140bb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3457613f3361421a565b5b828201905092915050565b6000613f4a826140bb565b9150613f55836140bb565b925082613f6557613f64614249565b5b828204905092915050565b6000613f7b826140bb565b9150613f86836140bb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fbf57613fbe61421a565b5b828202905092915050565b6000613fd5826140bb565b9150613fe0836140bb565b925082821015613ff357613ff261421a565b5b828203905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60006140438261408c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006140ed826140c5565b9050919050565b82818337600083830152505050565b600081016000830180614115816142b1565b905061412181846147e4565b505050600081016020830180614136816142b1565b90506141428184614807565b5050505050565b600061415c614157836142ff565b613ffe565b9050919050565b6000614176614171836142ff565b61401e565b9050919050565b600061419061418b836142ff565b614028565b9050919050565b60006141aa6141a58361430c565b614028565b9050919050565b6141ba826142c7565b810181811067ffffffffffffffff821117156141d9576141d8614278565b5b80604052505050565b60006141ed826141fe565b9050919050565b6000819050919050565b6000614209826142f2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b600081356142be81614886565b80915050919050565b6000601f19601f8301169050919050565b60008160001b9050919050565b60008160201b9050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160201c9050919050565b7f4e465420616c726561647920686173206c6f616e210000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6e667420646f6573206e6f74206861766520616374697665206c6f616e000000600082015250565b7f4e465420646f6573206e6f74206861766520616374697665206c6f616e000000600082015250565b7f5369676e617475726556657269666965723a2066616b65207369676e6174757260008201527f652070726f766964656421000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6e6f20737465616c696e67000000000000000000000000000000000000000000600082015250565b7f63616e6e6f742073656e64206574686572000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4475726174696f6e206e6f7420737570706f7274656400000000000000000000600082015250565b7f56616c756174696f6e2065787069726564000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5369676e617475726556657269666965723a2066616b652076616c756174696f60008201527f6e2070726f766964656421000000000000000000000000000000000000000000602082015250565b7f636f756c642062652077697468647261776e207573696e67207769746864726160008201527f7745524337323100000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d6f6e657900000000000000000000000000000000600082015250565b7f43616e277420626f72726f77206d6f7265207468616e206d6178204c54560000600082015250565b50565b7f537465616c657221000000000000000000000000000000000000000000000000600082015250565b7f63616e2774206c69717569646174652074686973206c6f616e00000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b600063ffffffff614796846142d8565b9350801983169250808416831791505092915050565b600067ffffffff000000006147c0846142e5565b9350801983169250808416831791505092915050565b6147e08282614103565b5050565b6147ed826140e2565b6148006147f9826142a7565b8354614786565b8255505050565b614810826140e2565b61482361481c826142a7565b83546147ac565b8255505050565b61483381614038565b811461483e57600080fd5b50565b61484a8161404a565b811461485557600080fd5b50565b61486181614056565b811461486c57600080fd5b50565b614878816140bb565b811461488357600080fd5b50565b61488f816140c5565b811461489a57600080fd5b50565b6148a6816140d5565b81146148b157600080fd5b5056fea26469706673582212209e81baf7dbe876dd29f6cefadac0597d6c699355ee86977f027e322e42e03a7b64736f6c63430008030033
Deployed Bytecode Sourcemap
30528:10963:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28787:455;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30671:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33831:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;36310:2302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39835:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31036:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31913:63;;;;;;;;;;;;;:::i;:::-;;31715:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31235:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;34220:1941;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25241:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23005:103;;;;;;;;;;;;;:::i;:::-;;31846:59;;;;;;;;;;;;;:::i;:::-;;33167:656;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22354:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31076:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40011:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32364:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;31346:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31538:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40569:919;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38790:913;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23263:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40154:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27228:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27973:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28787:455;28988:4;29005:19;29027:52;29042:3;29046:6;29054:9;29065:13;29027:14;:52::i;:::-;29005:74;;29090:28;29121:36;29145:11;29121:23;:36::i;:::-;29090:67;;29227:7;29177:57;;:46;29191:20;29213:9;29177:13;:46::i;:::-;:57;;;29170:64;;;;28787:455;;;;;;;;:::o;30671:316::-;30840:6;30904:60;30859:120;;30671:316;;;;;;;:::o;33831:336::-;33919:4;33925:7;33958:17;33969:5;33958:10;:17::i;:::-;33950:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;34020:14;34055:6;:13;34062:5;34055:13;;;;;;;;;;;:33;;;34037:15;:51;:90;;;;;34126:1;34105:18;34117:5;34105:11;:18::i;:::-;:22;34037:90;34020:107;;34146:9;34157:1;34138:21;;;;;33831:336;;;:::o;36310:2302::-;25567:8;:6;:8::i;:::-;25566:9;25558:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36391:17:::1;36402:5;36391:10;:17::i;:::-;36383:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;36453:19;36475:9;36453:31;;36495:29;36527:6;:13;36534:5;36527:13;;;;;;;;;;;36495:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;36660:18;36672:5;36660:11;:18::i;:::-;36645:11;:33;36641:1774;;36695:23;36735:18;36747:5;36735:11;:18::i;:::-;36721:11;:32;;;;:::i;:::-;36695:58;;36782:18;36794:5;36782:11;:18::i;:::-;36768:32;;36982:6;:13;36989:5;36982:13;;;;;;;;;;;:25;;;36954:6;:13;36961:5;36954:13;;;;;;;;;;;:25;;:53;;;;37114:20;;;;;;;;;;;37106:42;;;37175:4;37199:6;:13;37206:5;37199:13;;;;;;;;;;;:22;;;;;;;;;;;;37240:5;37106:154;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37276:12;37294:10;:15;;37317;37294:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37275:62;;;37360:7;37352:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;36641:1774;;;;;37794:11;37735:6;:13;37742:5;37735:13;;;;;;;;;;;:38;;;;;;;;;;;;37587:186;;37685:6;:13;37692:5;37685:13;;;;;;;;;;;:25;;;37657:6;:13;37664:5;37657:13;;;;;;;;;;;:25;;;:53;;;;:::i;:::-;37603:6;:13;37610:5;37603:13;;;;;;;;;;;:28;;;37588:12;:43;;;;:::i;:::-;37587:124;;;;:::i;:::-;:186;;;;:::i;:::-;37586:219;;;;:::i;:::-;37533:6;:13;37540:5;37533:13;;;;;;;;;;;:32;;;:272;;;;;;;:::i;:::-;;;;;;;;37820:27;37902:6;:13;37909:5;37902:13;;;;;;;;;;;:31;;;37850:6;:13;37857:5;37850:13;;;;;;;;;;;:32;;;:83;;;;:::i;:::-;37820:113;;37966:19;37952:11;:33;37948:353;;;38040:6;:13;38047:5;38040:13;;;;;;;;;;;:54;;;38006:6;:13;38013:5;38006:13;;;;;;;;;;;:31;;:88;;;;38178:19;38143:11;:54;;;;:::i;:::-;38113:6;:13;38120:5;38113:13;;;;;;;;;;;:25;;;:85;;;;;;;:::i;:::-;;;;;;;;37948:353;;;38274:11;38239:6;:13;38246:5;38239:13;;;;;;;;;;;:31;;;:46;;;;;;;:::i;:::-;;;;;;;;37948:353;38391:12;38360:6;:13;38367:5;38360:13;;;;;;;;;;;:28;;:43;;;;36641:1774;;38533:5;38498:20;;;;;;;;;;;38430:174;;38461:6;:13;38468:5;38461:13;;;;;;;;;;;:22;;;;;;;;;;;;38430:174;;;38553:12;38580:6;:13;38587:5;38580:13;;;;;;;;;;;38430:174;;;;;;;:::i;:::-;;;;;;;;25607:1;;36310:2302:::0;:::o;39835:168::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39898:12:::1;39916:7;:5;:7::i;:::-;:12;;39936:6;39916:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39897:50;;;39966:7;39958:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;22645:1;39835:168:::0;:::o;31036:31::-;;;;;;;;;;;;;:::o;31913:63::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31958:10:::1;:8;:10::i;:::-;31913:63::o:0;31715:123::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31815:15:::1;31796:16;;:34;;;;;;;;;;;;;;;;;;31715:123:::0;:::o;31235:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34220:1941::-;25567:8;:6;:8::i;:::-;25566:9;25558:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;34485:207:::1;34510:20;;;;;;;;;;;34549:5;34573:9;34601:13;34633:16;;;;;;;;;;;34668:9;34485:6;:207::i;:::-;34463:300;;;;;;;;;;;;:::i;:::-;;;;;;;;;34783:17;34794:5;34783:10;:17::i;:::-;34782:18;34774:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;34837:16;34856:25;:46;34882:19;34856:46;;;;;;;;;;;:80;;;;;;;;;;;;34837:99;;34967:1;34955:9;:13;;;34947:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;35076:10;35028:58;;35036:20;;;;;;;;;;;35028:37;;;35066:5;35028:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;35006:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;35156:13;35141:12;:28;35133:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35265:6;35252:9;35240:21;;:9;:21;;;;:::i;:::-;35239:32;;;;:::i;:::-;35224:11;:47;;35202:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;35362:21;35348:11;:35;35340:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35441:308;;;;;;;;35465:12;35441:308;;;;35510:19;35492:15;:37;;;;:::i;:::-;35441:308;;;;35544:25;:46;35570:19;35544:46;;;;;;;;;;;:71;;;;;;;;;;;;35441:308;;;;;;35630:9;35441:308;;;;;;35654:11;35441:308;;;;35680:1;35441:308;;;;35696:1;35441:308;;;;35712:1;35441:308;;;;35728:10;35441:308;;;;::::0;35425:6:::1;:13;35432:5;35425:13;;;;;;;;;;;:324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35853:5;35818:20;;;;;;;;;;;35765:132;;35793:10;35765:132;;;35873:6;:13;35880:5;35873:13;;;;;;;;;;;35765:132;;;;;;:::i;:::-;;;;;;;;35916:20;;;;;;;;;;;35908:42;;;35965:10;35998:4;36018:5;35908:126;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36048:12;36066:10;:15;;36089:11;36066:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36047:58;;;36124:7;36116:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;25607:1;;34220:1941:::0;;;;;;:::o;25241:86::-;25288:4;25312:7;;;;;;;;;;;25305:14;;25241:86;:::o;23005:103::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23070:30:::1;23097:1;23070:18;:30::i;:::-;23005:103::o:0;31846:59::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31889:8:::1;:6;:8::i;:::-;31846:59::o:0;33167:656::-;33224:7;33314:6;:13;33321:5;33314:13;;;;;;;;;;;:25;;;33285:6;:13;33292:5;33285:13;;;;;;;;;;;:25;;;:54;33281:68;;33348:1;33341:8;;;;33281:68;33360:29;33580:11;33538:6;:13;33545:5;33538:13;;;;;;;;;;;:38;;;;;;;;;;;;33393:183;;33496:6;:13;33503:5;33496:13;;;;;;;;;;;:25;;;33468:6;:13;33475:5;33468:13;;;;;;;;;;;:25;;;:53;;;;:::i;:::-;33422:6;:13;33429:5;33422:13;;;;;;;;;;;:28;;;33394:12;:56;;;;:::i;:::-;33393:129;;;;:::i;:::-;:183;;;;:::i;:::-;33392:199;;;;:::i;:::-;33360:231;;33794:21;33746:6;:13;33753:5;33746:13;;;;;;;;;;;:31;;;33694:6;:13;33701:5;33694:13;;;;;;;;;;;:32;;;:83;;;;:::i;:::-;33651:6;:13;33658:5;33651:13;;;;;;;;;;;:25;;;33623:6;:13;33630:5;33623:13;;;;;;;;;;;:25;;;:53;;;;:::i;:::-;33622:156;;;;:::i;:::-;:193;;;;:::i;:::-;33602:213;;;33167:656;;;;:::o;22354:87::-;22400:7;22427:6;;;;;;;;;;;22420:13;;22354:87;:::o;31076:35::-;;;;;;;;;;;;;:::o;40011:135::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40103:8:::1;40096:25;;;40122:7;:5;:7::i;:::-;40131:6;40096:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40011:135:::0;;:::o;32364:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31346:184::-;19057:13;;;;;;;;;;;:48;;19093:12;;;;;;;;;;19092:13;19057:48;;;19073:16;:14;:16::i;:::-;19057:48;19049:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;19169:19;19192:13;;;;;;;;;;;19191:14;19169:36;;19220:14;19216:101;;;19267:4;19251:13;;:20;;;;;;;;;;;;;;;;;;19301:4;19286:12;;:19;;;;;;;;;;;;;;;;;;19216:101;31425:16:::1;:14;:16::i;:::-;31452:17;:15;:17::i;:::-;31503:19;31480:20;;:42;;;;;;;;;;;;;;;;;;19347:14:::0;19343:68;;;19394:5;19378:13;;:21;;;;;;;;;;;;;;;;;;19343:68;31346:184;;:::o;31538:169::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31696:3:::1;31658:25;:35;31684:8;31658:35;;;;;;;;;;;:41;;;;;;:::i;:::-;;;;31538:169:::0;;:::o;40569:919::-;25844:8;:6;:8::i;:::-;25836:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22585:12:::1;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40756:17:::2;40767:5;40756:10;:17::i;:::-;40734:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;40873:239;40898:20;;;;;;;;;;;40937:5;40970:15;40961:24;;:6;:24;;;;:::i;:::-;40873:239;;41013:15;41004:24;;:6;:24;;;;:::i;:::-;40873:239;;41047:6;:13;41054:5;41047:13;;;;;;;;;;;:22;;;;;;;;;;;;41088:9;40873:6;:239::i;:::-;40851:332;;;;;;;;;;;;:::i;:::-;;;;;;;;;41217:1;41198:15;:20;;;41194:277;;;41241:20;;;;;;;;;;;41233:46;;;41288:4;41295:7;:5;:7::i;:::-;41304:5;41233:77;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;41194:277;;;41351:1;41332:15;:20;;;41328:143;;;41375:20;;;;;;;;;;;41367:46;;;41422:4;41429:6;:13;41436:5;41429:13;;;;;;;;;;;:22;;;;;;;;;;;;41453:5;41367:92;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;41328:143;41194:277;40569:919:::0;;;:::o;38790:913::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38864:17:::1;38875:5;38864:10;:17::i;:::-;38856:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;38927:14;38943::::0;38961:22:::1;38977:5;38961:15;:22::i;:::-;38926:57;;;;39002:9;38994:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;39052:29;39084:6;:13;39091:5;39084:13;;;;;;;;;;;39052:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;39136:6;:13;39143:5;39136:13;;;;;;;;;;;:25;;;39108:6;:13;39115:5;39108:13;;;;;;;;;;;:25;;:53;;;;39275:5;39240:20;;;;;;;;;;;39177:190;;39203:6;:13;39210:5;39203:13;;;;;;;;;;;:22;;;;;;;;;;;;39177:190;;;39295:15;39325:10;39350:6;39177:190;;;;;;;;:::i;:::-;;;;;;;;39386:20;;;;;;;;;;;39378:46;;;39447:4;39467:7;:5;:7::i;:::-;39489:5;39378:127;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39624:5;39589:20;;;;;;;;;;;39521:174;;39552:6;:13;39559:5;39552:13;;;;;;;;;;;:22;;;;;;;;;;;;39521:174;;;39644:12;39671:6;:13;39678:5;39671:13;;;;;;;;;;;39521:174;;;;;;;:::i;:::-;;;;;;;;22645:1;;;38790:913:::0;:::o;23263:201::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23372:1:::1;23352:22;;:8;:22;;;;23344:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23428:28;23447:8;23428:18;:28::i;:::-;23263:201:::0;:::o;40154:315::-;22585:12;:10;:12::i;:::-;22574:23;;:7;:5;:7::i;:::-;:23;;;22566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40302:20:::1;;;;;;;;;;;40288:34;;:10;:34;;;:55;;;;;40326:17;40337:5;40326:10;:17::i;:::-;40288:55;40286:58;40264:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;40402:10;40394:36;;;40439:4;40446:7;:5;:7::i;:::-;40455:5;40394:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40154:315:::0;;:::o;27228:251::-;27378:7;27432:3;27437:6;27445:9;27456:13;27415:55;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27405:66;;;;;;27398:73;;27228:251;;;;;;:::o;27973:433::-;28076:7;28370:12;28317:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;28289:109;;;;;;28269:129;;27973:433;;;:::o;29250:283::-;29379:7;29405:9;29416;29427:7;29438:26;29453:10;29438:14;:26::i;:::-;29404:60;;;;;;29484:41;29494:21;29517:1;29520;29523;29484:41;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29477:48;;;;;29250:283;;;;:::o;33016:143::-;33074:4;33126:6;:13;33133:5;33126:13;;;;;;;;;;;:25;;;33098:6;:13;33105:5;33098:13;;;;;;;;;;;:25;;;:53;33091:60;;33016:143;;;:::o;20794:98::-;20847:7;20874:10;20867:17;;20794:98;:::o;26300:120::-;25844:8;:6;:8::i;:::-;25836:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:5:::1;26359:7;;:15;;;;;;;;;;;;;;;;;;26390:22;26399:12;:10;:12::i;:::-;26390:22;;;;;;:::i;:::-;;;;;;;;26300:120::o:0;23624:191::-;23698:16;23717:6;;;;;;;;;;;23698:25;;23743:8;23734:6;;:17;;;;;;;;;;;;;;;;;;23798:8;23767:40;;23788:8;23767:40;;;;;;;;;;;;23624:191;;:::o;26041:118::-;25567:8;:6;:8::i;:::-;25566:9;25558:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;26111:4:::1;26101:7;;:14;;;;;;;;;;;;;;;;;;26131:20;26138:12;:10;:12::i;:::-;26131:20;;;;;;:::i;:::-;;;;;;;;26041:118::o:0;19749:125::-;19797:4;19822:44;19860:4;19822:29;:44::i;:::-;19821:45;19814:52;;19749:125;:::o;22018:134::-;19660:13;;;;;;;;;;;19652:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22081:26:::1;:24;:26::i;:::-;22118;:24;:26::i;:::-;22018:134::o:0;24900:136::-;19660:13;;;;;;;;;;;19652:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;24964:26:::1;:24;:26::i;:::-;25001:27;:25;:27::i;:::-;24900:136::o:0;29541:893::-;29647:9;29671;29695:7;29752:2;29738:3;:10;:16;29730:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;30192:2;30187:3;30183:12;30177:19;30172:24;;30262:2;30257:3;30253:12;30247:19;30242:24;;30369:2;30364:3;30360:12;30354:19;30351:1;30346:28;30341:33;;29805:580;;;;;:::o;10303:387::-;10363:4;10571:12;10638:7;10626:20;10618:28;;10681:1;10674:4;:8;10667:15;;;10303:387;;;:::o;20718:70::-;19660:13;;;;;;;;;;;19652:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;20718:70::o;22160:113::-;19660:13;;;;;;;;;;;19652:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22233:32:::1;22252:12;:10;:12::i;:::-;22233:18;:32::i;:::-;22160:113::o:0;25044:97::-;19660:13;;;;;;;;;;;19652:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;25128:5:::1;25118:7;;:15;;;;;;;;;;;;;;;;;;25044:97::o:0;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:143::-;;589:6;583:13;574:22;;605:33;632:5;605:33;:::i;:::-;564:80;;;;:::o;650:137::-;;735:6;729:13;720:22;;751:30;775:5;751:30;:::i;:::-;710:77;;;;:::o;793:139::-;;877:6;864:20;855:29;;893:33;920:5;893:33;:::i;:::-;845:87;;;;:::o;951:351::-;;;1068:3;1061:4;1053:6;1049:17;1045:27;1035:2;;1086:1;1083;1076:12;1035:2;1122:6;1109:20;1099:30;;1152:18;1144:6;1141:30;1138:2;;;1184:1;1181;1174:12;1138:2;1221:4;1213:6;1209:17;1197:29;;1275:3;1267:4;1259:6;1255:17;1245:8;1241:32;1238:41;1235:2;;;1292:1;1289;1282:12;1235:2;1025:277;;;;;:::o;1321:271::-;;1425:3;1418:4;1410:6;1406:17;1402:27;1392:2;;1443:1;1440;1433:12;1392:2;1483:6;1470:20;1508:78;1582:3;1574:6;1567:4;1559:6;1555:17;1508:78;:::i;:::-;1499:87;;1382:210;;;;;:::o;1646:166::-;;1762:2;1753:6;1748:3;1744:16;1740:25;1737:2;;;1778:1;1775;1768:12;1737:2;1800:6;1791:15;;1727:85;;;;:::o;1818:139::-;;1902:6;1889:20;1880:29;;1918:33;1945:5;1918:33;:::i;:::-;1870:87;;;;:::o;1963:135::-;;2045:6;2032:20;2023:29;;2061:31;2086:5;2061:31;:::i;:::-;2013:85;;;;:::o;2104:262::-;;2212:2;2200:9;2191:7;2187:23;2183:32;2180:2;;;2228:1;2225;2218:12;2180:2;2271:1;2296:53;2341:7;2332:6;2321:9;2317:22;2296:53;:::i;:::-;2286:63;;2242:117;2170:196;;;;:::o;2372:284::-;;2491:2;2479:9;2470:7;2466:23;2462:32;2459:2;;;2507:1;2504;2497:12;2459:2;2550:1;2575:64;2631:7;2622:6;2611:9;2607:22;2575:64;:::i;:::-;2565:74;;2521:128;2449:207;;;;:::o;2662:829::-;;;;;;2840:3;2828:9;2819:7;2815:23;2811:33;2808:2;;;2857:1;2854;2847:12;2808:2;2900:1;2925:53;2970:7;2961:6;2950:9;2946:22;2925:53;:::i;:::-;2915:63;;2871:117;3027:2;3053:53;3098:7;3089:6;3078:9;3074:22;3053:53;:::i;:::-;3043:63;;2998:118;3155:2;3181:53;3226:7;3217:6;3206:9;3202:22;3181:53;:::i;:::-;3171:63;;3126:118;3311:2;3300:9;3296:18;3283:32;3342:18;3334:6;3331:30;3328:2;;;3374:1;3371;3364:12;3328:2;3410:64;3466:7;3457:6;3446:9;3442:22;3410:64;:::i;:::-;3392:82;;;;3254:230;2798:693;;;;;;;;:::o;3497:407::-;;;3622:2;3610:9;3601:7;3597:23;3593:32;3590:2;;;3638:1;3635;3628:12;3590:2;3681:1;3706:53;3751:7;3742:6;3731:9;3727:22;3706:53;:::i;:::-;3696:63;;3652:117;3808:2;3834:53;3879:7;3870:6;3859:9;3855:22;3834:53;:::i;:::-;3824:63;;3779:118;3580:324;;;;;:::o;3910:698::-;;;;;4069:3;4057:9;4048:7;4044:23;4040:33;4037:2;;;4086:1;4083;4076:12;4037:2;4129:1;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4100:117;4256:2;4282:53;4327:7;4318:6;4307:9;4303:22;4282:53;:::i;:::-;4272:63;;4227:118;4384:2;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4355:118;4512:2;4538:53;4583:7;4574:6;4563:9;4559:22;4538:53;:::i;:::-;4528:63;;4483:118;4027:581;;;;;;;:::o;4614:1101::-;;;;;;;4816:3;4804:9;4795:7;4791:23;4787:33;4784:2;;;4833:1;4830;4823:12;4784:2;4876:1;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4847:117;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5131:2;5157:53;5202:7;5193:6;5182:9;5178:22;5157:53;:::i;:::-;5147:63;;5102:118;5259:2;5285:53;5330:7;5321:6;5310:9;5306:22;5285:53;:::i;:::-;5275:63;;5230:118;5387:3;5414:53;5459:7;5450:6;5439:9;5435:22;5414:53;:::i;:::-;5404:63;;5358:119;5544:3;5533:9;5529:19;5516:33;5576:18;5568:6;5565:30;5562:2;;;5608:1;5605;5598:12;5562:2;5636:62;5690:7;5681:6;5670:9;5666:22;5636:62;:::i;:::-;5626:72;;5487:221;4774:941;;;;;;;;:::o;5721:278::-;;5837:2;5825:9;5816:7;5812:23;5808:32;5805:2;;;5853:1;5850;5843:12;5805:2;5896:1;5921:61;5974:7;5965:6;5954:9;5950:22;5921:61;:::i;:::-;5911:71;;5867:125;5795:204;;;;:::o;6005:262::-;;6113:2;6101:9;6092:7;6088:23;6084:32;6081:2;;;6129:1;6126;6119:12;6081:2;6172:1;6197:53;6242:7;6233:6;6222:9;6218:22;6197:53;:::i;:::-;6187:63;;6143:117;6071:196;;;;:::o;6273:262::-;;6381:2;6369:9;6360:7;6356:23;6352:32;6349:2;;;6397:1;6394;6387:12;6349:2;6440:1;6465:53;6510:7;6501:6;6490:9;6486:22;6465:53;:::i;:::-;6455:63;;6411:117;6339:196;;;;:::o;6541:659::-;;;;6690:2;6678:9;6669:7;6665:23;6661:32;6658:2;;;6706:1;6703;6696:12;6658:2;6749:1;6774:53;6819:7;6810:6;6799:9;6795:22;6774:53;:::i;:::-;6764:63;;6720:117;6904:2;6893:9;6889:18;6876:32;6935:18;6927:6;6924:30;6921:2;;;6967:1;6964;6957:12;6921:2;6995:62;7049:7;7040:6;7029:9;7025:22;6995:62;:::i;:::-;6985:72;;6847:220;7106:2;7132:51;7175:7;7166:6;7155:9;7151:22;7132:51;:::i;:::-;7122:61;;7077:116;6648:552;;;;;:::o;7206:465::-;;;7360:2;7348:9;7339:7;7335:23;7331:32;7328:2;;;7376:1;7373;7366:12;7328:2;7419:1;7444:53;7489:7;7480:6;7469:9;7465:22;7444:53;:::i;:::-;7434:63;;7390:117;7546:2;7572:82;7646:7;7637:6;7626:9;7622:22;7572:82;:::i;:::-;7562:92;;7517:147;7318:353;;;;;:::o;7677:1101::-;;;;;;;7879:3;7867:9;7858:7;7854:23;7850:33;7847:2;;;7896:1;7893;7886:12;7847:2;7939:1;7964:53;8009:7;8000:6;7989:9;7985:22;7964:53;:::i;:::-;7954:63;;7910:117;8066:2;8092:53;8137:7;8128:6;8117:9;8113:22;8092:53;:::i;:::-;8082:63;;8037:118;8194:2;8220:53;8265:7;8256:6;8245:9;8241:22;8220:53;:::i;:::-;8210:63;;8165:118;8322:2;8348:53;8393:7;8384:6;8373:9;8369:22;8348:53;:::i;:::-;8338:63;;8293:118;8450:3;8477:53;8522:7;8513:6;8502:9;8498:22;8477:53;:::i;:::-;8467:63;;8421:119;8607:3;8596:9;8592:19;8579:33;8639:18;8631:6;8628:30;8625:2;;;8671:1;8668;8661:12;8625:2;8699:62;8753:7;8744:6;8733:9;8729:22;8699:62;:::i;:::-;8689:72;;8550:221;7837:941;;;;;;;;:::o;8784:108::-;8861:24;8879:5;8861:24;:::i;:::-;8856:3;8849:37;8839:53;;:::o;8898:118::-;8985:24;9003:5;8985:24;:::i;:::-;8980:3;8973:37;8963:53;;:::o;9022:157::-;9127:45;9147:24;9165:5;9147:24;:::i;:::-;9127:45;:::i;:::-;9122:3;9115:58;9105:74;;:::o;9185:109::-;9266:21;9281:5;9266:21;:::i;:::-;9261:3;9254:34;9244:50;;:::o;9300:118::-;9387:24;9405:5;9387:24;:::i;:::-;9382:3;9375:37;9365:53;;:::o;9424:157::-;9529:45;9549:24;9567:5;9549:24;:::i;:::-;9529:45;:::i;:::-;9524:3;9517:58;9507:74;;:::o;9587:115::-;9672:23;9689:5;9672:23;:::i;:::-;9667:3;9660:36;9650:52;;:::o;9708:366::-;;9871:67;9935:2;9930:3;9871:67;:::i;:::-;9864:74;;9947:93;10036:3;9947:93;:::i;:::-;10065:2;10060:3;10056:12;10049:19;;9854:220;;;:::o;10080:366::-;;10243:67;10307:2;10302:3;10243:67;:::i;:::-;10236:74;;10319:93;10408:3;10319:93;:::i;:::-;10437:2;10432:3;10428:12;10421:19;;10226:220;;;:::o;10452:402::-;;10633:85;10715:2;10710:3;10633:85;:::i;:::-;10626:92;;10727:93;10816:3;10727:93;:::i;:::-;10845:2;10840:3;10836:12;10829:19;;10616:238;;;:::o;10860:366::-;;11023:67;11087:2;11082:3;11023:67;:::i;:::-;11016:74;;11099:93;11188:3;11099:93;:::i;:::-;11217:2;11212:3;11208:12;11201:19;;11006:220;;;:::o;11232:366::-;;11395:67;11459:2;11454:3;11395:67;:::i;:::-;11388:74;;11471:93;11560:3;11471:93;:::i;:::-;11589:2;11584:3;11580:12;11573:19;;11378:220;;;:::o;11604:366::-;;11767:67;11831:2;11826:3;11767:67;:::i;:::-;11760:74;;11843:93;11932:3;11843:93;:::i;:::-;11961:2;11956:3;11952:12;11945:19;;11750:220;;;:::o;11976:366::-;;12139:67;12203:2;12198:3;12139:67;:::i;:::-;12132:74;;12215:93;12304:3;12215:93;:::i;:::-;12333:2;12328:3;12324:12;12317:19;;12122:220;;;:::o;12348:366::-;;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12494:220;;;:::o;12720:366::-;;12883:67;12947:2;12942:3;12883:67;:::i;:::-;12876:74;;12959:93;13048:3;12959:93;:::i;:::-;13077:2;13072:3;13068:12;13061:19;;12866:220;;;:::o;13092:366::-;;13255:67;13319:2;13314:3;13255:67;:::i;:::-;13248:74;;13331:93;13420:3;13331:93;:::i;:::-;13449:2;13444:3;13440:12;13433:19;;13238:220;;;:::o;13464:366::-;;13627:67;13691:2;13686:3;13627:67;:::i;:::-;13620:74;;13703:93;13792:3;13703:93;:::i;:::-;13821:2;13816:3;13812:12;13805:19;;13610:220;;;:::o;13836:366::-;;13999:67;14063:2;14058:3;13999:67;:::i;:::-;13992:74;;14075:93;14164:3;14075:93;:::i;:::-;14193:2;14188:3;14184:12;14177:19;;13982:220;;;:::o;14208:366::-;;14371:67;14435:2;14430:3;14371:67;:::i;:::-;14364:74;;14447:93;14536:3;14447:93;:::i;:::-;14565:2;14560:3;14556:12;14549:19;;14354:220;;;:::o;14580:366::-;;14743:67;14807:2;14802:3;14743:67;:::i;:::-;14736:74;;14819:93;14908:3;14819:93;:::i;:::-;14937:2;14932:3;14928:12;14921:19;;14726:220;;;:::o;14952:366::-;;15115:67;15179:2;15174:3;15115:67;:::i;:::-;15108:74;;15191:93;15280:3;15191:93;:::i;:::-;15309:2;15304:3;15300:12;15293:19;;15098:220;;;:::o;15324:366::-;;15487:67;15551:2;15546:3;15487:67;:::i;:::-;15480:74;;15563:93;15652:3;15563:93;:::i;:::-;15681:2;15676:3;15672:12;15665:19;;15470:220;;;:::o;15696:366::-;;15859:67;15923:2;15918:3;15859:67;:::i;:::-;15852:74;;15935:93;16024:3;15935:93;:::i;:::-;16053:2;16048:3;16044:12;16037:19;;15842:220;;;:::o;16068:366::-;;16231:67;16295:2;16290:3;16231:67;:::i;:::-;16224:74;;16307:93;16396:3;16307:93;:::i;:::-;16425:2;16420:3;16416:12;16409:19;;16214:220;;;:::o;16440:398::-;;16620:83;16701:1;16696:3;16620:83;:::i;:::-;16613:90;;16712:93;16801:3;16712:93;:::i;:::-;16830:1;16825:3;16821:11;16814:18;;16603:235;;;:::o;16844:365::-;;17007:66;17071:1;17066:3;17007:66;:::i;:::-;17000:73;;17082:93;17171:3;17082:93;:::i;:::-;17200:2;17195:3;17191:12;17184:19;;16990:219;;;:::o;17215:366::-;;17378:67;17442:2;17437:3;17378:67;:::i;:::-;17371:74;;17454:93;17543:3;17454:93;:::i;:::-;17572:2;17567:3;17563:12;17556:19;;17361:220;;;:::o;17587:366::-;;17750:67;17814:2;17809:3;17750:67;:::i;:::-;17743:74;;17826:93;17915:3;17826:93;:::i;:::-;17944:2;17939:3;17935:12;17928:19;;17733:220;;;:::o;17959:366::-;;18122:67;18186:2;18181:3;18122:67;:::i;:::-;18115:74;;18198:93;18287:3;18198:93;:::i;:::-;18316:2;18311:3;18307:12;18300:19;;18105:220;;;:::o;18421:1826::-;18572:6;18567:3;18563:16;18671:4;18664:5;18660:16;18654:23;18690:63;18747:4;18742:3;18738:14;18724:12;18690:63;:::i;:::-;18589:174;18860:4;18853:5;18849:16;18843:23;18879:63;18936:4;18931:3;18927:14;18913:12;18879:63;:::i;:::-;18773:179;19054:4;19047:5;19043:16;19037:23;19073:61;19128:4;19123:3;19119:14;19105:12;19073:61;:::i;:::-;18962:182;19231:4;19224:5;19220:16;19214:23;19250:61;19305:4;19300:3;19296:14;19282:12;19250:61;:::i;:::-;19154:167;19410:4;19403:5;19399:16;19393:23;19429:63;19486:4;19481:3;19477:14;19463:12;19429:63;:::i;:::-;19331:171;19591:4;19584:5;19580:16;19574:23;19610:63;19667:4;19662:3;19658:14;19644:12;19610:63;:::i;:::-;19512:171;19779:4;19772:5;19768:16;19762:23;19798:63;19855:4;19850:3;19846:14;19832:12;19798:63;:::i;:::-;19693:178;19966:4;19959:5;19955:16;19949:23;19985:63;20042:4;20037:3;20033:14;20019:12;19985:63;:::i;:::-;19881:177;20144:6;20137:5;20133:18;20127:25;20165:65;20222:6;20217:3;20213:16;20199:12;20165:65;:::i;:::-;20068:172;18541:1706;;;:::o;20343:2518::-;20491:6;20486:3;20482:16;20524:1;20609:4;20602:5;20598:16;20592:23;20579:36;;20648:55;20693:9;20648:55;:::i;:::-;20716:63;20773:4;20768:3;20764:14;20750:12;20716:63;:::i;:::-;20535:254;20878:4;20871:5;20867:16;20861:23;20848:36;;20917:55;20962:9;20917:55;:::i;:::-;20985:63;21042:4;21037:3;21033:14;21019:12;20985:63;:::i;:::-;20799:259;21152:4;21145:5;21141:16;21135:23;21122:36;;21191:54;21235:9;21191:54;:::i;:::-;21258:61;21313:4;21308:3;21304:14;21290:12;21258:61;:::i;:::-;21068:261;21399:54;21443:9;21399:54;:::i;:::-;21466:61;21521:4;21516:3;21512:14;21498:12;21466:61;:::i;:::-;21339:198;21618:4;21611:5;21607:16;21601:23;21588:36;;21657:55;21702:9;21657:55;:::i;:::-;21725:63;21782:4;21777:3;21773:14;21759:12;21725:63;:::i;:::-;21547:251;21879:4;21872:5;21868:16;21862:23;21849:36;;21918:55;21963:9;21918:55;:::i;:::-;21986:63;22043:4;22038:3;22034:14;22020:12;21986:63;:::i;:::-;21808:251;22147:4;22140:5;22136:16;22130:23;22117:36;;22186:55;22231:9;22186:55;:::i;:::-;22254:63;22311:4;22306:3;22302:14;22288:12;22254:63;:::i;:::-;22069:258;22414:4;22407:5;22403:16;22397:23;22384:36;;22453:55;22498:9;22453:55;:::i;:::-;22521:63;22578:4;22573:3;22569:14;22555:12;22521:63;:::i;:::-;22337:257;22672:4;22665:5;22661:16;22655:23;22642:36;;22711:55;22756:9;22711:55;:::i;:::-;22779:65;22836:6;22831:3;22827:16;22813:12;22779:65;:::i;:::-;22604:250;20460:2401;;;;:::o;22867:108::-;22944:24;22962:5;22944:24;:::i;:::-;22939:3;22932:37;22922:53;;:::o;22981:118::-;23068:24;23086:5;23068:24;:::i;:::-;23063:3;23056:37;23046:53;;:::o;23105:157::-;23210:45;23230:24;23248:5;23230:24;:::i;:::-;23210:45;:::i;:::-;23205:3;23198:58;23188:74;;:::o;23268:105::-;23343:23;23360:5;23343:23;:::i;:::-;23338:3;23331:36;23321:52;;:::o;23379:115::-;23464:23;23481:5;23464:23;:::i;:::-;23459:3;23452:36;23442:52;;:::o;23500:112::-;23583:22;23599:5;23583:22;:::i;:::-;23578:3;23571:35;23561:51;;:::o;23618:679::-;;23829:75;23900:3;23891:6;23829:75;:::i;:::-;23929:2;23924:3;23920:12;23913:19;;23942:75;24013:3;24004:6;23942:75;:::i;:::-;24042:2;24037:3;24033:12;24026:19;;24055:75;24126:3;24117:6;24055:75;:::i;:::-;24155:2;24150:3;24146:12;24139:19;;24168:75;24239:3;24230:6;24168:75;:::i;:::-;24268:2;24263:3;24259:12;24252:19;;24288:3;24281:10;;23818:479;;;;;;;:::o;24303:522::-;;24538:148;24682:3;24538:148;:::i;:::-;24531:155;;24696:75;24767:3;24758:6;24696:75;:::i;:::-;24796:2;24791:3;24787:12;24780:19;;24816:3;24809:10;;24520:305;;;;:::o;24831:379::-;;25037:147;25180:3;25037:147;:::i;:::-;25030:154;;25201:3;25194:10;;25019:191;;;:::o;25216:222::-;;25347:2;25336:9;25332:18;25324:26;;25360:71;25428:1;25417:9;25413:17;25404:6;25360:71;:::i;:::-;25314:124;;;;:::o;25444:442::-;;25631:2;25620:9;25616:18;25608:26;;25644:71;25712:1;25701:9;25697:17;25688:6;25644:71;:::i;:::-;25725:72;25793:2;25782:9;25778:18;25769:6;25725:72;:::i;:::-;25807;25875:2;25864:9;25860:18;25851:6;25807:72;:::i;:::-;25598:288;;;;;;:::o;25892:332::-;;26051:2;26040:9;26036:18;26028:26;;26064:71;26132:1;26121:9;26117:17;26108:6;26064:71;:::i;:::-;26145:72;26213:2;26202:9;26198:18;26189:6;26145:72;:::i;:::-;26018:206;;;;;:::o;26230:210::-;;26355:2;26344:9;26340:18;26332:26;;26368:65;26430:1;26419:9;26415:17;26406:6;26368:65;:::i;:::-;26322:118;;;;:::o;26446:320::-;;26599:2;26588:9;26584:18;26576:26;;26612:65;26674:1;26663:9;26659:17;26650:6;26612:65;:::i;:::-;26687:72;26755:2;26744:9;26740:18;26731:6;26687:72;:::i;:::-;26566:200;;;;;:::o;26772:222::-;;26903:2;26892:9;26888:18;26880:26;;26916:71;26984:1;26973:9;26969:17;26960:6;26916:71;:::i;:::-;26870:124;;;;:::o;27000:545::-;;27211:3;27200:9;27196:19;27188:27;;27225:71;27293:1;27282:9;27278:17;27269:6;27225:71;:::i;:::-;27306:68;27370:2;27359:9;27355:18;27346:6;27306:68;:::i;:::-;27384:72;27452:2;27441:9;27437:18;27428:6;27384:72;:::i;:::-;27466;27534:2;27523:9;27519:18;27510:6;27466:72;:::i;:::-;27178:367;;;;;;;:::o;27551:218::-;;27680:2;27669:9;27665:18;27657:26;;27693:69;27759:1;27748:9;27744:17;27735:6;27693:69;:::i;:::-;27647:122;;;;:::o;27775:419::-;;27979:2;27968:9;27964:18;27956:26;;28028:9;28022:4;28018:20;28014:1;28003:9;27999:17;27992:47;28056:131;28182:4;28056:131;:::i;:::-;28048:139;;27946:248;;;:::o;28200:419::-;;28404:2;28393:9;28389:18;28381:26;;28453:9;28447:4;28443:20;28439:1;28428:9;28424:17;28417:47;28481:131;28607:4;28481:131;:::i;:::-;28473:139;;28371:248;;;:::o;28625:419::-;;28829:2;28818:9;28814:18;28806:26;;28878:9;28872:4;28868:20;28864:1;28853:9;28849:17;28842:47;28906:131;29032:4;28906:131;:::i;:::-;28898:139;;28796:248;;;:::o;29050:419::-;;29254:2;29243:9;29239:18;29231:26;;29303:9;29297:4;29293:20;29289:1;29278:9;29274:17;29267:47;29331:131;29457:4;29331:131;:::i;:::-;29323:139;;29221:248;;;:::o;29475:419::-;;29679:2;29668:9;29664:18;29656:26;;29728:9;29722:4;29718:20;29714:1;29703:9;29699:17;29692:47;29756:131;29882:4;29756:131;:::i;:::-;29748:139;;29646:248;;;:::o;29900:419::-;;30104:2;30093:9;30089:18;30081:26;;30153:9;30147:4;30143:20;30139:1;30128:9;30124:17;30117:47;30181:131;30307:4;30181:131;:::i;:::-;30173:139;;30071:248;;;:::o;30325:419::-;;30529:2;30518:9;30514:18;30506:26;;30578:9;30572:4;30568:20;30564:1;30553:9;30549:17;30542:47;30606:131;30732:4;30606:131;:::i;:::-;30598:139;;30496:248;;;:::o;30750:419::-;;30954:2;30943:9;30939:18;30931:26;;31003:9;30997:4;30993:20;30989:1;30978:9;30974:17;30967:47;31031:131;31157:4;31031:131;:::i;:::-;31023:139;;30921:248;;;:::o;31175:419::-;;31379:2;31368:9;31364:18;31356:26;;31428:9;31422:4;31418:20;31414:1;31403:9;31399:17;31392:47;31456:131;31582:4;31456:131;:::i;:::-;31448:139;;31346:248;;;:::o;31600:419::-;;31804:2;31793:9;31789:18;31781:26;;31853:9;31847:4;31843:20;31839:1;31828:9;31824:17;31817:47;31881:131;32007:4;31881:131;:::i;:::-;31873:139;;31771:248;;;:::o;32025:419::-;;32229:2;32218:9;32214:18;32206:26;;32278:9;32272:4;32268:20;32264:1;32253:9;32249:17;32242:47;32306:131;32432:4;32306:131;:::i;:::-;32298:139;;32196:248;;;:::o;32450:419::-;;32654:2;32643:9;32639:18;32631:26;;32703:9;32697:4;32693:20;32689:1;32678:9;32674:17;32667:47;32731:131;32857:4;32731:131;:::i;:::-;32723:139;;32621:248;;;:::o;32875:419::-;;33079:2;33068:9;33064:18;33056:26;;33128:9;33122:4;33118:20;33114:1;33103:9;33099:17;33092:47;33156:131;33282:4;33156:131;:::i;:::-;33148:139;;33046:248;;;:::o;33300:419::-;;33504:2;33493:9;33489:18;33481:26;;33553:9;33547:4;33543:20;33539:1;33528:9;33524:17;33517:47;33581:131;33707:4;33581:131;:::i;:::-;33573:139;;33471:248;;;:::o;33725:419::-;;33929:2;33918:9;33914:18;33906:26;;33978:9;33972:4;33968:20;33964:1;33953:9;33949:17;33942:47;34006:131;34132:4;34006:131;:::i;:::-;33998:139;;33896:248;;;:::o;34150:419::-;;34354:2;34343:9;34339:18;34331:26;;34403:9;34397:4;34393:20;34389:1;34378:9;34374:17;34367:47;34431:131;34557:4;34431:131;:::i;:::-;34423:139;;34321:248;;;:::o;34575:419::-;;34779:2;34768:9;34764:18;34756:26;;34828:9;34822:4;34818:20;34814:1;34803:9;34799:17;34792:47;34856:131;34982:4;34856:131;:::i;:::-;34848:139;;34746:248;;;:::o;35000:419::-;;35204:2;35193:9;35189:18;35181:26;;35253:9;35247:4;35243:20;35239:1;35228:9;35224:17;35217:47;35281:131;35407:4;35281:131;:::i;:::-;35273:139;;35171:248;;;:::o;35425:419::-;;35629:2;35618:9;35614:18;35606:26;;35678:9;35672:4;35668:20;35664:1;35653:9;35649:17;35642:47;35706:131;35832:4;35706:131;:::i;:::-;35698:139;;35596:248;;;:::o;35850:419::-;;36054:2;36043:9;36039:18;36031:26;;36103:9;36097:4;36093:20;36089:1;36078:9;36074:17;36067:47;36131:131;36257:4;36131:131;:::i;:::-;36123:139;;36021:248;;;:::o;36275:419::-;;36479:2;36468:9;36464:18;36456:26;;36528:9;36522:4;36518:20;36514:1;36503:9;36499:17;36492:47;36556:131;36682:4;36556:131;:::i;:::-;36548:139;;36446:248;;;:::o;36700:544::-;;36964:3;36953:9;36949:19;36941:27;;36978:125;37100:1;37089:9;37085:17;37076:6;36978:125;:::i;:::-;37113:124;37232:3;37221:9;37217:19;37208:6;37113:124;:::i;:::-;36931:313;;;;;:::o;37250:325::-;;37432:3;37421:9;37417:19;37409:27;;37446:122;37565:1;37554:9;37550:17;37541:6;37446:122;:::i;:::-;37399:176;;;;:::o;37581:222::-;;37712:2;37701:9;37697:18;37689:26;;37725:71;37793:1;37782:9;37778:17;37769:6;37725:71;:::i;:::-;37679:124;;;;:::o;37809:442::-;;37996:2;37985:9;37981:18;37973:26;;38009:71;38077:1;38066:9;38062:17;38053:6;38009:71;:::i;:::-;38090:72;38158:2;38147:9;38143:18;38134:6;38090:72;:::i;:::-;38172;38240:2;38229:9;38225:18;38216:6;38172:72;:::i;:::-;37963:288;;;;;;:::o;38257:1100::-;;38608:3;38597:9;38593:19;38585:27;;38622:71;38690:1;38679:9;38675:17;38666:6;38622:71;:::i;:::-;38703:72;38771:2;38760:9;38756:18;38747:6;38703:72;:::i;:::-;38785:70;38851:2;38840:9;38836:18;38827:6;38785:70;:::i;:::-;38865;38931:2;38920:9;38916:18;38907:6;38865:70;:::i;:::-;38945:73;39013:3;39002:9;38998:19;38989:6;38945:73;:::i;:::-;39028;39096:3;39085:9;39081:19;39072:6;39028:73;:::i;:::-;39111;39179:3;39168:9;39164:19;39155:6;39111:73;:::i;:::-;39194;39262:3;39251:9;39247:19;39238:6;39194:73;:::i;:::-;39277;39345:3;39334:9;39330:19;39321:6;39277:73;:::i;:::-;38575:782;;;;;;;;;;;;:::o;39363:324::-;;39518:2;39507:9;39503:18;39495:26;;39531:69;39597:1;39586:9;39582:17;39573:6;39531:69;:::i;:::-;39610:70;39676:2;39665:9;39661:18;39652:6;39610:70;:::i;:::-;39485:202;;;;;:::o;39693:129::-;;39754:20;;:::i;:::-;39744:30;;39783:33;39811:4;39803:6;39783:33;:::i;:::-;39734:88;;;:::o;39828:75::-;;39894:2;39888:9;39878:19;;39868:35;:::o;39909:307::-;;40060:18;40052:6;40049:30;40046:2;;;40082:18;;:::i;:::-;40046:2;40120:29;40142:6;40120:29;:::i;:::-;40112:37;;40204:4;40198;40194:15;40186:23;;39975:241;;;:::o;40222:147::-;;40360:3;40345:18;;40335:34;;;;:::o;40375:169::-;;40493:6;40488:3;40481:19;40533:4;40528:3;40524:14;40509:29;;40471:73;;;;:::o;40550:148::-;;40689:3;40674:18;;40664:34;;;;:::o;40704:244::-;;40762:19;40779:1;40762:19;:::i;:::-;40757:24;;40795:19;40812:1;40795:19;:::i;:::-;40790:24;;40890:1;40880:8;40876:16;40873:1;40870:23;40867:2;;;40896:18;;:::i;:::-;40867:2;40940:1;40937;40933:9;40926:16;;40747:201;;;;:::o;40954:305::-;;41013:20;41031:1;41013:20;:::i;:::-;41008:25;;41047:20;41065:1;41047:20;:::i;:::-;41042:25;;41201:1;41133:66;41129:74;41126:1;41123:81;41120:2;;;41207:18;;:::i;:::-;41120:2;41251:1;41248;41244:9;41237:16;;40998:261;;;;:::o;41265:185::-;;41322:20;41340:1;41322:20;:::i;:::-;41317:25;;41356:20;41374:1;41356:20;:::i;:::-;41351:25;;41395:1;41385:2;;41400:18;;:::i;:::-;41385:2;41442:1;41439;41435:9;41430:14;;41307:143;;;;:::o;41456:348::-;;41519:20;41537:1;41519:20;:::i;:::-;41514:25;;41553:20;41571:1;41553:20;:::i;:::-;41548:25;;41741:1;41673:66;41669:74;41666:1;41663:81;41658:1;41651:9;41644:17;41640:105;41637:2;;;41748:18;;:::i;:::-;41637:2;41796:1;41793;41789:9;41778:20;;41504:300;;;;:::o;41810:191::-;;41870:20;41888:1;41870:20;:::i;:::-;41865:25;;41904:20;41922:1;41904:20;:::i;:::-;41899:25;;41943:1;41940;41937:8;41934:2;;;41948:18;;:::i;:::-;41934:2;41993:1;41990;41986:9;41978:17;;41855:146;;;;:::o;42007:139::-;;42097:42;42090:5;42086:54;42075:65;;42065:81;;;:::o;42152:90::-;;42231:5;42220:16;;42210:32;;;:::o;42248:106::-;;42337:10;42330:5;42326:22;42315:33;;42305:49;;;:::o;42360:96::-;;42426:24;42444:5;42426:24;:::i;:::-;42415:35;;42405:51;;;:::o;42462:90::-;;42539:5;42532:13;42525:21;42514:32;;42504:48;;;:::o;42558:77::-;;42624:5;42613:16;;42603:32;;;:::o;42641:149::-;;42717:66;42710:5;42706:78;42695:89;;42685:105;;;:::o;42796:126::-;;42873:42;42866:5;42862:54;42851:65;;42841:81;;;:::o;42928:91::-;;43004:8;42997:5;42993:20;42982:31;;42972:47;;;:::o;43025:77::-;;43091:5;43080:16;;43070:32;;;:::o;43108:93::-;;43184:10;43177:5;43173:22;43162:33;;43152:49;;;:::o;43207:86::-;;43282:4;43275:5;43271:16;43260:27;;43250:43;;;:::o;43299:110::-;;43380:23;43397:5;43380:23;:::i;:::-;43367:36;;43357:52;;;:::o;43415:154::-;43499:6;43494:3;43489;43476:30;43561:1;43552:6;43547:3;43543:16;43536:27;43466:103;;;:::o;43575:803::-;43755:1;43749:4;43745:12;43801:1;43794:5;43790:13;43851:12;43894:41;43921:13;43894:41;:::i;:::-;43877:58;;43949:76;44011:13;43999:10;43949:76;:::i;:::-;43712:324;;;44089:1;44083:4;44079:12;44135:2;44128:5;44124:14;44186:12;44229:41;44256:13;44229:41;:::i;:::-;44212:58;;44284:76;44346:13;44334:10;44284:76;:::i;:::-;44046:325;;;43701:677;;:::o;44384:166::-;;44478:66;44509:34;44532:10;44509:34;:::i;:::-;44478:66;:::i;:::-;44469:75;;44459:91;;;:::o;44556:166::-;;44650:66;44681:34;44704:10;44681:34;:::i;:::-;44650:66;:::i;:::-;44641:75;;44631:91;;;:::o;44728:164::-;;44821:65;44851:34;44874:10;44851:34;:::i;:::-;44821:65;:::i;:::-;44812:74;;44802:90;;;:::o;44898:165::-;;44991:66;45021:35;45045:10;45021:35;:::i;:::-;44991:66;:::i;:::-;44982:75;;44972:91;;;:::o;45069:281::-;45152:27;45174:4;45152:27;:::i;:::-;45144:6;45140:40;45282:6;45270:10;45267:22;45246:18;45234:10;45231:34;45228:62;45225:2;;;45293:18;;:::i;:::-;45225:2;45333:10;45329:2;45322:22;45112:238;;;:::o;45356:100::-;;45424:26;45444:5;45424:26;:::i;:::-;45413:37;;45403:53;;;:::o;45462:79::-;;45530:5;45519:16;;45509:32;;;:::o;45547:94::-;;45615:20;45629:5;45615:20;:::i;:::-;45604:31;;45594:47;;;:::o;45647:79::-;;45715:5;45704:16;;45694:32;;;:::o;45918:180::-;45966:77;45963:1;45956:88;46063:4;46060:1;46053:15;46087:4;46084:1;46077:15;46104:180;46152:77;46149:1;46142:88;46249:4;46246:1;46239:15;46273:4;46270:1;46263:15;46290:180;46338:77;46335:1;46328:88;46435:4;46432:1;46425:15;46459:4;46456:1;46449:15;46476:74;;46539:5;46532:12;;46522:28;;;:::o;46556:184::-;;46649:3;46636:17;46662:32;46688:5;46662:32;:::i;:::-;46728:5;46704:29;;46612:128;;;;:::o;46746:102::-;;46838:2;46834:7;46829:2;46822:5;46818:14;46814:28;46804:38;;46794:54;;;:::o;46854:92::-;;46933:5;46930:1;46926:13;46905:34;;46895:51;;;:::o;46952:94::-;;47033:5;47029:2;47025:14;47004:35;;46994:52;;;:::o;47052:94::-;;47133:5;47129:2;47125:14;47104:35;;47094:52;;;:::o;47152:102::-;;47241:5;47238:1;47234:13;47213:34;;47203:51;;;:::o;47260:104::-;;47351:5;47347:2;47343:14;47322:35;;47312:52;;;:::o;47370:171::-;47510:23;47506:1;47498:6;47494:14;47487:47;47476:65;:::o;47547:170::-;47687:22;47683:1;47675:6;47671:14;47664:46;47653:64;:::o;47723:214::-;47863:66;47859:1;47851:6;47847:14;47840:90;47829:108;:::o;47943:225::-;48083:34;48079:1;48071:6;48067:14;48060:58;48152:8;48147:2;48139:6;48135:15;48128:33;48049:119;:::o;48174:179::-;48314:31;48310:1;48302:6;48298:14;48291:55;48280:73;:::o;48359:179::-;48499:31;48495:1;48487:6;48483:14;48476:55;48465:73;:::o;48544:230::-;48684:34;48680:1;48672:6;48668:14;48661:58;48753:13;48748:2;48740:6;48736:15;48729:38;48650:124;:::o;48780:166::-;48920:18;48916:1;48908:6;48904:14;48897:42;48886:60;:::o;48952:161::-;49092:13;49088:1;49080:6;49076:14;49069:37;49058:55;:::o;49119:167::-;49259:19;49255:1;49247:6;49243:14;49236:43;49225:61;:::o;49292:233::-;49432:34;49428:1;49420:6;49416:14;49409:58;49501:16;49496:2;49488:6;49484:15;49477:41;49398:127;:::o;49531:172::-;49671:24;49667:1;49659:6;49655:14;49648:48;49637:66;:::o;49709:167::-;49849:19;49845:1;49837:6;49833:14;49826:43;49815:61;:::o;49882:182::-;50022:34;50018:1;50010:6;50006:14;49999:58;49988:76;:::o;50070:230::-;50210:34;50206:1;50198:6;50194:14;50187:58;50279:13;50274:2;50266:6;50262:15;50255:38;50176:124;:::o;50306:226::-;50446:34;50442:1;50434:6;50430:14;50423:58;50515:9;50510:2;50502:6;50498:15;50491:34;50412:120;:::o;50538:166::-;50678:18;50674:1;50666:6;50662:14;50655:42;50644:60;:::o;50710:180::-;50850:32;50846:1;50838:6;50834:14;50827:56;50816:74;:::o;50896:114::-;51002:8;:::o;51016:158::-;51156:10;51152:1;51144:6;51140:14;51133:34;51122:52;:::o;51180:175::-;51320:27;51316:1;51308:6;51304:14;51297:51;51286:69;:::o;51361:230::-;51501:34;51497:1;51489:6;51485:14;51478:58;51570:13;51565:2;51557:6;51553:15;51546:38;51467:124;:::o;51597:174::-;51737:26;51733:1;51725:6;51721:14;51714:50;51703:68;:::o;51777:233::-;;51863:10;51894:22;51907:8;51894:22;:::i;:::-;51882:34;;51949:4;51945:9;51938:5;51934:21;51925:30;;51998:4;51988:8;51984:19;51977:5;51974:30;51964:40;;51841:169;;;;;:::o;52016:242::-;;52102:18;52141:23;52155:8;52141:23;:::i;:::-;52129:35;;52197:4;52193:9;52186:5;52182:21;52173:30;;52246:4;52236:8;52232:19;52225:5;52222:30;52212:40;;52080:178;;;;;:::o;52264:264::-;52404:118;52514:7;52508:4;52404:118;:::i;:::-;52393:135;;:::o;52534:256::-;52642:37;52671:7;52642:37;:::i;:::-;52701:82;52742:40;52765:16;52742:40;:::i;:::-;52735:4;52729:11;52701:82;:::i;:::-;52695:4;52688:96;52608:182;;;:::o;52796:256::-;52904:37;52933:7;52904:37;:::i;:::-;52963:82;53004:40;53027:16;53004:40;:::i;:::-;52997:4;52991:11;52963:82;:::i;:::-;52957:4;52950:96;52870:182;;;:::o;53058:122::-;53131:24;53149:5;53131:24;:::i;:::-;53124:5;53121:35;53111:2;;53170:1;53167;53160:12;53111:2;53101:79;:::o;53186:116::-;53256:21;53271:5;53256:21;:::i;:::-;53249:5;53246:32;53236:2;;53292:1;53289;53282:12;53236:2;53226:76;:::o;53308:122::-;53381:24;53399:5;53381:24;:::i;:::-;53374:5;53371:35;53361:2;;53420:1;53417;53410:12;53361:2;53351:79;:::o;53436:122::-;53509:24;53527:5;53509:24;:::i;:::-;53502:5;53499:35;53489:2;;53548:1;53545;53538:12;53489:2;53479:79;:::o;53564:120::-;53636:23;53653:5;53636:23;:::i;:::-;53629:5;53626:34;53616:2;;53674:1;53671;53664:12;53616:2;53606:78;:::o;53690:118::-;53761:22;53777:5;53761:22;:::i;:::-;53754:5;53751:33;53741:2;;53798:1;53795;53788:12;53741:2;53731:77;:::o
Swarm Source
ipfs://9e81baf7dbe876dd29f6cefadac0597d6c699355ee86977f027e322e42e03a7b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,524.63 | 0.00001105 | $0.027903 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.