{
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_registry",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_contractName",
          "type": "bytes32"
        }
      ],
      "name": "getContractFromRegistry",
      "outputs": [
        {
          "internalType": "address",
          "name": "_addr",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "registry",
      "outputs": [
        {
          "internalType": "contract IRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "allSourcePaths": {
    "44": "/home/vscode/.brownie/packages/etherisc/gif-interface@3b0002a/contracts/modules/IRegistry.sol",
    "91": "contracts/shared/WithRegistry.sol"
  },
  "ast": {
    "absolutePath": "contracts/shared/WithRegistry.sol",
    "exportedSymbols": {
      "IRegistry": [
        21750
      ],
      "WithRegistry": [
        15290
      ]
    },
    "id": 15291,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 15172,
        "literals": [
          "solidity",
          "0.8",
          ".2"
        ],
        "nodeType": "PragmaDirective",
        "src": "39:22:91"
      },
      {
        "absolutePath": "/home/vscode/.brownie/packages/etherisc/gif-interface@3b0002a/contracts/modules/IRegistry.sol",
        "file": "@etherisc/gif-interface/contracts/modules/IRegistry.sol",
        "id": 15173,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 15291,
        "sourceUnit": 21751,
        "src": "63:65:91",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "fullyImplemented": true,
        "id": 15290,
        "linearizedBaseContracts": [
          15290
        ],
        "name": "WithRegistry",
        "nameLocation": "139:12:91",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "7b103999",
            "id": 15176,
            "mutability": "immutable",
            "name": "registry",
            "nameLocation": "439:8:91",
            "nodeType": "VariableDeclaration",
            "scope": 15290,
            "src": "412:35:91",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IRegistry_$21750",
              "typeString": "contract IRegistry"
            },
            "typeName": {
              "id": 15175,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 15174,
                "name": "IRegistry",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 21750,
                "src": "412:9:91"
              },
              "referencedDeclaration": 21750,
              "src": "412:9:91",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IRegistry_$21750",
                "typeString": "contract IRegistry"
              }
            },
            "visibility": "public"
          },
          {
            "body": {
              "id": 15189,
              "nodeType": "Block",
              "src": "486:174:91",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 15184,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 15179,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "517:3:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 15180,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "517:10:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "496e7374616e63654f70657261746f7253657276696365",
                              "id": 15182,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "555:25:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_893eee863631637173ead46f1c66388136d13bfeb40cdedfb3bfe4f34f933544",
                                "typeString": "literal_string \"InstanceOperatorService\""
                              },
                              "value": "InstanceOperatorService"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_893eee863631637173ead46f1c66388136d13bfeb40cdedfb3bfe4f34f933544",
                                "typeString": "literal_string \"InstanceOperatorService\""
                              }
                            ],
                            "id": 15181,
                            "name": "getContractFromRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15259,
                            "src": "531:23:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_address_$",
                              "typeString": "function (bytes32) view returns (address)"
                            }
                          },
                          "id": 15183,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "531:50:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "517:64:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4552524f523a41434d2d3030313a4e4f545f494e5354414e43455f4f50455241544f52",
                        "id": 15185,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "595:37:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f3a7f4e2a80289cf210a753ae4c4fe18a01cd7346929f84e6c01ed7adb2558b5",
                          "typeString": "literal_string \"ERROR:ACM-001:NOT_INSTANCE_OPERATOR\""
                        },
                        "value": "ERROR:ACM-001:NOT_INSTANCE_OPERATOR"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f3a7f4e2a80289cf210a753ae4c4fe18a01cd7346929f84e6c01ed7adb2558b5",
                          "typeString": "literal_string \"ERROR:ACM-001:NOT_INSTANCE_OPERATOR\""
                        }
                      ],
                      "id": 15178,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "496:7:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 15186,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "496:146:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15187,
                  "nodeType": "ExpressionStatement",
                  "src": "496:146:91"
                },
                {
                  "id": 15188,
                  "nodeType": "PlaceholderStatement",
                  "src": "652:1:91"
                }
              ]
            },
            "id": 15190,
            "name": "onlyInstanceOperator",
            "nameLocation": "463:20:91",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 15177,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "483:2:91"
            },
            "src": "454:206:91",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 15203,
              "nodeType": "Block",
              "src": "695:161:91",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 15198,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 15193,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "726:3:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 15194,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "726:10:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "4f7261636c6553657276696365",
                              "id": 15196,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "764:15:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b10ffebb48b8cc789ab1dfe7a210b91b4cf99b6d74d0c01c069195f8f6b41b06",
                                "typeString": "literal_string \"OracleService\""
                              },
                              "value": "OracleService"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_b10ffebb48b8cc789ab1dfe7a210b91b4cf99b6d74d0c01c069195f8f6b41b06",
                                "typeString": "literal_string \"OracleService\""
                              }
                            ],
                            "id": 15195,
                            "name": "getContractFromRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15259,
                            "src": "740:23:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_address_$",
                              "typeString": "function (bytes32) view returns (address)"
                            }
                          },
                          "id": 15197,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "740:40:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "726:54:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4552524f523a41434d2d3030343a4e4f545f4f5241434c455f53455256494345",
                        "id": 15199,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "794:34:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_d677f66d7bfec5af2a8d25ec9362c317211e274b91d9b076b38b11583dfd9b36",
                          "typeString": "literal_string \"ERROR:ACM-004:NOT_ORACLE_SERVICE\""
                        },
                        "value": "ERROR:ACM-004:NOT_ORACLE_SERVICE"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_d677f66d7bfec5af2a8d25ec9362c317211e274b91d9b076b38b11583dfd9b36",
                          "typeString": "literal_string \"ERROR:ACM-004:NOT_ORACLE_SERVICE\""
                        }
                      ],
                      "id": 15192,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "705:7:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 15200,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "705:133:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15201,
                  "nodeType": "ExpressionStatement",
                  "src": "705:133:91"
                },
                {
                  "id": 15202,
                  "nodeType": "PlaceholderStatement",
                  "src": "848:1:91"
                }
              ]
            },
            "id": 15204,
            "name": "onlyOracleService",
            "nameLocation": "675:17:91",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 15191,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "692:2:91"
            },
            "src": "666:190:91",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 15217,
              "nodeType": "Block",
              "src": "889:164:91",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 15212,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 15207,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "920:3:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 15208,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "920:10:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "4f7261636c654f776e657253657276696365",
                              "id": 15210,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "958:20:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5370b1b73ce26fa37372cd254d27657dca183642e751f8b80db759067e223649",
                                "typeString": "literal_string \"OracleOwnerService\""
                              },
                              "value": "OracleOwnerService"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_5370b1b73ce26fa37372cd254d27657dca183642e751f8b80db759067e223649",
                                "typeString": "literal_string \"OracleOwnerService\""
                              }
                            ],
                            "id": 15209,
                            "name": "getContractFromRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15259,
                            "src": "934:23:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_address_$",
                              "typeString": "function (bytes32) view returns (address)"
                            }
                          },
                          "id": 15211,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "934:45:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "920:59:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4552524f523a41434d2d3030353a4e4f545f4f5241434c455f4f574e4552",
                        "id": 15213,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "993:32:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_1f95eab606c31d24b7f40608196d82db71c763d923fa962ad1318b437fa4c528",
                          "typeString": "literal_string \"ERROR:ACM-005:NOT_ORACLE_OWNER\""
                        },
                        "value": "ERROR:ACM-005:NOT_ORACLE_OWNER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_1f95eab606c31d24b7f40608196d82db71c763d923fa962ad1318b437fa4c528",
                          "typeString": "literal_string \"ERROR:ACM-005:NOT_ORACLE_OWNER\""
                        }
                      ],
                      "id": 15206,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "899:7:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 15214,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "899:136:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15215,
                  "nodeType": "ExpressionStatement",
                  "src": "899:136:91"
                },
                {
                  "id": 15216,
                  "nodeType": "PlaceholderStatement",
                  "src": "1045:1:91"
                }
              ]
            },
            "id": 15218,
            "name": "onlyOracleOwner",
            "nameLocation": "871:15:91",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 15205,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "886:2:91"
            },
            "src": "862:191:91",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 15231,
              "nodeType": "Block",
              "src": "1087:166:91",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 15226,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 15221,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "1118:3:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 15222,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "1118:10:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "50726f647563744f776e657253657276696365",
                              "id": 15224,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1156:21:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_04eb0524cc50da1dbdab34d277395549b73a25ea653ed26ebf24218d5fe70e69",
                                "typeString": "literal_string \"ProductOwnerService\""
                              },
                              "value": "ProductOwnerService"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_04eb0524cc50da1dbdab34d277395549b73a25ea653ed26ebf24218d5fe70e69",
                                "typeString": "literal_string \"ProductOwnerService\""
                              }
                            ],
                            "id": 15223,
                            "name": "getContractFromRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15259,
                            "src": "1132:23:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_address_$",
                              "typeString": "function (bytes32) view returns (address)"
                            }
                          },
                          "id": 15225,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1132:46:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "1118:60:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4552524f523a41434d2d3030363a4e4f545f50524f445543545f4f574e4552",
                        "id": 15227,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1192:33:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_87c721089aea7fe34f59e6b44cacf11899e62ae1ac955bcd5783ec78cfda9689",
                          "typeString": "literal_string \"ERROR:ACM-006:NOT_PRODUCT_OWNER\""
                        },
                        "value": "ERROR:ACM-006:NOT_PRODUCT_OWNER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_87c721089aea7fe34f59e6b44cacf11899e62ae1ac955bcd5783ec78cfda9689",
                          "typeString": "literal_string \"ERROR:ACM-006:NOT_PRODUCT_OWNER\""
                        }
                      ],
                      "id": 15220,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1097:7:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 15228,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1097:138:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15229,
                  "nodeType": "ExpressionStatement",
                  "src": "1097:138:91"
                },
                {
                  "id": 15230,
                  "nodeType": "PlaceholderStatement",
                  "src": "1245:1:91"
                }
              ]
            },
            "id": 15232,
            "name": "onlyProductOwner",
            "nameLocation": "1068:16:91",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 15219,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1084:2:91"
            },
            "src": "1059:194:91",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 15243,
              "nodeType": "Block",
              "src": "1290:48:91",
              "statements": [
                {
                  "expression": {
                    "id": 15241,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 15237,
                      "name": "registry",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15176,
                      "src": "1300:8:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IRegistry_$21750",
                        "typeString": "contract IRegistry"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 15239,
                          "name": "_registry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15234,
                          "src": "1321:9:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 15238,
                        "name": "IRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 21750,
                        "src": "1311:9:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IRegistry_$21750_$",
                          "typeString": "type(contract IRegistry)"
                        }
                      },
                      "id": 15240,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1311:20:91",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IRegistry_$21750",
                        "typeString": "contract IRegistry"
                      }
                    },
                    "src": "1300:31:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IRegistry_$21750",
                      "typeString": "contract IRegistry"
                    }
                  },
                  "id": 15242,
                  "nodeType": "ExpressionStatement",
                  "src": "1300:31:91"
                }
              ]
            },
            "id": 15244,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15235,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15234,
                  "mutability": "mutable",
                  "name": "_registry",
                  "nameLocation": "1279:9:91",
                  "nodeType": "VariableDeclaration",
                  "scope": 15244,
                  "src": "1271:17:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15233,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1271:7:91",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1270:19:91"
            },
            "returnParameters": {
              "id": 15236,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1290:0:91"
            },
            "scope": 15290,
            "src": "1259:79:91",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 15258,
              "nodeType": "Block",
              "src": "1484:60:91",
              "statements": [
                {
                  "expression": {
                    "id": 15256,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 15251,
                      "name": "_addr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15249,
                      "src": "1494:5:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 15254,
                          "name": "_contractName",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15246,
                          "src": "1523:13:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 15252,
                          "name": "registry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15176,
                          "src": "1502:8:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IRegistry_$21750",
                            "typeString": "contract IRegistry"
                          }
                        },
                        "id": 15253,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "getContract",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 21723,
                        "src": "1502:20:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_bytes32_$returns$_t_address_$",
                          "typeString": "function (bytes32) view external returns (address)"
                        }
                      },
                      "id": 15255,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1502:35:91",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1494:43:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 15257,
                  "nodeType": "ExpressionStatement",
                  "src": "1494:43:91"
                }
              ]
            },
            "functionSelector": "a5b25e71",
            "id": 15259,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getContractFromRegistry",
            "nameLocation": "1353:23:91",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15247,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15246,
                  "mutability": "mutable",
                  "name": "_contractName",
                  "nameLocation": "1385:13:91",
                  "nodeType": "VariableDeclaration",
                  "scope": 15259,
                  "src": "1377:21:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15245,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1377:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1376:23:91"
            },
            "returnParameters": {
              "id": 15250,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15249,
                  "mutability": "mutable",
                  "name": "_addr",
                  "nameLocation": "1473:5:91",
                  "nodeType": "VariableDeclaration",
                  "scope": 15259,
                  "src": "1465:13:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15248,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1465:7:91",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1464:15:91"
            },
            "scope": 15290,
            "src": "1344:200:91",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 15276,
              "nodeType": "Block",
              "src": "1699:79:91",
              "statements": [
                {
                  "expression": {
                    "id": 15274,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 15268,
                      "name": "_addr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15266,
                      "src": "1709:5:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 15271,
                          "name": "_release",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15261,
                          "src": "1747:8:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        {
                          "id": 15272,
                          "name": "_contractName",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15263,
                          "src": "1757:13:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          },
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 15269,
                          "name": "registry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15176,
                          "src": "1717:8:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IRegistry_$21750",
                            "typeString": "contract IRegistry"
                          }
                        },
                        "id": 15270,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "getContractInRelease",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 21716,
                        "src": "1717:29:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                          "typeString": "function (bytes32,bytes32) view external returns (address)"
                        }
                      },
                      "id": 15273,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1717:54:91",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1709:62:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 15275,
                  "nodeType": "ExpressionStatement",
                  "src": "1709:62:91"
                }
              ]
            },
            "id": 15277,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getContractInReleaseFromRegistry",
            "nameLocation": "1559:32:91",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15264,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15261,
                  "mutability": "mutable",
                  "name": "_release",
                  "nameLocation": "1600:8:91",
                  "nodeType": "VariableDeclaration",
                  "scope": 15277,
                  "src": "1592:16:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15260,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1592:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15263,
                  "mutability": "mutable",
                  "name": "_contractName",
                  "nameLocation": "1618:13:91",
                  "nodeType": "VariableDeclaration",
                  "scope": 15277,
                  "src": "1610:21:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15262,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1610:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1591:41:91"
            },
            "returnParameters": {
              "id": 15267,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15266,
                  "mutability": "mutable",
                  "name": "_addr",
                  "nameLocation": "1688:5:91",
                  "nodeType": "VariableDeclaration",
                  "scope": 15277,
                  "src": "1680:13:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15265,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1680:7:91",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1679:15:91"
            },
            "scope": 15290,
            "src": "1550:228:91",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 15288,
              "nodeType": "Block",
              "src": "1859:49:91",
              "statements": [
                {
                  "expression": {
                    "id": 15286,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 15282,
                      "name": "_release",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15280,
                      "src": "1869:8:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "expression": {
                          "id": 15283,
                          "name": "registry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15176,
                          "src": "1880:8:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IRegistry_$21750",
                            "typeString": "contract IRegistry"
                          }
                        },
                        "id": 15284,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "getRelease",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 21728,
                        "src": "1880:19:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$__$returns$_t_bytes32_$",
                          "typeString": "function () view external returns (bytes32)"
                        }
                      },
                      "id": 15285,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1880:21:91",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "1869:32:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "id": 15287,
                  "nodeType": "ExpressionStatement",
                  "src": "1869:32:91"
                }
              ]
            },
            "id": 15289,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getReleaseFromRegistry",
            "nameLocation": "1793:22:91",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15278,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1815:2:91"
            },
            "returnParameters": {
              "id": 15281,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15280,
                  "mutability": "mutable",
                  "name": "_release",
                  "nameLocation": "1849:8:91",
                  "nodeType": "VariableDeclaration",
                  "scope": 15289,
                  "src": "1841:16:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15279,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1841:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1840:18:91"
            },
            "scope": 15290,
            "src": "1784:124:91",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 15291,
        "src": "130:1780:91"
      }
    ],
    "src": "39:1872:91"
  },
  "bytecode": "60a060405234801561001057600080fd5b5060405161023e38038061023e83398101604081905261002f91610044565b60601b6001600160601b031916608052610072565b600060208284031215610055578081fd5b81516001600160a01b038116811461006b578182fd5b9392505050565b60805160601c6101a9610095600039600081816040015260a501526101a96000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80637b1039991461003b578063a5b25e711461007e575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006261008c36600461015b565b604051631c2d8fb360e31b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e16c7d989060240160206040518083038186803b1580156100ef57600080fd5b505afa158015610103573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610127919061012d565b92915050565b60006020828403121561013e578081fd5b81516001600160a01b0381168114610154578182fd5b9392505050565b60006020828403121561016c578081fd5b503591905056fea2646970667358221220c1e80ed4b22c4f2e7a4f1be7b6d1c1ee3a9d8bae3c2d95ac0c8a08b37df6123d64736f6c63430008020033",
  "bytecodeSha1": "8d5510cc7335e260f6bb638f30a0c23670127c23",
  "compiler": {
    "evm_version": "istanbul",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "version": "0.8.2+commit.661d1103"
  },
  "contractName": "WithRegistry",
  "coverageMap": {
    "branches": {
      "44": {},
      "91": {}
    },
    "statements": {
      "44": {},
      "91": {
        "WithRegistry.getContractFromRegistry": {
          "0": [
            1494,
            1537
          ]
        }
      }
    }
  },
  "dependencies": [
    "etherisc/gif-interface@3b0002a/IRegistry"
  ],
  "deployedBytecode": "608060405234801561001057600080fd5b50600436106100365760003560e01c80637b1039991461003b578063a5b25e711461007e575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006261008c36600461015b565b604051631c2d8fb360e31b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e16c7d989060240160206040518083038186803b1580156100ef57600080fd5b505afa158015610103573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610127919061012d565b92915050565b60006020828403121561013e578081fd5b81516001600160a01b0381168114610154578182fd5b9392505050565b60006020828403121561016c578081fd5b503591905056fea2646970667358221220c1e80ed4b22c4f2e7a4f1be7b6d1c1ee3a9d8bae3c2d95ac0c8a08b37df6123d64736f6c63430008020033",
  "deployedSourceMap": "130:1780:91:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;412:35;;;;;;;;-1:-1:-1;;;;;688:32:103;;;670:51;;658:2;643:18;412:35:91;;;;;;;1344:200;;;;;;:::i;:::-;1502:35;;-1:-1:-1;;;1502:35:91;;;;;878:25:103;;;1465:13:91;;1502:8;-1:-1:-1;;;;;1502:20:91;;;;851:18:103;;1502:35:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1494:43;1344:200;-1:-1:-1;;1344:200:91:o;14:310:103:-;;137:2;125:9;116:7;112:23;108:32;105:2;;;158:6;150;143:22;105:2;189:16;;-1:-1:-1;;;;;234:31:103;;224:42;;214:2;;285:6;277;270:22;214:2;313:5;95:229;-1:-1:-1;;;95:229:103:o;329:190::-;;441:2;429:9;420:7;416:23;412:32;409:2;;;462:6;454;447:22;409:2;-1:-1:-1;490:23:103;;399:120;-1:-1:-1;399:120:103:o",
  "language": "Solidity",
  "natspec": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "offset": [
    130,
    1910
  ],
  "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7B103999 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xA5B25E71 EQ PUSH2 0x7E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x62 PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x62 PUSH2 0x8C CALLDATASIZE PUSH1 0x4 PUSH2 0x15B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1C2D8FB3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0xE16C7D98 SWAP1 PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x103 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x127 SWAP2 SWAP1 PUSH2 0x12D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x13E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x154 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16C JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC1 0xE8 0xE 0xD4 0xB2 0x2C 0x4F 0x2E PUSH27 0x4F1BE7B6D1C1EE3A9D8BAE3C2D95AC0C8A08B37DF6123D64736F6C PUSH4 0x43000802 STOP CALLER ",
  "pcMap": {
    "0": {
      "offset": [
        130,
        1910
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x80"
    },
    "2": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x40"
    },
    "4": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "MSTORE",
      "path": "91"
    },
    "5": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "CALLVALUE",
      "path": "91"
    },
    "6": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "DUP1",
      "path": "91"
    },
    "7": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "ISZERO",
      "path": "91"
    },
    "8": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x10"
    },
    "11": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "JUMPI",
      "path": "91"
    },
    "12": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x0"
    },
    "14": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "DUP1",
      "path": "91"
    },
    "15": {
      "dev": "Cannot send ether to nonpayable function",
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "REVERT",
      "path": "91"
    },
    "16": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "17": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "POP",
      "path": "91"
    },
    "18": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x4"
    },
    "20": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "CALLDATASIZE",
      "path": "91"
    },
    "21": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "LT",
      "path": "91"
    },
    "22": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x36"
    },
    "25": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "JUMPI",
      "path": "91"
    },
    "26": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x0"
    },
    "28": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "CALLDATALOAD",
      "path": "91"
    },
    "29": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0xE0"
    },
    "31": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "SHR",
      "path": "91"
    },
    "32": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "DUP1",
      "path": "91"
    },
    "33": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH4",
      "path": "91",
      "value": "0x7B103999"
    },
    "38": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "EQ",
      "path": "91"
    },
    "39": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x3B"
    },
    "42": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "JUMPI",
      "path": "91"
    },
    "43": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "DUP1",
      "path": "91"
    },
    "44": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH4",
      "path": "91",
      "value": "0xA5B25E71"
    },
    "49": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "EQ",
      "path": "91"
    },
    "50": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x7E"
    },
    "53": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "JUMPI",
      "path": "91"
    },
    "54": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "55": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x0"
    },
    "57": {
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "DUP1",
      "path": "91"
    },
    "58": {
      "first_revert": true,
      "fn": null,
      "offset": [
        130,
        1910
      ],
      "op": "REVERT",
      "path": "91"
    },
    "59": {
      "offset": [
        412,
        447
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "60": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x62"
    },
    "63": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "PUSH32",
      "path": "91",
      "value": "0x0"
    },
    "96": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "DUP2",
      "path": "91"
    },
    "97": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "JUMP",
      "path": "91"
    },
    "98": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "99": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x40"
    },
    "101": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "MLOAD",
      "path": "91"
    },
    "102": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "104": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "106": {
      "op": "PUSH1",
      "value": "0xA0"
    },
    "108": {
      "op": "SHL"
    },
    "109": {
      "op": "SUB"
    },
    "110": {
      "op": "SWAP1"
    },
    "111": {
      "op": "SWAP2"
    },
    "112": {
      "op": "AND"
    },
    "113": {
      "op": "DUP2"
    },
    "114": {
      "op": "MSTORE"
    },
    "115": {
      "op": "PUSH1",
      "value": "0x20"
    },
    "117": {
      "op": "ADD"
    },
    "118": {
      "offset": [
        412,
        447
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x40"
    },
    "120": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "MLOAD",
      "path": "91"
    },
    "121": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "DUP1",
      "path": "91"
    },
    "122": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "SWAP2",
      "path": "91"
    },
    "123": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "SUB",
      "path": "91"
    },
    "124": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "SWAP1",
      "path": "91"
    },
    "125": {
      "fn": null,
      "offset": [
        412,
        447
      ],
      "op": "RETURN",
      "path": "91"
    },
    "126": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "127": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x62"
    },
    "130": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x8C"
    },
    "133": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "CALLDATASIZE",
      "path": "91"
    },
    "134": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x4"
    },
    "136": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x15B"
    },
    "139": {
      "fn": "WithRegistry.getContractFromRegistry",
      "jump": "i",
      "offset": [
        1344,
        1544
      ],
      "op": "JUMP",
      "path": "91"
    },
    "140": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "141": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "statement": 0,
      "value": "0x40"
    },
    "143": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "MLOAD",
      "path": "91"
    },
    "144": {
      "op": "PUSH4",
      "value": "0x1C2D8FB3"
    },
    "149": {
      "op": "PUSH1",
      "value": "0xE3"
    },
    "151": {
      "op": "SHL"
    },
    "152": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP2",
      "path": "91"
    },
    "153": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "MSTORE",
      "path": "91"
    },
    "154": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x4"
    },
    "156": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP2",
      "path": "91"
    },
    "157": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ADD",
      "path": "91"
    },
    "158": {
      "op": "DUP3"
    },
    "159": {
      "op": "SWAP1"
    },
    "160": {
      "op": "MSTORE"
    },
    "161": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1465,
        1478
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x0"
    },
    "163": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1465,
        1478
      ],
      "op": "SWAP1",
      "path": "91"
    },
    "164": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1510
      ],
      "op": "PUSH32",
      "path": "91",
      "value": "0x0"
    },
    "197": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "199": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "201": {
      "op": "PUSH1",
      "value": "0xA0"
    },
    "203": {
      "op": "SHL"
    },
    "204": {
      "op": "SUB"
    },
    "205": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1522
      ],
      "op": "AND",
      "path": "91"
    },
    "206": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1522
      ],
      "op": "SWAP1",
      "path": "91"
    },
    "207": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1522
      ],
      "op": "PUSH4",
      "path": "91",
      "value": "0xE16C7D98"
    },
    "212": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1522
      ],
      "op": "SWAP1",
      "path": "91"
    },
    "213": {
      "op": "PUSH1",
      "value": "0x24"
    },
    "215": {
      "op": "ADD"
    },
    "216": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x20"
    },
    "218": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x40"
    },
    "220": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "MLOAD",
      "path": "91"
    },
    "221": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP1",
      "path": "91"
    },
    "222": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP4",
      "path": "91"
    },
    "223": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "SUB",
      "path": "91"
    },
    "224": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP2",
      "path": "91"
    },
    "225": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP7",
      "path": "91"
    },
    "226": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP1",
      "path": "91"
    },
    "227": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "EXTCODESIZE",
      "path": "91"
    },
    "228": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ISZERO",
      "path": "91"
    },
    "229": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP1",
      "path": "91"
    },
    "230": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ISZERO",
      "path": "91"
    },
    "231": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0xEF"
    },
    "234": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "JUMPI",
      "path": "91"
    },
    "235": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x0"
    },
    "237": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP1",
      "path": "91"
    },
    "238": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "REVERT",
      "path": "91"
    },
    "239": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "240": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "POP",
      "path": "91"
    },
    "241": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "GAS",
      "path": "91"
    },
    "242": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "STATICCALL",
      "path": "91"
    },
    "243": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ISZERO",
      "path": "91"
    },
    "244": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP1",
      "path": "91"
    },
    "245": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ISZERO",
      "path": "91"
    },
    "246": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x103"
    },
    "249": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "JUMPI",
      "path": "91"
    },
    "250": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "RETURNDATASIZE",
      "path": "91"
    },
    "251": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x0"
    },
    "253": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP1",
      "path": "91"
    },
    "254": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "RETURNDATACOPY",
      "path": "91"
    },
    "255": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "RETURNDATASIZE",
      "path": "91"
    },
    "256": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x0"
    },
    "258": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "REVERT",
      "path": "91"
    },
    "259": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "260": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "POP",
      "path": "91"
    },
    "261": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "POP",
      "path": "91"
    },
    "262": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "POP",
      "path": "91"
    },
    "263": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "POP",
      "path": "91"
    },
    "264": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x40"
    },
    "266": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "MLOAD",
      "path": "91"
    },
    "267": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "RETURNDATASIZE",
      "path": "91"
    },
    "268": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x1F"
    },
    "270": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "NOT",
      "path": "91"
    },
    "271": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x1F"
    },
    "273": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP3",
      "path": "91"
    },
    "274": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ADD",
      "path": "91"
    },
    "275": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "AND",
      "path": "91"
    },
    "276": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP3",
      "path": "91"
    },
    "277": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ADD",
      "path": "91"
    },
    "278": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP1",
      "path": "91"
    },
    "279": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH1",
      "path": "91",
      "value": "0x40"
    },
    "281": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "MSTORE",
      "path": "91"
    },
    "282": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "POP",
      "path": "91"
    },
    "283": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "DUP2",
      "path": "91"
    },
    "284": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "ADD",
      "path": "91"
    },
    "285": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "SWAP1",
      "path": "91"
    },
    "286": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x127"
    },
    "289": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "SWAP2",
      "path": "91"
    },
    "290": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "SWAP1",
      "path": "91"
    },
    "291": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "PUSH2",
      "path": "91",
      "value": "0x12D"
    },
    "294": {
      "fn": "WithRegistry.getContractFromRegistry",
      "jump": "i",
      "offset": [
        1502,
        1537
      ],
      "op": "JUMP",
      "path": "91"
    },
    "295": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1502,
        1537
      ],
      "op": "JUMPDEST",
      "path": "91"
    },
    "296": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1494,
        1537
      ],
      "op": "SWAP3",
      "path": "91"
    },
    "297": {
      "fn": "WithRegistry.getContractFromRegistry",
      "offset": [
        1344,
        1544
      ],
      "op": "SWAP2",
      "path": "91"
    },
    "298": {
      "op": "POP"
    },
    "299": {
      "op": "POP"
    },
    "300": {
      "fn": "WithRegistry.getContractFromRegistry",
      "jump": "o",
      "offset": [
        1344,
        1544
      ],
      "op": "JUMP",
      "path": "91"
    },
    "301": {
      "op": "JUMPDEST"
    },
    "302": {
      "op": "PUSH1",
      "value": "0x0"
    },
    "304": {
      "op": "PUSH1",
      "value": "0x20"
    },
    "306": {
      "op": "DUP3"
    },
    "307": {
      "op": "DUP5"
    },
    "308": {
      "op": "SUB"
    },
    "309": {
      "op": "SLT"
    },
    "310": {
      "op": "ISZERO"
    },
    "311": {
      "op": "PUSH2",
      "value": "0x13E"
    },
    "314": {
      "op": "JUMPI"
    },
    "315": {
      "op": "DUP1"
    },
    "316": {
      "op": "DUP2"
    },
    "317": {
      "op": "REVERT"
    },
    "318": {
      "op": "JUMPDEST"
    },
    "319": {
      "op": "DUP2"
    },
    "320": {
      "op": "MLOAD"
    },
    "321": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "323": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "325": {
      "op": "PUSH1",
      "value": "0xA0"
    },
    "327": {
      "op": "SHL"
    },
    "328": {
      "op": "SUB"
    },
    "329": {
      "op": "DUP2"
    },
    "330": {
      "op": "AND"
    },
    "331": {
      "op": "DUP2"
    },
    "332": {
      "op": "EQ"
    },
    "333": {
      "op": "PUSH2",
      "value": "0x154"
    },
    "336": {
      "op": "JUMPI"
    },
    "337": {
      "op": "DUP2"
    },
    "338": {
      "op": "DUP3"
    },
    "339": {
      "op": "REVERT"
    },
    "340": {
      "op": "JUMPDEST"
    },
    "341": {
      "op": "SWAP4"
    },
    "342": {
      "op": "SWAP3"
    },
    "343": {
      "op": "POP"
    },
    "344": {
      "op": "POP"
    },
    "345": {
      "op": "POP"
    },
    "346": {
      "jump": "o",
      "op": "JUMP"
    },
    "347": {
      "op": "JUMPDEST"
    },
    "348": {
      "op": "PUSH1",
      "value": "0x0"
    },
    "350": {
      "op": "PUSH1",
      "value": "0x20"
    },
    "352": {
      "op": "DUP3"
    },
    "353": {
      "op": "DUP5"
    },
    "354": {
      "op": "SUB"
    },
    "355": {
      "op": "SLT"
    },
    "356": {
      "op": "ISZERO"
    },
    "357": {
      "op": "PUSH2",
      "value": "0x16C"
    },
    "360": {
      "op": "JUMPI"
    },
    "361": {
      "op": "DUP1"
    },
    "362": {
      "op": "DUP2"
    },
    "363": {
      "op": "REVERT"
    },
    "364": {
      "op": "JUMPDEST"
    },
    "365": {
      "op": "POP"
    },
    "366": {
      "op": "CALLDATALOAD"
    },
    "367": {
      "op": "SWAP2"
    },
    "368": {
      "op": "SWAP1"
    },
    "369": {
      "op": "POP"
    },
    "370": {
      "jump": "o",
      "op": "JUMP"
    }
  },
  "sha1": "0275c855d42ca09657d6b42b54ce055dc618badf",
  "source": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.2;\n\nimport \"@etherisc/gif-interface/contracts/modules/IRegistry.sol\";\n\ncontract WithRegistry {\n\n/*\n *  We can consider the registry address as immutable here as it contains the\n *  root data structure for the whole GIF Instance.\n *  We can therefore ensure that a policy flow cannot overwrite the address\n *  neither by chance nor by intention.\n */\n    IRegistry public immutable registry;\n\n    modifier onlyInstanceOperator() {\n        require(\n            msg.sender == getContractFromRegistry(\"InstanceOperatorService\"),\n            \"ERROR:ACM-001:NOT_INSTANCE_OPERATOR\"\n        );\n        _;\n    }\n\n    modifier onlyOracleService() {\n        require(\n            msg.sender == getContractFromRegistry(\"OracleService\"),\n            \"ERROR:ACM-004:NOT_ORACLE_SERVICE\"\n        );\n        _;\n    }\n\n    modifier onlyOracleOwner() {\n        require(\n            msg.sender == getContractFromRegistry(\"OracleOwnerService\"),\n            \"ERROR:ACM-005:NOT_ORACLE_OWNER\"\n        );\n        _;\n    }\n\n    modifier onlyProductOwner() {\n        require(\n            msg.sender == getContractFromRegistry(\"ProductOwnerService\"),\n            \"ERROR:ACM-006:NOT_PRODUCT_OWNER\"\n        );\n        _;\n    }\n\n    constructor(address _registry) {\n        registry = IRegistry(_registry);\n    }\n\n    function getContractFromRegistry(bytes32 _contractName)\n        public\n        // override\n        view\n        returns (address _addr)\n    {\n        _addr = registry.getContract(_contractName);\n    }\n\n    function getContractInReleaseFromRegistry(bytes32 _release, bytes32 _contractName)\n        internal\n        view\n        returns (address _addr)\n    {\n        _addr = registry.getContractInRelease(_release, _contractName);\n    }\n\n    function getReleaseFromRegistry() internal view returns (bytes32 _release) {\n        _release = registry.getRelease();\n    }\n}\n",
  "sourceMap": "130:1780:91:-:0;;;1259:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1300:31;;-1:-1:-1;;;;;;1300:31:91;;;130:1780;;14:310:103;;137:2;125:9;116:7;112:23;108:32;105:2;;;158:6;150;143:22;105:2;189:16;;-1:-1:-1;;;;;234:31:103;;224:42;;214:2;;285:6;277;270:22;214:2;313:5;95:229;-1:-1:-1;;;95:229:103:o;:::-;130:1780:91;;;;;;;;;;;;",
  "sourcePath": "contracts/shared/WithRegistry.sol",
  "type": "contract"
}