Indexing Tokens - We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x9a5c301722C180f65400B0538D1b9f8Dc1831cFd

Creator
0x046bf7–da7b9c at 0x1c962c–76c1e3
Balance
0 LIT
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
2793534
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x30a5456ea0d81fb81b82c2949ee1c798ebc933ac.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
PaymentDelegation




Optimization enabled
false
Compiler version
v0.8.17+commit.8df45f5f




Verified at
2024-05-01T17:59:08.120210Z

contracts/lit-node/PaymentDelegation.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (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";
import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol";
import { ContractResolver } from "../lit-core/ContractResolver.sol";
import { LibStakingStorage } from "./Staking/LibStakingStorage.sol";
// When no function exists for function called
error FunctionNotFound(bytes4 _functionSelector);
// This is used in diamond constructor
// more arguments are added to this struct
// this avoids stack too deep errors
struct PaymentDelegationArgs {
address owner;
address init;
bytes initCalldata;
}
contract PaymentDelegation {
constructor(
IDiamondCut.FacetCut[] memory _diamondCut,
PaymentDelegationArgs memory _args
) payable {
LibDiamond.setContractOwner(_args.owner);
LibDiamond.diamondCut(_diamondCut, _args.init, _args.initCalldata);
}
// Find facet for function that is called and execute the
// function if a facet is found and return any value.
fallback() external {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/lit-core/ContractResolver.sol

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "hardhat/console.sol";
contract ContractResolver is AccessControl {
/* ========== TYPE DEFINITIONS ========== */
// the comments following each one of these are the keccak256 hashes of the string values
// this is very useful if you have to manually set any of these, so that you
// don't have to calculate the hahes yourself.
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN"); // 0xdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42
bytes32 public constant RELEASE_REGISTER_CONTRACT =
keccak256("RELEASE_REGISTER"); // 0x3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec
bytes32 public constant STAKING_CONTRACT = keccak256("STAKING"); // 0x080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b
bytes32 public constant STAKING_BALANCES_CONTRACT =
keccak256("STAKING_BALANCES"); // 0xaa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d72
bytes32 public constant MULTI_SENDER_CONTRACT = keccak256("MULTI_SENDER"); // 0xdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da7243
bytes32 public constant LIT_TOKEN_CONTRACT = keccak256("LIT_TOKEN");
bytes32 public constant PUB_KEY_ROUTER_CONTRACT =
keccak256("PUB_KEY_ROUTER"); // 0xb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f7
bytes32 public constant PKP_NFT_CONTRACT = keccak256("PKP_NFT"); // 0xb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b0
bytes32 public constant RATE_LIMIT_NFT_CONTRACT =
keccak256("RATE_LIMIT_NFT"); // 0xb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a918
bytes32 public constant PKP_HELPER_CONTRACT = keccak256("PKP_HELPER"); // 0x27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b44388755765
bytes32 public constant PKP_HELPER_V2_CONTRACT = keccak256("PKP_HELPER_V2"); // 0x58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf
bytes32 public constant PKP_PERMISSIONS_CONTRACT =
keccak256("PKP_PERMISSIONS"); // 0x54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe
bytes32 public constant PKP_NFT_METADATA_CONTRACT =
keccak256("PKP_NFT_METADATA"); // 0xf14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a
bytes32 public constant ALLOWLIST_CONTRACT = keccak256("ALLOWLIST"); // 0x74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca
bytes32 public constant DOMAIN_WALLET_REGISTRY =
keccak256("DOMAIN_WALLET_REGISTRY");
bytes32 public constant HD_KEY_DERIVER_CONTRACT =
keccak256("HD_KEY_DERIVER");
bytes32 public constant BACKUP_RECOVERY_CONTRACT =
keccak256("BACKUP_RECOVERY");
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/lit-node/Staking/LibStakingStorage.sol

//SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;
import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import { BitMaps } from "@openzeppelin/contracts/utils/structs/BitMaps.sol";
import "solidity-bytes-utils/contracts/BytesLib.sol";
import { ContractResolver } from "../../lit-core/ContractResolver.sol";
interface IPubkeyRouter {
struct RootKey {
bytes pubkey;
uint256 keyType; // 1 = BLS, 2 = ECDSA. Not doing this in an enum so we can add more keytypes in the future without redeploying.
}
struct Signature {
bytes32 r;
bytes32 s;
uint8 v;
}
}
library LibStakingStorage {
using EnumerableSet for EnumerableSet.AddressSet;
bytes32 constant STAKING_POSITION = keccak256("staking.storage");
enum States {
Active,
NextValidatorSetLocked,
ReadyForNextEpoch,
Unlocked,
Paused,
Restore
}
struct Validator {
uint32 ip;
uint128 ipv6;
uint32 port;
address nodeAddress;
uint256 reward;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

hardhat/console.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

solidity-bytes-utils/contracts/BytesLib.sol

// SPDX-License-Identifier: Unlicense
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*/
pragma solidity >=0.8.0 <0.9.0;
library BytesLib {
function concat(
bytes memory _preBytes,
bytes memory _postBytes
)
internal
pure
returns (bytes memory)
{
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
let length := mload(_preBytes)
mstore(tempBytes, length)
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
let mc := add(tempBytes, 0x20)
// Stop copying when the memory counter reaches the length of the
// first bytes array.
let end := add(mc, length)
for {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/AccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/IAccessControl.sol

// 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);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Strings.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
import "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/ERC165.sol

// 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;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/libraries/LibDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
import { IDiamond } from "../interfaces/IDiamond.sol";
import { IDiamondCut } from "../interfaces/IDiamondCut.sol";
// Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
// The loupe functions are required by the EIP2535 Diamonds standard
error NoSelectorsGivenToAdd();
error NotContractOwner(address _user, address _contractOwner);
error NoSelectorsProvidedForFacetForCut(address _facetAddress);
error CannotAddSelectorsToZeroAddress(bytes4[] _selectors);
error NoBytecodeAtAddress(address _contractAddress, string _message);
error IncorrectFacetCutAction(uint8 _action);
error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector);
error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors);
error CannotReplaceImmutableFunction(bytes4 _selector);
error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(
bytes4 _selector
);
error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector);
error RemoveFacetAddressMustBeZeroAddress(address _facetAddress);
error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector);
error CannotRemoveImmutableFunction(bytes4 _selector);
error InitializationFunctionReverted(
address _initializationContractAddress,
bytes _calldata
);
library LibDiamond {
bytes32 constant DIAMOND_STORAGE_POSITION =
keccak256("diamond.standard.diamond.storage");
struct FacetAddressAndSelectorPosition {
address facetAddress;
uint16 selectorPosition;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/IERC165.sol

// 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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/Math.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/SignedMath.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/BitMaps.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/BitMaps.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
* Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
*/
library BitMaps {
struct BitMap {
mapping(uint256 => uint256) _data;
}
/**
* @dev Returns whether the bit at `index` is set.
*/
function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
uint256 bucket = index >> 8;
uint256 mask = 1 << (index & 0xff);
return bitmap._data[bucket] & mask != 0;
}
/**
* @dev Sets the bit at `index` to the boolean `value`.
*/
function setTo(BitMap storage bitmap, uint256 index, bool value) internal {
if (value) {
set(bitmap, index);
} else {
unset(bitmap, index);
}
}
/**
* @dev Sets the bit at `index`.
*/
function set(BitMap storage bitmap, uint256 index) internal {
uint256 bucket = index >> 8;
uint256 mask = 1 << (index & 0xff);
bitmap._data[bucket] |= mask;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/EnumerableSet.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
interface IDiamond {
enum FacetCutAction {
Add,
Replace,
Remove
}
// Add=0, Replace=1, Remove=2
struct FacetCut {
address facetAddress;
FacetCutAction action;
bytes4[] functionSelectors;
}
event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamondCut.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
import { IDiamond } from "./IDiamond.sol";
interface IDiamondCut is IDiamond {
/// @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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamondLoupe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (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.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract ABI

[{"type":"constructor","stateMutability":"payable","inputs":[{"type":"tuple[]","name":"_diamondCut","internalType":"struct IDiamond.FacetCut[]","components":[{"type":"address","name":"facetAddress","internalType":"address"},{"type":"uint8","name":"action","internalType":"enum IDiamond.FacetCutAction"},{"type":"bytes4[]","name":"functionSelectors","internalType":"bytes4[]"}]},{"type":"tuple","name":"_args","internalType":"struct PaymentDelegationArgs","components":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"init","internalType":"address"},{"type":"bytes","name":"initCalldata","internalType":"bytes"}]}]},{"type":"error","name":"CannotAddFunctionToDiamondThatAlreadyExists","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotAddSelectorsToZeroAddress","inputs":[{"type":"bytes4[]","name":"_selectors","internalType":"bytes4[]"}]},{"type":"error","name":"CannotRemoveFunctionThatDoesNotExist","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotRemoveImmutableFunction","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionThatDoesNotExists","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionsFromFacetWithZeroAddress","inputs":[{"type":"bytes4[]","name":"_selectors","internalType":"bytes4[]"}]},{"type":"error","name":"CannotReplaceImmutableFunction","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"FunctionNotFound","inputs":[{"type":"bytes4","name":"_functionSelector","internalType":"bytes4"}]},{"type":"error","name":"IncorrectFacetCutAction","inputs":[{"type":"uint8","name":"_action","internalType":"uint8"}]},{"type":"error","name":"InitializationFunctionReverted","inputs":[{"type":"address","name":"_initializationContractAddress","internalType":"address"},{"type":"bytes","name":"_calldata","internalType":"bytes"}]},{"type":"error","name":"NoBytecodeAtAddress","inputs":[{"type":"address","name":"_contractAddress","internalType":"address"},{"type":"string","name":"_message","internalType":"string"}]},{"type":"error","name":"NoSelectorsProvidedForFacetForCut","inputs":[{"type":"address","name":"_facetAddress","internalType":"address"}]},{"type":"error","name":"RemoveFacetAddressMustBeZeroAddress","inputs":[{"type":"address","name":"_facetAddress","internalType":"address"}]},{"type":"fallback","stateMutability":"nonpayable"}]
            

Contract Creation Code

Verify & Publish
0x6080604052604051620036cd380380620036cd83398181016040528101906200002991906200163e565b6200004381600001516200006b60201b620001931760201c565b6200006382826020015183604001516200014a60201b6200026a1760201c565b505062001d95565b60006200007d620003b660201b60201c565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b8351811015620003615760008482815181106200016f576200016e620016c3565b5b60200260200101516040015190506000858381518110620001955762000194620016c3565b5b60200260200101516000015190506000825103620001ec57806040517fe767f91f000000000000000000000000000000000000000000000000000000008152600401620001e3919062001703565b60405180910390fd5b6000868481518110620002045762000203620016c3565b5b60200260200101516020015190506000600281111562000229576200022862001720565b5b8160028111156200023f576200023e62001720565b5b036200025d57620002578284620003e360201b60201c565b62000348565b6001600281111562000274576200027362001720565b5b8160028111156200028a576200028962001720565b5b03620002a857620002a282846200072b60201b60201c565b62000347565b600280811115620002be57620002bd62001720565b5b816002811115620002d457620002d362001720565b5b03620002f257620002ec828462000a9560201b60201c565b62000346565b80600281111562000308576200030762001720565b5b6040517f7fe9a41e0000000000000000000000000000000000000000000000000000000081526004016200033d91906200176d565b60405180910390fd5b5b5b50505080806200035890620017c3565b9150506200014d565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051620003979392919062001ac3565b60405180910390a1620003b1828262000f4060201b60201c565b505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200045757806040517f0ae3681c0000000000000000000000000000000000000000000000000000000081526004016200044e919062001b89565b60405180910390fd5b600062000469620003b660201b60201c565b9050600081600101805490509050620004a28460405180606001604052806024815260200162003659602491396200107460201b60201c565b60005b835181101562000724576000848281518110620004c757620004c6620016c3565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620005c057816040517febbf5d07000000000000000000000000000000000000000000000000000000008152600401620005b7919062001bbe565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c02179055508380620007099062001be9565b945050505080806200071b90620017c3565b915050620004a5565b5050505050565b60006200073d620003b660201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620007b357816040517fcd98a96f000000000000000000000000000000000000000000000000000000008152600401620007aa919062001b89565b60405180910390fd5b620007de83604051806060016040528060288152602001620036a5602891396200107460201b60201c565b60005b825181101562000a8f576000838281518110620008035762000802620016c3565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620008fb57816040517f520300da000000000000000000000000000000000000000000000000000000008152600401620008f2919062001bbe565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200096e57816040517f358d9d1a00000000000000000000000000000000000000000000000000000000815260040162000965919062001bbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620009e257816040517f7479f939000000000000000000000000000000000000000000000000000000008152600401620009d9919062001bbe565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050808062000a8690620017c3565b915050620007e1565b50505050565b600062000aa7620003b660201b60201c565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161462000b2957836040517fd091bc8100000000000000000000000000000000000000000000000000000000815260040162000b20919062001703565b60405180910390fd5b60005b835181101562000f3957600084828151811062000b4e5762000b4d620016c3565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160362000ca857816040517f7a08a22d00000000000000000000000000000000000000000000000000000000815260040162000c9f919062001bbe565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160362000d1f57816040517f6fafeb0800000000000000000000000000000000000000000000000000000000815260040162000d16919062001bbe565b60405180910390fd5b838062000d2c9062001c18565b94505083816020015161ffff161462000e4857600085600101858154811062000d5a5762000d59620016c3565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff168154811062000da15762000da0620016c3565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b8460010180548062000e5f5762000e5e62001c46565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff021916905550505050808062000f3090620017c3565b91505062000b2c565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315620010705762000fa1826040518060600160405280602881526020016200367d602891396200107460201b60201c565b6000808373ffffffffffffffffffffffffffffffffffffffff168360405162000fcb919062001cb7565b600060405180830381855af49150503d806000811462001008576040519150601f19603f3d011682016040523d82523d6000602084013e6200100d565b606091505b5091509150816200106d576000815111156200102c5780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016200106492919062001cd0565b60405180910390fd5b50505b5050565b6000823b905060008103620010c45782826040517f919834b9000000000000000000000000000000000000000000000000000000008152600401620010bb92919062001d61565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200112d82620010e2565b810181811067ffffffffffffffff821117156200114f576200114e620010f3565b5b80604052505050565b600062001164620010c9565b905062001172828262001122565b919050565b600067ffffffffffffffff821115620011955762001194620010f3565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620011e282620011b5565b9050919050565b620011f481620011d5565b81146200120057600080fd5b50565b6000815190506200121481620011e9565b92915050565b600381106200122857600080fd5b50565b6000815190506200123c816200121a565b92915050565b600067ffffffffffffffff82111562001260576200125f620010f3565b5b602082029050602081019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620012a88162001271565b8114620012b457600080fd5b50565b600081519050620012c8816200129d565b92915050565b6000620012e5620012df8462001242565b62001158565b905080838252602082019050602084028301858111156200130b576200130a620011a6565b5b835b81811015620013385780620013238882620012b7565b8452602084019350506020810190506200130d565b5050509392505050565b600082601f8301126200135a5762001359620010dd565b5b81516200136c848260208601620012ce565b91505092915050565b6000606082840312156200138e576200138d620011ab565b5b6200139a606062001158565b90506000620013ac8482850162001203565b6000830152506020620013c2848285016200122b565b602083015250604082015167ffffffffffffffff811115620013e957620013e8620011b0565b5b620013f78482850162001342565b60408301525092915050565b60006200141a620014148462001177565b62001158565b9050808382526020820190506020840283018581111562001440576200143f620011a6565b5b835b818110156200148e57805167ffffffffffffffff811115620014695762001468620010dd565b5b80860162001478898262001375565b8552602085019450505060208101905062001442565b5050509392505050565b600082601f830112620014b057620014af620010dd565b5b8151620014c284826020860162001403565b91505092915050565b600080fd5b600067ffffffffffffffff821115620014ee57620014ed620010f3565b5b620014f982620010e2565b9050602081019050919050565b60005b838110156200152657808201518184015260208101905062001509565b60008484015250505050565b6000620015496200154384620014d0565b62001158565b905082815260208101848484011115620015685762001567620014cb565b5b6200157584828562001506565b509392505050565b600082601f830112620015955762001594620010dd565b5b8151620015a784826020860162001532565b91505092915050565b600060608284031215620015c957620015c8620011ab565b5b620015d5606062001158565b90506000620015e78482850162001203565b6000830152506020620015fd8482850162001203565b602083015250604082015167ffffffffffffffff811115620016245762001623620011b0565b5b62001632848285016200157d565b60408301525092915050565b60008060408385031215620016585762001657620010d3565b5b600083015167ffffffffffffffff811115620016795762001678620010d8565b5b620016878582860162001498565b925050602083015167ffffffffffffffff811115620016ab57620016aa620010d8565b5b620016b985828601620015b0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b620016fd81620011d5565b82525050565b60006020820190506200171a6000830184620016f2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060ff82169050919050565b62001767816200174f565b82525050565b60006020820190506200178460008301846200175c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620017d082620017b9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200180557620018046200178a565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6200184781620011d5565b82525050565b6003811062001861576200186062001720565b5b50565b600081905062001874826200184d565b919050565b6000620018868262001864565b9050919050565b620018988162001879565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b620018d58162001271565b82525050565b6000620018e98383620018ca565b60208301905092915050565b6000602082019050919050565b60006200190f826200189e565b6200191b8185620018a9565b93506200192883620018ba565b8060005b838110156200195f578151620019438882620018db565b97506200195083620018f5565b9250506001810190506200192c565b5085935050505092915050565b60006060830160008301516200198660008601826200183c565b5060208301516200199b60208601826200188d565b5060408301518482036040860152620019b5828262001902565b9150508091505092915050565b6000620019d083836200196c565b905092915050565b6000602082019050919050565b6000620019f28262001810565b620019fe81856200181b565b93508360208202850162001a12856200182c565b8060005b8581101562001a54578484038952815162001a328582620019c2565b945062001a3f83620019d8565b925060208a0199505060018101905062001a16565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600062001a8f8262001a66565b62001a9b818562001a71565b935062001aad81856020860162001506565b62001ab881620010e2565b840191505092915050565b6000606082019050818103600083015262001adf8186620019e5565b905062001af06020830185620016f2565b818103604083015262001b04818462001a82565b9050949350505050565b600082825260208201905092915050565b600062001b2c826200189e565b62001b38818562001b0e565b935062001b4583620018ba565b8060005b8381101562001b7c57815162001b608882620018db565b975062001b6d83620018f5565b92505060018101905062001b49565b5085935050505092915050565b6000602082019050818103600083015262001ba5818462001b1f565b905092915050565b62001bb88162001271565b82525050565b600060208201905062001bd5600083018462001bad565b92915050565b600061ffff82169050919050565b600062001bf68262001bdb565b915061ffff820362001c0d5762001c0c6200178a565b5b600182019050919050565b600062001c2582620017b9565b91506000820362001c3b5762001c3a6200178a565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b600062001c8d8262001a66565b62001c99818562001c75565b935062001cab81856020860162001506565b80840191505092915050565b600062001cc5828462001c80565b915081905092915050565b600060408201905062001ce76000830185620016f2565b818103602083015262001cfb818462001a82565b90509392505050565b600081519050919050565b600082825260208201905092915050565b600062001d2d8262001d04565b62001d39818562001d0f565b935062001d4b81856020860162001506565b62001d5681620010e2565b840191505092915050565b600060408201905062001d786000830185620016f2565b818103602083015262001d8c818462001d20565b90509392505050565b6118b48062001da56000396000f3fe608060405234801561001057600080fd5b506000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361016d576000357fffffffff00000000000000000000000000000000000000000000000000000000166040517f5416eb980000000000000000000000000000000000000000000000000000000081526004016101649190611158565b60405180910390fd5b3660008037600080366000845af43d6000803e806000811461018e573d6000f35b3d6000fd5b600061019d610487565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101561043c57600084828151811061028b5761028a611173565b5b602002602001015160400151905060008583815181106102ae576102ad611173565b5b6020026020010151600001519050600082510361030257806040517fe767f91f0000000000000000000000000000000000000000000000000000000081526004016102f991906111e3565b60405180910390fd5b600086848151811061031757610316611173565b5b602002602001015160200151905060006002811115610339576103386111fe565b5b81600281111561034c5761034b6111fe565b5b036103605761035b82846104b4565b610426565b60016002811115610374576103736111fe565b5b816002811115610387576103866111fe565b5b0361039b5761039682846107dc565b610425565b6002808111156103ae576103ad6111fe565b5b8160028111156103c1576103c06111fe565b5b036103d5576103d08284610b22565b610424565b8060028111156103e8576103e76111fe565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040161041b9190611249565b60405180910390fd5b5b5b50505080806104349061129d565b91505061026d565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516104709392919061159c565b60405180910390a16104828282610fa9565b505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361052557806040517f0ae3681c00000000000000000000000000000000000000000000000000000000815260040161051c9190611650565b60405180910390fd5b600061052f610487565b905060008160010180549050905061055f8460405180606001604052806024815260200161180b602491396110cb565b60005b83518110156107d55760008482815181106105805761057f611173565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461067657816040517febbf5d0700000000000000000000000000000000000000000000000000000000815260040161066d9190611158565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555083806107bd90611680565b945050505080806107cd9061129d565b915050610562565b5050505050565b60006107e6610487565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361085957816040517fcd98a96f0000000000000000000000000000000000000000000000000000000081526004016108509190611650565b60405180910390fd5b61087b83604051806060016040528060288152602001611857602891396110cb565b60005b8251811015610b1c57600083828151811061089c5761089b611173565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361099157816040517f520300da0000000000000000000000000000000000000000000000000000000081526004016109889190611158565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a0157816040517f358d9d1a0000000000000000000000000000000000000000000000000000000081526004016109f89190611158565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a7257816040517f7479f939000000000000000000000000000000000000000000000000000000008152600401610a699190611158565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508080610b149061129d565b91505061087e565b50505050565b6000610b2c610487565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610bab57836040517fd091bc81000000000000000000000000000000000000000000000000000000008152600401610ba291906111e3565b60405180910390fd5b60005b8351811015610fa2576000848281518110610bcc57610bcb611173565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d2357816040517f7a08a22d000000000000000000000000000000000000000000000000000000008152600401610d1a9190611158565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d9757816040517f6fafeb08000000000000000000000000000000000000000000000000000000008152600401610d8e9190611158565b60405180910390fd5b8380610da2906116aa565b94505083816020015161ffff1614610eb7576000856001018581548110610dcc57610dcb611173565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110610e1057610e0f611173565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480610ecb57610eca6116d3565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080610f9a9061129d565b915050610bae565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156110c7576110008260405180606001604052806028815260200161182f602891396110cb565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611028919061173e565b600060405180830381855af49150503d8060008114611063576040519150601f19603f3d011682016040523d82523d6000602084013e611068565b606091505b5091509150816110c4576000815111156110855780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016110bb929190611755565b60405180910390fd5b50505b5050565b6000823b9050600081036111185782826040517f919834b900000000000000000000000000000000000000000000000000000000815260040161110f9291906117da565b60405180910390fd5b505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6111528161111d565b82525050565b600060208201905061116d6000830184611149565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111cd826111a2565b9050919050565b6111dd816111c2565b82525050565b60006020820190506111f860008301846111d4565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060ff82169050919050565b6112438161122d565b82525050565b600060208201905061125e600083018461123a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006112a882611293565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112da576112d9611264565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131a816111c2565b82525050565b60038110611331576113306111fe565b5b50565b600081905061134282611320565b919050565b600061135282611334565b9050919050565b61136281611347565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61139d8161111d565b82525050565b60006113af8383611394565b60208301905092915050565b6000602082019050919050565b60006113d382611368565b6113dd8185611373565b93506113e883611384565b8060005b8381101561141957815161140088826113a3565b975061140b836113bb565b9250506001810190506113ec565b5085935050505092915050565b600060608301600083015161143e6000860182611311565b5060208301516114516020860182611359565b506040830151848203604086015261146982826113c8565b9150508091505092915050565b60006114828383611426565b905092915050565b6000602082019050919050565b60006114a2826112e5565b6114ac81856112f0565b9350836020820285016114be85611301565b8060005b858110156114fa57848403895281516114db8582611476565b94506114e68361148a565b925060208a019950506001810190506114c2565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561154657808201518184015260208101905061152b565b60008484015250505050565b6000601f19601f8301169050919050565b600061156e8261150c565b6115788185611517565b9350611588818560208601611528565b61159181611552565b840191505092915050565b600060608201905081810360008301526115b68186611497565b90506115c560208301856111d4565b81810360408301526115d78184611563565b9050949350505050565b600082825260208201905092915050565b60006115fd82611368565b61160781856115e1565b935061161283611384565b8060005b8381101561164357815161162a88826113a3565b9750611635836113bb565b925050600181019050611616565b5085935050505092915050565b6000602082019050818103600083015261166a81846115f2565b905092915050565b600061ffff82169050919050565b600061168b82611672565b915061ffff820361169f5761169e611264565b5b600182019050919050565b60006116b582611293565b9150600082036116c8576116c7611264565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b60006117188261150c565b6117228185611702565b9350611732818560208601611528565b80840191505092915050565b600061174a828461170d565b915081905092915050565b600060408201905061176a60008301856111d4565b818103602083015261177c8184611563565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006117ac82611785565b6117b68185611790565b93506117c6818560208601611528565b6117cf81611552565b840191505092915050565b60006040820190506117ef60008301856111d4565b818103602083015261180181846117a1565b9050939250505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a264697066735822122051cefdbc23d689f44cc4548df012a95d208c8a6cb3e488dcc70d4840bd135eda64736f6c634300081100334c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000076802f5dc20282e9f0cdd5a5dd21a13aa36529050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c000000000000000000000000000000000000000000000000000000000000000000000000000000004241faa72021f465da09b47ec3da715254447c9a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed6270000000000000000000000000000000000000000000000000000000000000000000000000000000039a843354b6fafee77ceb5b9f10437bc2fab3fc90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000028da5cb5b00000000000000000000000000000000000000000000000000000000f2fde38b0000000000000000000000000000000000000000000000000000000000000000000000000000000006b25fe2fdbb2b72c1529b90c9d9b30d30b1ac67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000009e377e8250000000000000000000000000000000000000000000000000000000009aff19d000000000000000000000000000000000000000000000000000000007c35b9820000000000000000000000000000000000000000000000000000000050e3cfa3000000000000000000000000000000000000000000000000000000004a57a6b200000000000000000000000000000000000000000000000000000000602b386e000000000000000000000000000000000000000000000000000000006ceb53de0000000000000000000000000000000000000000000000000000000078f8a06c00000000000000000000000000000000000000000000000000000000a98538e200000000000000000000000000000000000000000000000000000000000000000000000000000000046bf7bb88e0e0941358ce3f5a765c9acdda7b9c0000000000000000000000006fe08ef4d8aa1dff3d8d776b78ea05abe01dd8d800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004e1c7392a00000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x608060405234801561001057600080fd5b506000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361016d576000357fffffffff00000000000000000000000000000000000000000000000000000000166040517f5416eb980000000000000000000000000000000000000000000000000000000081526004016101649190611158565b60405180910390fd5b3660008037600080366000845af43d6000803e806000811461018e573d6000f35b3d6000fd5b600061019d610487565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101561043c57600084828151811061028b5761028a611173565b5b602002602001015160400151905060008583815181106102ae576102ad611173565b5b6020026020010151600001519050600082510361030257806040517fe767f91f0000000000000000000000000000000000000000000000000000000081526004016102f991906111e3565b60405180910390fd5b600086848151811061031757610316611173565b5b602002602001015160200151905060006002811115610339576103386111fe565b5b81600281111561034c5761034b6111fe565b5b036103605761035b82846104b4565b610426565b60016002811115610374576103736111fe565b5b816002811115610387576103866111fe565b5b0361039b5761039682846107dc565b610425565b6002808111156103ae576103ad6111fe565b5b8160028111156103c1576103c06111fe565b5b036103d5576103d08284610b22565b610424565b8060028111156103e8576103e76111fe565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040161041b9190611249565b60405180910390fd5b5b5b50505080806104349061129d565b91505061026d565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516104709392919061159c565b60405180910390a16104828282610fa9565b505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361052557806040517f0ae3681c00000000000000000000000000000000000000000000000000000000815260040161051c9190611650565b60405180910390fd5b600061052f610487565b905060008160010180549050905061055f8460405180606001604052806024815260200161180b602491396110cb565b60005b83518110156107d55760008482815181106105805761057f611173565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461067657816040517febbf5d0700000000000000000000000000000000000000000000000000000000815260040161066d9190611158565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555083806107bd90611680565b945050505080806107cd9061129d565b915050610562565b5050505050565b60006107e6610487565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361085957816040517fcd98a96f0000000000000000000000000000000000000000000000000000000081526004016108509190611650565b60405180910390fd5b61087b83604051806060016040528060288152602001611857602891396110cb565b60005b8251811015610b1c57600083828151811061089c5761089b611173565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361099157816040517f520300da0000000000000000000000000000000000000000000000000000000081526004016109889190611158565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a0157816040517f358d9d1a0000000000000000000000000000000000000000000000000000000081526004016109f89190611158565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a7257816040517f7479f939000000000000000000000000000000000000000000000000000000008152600401610a699190611158565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508080610b149061129d565b91505061087e565b50505050565b6000610b2c610487565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610bab57836040517fd091bc81000000000000000000000000000000000000000000000000000000008152600401610ba291906111e3565b60405180910390fd5b60005b8351811015610fa2576000848281518110610bcc57610bcb611173565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d2357816040517f7a08a22d000000000000000000000000000000000000000000000000000000008152600401610d1a9190611158565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d9757816040517f6fafeb08000000000000000000000000000000000000000000000000000000008152600401610d8e9190611158565b60405180910390fd5b8380610da2906116aa565b94505083816020015161ffff1614610eb7576000856001018581548110610dcc57610dcb611173565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110610e1057610e0f611173565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480610ecb57610eca6116d3565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080610f9a9061129d565b915050610bae565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156110c7576110008260405180606001604052806028815260200161182f602891396110cb565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611028919061173e565b600060405180830381855af49150503d8060008114611063576040519150601f19603f3d011682016040523d82523d6000602084013e611068565b606091505b5091509150816110c4576000815111156110855780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016110bb929190611755565b60405180910390fd5b50505b5050565b6000823b9050600081036111185782826040517f919834b900000000000000000000000000000000000000000000000000000000815260040161110f9291906117da565b60405180910390fd5b505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6111528161111d565b82525050565b600060208201905061116d6000830184611149565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111cd826111a2565b9050919050565b6111dd816111c2565b82525050565b60006020820190506111f860008301846111d4565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060ff82169050919050565b6112438161122d565b82525050565b600060208201905061125e600083018461123a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006112a882611293565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112da576112d9611264565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131a816111c2565b82525050565b60038110611331576113306111fe565b5b50565b600081905061134282611320565b919050565b600061135282611334565b9050919050565b61136281611347565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61139d8161111d565b82525050565b60006113af8383611394565b60208301905092915050565b6000602082019050919050565b60006113d382611368565b6113dd8185611373565b93506113e883611384565b8060005b8381101561141957815161140088826113a3565b975061140b836113bb565b9250506001810190506113ec565b5085935050505092915050565b600060608301600083015161143e6000860182611311565b5060208301516114516020860182611359565b506040830151848203604086015261146982826113c8565b9150508091505092915050565b60006114828383611426565b905092915050565b6000602082019050919050565b60006114a2826112e5565b6114ac81856112f0565b9350836020820285016114be85611301565b8060005b858110156114fa57848403895281516114db8582611476565b94506114e68361148a565b925060208a019950506001810190506114c2565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561154657808201518184015260208101905061152b565b60008484015250505050565b6000601f19601f8301169050919050565b600061156e8261150c565b6115788185611517565b9350611588818560208601611528565b61159181611552565b840191505092915050565b600060608201905081810360008301526115b68186611497565b90506115c560208301856111d4565b81810360408301526115d78184611563565b9050949350505050565b600082825260208201905092915050565b60006115fd82611368565b61160781856115e1565b935061161283611384565b8060005b8381101561164357815161162a88826113a3565b9750611635836113bb565b925050600181019050611616565b5085935050505092915050565b6000602082019050818103600083015261166a81846115f2565b905092915050565b600061ffff82169050919050565b600061168b82611672565b915061ffff820361169f5761169e611264565b5b600182019050919050565b60006116b582611293565b9150600082036116c8576116c7611264565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b60006117188261150c565b6117228185611702565b9350611732818560208601611528565b80840191505092915050565b600061174a828461170d565b915081905092915050565b600060408201905061176a60008301856111d4565b818103602083015261177c8184611563565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006117ac82611785565b6117b68185611790565b93506117c6818560208601611528565b6117cf81611552565b840191505092915050565b60006040820190506117ef60008301856111d4565b818103602083015261180181846117a1565b9050939250505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a264697066735822122051cefdbc23d689f44cc4548df012a95d208c8a6cb3e488dcc70d4840bd135eda64736f6c63430008110033