Token
Polygon Sponsored slots available. Book your slot here!
Overview
Total Supply:
0 N/A
Holders:
0 addresses
Transfers:
-
Contract:
Decimals:
18
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xB77225AD50bF0Ea5c9a51Dcf17D0D503Aca44DAD
Contract Name:
Diamond
Compiler Version
v0.8.13+commit.abaa5c0e
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; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 * * Implementation of a diamond. /******************************************************************************/ import {LibDiamond} from "./libraries/LibDiamond.sol"; import {IDiamondCut} from "./interfaces/IDiamondCut.sol"; contract Diamond { constructor(address _contractOwner, address _diamondCutFacet) payable { LibDiamond.setContractOwner(_contractOwner); // Add the diamondCut external function from the diamondCutFacet IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1); bytes4[] memory functionSelectors = new bytes4[](1); functionSelectors[0] = IDiamondCut.diamondCut.selector; cut[0] = IDiamondCut.FacetCut({ facetAddress: _diamondCutFacet, action: IDiamondCut.FacetCutAction.Add, functionSelectors: functionSelectors }); LibDiamond.diamondCut(cut, address(0), ""); } // Find facet for function that is called and execute the // function if a facet is found and return any value. fallback() external payable { LibDiamond.DiamondStorage storage ds; bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION; // get diamond storage assembly { ds.slot := position } // get facet from function selector address facet = ds.facetAddressAndSelectorPosition[msg.sig].facetAddress; require(facet != address(0), "Diamond: Function does not exist"); // Execute external function from facet using delegatecall and return any value. assembly { // copy function selector and any arguments calldatacopy(0, 0, calldatasize()) // execute function call using the facet let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) // get any return value returndatacopy(0, 0, returndatasize()) // return any return value or error back to the caller switch result case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } receive() external payable {} }
// 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 /******************************************************************************/ import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; library LibDiamond { bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct FacetAddressAndSelectorPosition { address facetAddress; uint16 selectorPosition; } struct DiamondStorage { // function selector => facet address and selector position in selectors array mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition; bytes4[] selectors; mapping(bytes4 => bool) supportedInterfaces; // owner of the contract address contractOwner; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); } function contractOwner() internal view returns (address contractOwner_) { contractOwner_ = diamondStorage().contractOwner; } function enforceIsContractOwner() internal view { require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); // Internal function version of diamondCut function diamondCut( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; if (action == IDiamondCut.FacetCutAction.Add) { addFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else if (action == IDiamondCut.FacetCutAction.Replace) { replaceFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else if (action == IDiamondCut.FacetCutAction.Remove) { removeFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else { revert("LibDiamondCut: Incorrect FacetCutAction"); } } 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"); DiamondStorage storage ds = diamondStorage(); uint16 selectorCount = uint16(ds.selectors.length); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); enforceHasContractCode(_facetAddress, "LibDiamondCut: Add facet has no code"); for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.facetAddressAndSelectorPosition[selector].facetAddress; require( oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists" ); ds.facetAddressAndSelectorPosition[selector] = FacetAddressAndSelectorPosition( _facetAddress, selectorCount ); ds.selectors.push(selector); selectorCount++; } } function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); DiamondStorage storage ds = diamondStorage(); require(_facetAddress != address(0), "LibDiamondCut: Replace facet can't be address(0)"); enforceHasContractCode(_facetAddress, "LibDiamondCut: Replace facet has no code"); for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.facetAddressAndSelectorPosition[selector].facetAddress; // can't replace immutable functions -- functions defined directly in the diamond require( oldFacetAddress != address(this), "LibDiamondCut: Can't replace immutable function" ); require( oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function" ); require( oldFacetAddress != address(0), "LibDiamondCut: Can't replace function that doesn't exist" ); // replace old facet address ds.facetAddressAndSelectorPosition[selector].facetAddress = _facetAddress; } } function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); DiamondStorage storage ds = diamondStorage(); uint256 selectorCount = ds.selectors.length; require( _facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)" ); for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; FacetAddressAndSelectorPosition memory oldFacetAddressAndSelectorPosition = ds .facetAddressAndSelectorPosition[selector]; require( oldFacetAddressAndSelectorPosition.facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist" ); // can't remove immutable functions -- functions defined directly in the diamond require( oldFacetAddressAndSelectorPosition.facetAddress != address(this), "LibDiamondCut: Can't remove immutable function." ); // replace selector with last selector selectorCount--; if (oldFacetAddressAndSelectorPosition.selectorPosition != selectorCount) { bytes4 lastSelector = ds.selectors[selectorCount]; ds.selectors[oldFacetAddressAndSelectorPosition.selectorPosition] = lastSelector; ds .facetAddressAndSelectorPosition[lastSelector] .selectorPosition = oldFacetAddressAndSelectorPosition.selectorPosition; } // delete last selector ds.selectors.pop(); delete ds.facetAddressAndSelectorPosition[selector]; } } 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); } }
// 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); }
{ "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":[{"internalType":"address","name":"_contractOwner","type":"address"},{"internalType":"address","name":"_diamondCutFacet","type":"address"}],"stateMutability":"payable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260405162004570380380620045708339818101604052810190620000299190620014e0565b6200003f82620001f760201b620001671760201c565b6000600167ffffffffffffffff8111156200005f576200005e62001527565b5b6040519080825280602002602001820160405280156200009c57816020015b620000886200142a565b8152602001906001900390816200007e5790505b5090506000600167ffffffffffffffff811115620000bf57620000be62001527565b5b604051908082528060200260200182016040528015620000ee5781602001602082028036833780820191505090505b509050631f931c1c60e01b8160008151811062000110576200010f62001556565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001600060028111156200019a576200019962001585565b5b81526020018281525082600081518110620001ba57620001b962001556565b5b6020026020010181905250620001ed82600060405180602001604052806000815250620002d660201b6200023e1760201c565b5050505062002382565b6000620002096200055a60201b60201c565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101562000505576000848281518110620002fb57620002fa62001556565b5b60200260200101516020015190506000600281111562000320576200031f62001585565b5b81600281111562000336576200033562001585565b5b0362000396576200039085838151811062000356576200035562001556565b5b60200260200101516000015186848151811062000378576200037762001556565b5b6020026020010151604001516200058760201b60201c565b620004ee565b60016002811115620003ad57620003ac62001585565b5b816002811115620003c357620003c262001585565b5b0362000423576200041d858381518110620003e357620003e262001556565b5b60200260200101516000015186848151811062000405576200040462001556565b5b6020026020010151604001516200091260201b60201c565b620004ed565b60028081111562000439576200043862001585565b5b8160028111156200044f576200044e62001585565b5b03620004af57620004a98583815181106200046f576200046e62001556565b5b60200260200101516000015186848151811062000491576200049062001556565b5b60200260200101516040015162000cbb60201b60201c565b620004ec565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e3906200163b565b60405180910390fd5b5b5b508080620004fc9062001696565b915050620002d9565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516200053b9392919062001a1a565b60405180910390a1620005558282620011a760201b60201c565b505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b6000815111620005ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c59062001adb565b60405180910390fd5b6000620005e06200055a60201b60201c565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000660576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006579062001b73565b60405180910390fd5b6200068b84604051806060016040528060248152602001620044fc60249139620013d560201b60201c565b60005b83518110156200090b576000848281518110620006b057620006af62001556565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620007a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200079e9062001c0b565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c02179055508380620008f09062001c3b565b94505050508080620009029062001696565b9150506200068e565b5050505050565b600081511162000959576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009509062001adb565b60405180910390fd5b60006200096b6200055a60201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620009df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009d69062001ce0565b60405180910390fd5b62000a0a836040518060600160405280602881526020016200454860289139620013d560201b60201c565b60005b825181101562000cb557600083828151811062000a2f5762000a2e62001556565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000b25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b1c9062001d78565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b8d9062001e10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000c08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000bff9062001ea8565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050808062000cac9062001696565b91505062000a0d565b50505050565b600081511162000d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cf99062001adb565b60405180910390fd5b600062000d146200055a60201b60201c565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161462000d94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d8b9062001f40565b60405180910390fd5b60005b8351811015620011a057600084828151811062000db95762000db862001556565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160362000f11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f089062001fd8565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160362000f86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f7d9062002070565b60405180910390fd5b838062000f939062002092565b94505083816020015161ffff1614620010af57600085600101858154811062000fc15762000fc062001556565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff168154811062001008576200100762001556565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480620010c657620010c5620020c0565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080620011979062001696565b91505062000d97565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200122957600081511462001223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200121a9062002165565b60405180910390fd5b620013d1565b600081511162001270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200126790620021fd565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620012d057620012cf826040518060600160405280602881526020016200452060289139620013d560201b60201c565b5b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051620012fa919062002261565b600060405180830381855af49150503d806000811462001337576040519150601f19603f3d011682016040523d82523d6000602084013e6200133c565b606091505b509150915081620013ce576000815111156200139157806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013889190620022c6565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013c59062002360565b60405180910390fd5b50505b5050565b6000823b905060008111829062001424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200141b9190620022c6565b60405180910390fd5b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000600281111562001469576200146862001585565b5b8152602001606081525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620014a8826200147b565b9050919050565b620014ba816200149b565b8114620014c657600080fd5b50565b600081519050620014da81620014af565b92915050565b60008060408385031215620014fa57620014f962001476565b5b60006200150a85828601620014c9565b92505060206200151d85828601620014c9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b600062001623602783620015b4565b91506200163082620015c5565b604082019050919050565b60006020820190508181036000830152620016568162001614565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620016a3826200168c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620016d857620016d76200165d565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6200171a816200149b565b82525050565b6003811062001734576200173362001585565b5b50565b6000819050620017478262001720565b919050565b6000620017598262001737565b9050919050565b6200176b816200174c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620017d4816200179d565b82525050565b6000620017e88383620017c9565b60208301905092915050565b6000602082019050919050565b60006200180e8262001771565b6200181a81856200177c565b935062001827836200178d565b8060005b838110156200185e578151620018428882620017da565b97506200184f83620017f4565b9250506001810190506200182b565b5085935050505092915050565b60006060830160008301516200188560008601826200170f565b5060208301516200189a602086018262001760565b5060408301518482036040860152620018b4828262001801565b9150508091505092915050565b6000620018cf83836200186b565b905092915050565b6000602082019050919050565b6000620018f182620016e3565b620018fd8185620016ee565b9350836020820285016200191185620016ff565b8060005b85811015620019535784840389528151620019318582620018c1565b94506200193e83620018d7565b925060208a0199505060018101905062001915565b50829750879550505050505092915050565b62001970816200149b565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620019b257808201518184015260208101905062001995565b83811115620019c2576000848401525b50505050565b6000601f19601f8301169050919050565b6000620019e68262001976565b620019f2818562001981565b935062001a0481856020860162001992565b62001a0f81620019c8565b840191505092915050565b6000606082019050818103600083015262001a368186620018e4565b905062001a47602083018562001965565b818103604083015262001a5b8184620019d9565b9050949350505050565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b600062001ac3602b83620015b4565b915062001ad08262001a65565b604082019050919050565b6000602082019050818103600083015262001af68162001ab4565b9050919050565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b600062001b5b602c83620015b4565b915062001b688262001afd565b604082019050919050565b6000602082019050818103600083015262001b8e8162001b4c565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b600062001bf3603583620015b4565b915062001c008262001b95565b604082019050919050565b6000602082019050818103600083015262001c268162001be4565b9050919050565b600061ffff82169050919050565b600062001c488262001c2d565b915061ffff820362001c5f5762001c5e6200165d565b5b600182019050919050565b7f4c69624469616d6f6e644375743a205265706c6163652066616365742063616e60008201527f2774206265206164647265737328302900000000000000000000000000000000602082015250565b600062001cc8603083620015b4565b915062001cd58262001c6a565b604082019050919050565b6000602082019050818103600083015262001cfb8162001cb9565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c61636520696d6d60008201527f757461626c652066756e6374696f6e0000000000000000000000000000000000602082015250565b600062001d60602f83620015b4565b915062001d6d8262001d02565b604082019050919050565b6000602082019050818103600083015262001d938162001d51565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b600062001df8603883620015b4565b915062001e058262001d9a565b604082019050919050565b6000602082019050818103600083015262001e2b8162001de9565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e207468617420646f65736e27742065786973740000000000000000602082015250565b600062001e90603883620015b4565b915062001e9d8262001e32565b604082019050919050565b6000602082019050818103600083015262001ec38162001e81565b9050919050565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b600062001f28603683620015b4565b915062001f358262001eca565b604082019050919050565b6000602082019050818103600083015262001f5b8162001f19565b9050919050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b600062001fc0603783620015b4565b915062001fcd8262001f62565b604082019050919050565b6000602082019050818103600083015262001ff38162001fb1565b9050919050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e2e0000000000000000000000000000000000602082015250565b600062002058602f83620015b4565b9150620020658262001ffa565b604082019050919050565b600060208201905081810360008301526200208b8162002049565b9050919050565b60006200209f826200168c565b915060008203620020b557620020b46200165d565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b60006200214d603c83620015b4565b91506200215a82620020ef565b604082019050919050565b6000602082019050818103600083015262002180816200213e565b9050919050565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b6000620021e5603d83620015b4565b9150620021f28262002187565b604082019050919050565b600060208201905081810360008301526200221881620021d6565b9050919050565b600081905092915050565b6000620022378262001976565b6200224381856200221f565b93506200225581856020860162001992565b80840191505092915050565b60006200226f82846200222a565b915081905092915050565b600081519050919050565b600062002292826200227a565b6200229e8185620015b4565b9350620022b081856020860162001992565b620022bb81620019c8565b840191505092915050565b60006020820190508181036000830152620022e2818462002285565b905092915050565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b600062002348602683620015b4565b91506200235582620022ea565b604082019050919050565b600060208201905081810360008301526200237b8162002339565b9050919050565b61216a80620023926000396000f3fe60806040523661000b57005b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101389061130a565b60405180910390fd5b3660008037600080366000845af43d6000803e8060008114610162573d6000f35b3d6000fd5b600061017161046d565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101561042257600084828151811061025f5761025e61132a565b5b60200260200101516020015190506000600281111561028157610280611359565b5b81600281111561029457610293611359565b5b036102e4576102df8583815181106102af576102ae61132a565b5b6020026020010151600001518684815181106102ce576102cd61132a565b5b60200260200101516040015161049a565b61040e565b600160028111156102f8576102f7611359565b5b81600281111561030b5761030a611359565b5b0361035b576103568583815181106103265761032561132a565b5b6020026020010151600001518684815181106103455761034461132a565b5b602002602001015160400151610802565b61040d565b60028081111561036e5761036d611359565b5b81600281111561038157610380611359565b5b036103d1576103cc85838151811061039c5761039b61132a565b5b6020026020010151600001518684815181106103bb576103ba61132a565b5b602002602001015160400151610b84565b61040c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610403906113fa565b60405180910390fd5b5b5b50808061041a90611453565b915050610241565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610456939291906117c8565b60405180910390a16104688282611049565b505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b60008151116104de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d59061187f565b60405180910390fd5b60006104e861046d565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055c90611911565b60405180910390fd5b610587846040518060600160405280602481526020016120c16024913961125b565b60005b83518110156107fb5760008482815181106105a8576105a761132a565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610693906119a3565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555083806107e3906119d1565b945050505080806107f390611453565b91505061058a565b5050505050565b6000815111610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d9061187f565b60405180910390fd5b600061085061046d565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b890611a6d565b60405180910390fd5b6108e38360405180606001604052806028815260200161210d6028913961125b565b60005b8251811015610b7e5760008382815181106109045761090361132a565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee90611aff565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90611b91565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90611c23565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508080610b7690611453565b9150506108e6565b50505050565b6000815111610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf9061187f565b60405180910390fd5b6000610bd261046d565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690611cb5565b60405180910390fd5b60005b8351811015611042576000848281518110610c7057610c6f61132a565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90611d47565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e90611dd9565b60405180910390fd5b8380610e4290611df9565b94505083816020015161ffff1614610f57576000856001018581548110610e6c57610e6b61132a565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110610eb057610eaf61132a565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480610f6b57610f6a611e22565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff021916905550505050808061103a90611453565b915050610c52565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c65760008151146110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890611ec3565b60405180910390fd5b611257565b600081511161110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190611f55565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146111605761115f826040518060600160405280602881526020016120e56028913961125b565b5b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516111889190611fb1565b600060405180830381855af49150503d80600081146111c3576040519150601f19603f3d011682016040523d82523d6000602084013e6111c8565b606091505b5091509150816112545760008151111561121957806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611210919061200c565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b906120a0565b60405180910390fd5b50505b5050565b6000823b90506000811182906112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e919061200c565b60405180910390fd5b50505050565b600082825260208201905092915050565b7f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f74206578697374600082015250565b60006112f46020836112ad565b91506112ff826112be565b602082019050919050565b60006020820190508181036000830152611323816112e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b60006113e46027836112ad565b91506113ef82611388565b604082019050919050565b60006020820190508181036000830152611413816113d7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600061145e82611449565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114905761148f61141a565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114f2826114c7565b9050919050565b611502816114e7565b82525050565b6003811061151957611518611359565b5b50565b600081905061152a82611508565b919050565b600061153a8261151c565b9050919050565b61154a8161152f565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115b18161157c565b82525050565b60006115c383836115a8565b60208301905092915050565b6000602082019050919050565b60006115e782611550565b6115f1818561155b565b93506115fc8361156c565b8060005b8381101561162d57815161161488826115b7565b975061161f836115cf565b925050600181019050611600565b5085935050505092915050565b600060608301600083015161165260008601826114f9565b5060208301516116656020860182611541565b506040830151848203604086015261167d82826115dc565b9150508091505092915050565b6000611696838361163a565b905092915050565b6000602082019050919050565b60006116b68261149b565b6116c081856114a6565b9350836020820285016116d2856114b7565b8060005b8581101561170e57848403895281516116ef858261168a565b94506116fa8361169e565b925060208a019950506001810190506116d6565b50829750879550505050505092915050565b611729816114e7565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561176957808201518184015260208101905061174e565b83811115611778576000848401525b50505050565b6000601f19601f8301169050919050565b600061179a8261172f565b6117a4818561173a565b93506117b481856020860161174b565b6117bd8161177e565b840191505092915050565b600060608201905081810360008301526117e281866116ab565b90506117f16020830185611720565b8181036040830152611803818461178f565b9050949350505050565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b6000611869602b836112ad565b91506118748261180d565b604082019050919050565b600060208201905081810360008301526118988161185c565b9050919050565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b60006118fb602c836112ad565b91506119068261189f565b604082019050919050565b6000602082019050818103600083015261192a816118ee565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b600061198d6035836112ad565b915061199882611931565b604082019050919050565b600060208201905081810360008301526119bc81611980565b9050919050565b600061ffff82169050919050565b60006119dc826119c3565b915061ffff82036119f0576119ef61141a565b5b600182019050919050565b7f4c69624469616d6f6e644375743a205265706c6163652066616365742063616e60008201527f2774206265206164647265737328302900000000000000000000000000000000602082015250565b6000611a576030836112ad565b9150611a62826119fb565b604082019050919050565b60006020820190508181036000830152611a8681611a4a565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c61636520696d6d60008201527f757461626c652066756e6374696f6e0000000000000000000000000000000000602082015250565b6000611ae9602f836112ad565b9150611af482611a8d565b604082019050919050565b60006020820190508181036000830152611b1881611adc565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b6000611b7b6038836112ad565b9150611b8682611b1f565b604082019050919050565b60006020820190508181036000830152611baa81611b6e565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e207468617420646f65736e27742065786973740000000000000000602082015250565b6000611c0d6038836112ad565b9150611c1882611bb1565b604082019050919050565b60006020820190508181036000830152611c3c81611c00565b9050919050565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b6000611c9f6036836112ad565b9150611caa82611c43565b604082019050919050565b60006020820190508181036000830152611cce81611c92565b9050919050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b6000611d316037836112ad565b9150611d3c82611cd5565b604082019050919050565b60006020820190508181036000830152611d6081611d24565b9050919050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e2e0000000000000000000000000000000000602082015250565b6000611dc3602f836112ad565b9150611dce82611d67565b604082019050919050565b60006020820190508181036000830152611df281611db6565b9050919050565b6000611e0482611449565b915060008203611e1757611e1661141a565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b6000611ead603c836112ad565b9150611eb882611e51565b604082019050919050565b60006020820190508181036000830152611edc81611ea0565b9050919050565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b6000611f3f603d836112ad565b9150611f4a82611ee3565b604082019050919050565b60006020820190508181036000830152611f6e81611f32565b9050919050565b600081905092915050565b6000611f8b8261172f565b611f958185611f75565b9350611fa581856020860161174b565b80840191505092915050565b6000611fbd8284611f80565b915081905092915050565b600081519050919050565b6000611fde82611fc8565b611fe881856112ad565b9350611ff881856020860161174b565b6120018161177e565b840191505092915050565b600060208201905081810360008301526120268184611fd3565b905092915050565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b600061208a6026836112ad565b91506120958261202e565b604082019050919050565b600060208201905081810360008301526120b98161207d565b905091905056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a2646970667358221220a3279d5588d8dc880684d17b53f1e3ac8d715741d0bdda32f137c66b19fa125664736f6c634300080d00334c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465000000000000000000000000c3309c612f78dfb86863864ca4485876bf4318ee000000000000000000000000e281a8a25e8654a44068925f26f5142ba29e3f43