Transactions
Internal Transactions
Coin Balance History
Code
Read Contract
Read Proxy
Write Contract
Write Proxy
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- CutDiamond
- Optimization enabled
- true
- Compiler version
- v0.8.19+commit.7dd6d404
- Optimization runs
- 999999
- EVM Version
- paris
- Verified at
- 2024-05-20T18:04:31.412108Z
lib/@lagunagames/lg-diamond-template/src/diamond/CutDiamond.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import {IDiamondCut} from '../interfaces/IDiamondCut.sol'; import {IDiamondLoupe} from '../interfaces/IDiamondLoupe.sol'; import {IERC165} from '../interfaces/IERC165.sol'; import {LibSupportsInterface} from '../libraries/LibSupportsInterface.sol'; /// @title Dummy "implementation" contract for LG Diamond interface for ERC-1967 compatibility /// @dev adapted from https://github.com/zdenham/diamond-etherscan?tab=readme-ov-file /// @dev This interface is used internally to call endpoints on a deployed diamond cluster. contract CutDiamond is IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external pure returns (bool) { return (interfaceID == type(IERC165).interfaceId); } /// @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( IDiamondCut.FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external {} /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @dev This is a convenience implementation of the above /// @param _diamondCut Contains the facet addresses and function selectors function diamondCut(IDiamondCut.FacetCut[] calldata _diamondCut) external {} /// @notice Removes one selector from the Diamond, using DiamondCut /// @param selector - The byte4 signature for a method selector to remove /// @custom:emits FacetCutAction function cutSelector(bytes4 selector) external {} /// @notice Removes one selector from the Diamond, using removeFunction() /// @param selector - The byte4 signature for a method selector to remove function deleteSelector(bytes4 selector) external {} /// @notice Removes many selectors from the Diamond, using DiamondCut /// @param selectors - Array of byte4 signatures for method selectors to remove /// @custom:emits FacetCutAction function cutSelectors(bytes4[] memory selectors) external {} /// @notice Removes many selectors from the Diamond, using removeFunctions() /// @param selectors - Array of byte4 signatures for method selectors to remove function deleteSelectors(bytes4[] memory selectors) external {} /// @notice Removes any selectors from the Diamond that come from a target /// @notice contract address, using DiamondCut. /// @param facet - The address of the Facet smart contract to remove /// @custom:emits FacetCutAction function cutFacet(address facet) external {} /// @notice Gets all facets and their selectors. /// @return facets_ Facet function facets() external view returns (IDiamondLoupe.Facet[] memory facets_) {} /// @notice Gets all the function selectors provided by a 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_) {} /// @notice Get the address of the owner /// @return The address of the owner. function owner() external view returns (address) {} /// @notice Set the address of the new owner of the contract /// @dev Set _newOwner to address(0) to renounce any ownership. /// @param _newOwner The address of the new owner of the contract function transferOwnership(address _newOwner) external {} /// @notice Set the dummy "implementation" contract address /// @custom:emits Upgraded function setImplementation(address _implementation) external {} /// @notice Get the dummy "implementation" contract address /// @return The dummy "implementation" contract address function implementation() external view returns (address) {} /// @notice Set whether an interface is implemented /// @dev Only the contract owner can call this function /// @param interfaceID The interface identifier, as specified in ERC-165 /// @param implemented `true` if the contract implements `interfaceID` function setSupportsInterface(bytes4 interfaceID, bool implemented) external {} /// @notice Set a list of interfaces as implemented or not /// @dev Only the contract owner can call this function /// @param interfaceIDs The interface identifiers, as specified in ERC-165 /// @param allImplemented `true` if the contract implements all interfaces function setSupportsInterfaces(bytes4[] calldata interfaceIDs, bool allImplemented) external {} /// @notice Returns a list of interfaces that have (ever) been supported /// @return The list of interfaces function interfaces() external view returns (LibSupportsInterface.KnownInterface[] memory) {} }
lib/@lagunagames/lg-diamond-template/src/interfaces/IDiamondCut.sol
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.19; /******************************************************************************\ * 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); }
lib/@lagunagames/lg-diamond-template/src/interfaces/IDiamondLoupe.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; // Adapted from the Diamond 3 reference implementation by Nick Mudge: // https://github.com/mudgen/diamond-3-hardhat // 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_); }
lib/@lagunagames/lg-diamond-template/src/interfaces/IERC165.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; /// @title ERC-165 Standard Interface Detection /// @dev https://eips.ethereum.org/EIPS/eip-165 interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); }
lib/@lagunagames/lg-diamond-template/src/libraries/LibContractOwner.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; /// @title Library for the common LG implementation of ERC-173 Contract Ownership Standard /// @author [email protected] /// @custom:storage-location erc1967:eip1967.proxy.admin library LibContractOwner { error CallerIsNotContractOwner(); /// @notice This emits when ownership of a contract changes. /// @dev ERC-173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @notice Emitted when the admin account has changed. /// @dev ERC-1967 event AdminChanged(address previousAdmin, address newAdmin); // @dev Standard storage slot for the ERC-1967 admin address // @dev bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1) bytes32 private constant ADMIN_SLOT_POSITION = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; struct LibOwnerStorage { address contractOwner; } /// @notice Storage slot for Contract Owner state data function ownerStorage() internal pure returns (LibOwnerStorage storage storageSlot) { bytes32 position = ADMIN_SLOT_POSITION; // solhint-disable-next-line no-inline-assembly assembly { storageSlot.slot := position } } /// @notice Sets the contract owner /// @param newOwner The new owner /// @custom:emits OwnershipTransferred function setContractOwner(address newOwner) internal { LibOwnerStorage storage ls = ownerStorage(); address previousOwner = ls.contractOwner; ls.contractOwner = newOwner; emit OwnershipTransferred(previousOwner, newOwner); emit AdminChanged(previousOwner, newOwner); } /// @notice Gets the contract owner wallet /// @return owner The contract owner function contractOwner() internal view returns (address owner) { owner = ownerStorage().contractOwner; } /// @notice Ensures that the caller is the contract owner, or throws an error. /// @custom:throws LibAccess: Must be contract owner function enforceIsContractOwner() internal view { if (msg.sender != ownerStorage().contractOwner) revert CallerIsNotContractOwner(); } }
lib/@lagunagames/lg-diamond-template/src/libraries/LibSupportsInterface.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.19; import {LibContractOwner} from '../libraries/LibContractOwner.sol'; /// @title Library for the common LG implementation of ERC-165 /// @author [email protected] /// @custom:storage-location erc7201:games.laguna.LibSupportsInterface library LibSupportsInterface { bytes32 public constant SUPPORTS_INTERFACE_STORAGE_POSITION = keccak256(abi.encode(uint256(keccak256('games.laguna.LibSupportsInterface')) - 1)) & ~bytes32(uint256(0xff)); struct KnownInterface { bytes4 selector; bool supported; } struct SupportsInterfaceStorage { mapping(bytes4 selector => bool supported) supportedInterfaces; bytes4[] interfaces; } /// @notice Storage slot for SupportsInterface state data function supportsInterfaceStorage() internal pure returns (SupportsInterfaceStorage storage storageSlot) { bytes32 position = SUPPORTS_INTERFACE_STORAGE_POSITION; // solhint-disable-next-line no-inline-assembly assembly { storageSlot.slot := position } } /// @notice Checks if a contract implements an interface /// @param _interfaceId Interface ID to check /// @return true if the contract implements the interface function supportsInterface(bytes4 _interfaceId) internal view returns (bool) { return supportsInterfaceStorage().supportedInterfaces[_interfaceId]; } /// @notice Sets whether a contract implements an interface /// @param _interfaceId Interface ID to set /// @param _implemented true if the contract implements the interface function setSupportsInterface(bytes4 _interfaceId, bool _implemented) internal { SupportsInterfaceStorage storage s = supportsInterfaceStorage(); if (_implemented && !s.supportedInterfaces[_interfaceId]) { s.interfaces.push(_interfaceId); } s.supportedInterfaces[_interfaceId] = _implemented; } /// @notice Returns the list of interfaces this contract has supported, and whether they are supported currently. /// @return The list of interfaces function getKnownInterfaces() internal view returns (KnownInterface[] memory) { SupportsInterfaceStorage storage s = supportsInterfaceStorage(); KnownInterface[] memory interfaces = new KnownInterface[](s.interfaces.length); for (uint i = 0; i < s.interfaces.length; ++i) { interfaces[i] = KnownInterface({ selector: s.interfaces[i], supported: s.supportedInterfaces[s.interfaces[i]] }); } return interfaces; } /// @notice Calculate the interface ID for a list of function selectors /// @dev Per ERC-165: "We define the interface identifier as the XOR of all function selectors in the interface" /// @param functionSelectors The list of function selectors in the interface /// @return interfaceId The ERC-165 interface ID function calculateInterfaceId(bytes4[] memory functionSelectors) internal pure returns (bytes4 interfaceId) { for (uint256 i = 0; i < functionSelectors.length; ++i) { interfaceId ^= functionSelectors[i]; } } }
Compiler Settings
{"viaIR":true,"remappings":["ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/"],"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":999999,"enabled":true,"details":{"yulDetails":{"stackAllocation":true,"optimizerSteps":"dhfoDgvulfnTUtnIf"},"yul":true,"peephole":true,"inliner":true,"deduplicate":true,"cse":true}},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cutFacet","inputs":[{"type":"address","name":"facet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cutSelector","inputs":[{"type":"bytes4","name":"selector","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cutSelectors","inputs":[{"type":"bytes4[]","name":"selectors","internalType":"bytes4[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteSelector","inputs":[{"type":"bytes4","name":"selector","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteSelectors","inputs":[{"type":"bytes4[]","name":"selectors","internalType":"bytes4[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"diamondCut","inputs":[{"type":"tuple[]","name":"_diamondCut","internalType":"struct IDiamondCut.FacetCut[]","components":[{"type":"address","name":"facetAddress","internalType":"address"},{"type":"uint8","name":"action","internalType":"enum IDiamondCut.FacetCutAction"},{"type":"bytes4[]","name":"functionSelectors","internalType":"bytes4[]"}]},{"type":"address","name":"_init","internalType":"address"},{"type":"bytes","name":"_calldata","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"diamondCut","inputs":[{"type":"tuple[]","name":"_diamondCut","internalType":"struct IDiamondCut.FacetCut[]","components":[{"type":"address","name":"facetAddress","internalType":"address"},{"type":"uint8","name":"action","internalType":"enum IDiamondCut.FacetCutAction"},{"type":"bytes4[]","name":"functionSelectors","internalType":"bytes4[]"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"facetAddress_","internalType":"address"}],"name":"facetAddress","inputs":[{"type":"bytes4","name":"_functionSelector","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"facetAddresses_","internalType":"address[]"}],"name":"facetAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes4[]","name":"facetFunctionSelectors_","internalType":"bytes4[]"}],"name":"facetFunctionSelectors","inputs":[{"type":"address","name":"_facet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"facets_","internalType":"struct IDiamondLoupe.Facet[]","components":[{"type":"address","name":"facetAddress","internalType":"address"},{"type":"bytes4[]","name":"functionSelectors","internalType":"bytes4[]"}]}],"name":"facets","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct LibSupportsInterface.KnownInterface[]","components":[{"type":"bytes4","name":"selector","internalType":"bytes4"},{"type":"bool","name":"supported","internalType":"bool"}]}],"name":"interfaces","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setImplementation","inputs":[{"type":"address","name":"_implementation","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSupportsInterface","inputs":[{"type":"bytes4","name":"interfaceID","internalType":"bytes4"},{"type":"bool","name":"implemented","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSupportsInterfaces","inputs":[{"type":"bytes4[]","name":"interfaceIDs","internalType":"bytes4[]"},{"type":"bool","name":"allImplemented","internalType":"bool"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceID","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]}]
Contract Creation Code
0x60806040523461001a57604051610899610020823961089990f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461012a5780631f931c1c1461012557806352ef6b2c1461012057806354e7796f1461011b5780635c60da1b1461010c5780636463e3a0146100e957806366e5722b146101165780637a0ed627146101115780638da5cb5b1461010c578063a6638c0e146100ee578063adfca15e14610107578063cdffacc614610102578063d784d426146100ee578063debb3856146100fd578063e0435c0b146100fd578063e57e69c6146100f8578063f2709f21146100f3578063f2fde38b146100ee5763ff6f3e0b0361012f575b610563565b61071a565b610844565b6107b5565b61077f565b610763565b61073b565b6103f3565b6106e7565b6105af565b6103dc565b610385565b6102dd565b610185565b600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081165b0361012f57565b9050359061016c82610134565b565b9060208282031261012f576101829161015f565b90565b3461012f576101f46101e261019b36600461016e565b7fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b60405191829182901515815260200190565b0390f35b909182601f8301121561012f5781359167ffffffffffffffff831161012f57602001926020830284011161012f57565b73ffffffffffffffffffffffffffffffffffffffff8116610158565b9050359061016c82610228565b909182601f8301121561012f5781359167ffffffffffffffff831161012f57602001926001830284011161012f57565b919060608382031261012f57823567ffffffffffffffff811161012f57816102aa9185016101f8565b9290936102ba8360208301610244565b92604082013567ffffffffffffffff811161012f576102d99201610251565b9091565b3461012f576102ed366004610281565b50505050506102fb60405190565b005b600091031261012f57565b90610328610321610317845190565b8084529260200190565b9260200190565b9060005b8181106103395750505090565b90919261036c610365600192865173ffffffffffffffffffffffffffffffffffffffff16815260200190565b9460200190565b92910161032c565b602080825261018292910190610308565b3461012f576103953660046102fd565b604051806101f4606082610374565b801515610158565b9050359061016c826103a4565b919060408382031261012f57610182906103d3818561015f565b936020016103ac565b3461012f576103ec3660046103b9565b5050604051005b3461012f576104033660046102fd565b6101f460005b6040519182918273ffffffffffffffffffffffffffffffffffffffff909116815260200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810190811067ffffffffffffffff82111761049f57604052565b610430565b9061016c6104b160405190565b928361045f565b67ffffffffffffffff811161049f5760208091020190565b909291926104e56104e0826104b8565b6104a4565b938185526020808601920283019281841161012f57915b8383106105095750505050565b60208091610517848661015f565b8152019201916104fc565b9080601f8301121561012f57816020610182933591016104d0565b9060208282031261012f57813567ffffffffffffffff811161012f576101829201610522565b3461012f5761057336600461053d565b50604051005b9160408383031261012f57823567ffffffffffffffff811161012f576105a4836101829286016101f8565b9390946020016103ac565b3461012f576105bf366004610579565b5050506102fb60405190565b906105da610321610317845190565b9060005b8181106105eb5750505090565b90919261062361036560019286517fffffffff0000000000000000000000000000000000000000000000000000000016815260200190565b9291016105de565b805173ffffffffffffffffffffffffffffffffffffffff168252610182916040810191602001519060208184039101526105cb565b906101829161062b565b90610680610676835190565b8083529160200190565b90816106926020830284019460200190565b926000915b8383106106a657505050505090565b909192939460206106c96106c283856001950387528951610660565b9760200190565b9301930191939290610697565b60208082526101829291019061066a565b3461012f576106f73660046102fd565b604051806101f46060826106d6565b9060208282031261012f5761018291610244565b3461012f57610573366004610706565b6020808252610182929101906105cb565b3461012f576101f4610757610751366004610706565b50606090565b6040519182918261072a565b3461012f576101f461040961077936600461016e565b50600090565b3461012f5761057336600461016e565b9060208282031261012f57813567ffffffffffffffff811161012f576102d992016101f8565b3461012f576103ec36600461078f565b906107d4610321610317845190565b9060005b8181106107e55750505090565b90919261082b610365600192865180517fffffffff0000000000000000000000000000000000000000000000000000000016825260209081015115159082015260400190565b9291016107d8565b6020808252610182929101906107c5565b3461012f576108543660046102fd565b604051806101f460608261083356fea264697066735822122045af4ee9e05d62d825d77efd083f509322916fbeae70de7caa2f50beb0f3fe1d64736f6c63430008130033
Deployed ByteCode
0x6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461012a5780631f931c1c1461012557806352ef6b2c1461012057806354e7796f1461011b5780635c60da1b1461010c5780636463e3a0146100e957806366e5722b146101165780637a0ed627146101115780638da5cb5b1461010c578063a6638c0e146100ee578063adfca15e14610107578063cdffacc614610102578063d784d426146100ee578063debb3856146100fd578063e0435c0b146100fd578063e57e69c6146100f8578063f2709f21146100f3578063f2fde38b146100ee5763ff6f3e0b0361012f575b610563565b61071a565b610844565b6107b5565b61077f565b610763565b61073b565b6103f3565b6106e7565b6105af565b6103dc565b610385565b6102dd565b610185565b600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081165b0361012f57565b9050359061016c82610134565b565b9060208282031261012f576101829161015f565b90565b3461012f576101f46101e261019b36600461016e565b7fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b60405191829182901515815260200190565b0390f35b909182601f8301121561012f5781359167ffffffffffffffff831161012f57602001926020830284011161012f57565b73ffffffffffffffffffffffffffffffffffffffff8116610158565b9050359061016c82610228565b909182601f8301121561012f5781359167ffffffffffffffff831161012f57602001926001830284011161012f57565b919060608382031261012f57823567ffffffffffffffff811161012f57816102aa9185016101f8565b9290936102ba8360208301610244565b92604082013567ffffffffffffffff811161012f576102d99201610251565b9091565b3461012f576102ed366004610281565b50505050506102fb60405190565b005b600091031261012f57565b90610328610321610317845190565b8084529260200190565b9260200190565b9060005b8181106103395750505090565b90919261036c610365600192865173ffffffffffffffffffffffffffffffffffffffff16815260200190565b9460200190565b92910161032c565b602080825261018292910190610308565b3461012f576103953660046102fd565b604051806101f4606082610374565b801515610158565b9050359061016c826103a4565b919060408382031261012f57610182906103d3818561015f565b936020016103ac565b3461012f576103ec3660046103b9565b5050604051005b3461012f576104033660046102fd565b6101f460005b6040519182918273ffffffffffffffffffffffffffffffffffffffff909116815260200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810190811067ffffffffffffffff82111761049f57604052565b610430565b9061016c6104b160405190565b928361045f565b67ffffffffffffffff811161049f5760208091020190565b909291926104e56104e0826104b8565b6104a4565b938185526020808601920283019281841161012f57915b8383106105095750505050565b60208091610517848661015f565b8152019201916104fc565b9080601f8301121561012f57816020610182933591016104d0565b9060208282031261012f57813567ffffffffffffffff811161012f576101829201610522565b3461012f5761057336600461053d565b50604051005b9160408383031261012f57823567ffffffffffffffff811161012f576105a4836101829286016101f8565b9390946020016103ac565b3461012f576105bf366004610579565b5050506102fb60405190565b906105da610321610317845190565b9060005b8181106105eb5750505090565b90919261062361036560019286517fffffffff0000000000000000000000000000000000000000000000000000000016815260200190565b9291016105de565b805173ffffffffffffffffffffffffffffffffffffffff168252610182916040810191602001519060208184039101526105cb565b906101829161062b565b90610680610676835190565b8083529160200190565b90816106926020830284019460200190565b926000915b8383106106a657505050505090565b909192939460206106c96106c283856001950387528951610660565b9760200190565b9301930191939290610697565b60208082526101829291019061066a565b3461012f576106f73660046102fd565b604051806101f46060826106d6565b9060208282031261012f5761018291610244565b3461012f57610573366004610706565b6020808252610182929101906105cb565b3461012f576101f4610757610751366004610706565b50606090565b6040519182918261072a565b3461012f576101f461040961077936600461016e565b50600090565b3461012f5761057336600461016e565b9060208282031261012f57813567ffffffffffffffff811161012f576102d992016101f8565b3461012f576103ec36600461078f565b906107d4610321610317845190565b9060005b8181106107e55750505090565b90919261082b610365600192865180517fffffffff0000000000000000000000000000000000000000000000000000000016825260209081015115159082015260400190565b9291016107d8565b6020808252610182929101906107c5565b3461012f576108543660046102fd565b604051806101f460608261083356fea264697066735822122045af4ee9e05d62d825d77efd083f509322916fbeae70de7caa2f50beb0f3fe1d64736f6c63430008130033