Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Latest 12 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
1718725 | 5 days ago | 0.01 S | ||||
1718725 | 5 days ago | Contract Creation | 0 S | |||
1681908 | 5 days ago | 0.01 S | ||||
1681908 | 5 days ago | Contract Creation | 0 S | |||
1679780 | 5 days ago | 0.01 S | ||||
1679780 | 5 days ago | Contract Creation | 0 S | |||
1678387 | 5 days ago | 0.01 S | ||||
1678387 | 5 days ago | Contract Creation | 0 S | |||
1677603 | 5 days ago | 0.01 S | ||||
1677603 | 5 days ago | Contract Creation | 0 S | |||
1677094 | 5 days ago | 0.01 S | ||||
1677094 | 5 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Sp33dFun
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import {Sp33dFunToken} from "./Sp33dFunToken.sol"; import {ISolidlyRouter} from "./interfaces/ISolidlyRouter.sol"; import {ISolidlyFactory} from "./interfaces/ISolidlyFactory.sol"; contract Ownable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { address msgSender = msg.sender; _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == msg.sender, "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract Sp33dFun is Ownable, PausableUpgradeable { using Address for address payable; struct Token { address instance; address owner; string name; string symbol; string uri; uint256 maxSupply; } address constant WETH = address(0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38); ISolidlyRouter constant router = ISolidlyRouter(0xcC6169aA1E879d3a4227536671F85afdb2d23fAD); ISolidlyFactory constant factory = ISolidlyFactory(0xDDD9845Ba0D8f38d3045f804f67A1a8B9A528FcC); uint256 public initialAmount = 0.01 ether; Token[] internal tokens; mapping(address => uint256) public tokenIndexes; uint256 public MAX_SUPPLY = 1000000000 ether; error InvalidParams(); error OwnershipTransferFailed(); event Launched( address owner, string name, string symbol, string uri, uint256 maxSupply, address token ); event HandleLiquidity( address owner, address token0, address token1, address pair ); receive() external payable {} // token creator functions function launch( address tokenOwner, string memory name, string memory symbol, string memory uri ) external payable whenNotPaused { require( msg.value >= initialAmount, "InitialAmount: invalid initial Amount!" ); Sp33dFunToken instance = new Sp33dFunToken(); Sp33dFunToken(instance).initialize( name, symbol, uri, tokenOwner, MAX_SUPPLY, initialAmount ); handleLiquidity(address(instance), tokenOwner); tokens.push( Token({ instance: address(instance), owner: tokenOwner, name: name, symbol: symbol, uri: uri, maxSupply: MAX_SUPPLY }) ); tokenIndexes[address(instance)] = tokens.length - 1; emit Launched( tokenOwner, name, symbol, uri, MAX_SUPPLY, address(instance) ); } function handleLiquidity(address _token, address _to) internal { address pair = factory.createPair(_token, WETH, false); uint256 tokenBalance = IERC20(_token).balanceOf(address(this)); IERC20(_token).approve(address(router), tokenBalance); router.addLiquidityETH{value: initialAmount}( address(_token), false, tokenBalance, 0, 0, _to, // keep the LP tokens block.timestamp ); emit HandleLiquidity(_to, WETH, _token, pair); } function launchPermissioned(address tokenOwner, address token) external onlyOwner { tokens.push( Token({ instance: token, owner: tokenOwner, name: Sp33dFunToken(token).name(), symbol: Sp33dFunToken(token).symbol(), uri: Sp33dFunToken(token).uri(), maxSupply: Sp33dFunToken(token).totalSupply() }) ); tokenIndexes[token] = tokens.length - 1; emit Launched( tokenOwner, Sp33dFunToken(token).name(), Sp33dFunToken(token).symbol(), Sp33dFunToken(token).uri(), Sp33dFunToken(token).totalSupply(), token ); } function transferTokenOwnership(uint256 id, address newOwner) external { if (id >= tokens.length) revert OwnershipTransferFailed(); if (tokens[id].owner != msg.sender) revert OwnershipTransferFailed(); Token storage token = tokens[id]; token.owner = newOwner; } // admin functions function claimLaunchTaxes() external onlyOwner { payable(owner()).sendValue(address(this).balance); } function togglePause() external onlyOwner { if (paused()) _unpause(); else _pause(); } function updateMaxSupply(uint256 _maxSupply) external onlyOwner { MAX_SUPPLY = _maxSupply; } function updateInitialAmount(uint256 _initialAmount) external onlyOwner { initialAmount = _initialAmount; } // view functions function getToken(uint256 id) external view returns (Token memory) { if (id >= tokens.length) return Token(address(0), address(0), "", "", "", 0); return tokens[id]; } function getAllToken() external view returns (Token[] memory) { return tokens; } function allPairsLength() external view returns (uint256) { return tokens.length; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @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 proxied contracts do not make use of 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. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * 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 prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } 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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Pausable struct PausableStorage { bool _paused; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300; function _getPausableStorage() private pure returns (PausableStorage storage $) { assembly { $.slot := PausableStorageLocation } } /** * @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); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { PausableStorage storage $ = _getPausableStorage(); $._paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { PausableStorage storage $ = _getPausableStorage(); return $._paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC-20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC-721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC-1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @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); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol) pragma solidity ^0.8.20; import {Errors} from "./Errors.sol"; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert Errors.InsufficientBalance(address(this).balance, amount); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert Errors.FailedCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {Errors.FailedCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert Errors.InsufficientBalance(address(this).balance, value); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case * of an unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {Errors.FailedCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}. */ function _revert(bytes memory returndata) private pure { // 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 ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert Errors.FailedCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol) pragma solidity ^0.8.20; /** * @dev Collection of common custom errors used in multiple contracts * * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. * It is recommended to avoid relying on the error API for critical functionality. * * _Available since v5.1._ */ library Errors { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error InsufficientBalance(uint256 balance, uint256 needed); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedCall(); /** * @dev The deployment failed. */ error FailedDeployment(); /** * @dev A necessary precompile is missing. */ error MissingPrecompile(address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors { /// @custom:storage-location erc7201:openzeppelin.storage.ERC20 struct ERC20Storage { mapping(address account => uint256) _balances; mapping(address account => mapping(address spender => uint256)) _allowances; uint256 _totalSupply; string _name; string _symbol; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00; function _getERC20Storage() private pure returns (ERC20Storage storage $) { assembly { $.slot := ERC20StorageLocation } } /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal { ERC20Storage storage $ = _getERC20Storage(); $._name = name_; $._symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Skips emitting an {Approval} event indicating an allowance update. This is not * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows $._totalSupply += value; } else { uint256 fromBalance = $._balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. $._balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. $._totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. $._balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * * ```solidity * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } $._allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface ISolidlyFactory { function createPair( address tokenA, address tokenB, bool stable ) external returns (address pair); function getPair( address tokenA, address tokenB, bool stable ) external view returns (address pair); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; interface ISolidlyRouter { struct Route { address from; address to; bool stable; } function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForETH( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external returns (uint[] memory amounts); function weth() external view returns (address); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.13; import {ERC20Upgradeable} from "./ERC20Upgradeable.sol"; contract Sp33dFunToken is ERC20Upgradeable { string public uri; function initialize( string memory _name, string memory _symbol, string memory _uri, address tokenOwner, uint256 initialSupply, uint256 initialAmount ) external { require(initialSupply > 0, "Initial supply must be greater than 0"); require(initialSupply >= initialAmount, "Invalid initial Amount!"); __ERC20_init(_name, _symbol); uri = _uri; _mint(msg.sender, initialAmount); _mint(tokenOwner, initialSupply - initialAmount); } }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidParams","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"OwnershipTransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"HandleLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"string","name":"uri","type":"string"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"Launched","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLaunchTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllToken","outputs":[{"components":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"internalType":"struct Sp33dFun.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getToken","outputs":[{"components":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"internalType":"struct Sp33dFun.Token","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"launch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"launchPermissioned","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenIndexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initialAmount","type":"uint256"}],"name":"updateInitialAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052662386f26fc100006001556b033b2e3c9fd0803ce8000000600455348015602a57600080fd5b506000339050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350614844806100db6000396000f3fe6080604052600436106101025760003560e01c8063c4ae316811610095578063e904836111610064578063e9048361146102fb578063e9cf64e614610312578063f103b4331461033b578063f2fde38b14610364578063fc1ed4371461038d57610109565b8063c4ae316814610262578063cb2df31114610279578063e1706045146102a2578063e4b50cb8146102be57610109565b8063715018a6116100d1578063715018a6146101cc578063763e44e9146101e357806385e3c1d41461020c5780638da5cb5b1461023757610109565b806304bc3b1c1461010e57806332cb6b0c1461014b578063574f2ba3146101765780635c975abb146101a157610109565b3661010957005b600080fd5b34801561011a57600080fd5b5061013560048036038101906101309190612078565b6103b8565b60405161014291906120be565b60405180910390f35b34801561015757600080fd5b506101606103d0565b60405161016d91906120be565b60405180910390f35b34801561018257600080fd5b5061018b6103d6565b60405161019891906120be565b60405180910390f35b3480156101ad57600080fd5b506101b66103e3565b6040516101c391906120f4565b60405180910390f35b3480156101d857600080fd5b506101e1610408565b005b3480156101ef57600080fd5b5061020a6004803603810190610205919061213b565b610554565b005b34801561021857600080fd5b506102216105ec565b60405161022e919061236f565b60405180910390f35b34801561024357600080fd5b5061024c6108b7565b60405161025991906123a0565b60405180910390f35b34801561026e57600080fd5b506102776108e0565b005b34801561028557600080fd5b506102a0600480360381019061029b91906123bb565b610993565b005b6102bc60048036038101906102b79190612530565b610fa9565b005b3480156102ca57600080fd5b506102e560048036038101906102e0919061213b565b6112a7565b6040516102f29190612682565b60405180910390f35b34801561030757600080fd5b506103106115ec565b005b34801561031e57600080fd5b50610339600480360381019061033491906126a4565b6116ac565b005b34801561034757600080fd5b50610362600480360381019061035d919061213b565b611802565b005b34801561037057600080fd5b5061038b60048036038101906103869190612078565b61189a565b005b34801561039957600080fd5b506103a2611a54565b6040516103af91906120be565b60405180910390f35b60036020528060005260406000206000915090505481565b60045481565b6000600280549050905090565b6000806103ee611a5a565b90508060000160009054906101000a900460ff1691505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048d90612741565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d990612741565b60405180910390fd5b8060018190555050565b60606002805480602002602001604051908101604052809291908181526020016000905b828210156108ae57838290600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546106ef90612790565b80601f016020809104026020016040519081016040528092919081815260200182805461071b90612790565b80156107685780601f1061073d57610100808354040283529160200191610768565b820191906000526020600020905b81548152906001019060200180831161074b57829003601f168201915b5050505050815260200160038201805461078190612790565b80601f01602080910402602001604051908101604052809291908181526020018280546107ad90612790565b80156107fa5780601f106107cf576101008083540402835291602001916107fa565b820191906000526020600020905b8154815290600101906020018083116107dd57829003601f168201915b5050505050815260200160048201805461081390612790565b80601f016020809104026020016040519081016040528092919081815260200182805461083f90612790565b801561088c5780601f106108615761010080835404028352916020019161088c565b820191906000526020600020905b81548152906001019060200180831161086f57829003601f168201915b5050505050815260200160058201548152505081526020019060010190610610565b50505050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590612741565b60405180910390fd5b6109766103e3565b1561098857610983611a82565b610991565b610990611af4565b5b565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890612741565b60405180910390fd5b60026040518060c001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ab1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ada9190612831565b81526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b2a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b539190612831565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ba3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bcc9190612831565b81526020018373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c40919061288f565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081610d0f9190612a68565b506060820151816003019081610d259190612a68565b506080820151816004019081610d3b9190612a68565b5060a0820151816005015550506001600280549050610d5a9190612b69565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d828273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610e0a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e339190612831565b8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ea79190612831565b8473ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ef2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f1b9190612831565b8573ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8a919061288f565b86604051610f9d96959493929190612bd6565b60405180910390a15050565b610fb1611b66565b600154341015610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90612cbe565b60405180910390fd5b600060405161100490611f97565b604051809103906000f080158015611020573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663767faf5d858585896004546001546040518763ffffffff1660e01b815260040161106a96959493929190612cde565b600060405180830381600087803b15801561108457600080fd5b505af1158015611098573d6000803e3d6000fd5b505050506110a68186611ba7565b60026040518060c001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001600454815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020190816111cf9190612a68565b5060608201518160030190816111e59190612a68565b5060808201518160040190816111fb9190612a68565b5060a082015181600501555050600160028054905061121a9190612b69565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d858585856004548660405161129896959493929190612bd6565b60405180910390a15050505050565b6112af611fa4565b600280549050821061134b576040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001604051806020016040528060008152508152602001604051806020016040528060008152508152602001604051806020016040528060008152508152602001600081525090506115e7565b6002828154811061135f5761135e612d54565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461143490612790565b80601f016020809104026020016040519081016040528092919081815260200182805461146090612790565b80156114ad5780601f10611482576101008083540402835291602001916114ad565b820191906000526020600020905b81548152906001019060200180831161149057829003601f168201915b505050505081526020016003820180546114c690612790565b80601f01602080910402602001604051908101604052809291908181526020018280546114f290612790565b801561153f5780601f106115145761010080835404028352916020019161153f565b820191906000526020600020905b81548152906001019060200180831161152257829003601f168201915b5050505050815260200160048201805461155890612790565b80601f016020809104026020016040519081016040528092919081815260200182805461158490612790565b80156115d15780601f106115a6576101008083540402835291602001916115d1565b820191906000526020600020905b8154815290600101906020018083116115b457829003601f168201915b5050505050815260200160058201548152505090505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190612741565b60405180910390fd5b6116aa476116866108b7565b73ffffffffffffffffffffffffffffffffffffffff16611e6090919063ffffffff16565b565b60028054905082106116ea576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166002838154811061171557611714612d54565b5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611794576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106117aa576117a9612d54565b5b90600052602060002090600602019050818160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790612741565b60405180910390fd5b8060048190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90612741565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90612df5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60015481565b60007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b611a8a611f4f565b6000611a94611a5a565b905060008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611adc611f8f565b604051611ae991906123a0565b60405180910390a150565b611afc611b66565b6000611b06611a5a565b905060018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b4e611f8f565b604051611b5b91906123a0565b60405180910390a150565b611b6e6103e3565b15611ba5576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600073ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc73ffffffffffffffffffffffffffffffffffffffff166382dfdce48473039e2fb66102314ce7b64ce5ce3e5183bc94ad3860006040518463ffffffff1660e01b8152600401611c0f93929190612e15565b6020604051808303816000875af1158015611c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c529190612e61565b905060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c8f91906123a0565b602060405180830381865afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd0919061288f565b90508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b373cc6169aa1e879d3a4227536671f85afdb2d23fad836040518363ffffffff1660e01b8152600401611d21929190612e8e565b6020604051808303816000875af1158015611d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d649190612ee3565b5073cc6169aa1e879d3a4227536671f85afdb2d23fad73ffffffffffffffffffffffffffffffffffffffff1663b7e0d4c0600154866000856000808a426040518963ffffffff1660e01b8152600401611dc39796959493929190612f4b565b60606040518083038185885af1158015611de1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e069190612fba565b5050507f754a671be8cbd29278911b8d2a0a79e44f20003eef4b4c286a9006bcbbe4a5998373039e2fb66102314ce7b64ce5ce3e5183bc94ad388685604051611e52949392919061300d565b60405180910390a150505050565b80471015611ea75747816040517fcf479181000000000000000000000000000000000000000000000000000000008152600401611e9e929190613052565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ecd906130ac565b60006040518083038185875af1925050503d8060008114611f0a576040519150601f19603f3d011682016040523d82523d6000602084013e611f0f565b606091505b5050905080611f4a576040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b611f576103e3565b611f8d576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b61174d806130c283390190565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120458261201a565b9050919050565b6120558161203a565b811461206057600080fd5b50565b6000813590506120728161204c565b92915050565b60006020828403121561208e5761208d612010565b5b600061209c84828501612063565b91505092915050565b6000819050919050565b6120b8816120a5565b82525050565b60006020820190506120d360008301846120af565b92915050565b60008115159050919050565b6120ee816120d9565b82525050565b600060208201905061210960008301846120e5565b92915050565b612118816120a5565b811461212357600080fd5b50565b6000813590506121358161210f565b92915050565b60006020828403121561215157612150612010565b5b600061215f84828501612126565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61219d8161203a565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121dd5780820151818401526020810190506121c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000612205826121a3565b61220f81856121ae565b935061221f8185602086016121bf565b612228816121e9565b840191505092915050565b61223c816120a5565b82525050565b600060c08301600083015161225a6000860182612194565b50602083015161226d6020860182612194565b506040830151848203604086015261228582826121fa565b9150506060830151848203606086015261229f82826121fa565b915050608083015184820360808601526122b982826121fa565b91505060a08301516122ce60a0860182612233565b508091505092915050565b60006122e58383612242565b905092915050565b6000602082019050919050565b600061230582612168565b61230f8185612173565b93508360208202850161232185612184565b8060005b8581101561235d578484038952815161233e85826122d9565b9450612349836122ed565b925060208a01995050600181019050612325565b50829750879550505050505092915050565b6000602082019050818103600083015261238981846122fa565b905092915050565b61239a8161203a565b82525050565b60006020820190506123b56000830184612391565b92915050565b600080604083850312156123d2576123d1612010565b5b60006123e085828601612063565b92505060206123f185828601612063565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61243d826121e9565b810181811067ffffffffffffffff8211171561245c5761245b612405565b5b80604052505050565b600061246f612006565b905061247b8282612434565b919050565b600067ffffffffffffffff82111561249b5761249a612405565b5b6124a4826121e9565b9050602081019050919050565b82818337600083830152505050565b60006124d36124ce84612480565b612465565b9050828152602081018484840111156124ef576124ee612400565b5b6124fa8482856124b1565b509392505050565b600082601f830112612517576125166123fb565b5b81356125278482602086016124c0565b91505092915050565b6000806000806080858703121561254a57612549612010565b5b600061255887828801612063565b945050602085013567ffffffffffffffff81111561257957612578612015565b5b61258587828801612502565b935050604085013567ffffffffffffffff8111156125a6576125a5612015565b5b6125b287828801612502565b925050606085013567ffffffffffffffff8111156125d3576125d2612015565b5b6125df87828801612502565b91505092959194509250565b600060c0830160008301516126036000860182612194565b5060208301516126166020860182612194565b506040830151848203604086015261262e82826121fa565b9150506060830151848203606086015261264882826121fa565b9150506080830151848203608086015261266282826121fa565b91505060a083015161267760a0860182612233565b508091505092915050565b6000602082019050818103600083015261269c81846125eb565b905092915050565b600080604083850312156126bb576126ba612010565b5b60006126c985828601612126565b92505060206126da85828601612063565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061272b6020836126e4565b9150612736826126f5565b602082019050919050565b6000602082019050818103600083015261275a8161271e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806127a857607f821691505b6020821081036127bb576127ba612761565b5b50919050565b60006127d46127cf84612480565b612465565b9050828152602081018484840111156127f0576127ef612400565b5b6127fb8482856121bf565b509392505050565b600082601f830112612818576128176123fb565b5b81516128288482602086016127c1565b91505092915050565b60006020828403121561284757612846612010565b5b600082015167ffffffffffffffff81111561286557612864612015565b5b61287184828501612803565b91505092915050565b6000815190506128898161210f565b92915050565b6000602082840312156128a5576128a4612010565b5b60006128b38482850161287a565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261291e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128e1565b61292886836128e1565b95508019841693508086168417925050509392505050565b6000819050919050565b600061296561296061295b846120a5565b612940565b6120a5565b9050919050565b6000819050919050565b61297f8361294a565b61299361298b8261296c565b8484546128ee565b825550505050565b600090565b6129a861299b565b6129b3818484612976565b505050565b5b818110156129d7576129cc6000826129a0565b6001810190506129b9565b5050565b601f821115612a1c576129ed816128bc565b6129f6846128d1565b81016020851015612a05578190505b612a19612a11856128d1565b8301826129b8565b50505b505050565b600082821c905092915050565b6000612a3f60001984600802612a21565b1980831691505092915050565b6000612a588383612a2e565b9150826002028217905092915050565b612a71826121a3565b67ffffffffffffffff811115612a8a57612a89612405565b5b612a948254612790565b612a9f8282856129db565b600060209050601f831160018114612ad25760008415612ac0578287015190505b612aca8582612a4c565b865550612b32565b601f198416612ae0866128bc565b60005b82811015612b0857848901518255600182019150602085019450602081019050612ae3565b86831015612b255784890151612b21601f891682612a2e565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b74826120a5565b9150612b7f836120a5565b9250828203905081811115612b9757612b96612b3a565b5b92915050565b6000612ba8826121a3565b612bb281856126e4565b9350612bc28185602086016121bf565b612bcb816121e9565b840191505092915050565b600060c082019050612beb6000830189612391565b8181036020830152612bfd8188612b9d565b90508181036040830152612c118187612b9d565b90508181036060830152612c258186612b9d565b9050612c3460808301856120af565b612c4160a0830184612391565b979650505050505050565b7f496e697469616c416d6f756e743a20696e76616c696420696e697469616c204160008201527f6d6f756e74210000000000000000000000000000000000000000000000000000602082015250565b6000612ca86026836126e4565b9150612cb382612c4c565b604082019050919050565b60006020820190508181036000830152612cd781612c9b565b9050919050565b600060c0820190508181036000830152612cf88189612b9d565b90508181036020830152612d0c8188612b9d565b90508181036040830152612d208187612b9d565b9050612d2f6060830186612391565b612d3c60808301856120af565b612d4960a08301846120af565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ddf6026836126e4565b9150612dea82612d83565b604082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b6000606082019050612e2a6000830186612391565b612e376020830185612391565b612e4460408301846120e5565b949350505050565b600081519050612e5b8161204c565b92915050565b600060208284031215612e7757612e76612010565b5b6000612e8584828501612e4c565b91505092915050565b6000604082019050612ea36000830185612391565b612eb060208301846120af565b9392505050565b612ec0816120d9565b8114612ecb57600080fd5b50565b600081519050612edd81612eb7565b92915050565b600060208284031215612ef957612ef8612010565b5b6000612f0784828501612ece565b91505092915050565b6000819050919050565b6000612f35612f30612f2b84612f10565b612940565b6120a5565b9050919050565b612f4581612f1a565b82525050565b600060e082019050612f60600083018a612391565b612f6d60208301896120e5565b612f7a60408301886120af565b612f876060830187612f3c565b612f946080830186612f3c565b612fa160a0830185612391565b612fae60c08301846120af565b98975050505050505050565b600080600060608486031215612fd357612fd2612010565b5b6000612fe18682870161287a565b9350506020612ff28682870161287a565b92505060406130038682870161287a565b9150509250925092565b60006080820190506130226000830187612391565b61302f6020830186612391565b61303c6040830185612391565b6130496060830184612391565b95945050505050565b600060408201905061306760008301856120af565b61307460208301846120af565b9392505050565b600081905092915050565b50565b600061309660008361307b565b91506130a182613086565b600082019050919050565b60006130b782613089565b915081905091905056fe6080604052348015600f57600080fd5b5061172e8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806370a082311161007157806370a0823114610168578063767faf5d1461019857806395d89b41146101b4578063a9059cbb146101d2578063dd62ed3e14610202578063eac989f814610232576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610250565b6040516100c39190610dad565b60405180910390f35b6100e660048036038101906100e19190610e77565b6102f1565b6040516100f39190610ed2565b60405180910390f35b610104610314565b6040516101119190610efc565b60405180910390f35b610134600480360381019061012f9190610f17565b61032c565b6040516101419190610ed2565b60405180910390f35b61015261035b565b60405161015f9190610f86565b60405180910390f35b610182600480360381019061017d9190610fa1565b610364565b60405161018f9190610efc565b60405180910390f35b6101b260048036038101906101ad9190611103565b6103bb565b005b6101bc610482565b6040516101c99190610dad565b60405180910390f35b6101ec60048036038101906101e79190610e77565b610523565b6040516101f99190610ed2565b60405180910390f35b61021c600480360381019061021791906111e4565b610546565b6040516102299190610efc565b60405180910390f35b61023a6105db565b6040516102479190610dad565b60405180910390f35b6060600061025c610669565b905080600301805461026d90611253565b80601f016020809104026020016040519081016040528092919081815260200182805461029990611253565b80156102e65780601f106102bb576101008083540402835291602001916102e6565b820191906000526020600020905b8154815290600101906020018083116102c957829003601f168201915b505050505091505090565b6000806102fc610691565b9050610309818585610699565b600191505092915050565b60008061031f610669565b9050806002015491505090565b600080610337610691565b90506103448582856106ab565b61034f85858561073f565b60019150509392505050565b60006012905090565b60008061036f610669565b90508060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b600082116103fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f5906112f6565b60405180910390fd5b80821015610441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043890611362565b60405180910390fd5b61044b8686610833565b836000908161045a919061152e565b506104653382610841565b61047a838284610475919061162f565b610841565b505050505050565b6060600061048e610669565b905080600401805461049f90611253565b80601f01602080910402602001604051908101604052809291908181526020018280546104cb90611253565b80156105185780601f106104ed57610100808354040283529160200191610518565b820191906000526020600020905b8154815290600101906020018083116104fb57829003601f168201915b505050505091505090565b60008061052e610691565b905061053b81858561073f565b600191505092915050565b600080610551610669565b90508060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505092915050565b600080546105e890611253565b80601f016020809104026020016040519081016040528092919081815260200182805461061490611253565b80156106615780601f1061063657610100808354040283529160200191610661565b820191906000526020600020905b81548152906001019060200180831161064457829003601f168201915b505050505081565b60007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b600033905090565b6106a683838360016108c3565b505050565b60006106b78484610546565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107395781811015610729578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161072093929190611672565b60405180910390fd5b610738848484840360006108c3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107b15760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016107a891906116a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108235760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161081a91906116a9565b60405180910390fd5b61082e838383610aa9565b505050565b61083d8282610ce8565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108b35760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108aa91906116a9565b60405180910390fd5b6108bf60008383610aa9565b5050565b60006108cd610669565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109415760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161093891906116a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036109b35760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016109aa91906116a9565b60405180910390fd5b828160010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508115610aa2578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610a999190610efc565b60405180910390a35b5050505050565b6000610ab3610669565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b095781816002016000828254610afd91906116c4565b92505081905550610be2565b60008160000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b98578481846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610b8f93929190611672565b60405180910390fd5b8281038260000160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c2d57818160020160008282540392505081905550610c7d565b818160000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cda9190610efc565b60405180910390a350505050565b6000610cf2610669565b905082816003019081610d05919061152e565b5081816004019081610d17919061152e565b50505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610d57578082015181840152602081019050610d3c565b60008484015250505050565b6000601f19601f8301169050919050565b6000610d7f82610d1d565b610d898185610d28565b9350610d99818560208601610d39565b610da281610d63565b840191505092915050565b60006020820190508181036000830152610dc78184610d74565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0e82610de3565b9050919050565b610e1e81610e03565b8114610e2957600080fd5b50565b600081359050610e3b81610e15565b92915050565b6000819050919050565b610e5481610e41565b8114610e5f57600080fd5b50565b600081359050610e7181610e4b565b92915050565b60008060408385031215610e8e57610e8d610dd9565b5b6000610e9c85828601610e2c565b9250506020610ead85828601610e62565b9150509250929050565b60008115159050919050565b610ecc81610eb7565b82525050565b6000602082019050610ee76000830184610ec3565b92915050565b610ef681610e41565b82525050565b6000602082019050610f116000830184610eed565b92915050565b600080600060608486031215610f3057610f2f610dd9565b5b6000610f3e86828701610e2c565b9350506020610f4f86828701610e2c565b9250506040610f6086828701610e62565b9150509250925092565b600060ff82169050919050565b610f8081610f6a565b82525050565b6000602082019050610f9b6000830184610f77565b92915050565b600060208284031215610fb757610fb6610dd9565b5b6000610fc584828501610e2c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61101082610d63565b810181811067ffffffffffffffff8211171561102f5761102e610fd8565b5b80604052505050565b6000611042610dcf565b905061104e8282611007565b919050565b600067ffffffffffffffff82111561106e5761106d610fd8565b5b61107782610d63565b9050602081019050919050565b82818337600083830152505050565b60006110a66110a184611053565b611038565b9050828152602081018484840111156110c2576110c1610fd3565b5b6110cd848285611084565b509392505050565b600082601f8301126110ea576110e9610fce565b5b81356110fa848260208601611093565b91505092915050565b60008060008060008060c087890312156111205761111f610dd9565b5b600087013567ffffffffffffffff81111561113e5761113d610dde565b5b61114a89828a016110d5565b965050602087013567ffffffffffffffff81111561116b5761116a610dde565b5b61117789828a016110d5565b955050604087013567ffffffffffffffff81111561119857611197610dde565b5b6111a489828a016110d5565b94505060606111b589828a01610e2c565b93505060806111c689828a01610e62565b92505060a06111d789828a01610e62565b9150509295509295509295565b600080604083850312156111fb576111fa610dd9565b5b600061120985828601610e2c565b925050602061121a85828601610e2c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061126b57607f821691505b60208210810361127e5761127d611224565b5b50919050565b7f496e697469616c20737570706c79206d7573742062652067726561746572207460008201527f68616e2030000000000000000000000000000000000000000000000000000000602082015250565b60006112e0602583610d28565b91506112eb82611284565b604082019050919050565b6000602082019050818103600083015261130f816112d3565b9050919050565b7f496e76616c696420696e697469616c20416d6f756e7421000000000000000000600082015250565b600061134c601783610d28565b915061135782611316565b602082019050919050565b6000602082019050818103600083015261137b8161133f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026113e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826113a7565b6113ee86836113a7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061142b61142661142184610e41565b611406565b610e41565b9050919050565b6000819050919050565b61144583611410565b61145961145182611432565b8484546113b4565b825550505050565b600090565b61146e611461565b61147981848461143c565b505050565b5b8181101561149d57611492600082611466565b60018101905061147f565b5050565b601f8211156114e2576114b381611382565b6114bc84611397565b810160208510156114cb578190505b6114df6114d785611397565b83018261147e565b50505b505050565b600082821c905092915050565b6000611505600019846008026114e7565b1980831691505092915050565b600061151e83836114f4565b9150826002028217905092915050565b61153782610d1d565b67ffffffffffffffff8111156115505761154f610fd8565b5b61155a8254611253565b6115658282856114a1565b600060209050601f8311600181146115985760008415611586578287015190505b6115908582611512565b8655506115f8565b601f1984166115a686611382565b60005b828110156115ce578489015182556001820191506020850194506020810190506115a9565b868310156115eb57848901516115e7601f8916826114f4565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061163a82610e41565b915061164583610e41565b925082820390508181111561165d5761165c611600565b5b92915050565b61166c81610e03565b82525050565b60006060820190506116876000830186611663565b6116946020830185610eed565b6116a16040830184610eed565b949350505050565b60006020820190506116be6000830184611663565b92915050565b60006116cf82610e41565b91506116da83610e41565b92508282019050808211156116f2576116f1611600565b5b9291505056fea2646970667358221220d62a2c6cc590fe936385d28ab99e16a87b95ffa0e46b455811328e30b9bb2cc764736f6c634300081c0033a2646970667358221220809670f1867e9bcf7b3be26d1b7d81c84dc1d9ac0dbd4416f4ad96b6bbfbfec064736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106101025760003560e01c8063c4ae316811610095578063e904836111610064578063e9048361146102fb578063e9cf64e614610312578063f103b4331461033b578063f2fde38b14610364578063fc1ed4371461038d57610109565b8063c4ae316814610262578063cb2df31114610279578063e1706045146102a2578063e4b50cb8146102be57610109565b8063715018a6116100d1578063715018a6146101cc578063763e44e9146101e357806385e3c1d41461020c5780638da5cb5b1461023757610109565b806304bc3b1c1461010e57806332cb6b0c1461014b578063574f2ba3146101765780635c975abb146101a157610109565b3661010957005b600080fd5b34801561011a57600080fd5b5061013560048036038101906101309190612078565b6103b8565b60405161014291906120be565b60405180910390f35b34801561015757600080fd5b506101606103d0565b60405161016d91906120be565b60405180910390f35b34801561018257600080fd5b5061018b6103d6565b60405161019891906120be565b60405180910390f35b3480156101ad57600080fd5b506101b66103e3565b6040516101c391906120f4565b60405180910390f35b3480156101d857600080fd5b506101e1610408565b005b3480156101ef57600080fd5b5061020a6004803603810190610205919061213b565b610554565b005b34801561021857600080fd5b506102216105ec565b60405161022e919061236f565b60405180910390f35b34801561024357600080fd5b5061024c6108b7565b60405161025991906123a0565b60405180910390f35b34801561026e57600080fd5b506102776108e0565b005b34801561028557600080fd5b506102a0600480360381019061029b91906123bb565b610993565b005b6102bc60048036038101906102b79190612530565b610fa9565b005b3480156102ca57600080fd5b506102e560048036038101906102e0919061213b565b6112a7565b6040516102f29190612682565b60405180910390f35b34801561030757600080fd5b506103106115ec565b005b34801561031e57600080fd5b50610339600480360381019061033491906126a4565b6116ac565b005b34801561034757600080fd5b50610362600480360381019061035d919061213b565b611802565b005b34801561037057600080fd5b5061038b60048036038101906103869190612078565b61189a565b005b34801561039957600080fd5b506103a2611a54565b6040516103af91906120be565b60405180910390f35b60036020528060005260406000206000915090505481565b60045481565b6000600280549050905090565b6000806103ee611a5a565b90508060000160009054906101000a900460ff1691505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048d90612741565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d990612741565b60405180910390fd5b8060018190555050565b60606002805480602002602001604051908101604052809291908181526020016000905b828210156108ae57838290600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546106ef90612790565b80601f016020809104026020016040519081016040528092919081815260200182805461071b90612790565b80156107685780601f1061073d57610100808354040283529160200191610768565b820191906000526020600020905b81548152906001019060200180831161074b57829003601f168201915b5050505050815260200160038201805461078190612790565b80601f01602080910402602001604051908101604052809291908181526020018280546107ad90612790565b80156107fa5780601f106107cf576101008083540402835291602001916107fa565b820191906000526020600020905b8154815290600101906020018083116107dd57829003601f168201915b5050505050815260200160048201805461081390612790565b80601f016020809104026020016040519081016040528092919081815260200182805461083f90612790565b801561088c5780601f106108615761010080835404028352916020019161088c565b820191906000526020600020905b81548152906001019060200180831161086f57829003601f168201915b5050505050815260200160058201548152505081526020019060010190610610565b50505050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590612741565b60405180910390fd5b6109766103e3565b1561098857610983611a82565b610991565b610990611af4565b5b565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890612741565b60405180910390fd5b60026040518060c001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ab1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ada9190612831565b81526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b2a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b539190612831565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ba3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bcc9190612831565b81526020018373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c40919061288f565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081610d0f9190612a68565b506060820151816003019081610d259190612a68565b506080820151816004019081610d3b9190612a68565b5060a0820151816005015550506001600280549050610d5a9190612b69565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d828273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610e0a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e339190612831565b8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ea79190612831565b8473ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ef2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f1b9190612831565b8573ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8a919061288f565b86604051610f9d96959493929190612bd6565b60405180910390a15050565b610fb1611b66565b600154341015610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90612cbe565b60405180910390fd5b600060405161100490611f97565b604051809103906000f080158015611020573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663767faf5d858585896004546001546040518763ffffffff1660e01b815260040161106a96959493929190612cde565b600060405180830381600087803b15801561108457600080fd5b505af1158015611098573d6000803e3d6000fd5b505050506110a68186611ba7565b60026040518060c001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001600454815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020190816111cf9190612a68565b5060608201518160030190816111e59190612a68565b5060808201518160040190816111fb9190612a68565b5060a082015181600501555050600160028054905061121a9190612b69565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d858585856004548660405161129896959493929190612bd6565b60405180910390a15050505050565b6112af611fa4565b600280549050821061134b576040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001604051806020016040528060008152508152602001604051806020016040528060008152508152602001604051806020016040528060008152508152602001600081525090506115e7565b6002828154811061135f5761135e612d54565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461143490612790565b80601f016020809104026020016040519081016040528092919081815260200182805461146090612790565b80156114ad5780601f10611482576101008083540402835291602001916114ad565b820191906000526020600020905b81548152906001019060200180831161149057829003601f168201915b505050505081526020016003820180546114c690612790565b80601f01602080910402602001604051908101604052809291908181526020018280546114f290612790565b801561153f5780601f106115145761010080835404028352916020019161153f565b820191906000526020600020905b81548152906001019060200180831161152257829003601f168201915b5050505050815260200160048201805461155890612790565b80601f016020809104026020016040519081016040528092919081815260200182805461158490612790565b80156115d15780601f106115a6576101008083540402835291602001916115d1565b820191906000526020600020905b8154815290600101906020018083116115b457829003601f168201915b5050505050815260200160058201548152505090505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190612741565b60405180910390fd5b6116aa476116866108b7565b73ffffffffffffffffffffffffffffffffffffffff16611e6090919063ffffffff16565b565b60028054905082106116ea576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166002838154811061171557611714612d54565b5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611794576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106117aa576117a9612d54565b5b90600052602060002090600602019050818160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790612741565b60405180910390fd5b8060048190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90612741565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90612df5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60015481565b60007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b611a8a611f4f565b6000611a94611a5a565b905060008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611adc611f8f565b604051611ae991906123a0565b60405180910390a150565b611afc611b66565b6000611b06611a5a565b905060018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b4e611f8f565b604051611b5b91906123a0565b60405180910390a150565b611b6e6103e3565b15611ba5576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600073ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc73ffffffffffffffffffffffffffffffffffffffff166382dfdce48473039e2fb66102314ce7b64ce5ce3e5183bc94ad3860006040518463ffffffff1660e01b8152600401611c0f93929190612e15565b6020604051808303816000875af1158015611c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c529190612e61565b905060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c8f91906123a0565b602060405180830381865afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd0919061288f565b90508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b373cc6169aa1e879d3a4227536671f85afdb2d23fad836040518363ffffffff1660e01b8152600401611d21929190612e8e565b6020604051808303816000875af1158015611d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d649190612ee3565b5073cc6169aa1e879d3a4227536671f85afdb2d23fad73ffffffffffffffffffffffffffffffffffffffff1663b7e0d4c0600154866000856000808a426040518963ffffffff1660e01b8152600401611dc39796959493929190612f4b565b60606040518083038185885af1158015611de1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e069190612fba565b5050507f754a671be8cbd29278911b8d2a0a79e44f20003eef4b4c286a9006bcbbe4a5998373039e2fb66102314ce7b64ce5ce3e5183bc94ad388685604051611e52949392919061300d565b60405180910390a150505050565b80471015611ea75747816040517fcf479181000000000000000000000000000000000000000000000000000000008152600401611e9e929190613052565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ecd906130ac565b60006040518083038185875af1925050503d8060008114611f0a576040519150601f19603f3d011682016040523d82523d6000602084013e611f0f565b606091505b5050905080611f4a576040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b611f576103e3565b611f8d576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b61174d806130c283390190565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120458261201a565b9050919050565b6120558161203a565b811461206057600080fd5b50565b6000813590506120728161204c565b92915050565b60006020828403121561208e5761208d612010565b5b600061209c84828501612063565b91505092915050565b6000819050919050565b6120b8816120a5565b82525050565b60006020820190506120d360008301846120af565b92915050565b60008115159050919050565b6120ee816120d9565b82525050565b600060208201905061210960008301846120e5565b92915050565b612118816120a5565b811461212357600080fd5b50565b6000813590506121358161210f565b92915050565b60006020828403121561215157612150612010565b5b600061215f84828501612126565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61219d8161203a565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121dd5780820151818401526020810190506121c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000612205826121a3565b61220f81856121ae565b935061221f8185602086016121bf565b612228816121e9565b840191505092915050565b61223c816120a5565b82525050565b600060c08301600083015161225a6000860182612194565b50602083015161226d6020860182612194565b506040830151848203604086015261228582826121fa565b9150506060830151848203606086015261229f82826121fa565b915050608083015184820360808601526122b982826121fa565b91505060a08301516122ce60a0860182612233565b508091505092915050565b60006122e58383612242565b905092915050565b6000602082019050919050565b600061230582612168565b61230f8185612173565b93508360208202850161232185612184565b8060005b8581101561235d578484038952815161233e85826122d9565b9450612349836122ed565b925060208a01995050600181019050612325565b50829750879550505050505092915050565b6000602082019050818103600083015261238981846122fa565b905092915050565b61239a8161203a565b82525050565b60006020820190506123b56000830184612391565b92915050565b600080604083850312156123d2576123d1612010565b5b60006123e085828601612063565b92505060206123f185828601612063565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61243d826121e9565b810181811067ffffffffffffffff8211171561245c5761245b612405565b5b80604052505050565b600061246f612006565b905061247b8282612434565b919050565b600067ffffffffffffffff82111561249b5761249a612405565b5b6124a4826121e9565b9050602081019050919050565b82818337600083830152505050565b60006124d36124ce84612480565b612465565b9050828152602081018484840111156124ef576124ee612400565b5b6124fa8482856124b1565b509392505050565b600082601f830112612517576125166123fb565b5b81356125278482602086016124c0565b91505092915050565b6000806000806080858703121561254a57612549612010565b5b600061255887828801612063565b945050602085013567ffffffffffffffff81111561257957612578612015565b5b61258587828801612502565b935050604085013567ffffffffffffffff8111156125a6576125a5612015565b5b6125b287828801612502565b925050606085013567ffffffffffffffff8111156125d3576125d2612015565b5b6125df87828801612502565b91505092959194509250565b600060c0830160008301516126036000860182612194565b5060208301516126166020860182612194565b506040830151848203604086015261262e82826121fa565b9150506060830151848203606086015261264882826121fa565b9150506080830151848203608086015261266282826121fa565b91505060a083015161267760a0860182612233565b508091505092915050565b6000602082019050818103600083015261269c81846125eb565b905092915050565b600080604083850312156126bb576126ba612010565b5b60006126c985828601612126565b92505060206126da85828601612063565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061272b6020836126e4565b9150612736826126f5565b602082019050919050565b6000602082019050818103600083015261275a8161271e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806127a857607f821691505b6020821081036127bb576127ba612761565b5b50919050565b60006127d46127cf84612480565b612465565b9050828152602081018484840111156127f0576127ef612400565b5b6127fb8482856121bf565b509392505050565b600082601f830112612818576128176123fb565b5b81516128288482602086016127c1565b91505092915050565b60006020828403121561284757612846612010565b5b600082015167ffffffffffffffff81111561286557612864612015565b5b61287184828501612803565b91505092915050565b6000815190506128898161210f565b92915050565b6000602082840312156128a5576128a4612010565b5b60006128b38482850161287a565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261291e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128e1565b61292886836128e1565b95508019841693508086168417925050509392505050565b6000819050919050565b600061296561296061295b846120a5565b612940565b6120a5565b9050919050565b6000819050919050565b61297f8361294a565b61299361298b8261296c565b8484546128ee565b825550505050565b600090565b6129a861299b565b6129b3818484612976565b505050565b5b818110156129d7576129cc6000826129a0565b6001810190506129b9565b5050565b601f821115612a1c576129ed816128bc565b6129f6846128d1565b81016020851015612a05578190505b612a19612a11856128d1565b8301826129b8565b50505b505050565b600082821c905092915050565b6000612a3f60001984600802612a21565b1980831691505092915050565b6000612a588383612a2e565b9150826002028217905092915050565b612a71826121a3565b67ffffffffffffffff811115612a8a57612a89612405565b5b612a948254612790565b612a9f8282856129db565b600060209050601f831160018114612ad25760008415612ac0578287015190505b612aca8582612a4c565b865550612b32565b601f198416612ae0866128bc565b60005b82811015612b0857848901518255600182019150602085019450602081019050612ae3565b86831015612b255784890151612b21601f891682612a2e565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b74826120a5565b9150612b7f836120a5565b9250828203905081811115612b9757612b96612b3a565b5b92915050565b6000612ba8826121a3565b612bb281856126e4565b9350612bc28185602086016121bf565b612bcb816121e9565b840191505092915050565b600060c082019050612beb6000830189612391565b8181036020830152612bfd8188612b9d565b90508181036040830152612c118187612b9d565b90508181036060830152612c258186612b9d565b9050612c3460808301856120af565b612c4160a0830184612391565b979650505050505050565b7f496e697469616c416d6f756e743a20696e76616c696420696e697469616c204160008201527f6d6f756e74210000000000000000000000000000000000000000000000000000602082015250565b6000612ca86026836126e4565b9150612cb382612c4c565b604082019050919050565b60006020820190508181036000830152612cd781612c9b565b9050919050565b600060c0820190508181036000830152612cf88189612b9d565b90508181036020830152612d0c8188612b9d565b90508181036040830152612d208187612b9d565b9050612d2f6060830186612391565b612d3c60808301856120af565b612d4960a08301846120af565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ddf6026836126e4565b9150612dea82612d83565b604082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b6000606082019050612e2a6000830186612391565b612e376020830185612391565b612e4460408301846120e5565b949350505050565b600081519050612e5b8161204c565b92915050565b600060208284031215612e7757612e76612010565b5b6000612e8584828501612e4c565b91505092915050565b6000604082019050612ea36000830185612391565b612eb060208301846120af565b9392505050565b612ec0816120d9565b8114612ecb57600080fd5b50565b600081519050612edd81612eb7565b92915050565b600060208284031215612ef957612ef8612010565b5b6000612f0784828501612ece565b91505092915050565b6000819050919050565b6000612f35612f30612f2b84612f10565b612940565b6120a5565b9050919050565b612f4581612f1a565b82525050565b600060e082019050612f60600083018a612391565b612f6d60208301896120e5565b612f7a60408301886120af565b612f876060830187612f3c565b612f946080830186612f3c565b612fa160a0830185612391565b612fae60c08301846120af565b98975050505050505050565b600080600060608486031215612fd357612fd2612010565b5b6000612fe18682870161287a565b9350506020612ff28682870161287a565b92505060406130038682870161287a565b9150509250925092565b60006080820190506130226000830187612391565b61302f6020830186612391565b61303c6040830185612391565b6130496060830184612391565b95945050505050565b600060408201905061306760008301856120af565b61307460208301846120af565b9392505050565b600081905092915050565b50565b600061309660008361307b565b91506130a182613086565b600082019050919050565b60006130b782613089565b915081905091905056fe6080604052348015600f57600080fd5b5061172e8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806370a082311161007157806370a0823114610168578063767faf5d1461019857806395d89b41146101b4578063a9059cbb146101d2578063dd62ed3e14610202578063eac989f814610232576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610250565b6040516100c39190610dad565b60405180910390f35b6100e660048036038101906100e19190610e77565b6102f1565b6040516100f39190610ed2565b60405180910390f35b610104610314565b6040516101119190610efc565b60405180910390f35b610134600480360381019061012f9190610f17565b61032c565b6040516101419190610ed2565b60405180910390f35b61015261035b565b60405161015f9190610f86565b60405180910390f35b610182600480360381019061017d9190610fa1565b610364565b60405161018f9190610efc565b60405180910390f35b6101b260048036038101906101ad9190611103565b6103bb565b005b6101bc610482565b6040516101c99190610dad565b60405180910390f35b6101ec60048036038101906101e79190610e77565b610523565b6040516101f99190610ed2565b60405180910390f35b61021c600480360381019061021791906111e4565b610546565b6040516102299190610efc565b60405180910390f35b61023a6105db565b6040516102479190610dad565b60405180910390f35b6060600061025c610669565b905080600301805461026d90611253565b80601f016020809104026020016040519081016040528092919081815260200182805461029990611253565b80156102e65780601f106102bb576101008083540402835291602001916102e6565b820191906000526020600020905b8154815290600101906020018083116102c957829003601f168201915b505050505091505090565b6000806102fc610691565b9050610309818585610699565b600191505092915050565b60008061031f610669565b9050806002015491505090565b600080610337610691565b90506103448582856106ab565b61034f85858561073f565b60019150509392505050565b60006012905090565b60008061036f610669565b90508060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b600082116103fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f5906112f6565b60405180910390fd5b80821015610441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043890611362565b60405180910390fd5b61044b8686610833565b836000908161045a919061152e565b506104653382610841565b61047a838284610475919061162f565b610841565b505050505050565b6060600061048e610669565b905080600401805461049f90611253565b80601f01602080910402602001604051908101604052809291908181526020018280546104cb90611253565b80156105185780601f106104ed57610100808354040283529160200191610518565b820191906000526020600020905b8154815290600101906020018083116104fb57829003601f168201915b505050505091505090565b60008061052e610691565b905061053b81858561073f565b600191505092915050565b600080610551610669565b90508060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505092915050565b600080546105e890611253565b80601f016020809104026020016040519081016040528092919081815260200182805461061490611253565b80156106615780601f1061063657610100808354040283529160200191610661565b820191906000526020600020905b81548152906001019060200180831161064457829003601f168201915b505050505081565b60007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b600033905090565b6106a683838360016108c3565b505050565b60006106b78484610546565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107395781811015610729578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161072093929190611672565b60405180910390fd5b610738848484840360006108c3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107b15760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016107a891906116a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108235760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161081a91906116a9565b60405180910390fd5b61082e838383610aa9565b505050565b61083d8282610ce8565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108b35760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108aa91906116a9565b60405180910390fd5b6108bf60008383610aa9565b5050565b60006108cd610669565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109415760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161093891906116a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036109b35760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016109aa91906116a9565b60405180910390fd5b828160010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508115610aa2578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610a999190610efc565b60405180910390a35b5050505050565b6000610ab3610669565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b095781816002016000828254610afd91906116c4565b92505081905550610be2565b60008160000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b98578481846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610b8f93929190611672565b60405180910390fd5b8281038260000160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c2d57818160020160008282540392505081905550610c7d565b818160000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cda9190610efc565b60405180910390a350505050565b6000610cf2610669565b905082816003019081610d05919061152e565b5081816004019081610d17919061152e565b50505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610d57578082015181840152602081019050610d3c565b60008484015250505050565b6000601f19601f8301169050919050565b6000610d7f82610d1d565b610d898185610d28565b9350610d99818560208601610d39565b610da281610d63565b840191505092915050565b60006020820190508181036000830152610dc78184610d74565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0e82610de3565b9050919050565b610e1e81610e03565b8114610e2957600080fd5b50565b600081359050610e3b81610e15565b92915050565b6000819050919050565b610e5481610e41565b8114610e5f57600080fd5b50565b600081359050610e7181610e4b565b92915050565b60008060408385031215610e8e57610e8d610dd9565b5b6000610e9c85828601610e2c565b9250506020610ead85828601610e62565b9150509250929050565b60008115159050919050565b610ecc81610eb7565b82525050565b6000602082019050610ee76000830184610ec3565b92915050565b610ef681610e41565b82525050565b6000602082019050610f116000830184610eed565b92915050565b600080600060608486031215610f3057610f2f610dd9565b5b6000610f3e86828701610e2c565b9350506020610f4f86828701610e2c565b9250506040610f6086828701610e62565b9150509250925092565b600060ff82169050919050565b610f8081610f6a565b82525050565b6000602082019050610f9b6000830184610f77565b92915050565b600060208284031215610fb757610fb6610dd9565b5b6000610fc584828501610e2c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61101082610d63565b810181811067ffffffffffffffff8211171561102f5761102e610fd8565b5b80604052505050565b6000611042610dcf565b905061104e8282611007565b919050565b600067ffffffffffffffff82111561106e5761106d610fd8565b5b61107782610d63565b9050602081019050919050565b82818337600083830152505050565b60006110a66110a184611053565b611038565b9050828152602081018484840111156110c2576110c1610fd3565b5b6110cd848285611084565b509392505050565b600082601f8301126110ea576110e9610fce565b5b81356110fa848260208601611093565b91505092915050565b60008060008060008060c087890312156111205761111f610dd9565b5b600087013567ffffffffffffffff81111561113e5761113d610dde565b5b61114a89828a016110d5565b965050602087013567ffffffffffffffff81111561116b5761116a610dde565b5b61117789828a016110d5565b955050604087013567ffffffffffffffff81111561119857611197610dde565b5b6111a489828a016110d5565b94505060606111b589828a01610e2c565b93505060806111c689828a01610e62565b92505060a06111d789828a01610e62565b9150509295509295509295565b600080604083850312156111fb576111fa610dd9565b5b600061120985828601610e2c565b925050602061121a85828601610e2c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061126b57607f821691505b60208210810361127e5761127d611224565b5b50919050565b7f496e697469616c20737570706c79206d7573742062652067726561746572207460008201527f68616e2030000000000000000000000000000000000000000000000000000000602082015250565b60006112e0602583610d28565b91506112eb82611284565b604082019050919050565b6000602082019050818103600083015261130f816112d3565b9050919050565b7f496e76616c696420696e697469616c20416d6f756e7421000000000000000000600082015250565b600061134c601783610d28565b915061135782611316565b602082019050919050565b6000602082019050818103600083015261137b8161133f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026113e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826113a7565b6113ee86836113a7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061142b61142661142184610e41565b611406565b610e41565b9050919050565b6000819050919050565b61144583611410565b61145961145182611432565b8484546113b4565b825550505050565b600090565b61146e611461565b61147981848461143c565b505050565b5b8181101561149d57611492600082611466565b60018101905061147f565b5050565b601f8211156114e2576114b381611382565b6114bc84611397565b810160208510156114cb578190505b6114df6114d785611397565b83018261147e565b50505b505050565b600082821c905092915050565b6000611505600019846008026114e7565b1980831691505092915050565b600061151e83836114f4565b9150826002028217905092915050565b61153782610d1d565b67ffffffffffffffff8111156115505761154f610fd8565b5b61155a8254611253565b6115658282856114a1565b600060209050601f8311600181146115985760008415611586578287015190505b6115908582611512565b8655506115f8565b601f1984166115a686611382565b60005b828110156115ce578489015182556001820191506020850194506020810190506115a9565b868310156115eb57848901516115e7601f8916826114f4565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061163a82610e41565b915061164583610e41565b925082820390508181111561165d5761165c611600565b5b92915050565b61166c81610e03565b82525050565b60006060820190506116876000830186611663565b6116946020830185610eed565b6116a16040830184610eed565b949350505050565b60006020820190506116be6000830184611663565b92915050565b60006116cf82610e41565b91506116da83610e41565b92508282019050808211156116f2576116f1611600565b5b9291505056fea2646970667358221220d62a2c6cc590fe936385d28ab99e16a87b95ffa0e46b455811328e30b9bb2cc764736f6c634300081c0033a2646970667358221220809670f1867e9bcf7b3be26d1b7d81c84dc1d9ac0dbd4416f4ad96b6bbfbfec064736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.