{
  "address": "0x6d2eecf5a50fB741D39244E9B485bA3e4e676AE8",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_paymentManager",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_certificateVerifier",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "CerificateOwnerMismatch",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "DomainNameAlreadyRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyCountryCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyDomainName",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyOperator",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyPartyId",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "InvalidCertificate",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "NoRolesProvided",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "PartyAlreadyRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "PartyNotRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        },
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "ProviderNotFound",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "SignerMismatch",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "name": "OperatorUpdate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldAdmin",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "indexed": false,
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnCvManager.CvStatus",
          "name": "cvStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "name": "PartyDelete",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "indexed": false,
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnCvManager.CvStatus",
          "name": "cvStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        }
      ],
      "name": "PartyUpdate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "adminDeleteOperator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        }
      ],
      "name": "adminDeleteParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "certificateVerifier",
      "outputs": [
        {
          "internalType": "contract ICertificateVerifier",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deleteNode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "deleteNodeRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deleteParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "deletePartyRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "getNode",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNodeOperators",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        }
      ],
      "name": "getOperatorByAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        }
      ],
      "name": "getOperatorByOcpi",
      "outputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getParties",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "getPartiesByOperator",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        }
      ],
      "name": "getPartiesByRole",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPartiesCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_partyAddress",
          "type": "address"
        }
      ],
      "name": "getPartyDetailsByAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "_countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "_partyId",
          "type": "bytes3"
        }
      ],
      "name": "getPartyDetailsByOcpi",
      "outputs": [
        {
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "stakingBlock",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "isAllowedVerifier",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paymentManager",
      "outputs": [
        {
          "internalType": "contract IOcnPaymentManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "removeVerifier",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "name": "setNode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setNodeRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "certificateData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            },
            {
              "internalType": "enum OcnRegistry.Role",
              "name": "role",
              "type": "uint8"
            }
          ],
          "internalType": "struct OcnRegistry.RoleDetails[]",
          "name": "roles",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        }
      ],
      "name": "setParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "certificateData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            },
            {
              "internalType": "enum OcnRegistry.Role",
              "name": "role",
              "type": "uint8"
            }
          ],
          "internalType": "struct OcnRegistry.RoleDetails[]",
          "name": "roles",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setPartyRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "oracleAddress",
          "type": "address"
        }
      ],
      "name": "setProviderOracle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "setVerifier",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0xbdd8acb76c90cd69d586416ec8b5d42ebdbbd669bae523944a16acb736ba5513",
  "receipt": {
    "to": null,
    "from": "0xdD3D370a673cfdCfB0c4cA2a3fE313e1559d1fdc",
    "contractAddress": "0x6d2eecf5a50fB741D39244E9B485bA3e4e676AE8",
    "transactionIndex": 0,
    "gasUsed": "4119766",
    "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000800000000000020100000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000001000000000200000000000000000000000000000000000000000000000000100000000000020000000000000000000000000000000000000200000000000000000000000000000",
    "blockHash": "0xf519931c193edd8d590b9d59c913a0c9311d26837e0b5552983346f53060f0be",
    "transactionHash": "0xbdd8acb76c90cd69d586416ec8b5d42ebdbbd669bae523944a16acb736ba5513",
    "logs": [
      {
        "transactionIndex": 0,
        "blockNumber": 15,
        "transactionHash": "0xbdd8acb76c90cd69d586416ec8b5d42ebdbbd669bae523944a16acb736ba5513",
        "address": "0x6d2eecf5a50fB741D39244E9B485bA3e4e676AE8",
        "topics": [
          "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x000000000000000000000000dd3d370a673cfdcfb0c4ca2a3fe313e1559d1fdc",
          "0x000000000000000000000000dd3d370a673cfdcfb0c4ca2a3fe313e1559d1fdc"
        ],
        "data": "0x",
        "logIndex": 0,
        "blockHash": "0xf519931c193edd8d590b9d59c913a0c9311d26837e0b5552983346f53060f0be"
      }
    ],
    "blockNumber": 15,
    "cumulativeGasUsed": "4119766",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xd26131272867B163d7037A26cd7AB5B1c12f2659",
    "0x789Ee7dA07388810a4B32Ec53ede3Bb6204f76F4"
  ],
  "numDeployments": 1,
  "solcInputHash": "0b28dc26d11a838b4fba099a76699c3c",
  "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_certificateVerifier\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"CerificateOwnerMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"DomainNameAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyCountryCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyDomainName\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyPartyId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"InvalidCertificate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"NoRolesProvided\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"PartyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"PartyNotRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"ProviderNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"SignerMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"OperatorUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"indexed\":false,\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum IOcnCvManager.CvStatus\",\"name\":\"cvStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"name\":\"PartyDelete\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"indexed\":false,\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum IOcnCvManager.CvStatus\",\"name\":\"cvStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"PartyUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"adminDeleteOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"}],\"name\":\"adminDeleteParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"certificateVerifier\",\"outputs\":[{\"internalType\":\"contract ICertificateVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deleteNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"deleteNodeRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deleteParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"deletePartyRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeOperators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"}],\"name\":\"getOperatorByAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"}],\"name\":\"getOperatorByOcpi\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParties\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getPartiesByOperator\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"getPartiesByRole\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPartiesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_partyAddress\",\"type\":\"address\"}],\"name\":\"getPartyDetailsByAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"_countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"_partyId\",\"type\":\"bytes3\"}],\"name\":\"getPartyDetailsByOcpi\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"stakingBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"isAllowedVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paymentManager\",\"outputs\":[{\"internalType\":\"contract IOcnPaymentManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"removeVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"setNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setNodeRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"certificateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"struct OcnRegistry.RoleDetails[]\",\"name\":\"roles\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"setParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"certificateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"struct OcnRegistry.RoleDetails[]\",\"name\":\"roles\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setPartyRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"oracleAddress\",\"type\":\"address\"}],\"name\":\"setProviderOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"setVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"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.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"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`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/OcnRegistry.sol\":\"OcnRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IAccessControl} from \\\"./IAccessControl.sol\\\";\\nimport {Context} from \\\"../utils/Context.sol\\\";\\nimport {ERC165} from \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n *     require(hasRole(MY_ROLE, msg.sender));\\n *     ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n    struct RoleData {\\n        mapping(address account => bool) hasRole;\\n        bytes32 adminRole;\\n    }\\n\\n    mapping(bytes32 role => RoleData) private _roles;\\n\\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n    /**\\n     * @dev Modifier that checks that an account has a specific role. Reverts\\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\\n     */\\n    modifier onlyRole(bytes32 role) {\\n        _checkRole(role);\\n        _;\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\\n        return _roles[role].hasRole[account];\\n    }\\n\\n    /**\\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\\n     */\\n    function _checkRole(bytes32 role) internal view virtual {\\n        _checkRole(role, _msgSender());\\n    }\\n\\n    /**\\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\\n     * is missing `role`.\\n     */\\n    function _checkRole(bytes32 role, address account) internal view virtual {\\n        if (!hasRole(role, account)) {\\n            revert AccessControlUnauthorizedAccount(account, role);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\\n        return _roles[role].adminRole;\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n        _grantRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `callerConfirmation`.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\\n        if (callerConfirmation != _msgSender()) {\\n            revert AccessControlBadConfirmation();\\n        }\\n\\n        _revokeRole(role, callerConfirmation);\\n    }\\n\\n    /**\\n     * @dev Sets `adminRole` as ``role``'s admin role.\\n     *\\n     * Emits a {RoleAdminChanged} event.\\n     */\\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n        bytes32 previousAdminRole = getRoleAdmin(role);\\n        _roles[role].adminRole = adminRole;\\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n    }\\n\\n    /**\\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\\n        if (!hasRole(role, account)) {\\n            _roles[role].hasRole[account] = true;\\n            emit RoleGranted(role, account, _msgSender());\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\\n        if (hasRole(role, account)) {\\n            _roles[role].hasRole[account] = false;\\n            emit RoleRevoked(role, account, _msgSender());\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n    /**\\n     * @dev The `account` is missing a role.\\n     */\\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\\n\\n    /**\\n     * @dev The caller of a function is not the expected one.\\n     *\\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\\n     */\\n    error AccessControlBadConfirmation();\\n\\n    /**\\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n     *\\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n     * {RoleAdminChanged} not being emitted signaling this.\\n     */\\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n    /**\\n     * @dev Emitted when `account` is granted `role`.\\n     *\\n     * `sender` is the account that originated the contract call, an admin role\\n     * bearer except when using {AccessControl-_setupRole}.\\n     */\\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Emitted when `account` is revoked `role`.\\n     *\\n     * `sender` is the account that originated the contract call:\\n     *   - if using `revokeRole`, it is the admin role bearer\\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n     */\\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `callerConfirmation`.\\n     */\\n    function renounceRole(bytes32 role, address callerConfirmation) external;\\n}\\n\",\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n        return interfaceId == type(IERC165).interfaceId;\\n    }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/IOcnCvManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\ninterface IOcnCvManager {\\n    /* ********************************** */\\n    /*               ENUMS                */\\n    /* ********************************** */\\n\\n    enum CvStatus { NOT_VERIFIED, APPROVED, FAILED }\\n\\n}\\n\",\"keccak256\":\"0x8b6cd5f155c9df3ad3f60f6d6c7ee3ea1a9f4cf4260bd4b534546fcae5fff71d\",\"license\":\"GPL-3.0\"},\"contracts/IOcnPaymentManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ninterface IOcnPaymentManager {\\n    /* ********************************** */\\n    /*               ENUMS                */\\n    /* ********************************** */\\n\\n    enum PaymentStatus { PENDING, PAYMENT_UP_TO_DATE, INSUFFICIENT_FUNDS, INACTIVE }\\n\\n    /* ********************************** */\\n    /*               EVENTS               */\\n    /* ********************************** */\\n\\n    event OwnershipTransferred(address indexed oldAdmin, address indexed  newAdmin);\\n    event PartyStaked(address stakedBy, address party, uint256 amount);\\n    event StakeWithdrawn(address indexed party, uint256 amount);\\n\\n    /* ********************************** */\\n    /*            FUNCTIONS               */\\n    /* ********************************** */\\n\\n    function initialize(address _euroStablecoin, uint256 _fundingYearlyAmount, address _operator) external;\\n    function pay(address party) external;\\n    function withdrawToRegistryOperator(address party) external;\\n    function getPaymentStatus(address party) external view returns (PaymentStatus);\\n    function getPaymentBlock(address party) external view returns (uint256, uint256);\\n\\n    /* ********************************** */\\n    /*       STORAGE VARIABLES            */\\n    /* ********************************** */\\n\\n    function euroStablecoin() external view returns (IERC20);\\n    function stakedFunds(address party) external view returns (uint256);\\n    function stakingBlock(address party) external view returns (uint256);\\n\\n    /* ********************************** */\\n    /*  ERRORS                            */\\n    /* ********************************** */\\n\\n    error StakeAlreadyDeposited();\\n    error InsufficientAllowance();\\n    error TransferFailed();\\n    error NoFundsStaked();\\n    error WithdrawalNotAllowed();\\n}\\n\",\"keccak256\":\"0xc6c8145e1680d8bd7a1a9ea3b9531f3b5bd5a873bda2f2f73d4f77b44abbe686\",\"license\":\"GPL-3.0\"},\"contracts/OcnRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\nimport {IOcnPaymentManager} from \\\"./IOcnPaymentManager.sol\\\";\\nimport {IOcnCvManager} from \\\"./IOcnCvManager.sol\\\";\\nimport \\\"./interfaces/ICertificateVerifier.sol\\\";\\nimport \\\"./interfaces/IProviderOracle.sol\\\";\\n\\nimport {AccessControl} from \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\ncontract OcnRegistry is AccessControl {\\n    /* ********************************** */\\n    /*       STORAGE VARIABLES            */\\n    /* ********************************** */\\n\\n    string private prefix;\\n\\n    // OCN Node Operator Listings\\n    mapping(address => string) private nodeOf;\\n    mapping(string => bool) private uniqueDomains;\\n    mapping(address => bool) private uniqueOperators;\\n    address[] private operators;\\n\\n    // OCPI Party Listings\\n    enum Role {\\n        CPO,\\n        EMSP,\\n        NAP,\\n        NSP,\\n        OTHER,\\n        SCSP\\n    }\\n\\n    struct RoleDetails {\\n        bytes certificateData;\\n        bytes signature;\\n        Role role;\\n    }\\n\\n    struct PartyDetails {\\n        bytes2 countryCode;\\n        bytes3 partyId;\\n        Role[] roles;\\n        string name;\\n        string url;\\n        IOcnPaymentManager.PaymentStatus paymentStatus;\\n        IOcnCvManager.CvStatus cvStatus;\\n        bool active;\\n        uint256 partyIndex;\\n    }\\n\\n    mapping(bytes2 => mapping(bytes3 => address)) private uniqueParties;\\n    mapping(address => bool) private uniquePartyAddresses;\\n    mapping(address => PartyDetails) private partyOf;\\n    mapping(address => address) private operatorOf;\\n    mapping(address => bool) private allowedCertificateVerifiers;\\n    address[] private parties;\\n\\n    IOcnPaymentManager public paymentManager;\\n    ICertificateVerifier public certificateVerifier;\\n\\n    // Providers Oracle\\n    mapping(Role => IProviderOracle) private roleOracle;\\n\\n    /* ********************************** */\\n    /*          CUSTOM ERRORS             */\\n    /* ********************************** */\\n    error EmptyDomainName(string reason);\\n    error DomainNameAlreadyRegistered(string reason);\\n    error EmptyCountryCode(string reason);\\n    error EmptyPartyId(string reason);\\n    error NoRolesProvided(string reason);\\n    error EmptyOperator(string reason);\\n    error PartyAlreadyRegistered(string reason);\\n    error PartyNotRegistered(string reason);\\n    error SignerMismatch(string reason);\\n    error InvalidCertificate(address verifier, string reason);\\n    error ProviderNotFound(Role role, string reason);\\n    error CerificateOwnerMismatch(string reason);\\n\\n    /* ********************************** */\\n    /*               EVENTS               */\\n    /* ********************************** */\\n\\n    event OwnershipTransferred(address indexed oldAdmin, address indexed newAdmin);\\n    event OperatorUpdate(address indexed operator, string domain);\\n    event PartyUpdate(bytes2 countryCode, bytes3 partyId, address indexed partyAddress, Role[] roles, string name, string url, IOcnPaymentManager.PaymentStatus paymentStatus, IOcnCvManager.CvStatus cvStatus, bool active, address indexed operatorAddress);\\n\\n    event PartyDelete(bytes2 countryCode, bytes3 partyId, address indexed partyAddress, Role[] roles, string name, string url, IOcnPaymentManager.PaymentStatus paymentStatus, IOcnCvManager.CvStatus cvStatus, bool active);\\n\\n    /* ********************************** */\\n    /*          INITIALIZER               */\\n    /* ********************************** */\\n\\n    constructor(address _paymentManager, address _certificateVerifier) {\\n        prefix = \\\"\\\\u0019Ethereum Signed Message:\\\\n32\\\";\\n        paymentManager = IOcnPaymentManager(_paymentManager);\\n        certificateVerifier = ICertificateVerifier(_certificateVerifier);\\n        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n    }\\n\\n    function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n        revokeRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n\\n        emit OwnershipTransferred(msg.sender, newOwner);\\n    }\\n\\n    function adminDeleteOperator(address operator) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        deleteNode(operator);\\n    }\\n\\n    function adminDeleteParty(bytes2 countryCode, bytes3 partyId) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        address party = uniqueParties[countryCode][partyId];\\n        deleteParty(party);\\n    }\\n\\n    function setNode(address operator, string memory domain) private {\\n        if (bytes(domain).length == 0) {\\n            revert EmptyDomainName(\\\"Cannot set empty domain name. Use deleteNode method instead.\\\");\\n        }\\n        if (uniqueDomains[domain]) {\\n            revert DomainNameAlreadyRegistered(\\\"Domain name already registered.\\\");\\n        }\\n        uniqueDomains[domain] = true;\\n\\n        if (!uniqueOperators[operator]) {\\n            operators.push(operator);\\n        }\\n\\n        uniqueOperators[operator] = true;\\n        nodeOf[operator] = domain;\\n        emit OperatorUpdate(operator, domain);\\n    }\\n\\n    function setNode(string memory domain) public {\\n        setNode(msg.sender, domain);\\n    }\\n\\n    function setNodeRaw(address operator, string memory domain, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(operator, domain));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        setNode(signer, domain);\\n    }\\n\\n    function deleteNode(address operator) private {\\n        string memory domain = nodeOf[operator];\\n        if (bytes(domain).length == 0) {\\n            revert EmptyDomainName(\\\"Cannot delete node that does not exist.\\\");\\n        }\\n        uniqueDomains[domain] = false;\\n        delete nodeOf[operator];\\n        emit OperatorUpdate(operator, \\\"\\\");\\n    }\\n\\n    function deleteNode() public {\\n        deleteNode(msg.sender);\\n    }\\n\\n    function deleteNodeRaw(address operator, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(operator));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        deleteNode(signer);\\n    }\\n\\n    function getNode(address operator) public view returns (string memory) {\\n        return nodeOf[operator];\\n    }\\n\\n    function getNodeOperators() public view returns (address[] memory) {\\n        return operators;\\n    }\\n\\n    function setParty(bytes2 countryCode, bytes3 partyId, RoleDetails[] memory roles, address operator, string memory name, string memory url) public {\\n        if (countryCode == bytes2(0)) {\\n            revert EmptyCountryCode(\\\"Cannot set empty country_code. Use deleteParty method instead.\\\");\\n        }\\n        if (partyId == bytes3(0)) {\\n            revert EmptyPartyId(\\\"Cannot set empty party_id. Use deleteParty method instead.\\\");\\n        }\\n        if (roles.length == 0) {\\n            revert NoRolesProvided(\\\"No roles provided.\\\");\\n        }\\n        if (operator == address(0)) {\\n            revert EmptyOperator(\\\"Cannot set empty operator. Use deleteParty method instead.\\\");\\n        }\\n\\n        Role[] memory verifiedRoles = new Role[](roles.length);\\n        address credentialOwner = address(0);\\n\\n        // VC verification (All roles must be verified)\\n        for (uint8 i = 0; i < roles.length; i++) {\\n            RoleDetails memory roleDetails = roles[i];\\n            (string memory certificateIdentifier, address owner) = verifyCertificate(roleDetails);\\n\\n            if (credentialOwner == address(0)) {\\n                credentialOwner = owner;\\n            }\\n\\n            if (credentialOwner != owner) {\\n                revert CerificateOwnerMismatch(\\\"Certificates have different owners\\\");\\n            }\\n\\n            IProviderOracle oracle = roleOracle[roleDetails.role];\\n            if (address(oracle) != address(0)) {\\n                IProviderOracle.Provider memory provider = oracle.getProvider(certificateIdentifier);\\n                if (!compareIdentifiers(certificateIdentifier, provider.identifier)) {\\n                    revert ProviderNotFound(roleDetails.role, \\\"Not active in oracle\\\");\\n                }\\n            }\\n\\n            verifiedRoles[i] = roleDetails.role;\\n        }\\n\\n        address registeredParty = uniqueParties[countryCode][partyId];\\n        if (registeredParty != address(0) && registeredParty != credentialOwner) {\\n            revert PartyAlreadyRegistered(\\\"Party with country_code/party_id already registered under different address.\\\");\\n        }\\n        uniqueParties[countryCode][partyId] = credentialOwner;\\n        if (bytes(nodeOf[operator]).length == 0) {\\n            revert PartyNotRegistered(\\\"Provided operator not registered.\\\");\\n        }\\n\\n        uint256 partyIndex = partyOf[credentialOwner].partyIndex;\\n        if (!uniquePartyAddresses[credentialOwner]) {\\n            parties.push(credentialOwner);\\n            // get last index of the array\\n            partyIndex = parties.length - 1;\\n        }\\n\\n        uniquePartyAddresses[credentialOwner] = true;\\n\\n        IOcnPaymentManager.PaymentStatus paymentStatus = paymentManager.getPaymentStatus(credentialOwner);\\n        partyOf[credentialOwner] = PartyDetails(countryCode, partyId, verifiedRoles, name, url, paymentStatus, IOcnCvManager.CvStatus.NOT_VERIFIED, true, partyIndex);\\n        operatorOf[credentialOwner] = operator;\\n\\n        PartyDetails memory details = partyOf[credentialOwner];\\n        emit PartyUpdate(details.countryCode, details.partyId, credentialOwner, details.roles, details.name, details.url, details.paymentStatus, details.cvStatus, details.active, operator);\\n    }\\n\\n    function setPartyRaw(address party, bytes2 countryCode, bytes3 partyId, RoleDetails[] memory roles, address operator, string memory name, string memory url, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes memory rolesBytes = \\\"\\\";\\n        for (uint8 i = 0; i < roles.length; i++) {\\n            RoleDetails memory roleDetails = roles[i];\\n            rolesBytes = abi.encodePacked(rolesBytes, roleDetails.certificateData, roleDetails.signature, roleDetails.role);\\n        }\\n        bytes32 rolesHash = keccak256(rolesBytes);\\n        bytes32 paramHash = keccak256(abi.encodePacked(party, countryCode, partyId, rolesHash, operator, name, url));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        if (signer != party) {\\n            revert SignerMismatch(\\\"Signer and provided party address different.\\\");\\n        }\\n        setParty(countryCode, partyId, roles, operator, name, url);\\n    }\\n\\n    function deleteParty(address party) private {\\n        if (operatorOf[party] == address(0)) {\\n            revert PartyNotRegistered(\\\"Cannot delete party that does not exist. No operator found for given party.\\\");\\n        }\\n        delete operatorOf[party];\\n        PartyDetails memory details = partyOf[party];\\n        delete uniqueParties[details.countryCode][details.partyId];\\n        delete partyOf[party];\\n        delete parties[details.partyIndex];\\n        uniquePartyAddresses[party] = false;\\n\\n        emit PartyDelete(details.countryCode, details.partyId, party, details.roles, details.name, details.url, details.paymentStatus, details.cvStatus, details.active);\\n    }\\n\\n    function deleteParty() public {\\n        deleteParty(msg.sender);\\n    }\\n\\n    function deletePartyRaw(address party, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(party));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        if (signer != party) {\\n            revert SignerMismatch(\\\"Signer and provided party address different.\\\");\\n        }\\n        deleteParty(signer);\\n    }\\n\\n    function getOperatorByAddress(address party) public view returns (address operator, string memory domain) {\\n        operator = operatorOf[party];\\n        domain = nodeOf[operator];\\n    }\\n\\n    function getOperatorByOcpi(bytes2 countryCode, bytes3 partyId) public view returns (address operator, string memory domain) {\\n        address party = uniqueParties[countryCode][partyId];\\n        operator = operatorOf[party];\\n        domain = nodeOf[operator];\\n    }\\n\\n    function getPartyDetailsByAddress(address _partyAddress) public view returns (address partyAddress, bytes2 countryCode, bytes3 partyId, Role[] memory roles, IOcnPaymentManager.PaymentStatus paymentStatus, address operatorAddress, string memory name, string memory url, bool active) {\\n        PartyDetails storage details = partyOf[_partyAddress];\\n        partyAddress = _partyAddress;\\n        countryCode = details.countryCode;\\n        partyId = details.partyId;\\n        roles = details.roles;\\n        paymentStatus = details.paymentStatus;\\n        operatorAddress = operatorOf[_partyAddress];\\n        name = details.name;\\n        url = details.url;\\n        active = details.active;\\n    }\\n\\n    function getPartyDetailsByOcpi(bytes2 _countryCode, bytes3 _partyId) public view returns (address partyAddress, bytes2 countryCode, bytes3 partyId, Role[] memory roles, IOcnPaymentManager.PaymentStatus paymentStatus, address operatorAddress, string memory name, string memory url, bool active, uint256 stakingBlock) {\\n        partyAddress = uniqueParties[_countryCode][_partyId];\\n        (stakingBlock, ) = paymentManager.getPaymentBlock(partyAddress);\\n        PartyDetails storage details = partyOf[partyAddress];\\n        countryCode = details.countryCode;\\n        partyId = details.partyId;\\n        roles = details.roles;\\n        paymentStatus = paymentManager.getPaymentStatus(partyAddress);\\n        operatorAddress = operatorOf[partyAddress];\\n        name = details.name;\\n        url = details.url;\\n        active = details.active;\\n    }\\n\\n    function getPartiesCount() public view returns (uint256) {\\n        return parties.length;\\n    }\\n\\n    function getParties() public view returns (address[] memory) {\\n        return parties;\\n    }\\n\\n    function getPartiesByOperator(address operator) public view returns (address[] memory) {\\n        address[] memory filteredParties = new address[](parties.length);\\n        uint32 count = 0;\\n        for (uint32 i = 0; i < parties.length; i++) {\\n            if (operatorOf[parties[i]] == operator) {\\n                filteredParties[count] = parties[i];\\n                count++;\\n            }\\n        }\\n        address[] memory result = new address[](count);\\n        for (uint32 i = 0; i < count; i++) {\\n            result[i] = filteredParties[i];\\n        }\\n        return result;\\n    }\\n\\n    function getPartiesByRole(Role role) public view returns (address[] memory) {\\n        address[] memory filteredParties = new address[](parties.length);\\n        uint32 count = 0;\\n        for (uint32 i = 0; i < parties.length; i++) {\\n            PartyDetails memory details = partyOf[parties[i]];\\n            for (uint32 j = 0; j < details.roles.length; j++) {\\n                if (details.roles[j] == role) {\\n                    filteredParties[count] = parties[i];\\n                    count++;\\n                    break;\\n                }\\n            }\\n        }\\n        address[] memory result = new address[](count);\\n        for (uint32 i = 0; i < count; i++) {\\n            result[i] = filteredParties[i];\\n        }\\n        return result;\\n    }\\n\\n    function setVerifier(address verifier) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        require(verifier != address(0), \\\"Invalid verifier address\\\");\\n        require(!allowedCertificateVerifiers[verifier], \\\"Verifier already allowed\\\");\\n\\n        allowedCertificateVerifiers[verifier] = true;\\n    }\\n\\n    function removeVerifier(address verifier) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        require(verifier != address(0), \\\"Invalid verifier address\\\");\\n        require(allowedCertificateVerifiers[verifier], \\\"Verifier not currently allowed\\\");\\n\\n        allowedCertificateVerifiers[verifier] = false;\\n    }\\n\\n    function isAllowedVerifier(address verifier) public view returns (bool) {\\n        return allowedCertificateVerifiers[verifier];\\n    }\\n\\n    function setProviderOracle(Role role, address oracleAddress) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        roleOracle[role] = IProviderOracle(oracleAddress);\\n    }\\n\\n    function verifyCertificate(RoleDetails memory roleDetails) private view returns (string memory, address) {\\n        if (roleDetails.role == Role.EMSP) {\\n            (address verifier, ICertificateVerifier.EMPCertificate memory certificate, ) = certificateVerifier.verifyEMP(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid EMP certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        } else if (roleDetails.role == Role.CPO) {\\n            (address verifier, ICertificateVerifier.CPOCertificate memory certificate, ) = certificateVerifier.verifyCPO(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid CPO certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        } else {\\n            (address verifier, ICertificateVerifier.OtherCertificate memory certificate, ) = certificateVerifier.verifyOther(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid Other certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        }\\n    }\\n\\n    function compareIdentifiers(string memory a, string memory b) private pure returns (bool) {\\n        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n    }\\n}\\n\",\"keccak256\":\"0x1111564d261356aeabb2234d9b4a9113b1aa59798f3db20fd7001b956e3c1e66\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/ICertificateVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.24;\\n\\ninterface ICertificateVerifier {\\n    struct Signature {\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n    }\\n\\n    struct EMPCertificate {\\n        string identifier;\\n        string name;\\n        string marktfunktion;\\n        string lieferant;\\n        string bilanzkreis;\\n        address owner;\\n    }\\n\\n    struct CPOCertificate {\\n        string identifier;\\n        string name;\\n        address owner;\\n    }\\n\\n    struct OtherCertificate {\\n        string identifier;\\n        string name;\\n        address owner;\\n    }\\n\\n    function verifyEMP(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external view returns (address, EMPCertificate memory, Signature memory);\\n\\n    function verifyCPO(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external view returns (address, CPOCertificate memory, Signature memory);\\n\\n    function verifyOther(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external view returns (address, OtherCertificate memory, Signature memory);\\n}\\n\",\"keccak256\":\"0xa1fb3ec459b1344973479676bbd58d31cbaa1f3e9735338a6bf6ff85a526d59a\",\"license\":\"MIT\"},\"contracts/interfaces/IProviderOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.24;\\n\\ninterface IProviderOracle {\\n    struct Provider {\\n        string name;\\n        string identifier;\\n    }\\n\\n    function getProvider(\\n        string memory identifier\\n    ) external view returns (Provider memory);\\n\\n    function addProvider(Provider memory provider) external;\\n}\\n\",\"keccak256\":\"0x8ed559df15b641e541236e0e4558bd8dec99c2efc31218f4939b67a4114b5723\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b5060405162004aec38038062004aec83398101604081905262000034916200018a565b60408051808201909152601c81527f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015260019062000077908262000269565b50600c80546001600160a01b038085166001600160a01b031992831617909255600d805492841692909116919091179055620000b5600033620000be565b50505062000335565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000163576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000167565b5060005b92915050565b80516001600160a01b03811681146200018557600080fd5b919050565b600080604083850312156200019e57600080fd5b620001a9836200016d565b9150620001b9602084016200016d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001ed57607f821691505b6020821081036200020e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000264576000816000526020600020601f850160051c810160208610156200023f5750805b601f850160051c820191505b8181101562000260578281556001016200024b565b5050505b505050565b81516001600160401b03811115620002855762000285620001c2565b6200029d81620002968454620001d8565b8462000214565b602080601f831160018114620002d55760008415620002bc5750858301515b600019600386901b1c1916600185901b17855562000260565b600085815260208120601f198616915b828110156200030657888601518255948401946001909101908401620002e5565b5085821015620003255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6147a780620003456000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806391d148541161011a578063aee1fe49116100ad578063d63a84d41161007c578063d63a84d414610490578063df516128146104a3578063dfd93d3b146104cb578063e1e64995146104de578063f2fde38b146104f157600080fd5b8063aee1fe4914610437578063bdb8107814610462578063ca2dfd0a1461046a578063d547741f1461047d57600080fd5b8063a33db09f116100e9578063a33db09f146103eb578063a5b5ffbb146103fe578063a8311aa814610427578063acaef0e01461042f57600080fd5b806391d148541461039d57806399bd6901146103b05780639d209048146103c3578063a217fddf146103e357600080fd5b80635437988d1161019d5780636c265bbc1161016c5780636c265bbc146103305780637a091aa51461034357806381939d661461036457806385cb86021461037757806388cf72a01461038a57600080fd5b80635437988d146102d65780635cf0685f146102e957806366acaa331461031557806366e706fb1461031d57600080fd5b80632d8fe452116101d95780632d8fe4521461027d5780632f2ff15d1461029057806336568abe146102a357806339581c21146102b657600080fd5b806301ffc9a71461020b578063031d2bd5146102335780630799363d14610245578063248a9ca31461025a575b600080fd5b61021e61021936600461365f565b610504565b60405190151581526020015b60405180910390f35b600b545b60405190815260200161022a565b61025861025336600461390b565b61053b565b005b6102376102683660046139c7565b60009081526020819052604090206001015490565b61025861028b3660046139e0565b6110ac565b61025861029e3660046139fd565b6110c4565b6102586102b13660046139fd565b6110ef565b6102c96102c4366004613a2d565b611127565b60405161022a9190613a48565b6102586102e43660046139e0565b6115fc565b61021e6102f73660046139e0565b6001600160a01b03166000908152600a602052604090205460ff1690565b6102c96116e6565b61025861032b366004613aaf565b611748565b61025861033e366004613aaf565b611841565b610356610351366004613af5565b611900565b60405161022a929190613b78565b610258610372366004613ba4565b6119ed565b610258610385366004613bd0565b611a57565b6103566103983660046139e0565b611a64565b61021e6103ab3660046139fd565b611b23565b6102586103be366004613c04565b611b4c565b6103d66103d13660046139e0565b611c0d565b60405161022a9190613c77565b610237600081565b6102c96103f93660046139e0565b611cb9565b61041161040c366004613af5565b611eb3565b60405161022a9a99989796959493929190613d07565b6102c96121f9565b610258612259565b600c5461044a906001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610258612264565b6102586104783660046139e0565b61226d565b61025861048b3660046139fd565b612353565b61025861049e366004613af5565b612378565b6104b66104b13660046139e0565b6123c4565b60405161022a99989796959493929190613da5565b600d5461044a906001600160a01b031681565b6102586104ec366004613e41565b612611565b6102586104ff3660046139e0565b6127ac565b60006001600160e01b03198216637965db0b60e01b148061053557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160f01b031986166105be57604051633a50519760e21b815260206004820152603e60248201527f43616e6e6f742073657420656d70747920636f756e7472795f636f64652e205560448201527f73652064656c6574655061727479206d6574686f6420696e73746561642e000060648201526084015b60405180910390fd5b6001600160e81b0319851661063c5760405163373a953760e11b815260206004820152603a60248201527f43616e6e6f742073657420656d7074792070617274795f69642e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b83516000036106835760405163cab73b6560e01b81526020600482015260126024820152712737903937b632b990383937bb34b232b21760711b60448201526064016105b5565b6001600160a01b0383166107005760405163fac855f560e01b815260206004820152603a60248201527f43616e6e6f742073657420656d707479206f70657261746f722e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b600084516001600160401b0381111561071b5761071b6136c5565b604051908082528060200260200182016040528015610744578160200160208202803683370190505b5090506000805b86518160ff161015610961576000878260ff168151811061076e5761076e613f31565b6020026020010151905060008061078483612807565b90925090506001600160a01b03851661079b578094505b806001600160a01b0316856001600160a01b031614610808576040516316c7354f60e01b815260206004820152602260248201527f436572746966696361746573206861766520646966666572656e74206f776e65604482015261727360f01b60648201526084016105b5565b6000600e60008560400151600581111561082457610824613c8a565b600581111561083557610835613c8a565b81526020810191909152604001600020546001600160a01b031690508015610900576040516350cadc8560e01b81526000906001600160a01b038316906350cadc8590610886908790600401613c77565b600060405180830381865afa1580156108a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108cb9190810190613f8c565b90506108db848260200151612b7d565b6108fe5784604001516040516303458c0d60e21b81526004016105b59190614032565b505b8360400151878660ff168151811061091a5761091a613f31565b6020026020010190600581111561093357610933613c8a565b9081600581111561094657610946613c8a565b8152505050505050808061095990614086565b91505061074b565b506001600160f01b0319881660009081526006602090815260408083206001600160e81b03198b1684529091529020546001600160a01b031680158015906109bb5750816001600160a01b0316816001600160a01b031614155b15610a445760405163618270d960e01b815260206004820152604c60248201527f5061727479207769746820636f756e7472795f636f64652f70617274795f696460448201527f20616c7265616479207265676973746572656420756e6465722064696666657260648201526b32b73a1030b2323932b9b99760a11b608482015260a4016105b5565b6001600160f01b0319891660009081526006602090815260408083206001600160e81b03198c168452825280832080546001600160a01b0319166001600160a01b038781169190911790915589168352600290915290208054610aa6906140a5565b9050600003610b0257604051634523c97f60e01b815260206004820152602160248201527f50726f7669646564206f70657261746f72206e6f7420726567697374657265646044820152601760f91b60648201526084016105b5565b6001600160a01b03821660009081526008602090815260408083206005015460079092529091205460ff16610b8d57600b80546001808201835560008390527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319166001600160a01b0387161790559054610b8a91906140df565b90505b6001600160a01b03838116600081815260076020526040808220805460ff19166001179055600c549051632222c8a160e21b815260048101939093529092169063888b228490602401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906140f2565b90506040518061012001604052808c6001600160f01b03191681526020018b6001600160e81b0319168152602001868152602001888152602001878152602001826003811115610c6957610c69613c8a565b8152602001600081526001602080830182905260409283018690526001600160a01b038816600090815260088252839020845181548684015160e81c620100000264ffffffffff1990911660f09290921c91909117178155928401518051610cd893850192919091019061353b565b5060608201516002820190610ced908261415b565b5060808201516003820190610d02908261415b565b5060a082015160048201805460ff19166001836003811115610d2657610d26613c8a565b021790555060c082015160048201805461ff001916610100836002811115610d5057610d50613c8a565b021790555060e082015160048201805462ff00001916620100009215158302179055610100909201516005909101556001600160a01b03858116600090815260096020908152604080832080546001600160a01b031916948e169490941790935560088152828220835161012081018552815460f081901b6001600160f01b03191682529590950460e81b6001600160e81b031916858301526001810180548551818502810185018752818152949695929492860193830182828015610e6557602002820191906000526020600020906000905b82829054906101000a900460ff166005811115610e4357610e43613c8a565b815260206001928301818104948501949093039092029101808411610e245790505b50505050508152602001600282018054610e7e906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa906140a5565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b50505050508152602001600382018054610f10906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3c906140a5565b8015610f895780601f10610f5e57610100808354040283529160200191610f89565b820191906000526020600020905b815481529060010190602001808311610f6c57829003601f168201915b5050509183525050600482015460209091019060ff166003811115610fb057610fb0613c8a565b6003811115610fc157610fc1613c8a565b81526020016004820160019054906101000a900460ff166002811115610fe957610fe9613c8a565b6002811115610ffa57610ffa613c8a565b81526020016004820160029054906101000a900460ff161515151581526020016005820154815250509050886001600160a01b0316856001600160a01b03167fc16bf12458bfb0cf1345674275c1e82f2c14cf06a3996e1bb297f2015ff66f78836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405161109698979695949392919061421a565b60405180910390a3505050505050505050505050565b60006110b781612bd6565b6110c082612be0565b5050565b6000828152602081905260409020600101546110df81612bd6565b6110e98383612d87565b50505050565b6001600160a01b03811633146111185760405163334bd91960e11b815260040160405180910390fd5b6111228282612e19565b505050565b600b546060906000906001600160401b03811115611147576111476136c5565b604051908082528060200260200182016040528015611170578160200160208202803683370190505b5090506000805b600b5463ffffffff8216101561153757600060086000600b8463ffffffff16815481106111a6576111a6613f31565b60009182526020808320909101546001600160a01b03168352828101939093526040918201902081516101208101835281546001600160f01b031960f082901b1682526001600160e81b03196201000090910460e81b168185015260018201805484518187028101870186528181529295939486019383018282801561127b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561125957611259613c8a565b81526020600192830181810494850194909303909202910180841161123a5790505b50505050508152602001600282018054611294906140a5565b80601f01602080910402602001604051908101604052809291908181526020018280546112c0906140a5565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b50505050508152602001600382018054611326906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611352906140a5565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050509183525050600482015460209091019060ff1660038111156113c6576113c6613c8a565b60038111156113d7576113d7613c8a565b81526020016004820160019054906101000a900460ff1660028111156113ff576113ff613c8a565b600281111561141057611410613c8a565b8152600482015462010000900460ff1615156020820152600590910154604090910152905060005b8160400151518163ffffffff1610156115225786600581111561145d5761145d613c8a565b82604001518263ffffffff168151811061147957611479613f31565b6020026020010151600581111561149257611492613c8a565b0361151057600b8363ffffffff16815481106114b0576114b0613f31565b9060005260206000200160009054906101000a90046001600160a01b0316858563ffffffff16815181106114e6576114e6613f31565b6001600160a01b039092166020928302919091019091015283611508816142b3565b945050611522565b8061151a816142b3565b915050611438565b5050808061152f906142b3565b915050611177565b5060008163ffffffff166001600160401b03811115611558576115586136c5565b604051908082528060200260200182016040528015611581578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff16815181106115b3576115b3613f31565b6020026020010151828263ffffffff16815181106115d3576115d3613f31565b6001600160a01b0390921660209283029190910190910152600101611587565b50949350505050565b600061160781612bd6565b6001600160a01b0382166116585760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff16156116c15760405162461bcd60e51b815260206004820152601860248201527f566572696669657220616c726561647920616c6c6f776564000000000000000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6060600580548060200260200160405190810160405280929190818152602001828054801561173e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611720575b5050505050905090565b6040516001600160601b0319606086901b1660208201526000906034016040516020818303038152906040528051906020012090506000600180836040516020016117949291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156117f2573d6000803e3d6000fd5b505050602060405103519050856001600160a01b0316816001600160a01b0316146118305760405163331e1b8160e21b81526004016105b590614351565b61183981612e84565b505050505050565b6040516001600160601b0319606086901b16602082015260009060340160405160208183030381529060405280519060200120905060006001808360405160200161188d9291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156118eb573d6000803e3d6000fd5b50505060206040510351905061183981612be0565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b0390811680855260098452828520549091168085526002909352922080549192606092909190611965906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611991906140a5565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b50505050509150509250929050565b60006119f881612bd6565b81600e6000856005811115611a0f57611a0f613c8a565b6005811115611a2057611a20613c8a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b611a61338261330c565b50565b6001600160a01b038082166000908152600960209081526040808320549093168083526002909152919020805460609190611a9e906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611aca906140a5565b8015611b175780601f10611aec57610100808354040283529160200191611b17565b820191906000526020600020905b815481529060010190602001808311611afa57829003601f168201915b50505050509050915091565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008585604051602001611b6192919061439d565b604051602081830303815290604052805190602001209050600060018083604051602001611b909291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611bee573d6000803e3d6000fd5b505050602060405103519050611c04818761330c565b50505050505050565b6001600160a01b0381166000908152600260205260409020805460609190611c34906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c60906140a5565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b50505050509050919050565b600b546060906000906001600160401b03811115611cd957611cd96136c5565b604051908082528060200260200182016040528015611d02578160200160208202803683370190505b5090506000805b600b5463ffffffff82161015611df757846001600160a01b031660096000600b8463ffffffff1681548110611d4057611d40613f31565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541603611de557600b8163ffffffff1681548110611d8957611d89613f31565b9060005260206000200160009054906101000a90046001600160a01b0316838363ffffffff1681518110611dbf57611dbf613f31565b6001600160a01b039092166020928302919091019091015281611de1816142b3565b9250505b80611def816142b3565b915050611d09565b5060008163ffffffff166001600160401b03811115611e1857611e186136c5565b604051908082528060200260200182016040528015611e41578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff1681518110611e7357611e73613f31565b6020026020010151828263ffffffff1681518110611e9357611e93613f31565b6001600160a01b0390921660209283029190910190910152600101611e47565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b03198516845290915280822054600c549151631234d3bd60e01b81526001600160a01b039182166004820181905293928392606092849283928592839285928392911690631234d3bd906024016040805180830381865afa158015611f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6391906143d5565b506001600160a01b038b16600090815260086020908152604091829020805460018201805485518186028101860190965280865260f083901b9f506201000090920460e81b9d5094955090939183018282801561200f57602002820191906000526020600020906000905b82829054906101000a900460ff166005811115611fed57611fed613c8a565b815260206001928301818104948501949093039092029101808411611fce5790505b5050600c54604051632222c8a160e21b8152949c506001600160a01b03169363888b2284935061205492508f91506004016001600160a01b0391909116815260200190565b602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209591906140f2565b6001600160a01b03808d16600090815260096020526040902054600284018054939a5091169750906120c6906140a5565b80601f01602080910402602001604051908101604052809291908181526020018280546120f2906140a5565b801561213f5780601f106121145761010080835404028352916020019161213f565b820191906000526020600020905b81548152906001019060200180831161212257829003601f168201915b50505050509450806003018054612155906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612181906140a5565b80156121ce5780601f106121a3576101008083540402835291602001916121ce565b820191906000526020600020905b8154815290600101906020018083116121b157829003601f168201915b505050505093508060040160029054906101000a900460ff169250509295989b9194979a5092959850565b6060600b80548060200260200160405190810160405280929190818152602001828054801561173e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611720575050505050905090565b61226233612be0565b565b61226233612e84565b600061227881612bd6565b6001600160a01b0382166122c95760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff166123315760405162461bcd60e51b815260206004820152601e60248201527f5665726966696572206e6f742063757272656e746c7920616c6c6f776564000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19169055565b60008281526020819052604090206001015461236e81612bd6565b6110e98383612e19565b600061238381612bd6565b6001600160f01b0319831660009081526006602090815260408083206001600160e81b0319861684529091529020546001600160a01b03166110e981612e84565b6001600160a01b03811660009081526008602090815260408083208054600182018054845181870281018701909552808552879660f084901b966201000090940460e81b956060959194859487948594879490939092919083018282801561247b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561245957612459613c8a565b81526020600192830181810494850194909303909202910180841161243a5790505b505050505096508060040160009054906101000a900460ff169550600960008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031694508060020180546124e0906140a5565b80601f016020809104026020016040519081016040528092919081815260200182805461250c906140a5565b80156125595780601f1061252e57610100808354040283529160200191612559565b820191906000526020600020905b81548152906001019060200180831161253c57829003601f168201915b5050505050935080600301805461256f906140a5565b80601f016020809104026020016040519081016040528092919081815260200182805461259b906140a5565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b505050505092508060040160029054906101000a900460ff169150509193959799909294969850565b604080516020810190915260008082525b88518160ff161015612697576000898260ff168151811061264557612645613f31565b602002602001015190508281600001518260200151836040015160405160200161267294939291906143f9565b604051602081830303815290604052925050808061268f90614086565b915050612622565b5060008180519060200120905060008c8c8c848c8c8c6040516020016126c39796959493929190614457565b6040516020818303038152906040528051906020012090506000600180836040516020016126f29291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff8a1690820152606081018890526080810187905260a0016020604051602081039080840390855afa158015612750573d6000803e3d6000fd5b5050506020604051035190508d6001600160a01b0316816001600160a01b03161461278e5760405163331e1b8160e21b81526004016105b590614351565b61279c8d8d8d8d8d8d61053b565b5050505050505050505050505050565b60006127b781612bd6565b6127c26000836110c4565b6127cd600033612353565b6040516001600160a01b0383169033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600060018360400151600581111561282357612823613c8a565b0361294157600d548351602085015160405163fbb87f9760e01b815260009384936001600160a01b039091169263fbb87f97926128649291906004016144d7565b600060405180830381865afa158015612881573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128a99190810190614553565b50915091506128d0826001600160a01b03166000908152600a602052604090205460ff1690565b61292e5760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c696420454d5020636572746966696361746500000000000000000060648201526084016105b5565b805160a090910151909590945092505050565b60008360400151600581111561295957612959613c8a565b03612a7757600d548351602085015160405163055b37fb60e51b815260009384936001600160a01b039091169263ab66ff609261299a9291906004016144d7565b600060405180830381865afa1580156129b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129df91908101906146fd565b5091509150612a06826001600160a01b03166000908152600a602052604090205460ff1690565b612a645760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c69642043504f20636572746966696361746500000000000000000060648201526084016105b5565b8051604090910151909590945092505050565b600d548351602085015160405163fab285c960e01b815260009384936001600160a01b039091169263fab285c992612ab39291906004016144d7565b600060405180830381865afa158015612ad0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612af891908101906146fd565b5091509150612b1f826001600160a01b03166000908152600a602052604090205460ff1690565b612a645760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601960448201527f496e76616c6964204f746865722063657274696669636174650000000000000060648201526084016105b5565b600081604051602001612b909190614755565b6040516020818303038152906040528051906020012083604051602001612bb79190614755565b6040516020818303038152906040528051906020012014905092915050565b611a618133613502565b6001600160a01b03811660009081526002602052604081208054612c03906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2f906140a5565b8015612c7c5780601f10612c5157610100808354040283529160200191612c7c565b820191906000526020600020905b815481529060010190602001808311612c5f57829003601f168201915b505050505090508051600003612ce557604051639d8b847760e01b815260206004820152602760248201527f43616e6e6f742064656c657465206e6f6465207468617420646f6573206e6f746044820152661032bc34b9ba1760c91b60648201526084016105b5565b6000600382604051612cf79190614755565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526002909152908120612d38916135ef565b816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d6604051612d7b90602080825260009082015260400190565b60405180910390a25050565b6000612d938383611b23565b612e11576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612dc93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610535565b506000610535565b6000612e258383611b23565b15612e11576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610535565b6001600160a01b0381811660009081526009602052604090205416612f2657604051634523c97f60e01b815260206004820152604b60248201527f43616e6e6f742064656c657465207061727479207468617420646f6573206e6f60448201527f742065786973742e204e6f206f70657261746f7220666f756e6420666f72206760648201526a34bb32b7103830b93a3c9760a91b608482015260a4016105b5565b6001600160a01b038116600090815260096020908152604080832080546001600160a01b031916905560088252808320815161012081018352815460f081901b6001600160f01b031916825262010000900460e81b6001600160e81b0319168185015260018201805484518187028101870186528181529295939486019383018282801561300357602002820191906000526020600020906000905b82829054906101000a900460ff166005811115612fe157612fe1613c8a565b815260206001928301818104948501949093039092029101808411612fc25790505b5050505050815260200160028201805461301c906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054613048906140a5565b80156130955780601f1061306a57610100808354040283529160200191613095565b820191906000526020600020905b81548152906001019060200180831161307857829003601f168201915b505050505081526020016003820180546130ae906140a5565b80601f01602080910402602001604051908101604052809291908181526020018280546130da906140a5565b80156131275780601f106130fc57610100808354040283529160200191613127565b820191906000526020600020905b81548152906001019060200180831161310a57829003601f168201915b5050509183525050600482015460209091019060ff16600381111561314e5761314e613c8a565b600381111561315f5761315f613c8a565b81526020016004820160019054906101000a900460ff16600281111561318757613187613c8a565b600281111561319857613198613c8a565b8152600482015462010000900460ff16151560208083019190915260059092015460409182015282516001600160f01b031916600090815260068352818120848401516001600160e81b0319168252835281812080546001600160a01b03191690556001600160a01b038616815260089092528120805464ffffffffff191681559192506132296001830182613629565b6132376002830160006135ef565b6132456003830160006135ef565b5060048101805462ffffff191690556000600590910155610100810151600b8054909190811061327757613277613f31565b6000918252602080832090910180546001600160a01b03191690556001600160a01b03841680835260078252604092839020805460ff19169055835191840151848401516060860151608087015160a088015160c089015160e08a0151985196987ff1cf4c42833aa61e1c774181a5389a7b164a71351b75cf37a76762f31b17073998612d7b9890979695949392919061421a565b805160000361338457604051639d8b847760e01b815260206004820152603c60248201527f43616e6e6f742073657420656d70747920646f6d61696e206e616d652e20557360448201527f652064656c6574654e6f6465206d6574686f6420696e73746561642e0000000060648201526084016105b5565b6003816040516133949190614755565b9081526040519081900360200190205460ff16156133f55760405163f1f1b1c760e01b815260206004820152601f60248201527f446f6d61696e206e616d6520616c726561647920726567697374657265642e0060448201526064016105b5565b60016003826040516134079190614755565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526004909152205460ff1661349157600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600460209081526040808320805460ff19166001179055600290915290206134c8828261415b565b50816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d682604051612d7b9190613c77565b61350c8282611b23565b6110c05760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105b5565b82805482825590600052602060002090601f016020900481019282156135df5791602002820160005b838211156135b057835183826101000a81548160ff0219169083600581111561358f5761358f613c8a565b02179055509260200192600101602081600001049283019260010302613564565b80156135dd5782816101000a81549060ff02191690556001016020816000010492830192600103026135b0565b505b506135eb92915061364a565b5090565b5080546135fb906140a5565b6000825580601f1061360b575050565b601f016020900490600052602060002090810190611a61919061364a565b50805460008255601f016020900490600052602060002090810190611a6191905b5b808211156135eb576000815560010161364b565b60006020828403121561367157600080fd5b81356001600160e01b03198116811461368957600080fd5b9392505050565b80356001600160f01b0319811681146136a857600080fd5b919050565b80356001600160e81b0319811681146136a857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156136fd576136fd6136c5565b60405290565b60405160c081016001600160401b03811182821017156136fd576136fd6136c5565b604051601f8201601f191681016001600160401b038111828210171561374d5761374d6136c5565b604052919050565b60006001600160401b0382111561376e5761376e6136c5565b50601f01601f191660200190565b600082601f83011261378d57600080fd5b81356137a061379b82613755565b613725565b8181528460208386010111156137b557600080fd5b816020850160208301376000918101602001919091529392505050565b8035600681106136a857600080fd5b600082601f8301126137f257600080fd5b813560206001600160401b038083111561380e5761380e6136c5565b8260051b61381d838201613725565b938452858101830193838101908886111561383757600080fd5b84880192505b858310156138df578235848111156138555760008081fd5b88016060818b03601f190181131561386d5760008081fd5b6138756136db565b87830135878111156138875760008081fd5b6138958d8a8387010161377c565b825250604080840135888111156138ac5760008081fd5b6138ba8e8b8388010161377c565b8a840152506138ca8385016137d2565b9082015284525050918401919084019061383d565b98975050505050505050565b6001600160a01b0381168114611a6157600080fd5b80356136a8816138eb565b60008060008060008060c0878903121561392457600080fd5b61392d87613690565b955061393b602088016136ad565b945060408701356001600160401b038082111561395757600080fd5b6139638a838b016137e1565b955060608901359150613975826138eb565b9093506080880135908082111561398b57600080fd5b6139978a838b0161377c565b935060a08901359150808211156139ad57600080fd5b506139ba89828a0161377c565b9150509295509295509295565b6000602082840312156139d957600080fd5b5035919050565b6000602082840312156139f257600080fd5b8135613689816138eb565b60008060408385031215613a1057600080fd5b823591506020830135613a22816138eb565b809150509250929050565b600060208284031215613a3f57600080fd5b613689826137d2565b6020808252825182820181905260009190848201906040850190845b81811015613a895783516001600160a01b031683529284019291840191600101613a64565b50909695505050505050565b60ff81168114611a6157600080fd5b80356136a881613a95565b60008060008060808587031215613ac557600080fd5b8435613ad0816138eb565b93506020850135613ae081613a95565b93969395505050506040820135916060013590565b60008060408385031215613b0857600080fd5b613b1183613690565b9150613b1f602084016136ad565b90509250929050565b60005b83811015613b43578181015183820152602001613b2b565b50506000910152565b60008151808452613b64816020860160208601613b28565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090613b9c90830184613b4c565b949350505050565b60008060408385031215613bb757600080fd5b613bc0836137d2565b91506020830135613a22816138eb565b600060208284031215613be257600080fd5b81356001600160401b03811115613bf857600080fd5b613b9c8482850161377c565b600080600080600060a08688031215613c1c57600080fd5b8535613c27816138eb565b945060208601356001600160401b03811115613c4257600080fd5b613c4e8882890161377c565b9450506040860135613c5f81613a95565b94979396509394606081013594506080013592915050565b6020815260006136896020830184613b4c565b634e487b7160e01b600052602160045260246000fd5b60068110613cb057613cb0613c8a565b9052565b60008151808452602080850194506020840160005b83811015613cec57613cdc878351613ca0565b9582019590820190600101613cc9565b509495945050505050565b60048110613cb057613cb0613c8a565b6001600160a01b038b811682526001600160f01b03198b1660208301526001600160e81b03198a16604083015261014060608301819052600091613d4d8483018c613cb4565b9150613d5c608085018b613cf7565b881660a084015282810360c0840152613d758188613b4c565b905082810360e0840152613d898187613b4c565b9415156101008401525050610120015298975050505050505050565b6001600160a01b038a811682526001600160f01b03198a1660208301526001600160e81b03198916604083015261012060608301819052600091613deb8483018b613cb4565b9150613dfa608085018a613cf7565b871660a084015282810360c0840152613e138187613b4c565b905082810360e0840152613e278186613b4c565b9150508215156101008301529a9950505050505050505050565b6000806000806000806000806000806101408b8d031215613e6157600080fd5b613e6a8b613900565b9950613e7860208c01613690565b9850613e8660408c016136ad565b975060608b01356001600160401b0380821115613ea257600080fd5b613eae8e838f016137e1565b9850613ebc60808e01613900565b975060a08d0135915080821115613ed257600080fd5b613ede8e838f0161377c565b965060c08d0135915080821115613ef457600080fd5b50613f018d828e0161377c565b945050613f1060e08c01613aa4565b92506101008b013591506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b600082601f830112613f5857600080fd5b8151613f6661379b82613755565b818152846020838601011115613f7b57600080fd5b613b9c826020830160208701613b28565b600060208284031215613f9e57600080fd5b81516001600160401b0380821115613fb557600080fd5b9083019060408286031215613fc957600080fd5b604051604081018181108382111715613fe457613fe46136c5565b604052825182811115613ff657600080fd5b61400287828601613f47565b82525060208301518281111561401757600080fd5b61402387828601613f47565b60208301525095945050505050565b61403c8183613ca0565b604060208201819052601490820152734e6f742061637469766520696e206f7261636c6560601b6060820152608001919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff810361409c5761409c614070565b60010192915050565b600181811c908216806140b957607f821691505b6020821081036140d957634e487b7160e01b600052602260045260246000fd5b50919050565b8181038181111561053557610535614070565b60006020828403121561410457600080fd5b81516004811061368957600080fd5b601f821115611122576000816000526020600020601f850160051c8101602086101561413c5750805b601f850160051c820191505b8181101561183957828155600101614148565b81516001600160401b03811115614174576141746136c5565b6141888161418284546140a5565b84614113565b602080601f8311600181146141bd57600084156141a55750858301515b600019600386901b1c1916600185901b178555611839565b600085815260208120601f198616915b828110156141ec578886015182559484019460019091019084016141cd565b508582101561420a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160f01b0319891681526001600160e81b031988166020820152610100604082018190526000906142508382018a613cb4565b905082810360608401526142648189613b4c565b905082810360808401526142788188613b4c565b91505061428860a0830186613cf7565b6003841061429857614298613c8a565b8360c083015282151560e08301529998505050505050505050565b600063ffffffff8083168181036142cc576142cc614070565b6001019392505050565b60008084546142e4816140a5565b600182811680156142fc576001811461431157614340565b60ff1984168752821515830287019450614340565b8860005260208060002060005b858110156143375781548a82015290840190820161431e565b50505082870194505b505050938152602001949350505050565b6020808252602c908201527f5369676e657220616e642070726f76696465642070617274792061646472657360408201526b39903234b33332b932b73a1760a11b606082015260800190565b6bffffffffffffffffffffffff198360601b168152600082516143c7816014850160208701613b28565b919091016014019392505050565b600080604083850312156143e857600080fd5b505080516020909101519092909150565b6000855161440b818460208a01613b28565b85519083019061441f818360208a01613b28565b8551910190614432818360208901613b28565b016006841061444357614443613c8a565b60f89390931b835250506001019392505050565b6001600160601b0319606089811b821683526001600160f01b0319891660148401526001600160e81b0319881660168401526019830187905285901b16603982015282516000906144af81604d850160208801613b28565b8351908301906144c681604d840160208801613b28565b01604d019998505050505050505050565b6040815260006144ea6040830185613b4c565b82810360208401526144fc8185613b4c565b95945050505050565b80516136a8816138eb565b60006060828403121561452257600080fd5b61452a6136db565b90508151815260208201516020820152604082015161454881613a95565b604082015292915050565b600080600060a0848603121561456857600080fd5b8351614573816138eb565b60208501519093506001600160401b038082111561459057600080fd5b9085019060c082880312156145a457600080fd5b6145ac613703565b8251828111156145bb57600080fd5b6145c789828601613f47565b8252506020830151828111156145dc57600080fd5b6145e889828601613f47565b60208301525060408301518281111561460057600080fd5b61460c89828601613f47565b60408301525060608301518281111561462457600080fd5b61463089828601613f47565b60608301525060808301518281111561464857600080fd5b61465489828601613f47565b60808301525061466660a08401614505565b60a082015280945050505061467e8560408601614510565b90509250925092565b60006060828403121561469957600080fd5b6146a16136db565b905081516001600160401b03808211156146ba57600080fd5b6146c685838601613f47565b835260208401519150808211156146dc57600080fd5b506146e984828501613f47565b6020830152506040820151614548816138eb565b600080600060a0848603121561471257600080fd5b835161471d816138eb565b60208501519093506001600160401b0381111561473957600080fd5b61474586828701614687565b92505061467e8560408601614510565b60008251614767818460208701613b28565b919091019291505056fea26469706673582212206a5a68b859409215848175eb1256be8c1771e50aaad16b95765e3d8b6d76fe4264736f6c63430008180033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806391d148541161011a578063aee1fe49116100ad578063d63a84d41161007c578063d63a84d414610490578063df516128146104a3578063dfd93d3b146104cb578063e1e64995146104de578063f2fde38b146104f157600080fd5b8063aee1fe4914610437578063bdb8107814610462578063ca2dfd0a1461046a578063d547741f1461047d57600080fd5b8063a33db09f116100e9578063a33db09f146103eb578063a5b5ffbb146103fe578063a8311aa814610427578063acaef0e01461042f57600080fd5b806391d148541461039d57806399bd6901146103b05780639d209048146103c3578063a217fddf146103e357600080fd5b80635437988d1161019d5780636c265bbc1161016c5780636c265bbc146103305780637a091aa51461034357806381939d661461036457806385cb86021461037757806388cf72a01461038a57600080fd5b80635437988d146102d65780635cf0685f146102e957806366acaa331461031557806366e706fb1461031d57600080fd5b80632d8fe452116101d95780632d8fe4521461027d5780632f2ff15d1461029057806336568abe146102a357806339581c21146102b657600080fd5b806301ffc9a71461020b578063031d2bd5146102335780630799363d14610245578063248a9ca31461025a575b600080fd5b61021e61021936600461365f565b610504565b60405190151581526020015b60405180910390f35b600b545b60405190815260200161022a565b61025861025336600461390b565b61053b565b005b6102376102683660046139c7565b60009081526020819052604090206001015490565b61025861028b3660046139e0565b6110ac565b61025861029e3660046139fd565b6110c4565b6102586102b13660046139fd565b6110ef565b6102c96102c4366004613a2d565b611127565b60405161022a9190613a48565b6102586102e43660046139e0565b6115fc565b61021e6102f73660046139e0565b6001600160a01b03166000908152600a602052604090205460ff1690565b6102c96116e6565b61025861032b366004613aaf565b611748565b61025861033e366004613aaf565b611841565b610356610351366004613af5565b611900565b60405161022a929190613b78565b610258610372366004613ba4565b6119ed565b610258610385366004613bd0565b611a57565b6103566103983660046139e0565b611a64565b61021e6103ab3660046139fd565b611b23565b6102586103be366004613c04565b611b4c565b6103d66103d13660046139e0565b611c0d565b60405161022a9190613c77565b610237600081565b6102c96103f93660046139e0565b611cb9565b61041161040c366004613af5565b611eb3565b60405161022a9a99989796959493929190613d07565b6102c96121f9565b610258612259565b600c5461044a906001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610258612264565b6102586104783660046139e0565b61226d565b61025861048b3660046139fd565b612353565b61025861049e366004613af5565b612378565b6104b66104b13660046139e0565b6123c4565b60405161022a99989796959493929190613da5565b600d5461044a906001600160a01b031681565b6102586104ec366004613e41565b612611565b6102586104ff3660046139e0565b6127ac565b60006001600160e01b03198216637965db0b60e01b148061053557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160f01b031986166105be57604051633a50519760e21b815260206004820152603e60248201527f43616e6e6f742073657420656d70747920636f756e7472795f636f64652e205560448201527f73652064656c6574655061727479206d6574686f6420696e73746561642e000060648201526084015b60405180910390fd5b6001600160e81b0319851661063c5760405163373a953760e11b815260206004820152603a60248201527f43616e6e6f742073657420656d7074792070617274795f69642e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b83516000036106835760405163cab73b6560e01b81526020600482015260126024820152712737903937b632b990383937bb34b232b21760711b60448201526064016105b5565b6001600160a01b0383166107005760405163fac855f560e01b815260206004820152603a60248201527f43616e6e6f742073657420656d707479206f70657261746f722e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b600084516001600160401b0381111561071b5761071b6136c5565b604051908082528060200260200182016040528015610744578160200160208202803683370190505b5090506000805b86518160ff161015610961576000878260ff168151811061076e5761076e613f31565b6020026020010151905060008061078483612807565b90925090506001600160a01b03851661079b578094505b806001600160a01b0316856001600160a01b031614610808576040516316c7354f60e01b815260206004820152602260248201527f436572746966696361746573206861766520646966666572656e74206f776e65604482015261727360f01b60648201526084016105b5565b6000600e60008560400151600581111561082457610824613c8a565b600581111561083557610835613c8a565b81526020810191909152604001600020546001600160a01b031690508015610900576040516350cadc8560e01b81526000906001600160a01b038316906350cadc8590610886908790600401613c77565b600060405180830381865afa1580156108a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108cb9190810190613f8c565b90506108db848260200151612b7d565b6108fe5784604001516040516303458c0d60e21b81526004016105b59190614032565b505b8360400151878660ff168151811061091a5761091a613f31565b6020026020010190600581111561093357610933613c8a565b9081600581111561094657610946613c8a565b8152505050505050808061095990614086565b91505061074b565b506001600160f01b0319881660009081526006602090815260408083206001600160e81b03198b1684529091529020546001600160a01b031680158015906109bb5750816001600160a01b0316816001600160a01b031614155b15610a445760405163618270d960e01b815260206004820152604c60248201527f5061727479207769746820636f756e7472795f636f64652f70617274795f696460448201527f20616c7265616479207265676973746572656420756e6465722064696666657260648201526b32b73a1030b2323932b9b99760a11b608482015260a4016105b5565b6001600160f01b0319891660009081526006602090815260408083206001600160e81b03198c168452825280832080546001600160a01b0319166001600160a01b038781169190911790915589168352600290915290208054610aa6906140a5565b9050600003610b0257604051634523c97f60e01b815260206004820152602160248201527f50726f7669646564206f70657261746f72206e6f7420726567697374657265646044820152601760f91b60648201526084016105b5565b6001600160a01b03821660009081526008602090815260408083206005015460079092529091205460ff16610b8d57600b80546001808201835560008390527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319166001600160a01b0387161790559054610b8a91906140df565b90505b6001600160a01b03838116600081815260076020526040808220805460ff19166001179055600c549051632222c8a160e21b815260048101939093529092169063888b228490602401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906140f2565b90506040518061012001604052808c6001600160f01b03191681526020018b6001600160e81b0319168152602001868152602001888152602001878152602001826003811115610c6957610c69613c8a565b8152602001600081526001602080830182905260409283018690526001600160a01b038816600090815260088252839020845181548684015160e81c620100000264ffffffffff1990911660f09290921c91909117178155928401518051610cd893850192919091019061353b565b5060608201516002820190610ced908261415b565b5060808201516003820190610d02908261415b565b5060a082015160048201805460ff19166001836003811115610d2657610d26613c8a565b021790555060c082015160048201805461ff001916610100836002811115610d5057610d50613c8a565b021790555060e082015160048201805462ff00001916620100009215158302179055610100909201516005909101556001600160a01b03858116600090815260096020908152604080832080546001600160a01b031916948e169490941790935560088152828220835161012081018552815460f081901b6001600160f01b03191682529590950460e81b6001600160e81b031916858301526001810180548551818502810185018752818152949695929492860193830182828015610e6557602002820191906000526020600020906000905b82829054906101000a900460ff166005811115610e4357610e43613c8a565b815260206001928301818104948501949093039092029101808411610e245790505b50505050508152602001600282018054610e7e906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa906140a5565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b50505050508152602001600382018054610f10906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3c906140a5565b8015610f895780601f10610f5e57610100808354040283529160200191610f89565b820191906000526020600020905b815481529060010190602001808311610f6c57829003601f168201915b5050509183525050600482015460209091019060ff166003811115610fb057610fb0613c8a565b6003811115610fc157610fc1613c8a565b81526020016004820160019054906101000a900460ff166002811115610fe957610fe9613c8a565b6002811115610ffa57610ffa613c8a565b81526020016004820160029054906101000a900460ff161515151581526020016005820154815250509050886001600160a01b0316856001600160a01b03167fc16bf12458bfb0cf1345674275c1e82f2c14cf06a3996e1bb297f2015ff66f78836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405161109698979695949392919061421a565b60405180910390a3505050505050505050505050565b60006110b781612bd6565b6110c082612be0565b5050565b6000828152602081905260409020600101546110df81612bd6565b6110e98383612d87565b50505050565b6001600160a01b03811633146111185760405163334bd91960e11b815260040160405180910390fd5b6111228282612e19565b505050565b600b546060906000906001600160401b03811115611147576111476136c5565b604051908082528060200260200182016040528015611170578160200160208202803683370190505b5090506000805b600b5463ffffffff8216101561153757600060086000600b8463ffffffff16815481106111a6576111a6613f31565b60009182526020808320909101546001600160a01b03168352828101939093526040918201902081516101208101835281546001600160f01b031960f082901b1682526001600160e81b03196201000090910460e81b168185015260018201805484518187028101870186528181529295939486019383018282801561127b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561125957611259613c8a565b81526020600192830181810494850194909303909202910180841161123a5790505b50505050508152602001600282018054611294906140a5565b80601f01602080910402602001604051908101604052809291908181526020018280546112c0906140a5565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b50505050508152602001600382018054611326906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611352906140a5565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050509183525050600482015460209091019060ff1660038111156113c6576113c6613c8a565b60038111156113d7576113d7613c8a565b81526020016004820160019054906101000a900460ff1660028111156113ff576113ff613c8a565b600281111561141057611410613c8a565b8152600482015462010000900460ff1615156020820152600590910154604090910152905060005b8160400151518163ffffffff1610156115225786600581111561145d5761145d613c8a565b82604001518263ffffffff168151811061147957611479613f31565b6020026020010151600581111561149257611492613c8a565b0361151057600b8363ffffffff16815481106114b0576114b0613f31565b9060005260206000200160009054906101000a90046001600160a01b0316858563ffffffff16815181106114e6576114e6613f31565b6001600160a01b039092166020928302919091019091015283611508816142b3565b945050611522565b8061151a816142b3565b915050611438565b5050808061152f906142b3565b915050611177565b5060008163ffffffff166001600160401b03811115611558576115586136c5565b604051908082528060200260200182016040528015611581578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff16815181106115b3576115b3613f31565b6020026020010151828263ffffffff16815181106115d3576115d3613f31565b6001600160a01b0390921660209283029190910190910152600101611587565b50949350505050565b600061160781612bd6565b6001600160a01b0382166116585760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff16156116c15760405162461bcd60e51b815260206004820152601860248201527f566572696669657220616c726561647920616c6c6f776564000000000000000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6060600580548060200260200160405190810160405280929190818152602001828054801561173e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611720575b5050505050905090565b6040516001600160601b0319606086901b1660208201526000906034016040516020818303038152906040528051906020012090506000600180836040516020016117949291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156117f2573d6000803e3d6000fd5b505050602060405103519050856001600160a01b0316816001600160a01b0316146118305760405163331e1b8160e21b81526004016105b590614351565b61183981612e84565b505050505050565b6040516001600160601b0319606086901b16602082015260009060340160405160208183030381529060405280519060200120905060006001808360405160200161188d9291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156118eb573d6000803e3d6000fd5b50505060206040510351905061183981612be0565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b0390811680855260098452828520549091168085526002909352922080549192606092909190611965906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611991906140a5565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b50505050509150509250929050565b60006119f881612bd6565b81600e6000856005811115611a0f57611a0f613c8a565b6005811115611a2057611a20613c8a565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b611a61338261330c565b50565b6001600160a01b038082166000908152600960209081526040808320549093168083526002909152919020805460609190611a9e906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611aca906140a5565b8015611b175780601f10611aec57610100808354040283529160200191611b17565b820191906000526020600020905b815481529060010190602001808311611afa57829003601f168201915b50505050509050915091565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008585604051602001611b6192919061439d565b604051602081830303815290604052805190602001209050600060018083604051602001611b909291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611bee573d6000803e3d6000fd5b505050602060405103519050611c04818761330c565b50505050505050565b6001600160a01b0381166000908152600260205260409020805460609190611c34906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c60906140a5565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b50505050509050919050565b600b546060906000906001600160401b03811115611cd957611cd96136c5565b604051908082528060200260200182016040528015611d02578160200160208202803683370190505b5090506000805b600b5463ffffffff82161015611df757846001600160a01b031660096000600b8463ffffffff1681548110611d4057611d40613f31565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541603611de557600b8163ffffffff1681548110611d8957611d89613f31565b9060005260206000200160009054906101000a90046001600160a01b0316838363ffffffff1681518110611dbf57611dbf613f31565b6001600160a01b039092166020928302919091019091015281611de1816142b3565b9250505b80611def816142b3565b915050611d09565b5060008163ffffffff166001600160401b03811115611e1857611e186136c5565b604051908082528060200260200182016040528015611e41578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff1681518110611e7357611e73613f31565b6020026020010151828263ffffffff1681518110611e9357611e93613f31565b6001600160a01b0390921660209283029190910190910152600101611e47565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b03198516845290915280822054600c549151631234d3bd60e01b81526001600160a01b039182166004820181905293928392606092849283928592839285928392911690631234d3bd906024016040805180830381865afa158015611f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6391906143d5565b506001600160a01b038b16600090815260086020908152604091829020805460018201805485518186028101860190965280865260f083901b9f506201000090920460e81b9d5094955090939183018282801561200f57602002820191906000526020600020906000905b82829054906101000a900460ff166005811115611fed57611fed613c8a565b815260206001928301818104948501949093039092029101808411611fce5790505b5050600c54604051632222c8a160e21b8152949c506001600160a01b03169363888b2284935061205492508f91506004016001600160a01b0391909116815260200190565b602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209591906140f2565b6001600160a01b03808d16600090815260096020526040902054600284018054939a5091169750906120c6906140a5565b80601f01602080910402602001604051908101604052809291908181526020018280546120f2906140a5565b801561213f5780601f106121145761010080835404028352916020019161213f565b820191906000526020600020905b81548152906001019060200180831161212257829003601f168201915b50505050509450806003018054612155906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612181906140a5565b80156121ce5780601f106121a3576101008083540402835291602001916121ce565b820191906000526020600020905b8154815290600101906020018083116121b157829003601f168201915b505050505093508060040160029054906101000a900460ff169250509295989b9194979a5092959850565b6060600b80548060200260200160405190810160405280929190818152602001828054801561173e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611720575050505050905090565b61226233612be0565b565b61226233612e84565b600061227881612bd6565b6001600160a01b0382166122c95760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff166123315760405162461bcd60e51b815260206004820152601e60248201527f5665726966696572206e6f742063757272656e746c7920616c6c6f776564000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19169055565b60008281526020819052604090206001015461236e81612bd6565b6110e98383612e19565b600061238381612bd6565b6001600160f01b0319831660009081526006602090815260408083206001600160e81b0319861684529091529020546001600160a01b03166110e981612e84565b6001600160a01b03811660009081526008602090815260408083208054600182018054845181870281018701909552808552879660f084901b966201000090940460e81b956060959194859487948594879490939092919083018282801561247b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561245957612459613c8a565b81526020600192830181810494850194909303909202910180841161243a5790505b505050505096508060040160009054906101000a900460ff169550600960008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031694508060020180546124e0906140a5565b80601f016020809104026020016040519081016040528092919081815260200182805461250c906140a5565b80156125595780601f1061252e57610100808354040283529160200191612559565b820191906000526020600020905b81548152906001019060200180831161253c57829003601f168201915b5050505050935080600301805461256f906140a5565b80601f016020809104026020016040519081016040528092919081815260200182805461259b906140a5565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b505050505092508060040160029054906101000a900460ff169150509193959799909294969850565b604080516020810190915260008082525b88518160ff161015612697576000898260ff168151811061264557612645613f31565b602002602001015190508281600001518260200151836040015160405160200161267294939291906143f9565b604051602081830303815290604052925050808061268f90614086565b915050612622565b5060008180519060200120905060008c8c8c848c8c8c6040516020016126c39796959493929190614457565b6040516020818303038152906040528051906020012090506000600180836040516020016126f29291906142d6565b60408051601f198184030181528282528051602091820120600084529083018083525260ff8a1690820152606081018890526080810187905260a0016020604051602081039080840390855afa158015612750573d6000803e3d6000fd5b5050506020604051035190508d6001600160a01b0316816001600160a01b03161461278e5760405163331e1b8160e21b81526004016105b590614351565b61279c8d8d8d8d8d8d61053b565b5050505050505050505050505050565b60006127b781612bd6565b6127c26000836110c4565b6127cd600033612353565b6040516001600160a01b0383169033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600060018360400151600581111561282357612823613c8a565b0361294157600d548351602085015160405163fbb87f9760e01b815260009384936001600160a01b039091169263fbb87f97926128649291906004016144d7565b600060405180830381865afa158015612881573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128a99190810190614553565b50915091506128d0826001600160a01b03166000908152600a602052604090205460ff1690565b61292e5760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c696420454d5020636572746966696361746500000000000000000060648201526084016105b5565b805160a090910151909590945092505050565b60008360400151600581111561295957612959613c8a565b03612a7757600d548351602085015160405163055b37fb60e51b815260009384936001600160a01b039091169263ab66ff609261299a9291906004016144d7565b600060405180830381865afa1580156129b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129df91908101906146fd565b5091509150612a06826001600160a01b03166000908152600a602052604090205460ff1690565b612a645760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c69642043504f20636572746966696361746500000000000000000060648201526084016105b5565b8051604090910151909590945092505050565b600d548351602085015160405163fab285c960e01b815260009384936001600160a01b039091169263fab285c992612ab39291906004016144d7565b600060405180830381865afa158015612ad0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612af891908101906146fd565b5091509150612b1f826001600160a01b03166000908152600a602052604090205460ff1690565b612a645760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601960448201527f496e76616c6964204f746865722063657274696669636174650000000000000060648201526084016105b5565b600081604051602001612b909190614755565b6040516020818303038152906040528051906020012083604051602001612bb79190614755565b6040516020818303038152906040528051906020012014905092915050565b611a618133613502565b6001600160a01b03811660009081526002602052604081208054612c03906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2f906140a5565b8015612c7c5780601f10612c5157610100808354040283529160200191612c7c565b820191906000526020600020905b815481529060010190602001808311612c5f57829003601f168201915b505050505090508051600003612ce557604051639d8b847760e01b815260206004820152602760248201527f43616e6e6f742064656c657465206e6f6465207468617420646f6573206e6f746044820152661032bc34b9ba1760c91b60648201526084016105b5565b6000600382604051612cf79190614755565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526002909152908120612d38916135ef565b816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d6604051612d7b90602080825260009082015260400190565b60405180910390a25050565b6000612d938383611b23565b612e11576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612dc93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610535565b506000610535565b6000612e258383611b23565b15612e11576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610535565b6001600160a01b0381811660009081526009602052604090205416612f2657604051634523c97f60e01b815260206004820152604b60248201527f43616e6e6f742064656c657465207061727479207468617420646f6573206e6f60448201527f742065786973742e204e6f206f70657261746f7220666f756e6420666f72206760648201526a34bb32b7103830b93a3c9760a91b608482015260a4016105b5565b6001600160a01b038116600090815260096020908152604080832080546001600160a01b031916905560088252808320815161012081018352815460f081901b6001600160f01b031916825262010000900460e81b6001600160e81b0319168185015260018201805484518187028101870186528181529295939486019383018282801561300357602002820191906000526020600020906000905b82829054906101000a900460ff166005811115612fe157612fe1613c8a565b815260206001928301818104948501949093039092029101808411612fc25790505b5050505050815260200160028201805461301c906140a5565b80601f0160208091040260200160405190810160405280929190818152602001828054613048906140a5565b80156130955780601f1061306a57610100808354040283529160200191613095565b820191906000526020600020905b81548152906001019060200180831161307857829003601f168201915b505050505081526020016003820180546130ae906140a5565b80601f01602080910402602001604051908101604052809291908181526020018280546130da906140a5565b80156131275780601f106130fc57610100808354040283529160200191613127565b820191906000526020600020905b81548152906001019060200180831161310a57829003601f168201915b5050509183525050600482015460209091019060ff16600381111561314e5761314e613c8a565b600381111561315f5761315f613c8a565b81526020016004820160019054906101000a900460ff16600281111561318757613187613c8a565b600281111561319857613198613c8a565b8152600482015462010000900460ff16151560208083019190915260059092015460409182015282516001600160f01b031916600090815260068352818120848401516001600160e81b0319168252835281812080546001600160a01b03191690556001600160a01b038616815260089092528120805464ffffffffff191681559192506132296001830182613629565b6132376002830160006135ef565b6132456003830160006135ef565b5060048101805462ffffff191690556000600590910155610100810151600b8054909190811061327757613277613f31565b6000918252602080832090910180546001600160a01b03191690556001600160a01b03841680835260078252604092839020805460ff19169055835191840151848401516060860151608087015160a088015160c089015160e08a0151985196987ff1cf4c42833aa61e1c774181a5389a7b164a71351b75cf37a76762f31b17073998612d7b9890979695949392919061421a565b805160000361338457604051639d8b847760e01b815260206004820152603c60248201527f43616e6e6f742073657420656d70747920646f6d61696e206e616d652e20557360448201527f652064656c6574654e6f6465206d6574686f6420696e73746561642e0000000060648201526084016105b5565b6003816040516133949190614755565b9081526040519081900360200190205460ff16156133f55760405163f1f1b1c760e01b815260206004820152601f60248201527f446f6d61696e206e616d6520616c726561647920726567697374657265642e0060448201526064016105b5565b60016003826040516134079190614755565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526004909152205460ff1661349157600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600460209081526040808320805460ff19166001179055600290915290206134c8828261415b565b50816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d682604051612d7b9190613c77565b61350c8282611b23565b6110c05760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105b5565b82805482825590600052602060002090601f016020900481019282156135df5791602002820160005b838211156135b057835183826101000a81548160ff0219169083600581111561358f5761358f613c8a565b02179055509260200192600101602081600001049283019260010302613564565b80156135dd5782816101000a81549060ff02191690556001016020816000010492830192600103026135b0565b505b506135eb92915061364a565b5090565b5080546135fb906140a5565b6000825580601f1061360b575050565b601f016020900490600052602060002090810190611a61919061364a565b50805460008255601f016020900490600052602060002090810190611a6191905b5b808211156135eb576000815560010161364b565b60006020828403121561367157600080fd5b81356001600160e01b03198116811461368957600080fd5b9392505050565b80356001600160f01b0319811681146136a857600080fd5b919050565b80356001600160e81b0319811681146136a857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156136fd576136fd6136c5565b60405290565b60405160c081016001600160401b03811182821017156136fd576136fd6136c5565b604051601f8201601f191681016001600160401b038111828210171561374d5761374d6136c5565b604052919050565b60006001600160401b0382111561376e5761376e6136c5565b50601f01601f191660200190565b600082601f83011261378d57600080fd5b81356137a061379b82613755565b613725565b8181528460208386010111156137b557600080fd5b816020850160208301376000918101602001919091529392505050565b8035600681106136a857600080fd5b600082601f8301126137f257600080fd5b813560206001600160401b038083111561380e5761380e6136c5565b8260051b61381d838201613725565b938452858101830193838101908886111561383757600080fd5b84880192505b858310156138df578235848111156138555760008081fd5b88016060818b03601f190181131561386d5760008081fd5b6138756136db565b87830135878111156138875760008081fd5b6138958d8a8387010161377c565b825250604080840135888111156138ac5760008081fd5b6138ba8e8b8388010161377c565b8a840152506138ca8385016137d2565b9082015284525050918401919084019061383d565b98975050505050505050565b6001600160a01b0381168114611a6157600080fd5b80356136a8816138eb565b60008060008060008060c0878903121561392457600080fd5b61392d87613690565b955061393b602088016136ad565b945060408701356001600160401b038082111561395757600080fd5b6139638a838b016137e1565b955060608901359150613975826138eb565b9093506080880135908082111561398b57600080fd5b6139978a838b0161377c565b935060a08901359150808211156139ad57600080fd5b506139ba89828a0161377c565b9150509295509295509295565b6000602082840312156139d957600080fd5b5035919050565b6000602082840312156139f257600080fd5b8135613689816138eb565b60008060408385031215613a1057600080fd5b823591506020830135613a22816138eb565b809150509250929050565b600060208284031215613a3f57600080fd5b613689826137d2565b6020808252825182820181905260009190848201906040850190845b81811015613a895783516001600160a01b031683529284019291840191600101613a64565b50909695505050505050565b60ff81168114611a6157600080fd5b80356136a881613a95565b60008060008060808587031215613ac557600080fd5b8435613ad0816138eb565b93506020850135613ae081613a95565b93969395505050506040820135916060013590565b60008060408385031215613b0857600080fd5b613b1183613690565b9150613b1f602084016136ad565b90509250929050565b60005b83811015613b43578181015183820152602001613b2b565b50506000910152565b60008151808452613b64816020860160208601613b28565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090613b9c90830184613b4c565b949350505050565b60008060408385031215613bb757600080fd5b613bc0836137d2565b91506020830135613a22816138eb565b600060208284031215613be257600080fd5b81356001600160401b03811115613bf857600080fd5b613b9c8482850161377c565b600080600080600060a08688031215613c1c57600080fd5b8535613c27816138eb565b945060208601356001600160401b03811115613c4257600080fd5b613c4e8882890161377c565b9450506040860135613c5f81613a95565b94979396509394606081013594506080013592915050565b6020815260006136896020830184613b4c565b634e487b7160e01b600052602160045260246000fd5b60068110613cb057613cb0613c8a565b9052565b60008151808452602080850194506020840160005b83811015613cec57613cdc878351613ca0565b9582019590820190600101613cc9565b509495945050505050565b60048110613cb057613cb0613c8a565b6001600160a01b038b811682526001600160f01b03198b1660208301526001600160e81b03198a16604083015261014060608301819052600091613d4d8483018c613cb4565b9150613d5c608085018b613cf7565b881660a084015282810360c0840152613d758188613b4c565b905082810360e0840152613d898187613b4c565b9415156101008401525050610120015298975050505050505050565b6001600160a01b038a811682526001600160f01b03198a1660208301526001600160e81b03198916604083015261012060608301819052600091613deb8483018b613cb4565b9150613dfa608085018a613cf7565b871660a084015282810360c0840152613e138187613b4c565b905082810360e0840152613e278186613b4c565b9150508215156101008301529a9950505050505050505050565b6000806000806000806000806000806101408b8d031215613e6157600080fd5b613e6a8b613900565b9950613e7860208c01613690565b9850613e8660408c016136ad565b975060608b01356001600160401b0380821115613ea257600080fd5b613eae8e838f016137e1565b9850613ebc60808e01613900565b975060a08d0135915080821115613ed257600080fd5b613ede8e838f0161377c565b965060c08d0135915080821115613ef457600080fd5b50613f018d828e0161377c565b945050613f1060e08c01613aa4565b92506101008b013591506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b600082601f830112613f5857600080fd5b8151613f6661379b82613755565b818152846020838601011115613f7b57600080fd5b613b9c826020830160208701613b28565b600060208284031215613f9e57600080fd5b81516001600160401b0380821115613fb557600080fd5b9083019060408286031215613fc957600080fd5b604051604081018181108382111715613fe457613fe46136c5565b604052825182811115613ff657600080fd5b61400287828601613f47565b82525060208301518281111561401757600080fd5b61402387828601613f47565b60208301525095945050505050565b61403c8183613ca0565b604060208201819052601490820152734e6f742061637469766520696e206f7261636c6560601b6060820152608001919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff810361409c5761409c614070565b60010192915050565b600181811c908216806140b957607f821691505b6020821081036140d957634e487b7160e01b600052602260045260246000fd5b50919050565b8181038181111561053557610535614070565b60006020828403121561410457600080fd5b81516004811061368957600080fd5b601f821115611122576000816000526020600020601f850160051c8101602086101561413c5750805b601f850160051c820191505b8181101561183957828155600101614148565b81516001600160401b03811115614174576141746136c5565b6141888161418284546140a5565b84614113565b602080601f8311600181146141bd57600084156141a55750858301515b600019600386901b1c1916600185901b178555611839565b600085815260208120601f198616915b828110156141ec578886015182559484019460019091019084016141cd565b508582101561420a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160f01b0319891681526001600160e81b031988166020820152610100604082018190526000906142508382018a613cb4565b905082810360608401526142648189613b4c565b905082810360808401526142788188613b4c565b91505061428860a0830186613cf7565b6003841061429857614298613c8a565b8360c083015282151560e08301529998505050505050505050565b600063ffffffff8083168181036142cc576142cc614070565b6001019392505050565b60008084546142e4816140a5565b600182811680156142fc576001811461431157614340565b60ff1984168752821515830287019450614340565b8860005260208060002060005b858110156143375781548a82015290840190820161431e565b50505082870194505b505050938152602001949350505050565b6020808252602c908201527f5369676e657220616e642070726f76696465642070617274792061646472657360408201526b39903234b33332b932b73a1760a11b606082015260800190565b6bffffffffffffffffffffffff198360601b168152600082516143c7816014850160208701613b28565b919091016014019392505050565b600080604083850312156143e857600080fd5b505080516020909101519092909150565b6000855161440b818460208a01613b28565b85519083019061441f818360208a01613b28565b8551910190614432818360208901613b28565b016006841061444357614443613c8a565b60f89390931b835250506001019392505050565b6001600160601b0319606089811b821683526001600160f01b0319891660148401526001600160e81b0319881660168401526019830187905285901b16603982015282516000906144af81604d850160208801613b28565b8351908301906144c681604d840160208801613b28565b01604d019998505050505050505050565b6040815260006144ea6040830185613b4c565b82810360208401526144fc8185613b4c565b95945050505050565b80516136a8816138eb565b60006060828403121561452257600080fd5b61452a6136db565b90508151815260208201516020820152604082015161454881613a95565b604082015292915050565b600080600060a0848603121561456857600080fd5b8351614573816138eb565b60208501519093506001600160401b038082111561459057600080fd5b9085019060c082880312156145a457600080fd5b6145ac613703565b8251828111156145bb57600080fd5b6145c789828601613f47565b8252506020830151828111156145dc57600080fd5b6145e889828601613f47565b60208301525060408301518281111561460057600080fd5b61460c89828601613f47565b60408301525060608301518281111561462457600080fd5b61463089828601613f47565b60608301525060808301518281111561464857600080fd5b61465489828601613f47565b60808301525061466660a08401614505565b60a082015280945050505061467e8560408601614510565b90509250925092565b60006060828403121561469957600080fd5b6146a16136db565b905081516001600160401b03808211156146ba57600080fd5b6146c685838601613f47565b835260208401519150808211156146dc57600080fd5b506146e984828501613f47565b6020830152506040820151614548816138eb565b600080600060a0848603121561471257600080fd5b835161471d816138eb565b60208501519093506001600160401b0381111561473957600080fd5b61474586828701614687565b92505061467e8560408601614510565b60008251614767818460208701613b28565b919091019291505056fea26469706673582212206a5a68b859409215848175eb1256be8c1771e50aaad16b95765e3d8b6d76fe4264736f6c63430008180033",
  "devdoc": {
    "errors": {
      "AccessControlBadConfirmation()": [
        {
          "details": "The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."
        }
      ],
      "AccessControlUnauthorizedAccount(address,bytes32)": [
        {
          "details": "The `account` is missing a role."
        }
      ]
    },
    "events": {
      "RoleAdminChanged(bytes32,bytes32,bytes32)": {
        "details": "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."
      },
      "RoleGranted(bytes32,address,address)": {
        "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."
      },
      "RoleRevoked(bytes32,address,address)": {
        "details": "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`)"
      }
    },
    "kind": "dev",
    "methods": {
      "getRoleAdmin(bytes32)": {
        "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
      },
      "grantRole(bytes32,address)": {
        "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
      },
      "hasRole(bytes32,address)": {
        "details": "Returns `true` if `account` has been granted `role`."
      },
      "renounceRole(bytes32,address)": {
        "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
      },
      "revokeRole(bytes32,address)": {
        "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
      },
      "supportsInterface(bytes4)": {
        "details": "See {IERC165-supportsInterface}."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 26,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "_roles",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_bytes32,t_struct(RoleData)21_storage)"
      },
      {
        "astId": 639,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "prefix",
        "offset": 0,
        "slot": "1",
        "type": "t_string_storage"
      },
      {
        "astId": 643,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "nodeOf",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_string_storage)"
      },
      {
        "astId": 647,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueDomains",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_string_memory_ptr,t_bool)"
      },
      {
        "astId": 651,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueOperators",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 654,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "operators",
        "offset": 0,
        "slot": "5",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 698,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueParties",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_bytes2,t_mapping(t_bytes3,t_address))"
      },
      {
        "astId": 702,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniquePartyAddresses",
        "offset": 0,
        "slot": "7",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 707,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "partyOf",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_struct(PartyDetails)692_storage)"
      },
      {
        "astId": 711,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "operatorOf",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 715,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "allowedCertificateVerifiers",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 718,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "parties",
        "offset": 0,
        "slot": "11",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 721,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "paymentManager",
        "offset": 0,
        "slot": "12",
        "type": "t_contract(IOcnPaymentManager)625"
      },
      {
        "astId": 724,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "certificateVerifier",
        "offset": 0,
        "slot": "13",
        "type": "t_contract(ICertificateVerifier)2520"
      },
      {
        "astId": 730,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "roleOracle",
        "offset": 0,
        "slot": "14",
        "type": "t_mapping(t_enum(Role)661,t_contract(IProviderOracle)2542)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_array(t_enum(Role)661)dyn_storage": {
        "base": "t_enum(Role)661",
        "encoding": "dynamic_array",
        "label": "enum OcnRegistry.Role[]",
        "numberOfBytes": "32"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes2": {
        "encoding": "inplace",
        "label": "bytes2",
        "numberOfBytes": "2"
      },
      "t_bytes3": {
        "encoding": "inplace",
        "label": "bytes3",
        "numberOfBytes": "3"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_contract(ICertificateVerifier)2520": {
        "encoding": "inplace",
        "label": "contract ICertificateVerifier",
        "numberOfBytes": "20"
      },
      "t_contract(IOcnPaymentManager)625": {
        "encoding": "inplace",
        "label": "contract IOcnPaymentManager",
        "numberOfBytes": "20"
      },
      "t_contract(IProviderOracle)2542": {
        "encoding": "inplace",
        "label": "contract IProviderOracle",
        "numberOfBytes": "20"
      },
      "t_enum(CvStatus)528": {
        "encoding": "inplace",
        "label": "enum IOcnCvManager.CvStatus",
        "numberOfBytes": "1"
      },
      "t_enum(PaymentStatus)538": {
        "encoding": "inplace",
        "label": "enum IOcnPaymentManager.PaymentStatus",
        "numberOfBytes": "1"
      },
      "t_enum(Role)661": {
        "encoding": "inplace",
        "label": "enum OcnRegistry.Role",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_address)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_string_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => string)",
        "numberOfBytes": "32",
        "value": "t_string_storage"
      },
      "t_mapping(t_address,t_struct(PartyDetails)692_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct OcnRegistry.PartyDetails)",
        "numberOfBytes": "32",
        "value": "t_struct(PartyDetails)692_storage"
      },
      "t_mapping(t_bytes2,t_mapping(t_bytes3,t_address))": {
        "encoding": "mapping",
        "key": "t_bytes2",
        "label": "mapping(bytes2 => mapping(bytes3 => address))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_bytes3,t_address)"
      },
      "t_mapping(t_bytes3,t_address)": {
        "encoding": "mapping",
        "key": "t_bytes3",
        "label": "mapping(bytes3 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_bytes32,t_struct(RoleData)21_storage)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => struct AccessControl.RoleData)",
        "numberOfBytes": "32",
        "value": "t_struct(RoleData)21_storage"
      },
      "t_mapping(t_enum(Role)661,t_contract(IProviderOracle)2542)": {
        "encoding": "mapping",
        "key": "t_enum(Role)661",
        "label": "mapping(enum OcnRegistry.Role => contract IProviderOracle)",
        "numberOfBytes": "32",
        "value": "t_contract(IProviderOracle)2542"
      },
      "t_mapping(t_string_memory_ptr,t_bool)": {
        "encoding": "mapping",
        "key": "t_string_memory_ptr",
        "label": "mapping(string => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_string_memory_ptr": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(PartyDetails)692_storage": {
        "encoding": "inplace",
        "label": "struct OcnRegistry.PartyDetails",
        "members": [
          {
            "astId": 671,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "countryCode",
            "offset": 0,
            "slot": "0",
            "type": "t_bytes2"
          },
          {
            "astId": 673,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "partyId",
            "offset": 2,
            "slot": "0",
            "type": "t_bytes3"
          },
          {
            "astId": 677,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "roles",
            "offset": 0,
            "slot": "1",
            "type": "t_array(t_enum(Role)661)dyn_storage"
          },
          {
            "astId": 679,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "name",
            "offset": 0,
            "slot": "2",
            "type": "t_string_storage"
          },
          {
            "astId": 681,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "url",
            "offset": 0,
            "slot": "3",
            "type": "t_string_storage"
          },
          {
            "astId": 684,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "paymentStatus",
            "offset": 0,
            "slot": "4",
            "type": "t_enum(PaymentStatus)538"
          },
          {
            "astId": 687,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "cvStatus",
            "offset": 1,
            "slot": "4",
            "type": "t_enum(CvStatus)528"
          },
          {
            "astId": 689,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "active",
            "offset": 2,
            "slot": "4",
            "type": "t_bool"
          },
          {
            "astId": 691,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "partyIndex",
            "offset": 0,
            "slot": "5",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "192"
      },
      "t_struct(RoleData)21_storage": {
        "encoding": "inplace",
        "label": "struct AccessControl.RoleData",
        "members": [
          {
            "astId": 18,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "hasRole",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_address,t_bool)"
          },
          {
            "astId": 20,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "adminRole",
            "offset": 0,
            "slot": "1",
            "type": "t_bytes32"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}