{
  "fileName": "App.sol",
  "contractName": "App",
  "source": "pragma solidity ^0.5.0;\n\nimport \"./ImplementationProvider.sol\";\nimport \"./Package.sol\";\nimport \"../upgradeability/AdminUpgradeabilityProxy.sol\";\nimport \"../ownership/Ownable.sol\";\n\n/**\n * @title App\n * @dev Contract for upgradeable applications.\n * It handles the creation of proxies.\n */\ncontract App is OpenZeppelinUpgradesOwnable {\n  /**\n   * @dev Emitted when a new proxy is created.\n   * @param proxy Address of the created proxy.\n   */\n  event ProxyCreated(address proxy);\n\n  /**\n   * @dev Emitted when a package dependency is changed in the application.\n   * @param providerName Name of the package that changed.\n   * @param package Address of the package associated to the name.\n   * @param version Version of the package in use.\n   */\n  event PackageChanged(string providerName, address package, uint64[3] version);\n\n  /**\n   * @dev Tracks a package in a particular version, used for retrieving implementations\n   */\n  struct ProviderInfo {\n    Package package;\n    uint64[3] version;\n  }\n\n  /**\n   * @dev Maps from dependency name to a tuple of package and version\n   */\n  mapping(string => ProviderInfo) internal providers;\n\n  /**\n   * @dev Constructor function.\n   */\n  constructor() public { }\n\n  /**\n   * @dev Returns the provider for a given package name, or zero if not set.\n   * @param packageName Name of the package to be retrieved.\n   * @return The provider.\n   */\n  function getProvider(string memory packageName) public view returns (ImplementationProvider provider) {\n    ProviderInfo storage info = providers[packageName];\n    if (address(info.package) == address(0)) return ImplementationProvider(0);\n    return ImplementationProvider(info.package.getContract(info.version));\n  }\n\n  /**\n   * @dev Returns information on a package given its name.\n   * @param packageName Name of the package to be queried.\n   * @return A tuple with the package address and pinned version given a package name, or zero if not set\n   */\n  function getPackage(string memory packageName) public view returns (Package, uint64[3] memory) {\n    ProviderInfo storage info = providers[packageName];\n    return (info.package, info.version);\n  }\n\n  /**\n   * @dev Sets a package in a specific version as a dependency for this application.\n   * Requires the version to be present in the package.\n   * @param packageName Name of the package to set or overwrite.\n   * @param package Address of the package to register.\n   * @param version Version of the package to use in this application.\n   */\n  function setPackage(string memory packageName, Package package, uint64[3] memory version) public onlyOwner {\n    require(package.hasVersion(version), \"The requested version must be registered in the given package\");\n    providers[packageName] = ProviderInfo(package, version);\n    emit PackageChanged(packageName, address(package), version);\n  }\n\n  /**\n   * @dev Unsets a package given its name.\n   * Reverts if the package is not set in the application.\n   * @param packageName Name of the package to remove.\n   */\n  function unsetPackage(string memory packageName) public onlyOwner {\n    require(address(providers[packageName].package) != address(0), \"Package to unset not found\");\n    delete providers[packageName];\n    emit PackageChanged(packageName, address(0), [uint64(0), uint64(0), uint64(0)]);\n  }\n\n  /**\n   * @dev Returns the implementation address for a given contract name, provided by the `ImplementationProvider`.\n   * @param packageName Name of the package where the contract is contained.\n   * @param contractName Name of the contract.\n   * @return Address where the contract is implemented.\n   */\n  function getImplementation(string memory packageName, string memory contractName) public view returns (address) {\n    ImplementationProvider provider = getProvider(packageName);\n    if (address(provider) == address(0)) return address(0);\n    return provider.getImplementation(contractName);\n  }\n\n  /**\n   * @dev Creates a new proxy for the given contract and forwards a function call to it.\n   * This is useful to initialize the proxied contract.\n   * @param packageName Name of the package where the contract is contained.\n   * @param contractName Name of the contract.\n   * @param admin Address of the proxy administrator.\n   * @param data Data to send as msg.data to the corresponding implementation to initialize the proxied contract.\n   * It should include the signature and the parameters of the function to be called, as described in\n   * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.\n   * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.\n   * @return Address of the new proxy.\n   */\n   function create(string memory packageName, string memory contractName, address admin, bytes memory data) payable public returns (AdminUpgradeabilityProxy) {\n     address implementation = getImplementation(packageName, contractName);\n     AdminUpgradeabilityProxy proxy = (new AdminUpgradeabilityProxy).value(msg.value)(implementation, admin, data);\n     emit ProxyCreated(address(proxy));\n     return proxy;\n  }\n}\n",
  "sourcePath": "contracts/application/App.sol",
  "sourceMap": "289:4837:1:-;;;1182:24;8:9:-1;5:2;;;30:1;27;20:12;5:2;1182:24:1;989:10:33;980:6;;:19;;;;;;;;;;;;;;;;;;1047:6;;;;;;;;;;;1014:40;;1043:1;1014:40;;;;;;;;;;;;289:4837:1;;;;;;",
  "deployedSourceMap": "289:4837:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3607:294;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3607:294:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3607:294:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3607:294:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3607:294:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3607:294:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3607:294:1;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3607:294:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3607:294:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3607:294:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3607:294:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1387:317;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1387:317:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1387:317:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;1387:317:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1387:317:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1387:317:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;1387:317:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1812:137:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1812:137:33;;;:::i;:::-;;2490:345:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2490:345:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2490:345:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;2490:345:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2490:345:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2490:345:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;2490:345:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;2490:345:1;;;;;;;;;;;;;;:::i;:::-;;1944:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1944:197:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1944:197:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;1944:197:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1944:197:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1944:197:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;1944:197:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1944:197:1;;;;;;;;;;;;;;;;;1124:77:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1124:77:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1444:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1444:90:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3008:289:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3008:289:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3008:289:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3008:289:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3008:289:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3008:289:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3008:289:1;;;;;;;;;;;;;;;:::i;:::-;;4713:411;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;4713:411:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4713:411:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4713:411:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4713:411:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4713:411:1;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4713:411:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4713:411:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4713:411:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4713:411:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4713:411:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4713:411:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4713:411:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4713:411:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2120:107:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2120:107:33;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2120:107:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;3607:294:1;3710:7;3725:31;3759:24;3771:11;3759;:24::i;:::-;3725:58;;3822:1;3793:31;;3801:8;3793:31;;;3789:54;;;3841:1;3826:17;;;;;3789:54;3856:8;:26;;;3883:12;3856:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3856:40:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3856:40:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3856:40:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3856:40:1;;;;;;;;;;;;;;;;3849:47;;;3607:294;;;;;:::o;1387:317::-;1456:31;1495:25;1523:9;1533:11;1523:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1523:22:1;;;;;;;;;;;;;;;;;;;;;1495:50;;1588:1;1555:35;;1563:4;:12;;;;;;;;;;;;1555:35;;;1551:73;;;1622:1;1592:32;;;;;1551:73;1660:4;:12;;;;;;;;;;;;:24;;;1685:4;:12;;1660:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1660:38:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1660:38:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1660:38:1;;;;;;;;;;;;;;;;1630:69;;;1387:317;;;;:::o;1812:137:33:-;1328:9;:7;:9::i;:::-;1320:18;;;;;;;;1910:1;1873:40;;1894:6;;;;;;;;;;;1873:40;;;;;;;;;;;;1940:1;1923:6;;:19;;;;;;;;;;;;;;;;;;1812:137::o;2490:345:1:-;1328:9:33;:7;:9::i;:::-;1320:18;;;;;;;;2611:7:1;:18;;;2630:7;2611:27;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2611:27:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2611:27:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2611:27:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2611:27:1;;;;;;;;;;;;;;;;2603:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2735:30;;;;;;;;;2748:7;2735:30;;;;;;2757:7;2735:30;;;2710:9;2720:11;2710:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2710:22:1;;;;;;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;2776:54;2791:11;2812:7;2822;2776:54;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2776:54:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2776:54:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2490:345;;;:::o;1944:197::-;2012:7;2021:16;;:::i;:::-;2045:25;2073:9;2083:11;2073:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2073:22:1;;;;;;;;;;;;;;;;;;;;;2045:50;;2109:4;:12;;;;;;;;;;;;2123:4;:12;;2101:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1944:197;;;:::o;1124:77:33:-;1162:7;1188:6;;;;;;;;;;;1181:13;;1124:77;:::o;1444:90::-;1484:4;1521:6;;;;;;;;;;;1507:20;;:10;:20;;;1500:27;;1444:90;:::o;3008:289:1:-;1328:9:33;:7;:9::i;:::-;1320:18;;;;;;;;3139:1:1;3088:53;;3096:9;3106:11;3096:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3096:22:1;;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;3088:53;;;;3080:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3185:9;3195:11;3185:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3185:22:1;;;;;;;;;;;;;;;;;;;;;;3178:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3218:74;3233:11;3254:1;3218:74;;;;;;;;;3266:1;3218:74;;;;;;;;3277:1;3218:74;;;;;;;;3288:1;3218:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3218:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3218:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3008:289;:::o;4713:411::-;4842:24;4875:22;4900:44;4918:11;4931:12;4900:17;:44::i;:::-;4875:69;;4951:30;5021:9;5032:14;5048:5;5055:4;4984:76;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4984:76:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4984:76:1;;;4951:109;;5072:28;5093:5;5072:28;;;;;;;;;;;;;;;;;;;;;;5114:5;5107:12;;;;4713:411;;;;;;:::o;2120:107:33:-;1328:9;:7;:9::i;:::-;1320:18;;;;;;;;2192:28;2211:8;2192:18;:28::i;:::-;2120:107;:::o;2371:183::-;2464:1;2444:22;;:8;:22;;;;2436:31;;;;;;;;2511:8;2482:38;;2503:6;;;;;;;;;;;2482:38;;;;;;;;;;;;2539:8;2530:6;;:17;;;;;;;;;;;;;;;;;;2371:183;:::o;289:4837:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;289:4837:1;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o",
  "abi": [
    {
      "constant": true,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        },
        {
          "name": "contractName",
          "type": "string"
        }
      ],
      "name": "getImplementation",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "getProvider",
      "outputs": [
        {
          "name": "provider",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        },
        {
          "name": "package",
          "type": "address"
        },
        {
          "name": "version",
          "type": "uint64[3]"
        }
      ],
      "name": "setPackage",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "getPackage",
      "outputs": [
        {
          "name": "",
          "type": "address"
        },
        {
          "name": "",
          "type": "uint64[3]"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "isOwner",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "unsetPackage",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        },
        {
          "name": "contractName",
          "type": "string"
        },
        {
          "name": "admin",
          "type": "address"
        },
        {
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "create",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": true,
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "name": "proxy",
          "type": "address"
        }
      ],
      "name": "ProxyCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "name": "providerName",
          "type": "string"
        },
        {
          "indexed": false,
          "name": "package",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "version",
          "type": "uint64[3]"
        }
      ],
      "name": "PackageChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    }
  ],
  "ast": {
    "absolutePath": "contracts/application/App.sol",
    "exportedSymbols": {
      "App": [
        325
      ]
    },
    "id": 326,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 70,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:1"
      },
      {
        "absolutePath": "contracts/application/ImplementationProvider.sol",
        "file": "./ImplementationProvider.sol",
        "id": 71,
        "nodeType": "ImportDirective",
        "scope": 326,
        "sourceUnit": 453,
        "src": "25:38:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/application/Package.sol",
        "file": "./Package.sol",
        "id": 72,
        "nodeType": "ImportDirective",
        "scope": 326,
        "sourceUnit": 794,
        "src": "64:23:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/upgradeability/AdminUpgradeabilityProxy.sol",
        "file": "../upgradeability/AdminUpgradeabilityProxy.sol",
        "id": 73,
        "nodeType": "ImportDirective",
        "scope": 326,
        "sourceUnit": 5534,
        "src": "88:56:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/ownership/Ownable.sol",
        "file": "../ownership/Ownable.sol",
        "id": 74,
        "nodeType": "ImportDirective",
        "scope": 326,
        "sourceUnit": 5494,
        "src": "145:34:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 75,
              "name": "OpenZeppelinUpgradesOwnable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5493,
              "src": "305:27:1",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OpenZeppelinUpgradesOwnable_$5493",
                "typeString": "contract OpenZeppelinUpgradesOwnable"
              }
            },
            "id": 76,
            "nodeType": "InheritanceSpecifier",
            "src": "305:27:1"
          }
        ],
        "contractDependencies": [
          5493,
          5533
        ],
        "contractKind": "contract",
        "documentation": "@title App\n@dev Contract for upgradeable applications.\nIt handles the creation of proxies.",
        "fullyImplemented": true,
        "id": 325,
        "linearizedBaseContracts": [
          325,
          5493
        ],
        "name": "App",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": "@dev Emitted when a new proxy is created.\n@param proxy Address of the created proxy.",
            "id": 80,
            "name": "ProxyCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 79,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 78,
                  "indexed": false,
                  "name": "proxy",
                  "nodeType": "VariableDeclaration",
                  "scope": 80,
                  "src": "463:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 77,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "463:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "462:15:1"
            },
            "src": "444:34:1"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when a package dependency is changed in the application.\n@param providerName Name of the package that changed.\n@param package Address of the package associated to the name.\n@param version Version of the package in use.",
            "id": 90,
            "name": "PackageChanged",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 89,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 82,
                  "indexed": false,
                  "name": "providerName",
                  "nodeType": "VariableDeclaration",
                  "scope": 90,
                  "src": "767:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 81,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "767:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 84,
                  "indexed": false,
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "scope": 90,
                  "src": "788:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 83,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "788:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 88,
                  "indexed": false,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 90,
                  "src": "805:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 85,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "805:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 87,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 86,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "812:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "805:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "766:57:1"
            },
            "src": "746:78:1"
          },
          {
            "canonicalName": "App.ProviderInfo",
            "id": 97,
            "members": [
              {
                "constant": false,
                "id": 92,
                "name": "package",
                "nodeType": "VariableDeclaration",
                "scope": 97,
                "src": "954:15:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_contract$_Package_$793",
                  "typeString": "contract Package"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 91,
                  "name": "Package",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 793,
                  "src": "954:7:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$793",
                    "typeString": "contract Package"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 96,
                "name": "version",
                "nodeType": "VariableDeclaration",
                "scope": 97,
                "src": "975:17:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                  "typeString": "uint64[3]"
                },
                "typeName": {
                  "baseType": {
                    "id": 93,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "975:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "id": 95,
                  "length": {
                    "argumentTypes": null,
                    "hexValue": "33",
                    "id": 94,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "982:1:1",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": null,
                      "typeString": null
                    },
                    "value": "3"
                  },
                  "nodeType": "ArrayTypeName",
                  "src": "975:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                    "typeString": "uint64[3]"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "ProviderInfo",
            "nodeType": "StructDefinition",
            "scope": 325,
            "src": "928:69:1",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 101,
            "name": "providers",
            "nodeType": "VariableDeclaration",
            "scope": 325,
            "src": "1083:50:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$97_storage_$",
              "typeString": "mapping(string => struct App.ProviderInfo)"
            },
            "typeName": {
              "id": 100,
              "keyType": {
                "id": 98,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "1091:6:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "1083:31:1",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$97_storage_$",
                "typeString": "mapping(string => struct App.ProviderInfo)"
              },
              "valueType": {
                "contractScope": null,
                "id": 99,
                "name": "ProviderInfo",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 97,
                "src": "1101:12:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                  "typeString": "struct App.ProviderInfo"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 104,
              "nodeType": "Block",
              "src": "1203:3:1",
              "statements": []
            },
            "documentation": "@dev Constructor function.",
            "id": 105,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 102,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1193:2:1"
            },
            "returnParameters": {
              "id": 103,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1203:0:1"
            },
            "scope": 325,
            "src": "1182:24:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 140,
              "nodeType": "Block",
              "src": "1489:215:1",
              "statements": [
                {
                  "assignments": [
                    113
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 113,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 140,
                      "src": "1495:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 112,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 97,
                        "src": "1495:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 117,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 114,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 101,
                      "src": "1523:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$97_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 116,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 115,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 107,
                      "src": "1533:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1523:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$97_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1495:50:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 119,
                            "name": "info",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 113,
                            "src": "1563:4:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                              "typeString": "struct App.ProviderInfo storage pointer"
                            }
                          },
                          "id": 120,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "package",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 92,
                          "src": "1563:12:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$793",
                            "typeString": "contract Package"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$793",
                            "typeString": "contract Package"
                          }
                        ],
                        "id": 118,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1555:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 121,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1555:21:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 123,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1588:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 122,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1580:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 124,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1580:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "1555:35:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 130,
                  "nodeType": "IfStatement",
                  "src": "1551:73:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 127,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1622:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 126,
                        "name": "ImplementationProvider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 452,
                        "src": "1599:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$452_$",
                          "typeString": "type(contract ImplementationProvider)"
                        }
                      },
                      "id": 128,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1599:25:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                        "typeString": "contract ImplementationProvider"
                      }
                    },
                    "functionReturnParameters": 111,
                    "id": 129,
                    "nodeType": "Return",
                    "src": "1592:32:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 135,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 113,
                              "src": "1685:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 136,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "version",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 96,
                            "src": "1685:12:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint64_$3_storage",
                              "typeString": "uint64[3] storage ref"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_array$_t_uint64_$3_storage",
                              "typeString": "uint64[3] storage ref"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 132,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 113,
                              "src": "1660:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 133,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "package",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 92,
                            "src": "1660:12:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$793",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 134,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "getContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 533,
                          "src": "1660:24:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_array$_t_uint64_$3_memory_ptr_$returns$_t_address_$",
                            "typeString": "function (uint64[3] memory) view external returns (address)"
                          }
                        },
                        "id": 137,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1660:38:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 131,
                      "name": "ImplementationProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 452,
                      "src": "1637:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$452_$",
                        "typeString": "type(contract ImplementationProvider)"
                      }
                    },
                    "id": 138,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1637:62:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "functionReturnParameters": 111,
                  "id": 139,
                  "nodeType": "Return",
                  "src": "1630:69:1"
                }
              ]
            },
            "documentation": "@dev Returns the provider for a given package name, or zero if not set.\n@param packageName Name of the package to be retrieved.\n@return The provider.",
            "id": 141,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getProvider",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 108,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 107,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 141,
                  "src": "1408:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 106,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1408:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1407:27:1"
            },
            "returnParameters": {
              "id": 111,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 110,
                  "name": "provider",
                  "nodeType": "VariableDeclaration",
                  "scope": 141,
                  "src": "1456:31:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                    "typeString": "contract ImplementationProvider"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 109,
                    "name": "ImplementationProvider",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 452,
                    "src": "1456:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1455:33:1"
            },
            "scope": 325,
            "src": "1387:317:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 164,
              "nodeType": "Block",
              "src": "2039:102:1",
              "statements": [
                {
                  "assignments": [
                    153
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 153,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 164,
                      "src": "2045:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 152,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 97,
                        "src": "2045:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 157,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 154,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 101,
                      "src": "2073:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$97_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 156,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 155,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 143,
                      "src": "2083:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2073:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$97_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2045:50:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 158,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 153,
                          "src": "2109:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 159,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "package",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 92,
                        "src": "2109:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Package_$793",
                          "typeString": "contract Package"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 160,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 153,
                          "src": "2123:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$97_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 161,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "version",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 96,
                        "src": "2123:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_storage",
                          "typeString": "uint64[3] storage ref"
                        }
                      }
                    ],
                    "id": 162,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2108:28:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_contract$_Package_$793_$_t_array$_t_uint64_$3_storage_$",
                      "typeString": "tuple(contract Package,uint64[3] storage ref)"
                    }
                  },
                  "functionReturnParameters": 151,
                  "id": 163,
                  "nodeType": "Return",
                  "src": "2101:35:1"
                }
              ]
            },
            "documentation": "@dev Returns information on a package given its name.\n@param packageName Name of the package to be queried.\n@return A tuple with the package address and pinned version given a package name, or zero if not set",
            "id": 165,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 144,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 143,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 165,
                  "src": "1964:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 142,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1964:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1963:27:1"
            },
            "returnParameters": {
              "id": 151,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 146,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 165,
                  "src": "2012:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$793",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 145,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 793,
                    "src": "2012:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$793",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 150,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 165,
                  "src": "2021:16:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 147,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2021:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 149,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 148,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2028:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2021:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2011:27:1"
            },
            "scope": 325,
            "src": "1944:197:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 203,
              "nodeType": "Block",
              "src": "2597:238:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 181,
                            "name": "version",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 173,
                            "src": "2630:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                              "typeString": "uint64[3] memory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                              "typeString": "uint64[3] memory"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 179,
                            "name": "package",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 169,
                            "src": "2611:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$793",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 180,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "hasVersion",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 693,
                          "src": "2611:18:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_array$_t_uint64_$3_memory_ptr_$returns$_t_bool_$",
                            "typeString": "function (uint64[3] memory) view external returns (bool)"
                          }
                        },
                        "id": 182,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2611:27:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765",
                        "id": 183,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2640:63:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_6e9b26c5b88c1d0d268a79a49255a96dbe9152f3c69df83cee9951ea1c032fdb",
                          "typeString": "literal_string \"The requested version must be registered in the given package\""
                        },
                        "value": "The requested version must be registered in the given package"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_6e9b26c5b88c1d0d268a79a49255a96dbe9152f3c69df83cee9951ea1c032fdb",
                          "typeString": "literal_string \"The requested version must be registered in the given package\""
                        }
                      ],
                      "id": 178,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6466,
                        6467
                      ],
                      "referencedDeclaration": 6467,
                      "src": "2603:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 184,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2603:101:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 185,
                  "nodeType": "ExpressionStatement",
                  "src": "2603:101:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 193,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 186,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 101,
                        "src": "2710:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$97_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 188,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 187,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 167,
                        "src": "2720:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2710:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$97_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 190,
                          "name": "package",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 169,
                          "src": "2748:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$793",
                            "typeString": "contract Package"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 191,
                          "name": "version",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 173,
                          "src": "2757:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$793",
                            "typeString": "contract Package"
                          },
                          {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        ],
                        "id": 189,
                        "name": "ProviderInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 97,
                        "src": "2735:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_ProviderInfo_$97_storage_ptr_$",
                          "typeString": "type(struct App.ProviderInfo storage pointer)"
                        }
                      },
                      "id": 192,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2735:30:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$97_memory",
                        "typeString": "struct App.ProviderInfo memory"
                      }
                    },
                    "src": "2710:55:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$97_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "id": 194,
                  "nodeType": "ExpressionStatement",
                  "src": "2710:55:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 196,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 167,
                        "src": "2791:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 198,
                            "name": "package",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 169,
                            "src": "2812:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$793",
                              "typeString": "contract Package"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_Package_$793",
                              "typeString": "contract Package"
                            }
                          ],
                          "id": 197,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2804:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 199,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2804:16:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 200,
                        "name": "version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 173,
                        "src": "2822:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 195,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 90,
                      "src": "2776:14:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_address_$_t_array$_t_uint64_$3_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,address,uint64[3] memory)"
                      }
                    },
                    "id": 201,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2776:54:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 202,
                  "nodeType": "EmitStatement",
                  "src": "2771:59:1"
                }
              ]
            },
            "documentation": "@dev Sets a package in a specific version as a dependency for this application.\nRequires the version to be present in the package.\n@param packageName Name of the package to set or overwrite.\n@param package Address of the package to register.\n@param version Version of the package to use in this application.",
            "id": 204,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 176,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 175,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 5427,
                  "src": "2587:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2587:9:1"
              }
            ],
            "name": "setPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 174,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 167,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 204,
                  "src": "2510:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 166,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2510:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 169,
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "scope": 204,
                  "src": "2537:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$793",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 168,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 793,
                    "src": "2537:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$793",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 173,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 204,
                  "src": "2554:24:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 170,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2554:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 172,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 171,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2561:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2554:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2509:70:1"
            },
            "returnParameters": {
              "id": 177,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2597:0:1"
            },
            "scope": 325,
            "src": "2490:345:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 247,
              "nodeType": "Block",
              "src": "3074:223:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 221,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 213,
                                  "name": "providers",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 101,
                                  "src": "3096:9:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$97_storage_$",
                                    "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                                  }
                                },
                                "id": 215,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 214,
                                  "name": "packageName",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 206,
                                  "src": "3106:11:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3096:22:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ProviderInfo_$97_storage",
                                  "typeString": "struct App.ProviderInfo storage ref"
                                }
                              },
                              "id": 216,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "package",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 92,
                              "src": "3096:30:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Package_$793",
                                "typeString": "contract Package"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_Package_$793",
                                "typeString": "contract Package"
                              }
                            ],
                            "id": 212,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3088:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 217,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3088:39:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 219,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3139:1:1",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 218,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3131:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 220,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3131:10:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "3088:53:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5061636b61676520746f20756e736574206e6f7420666f756e64",
                        "id": 222,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3143:28:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3ae493df729b5cccebf4261a82c4432beb82c364d1afb7d58bdfea7fd27d9332",
                          "typeString": "literal_string \"Package to unset not found\""
                        },
                        "value": "Package to unset not found"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3ae493df729b5cccebf4261a82c4432beb82c364d1afb7d58bdfea7fd27d9332",
                          "typeString": "literal_string \"Package to unset not found\""
                        }
                      ],
                      "id": 211,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6466,
                        6467
                      ],
                      "referencedDeclaration": 6467,
                      "src": "3080:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 223,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3080:92:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 224,
                  "nodeType": "ExpressionStatement",
                  "src": "3080:92:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 228,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "3178:29:1",
                    "subExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 225,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 101,
                        "src": "3185:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$97_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 227,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 226,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 206,
                        "src": "3195:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3185:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$97_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 229,
                  "nodeType": "ExpressionStatement",
                  "src": "3178:29:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 231,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 206,
                        "src": "3233:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 233,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3254:1:1",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            }
                          ],
                          "id": 232,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3246:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 234,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3246:10:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 236,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3266:1:1",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 235,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3259:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 237,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3259:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 239,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3277:1:1",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 238,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3270:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 240,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3270:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 242,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3288:1:1",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 241,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3281:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 243,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3281:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          }
                        ],
                        "id": 244,
                        "isConstant": false,
                        "isInlineArray": true,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "3258:33:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 230,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 90,
                      "src": "3218:14:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_address_$_t_array$_t_uint64_$3_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,address,uint64[3] memory)"
                      }
                    },
                    "id": 245,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3218:74:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 246,
                  "nodeType": "EmitStatement",
                  "src": "3213:79:1"
                }
              ]
            },
            "documentation": "@dev Unsets a package given its name.\nReverts if the package is not set in the application.\n@param packageName Name of the package to remove.",
            "id": 248,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 209,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 208,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 5427,
                  "src": "3064:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3064:9:1"
              }
            ],
            "name": "unsetPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 207,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 206,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 248,
                  "src": "3030:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 205,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3030:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3029:27:1"
            },
            "returnParameters": {
              "id": 210,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3074:0:1"
            },
            "scope": 325,
            "src": "3008:289:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 280,
              "nodeType": "Block",
              "src": "3719:182:1",
              "statements": [
                {
                  "assignments": [
                    258
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 258,
                      "name": "provider",
                      "nodeType": "VariableDeclaration",
                      "scope": 280,
                      "src": "3725:31:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                        "typeString": "contract ImplementationProvider"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 257,
                        "name": "ImplementationProvider",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 452,
                        "src": "3725:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 262,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 260,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 250,
                        "src": "3771:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 259,
                      "name": "getProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 141,
                      "src": "3759:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$returns$_t_contract$_ImplementationProvider_$452_$",
                        "typeString": "function (string memory) view returns (contract ImplementationProvider)"
                      }
                    },
                    "id": 261,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3759:24:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3725:58:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 269,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 264,
                          "name": "provider",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 258,
                          "src": "3801:8:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                            "typeString": "contract ImplementationProvider"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                            "typeString": "contract ImplementationProvider"
                          }
                        ],
                        "id": 263,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3793:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 265,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3793:17:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 267,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3822:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 266,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3814:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 268,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3814:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "3793:31:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 274,
                  "nodeType": "IfStatement",
                  "src": "3789:54:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 271,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3841:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 270,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3833:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 272,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3833:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "functionReturnParameters": 256,
                    "id": 273,
                    "nodeType": "Return",
                    "src": "3826:17:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 277,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 252,
                        "src": "3883:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 275,
                        "name": "provider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 258,
                        "src": "3856:8:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$452",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "id": 276,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "getImplementation",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 451,
                      "src": "3856:26:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_string_memory_ptr_$returns$_t_address_$",
                        "typeString": "function (string memory) view external returns (address)"
                      }
                    },
                    "id": 278,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3856:40:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 256,
                  "id": 279,
                  "nodeType": "Return",
                  "src": "3849:47:1"
                }
              ]
            },
            "documentation": "@dev Returns the implementation address for a given contract name, provided by the `ImplementationProvider`.\n@param packageName Name of the package where the contract is contained.\n@param contractName Name of the contract.\n@return Address where the contract is implemented.",
            "id": 281,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getImplementation",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 253,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 250,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 281,
                  "src": "3634:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 249,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3634:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 252,
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "scope": 281,
                  "src": "3661:26:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 251,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3661:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3633:55:1"
            },
            "returnParameters": {
              "id": 256,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 255,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 281,
                  "src": "3710:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 254,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3710:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3709:9:1"
            },
            "scope": 325,
            "src": "3607:294:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 323,
              "nodeType": "Block",
              "src": "4868:256:1",
              "statements": [
                {
                  "assignments": [
                    295
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 295,
                      "name": "implementation",
                      "nodeType": "VariableDeclaration",
                      "scope": 323,
                      "src": "4875:22:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 294,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "4875:7:1",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 300,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 297,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 283,
                        "src": "4918:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 298,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 285,
                        "src": "4931:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 296,
                      "name": "getImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 281,
                      "src": "4900:17:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_address_$",
                        "typeString": "function (string memory,string memory) view returns (address)"
                      }
                    },
                    "id": 299,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4900:44:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4875:69:1"
                },
                {
                  "assignments": [
                    302
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 302,
                      "name": "proxy",
                      "nodeType": "VariableDeclaration",
                      "scope": 323,
                      "src": "4951:30:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                        "typeString": "contract AdminUpgradeabilityProxy"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 301,
                        "name": "AdminUpgradeabilityProxy",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5533,
                        "src": "4951:24:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 314,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 310,
                        "name": "implementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 295,
                        "src": "5032:14:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 311,
                        "name": "admin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 287,
                        "src": "5048:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 312,
                        "name": "data",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 289,
                        "src": "5055:4:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 307,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6463,
                            "src": "5021:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 308,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "5021:9:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 304,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "4985:28:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$5533_$",
                                "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 303,
                                "name": "AdminUpgradeabilityProxy",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 5533,
                                "src": "4989:24:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                                  "typeString": "contract AdminUpgradeabilityProxy"
                                }
                              }
                            }
                          ],
                          "id": 305,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "4984:30:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$5533_$",
                            "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                          }
                        },
                        "id": 306,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4984:36:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_setvalue_nonpayable$_t_uint256_$returns$_t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$5533_$value_$",
                          "typeString": "function (uint256) returns (function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy))"
                        }
                      },
                      "id": 309,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4984:47:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$5533_$value",
                        "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                      }
                    },
                    "id": 313,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4984:76:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4951:109:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 317,
                            "name": "proxy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 302,
                            "src": "5093:5:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                              "typeString": "contract AdminUpgradeabilityProxy"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                              "typeString": "contract AdminUpgradeabilityProxy"
                            }
                          ],
                          "id": 316,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "5085:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 318,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5085:14:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 315,
                      "name": "ProxyCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 80,
                      "src": "5072:12:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 319,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5072:28:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 320,
                  "nodeType": "EmitStatement",
                  "src": "5067:33:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 321,
                    "name": "proxy",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 302,
                    "src": "5114:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "functionReturnParameters": 293,
                  "id": 322,
                  "nodeType": "Return",
                  "src": "5107:12:1"
                }
              ]
            },
            "documentation": "@dev Creates a new proxy for the given contract and forwards a function call to it.\nThis is useful to initialize the proxied contract.\n@param packageName Name of the package where the contract is contained.\n@param contractName Name of the contract.\n@param admin Address of the proxy administrator.\n@param data Data to send as msg.data to the corresponding implementation to initialize the proxied contract.\nIt should include the signature and the parameters of the function to be called, as described in\nhttps://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.\nThis parameter is optional, if no data is given the initialization call to proxied contract will be skipped.\n@return Address of the new proxy.",
            "id": 324,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "create",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 290,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 283,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 324,
                  "src": "4729:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 282,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4729:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 285,
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "scope": 324,
                  "src": "4756:26:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 284,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4756:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 287,
                  "name": "admin",
                  "nodeType": "VariableDeclaration",
                  "scope": 324,
                  "src": "4784:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 286,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4784:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 289,
                  "name": "data",
                  "nodeType": "VariableDeclaration",
                  "scope": 324,
                  "src": "4799:17:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 288,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4799:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4728:89:1"
            },
            "returnParameters": {
              "id": 293,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 292,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 324,
                  "src": "4842:24:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                    "typeString": "contract AdminUpgradeabilityProxy"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 291,
                    "name": "AdminUpgradeabilityProxy",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5533,
                    "src": "4842:24:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5533",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4841:26:1"
            },
            "scope": 325,
            "src": "4713:411:1",
            "stateMutability": "payable",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 326,
        "src": "289:4837:1"
      }
    ],
    "src": "0:5127:1"
  },
  "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36126a8806100dc6000396000f3fe6080604052600436106200009e5760003560e01c80638da5cb5b11620000615780638da5cb5b14620005e55780638f32d59b146200063f578063ad358d991462000671578063cd3e318a1462000740578063f2fde38b1462000995576200009e565b806327a0d66914620000a357806350cadc85146200024c578063715018a6146200035b57806371eb64cc146200037557806387c6048314620004a5575b600080fd5b348015620000b057600080fd5b506200020a60048036036040811015620000c957600080fd5b8101908080359060200190640100000000811115620000e757600080fd5b820183602082011115620000fa57600080fd5b803590602001918460018302840111640100000000831117156200011d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156200018157600080fd5b8201836020820111156200019457600080fd5b80359060200191846001830284011164010000000083111715620001b757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050620009ea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200025957600080fd5b5062000319600480360360208110156200027257600080fd5b81019080803590602001906401000000008111156200029057600080fd5b820183602082011115620002a357600080fd5b80359060200191846001830284011164010000000083111715620002c657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505062000b3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200036857600080fd5b506200037362000d28565b005b3480156200038257600080fd5b50620004a3600480360360a08110156200039b57600080fd5b8101908080359060200190640100000000811115620003b957600080fd5b820183602082011115620003cc57600080fd5b80359060200191846001830284011164010000000083111715620003ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929050505062000dfd565b005b348015620004b257600080fd5b506200057260048036036020811015620004cb57600080fd5b8101908080359060200190640100000000811115620004e957600080fd5b820183602082011115620004fc57600080fd5b803590602001918460018302840111640100000000831117156200051f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506200112b565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600360200280838360005b83811015620005d1578082015181840152602081019050620005b4565b505050509050019250505060405180910390f35b348015620005f257600080fd5b50620005fd62001250565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200064c57600080fd5b506200065762001279565b604051808215151515815260200191505060405180910390f35b3480156200067e57600080fd5b506200073e600480360360208110156200069757600080fd5b8101908080359060200190640100000000811115620006b557600080fd5b820183602082011115620006c857600080fd5b80359060200191846001830284011164010000000083111715620006eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050620012d0565b005b62000953600480360360808110156200075857600080fd5b81019080803590602001906401000000008111156200077657600080fd5b8201836020820111156200078957600080fd5b80359060200191846001830284011164010000000083111715620007ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156200081057600080fd5b8201836020820111156200082357600080fd5b803590602001918460018302840111640100000000831117156200084657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115620008ca57600080fd5b820183602082011115620008dd57600080fd5b803590602001918460018302840111640100000000831117156200090057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505062001628565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620009a257600080fd5b50620009e860048036036020811015620009bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620017b5565b005b600080620009f88462000b3c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a3b57600091505062000b36565b8073ffffffffffffffffffffffffffffffffffffffff16636b683896846040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000aa957808201518184015260208101905062000a8c565b50505050905090810190601f16801562000ad75780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801562000af557600080fd5b505afa15801562000b0a573d6000803e3d6000fd5b505050506040513d602081101562000b2157600080fd5b81019080805190602001909291905050509150505b92915050565b6000806001836040518082805190602001908083835b60208310151562000b79578051825260208201915060208101905060208303925062000b52565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141562000c1357600091505062000d23565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df40eaa826001016040518263ffffffff1660e01b815260040180826003801562000cc4576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001906008019060208260070104928301926001038202915080841162000c7e5790505b505091505060206040518083038186803b15801562000ce257600080fd5b505afa15801562000cf7573d6000803e3d6000fd5b505050506040513d602081101562000d0e57600080fd5b81019080805190602001909291905050509150505b919050565b62000d3262001279565b151562000d3e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b62000e0762001279565b151562000e1357600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166335ce4016826040518263ffffffff1660e01b81526004018082600360200280838360005b8381101562000e6c57808201518184015260208101905062000e4f565b5050505090500191505060206040518083038186803b15801562000e8f57600080fd5b505afa15801562000ea4573d6000803e3d6000fd5b505050506040513d602081101562000ebb57600080fd5b8101908080519060200190929190505050151562000f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018062002640603d913960400191505060405180910390fd5b60408051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506001846040518082805190602001908083835b60208310151562000f8a578051825260208201915060208101905060208303925062000f63565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019060036200101d929190620018d4565b509050507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab83838360405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b83811015620010a85780820151818401526020810190506200108b565b50505050905001828103825285818151815260200191508051906020019080838360005b83811015620010e9578082015181840152602081019050620010cc565b50505050905090810190601f168015620011175780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b60006200113762001989565b60006001846040518082805190602001908083835b6020831015156200117357805182526020820191506020810190506020830392506200114c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600101806003806020026040519081016040528092919082600380156200123f576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020019060080190602082600701049283019260010382029150808411620011f95790505b505050505090509250925050915091565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b620012da62001279565b1515620012e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001826040518082805190602001908083835b60208310151562001338578051825260208201915060208101905060208303925062001311565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156200141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061636b61676520746f20756e736574206e6f7420666f756e6400000000000081525060200191505060405180910390fd5b6001816040518082805190602001908083835b6020831015156200145657805182526020820191506020810190506020830392506200142f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000620014c39190620019ac565b50507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab816000606060405190810160405280600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff1681525060405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b83811015620015a75780820151818401526020810190506200158a565b50505050905001828103825285818151815260200191508051906020019080838360005b83811015620015e8578082015181840152602081019050620015cb565b50505050905090810190601f168015620016165780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150565b600080620016378686620009ea565b90506000348286866040516200164d90620019b3565b808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620016f0578082015181840152602081019050620016d3565b50505050905090810190601f1680156200171e5780820380516001836020036101000a031916815260200191505b509450505050506040518091039082f08015801562001741573d6000803e3d6000fd5b50905090507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e734981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18092505050949350505050565b620017bf62001279565b1515620017cb57600080fd5b620017d681620017d9565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200181657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8260038001600490048101928215620019765791602002820160005b838211156200193e57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509260200192600801602081600701049283019260010302620018f0565b8015620019745782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026200193e565b505b509050620019859190620019c1565b5090565b606060405190810160405280600390602082028038833980820191505090505090565b5060009055565b610c4480620019fc83390190565b620019f891905b80821115620019f457600081816101000a81549067ffffffffffffffff021916905550600101620019c8565b5090565b9056fe6080604052604051610c44380380610c448339810180604052606081101561002657600080fd5b810190808051906020019092919080519060200190929190805164010000000081111561005257600080fd5b8281019050602081018481111561006857600080fd5b815185600182028301116401000000008211171561008557600080fd5b50509291905050508281600160405180807f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000815250601c019050604051809103902060001c0360001b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b1415156100fb57fe5b61010a8261025f60201b60201c565b6000815111156101da5760008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083101515610163578051825260208201915060208101905060208303925061013e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146101c3576040519150601f19603f3d011682016040523d82523d6000602084013e6101c8565b606091505b505090508015156101d857600080fd5b505b5050600160405180807f656970313936372e70726f78792e61646d696e000000000000000000000000008152506013019050604051809103902060001c0360001b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b14151561024857fe5b610257826102f860201b60201c565b50505061033a565b6102728161032760201b6107de1760201c565b15156102c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180610c09603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181555050565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508181555050565b600080823b905060008111915050919050565b6108c0806103496000396000f3fe60806040526004361061004a5760003560e01c80633659cfe6146100545780634f1ef286146100a55780635c60da1b1461013e5780638f28397014610195578063f851a440146101e6575b61005261023d565b005b34801561006057600080fd5b506100a36004803603602081101561007757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610257565b005b61013c600480360360408110156100bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156100f857600080fd5b82018360208201111561010a57600080fd5b8035906020019184600183028401116401000000008311171561012c57600080fd5b90919293919293905050506102ac565b005b34801561014a57600080fd5b50610153610384565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a157600080fd5b506101e4600480360360208110156101b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103dc565b005b3480156101f257600080fd5b506101fb610557565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102456105af565b610255610250610647565b610678565b565b61025f61069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102a05761029b816106cf565b6102a9565b6102a861023d565b5b50565b6102b461069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610376576102f0836106cf565b60008373ffffffffffffffffffffffffffffffffffffffff168383604051808383808284378083019250505092505050600060405180830381855af49150503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5050905080151561037057600080fd5b5061037f565b61037e61023d565b5b505050565b600061038e61069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103d0576103c9610647565b90506103d9565b6103d861023d565b5b90565b6103e461069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561054b57600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561049f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806108246036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104c861069e565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16105468161071e565b610554565b61055361023d565b5b50565b600061056161069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156105a35761059c61069e565b90506105ac565b6105ab61023d565b5b90565b6105b761069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561063d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806107f26032913960400191505060405180910390fd5b61064561074d565b565b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b9050805491505090565b3660008037600080366000845af43d6000803e8060008114610699573d6000f35b3d6000fd5b6000807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b9050805491505090565b6106d88161074f565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508181555050565b565b610758816107de565b15156107af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061085a603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181555050565b600080823b90506000811191505091905056fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a165627a7a723058203a61cbfff803b053d8f397cf95cfa0c8c53ef12ce921c5d484b275b58be38897002943616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765a165627a7a723058204054c39d99a3199f61071e5328b35aa7ca6ea99921ca5f4768c48dab0912f97e0029",
  "deployedBytecode": "0x6080604052600436106200009e5760003560e01c80638da5cb5b11620000615780638da5cb5b14620005e55780638f32d59b146200063f578063ad358d991462000671578063cd3e318a1462000740578063f2fde38b1462000995576200009e565b806327a0d66914620000a357806350cadc85146200024c578063715018a6146200035b57806371eb64cc146200037557806387c6048314620004a5575b600080fd5b348015620000b057600080fd5b506200020a60048036036040811015620000c957600080fd5b8101908080359060200190640100000000811115620000e757600080fd5b820183602082011115620000fa57600080fd5b803590602001918460018302840111640100000000831117156200011d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156200018157600080fd5b8201836020820111156200019457600080fd5b80359060200191846001830284011164010000000083111715620001b757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050620009ea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200025957600080fd5b5062000319600480360360208110156200027257600080fd5b81019080803590602001906401000000008111156200029057600080fd5b820183602082011115620002a357600080fd5b80359060200191846001830284011164010000000083111715620002c657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505062000b3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200036857600080fd5b506200037362000d28565b005b3480156200038257600080fd5b50620004a3600480360360a08110156200039b57600080fd5b8101908080359060200190640100000000811115620003b957600080fd5b820183602082011115620003cc57600080fd5b80359060200191846001830284011164010000000083111715620003ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929050505062000dfd565b005b348015620004b257600080fd5b506200057260048036036020811015620004cb57600080fd5b8101908080359060200190640100000000811115620004e957600080fd5b820183602082011115620004fc57600080fd5b803590602001918460018302840111640100000000831117156200051f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506200112b565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600360200280838360005b83811015620005d1578082015181840152602081019050620005b4565b505050509050019250505060405180910390f35b348015620005f257600080fd5b50620005fd62001250565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200064c57600080fd5b506200065762001279565b604051808215151515815260200191505060405180910390f35b3480156200067e57600080fd5b506200073e600480360360208110156200069757600080fd5b8101908080359060200190640100000000811115620006b557600080fd5b820183602082011115620006c857600080fd5b80359060200191846001830284011164010000000083111715620006eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050620012d0565b005b62000953600480360360808110156200075857600080fd5b81019080803590602001906401000000008111156200077657600080fd5b8201836020820111156200078957600080fd5b80359060200191846001830284011164010000000083111715620007ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156200081057600080fd5b8201836020820111156200082357600080fd5b803590602001918460018302840111640100000000831117156200084657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115620008ca57600080fd5b820183602082011115620008dd57600080fd5b803590602001918460018302840111640100000000831117156200090057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505062001628565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620009a257600080fd5b50620009e860048036036020811015620009bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620017b5565b005b600080620009f88462000b3c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a3b57600091505062000b36565b8073ffffffffffffffffffffffffffffffffffffffff16636b683896846040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000aa957808201518184015260208101905062000a8c565b50505050905090810190601f16801562000ad75780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801562000af557600080fd5b505afa15801562000b0a573d6000803e3d6000fd5b505050506040513d602081101562000b2157600080fd5b81019080805190602001909291905050509150505b92915050565b6000806001836040518082805190602001908083835b60208310151562000b79578051825260208201915060208101905060208303925062000b52565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141562000c1357600091505062000d23565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df40eaa826001016040518263ffffffff1660e01b815260040180826003801562000cc4576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001906008019060208260070104928301926001038202915080841162000c7e5790505b505091505060206040518083038186803b15801562000ce257600080fd5b505afa15801562000cf7573d6000803e3d6000fd5b505050506040513d602081101562000d0e57600080fd5b81019080805190602001909291905050509150505b919050565b62000d3262001279565b151562000d3e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b62000e0762001279565b151562000e1357600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166335ce4016826040518263ffffffff1660e01b81526004018082600360200280838360005b8381101562000e6c57808201518184015260208101905062000e4f565b5050505090500191505060206040518083038186803b15801562000e8f57600080fd5b505afa15801562000ea4573d6000803e3d6000fd5b505050506040513d602081101562000ebb57600080fd5b8101908080519060200190929190505050151562000f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018062002640603d913960400191505060405180910390fd5b60408051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506001846040518082805190602001908083835b60208310151562000f8a578051825260208201915060208101905060208303925062000f63565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019060036200101d929190620018d4565b509050507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab83838360405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b83811015620010a85780820151818401526020810190506200108b565b50505050905001828103825285818151815260200191508051906020019080838360005b83811015620010e9578082015181840152602081019050620010cc565b50505050905090810190601f168015620011175780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b60006200113762001989565b60006001846040518082805190602001908083835b6020831015156200117357805182526020820191506020810190506020830392506200114c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600101806003806020026040519081016040528092919082600380156200123f576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020019060080190602082600701049283019260010382029150808411620011f95790505b505050505090509250925050915091565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b620012da62001279565b1515620012e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001826040518082805190602001908083835b60208310151562001338578051825260208201915060208101905060208303925062001311565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156200141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061636b61676520746f20756e736574206e6f7420666f756e6400000000000081525060200191505060405180910390fd5b6001816040518082805190602001908083835b6020831015156200145657805182526020820191506020810190506020830392506200142f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000620014c39190620019ac565b50507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab816000606060405190810160405280600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff1681525060405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b83811015620015a75780820151818401526020810190506200158a565b50505050905001828103825285818151815260200191508051906020019080838360005b83811015620015e8578082015181840152602081019050620015cb565b50505050905090810190601f168015620016165780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150565b600080620016378686620009ea565b90506000348286866040516200164d90620019b3565b808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620016f0578082015181840152602081019050620016d3565b50505050905090810190601f1680156200171e5780820380516001836020036101000a031916815260200191505b509450505050506040518091039082f08015801562001741573d6000803e3d6000fd5b50905090507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e734981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18092505050949350505050565b620017bf62001279565b1515620017cb57600080fd5b620017d681620017d9565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200181657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8260038001600490048101928215620019765791602002820160005b838211156200193e57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509260200192600801602081600701049283019260010302620018f0565b8015620019745782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026200193e565b505b509050620019859190620019c1565b5090565b606060405190810160405280600390602082028038833980820191505090505090565b5060009055565b610c4480620019fc83390190565b620019f891905b80821115620019f457600081816101000a81549067ffffffffffffffff021916905550600101620019c8565b5090565b9056fe6080604052604051610c44380380610c448339810180604052606081101561002657600080fd5b810190808051906020019092919080519060200190929190805164010000000081111561005257600080fd5b8281019050602081018481111561006857600080fd5b815185600182028301116401000000008211171561008557600080fd5b50509291905050508281600160405180807f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000815250601c019050604051809103902060001c0360001b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b1415156100fb57fe5b61010a8261025f60201b60201c565b6000815111156101da5760008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083101515610163578051825260208201915060208101905060208303925061013e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146101c3576040519150601f19603f3d011682016040523d82523d6000602084013e6101c8565b606091505b505090508015156101d857600080fd5b505b5050600160405180807f656970313936372e70726f78792e61646d696e000000000000000000000000008152506013019050604051809103902060001c0360001b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b14151561024857fe5b610257826102f860201b60201c565b50505061033a565b6102728161032760201b6107de1760201c565b15156102c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180610c09603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181555050565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508181555050565b600080823b905060008111915050919050565b6108c0806103496000396000f3fe60806040526004361061004a5760003560e01c80633659cfe6146100545780634f1ef286146100a55780635c60da1b1461013e5780638f28397014610195578063f851a440146101e6575b61005261023d565b005b34801561006057600080fd5b506100a36004803603602081101561007757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610257565b005b61013c600480360360408110156100bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156100f857600080fd5b82018360208201111561010a57600080fd5b8035906020019184600183028401116401000000008311171561012c57600080fd5b90919293919293905050506102ac565b005b34801561014a57600080fd5b50610153610384565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a157600080fd5b506101e4600480360360208110156101b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103dc565b005b3480156101f257600080fd5b506101fb610557565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102456105af565b610255610250610647565b610678565b565b61025f61069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102a05761029b816106cf565b6102a9565b6102a861023d565b5b50565b6102b461069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610376576102f0836106cf565b60008373ffffffffffffffffffffffffffffffffffffffff168383604051808383808284378083019250505092505050600060405180830381855af49150503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5050905080151561037057600080fd5b5061037f565b61037e61023d565b5b505050565b600061038e61069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103d0576103c9610647565b90506103d9565b6103d861023d565b5b90565b6103e461069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561054b57600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561049f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806108246036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104c861069e565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16105468161071e565b610554565b61055361023d565b5b50565b600061056161069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156105a35761059c61069e565b90506105ac565b6105ab61023d565b5b90565b6105b761069e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561063d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806107f26032913960400191505060405180910390fd5b61064561074d565b565b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b9050805491505090565b3660008037600080366000845af43d6000803e8060008114610699573d6000f35b3d6000fd5b6000807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b9050805491505090565b6106d88161074f565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508181555050565b565b610758816107de565b15156107af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061085a603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181555050565b600080823b90506000811191505091905056fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a165627a7a723058203a61cbfff803b053d8f397cf95cfa0c8c53ef12ce921c5d484b275b58be38897002943616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765a165627a7a723058204054c39d99a3199f61071e5328b35aa7ca6ea99921ca5f4768c48dab0912f97e0029",
  "compiler": {
    "name": "solc",
    "version": "0.5.3+commit.10d17f24.Emscripten.clang",
    "optimizer": {},
    "evmVersion": "constantinople"
  }
}
