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 | |||
---|---|---|---|---|---|---|
1735366 | 7 days ago | 0.1 S | ||||
1735366 | 7 days ago | Contract Creation | 0 S | |||
1735092 | 7 days ago | 0.1 S | ||||
1735092 | 7 days ago | Contract Creation | 0 S | |||
1735014 | 7 days ago | 0.1 S | ||||
1735014 | 7 days ago | Contract Creation | 0 S | |||
1730884 | 7 days ago | 0.1 S | ||||
1730884 | 7 days ago | Contract Creation | 0 S | |||
1730517 | 7 days ago | 0.1 S | ||||
1730517 | 7 days ago | Contract Creation | 0 S | |||
1726058 | 8 days ago | 0.01 S | ||||
1726058 | 8 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); 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 { Sp33dFunToken instance = new Sp33dFunToken(); Sp33dFunToken(instance).initialize( name, symbol, uri, MAX_SUPPLY ); uint256 initialAmount = msg.value; handleLiquidity(address(instance), initialAmount); 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, uint256 _initialAmount) internal { address pair = factory.createPair(_token, WETH, false); uint256 tokenBalance = IERC20(_token).balanceOf(address(this)); IERC20(_token).approve(address(router), tokenBalance); (, , uint amount) = router.addLiquidityETH{value: _initialAmount}( address(_token), false, tokenBalance, 0, 0, address(this), // keep the LP tokens block.timestamp ); IERC20(pair).transfer(address(0), amount); emit HandleLiquidity(address(this), 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; } // 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; bool initialized = false; modifier checkInitialize() { require(initialized == false, "Already initialized!"); _; initialized = true; } function initialize( string memory _name, string memory _symbol, string memory _uri, uint256 initialSupply ) external checkInitialize { require(initialSupply > 0, "Initial supply must be greater than 0"); __ERC20_init(_name, _symbol); uri = _uri; _mint(msg.sender, initialSupply); } }
{ "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":[{"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":"_maxSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526b033b2e3c9fd0803ce8000000600355348015601f57600080fd5b506000339050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506146a0806100d06000396000f3fe6080604052600436106100ec5760003560e01c8063c4ae31681161008a578063e904836111610059578063e9048361146102bc578063e9cf64e6146102d3578063f103b433146102fc578063f2fde38b14610325576100f3565b8063c4ae316814610223578063cb2df3111461023a578063e170604514610263578063e4b50cb81461027f576100f3565b80635c975abb116100c65780635c975abb1461018b578063715018a6146101b657806385e3c1d4146101cd5780638da5cb5b146101f8576100f3565b806304bc3b1c146100f857806332cb6b0c14610135578063574f2ba314610160576100f3565b366100f357005b600080fd5b34801561010457600080fd5b5061011f600480360381019061011a9190611fab565b61034e565b60405161012c9190611ff1565b60405180910390f35b34801561014157600080fd5b5061014a610366565b6040516101579190611ff1565b60405180910390f35b34801561016c57600080fd5b5061017561036c565b6040516101829190611ff1565b60405180910390f35b34801561019757600080fd5b506101a0610379565b6040516101ad9190612027565b60405180910390f35b3480156101c257600080fd5b506101cb61039e565b005b3480156101d957600080fd5b506101e26104ea565b6040516101ef9190612249565b60405180910390f35b34801561020457600080fd5b5061020d6107b5565b60405161021a919061227a565b60405180910390f35b34801561022f57600080fd5b506102386107de565b005b34801561024657600080fd5b50610261600480360381019061025c9190612295565b610891565b005b61027d6004803603810190610278919061240a565b610ea6565b005b34801561028b57600080fd5b506102a660048036038101906102a191906124f1565b61115e565b6040516102b391906125b5565b60405180910390f35b3480156102c857600080fd5b506102d16114a3565b005b3480156102df57600080fd5b506102fa60048036038101906102f591906125d7565b611563565b005b34801561030857600080fd5b50610323600480360381019061031e91906124f1565b6116b9565b005b34801561033157600080fd5b5061034c60048036038101906103479190611fab565b611751565b005b60026020528060005260406000206000915090505481565b60035481565b6000600180549050905090565b60008061038461190b565b90508060000160009054906101000a900460ff1691505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461042c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042390612674565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606001805480602002602001604051908101604052809291908181526020016000905b828210156107ac57838290600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546105ed906126c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610619906126c3565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050815260200160038201805461067f906126c3565b80601f01602080910402602001604051908101604052809291908181526020018280546106ab906126c3565b80156106f85780601f106106cd576101008083540402835291602001916106f8565b820191906000526020600020905b8154815290600101906020018083116106db57829003601f168201915b50505050508152602001600482018054610711906126c3565b80601f016020809104026020016040519081016040528092919081815260200182805461073d906126c3565b801561078a5780601f1061075f5761010080835404028352916020019161078a565b820191906000526020600020905b81548152906001019060200180831161076d57829003601f168201915b505050505081526020016005820154815250508152602001906001019061050e565b50505050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086390612674565b60405180910390fd5b610874610379565b1561088657610881611933565b61088f565b61088e6119a5565b5b565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690612674565b60405180910390fd5b60016040518060c001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109af573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109d89190612764565b81526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a28573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a519190612764565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610aca9190612764565b81526020018373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3e91906127c2565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081610c0d919061299b565b506060820151816003019081610c23919061299b565b506080820151816004019081610c39919061299b565b5060a08201518160050155505060018080549050610c579190612a9c565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d828273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d07573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d309190612764565b8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610da49190612764565b8473ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610def573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e189190612764565b8573ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8791906127c2565b86604051610e9a96959493929190612b09565b60405180910390a15050565b610eae611a17565b6000604051610ebc90611eca565b604051809103906000f080158015610ed8573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff16631c5d2b498585856003546040518563ffffffff1660e01b8152600401610f1c9493929190612b7f565b600060405180830381600087803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b505050506000349050610f5d8282611a58565b60016040518060c001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001600354815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611086919061299b565b50606082015181600301908161109c919061299b565b5060808201518160040190816110b2919061299b565b5060a082015181600501555050600180805490506110d09190612a9c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d868686866003548760405161114e96959493929190612b09565b60405180910390a1505050505050565b611166611ed7565b6001805490508210611202576040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016040518060200160405280600081525081526020016040518060200160405280600081525081526020016040518060200160405280600081525081526020016000815250905061149e565b6001828154811061121657611215612bd9565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546112eb906126c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611317906126c3565b80156113645780601f1061133957610100808354040283529160200191611364565b820191906000526020600020905b81548152906001019060200180831161134757829003601f168201915b5050505050815260200160038201805461137d906126c3565b80601f01602080910402602001604051908101604052809291908181526020018280546113a9906126c3565b80156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b5050505050815260200160048201805461140f906126c3565b80601f016020809104026020016040519081016040528092919081815260200182805461143b906126c3565b80156114885780601f1061145d57610100808354040283529160200191611488565b820191906000526020600020905b81548152906001019060200180831161146b57829003601f168201915b5050505050815260200160058201548152505090505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890612674565b60405180910390fd5b6115614761153d6107b5565b73ffffffffffffffffffffffffffffffffffffffff16611d9390919063ffffffff16565b565b60018054905082106115a1576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600183815481106115cc576115cb612bd9565b5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461164b576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001838154811061166157611660612bd9565b5b90600052602060002090600602019050818160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90612674565b60405180910390fd5b8060038190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d690612674565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590612c7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b61193b611e82565b600061194561190b565b905060008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61198d611ec2565b60405161199a919061227a565b60405180910390a150565b6119ad611a17565b60006119b761190b565b905060018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119ff611ec2565b604051611a0c919061227a565b60405180910390a150565b611a1f610379565b15611a56576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600073ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc73ffffffffffffffffffffffffffffffffffffffff166382dfdce48473039e2fb66102314ce7b64ce5ce3e5183bc94ad3860006040518463ffffffff1660e01b8152600401611ac093929190612c9a565b6020604051808303816000875af1158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b039190612ce6565b905060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b40919061227a565b602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906127c2565b90508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b373cc6169aa1e879d3a4227536671f85afdb2d23fad836040518363ffffffff1660e01b8152600401611bd2929190612d13565b6020604051808303816000875af1158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190612d68565b50600073cc6169aa1e879d3a4227536671f85afdb2d23fad73ffffffffffffffffffffffffffffffffffffffff1663b7e0d4c0858760008660008030426040518963ffffffff1660e01b8152600401611c749796959493929190612dd0565b60606040518083038185885af1158015611c92573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611cb79190612e3f565b925050508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000836040518363ffffffff1660e01b8152600401611cf7929190612d13565b6020604051808303816000875af1158015611d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3a9190612d68565b507f754a671be8cbd29278911b8d2a0a79e44f20003eef4b4c286a9006bcbbe4a5993073039e2fb66102314ce7b64ce5ce3e5183bc94ad388786604051611d849493929190612e92565b60405180910390a15050505050565b80471015611dda5747816040517fcf479181000000000000000000000000000000000000000000000000000000008152600401611dd1929190612ed7565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611e0090612f31565b60006040518083038185875af1925050503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b5050905080611e7d576040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b611e8a610379565b611ec0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b61172480612f4783390190565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f7882611f4d565b9050919050565b611f8881611f6d565b8114611f9357600080fd5b50565b600081359050611fa581611f7f565b92915050565b600060208284031215611fc157611fc0611f43565b5b6000611fcf84828501611f96565b91505092915050565b6000819050919050565b611feb81611fd8565b82525050565b60006020820190506120066000830184611fe2565b92915050565b60008115159050919050565b6120218161200c565b82525050565b600060208201905061203c6000830184612018565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61207781611f6d565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120b757808201518184015260208101905061209c565b60008484015250505050565b6000601f19601f8301169050919050565b60006120df8261207d565b6120e98185612088565b93506120f9818560208601612099565b612102816120c3565b840191505092915050565b61211681611fd8565b82525050565b600060c083016000830151612134600086018261206e565b506020830151612147602086018261206e565b506040830151848203604086015261215f82826120d4565b9150506060830151848203606086015261217982826120d4565b9150506080830151848203608086015261219382826120d4565b91505060a08301516121a860a086018261210d565b508091505092915050565b60006121bf838361211c565b905092915050565b6000602082019050919050565b60006121df82612042565b6121e9818561204d565b9350836020820285016121fb8561205e565b8060005b85811015612237578484038952815161221885826121b3565b9450612223836121c7565b925060208a019950506001810190506121ff565b50829750879550505050505092915050565b6000602082019050818103600083015261226381846121d4565b905092915050565b61227481611f6d565b82525050565b600060208201905061228f600083018461226b565b92915050565b600080604083850312156122ac576122ab611f43565b5b60006122ba85828601611f96565b92505060206122cb85828601611f96565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612317826120c3565b810181811067ffffffffffffffff82111715612336576123356122df565b5b80604052505050565b6000612349611f39565b9050612355828261230e565b919050565b600067ffffffffffffffff821115612375576123746122df565b5b61237e826120c3565b9050602081019050919050565b82818337600083830152505050565b60006123ad6123a88461235a565b61233f565b9050828152602081018484840111156123c9576123c86122da565b5b6123d484828561238b565b509392505050565b600082601f8301126123f1576123f06122d5565b5b813561240184826020860161239a565b91505092915050565b6000806000806080858703121561242457612423611f43565b5b600061243287828801611f96565b945050602085013567ffffffffffffffff81111561245357612452611f48565b5b61245f878288016123dc565b935050604085013567ffffffffffffffff8111156124805761247f611f48565b5b61248c878288016123dc565b925050606085013567ffffffffffffffff8111156124ad576124ac611f48565b5b6124b9878288016123dc565b91505092959194509250565b6124ce81611fd8565b81146124d957600080fd5b50565b6000813590506124eb816124c5565b92915050565b60006020828403121561250757612506611f43565b5b6000612515848285016124dc565b91505092915050565b600060c083016000830151612536600086018261206e565b506020830151612549602086018261206e565b506040830151848203604086015261256182826120d4565b9150506060830151848203606086015261257b82826120d4565b9150506080830151848203608086015261259582826120d4565b91505060a08301516125aa60a086018261210d565b508091505092915050565b600060208201905081810360008301526125cf818461251e565b905092915050565b600080604083850312156125ee576125ed611f43565b5b60006125fc858286016124dc565b925050602061260d85828601611f96565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061265e602083612617565b915061266982612628565b602082019050919050565b6000602082019050818103600083015261268d81612651565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126db57607f821691505b6020821081036126ee576126ed612694565b5b50919050565b60006127076127028461235a565b61233f565b905082815260208101848484011115612723576127226122da565b5b61272e848285612099565b509392505050565b600082601f83011261274b5761274a6122d5565b5b815161275b8482602086016126f4565b91505092915050565b60006020828403121561277a57612779611f43565b5b600082015167ffffffffffffffff81111561279857612797611f48565b5b6127a484828501612736565b91505092915050565b6000815190506127bc816124c5565b92915050565b6000602082840312156127d8576127d7611f43565b5b60006127e6848285016127ad565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026128517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612814565b61285b8683612814565b95508019841693508086168417925050509392505050565b6000819050919050565b600061289861289361288e84611fd8565b612873565b611fd8565b9050919050565b6000819050919050565b6128b28361287d565b6128c66128be8261289f565b848454612821565b825550505050565b600090565b6128db6128ce565b6128e68184846128a9565b505050565b5b8181101561290a576128ff6000826128d3565b6001810190506128ec565b5050565b601f82111561294f57612920816127ef565b61292984612804565b81016020851015612938578190505b61294c61294485612804565b8301826128eb565b50505b505050565b600082821c905092915050565b600061297260001984600802612954565b1980831691505092915050565b600061298b8383612961565b9150826002028217905092915050565b6129a48261207d565b67ffffffffffffffff8111156129bd576129bc6122df565b5b6129c782546126c3565b6129d282828561290e565b600060209050601f831160018114612a0557600084156129f3578287015190505b6129fd858261297f565b865550612a65565b601f198416612a13866127ef565b60005b82811015612a3b57848901518255600182019150602085019450602081019050612a16565b86831015612a585784890151612a54601f891682612961565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612aa782611fd8565b9150612ab283611fd8565b9250828203905081811115612aca57612ac9612a6d565b5b92915050565b6000612adb8261207d565b612ae58185612617565b9350612af5818560208601612099565b612afe816120c3565b840191505092915050565b600060c082019050612b1e600083018961226b565b8181036020830152612b308188612ad0565b90508181036040830152612b448187612ad0565b90508181036060830152612b588186612ad0565b9050612b676080830185611fe2565b612b7460a083018461226b565b979650505050505050565b60006080820190508181036000830152612b998187612ad0565b90508181036020830152612bad8186612ad0565b90508181036040830152612bc18185612ad0565b9050612bd06060830184611fe2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c64602683612617565b9150612c6f82612c08565b604082019050919050565b60006020820190508181036000830152612c9381612c57565b9050919050565b6000606082019050612caf600083018661226b565b612cbc602083018561226b565b612cc96040830184612018565b949350505050565b600081519050612ce081611f7f565b92915050565b600060208284031215612cfc57612cfb611f43565b5b6000612d0a84828501612cd1565b91505092915050565b6000604082019050612d28600083018561226b565b612d356020830184611fe2565b9392505050565b612d458161200c565b8114612d5057600080fd5b50565b600081519050612d6281612d3c565b92915050565b600060208284031215612d7e57612d7d611f43565b5b6000612d8c84828501612d53565b91505092915050565b6000819050919050565b6000612dba612db5612db084612d95565b612873565b611fd8565b9050919050565b612dca81612d9f565b82525050565b600060e082019050612de5600083018a61226b565b612df26020830189612018565b612dff6040830188611fe2565b612e0c6060830187612dc1565b612e196080830186612dc1565b612e2660a083018561226b565b612e3360c0830184611fe2565b98975050505050505050565b600080600060608486031215612e5857612e57611f43565b5b6000612e66868287016127ad565b9350506020612e77868287016127ad565b9250506040612e88868287016127ad565b9150509250925092565b6000608082019050612ea7600083018761226b565b612eb4602083018661226b565b612ec1604083018561226b565b612ece606083018461226b565b95945050505050565b6000604082019050612eec6000830185611fe2565b612ef96020830184611fe2565b9392505050565b600081905092915050565b50565b6000612f1b600083612f00565b9150612f2682612f0b565b600082019050919050565b6000612f3c82612f0e565b915081905091905056fe60806040526000600160006101000a81548160ff021916908315150217905550348015602a57600080fd5b506116ea8061003a6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063313ce56711610071578063313ce5671461016657806370a082311461018457806395d89b41146101b4578063a9059cbb146101d2578063dd62ed3e14610202578063eac989f814610232576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc5780631c5d2b491461011a57806323b872dd14610136575b600080fd5b6100b6610250565b6040516100c39190610dc3565b60405180910390f35b6100e660048036038101906100e19190610e8d565b6102f1565b6040516100f39190610ee8565b60405180910390f35b610104610314565b6040516101119190610f12565b60405180910390f35b610134600480360381019061012f9190611062565b61032c565b005b610150600480360381019061014b919061111d565b610409565b60405161015d9190610ee8565b60405180910390f35b61016e610438565b60405161017b919061118c565b60405180910390f35b61019e600480360381019061019991906111a7565b610441565b6040516101ab9190610f12565b60405180910390f35b6101bc610498565b6040516101c99190610dc3565b60405180910390f35b6101ec60048036038101906101e79190610e8d565b610539565b6040516101f99190610ee8565b60405180910390f35b61021c600480360381019061021791906111d4565b61055c565b6040516102299190610f12565b60405180910390f35b61023a6105f1565b6040516102479190610dc3565b60405180910390f35b6060600061025c61067f565b905080600301805461026d90611243565b80601f016020809104026020016040519081016040528092919081815260200182805461029990611243565b80156102e65780601f106102bb576101008083540402835291602001916102e6565b820191906000526020600020905b8154815290600101906020018083116102c957829003601f168201915b505050505091505090565b6000806102fc6106a7565b90506103098185856106af565b600191505092915050565b60008061031f61067f565b9050806002015491505090565b60001515600160009054906101000a900460ff16151514610382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610379906112c0565b60405180910390fd5b600081116103c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bc90611352565b60405180910390fd5b6103cf84846106c1565b81600090816103de919061151e565b506103e933826106cf565b60018060006101000a81548160ff02191690831515021790555050505050565b6000806104146106a7565b9050610421858285610751565b61042c8585856107e5565b60019150509392505050565b60006012905090565b60008061044c61067f565b90508060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b606060006104a461067f565b90508060040180546104b590611243565b80601f01602080910402602001604051908101604052809291908181526020018280546104e190611243565b801561052e5780601f106105035761010080835404028352916020019161052e565b820191906000526020600020905b81548152906001019060200180831161051157829003601f168201915b505050505091505090565b6000806105446106a7565b90506105518185856107e5565b600191505092915050565b60008061056761067f565b90508060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505092915050565b600080546105fe90611243565b80601f016020809104026020016040519081016040528092919081815260200182805461062a90611243565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b505050505081565b60007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b600033905090565b6106bc83838360016108d9565b505050565b6106cb8282610abf565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107415760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161073891906115ff565b60405180910390fd5b61074d60008383610af4565b5050565b600061075d848461055c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107df57818110156107cf578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016107c69392919061161a565b60405180910390fd5b6107de848484840360006108d9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108575760006040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161084e91906115ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108c95760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108c091906115ff565b60405180910390fd5b6108d4838383610af4565b505050565b60006108e361067f565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109575760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161094e91906115ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036109c95760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016109c091906115ff565b60405180910390fd5b828160010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508115610ab8578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610aaf9190610f12565b60405180910390a35b5050505050565b6000610ac961067f565b905082816003019081610adc919061151e565b5081816004019081610aee919061151e565b50505050565b6000610afe61067f565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b545781816002016000828254610b489190611680565b92505081905550610c2d565b60008160000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610be3578481846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610bda9392919061161a565b60405180910390fd5b8281038260000160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c7857818160020160008282540392505081905550610cc8565b818160000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d259190610f12565b60405180910390a350505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610d6d578082015181840152602081019050610d52565b60008484015250505050565b6000601f19601f8301169050919050565b6000610d9582610d33565b610d9f8185610d3e565b9350610daf818560208601610d4f565b610db881610d79565b840191505092915050565b60006020820190508181036000830152610ddd8184610d8a565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e2482610df9565b9050919050565b610e3481610e19565b8114610e3f57600080fd5b50565b600081359050610e5181610e2b565b92915050565b6000819050919050565b610e6a81610e57565b8114610e7557600080fd5b50565b600081359050610e8781610e61565b92915050565b60008060408385031215610ea457610ea3610def565b5b6000610eb285828601610e42565b9250506020610ec385828601610e78565b9150509250929050565b60008115159050919050565b610ee281610ecd565b82525050565b6000602082019050610efd6000830184610ed9565b92915050565b610f0c81610e57565b82525050565b6000602082019050610f276000830184610f03565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610f6f82610d79565b810181811067ffffffffffffffff82111715610f8e57610f8d610f37565b5b80604052505050565b6000610fa1610de5565b9050610fad8282610f66565b919050565b600067ffffffffffffffff821115610fcd57610fcc610f37565b5b610fd682610d79565b9050602081019050919050565b82818337600083830152505050565b600061100561100084610fb2565b610f97565b90508281526020810184848401111561102157611020610f32565b5b61102c848285610fe3565b509392505050565b600082601f83011261104957611048610f2d565b5b8135611059848260208601610ff2565b91505092915050565b6000806000806080858703121561107c5761107b610def565b5b600085013567ffffffffffffffff81111561109a57611099610df4565b5b6110a687828801611034565b945050602085013567ffffffffffffffff8111156110c7576110c6610df4565b5b6110d387828801611034565b935050604085013567ffffffffffffffff8111156110f4576110f3610df4565b5b61110087828801611034565b925050606061111187828801610e78565b91505092959194509250565b60008060006060848603121561113657611135610def565b5b600061114486828701610e42565b935050602061115586828701610e42565b925050604061116686828701610e78565b9150509250925092565b600060ff82169050919050565b61118681611170565b82525050565b60006020820190506111a1600083018461117d565b92915050565b6000602082840312156111bd576111bc610def565b5b60006111cb84828501610e42565b91505092915050565b600080604083850312156111eb576111ea610def565b5b60006111f985828601610e42565b925050602061120a85828601610e42565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061125b57607f821691505b60208210810361126e5761126d611214565b5b50919050565b7f416c726561647920696e697469616c697a656421000000000000000000000000600082015250565b60006112aa601483610d3e565b91506112b582611274565b602082019050919050565b600060208201905081810360008301526112d98161129d565b9050919050565b7f496e697469616c20737570706c79206d7573742062652067726561746572207460008201527f68616e2030000000000000000000000000000000000000000000000000000000602082015250565b600061133c602583610d3e565b9150611347826112e0565b604082019050919050565b6000602082019050818103600083015261136b8161132f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026113d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611397565b6113de8683611397565b95508019841693508086168417925050509392505050565b6000819050919050565b600061141b61141661141184610e57565b6113f6565b610e57565b9050919050565b6000819050919050565b61143583611400565b61144961144182611422565b8484546113a4565b825550505050565b600090565b61145e611451565b61146981848461142c565b505050565b5b8181101561148d57611482600082611456565b60018101905061146f565b5050565b601f8211156114d2576114a381611372565b6114ac84611387565b810160208510156114bb578190505b6114cf6114c785611387565b83018261146e565b50505b505050565b600082821c905092915050565b60006114f5600019846008026114d7565b1980831691505092915050565b600061150e83836114e4565b9150826002028217905092915050565b61152782610d33565b67ffffffffffffffff8111156115405761153f610f37565b5b61154a8254611243565b611555828285611491565b600060209050601f8311600181146115885760008415611576578287015190505b6115808582611502565b8655506115e8565b601f19841661159686611372565b60005b828110156115be57848901518255600182019150602085019450602081019050611599565b868310156115db57848901516115d7601f8916826114e4565b8355505b6001600288020188555050505b505050505050565b6115f981610e19565b82525050565b600060208201905061161460008301846115f0565b92915050565b600060608201905061162f60008301866115f0565b61163c6020830185610f03565b6116496040830184610f03565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061168b82610e57565b915061169683610e57565b92508282019050808211156116ae576116ad611651565b5b9291505056fea2646970667358221220be8060f7ca3c741084c472cc61b4e8c4cc204e3a7187f0d45d7cf06c129d1d4d64736f6c634300081c0033a26469706673582212206230ce29ee62f2bdfb332cc67ec4500bda7506ab404da25a12c2ae3c0b1f3a4f64736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106100ec5760003560e01c8063c4ae31681161008a578063e904836111610059578063e9048361146102bc578063e9cf64e6146102d3578063f103b433146102fc578063f2fde38b14610325576100f3565b8063c4ae316814610223578063cb2df3111461023a578063e170604514610263578063e4b50cb81461027f576100f3565b80635c975abb116100c65780635c975abb1461018b578063715018a6146101b657806385e3c1d4146101cd5780638da5cb5b146101f8576100f3565b806304bc3b1c146100f857806332cb6b0c14610135578063574f2ba314610160576100f3565b366100f357005b600080fd5b34801561010457600080fd5b5061011f600480360381019061011a9190611fab565b61034e565b60405161012c9190611ff1565b60405180910390f35b34801561014157600080fd5b5061014a610366565b6040516101579190611ff1565b60405180910390f35b34801561016c57600080fd5b5061017561036c565b6040516101829190611ff1565b60405180910390f35b34801561019757600080fd5b506101a0610379565b6040516101ad9190612027565b60405180910390f35b3480156101c257600080fd5b506101cb61039e565b005b3480156101d957600080fd5b506101e26104ea565b6040516101ef9190612249565b60405180910390f35b34801561020457600080fd5b5061020d6107b5565b60405161021a919061227a565b60405180910390f35b34801561022f57600080fd5b506102386107de565b005b34801561024657600080fd5b50610261600480360381019061025c9190612295565b610891565b005b61027d6004803603810190610278919061240a565b610ea6565b005b34801561028b57600080fd5b506102a660048036038101906102a191906124f1565b61115e565b6040516102b391906125b5565b60405180910390f35b3480156102c857600080fd5b506102d16114a3565b005b3480156102df57600080fd5b506102fa60048036038101906102f591906125d7565b611563565b005b34801561030857600080fd5b50610323600480360381019061031e91906124f1565b6116b9565b005b34801561033157600080fd5b5061034c60048036038101906103479190611fab565b611751565b005b60026020528060005260406000206000915090505481565b60035481565b6000600180549050905090565b60008061038461190b565b90508060000160009054906101000a900460ff1691505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461042c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042390612674565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606001805480602002602001604051908101604052809291908181526020016000905b828210156107ac57838290600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546105ed906126c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610619906126c3565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050815260200160038201805461067f906126c3565b80601f01602080910402602001604051908101604052809291908181526020018280546106ab906126c3565b80156106f85780601f106106cd576101008083540402835291602001916106f8565b820191906000526020600020905b8154815290600101906020018083116106db57829003601f168201915b50505050508152602001600482018054610711906126c3565b80601f016020809104026020016040519081016040528092919081815260200182805461073d906126c3565b801561078a5780601f1061075f5761010080835404028352916020019161078a565b820191906000526020600020905b81548152906001019060200180831161076d57829003601f168201915b505050505081526020016005820154815250508152602001906001019061050e565b50505050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086390612674565b60405180910390fd5b610874610379565b1561088657610881611933565b61088f565b61088e6119a5565b5b565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690612674565b60405180910390fd5b60016040518060c001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109af573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109d89190612764565b81526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a28573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a519190612764565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610aca9190612764565b81526020018373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3e91906127c2565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081610c0d919061299b565b506060820151816003019081610c23919061299b565b506080820151816004019081610c39919061299b565b5060a08201518160050155505060018080549050610c579190612a9c565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d828273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d07573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d309190612764565b8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610da49190612764565b8473ffffffffffffffffffffffffffffffffffffffff1663eac989f86040518163ffffffff1660e01b8152600401600060405180830381865afa158015610def573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e189190612764565b8573ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8791906127c2565b86604051610e9a96959493929190612b09565b60405180910390a15050565b610eae611a17565b6000604051610ebc90611eca565b604051809103906000f080158015610ed8573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff16631c5d2b498585856003546040518563ffffffff1660e01b8152600401610f1c9493929190612b7f565b600060405180830381600087803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b505050506000349050610f5d8282611a58565b60016040518060c001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001600354815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611086919061299b565b50606082015181600301908161109c919061299b565b5060808201518160040190816110b2919061299b565b5060a082015181600501555050600180805490506110d09190612a9c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5817009675d028c198e1f662814eee896d46b66f4c0085802b7996071590667d868686866003548760405161114e96959493929190612b09565b60405180910390a1505050505050565b611166611ed7565b6001805490508210611202576040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016040518060200160405280600081525081526020016040518060200160405280600081525081526020016040518060200160405280600081525081526020016000815250905061149e565b6001828154811061121657611215612bd9565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546112eb906126c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611317906126c3565b80156113645780601f1061133957610100808354040283529160200191611364565b820191906000526020600020905b81548152906001019060200180831161134757829003601f168201915b5050505050815260200160038201805461137d906126c3565b80601f01602080910402602001604051908101604052809291908181526020018280546113a9906126c3565b80156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b5050505050815260200160048201805461140f906126c3565b80601f016020809104026020016040519081016040528092919081815260200182805461143b906126c3565b80156114885780601f1061145d57610100808354040283529160200191611488565b820191906000526020600020905b81548152906001019060200180831161146b57829003601f168201915b5050505050815260200160058201548152505090505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890612674565b60405180910390fd5b6115614761153d6107b5565b73ffffffffffffffffffffffffffffffffffffffff16611d9390919063ffffffff16565b565b60018054905082106115a1576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600183815481106115cc576115cb612bd9565b5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461164b576040517f65cca54900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001838154811061166157611660612bd9565b5b90600052602060002090600602019050818160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90612674565b60405180910390fd5b8060038190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d690612674565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590612c7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b61193b611e82565b600061194561190b565b905060008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61198d611ec2565b60405161199a919061227a565b60405180910390a150565b6119ad611a17565b60006119b761190b565b905060018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119ff611ec2565b604051611a0c919061227a565b60405180910390a150565b611a1f610379565b15611a56576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600073ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc73ffffffffffffffffffffffffffffffffffffffff166382dfdce48473039e2fb66102314ce7b64ce5ce3e5183bc94ad3860006040518463ffffffff1660e01b8152600401611ac093929190612c9a565b6020604051808303816000875af1158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b039190612ce6565b905060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b40919061227a565b602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906127c2565b90508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b373cc6169aa1e879d3a4227536671f85afdb2d23fad836040518363ffffffff1660e01b8152600401611bd2929190612d13565b6020604051808303816000875af1158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190612d68565b50600073cc6169aa1e879d3a4227536671f85afdb2d23fad73ffffffffffffffffffffffffffffffffffffffff1663b7e0d4c0858760008660008030426040518963ffffffff1660e01b8152600401611c749796959493929190612dd0565b60606040518083038185885af1158015611c92573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611cb79190612e3f565b925050508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000836040518363ffffffff1660e01b8152600401611cf7929190612d13565b6020604051808303816000875af1158015611d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3a9190612d68565b507f754a671be8cbd29278911b8d2a0a79e44f20003eef4b4c286a9006bcbbe4a5993073039e2fb66102314ce7b64ce5ce3e5183bc94ad388786604051611d849493929190612e92565b60405180910390a15050505050565b80471015611dda5747816040517fcf479181000000000000000000000000000000000000000000000000000000008152600401611dd1929190612ed7565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611e0090612f31565b60006040518083038185875af1925050503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b5050905080611e7d576040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b611e8a610379565b611ec0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b61172480612f4783390190565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f7882611f4d565b9050919050565b611f8881611f6d565b8114611f9357600080fd5b50565b600081359050611fa581611f7f565b92915050565b600060208284031215611fc157611fc0611f43565b5b6000611fcf84828501611f96565b91505092915050565b6000819050919050565b611feb81611fd8565b82525050565b60006020820190506120066000830184611fe2565b92915050565b60008115159050919050565b6120218161200c565b82525050565b600060208201905061203c6000830184612018565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61207781611f6d565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120b757808201518184015260208101905061209c565b60008484015250505050565b6000601f19601f8301169050919050565b60006120df8261207d565b6120e98185612088565b93506120f9818560208601612099565b612102816120c3565b840191505092915050565b61211681611fd8565b82525050565b600060c083016000830151612134600086018261206e565b506020830151612147602086018261206e565b506040830151848203604086015261215f82826120d4565b9150506060830151848203606086015261217982826120d4565b9150506080830151848203608086015261219382826120d4565b91505060a08301516121a860a086018261210d565b508091505092915050565b60006121bf838361211c565b905092915050565b6000602082019050919050565b60006121df82612042565b6121e9818561204d565b9350836020820285016121fb8561205e565b8060005b85811015612237578484038952815161221885826121b3565b9450612223836121c7565b925060208a019950506001810190506121ff565b50829750879550505050505092915050565b6000602082019050818103600083015261226381846121d4565b905092915050565b61227481611f6d565b82525050565b600060208201905061228f600083018461226b565b92915050565b600080604083850312156122ac576122ab611f43565b5b60006122ba85828601611f96565b92505060206122cb85828601611f96565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612317826120c3565b810181811067ffffffffffffffff82111715612336576123356122df565b5b80604052505050565b6000612349611f39565b9050612355828261230e565b919050565b600067ffffffffffffffff821115612375576123746122df565b5b61237e826120c3565b9050602081019050919050565b82818337600083830152505050565b60006123ad6123a88461235a565b61233f565b9050828152602081018484840111156123c9576123c86122da565b5b6123d484828561238b565b509392505050565b600082601f8301126123f1576123f06122d5565b5b813561240184826020860161239a565b91505092915050565b6000806000806080858703121561242457612423611f43565b5b600061243287828801611f96565b945050602085013567ffffffffffffffff81111561245357612452611f48565b5b61245f878288016123dc565b935050604085013567ffffffffffffffff8111156124805761247f611f48565b5b61248c878288016123dc565b925050606085013567ffffffffffffffff8111156124ad576124ac611f48565b5b6124b9878288016123dc565b91505092959194509250565b6124ce81611fd8565b81146124d957600080fd5b50565b6000813590506124eb816124c5565b92915050565b60006020828403121561250757612506611f43565b5b6000612515848285016124dc565b91505092915050565b600060c083016000830151612536600086018261206e565b506020830151612549602086018261206e565b506040830151848203604086015261256182826120d4565b9150506060830151848203606086015261257b82826120d4565b9150506080830151848203608086015261259582826120d4565b91505060a08301516125aa60a086018261210d565b508091505092915050565b600060208201905081810360008301526125cf818461251e565b905092915050565b600080604083850312156125ee576125ed611f43565b5b60006125fc858286016124dc565b925050602061260d85828601611f96565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061265e602083612617565b915061266982612628565b602082019050919050565b6000602082019050818103600083015261268d81612651565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126db57607f821691505b6020821081036126ee576126ed612694565b5b50919050565b60006127076127028461235a565b61233f565b905082815260208101848484011115612723576127226122da565b5b61272e848285612099565b509392505050565b600082601f83011261274b5761274a6122d5565b5b815161275b8482602086016126f4565b91505092915050565b60006020828403121561277a57612779611f43565b5b600082015167ffffffffffffffff81111561279857612797611f48565b5b6127a484828501612736565b91505092915050565b6000815190506127bc816124c5565b92915050565b6000602082840312156127d8576127d7611f43565b5b60006127e6848285016127ad565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026128517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612814565b61285b8683612814565b95508019841693508086168417925050509392505050565b6000819050919050565b600061289861289361288e84611fd8565b612873565b611fd8565b9050919050565b6000819050919050565b6128b28361287d565b6128c66128be8261289f565b848454612821565b825550505050565b600090565b6128db6128ce565b6128e68184846128a9565b505050565b5b8181101561290a576128ff6000826128d3565b6001810190506128ec565b5050565b601f82111561294f57612920816127ef565b61292984612804565b81016020851015612938578190505b61294c61294485612804565b8301826128eb565b50505b505050565b600082821c905092915050565b600061297260001984600802612954565b1980831691505092915050565b600061298b8383612961565b9150826002028217905092915050565b6129a48261207d565b67ffffffffffffffff8111156129bd576129bc6122df565b5b6129c782546126c3565b6129d282828561290e565b600060209050601f831160018114612a0557600084156129f3578287015190505b6129fd858261297f565b865550612a65565b601f198416612a13866127ef565b60005b82811015612a3b57848901518255600182019150602085019450602081019050612a16565b86831015612a585784890151612a54601f891682612961565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612aa782611fd8565b9150612ab283611fd8565b9250828203905081811115612aca57612ac9612a6d565b5b92915050565b6000612adb8261207d565b612ae58185612617565b9350612af5818560208601612099565b612afe816120c3565b840191505092915050565b600060c082019050612b1e600083018961226b565b8181036020830152612b308188612ad0565b90508181036040830152612b448187612ad0565b90508181036060830152612b588186612ad0565b9050612b676080830185611fe2565b612b7460a083018461226b565b979650505050505050565b60006080820190508181036000830152612b998187612ad0565b90508181036020830152612bad8186612ad0565b90508181036040830152612bc18185612ad0565b9050612bd06060830184611fe2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c64602683612617565b9150612c6f82612c08565b604082019050919050565b60006020820190508181036000830152612c9381612c57565b9050919050565b6000606082019050612caf600083018661226b565b612cbc602083018561226b565b612cc96040830184612018565b949350505050565b600081519050612ce081611f7f565b92915050565b600060208284031215612cfc57612cfb611f43565b5b6000612d0a84828501612cd1565b91505092915050565b6000604082019050612d28600083018561226b565b612d356020830184611fe2565b9392505050565b612d458161200c565b8114612d5057600080fd5b50565b600081519050612d6281612d3c565b92915050565b600060208284031215612d7e57612d7d611f43565b5b6000612d8c84828501612d53565b91505092915050565b6000819050919050565b6000612dba612db5612db084612d95565b612873565b611fd8565b9050919050565b612dca81612d9f565b82525050565b600060e082019050612de5600083018a61226b565b612df26020830189612018565b612dff6040830188611fe2565b612e0c6060830187612dc1565b612e196080830186612dc1565b612e2660a083018561226b565b612e3360c0830184611fe2565b98975050505050505050565b600080600060608486031215612e5857612e57611f43565b5b6000612e66868287016127ad565b9350506020612e77868287016127ad565b9250506040612e88868287016127ad565b9150509250925092565b6000608082019050612ea7600083018761226b565b612eb4602083018661226b565b612ec1604083018561226b565b612ece606083018461226b565b95945050505050565b6000604082019050612eec6000830185611fe2565b612ef96020830184611fe2565b9392505050565b600081905092915050565b50565b6000612f1b600083612f00565b9150612f2682612f0b565b600082019050919050565b6000612f3c82612f0e565b915081905091905056fe60806040526000600160006101000a81548160ff021916908315150217905550348015602a57600080fd5b506116ea8061003a6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063313ce56711610071578063313ce5671461016657806370a082311461018457806395d89b41146101b4578063a9059cbb146101d2578063dd62ed3e14610202578063eac989f814610232576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc5780631c5d2b491461011a57806323b872dd14610136575b600080fd5b6100b6610250565b6040516100c39190610dc3565b60405180910390f35b6100e660048036038101906100e19190610e8d565b6102f1565b6040516100f39190610ee8565b60405180910390f35b610104610314565b6040516101119190610f12565b60405180910390f35b610134600480360381019061012f9190611062565b61032c565b005b610150600480360381019061014b919061111d565b610409565b60405161015d9190610ee8565b60405180910390f35b61016e610438565b60405161017b919061118c565b60405180910390f35b61019e600480360381019061019991906111a7565b610441565b6040516101ab9190610f12565b60405180910390f35b6101bc610498565b6040516101c99190610dc3565b60405180910390f35b6101ec60048036038101906101e79190610e8d565b610539565b6040516101f99190610ee8565b60405180910390f35b61021c600480360381019061021791906111d4565b61055c565b6040516102299190610f12565b60405180910390f35b61023a6105f1565b6040516102479190610dc3565b60405180910390f35b6060600061025c61067f565b905080600301805461026d90611243565b80601f016020809104026020016040519081016040528092919081815260200182805461029990611243565b80156102e65780601f106102bb576101008083540402835291602001916102e6565b820191906000526020600020905b8154815290600101906020018083116102c957829003601f168201915b505050505091505090565b6000806102fc6106a7565b90506103098185856106af565b600191505092915050565b60008061031f61067f565b9050806002015491505090565b60001515600160009054906101000a900460ff16151514610382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610379906112c0565b60405180910390fd5b600081116103c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bc90611352565b60405180910390fd5b6103cf84846106c1565b81600090816103de919061151e565b506103e933826106cf565b60018060006101000a81548160ff02191690831515021790555050505050565b6000806104146106a7565b9050610421858285610751565b61042c8585856107e5565b60019150509392505050565b60006012905090565b60008061044c61067f565b90508060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b606060006104a461067f565b90508060040180546104b590611243565b80601f01602080910402602001604051908101604052809291908181526020018280546104e190611243565b801561052e5780601f106105035761010080835404028352916020019161052e565b820191906000526020600020905b81548152906001019060200180831161051157829003601f168201915b505050505091505090565b6000806105446106a7565b90506105518185856107e5565b600191505092915050565b60008061056761067f565b90508060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505092915050565b600080546105fe90611243565b80601f016020809104026020016040519081016040528092919081815260200182805461062a90611243565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b505050505081565b60007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b600033905090565b6106bc83838360016108d9565b505050565b6106cb8282610abf565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107415760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161073891906115ff565b60405180910390fd5b61074d60008383610af4565b5050565b600061075d848461055c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107df57818110156107cf578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016107c69392919061161a565b60405180910390fd5b6107de848484840360006108d9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108575760006040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161084e91906115ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108c95760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108c091906115ff565b60405180910390fd5b6108d4838383610af4565b505050565b60006108e361067f565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109575760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161094e91906115ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036109c95760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016109c091906115ff565b60405180910390fd5b828160010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508115610ab8578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610aaf9190610f12565b60405180910390a35b5050505050565b6000610ac961067f565b905082816003019081610adc919061151e565b5081816004019081610aee919061151e565b50505050565b6000610afe61067f565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b545781816002016000828254610b489190611680565b92505081905550610c2d565b60008160000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610be3578481846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610bda9392919061161a565b60405180910390fd5b8281038260000160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c7857818160020160008282540392505081905550610cc8565b818160000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d259190610f12565b60405180910390a350505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610d6d578082015181840152602081019050610d52565b60008484015250505050565b6000601f19601f8301169050919050565b6000610d9582610d33565b610d9f8185610d3e565b9350610daf818560208601610d4f565b610db881610d79565b840191505092915050565b60006020820190508181036000830152610ddd8184610d8a565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e2482610df9565b9050919050565b610e3481610e19565b8114610e3f57600080fd5b50565b600081359050610e5181610e2b565b92915050565b6000819050919050565b610e6a81610e57565b8114610e7557600080fd5b50565b600081359050610e8781610e61565b92915050565b60008060408385031215610ea457610ea3610def565b5b6000610eb285828601610e42565b9250506020610ec385828601610e78565b9150509250929050565b60008115159050919050565b610ee281610ecd565b82525050565b6000602082019050610efd6000830184610ed9565b92915050565b610f0c81610e57565b82525050565b6000602082019050610f276000830184610f03565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610f6f82610d79565b810181811067ffffffffffffffff82111715610f8e57610f8d610f37565b5b80604052505050565b6000610fa1610de5565b9050610fad8282610f66565b919050565b600067ffffffffffffffff821115610fcd57610fcc610f37565b5b610fd682610d79565b9050602081019050919050565b82818337600083830152505050565b600061100561100084610fb2565b610f97565b90508281526020810184848401111561102157611020610f32565b5b61102c848285610fe3565b509392505050565b600082601f83011261104957611048610f2d565b5b8135611059848260208601610ff2565b91505092915050565b6000806000806080858703121561107c5761107b610def565b5b600085013567ffffffffffffffff81111561109a57611099610df4565b5b6110a687828801611034565b945050602085013567ffffffffffffffff8111156110c7576110c6610df4565b5b6110d387828801611034565b935050604085013567ffffffffffffffff8111156110f4576110f3610df4565b5b61110087828801611034565b925050606061111187828801610e78565b91505092959194509250565b60008060006060848603121561113657611135610def565b5b600061114486828701610e42565b935050602061115586828701610e42565b925050604061116686828701610e78565b9150509250925092565b600060ff82169050919050565b61118681611170565b82525050565b60006020820190506111a1600083018461117d565b92915050565b6000602082840312156111bd576111bc610def565b5b60006111cb84828501610e42565b91505092915050565b600080604083850312156111eb576111ea610def565b5b60006111f985828601610e42565b925050602061120a85828601610e42565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061125b57607f821691505b60208210810361126e5761126d611214565b5b50919050565b7f416c726561647920696e697469616c697a656421000000000000000000000000600082015250565b60006112aa601483610d3e565b91506112b582611274565b602082019050919050565b600060208201905081810360008301526112d98161129d565b9050919050565b7f496e697469616c20737570706c79206d7573742062652067726561746572207460008201527f68616e2030000000000000000000000000000000000000000000000000000000602082015250565b600061133c602583610d3e565b9150611347826112e0565b604082019050919050565b6000602082019050818103600083015261136b8161132f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026113d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611397565b6113de8683611397565b95508019841693508086168417925050509392505050565b6000819050919050565b600061141b61141661141184610e57565b6113f6565b610e57565b9050919050565b6000819050919050565b61143583611400565b61144961144182611422565b8484546113a4565b825550505050565b600090565b61145e611451565b61146981848461142c565b505050565b5b8181101561148d57611482600082611456565b60018101905061146f565b5050565b601f8211156114d2576114a381611372565b6114ac84611387565b810160208510156114bb578190505b6114cf6114c785611387565b83018261146e565b50505b505050565b600082821c905092915050565b60006114f5600019846008026114d7565b1980831691505092915050565b600061150e83836114e4565b9150826002028217905092915050565b61152782610d33565b67ffffffffffffffff8111156115405761153f610f37565b5b61154a8254611243565b611555828285611491565b600060209050601f8311600181146115885760008415611576578287015190505b6115808582611502565b8655506115e8565b601f19841661159686611372565b60005b828110156115be57848901518255600182019150602085019450602081019050611599565b868310156115db57848901516115d7601f8916826114e4565b8355505b6001600288020188555050505b505050505050565b6115f981610e19565b82525050565b600060208201905061161460008301846115f0565b92915050565b600060608201905061162f60008301866115f0565b61163c6020830185610f03565b6116496040830184610f03565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061168b82610e57565b915061169683610e57565b92508282019050808211156116ae576116ad611651565b5b9291505056fea2646970667358221220be8060f7ca3c741084c472cc61b4e8c4cc204e3a7187f0d45d7cf06c129d1d4d64736f6c634300081c0033a26469706673582212206230ce29ee62f2bdfb332cc67ec4500bda7506ab404da25a12c2ae3c0b1f3a4f64736f6c634300081c0033
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.