Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 15 from a total of 15 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Facet Patter... | 16143537 | 746 days ago | IN | 0 ETH | 0.00324057 | ||||
Add Facet Patter... | 15535629 | 831 days ago | IN | 0 ETH | 0.00175314 | ||||
Add Facet Patter... | 15463732 | 842 days ago | IN | 0 ETH | 0.00290284 | ||||
Add Facet Patter... | 15435913 | 847 days ago | IN | 0 ETH | 0.00578959 | ||||
Add Facet Patter... | 15380693 | 856 days ago | IN | 0 ETH | 0.00319139 | ||||
Add Facet Patter... | 15349268 | 861 days ago | IN | 0 ETH | 0.00300933 | ||||
Add Facet Patter... | 15303352 | 868 days ago | IN | 0 ETH | 0.00486746 | ||||
Add Facet Patter... | 15132313 | 894 days ago | IN | 0 ETH | 0.00275095 | ||||
Add Facet Patter... | 14993262 | 918 days ago | IN | 0 ETH | 0.00740513 | ||||
Add Facet Patter... | 14993223 | 918 days ago | IN | 0 ETH | 0.01453416 | ||||
Set Facet For ER... | 14964915 | 923 days ago | IN | 0 ETH | 0.00146697 | ||||
Set Facet For ER... | 14949129 | 925 days ago | IN | 0 ETH | 0.00120673 | ||||
Set Facet For ER... | 14949124 | 925 days ago | IN | 0 ETH | 0.00122657 | ||||
Set Facet For ER... | 14949072 | 925 days ago | IN | 0 ETH | 0.00192369 | ||||
Add Facet Patter... | 14949071 | 925 days ago | IN | 0 ETH | 0.06956434 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
DiamondSaw
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import {IDiamondCut} from "./facets/DiamondClone/IDiamondCut.sol"; import {IDiamondLoupe} from "./facets/DiamondClone/IDiamondLoupe.sol"; import {DiamondSawLib} from "./libraries/DiamondSawLib.sol"; import {BasicAccessControlFacet} from "./facets/AccessControl/BasicAccessControlFacet.sol"; import {AccessControlModifiers} from "./facets/AccessControl/AccessControlModifiers.sol"; import {AccessControlLib} from "./facets/AccessControl/AccessControlLib.sol"; import {PausableFacet} from "./facets/Pausable/PausableFacet.sol"; import {PausableModifiers} from "./facets/Pausable/PausableModifiers.sol"; /** * DiamondSaw is meant to be used as a * Singleton to "cut" many minimal diamond clones * In a gas efficient manner for deployments. * * This is accomplished by handling the storage intensive * selector mappings in one contract, "the saw" instead of in each diamond. * * Adding a new facet to the saw enables new diamond "patterns" * * This should be used if you * * 1. Need cheap deployments of many similar cloned diamonds that * utilize the same pre-deployed facets * * 2. Are okay with gas overhead on write txn to the diamonds * to communicate with the singleton (saw) to fetch selectors * */ contract DiamondSaw is BasicAccessControlFacet, AccessControlModifiers, PausableFacet, PausableModifiers { constructor() { AccessControlLib._transferOwnership(msg.sender); } function addFacetPattern( IDiamondCut.FacetCut[] calldata _facetAdds, address _init, bytes calldata _calldata ) external onlyOwner whenNotPaused { DiamondSawLib.diamondCutAddOnly(_facetAdds, _init, _calldata); } // if a facet has no selectors, it is not supported function checkFacetSupported(address _facetAddress) external view { DiamondSawLib.checkFacetSupported(_facetAddress); } function facetAddressForSelector(bytes4 selector) external view returns (address) { return DiamondSawLib .diamondSawStorage() .selectorToFacetAndPosition[selector] .facetAddress; } function functionSelectorsForFacetAddress(address facetAddress) external view returns (bytes4[] memory) { return DiamondSawLib .diamondSawStorage() .facetFunctionSelectors[facetAddress] .functionSelectors; } function allFacetAddresses() external view returns (address[] memory) { return DiamondSawLib.diamondSawStorage().facetAddresses; } function allFacetsWithSelectors() external view returns (IDiamondLoupe.Facet[] memory _facetsWithSelectors) { DiamondSawLib.DiamondSawStorage storage ds = DiamondSawLib .diamondSawStorage(); uint256 numFacets = ds.facetAddresses.length; _facetsWithSelectors = new IDiamondLoupe.Facet[](numFacets); for (uint256 i; i < numFacets; i++) { address facetAddress_ = ds.facetAddresses[i]; _facetsWithSelectors[i].facetAddress = facetAddress_; _facetsWithSelectors[i].functionSelectors = ds .facetFunctionSelectors[facetAddress_] .functionSelectors; } } function facetAddressForInterface(bytes4 _interface) external view returns (address) { DiamondSawLib.DiamondSawStorage storage ds = DiamondSawLib .diamondSawStorage(); return ds.interfaceToFacet[_interface]; } function setFacetForERC165Interface(bytes4 _interface, address _facet) external onlyOwner whenNotPaused { DiamondSawLib.checkFacetSupported(_facet); require( DiamondSawLib.diamondSawStorage().interfaceToFacet[_interface] == address(0), "Only one facet can implement an interface" ); DiamondSawLib.diamondSawStorage().interfaceToFacet[_interface] = _facet; } function approveTransferHookSelector(bytes4 selector) external onlyOwner whenNotPaused { DiamondSawLib.approveTransferHookSelector(selector); } function approveTokenURISelector(bytes4 selector) external onlyOwner whenNotPaused { DiamondSawLib.approveTokenURISelector(selector); } function isTokenURISelectorApproved(bytes4 selector) external view returns (bool) { return DiamondSawLib.diamondSawStorage().approvedTokenURIFunctionSelectors[ selector ]; } function isTransferHookSelectorApproved(bytes4 selector) external view returns (bool) { return DiamondSawLib .diamondSawStorage() .approvedTransferHookFunctionSelectors[selector]; } function setUpgradeSawAddress(address _upgradeSaw) external onlyOwner whenNotPaused { DiamondSawLib.setUpgradeSawAddress(_upgradeSaw); } function isUpgradeSawSupported(address _upgradeSaw) external view returns (bool) { return DiamondSawLib.diamondSawStorage().supportedSawAddresses[ _upgradeSaw ]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ // A loupe is a small magnifying glass used to look at diamonds. // These functions look at diamonds interface IDiamondLoupe { /// These functions are expected to be called frequently /// by tools. struct Facet { address facetAddress; bytes4[] functionSelectors; } /// @notice Gets all facet addresses and their four byte function selectors. /// @return facets_ Facet function facets() external view returns (Facet[] memory facets_); /// @notice Gets all the function selectors supported by a specific facet. /// @param _facet The facet address. /// @return facetFunctionSelectors_ function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view returns (address[] memory facetAddresses_); /// @notice Gets the facet that supports the given selector. /// @dev If facet is not found return address(0). /// @param _functionSelector The function selector. /// @return facetAddress_ The facet address. function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IDiamondCut} from "../facets/DiamondClone/IDiamondCut.sol"; library DiamondSawLib { bytes32 constant DIAMOND_SAW_STORAGE_POSITION = keccak256("diamond.standard.diamond.saw.storage"); struct FacetAddressAndPosition { address facetAddress; uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array } struct FacetFunctionSelectors { bytes4[] functionSelectors; uint256 facetAddressPosition; // position of facetAddress in facetAddresses array } struct DiamondSawStorage { // maps function selector to the facet address and // the position of the selector in the facetFunctionSelectors.selectors array mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; // maps facet addresses to function selectors mapping(address => FacetFunctionSelectors) facetFunctionSelectors; // facet addresses address[] facetAddresses; // Used to query if a facet implements a given interface // Note: this works because no interface can be implemented by // two different facets with diamond saw because no // selector overlap is permitted!! mapping(bytes4 => address) interfaceToFacet; // for transfer hooks, selectors must be approved in the saw mapping(bytes4 => bool) approvedTransferHookFunctionSelectors; // for tokenURI overrides, selectors must be approved in the saw mapping(bytes4 => bool) approvedTokenURIFunctionSelectors; // Saw contracts which clients can upgrade to mapping(address => bool) supportedSawAddresses; } function diamondSawStorage() internal pure returns (DiamondSawStorage storage ds) { bytes32 position = DIAMOND_SAW_STORAGE_POSITION; assembly { ds.slot := position } } event DiamondCut( IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata ); // Internal function version of diamondCut // only supports adding new selectors function diamondCutAddOnly( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { for ( uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++ ) { require( _diamondCut[facetIndex].action == IDiamondCut.FacetCutAction.Add, "Only add action supported in saw" ); require( !isFacetSupported(_diamondCut[facetIndex].facetAddress), "Facet already exists in saw" ); addFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { require( _functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut" ); DiamondSawStorage storage ds = diamondSawStorage(); require( _facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)" ); uint96 selectorPosition = uint96( ds.facetFunctionSelectors[_facetAddress].functionSelectors.length ); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(ds, _facetAddress); } for ( uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++ ) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds .selectorToFacetAndPosition[selector] .facetAddress; require( oldFacetAddress == address(0), "Cannot add function that already exists" ); addFunction(ds, selector, selectorPosition, _facetAddress); selectorPosition++; } } function addFacet(DiamondSawStorage storage ds, address _facetAddress) internal { enforceHasContractCode( _facetAddress, "LibDiamondCut: New facet has no code" ); ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds .facetAddresses .length; ds.facetAddresses.push(_facetAddress); } function addFunction( DiamondSawStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress ) internal { ds .selectorToFacetAndPosition[_selector] .functionSelectorPosition = _selectorPosition; ds.facetFunctionSelectors[_facetAddress].functionSelectors.push( _selector ); ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; } function initializeDiamondCut(address _init, bytes memory _calldata) internal { if (_init == address(0)) { require( _calldata.length == 0, "LibDiamondCut: _init is address(0) but_calldata is not empty" ); } else { require( _calldata.length > 0, "LibDiamondCut: _calldata is empty but _init is not address(0)" ); if (_init != address(this)) { enforceHasContractCode( _init, "LibDiamondCut: _init address has no code" ); } (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert("LibDiamondCut: _init function reverted"); } } } } function enforceHasContractCode( address _contract, string memory _errorMessage ) internal view { uint256 contractSize; assembly { contractSize := extcodesize(_contract) } require(contractSize > 0, _errorMessage); } function setFacetSupportsInterface(bytes4 _interface, address _facetAddress) internal { checkFacetSupported(_facetAddress); DiamondSawStorage storage ds = diamondSawStorage(); ds.interfaceToFacet[_interface] = _facetAddress; } function isFacetSupported(address _facetAddress) internal view returns (bool) { return diamondSawStorage() .facetFunctionSelectors[_facetAddress] .functionSelectors .length > 0; } function checkFacetSupported(address _facetAddress) internal view { require(isFacetSupported(_facetAddress), "Facet not supported"); } function approveTransferHookSelector(bytes4 transferHookSelector) internal { DiamondSawStorage storage s = diamondSawStorage(); address facetImplementation = s .selectorToFacetAndPosition[transferHookSelector] .facetAddress; require( facetImplementation != address(0), "Cannot set transfer hook to unsupported selector" ); s.approvedTransferHookFunctionSelectors[transferHookSelector] = true; } function approveTokenURISelector(bytes4 tokenURISelector) internal { DiamondSawStorage storage s = diamondSawStorage(); address facetImplementation = s .selectorToFacetAndPosition[tokenURISelector] .facetAddress; require( facetImplementation != address(0), "Cannot set token uri override to unsupported selector" ); s.approvedTokenURIFunctionSelectors[tokenURISelector] = true; } function setUpgradeSawAddress(address _upgradeSaw) internal { diamondSawStorage().supportedSawAddresses[_upgradeSaw] = true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/IAccessControl.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "./AccessControlLib.sol"; import {PausableLib} from "../Pausable/PausableLib.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract BasicAccessControlFacet is Context { /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return AccessControlLib.accessControlStorage()._owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); AccessControlLib._transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); require( newOwner != address(0), "Ownable: new owner is the zero address" ); AccessControlLib._transferOwnership(newOwner); } function grantOperator(address _operator) public virtual { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); AccessControlLib.grantRole(AccessControlLib.OPERATOR_ROLE, _operator); } function revokeOperator(address _operator) public virtual { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); AccessControlLib.revokeRole(AccessControlLib.OPERATOR_ROLE, _operator); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AccessControlLib.sol"; abstract contract AccessControlModifiers { modifier onlyOperator() { AccessControlLib._checkRole(AccessControlLib.OPERATOR_ROLE, msg.sender); _; } modifier onlyOwner() { AccessControlLib._enforceOwner(); _; } }
// SPDX-License-Identifier: MIT import "@openzeppelin/contracts/utils/Strings.sol"; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; pragma solidity ^0.8.0; library AccessControlLib { bytes32 constant DEFAULT_ADMIN_ROLE = 0x00; bytes32 constant OPERATOR_ROLE = keccak256("operator.role"); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged( bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole ); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); struct RoleData { mapping(address => bool) members; bytes32 adminRole; } struct AccessControlStorage { address _owner; mapping(bytes32 => RoleData) _roles; } bytes32 constant ACCESS_CONTROL_STORAGE_POSITION = keccak256("Access.Control.library.storage"); function accessControlStorage() internal pure returns (AccessControlStorage storage s) { bytes32 position = ACCESS_CONTROL_STORAGE_POSITION; assembly { s.slot := position } } function _isOwner() internal view returns (bool) { return accessControlStorage()._owner == msg.sender; } function owner() internal view returns (address) { return accessControlStorage()._owner; } function _enforceOwner() internal view { require(_isOwner(), "Caller is not the owner"); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal { address oldOwner = accessControlStorage()._owner; accessControlStorage()._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, msg.sender); _; } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) internal view returns (bool) { return accessControlStorage()._roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * NOTE: Modified to always pass if the account is the owner * and to always fail if ownership is revoked! */ function _checkRole(bytes32 role, address account) internal view { address ownerAddress = accessControlStorage()._owner; require(ownerAddress != address(0), "Admin functionality revoked"); if (!hasRole(role, account) && account != ownerAddress) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) internal view returns (bytes32) { return accessControlStorage()._roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) internal onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) internal onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) internal { require( account == msg.sender, "AccessControl: can only renounce roles for self" ); _revokeRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal { bytes32 previousAdminRole = getRoleAdmin(role); accessControlStorage()._roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal { if (!hasRole(role, account)) { accessControlStorage()._roles[role].members[account] = true; emit RoleGranted(role, account, msg.sender); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal { if (hasRole(role, account)) { accessControlStorage()._roles[role].members[account] = false; emit RoleRevoked(role, account, msg.sender); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import {AccessControlModifiers} from "../AccessControl/AccessControlModifiers.sol"; import {PausableLib} from "./PausableLib.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 PausableFacet is AccessControlModifiers { function pause() public onlyOwner { PausableLib._pause(); } function unpause() public onlyOwner { PausableLib._unpause(); } function paused() public view returns (bool) { return PausableLib._paused(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {PausableLib} from "./PausableLib.sol"; abstract contract PausableModifiers { /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { PausableLib.enforceUnpaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { PausableLib.enforcePaused(); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; error ContractPaused(); error ContractUnpaused(); library PausableLib { bytes32 constant PAUSABLE_STORAGE_POSITION = keccak256("pausable.facet.storage"); /** * @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); struct PausableStorage { bool _paused; } function pausableStorage() internal pure returns (PausableStorage storage s) { bytes32 position = PAUSABLE_STORAGE_POSITION; assembly { s.slot := position } } /** * @dev Returns true if the contract is paused, and false otherwise. */ function _paused() internal view returns (bool) { return pausableStorage()._paused; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal { PausableStorage storage s = pausableStorage(); if (s._paused) revert ContractPaused(); s._paused = true; emit Paused(msg.sender); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal { PausableStorage storage s = pausableStorage(); if (!s._paused) revert ContractUnpaused(); s._paused = false; emit Unpaused(msg.sender); } function enforceUnpaused() internal view { if (pausableStorage()._paused) revert ContractPaused(); } function enforcePaused() internal view { if (!pausableStorage()._paused) revert ContractUnpaused(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractPaused","type":"error"},{"inputs":[],"name":"ContractUnpaused","type":"error"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_facetAdds","type":"tuple[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"addFacetPattern","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allFacetAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allFacetsWithSelectors","outputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondLoupe.Facet[]","name":"_facetsWithSelectors","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"approveTokenURISelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"approveTransferHookSelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_facetAddress","type":"address"}],"name":"checkFacetSupported","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interface","type":"bytes4"}],"name":"facetAddressForInterface","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"facetAddressForSelector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facetAddress","type":"address"}],"name":"functionSelectorsForFacetAddress","outputs":[{"internalType":"bytes4[]","name":"","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"grantOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"isTokenURISelectorApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"isTransferHookSelectorApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_upgradeSaw","type":"address"}],"name":"isUpgradeSawSupported","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interface","type":"bytes4"},{"internalType":"address","name":"_facet","type":"address"}],"name":"setFacetForERC165Interface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_upgradeSaw","type":"address"}],"name":"setUpgradeSawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5062000028336200002e60201b62000e7a1760201c565b62000143565b6000620000406200011660201b60201c565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081620000776200011660201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b613edd80620001536000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806383372a71116100b85780638f7e19501161007c5780638f7e19501461034f578063cbaf15a91461036d578063e348da1314610389578063ea609fe2146103a5578063f2fde38b146103c1578063fad8b32a146103dd57610142565b806383372a71146102bf5780638456cb59146102ef5780638ccab119146102f95780638d1da160146103155780638da5cb5b1461033157610142565b806348670ae11161010a57806348670ae1146102115780635065a0311461022d578063552d91ad1461024957806355a2cd0b146102795780635c975abb14610297578063715018a6146102b557610142565b806301feb4721461014757806314bc75601461017757806324a40579146101a757806324ca5e1f146101d75780633f4ba83a14610207575b600080fd5b610161600480360381019061015c9190612a94565b6103f9565b60405161016e91906131c8565b60405180910390f35b610191600480360381019061018c9190612a94565b610482565b60405161019e91906131c8565b60405180910390f35b6101c160048036038101906101bc9190612a94565b610509565b6040516101ce919061328e565b60405180910390f35b6101f160048036038101906101ec91906129e2565b61057a565b6040516101fe919061328e565b60405180910390f35b61020f6105d9565b005b61022b60048036038101906102269190612a0b565b6105eb565b005b61024760048036038101906102429190612a94565b61065d565b005b610263600480360381019061025e9190612a94565b610679565b604051610270919061328e565b60405180910390f35b6102816106ea565b60405161028e919061326c565b60405180910390f35b61029f6109a5565b6040516102ac919061328e565b60405180910390f35b6102bd6109b4565b005b6102d960048036038101906102d491906129e2565b6109d0565b6040516102e69190613205565b60405180910390f35b6102f7610ab5565b005b610313600480360381019061030e91906129e2565b610ac7565b005b61032f600480360381019061032a9190612abd565b610ad3565b005b610339610c72565b60405161034691906131c8565b60405180910390f35b610357610ca5565b60405161036491906131e3565b60405180910390f35b610387600480360381019061038291906129e2565b610d3c565b005b6103a3600480360381019061039e91906129e2565b610d58565b005b6103bf60048036038101906103ba9190612a94565b610d95565b005b6103db60048036038101906103d691906129e2565b610db1565b005b6103f760048036038101906103f291906129e2565b610e3d565b005b600080610404610f52565b9050806003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b600061048c610f52565b6000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610513610f52565b6005016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000610584610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6105e1610f7f565b6105e9610fc8565b565b6105f3610f7f565b6105fb611073565b61065685859061060b91906137da565b8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506110c5565b5050505050565b610665610f7f565b61066d611073565b61067681611345565b50565b6000610683610f52565b6004016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060006106f6610f52565b90506000816002018054905090508067ffffffffffffffff811115610744577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561077d57816020015b61076a61274b565b8152602001906001900390816107625790505b50925060005b8181101561099f5760008360020182815481106107c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080858381518110610830577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561093e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116108eb5790505b505050505085838151811061097c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001819052505080806109979061388f565b915050610783565b50505090565b60006109af6114ad565b905090565b6109bc611073565b6109c4610f7f565b6109ce6000610e7a565b565b60606109da610f52565b60010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015610aa957602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610a565790505b50505050509050919050565b610abd610f7f565b610ac56114cd565b565b610ad081611579565b50565b610adb610f7f565b610ae3611073565b610aec81611579565b600073ffffffffffffffffffffffffffffffffffffffff16610b0c610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc906134ab565b60405180910390fd5b80610bde610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000610c7c6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610caf610f52565b600201805480602002602001604051908101604052809291908181526020018280548015610d3257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ce8575b5050505050905090565b610d44610f7f565b610d4c611073565b610d55816115f1565b50565b610d60611073565b610d68610f7f565b610d927fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e82611655565b50565b610d9d610f7f565b610da5611073565b610dae81611677565b50565b610db9611073565b610dc1610f7f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e28906133cb565b60405180910390fd5b610e3a81610e7a565b50565b610e45611073565b610e4d610f7f565b610e777fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e826117df565b50565b6000610e846115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081610eb36115c4565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000807f9181e2ce76c26b04a55bebc31fdd43a0e490600a9bbf4a0b5d47f8b8895b35ae90508091505090565b610f87611801565b610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061336b565b60405180910390fd5b565b6000610fd2611862565b90508060000160009054906101000a900460ff1661101c576040517f0e5e3b3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161106891906131c8565b60405180910390a150565b61107b611862565b60000160009054906101000a900460ff16156110c3576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b83518110156112fa576000600281111561110b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b848281518110611144577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516002811115611188577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf906133ab565b60405180910390fd5b611215848281518110611204577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015161188f565b15611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c906133eb565b60405180910390fd5b6112e7848281518110611291577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518583815181106112d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516118e9565b80806112f29061388f565b9150506110c8565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161132e93929190613227565b60405180910390a16113408282611b88565b505050565b600061134f610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061332b565b60405180910390fd5b6001826004016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60006114b7611862565b60000160009054906101000a900460ff16905090565b60006114d7611862565b90508060000160009054906101000a900460ff1615611522576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161156e91906131c8565b60405180910390a150565b6115828161188f565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061342b565b60405180910390fd5b50565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b60016115fb610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61165e82611d9b565b6116688133611dc4565b6116728383611f3c565b505050565b6000611681610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117659061340b565b60405180910390fd5b6001826005016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6117e882611d9b565b6117f28133611dc4565b6117fc838361201f565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff166118226115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b6000807f898bcb892ce96890816cc7d1ea86c592f314ff2e839268e378d8f279767ea82290508091505090565b60008061189a610f52565b60010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050119050919050565b600081511161192d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119249061338b565b60405180910390fd5b6000611937610f52565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a09061344b565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff161415611a1757611a168285612103565b5b60005b8351811015611b81576000848281518110611a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b499061348b565b60405180910390fd5b611b5e8583868a6121de565b8380611b69906138d8565b94505050508080611b799061388f565b915050611a1a565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c06576000815114611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf8906132cb565b60405180910390fd5b611d97565b6000815111611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419061346b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611ca057611c9f82604051806060016040528060288152602001613e5c6028913961238b565b5b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611cc89190613177565b600060405180830381855af49150503d8060008114611d03576040519150601f19603f3d011682016040523d82523d6000602084013e611d08565b606091505b509150915081611d9457600081511115611d5957806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5091906132a9565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b9061330b565b60405180910390fd5b50505b5050565b6000611da56115c4565b6001016000838152602001908152602001600020600101549050919050565b6000611dce6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b9061334b565b60405180910390fd5b611e6e83836123dd565b158015611ea757508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611f3757611ecd8273ffffffffffffffffffffffffffffffffffffffff166014612451565b611edb8460001c6020612451565b604051602001611eec92919061318e565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e91906132a9565b60405180910390fd5b505050565b611f4682826123dd565b61201b576001611f546115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202982826123dd565b156120ff5760006120386115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61212581604051806060016040528060248152602001613e846024913961238b565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6000823b90506000811182906123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce91906132a9565b60405180910390fd5b50505050565b60006123e76115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606000600283600261246491906136e1565b61246e919061368b565b67ffffffffffffffff8111156124ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124df5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061253d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261260791906136e1565b612611919061368b565b90505b60018111156126fd577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106126b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806126f690613834565b9050612614565b5060008414612741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612738906132eb565b60405180910390fd5b8091505092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600061278e612789846134f0565b6134cb565b905080838252602082019050828560208602820111156127ad57600080fd5b60005b858110156127dd57816127c388826128f6565b8452602084019350602083019250506001810190506127b0565b5050509392505050565b60006127fa6127f58461351c565b6134cb565b9050808382526020820190508285602086028201111561281957600080fd5b60005b8581101561286357813567ffffffffffffffff81111561283b57600080fd5b808601612848898261296a565b8552602085019450602084019350505060018101905061281c565b5050509392505050565b60008135905061287c81613e1d565b92915050565b600082601f83011261289357600080fd5b81356128a384826020860161277b565b91505092915050565b60008083601f8401126128be57600080fd5b8235905067ffffffffffffffff8111156128d757600080fd5b6020830191508360208202830111156128ef57600080fd5b9250929050565b60008135905061290581613e34565b92915050565b60008083601f84011261291d57600080fd5b8235905067ffffffffffffffff81111561293657600080fd5b60208301915083600182028301111561294e57600080fd5b9250929050565b60008135905061296481613e4b565b92915050565b60006060828403121561297c57600080fd5b61298660606134cb565b905060006129968482850161286d565b60008301525060206129aa84828501612955565b602083015250604082013567ffffffffffffffff8111156129ca57600080fd5b6129d684828501612882565b60408301525092915050565b6000602082840312156129f457600080fd5b6000612a028482850161286d565b91505092915050565b600080600080600060608688031215612a2357600080fd5b600086013567ffffffffffffffff811115612a3d57600080fd5b612a49888289016128ac565b95509550506020612a5c8882890161286d565b935050604086013567ffffffffffffffff811115612a7957600080fd5b612a858882890161290b565b92509250509295509295909350565b600060208284031215612aa657600080fd5b6000612ab4848285016128f6565b91505092915050565b60008060408385031215612ad057600080fd5b6000612ade858286016128f6565b9250506020612aef8582860161286d565b9150509250929050565b6000612b058383612b51565b60208301905092915050565b6000612b1d8383612d82565b60208301905092915050565b6000612b3583836130ea565b905092915050565b6000612b49838361313a565b905092915050565b612b5a8161373b565b82525050565b612b698161373b565b82525050565b6000612b7a82613588565b612b8481856135fe565b9350612b8f83613548565b8060005b83811015612bc0578151612ba78882612af9565b9750612bb2836135ca565b925050600181019050612b93565b5085935050505092915050565b6000612bd882613593565b612be2818561360f565b9350612bed83613558565b8060005b83811015612c1e578151612c058882612b11565b9750612c10836135d7565b925050600181019050612bf1565b5085935050505092915050565b6000612c3682613593565b612c408185613620565b9350612c4b83613558565b8060005b83811015612c7c578151612c638882612b11565b9750612c6e836135d7565b925050600181019050612c4f565b5085935050505092915050565b6000612c948261359e565b612c9e8185613631565b935083602082028501612cb085613568565b8060005b85811015612cec5784840389528151612ccd8582612b29565b9450612cd8836135e4565b925060208a01995050600181019050612cb4565b50829750879550505050505092915050565b6000612d09826135a9565b612d138185613642565b935083602082028501612d2585613578565b8060005b85811015612d615784840389528151612d428582612b3d565b9450612d4d836135f1565b925060208a01995050600181019050612d29565b50829750879550505050505092915050565b612d7c8161374d565b82525050565b612d8b81613759565b82525050565b6000612d9c826135b4565b612da68185613653565b9350612db6818560208601613801565b612dbf8161399a565b840191505092915050565b6000612dd5826135b4565b612ddf8185613664565b9350612def818560208601613801565b80840191505092915050565b612e04816137ef565b82525050565b6000612e15826135bf565b612e1f818561366f565b9350612e2f818560208601613801565b612e388161399a565b840191505092915050565b6000612e4e826135bf565b612e588185613680565b9350612e68818560208601613801565b80840191505092915050565b6000612e81603c8361366f565b9150612e8c826139ab565b604082019050919050565b6000612ea460208361366f565b9150612eaf826139fa565b602082019050919050565b6000612ec760268361366f565b9150612ed282613a23565b604082019050919050565b6000612eea60308361366f565b9150612ef582613a72565b604082019050919050565b6000612f0d601b8361366f565b9150612f1882613ac1565b602082019050919050565b6000612f3060178361366f565b9150612f3b82613aea565b602082019050919050565b6000612f53602b8361366f565b9150612f5e82613b13565b604082019050919050565b6000612f7660208361366f565b9150612f8182613b62565b602082019050919050565b6000612f9960268361366f565b9150612fa482613b8b565b604082019050919050565b6000612fbc601b8361366f565b9150612fc782613bda565b602082019050919050565b6000612fdf60358361366f565b9150612fea82613c03565b604082019050919050565b600061300260138361366f565b915061300d82613c52565b602082019050919050565b6000613025602c8361366f565b915061303082613c7b565b604082019050919050565b6000613048603d8361366f565b915061305382613cca565b604082019050919050565b600061306b60278361366f565b915061307682613d19565b604082019050919050565b600061308e60298361366f565b915061309982613d68565b604082019050919050565b60006130b1601783613680565b91506130bc82613db7565b601782019050919050565b60006130d4601183613680565b91506130df82613de0565b601182019050919050565b60006060830160008301516131026000860182612b51565b5060208301516131156020860182612dfb565b506040830151848203604086015261312d8282612bcd565b9150508091505092915050565b60006040830160008301516131526000860182612b51565b506020830151848203602086015261316a8282612bcd565b9150508091505092915050565b60006131838284612dca565b915081905092915050565b6000613199826130a4565b91506131a58285612e43565b91506131b0826130c7565b91506131bc8284612e43565b91508190509392505050565b60006020820190506131dd6000830184612b60565b92915050565b600060208201905081810360008301526131fd8184612b6f565b905092915050565b6000602082019050818103600083015261321f8184612c2b565b905092915050565b600060608201905081810360008301526132418186612c89565b90506132506020830185612b60565b81810360408301526132628184612d91565b9050949350505050565b600060208201905081810360008301526132868184612cfe565b905092915050565b60006020820190506132a36000830184612d73565b92915050565b600060208201905081810360008301526132c38184612e0a565b905092915050565b600060208201905081810360008301526132e481612e74565b9050919050565b6000602082019050818103600083015261330481612e97565b9050919050565b6000602082019050818103600083015261332481612eba565b9050919050565b6000602082019050818103600083015261334481612edd565b9050919050565b6000602082019050818103600083015261336481612f00565b9050919050565b6000602082019050818103600083015261338481612f23565b9050919050565b600060208201905081810360008301526133a481612f46565b9050919050565b600060208201905081810360008301526133c481612f69565b9050919050565b600060208201905081810360008301526133e481612f8c565b9050919050565b6000602082019050818103600083015261340481612faf565b9050919050565b6000602082019050818103600083015261342481612fd2565b9050919050565b6000602082019050818103600083015261344481612ff5565b9050919050565b6000602082019050818103600083015261346481613018565b9050919050565b600060208201905081810360008301526134848161303b565b9050919050565b600060208201905081810360008301526134a48161305e565b9050919050565b600060208201905081810360008301526134c481613081565b9050919050565b60006134d56134e6565b90506134e1828261385e565b919050565b6000604051905090565b600067ffffffffffffffff82111561350b5761350a61396b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135375761353661396b565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613696826137b8565b91506136a1836137b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d6576136d561390d565b5b828201905092915050565b60006136ec826137b8565b91506136f7836137b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137305761372f61390d565b5b828202905092915050565b600061374682613798565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061379382613e09565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60006137e73684846127e7565b905092915050565b60006137fa82613785565b9050919050565b60005b8381101561381f578082015181840152602081019050613804565b8381111561382e576000848401525b50505050565b600061383f826137b8565b915060008214156138535761385261390d565b5b600182039050919050565b6138678261399a565b810181811067ffffffffffffffff821117156138865761388561396b565b5b80604052505050565b600061389a826137b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138cd576138cc61390d565b5b600182019050919050565b60006138e3826137c2565b91506bffffffffffffffffffffffff8214156139025761390161390d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574207472616e7366657220686f6f6b20746f20756e737560008201527f70706f727465642073656c6563746f7200000000000000000000000000000000602082015250565b7f41646d696e2066756e6374696f6e616c697479207265766f6b65640000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b7f4f6e6c792061646420616374696f6e20737570706f7274656420696e20736177600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f466163657420616c72656164792065786973747320696e207361770000000000600082015250565b7f43616e6e6f742073657420746f6b656e20757269206f7665727269646520746f60008201527f20756e737570706f727465642073656c6563746f720000000000000000000000602082015250565b7f4661636574206e6f7420737570706f7274656400000000000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b7f43616e6e6f74206164642066756e6374696f6e207468617420616c726561647960008201527f2065786973747300000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79206f6e652066616365742063616e20696d706c656d656e7420616e2060008201527f696e746572666163650000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60038110613e1a57613e1961393c565b5b50565b613e268161373b565b8114613e3157600080fd5b50565b613e3d81613759565b8114613e4857600080fd5b50565b60038110613e5857600080fd5b5056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a264697066735822122035464097ae9831b99850d4ce14d4df1aa70b73418f19c6c0ae99cb9ec304e78564736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806383372a71116100b85780638f7e19501161007c5780638f7e19501461034f578063cbaf15a91461036d578063e348da1314610389578063ea609fe2146103a5578063f2fde38b146103c1578063fad8b32a146103dd57610142565b806383372a71146102bf5780638456cb59146102ef5780638ccab119146102f95780638d1da160146103155780638da5cb5b1461033157610142565b806348670ae11161010a57806348670ae1146102115780635065a0311461022d578063552d91ad1461024957806355a2cd0b146102795780635c975abb14610297578063715018a6146102b557610142565b806301feb4721461014757806314bc75601461017757806324a40579146101a757806324ca5e1f146101d75780633f4ba83a14610207575b600080fd5b610161600480360381019061015c9190612a94565b6103f9565b60405161016e91906131c8565b60405180910390f35b610191600480360381019061018c9190612a94565b610482565b60405161019e91906131c8565b60405180910390f35b6101c160048036038101906101bc9190612a94565b610509565b6040516101ce919061328e565b60405180910390f35b6101f160048036038101906101ec91906129e2565b61057a565b6040516101fe919061328e565b60405180910390f35b61020f6105d9565b005b61022b60048036038101906102269190612a0b565b6105eb565b005b61024760048036038101906102429190612a94565b61065d565b005b610263600480360381019061025e9190612a94565b610679565b604051610270919061328e565b60405180910390f35b6102816106ea565b60405161028e919061326c565b60405180910390f35b61029f6109a5565b6040516102ac919061328e565b60405180910390f35b6102bd6109b4565b005b6102d960048036038101906102d491906129e2565b6109d0565b6040516102e69190613205565b60405180910390f35b6102f7610ab5565b005b610313600480360381019061030e91906129e2565b610ac7565b005b61032f600480360381019061032a9190612abd565b610ad3565b005b610339610c72565b60405161034691906131c8565b60405180910390f35b610357610ca5565b60405161036491906131e3565b60405180910390f35b610387600480360381019061038291906129e2565b610d3c565b005b6103a3600480360381019061039e91906129e2565b610d58565b005b6103bf60048036038101906103ba9190612a94565b610d95565b005b6103db60048036038101906103d691906129e2565b610db1565b005b6103f760048036038101906103f291906129e2565b610e3d565b005b600080610404610f52565b9050806003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b600061048c610f52565b6000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610513610f52565b6005016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000610584610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6105e1610f7f565b6105e9610fc8565b565b6105f3610f7f565b6105fb611073565b61065685859061060b91906137da565b8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506110c5565b5050505050565b610665610f7f565b61066d611073565b61067681611345565b50565b6000610683610f52565b6004016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060006106f6610f52565b90506000816002018054905090508067ffffffffffffffff811115610744577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561077d57816020015b61076a61274b565b8152602001906001900390816107625790505b50925060005b8181101561099f5760008360020182815481106107c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080858381518110610830577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561093e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116108eb5790505b505050505085838151811061097c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001819052505080806109979061388f565b915050610783565b50505090565b60006109af6114ad565b905090565b6109bc611073565b6109c4610f7f565b6109ce6000610e7a565b565b60606109da610f52565b60010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015610aa957602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610a565790505b50505050509050919050565b610abd610f7f565b610ac56114cd565b565b610ad081611579565b50565b610adb610f7f565b610ae3611073565b610aec81611579565b600073ffffffffffffffffffffffffffffffffffffffff16610b0c610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc906134ab565b60405180910390fd5b80610bde610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000610c7c6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610caf610f52565b600201805480602002602001604051908101604052809291908181526020018280548015610d3257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ce8575b5050505050905090565b610d44610f7f565b610d4c611073565b610d55816115f1565b50565b610d60611073565b610d68610f7f565b610d927fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e82611655565b50565b610d9d610f7f565b610da5611073565b610dae81611677565b50565b610db9611073565b610dc1610f7f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e28906133cb565b60405180910390fd5b610e3a81610e7a565b50565b610e45611073565b610e4d610f7f565b610e777fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e826117df565b50565b6000610e846115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081610eb36115c4565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000807f9181e2ce76c26b04a55bebc31fdd43a0e490600a9bbf4a0b5d47f8b8895b35ae90508091505090565b610f87611801565b610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061336b565b60405180910390fd5b565b6000610fd2611862565b90508060000160009054906101000a900460ff1661101c576040517f0e5e3b3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161106891906131c8565b60405180910390a150565b61107b611862565b60000160009054906101000a900460ff16156110c3576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b83518110156112fa576000600281111561110b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b848281518110611144577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516002811115611188577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf906133ab565b60405180910390fd5b611215848281518110611204577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015161188f565b15611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c906133eb565b60405180910390fd5b6112e7848281518110611291577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518583815181106112d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516118e9565b80806112f29061388f565b9150506110c8565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161132e93929190613227565b60405180910390a16113408282611b88565b505050565b600061134f610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061332b565b60405180910390fd5b6001826004016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60006114b7611862565b60000160009054906101000a900460ff16905090565b60006114d7611862565b90508060000160009054906101000a900460ff1615611522576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161156e91906131c8565b60405180910390a150565b6115828161188f565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061342b565b60405180910390fd5b50565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b60016115fb610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61165e82611d9b565b6116688133611dc4565b6116728383611f3c565b505050565b6000611681610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117659061340b565b60405180910390fd5b6001826005016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6117e882611d9b565b6117f28133611dc4565b6117fc838361201f565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff166118226115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b6000807f898bcb892ce96890816cc7d1ea86c592f314ff2e839268e378d8f279767ea82290508091505090565b60008061189a610f52565b60010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050119050919050565b600081511161192d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119249061338b565b60405180910390fd5b6000611937610f52565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a09061344b565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff161415611a1757611a168285612103565b5b60005b8351811015611b81576000848281518110611a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b499061348b565b60405180910390fd5b611b5e8583868a6121de565b8380611b69906138d8565b94505050508080611b799061388f565b915050611a1a565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c06576000815114611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf8906132cb565b60405180910390fd5b611d97565b6000815111611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419061346b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611ca057611c9f82604051806060016040528060288152602001613e5c6028913961238b565b5b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611cc89190613177565b600060405180830381855af49150503d8060008114611d03576040519150601f19603f3d011682016040523d82523d6000602084013e611d08565b606091505b509150915081611d9457600081511115611d5957806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5091906132a9565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b9061330b565b60405180910390fd5b50505b5050565b6000611da56115c4565b6001016000838152602001908152602001600020600101549050919050565b6000611dce6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b9061334b565b60405180910390fd5b611e6e83836123dd565b158015611ea757508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611f3757611ecd8273ffffffffffffffffffffffffffffffffffffffff166014612451565b611edb8460001c6020612451565b604051602001611eec92919061318e565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e91906132a9565b60405180910390fd5b505050565b611f4682826123dd565b61201b576001611f546115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202982826123dd565b156120ff5760006120386115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61212581604051806060016040528060248152602001613e846024913961238b565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6000823b90506000811182906123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce91906132a9565b60405180910390fd5b50505050565b60006123e76115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606000600283600261246491906136e1565b61246e919061368b565b67ffffffffffffffff8111156124ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124df5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061253d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261260791906136e1565b612611919061368b565b90505b60018111156126fd577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106126b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806126f690613834565b9050612614565b5060008414612741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612738906132eb565b60405180910390fd5b8091505092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600061278e612789846134f0565b6134cb565b905080838252602082019050828560208602820111156127ad57600080fd5b60005b858110156127dd57816127c388826128f6565b8452602084019350602083019250506001810190506127b0565b5050509392505050565b60006127fa6127f58461351c565b6134cb565b9050808382526020820190508285602086028201111561281957600080fd5b60005b8581101561286357813567ffffffffffffffff81111561283b57600080fd5b808601612848898261296a565b8552602085019450602084019350505060018101905061281c565b5050509392505050565b60008135905061287c81613e1d565b92915050565b600082601f83011261289357600080fd5b81356128a384826020860161277b565b91505092915050565b60008083601f8401126128be57600080fd5b8235905067ffffffffffffffff8111156128d757600080fd5b6020830191508360208202830111156128ef57600080fd5b9250929050565b60008135905061290581613e34565b92915050565b60008083601f84011261291d57600080fd5b8235905067ffffffffffffffff81111561293657600080fd5b60208301915083600182028301111561294e57600080fd5b9250929050565b60008135905061296481613e4b565b92915050565b60006060828403121561297c57600080fd5b61298660606134cb565b905060006129968482850161286d565b60008301525060206129aa84828501612955565b602083015250604082013567ffffffffffffffff8111156129ca57600080fd5b6129d684828501612882565b60408301525092915050565b6000602082840312156129f457600080fd5b6000612a028482850161286d565b91505092915050565b600080600080600060608688031215612a2357600080fd5b600086013567ffffffffffffffff811115612a3d57600080fd5b612a49888289016128ac565b95509550506020612a5c8882890161286d565b935050604086013567ffffffffffffffff811115612a7957600080fd5b612a858882890161290b565b92509250509295509295909350565b600060208284031215612aa657600080fd5b6000612ab4848285016128f6565b91505092915050565b60008060408385031215612ad057600080fd5b6000612ade858286016128f6565b9250506020612aef8582860161286d565b9150509250929050565b6000612b058383612b51565b60208301905092915050565b6000612b1d8383612d82565b60208301905092915050565b6000612b3583836130ea565b905092915050565b6000612b49838361313a565b905092915050565b612b5a8161373b565b82525050565b612b698161373b565b82525050565b6000612b7a82613588565b612b8481856135fe565b9350612b8f83613548565b8060005b83811015612bc0578151612ba78882612af9565b9750612bb2836135ca565b925050600181019050612b93565b5085935050505092915050565b6000612bd882613593565b612be2818561360f565b9350612bed83613558565b8060005b83811015612c1e578151612c058882612b11565b9750612c10836135d7565b925050600181019050612bf1565b5085935050505092915050565b6000612c3682613593565b612c408185613620565b9350612c4b83613558565b8060005b83811015612c7c578151612c638882612b11565b9750612c6e836135d7565b925050600181019050612c4f565b5085935050505092915050565b6000612c948261359e565b612c9e8185613631565b935083602082028501612cb085613568565b8060005b85811015612cec5784840389528151612ccd8582612b29565b9450612cd8836135e4565b925060208a01995050600181019050612cb4565b50829750879550505050505092915050565b6000612d09826135a9565b612d138185613642565b935083602082028501612d2585613578565b8060005b85811015612d615784840389528151612d428582612b3d565b9450612d4d836135f1565b925060208a01995050600181019050612d29565b50829750879550505050505092915050565b612d7c8161374d565b82525050565b612d8b81613759565b82525050565b6000612d9c826135b4565b612da68185613653565b9350612db6818560208601613801565b612dbf8161399a565b840191505092915050565b6000612dd5826135b4565b612ddf8185613664565b9350612def818560208601613801565b80840191505092915050565b612e04816137ef565b82525050565b6000612e15826135bf565b612e1f818561366f565b9350612e2f818560208601613801565b612e388161399a565b840191505092915050565b6000612e4e826135bf565b612e588185613680565b9350612e68818560208601613801565b80840191505092915050565b6000612e81603c8361366f565b9150612e8c826139ab565b604082019050919050565b6000612ea460208361366f565b9150612eaf826139fa565b602082019050919050565b6000612ec760268361366f565b9150612ed282613a23565b604082019050919050565b6000612eea60308361366f565b9150612ef582613a72565b604082019050919050565b6000612f0d601b8361366f565b9150612f1882613ac1565b602082019050919050565b6000612f3060178361366f565b9150612f3b82613aea565b602082019050919050565b6000612f53602b8361366f565b9150612f5e82613b13565b604082019050919050565b6000612f7660208361366f565b9150612f8182613b62565b602082019050919050565b6000612f9960268361366f565b9150612fa482613b8b565b604082019050919050565b6000612fbc601b8361366f565b9150612fc782613bda565b602082019050919050565b6000612fdf60358361366f565b9150612fea82613c03565b604082019050919050565b600061300260138361366f565b915061300d82613c52565b602082019050919050565b6000613025602c8361366f565b915061303082613c7b565b604082019050919050565b6000613048603d8361366f565b915061305382613cca565b604082019050919050565b600061306b60278361366f565b915061307682613d19565b604082019050919050565b600061308e60298361366f565b915061309982613d68565b604082019050919050565b60006130b1601783613680565b91506130bc82613db7565b601782019050919050565b60006130d4601183613680565b91506130df82613de0565b601182019050919050565b60006060830160008301516131026000860182612b51565b5060208301516131156020860182612dfb565b506040830151848203604086015261312d8282612bcd565b9150508091505092915050565b60006040830160008301516131526000860182612b51565b506020830151848203602086015261316a8282612bcd565b9150508091505092915050565b60006131838284612dca565b915081905092915050565b6000613199826130a4565b91506131a58285612e43565b91506131b0826130c7565b91506131bc8284612e43565b91508190509392505050565b60006020820190506131dd6000830184612b60565b92915050565b600060208201905081810360008301526131fd8184612b6f565b905092915050565b6000602082019050818103600083015261321f8184612c2b565b905092915050565b600060608201905081810360008301526132418186612c89565b90506132506020830185612b60565b81810360408301526132628184612d91565b9050949350505050565b600060208201905081810360008301526132868184612cfe565b905092915050565b60006020820190506132a36000830184612d73565b92915050565b600060208201905081810360008301526132c38184612e0a565b905092915050565b600060208201905081810360008301526132e481612e74565b9050919050565b6000602082019050818103600083015261330481612e97565b9050919050565b6000602082019050818103600083015261332481612eba565b9050919050565b6000602082019050818103600083015261334481612edd565b9050919050565b6000602082019050818103600083015261336481612f00565b9050919050565b6000602082019050818103600083015261338481612f23565b9050919050565b600060208201905081810360008301526133a481612f46565b9050919050565b600060208201905081810360008301526133c481612f69565b9050919050565b600060208201905081810360008301526133e481612f8c565b9050919050565b6000602082019050818103600083015261340481612faf565b9050919050565b6000602082019050818103600083015261342481612fd2565b9050919050565b6000602082019050818103600083015261344481612ff5565b9050919050565b6000602082019050818103600083015261346481613018565b9050919050565b600060208201905081810360008301526134848161303b565b9050919050565b600060208201905081810360008301526134a48161305e565b9050919050565b600060208201905081810360008301526134c481613081565b9050919050565b60006134d56134e6565b90506134e1828261385e565b919050565b6000604051905090565b600067ffffffffffffffff82111561350b5761350a61396b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135375761353661396b565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613696826137b8565b91506136a1836137b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d6576136d561390d565b5b828201905092915050565b60006136ec826137b8565b91506136f7836137b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137305761372f61390d565b5b828202905092915050565b600061374682613798565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061379382613e09565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60006137e73684846127e7565b905092915050565b60006137fa82613785565b9050919050565b60005b8381101561381f578082015181840152602081019050613804565b8381111561382e576000848401525b50505050565b600061383f826137b8565b915060008214156138535761385261390d565b5b600182039050919050565b6138678261399a565b810181811067ffffffffffffffff821117156138865761388561396b565b5b80604052505050565b600061389a826137b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138cd576138cc61390d565b5b600182019050919050565b60006138e3826137c2565b91506bffffffffffffffffffffffff8214156139025761390161390d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574207472616e7366657220686f6f6b20746f20756e737560008201527f70706f727465642073656c6563746f7200000000000000000000000000000000602082015250565b7f41646d696e2066756e6374696f6e616c697479207265766f6b65640000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b7f4f6e6c792061646420616374696f6e20737570706f7274656420696e20736177600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f466163657420616c72656164792065786973747320696e207361770000000000600082015250565b7f43616e6e6f742073657420746f6b656e20757269206f7665727269646520746f60008201527f20756e737570706f727465642073656c6563746f720000000000000000000000602082015250565b7f4661636574206e6f7420737570706f7274656400000000000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b7f43616e6e6f74206164642066756e6374696f6e207468617420616c726561647960008201527f2065786973747300000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79206f6e652066616365742063616e20696d706c656d656e7420616e2060008201527f696e746572666163650000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60038110613e1a57613e1961393c565b5b50565b613e268161373b565b8114613e3157600080fd5b50565b613e3d81613759565b8114613e4857600080fd5b50565b60038110613e5857600080fd5b5056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a264697066735822122035464097ae9831b99850d4ce14d4df1aa70b73418f19c6c0ae99cb9ec304e78564736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.