appium 2.0.0-beta.30 → 2.0.0-beta.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/build/lib/appium.d.ts +1 -1
  2. package/build/lib/appium.d.ts.map +1 -1
  3. package/build/lib/appium.js +5 -2
  4. package/build/lib/cli/parser.d.ts +3 -2
  5. package/build/lib/cli/parser.d.ts.map +1 -1
  6. package/build/lib/cli/parser.js +1 -1
  7. package/build/lib/config.d.ts +5 -4
  8. package/build/lib/config.d.ts.map +1 -1
  9. package/build/lib/config.js +1 -1
  10. package/build/lib/extension/manifest.d.ts.map +1 -1
  11. package/build/lib/extension/manifest.js +1 -1
  12. package/build/lib/main.d.ts +13 -10
  13. package/build/lib/main.d.ts.map +1 -1
  14. package/build/lib/main.js +57 -50
  15. package/build/tsconfig.tsbuildinfo +1 -1
  16. package/build/types/appium-manifest.d.ts +40 -0
  17. package/build/types/appium-manifest.d.ts.map +1 -0
  18. package/build/types/cli.d.ts +112 -0
  19. package/build/types/cli.d.ts.map +1 -0
  20. package/build/types/extension.d.ts +43 -0
  21. package/build/types/extension.d.ts.map +1 -0
  22. package/build/types/external-manifest.d.ts +47 -0
  23. package/build/types/external-manifest.d.ts.map +1 -0
  24. package/build/types/index.d.ts +15 -0
  25. package/build/types/index.d.ts.map +1 -0
  26. package/lib/appium.js +7 -3
  27. package/lib/cli/parser.js +2 -1
  28. package/lib/config.js +6 -5
  29. package/lib/extension/manifest.js +0 -2
  30. package/lib/main.js +78 -63
  31. package/package.json +18 -12
  32. package/types/{appium-manifest.d.ts → appium-manifest.ts} +1 -1
  33. package/types/{cli.d.ts → cli.ts} +48 -29
  34. package/types/{extension.d.ts → extension.ts} +4 -4
  35. package/types/{external-manifest.d.ts → external-manifest.ts} +2 -2
  36. package/types/{index.d.ts → index.ts} +7 -0
@@ -12,7 +12,7 @@ export class NoDriverProxyCommandError extends Error {
12
12
  export type ExternalDriver = import('@appium/types').ExternalDriver;
13
13
  export type W3CCapabilities = import('@appium/types').W3CCapabilities;
14
14
  export type DriverData = import('@appium/types').DriverData;
15
- export type DriverOpts = import('@appium/types').DriverOpts;
15
+ export type DriverOpts = import('@appium/types').ServerArgs;
16
16
  export type Constraints = import('@appium/types').Constraints;
17
17
  export type AppiumServer = import('@appium/types').AppiumServer;
18
18
  export type ExtensionType = import('../types').ExtensionType;
@@ -1 +1 @@
1
- {"version":3,"file":"appium.d.ts","sourceRoot":"","sources":["../../lib/appium.js"],"names":[],"mappings":"AA2sBA;;;GAGG;AACH;IAME,cAKC;IAVD;;OAEG;IACH,MAFU,SAAS,MAAM,CAAC,CAEgB;CAQ3C;6BAKY,OAAO,eAAe,EAAE,cAAc;8BACtC,OAAO,eAAe,EAAE,eAAe;yBACvC,OAAO,eAAe,EAAE,UAAU;yBAClC,OAAO,eAAe,EAAE,UAAU;0BAClC,OAAO,eAAe,EAAE,WAAW;2BACnC,OAAO,eAAe,EAAE,YAAY;4BACpC,OAAO,UAAU,EAAE,aAAa;0BAChC,OAAO,oBAAoB,EAAE,WAAW;2BACxC,OAAO,2BAA2B,EAAE,YAAY;;;;;;;;;;6BAchD,OAAO,eAAe,EAAE,cAAc,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAC,qBAAqB,IAAI,CAAC,CAAC;AAztB3G;;GAEG;AACH;IAgDE;;OAEG;IACH,kBAFW,UAAU,EAuBpB;IAvED;;;;;OAKG;IACH,UAFU,OAAO,MAAM,EAAC,cAAc,CAAC,CAEzB;IAEd;;;;;OAKG;IACH,gBAFU,OAAO,MAAM,EAAC,cAAc,EAAE,CAAC,CAErB;IASpB;;;OAGG;IACH,eAFU,WAAW,EAAE,CAEJ;IAEnB;;;OAGG;IACH,gBAFU,OAAO,MAAM,EAAC,aAAa,WAAW,CAAC,EAAE,CAAC,CAEhC;IAEpB;;;OAGG;IACH,oBAFU,aAAa,WAAW,CAAC,EAAE,CAEb;IAExB,2BAA2B;IAC3B,cADW,YAAY,CACV;IAEb,2BAA2B;IAC3B,QADW,YAAY,CAChB;IAgBL,qEAAyD;IAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAqB;IA4BvB,uCAGC;IAED,yEAEC;IAED;;OAIC;IAED;;;;;SAGC;IAED,+FAcC;IAED;;;;;;;;;OASG;IACH,kCAJW,aAAa,WACb,MAAM,0BAchB;IAED;;;;;;OAMG;IACH,0BALW,eAAe,WACf,eAAe,mBACf,eAAe;;;;;;;;OAqJzB;IAED,wEA8BC;IAED;;;;OAIG;IACH,uIAFa,QAAQ,UAAU,EAAE,CAAC,CAajC;IAED;;OAEG;IACH,yBAFW,MAAM;;;;;;;;OAwChB;IAED,4CAsBC;IAED;;;;;OAKG;IACH,8BAHY,MAAM,gBAejB;IAED;;;;;;;;;OASG;IACH,wBAJW,MAAM,cACL,MAAM,gBAQjB;IAED,0DAOC;IAED;;;;;OAKG;IACH,oBAJW,MAAM,WACF,GAAG,kBAsHjB;IAED;;;;;;;YAuBC;IAED;;;aAkBC;IAED;;;;;;;OAsBC;IAED,qCAGC;IAED,sDAGC;IAED,kCAGC;CACF"}
1
+ {"version":3,"file":"appium.d.ts","sourceRoot":"","sources":["../../lib/appium.js"],"names":[],"mappings":"AA+sBA;;;GAGG;AACH;IAME,cAKC;IAVD;;OAEG;IACH,MAFU,SAAS,MAAM,CAAC,CAEgB;CAQ3C;6BAKY,OAAO,eAAe,EAAE,cAAc;8BACtC,OAAO,eAAe,EAAE,eAAe;yBACvC,OAAO,eAAe,EAAE,UAAU;yBAClC,OAAO,eAAe,EAAE,UAAU;0BAClC,OAAO,eAAe,EAAE,WAAW;2BACnC,OAAO,eAAe,EAAE,YAAY;4BACpC,OAAO,UAAU,EAAE,aAAa;0BAChC,OAAO,oBAAoB,EAAE,WAAW;2BACxC,OAAO,2BAA2B,EAAE,YAAY;;;;;;;;;;6BAchD,OAAO,eAAe,EAAE,cAAc,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAC,qBAAqB,IAAI,CAAC,CAAC;AA7tB3G;;GAEG;AACH;IAgDE;;OAEG;IACH,kBAFW,UAAU,EAuBpB;IAvED;;;;;OAKG;IACH,UAFU,OAAO,MAAM,EAAC,cAAc,CAAC,CAEzB;IAEd;;;;;OAKG;IACH,gBAFU,OAAO,MAAM,EAAC,cAAc,EAAE,CAAC,CAErB;IASpB;;;OAGG;IACH,eAFU,WAAW,EAAE,CAEJ;IAEnB;;;OAGG;IACH,gBAFU,OAAO,MAAM,EAAC,aAAa,WAAW,CAAC,EAAE,CAAC,CAEhC;IAEpB;;;OAGG;IACH,oBAFU,aAAa,WAAW,CAAC,EAAE,CAEb;IAExB,2BAA2B;IAC3B,cADW,YAAY,CACV;IAEb,2BAA2B;IAC3B,QADW,YAAY,CAChB;IAgBL,qEAAyD;IAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAqB;IA4BvB,uCAGC;IAED,yEAEC;IAED;;OAIC;IAED;;;;;SAGC;IAED,+FAcC;IAED;;;;;;;;;OASG;IACH,kCAJW,aAAa,WACb,MAAM,0BAchB;IAED;;;;;;OAMG;IACH,0BALW,eAAe,WACf,eAAe,mBACf,eAAe;;;;;;;;OAyJzB;IAED,wEA8BC;IAED;;;;OAIG;IACH,uIAFa,QAAQ,UAAU,EAAE,CAAC,CAajC;IAED;;OAEG;IACH,yBAFW,MAAM;;;;;;;;OAwChB;IAED,4CAsBC;IAED;;;;;OAKG;IACH,8BAHY,MAAM,gBAejB;IAED;;;;;;;;;OASG;IACH,wBAJW,MAAM,cACL,MAAM,gBAQjB;IAED,0DAOC;IAED;;;;;OAKG;IACH,oBAJW,MAAM,WACF,GAAG,kBAsHjB;IAED;;;;;;;YAuBC;IAED;;;aAkBC;IAED;;;;;;;OAsBC;IAED,qCAGC;IAED,sDAGC;IAED,kCAGC;CACF"}
@@ -188,7 +188,10 @@ class AppiumDriver extends _baseDriver.DriverCore {
188
188
  }
189
189
 
190
190
  this.assignCliArgsToExtension('driver', driverName, driverInstance);
191
- driverInstance.assignServer(this.server, this.args.address, this.args.port, this.args.basePath);
191
+ driverInstance.server = this.server;
192
+ driverInstance.serverHost = this.args.address;
193
+ driverInstance.serverPort = this.args.port;
194
+ driverInstance.serverPath = this.args.basePath;
192
195
 
193
196
  try {
194
197
  var _await$this$curSessio;
@@ -562,4 +565,4 @@ class NoDriverProxyCommandError extends Error {
562
565
  }
563
566
 
564
567
  exports.NoDriverProxyCommandError = NoDriverProxyCommandError;
565
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsIk9iamVjdCIsImZyZWV6ZSIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkRyaXZlckNvcmUiLCJzZXNzaW9ucyIsInBlbmRpbmdEcml2ZXJzIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImRyaXZlckNvbmZpZyIsInNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInRtcERpciIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fVE1QX0RJUiIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImFyZ3MiLCJjYXRjaCIsImVyciIsImxvZyIsImRlYnVnIiwiX2xvZyIsImluc3RhbmNlTmFtZSIsIm5hbWUiLCJub2RlIiwiZ2V0T2JqZWN0SWQiLCJzdWJzdHJpbmciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJpc0NvbW1hbmRzUXVldWVFbmFibGVkIiwic2Vzc2lvbkV4aXN0cyIsInNlc3Npb25JZCIsImRzdFNlc3Npb24iLCJkcml2ZXJGb3JTZXNzaW9uIiwiZ2V0U3RhdHVzIiwiYnVpbGQiLCJfIiwiY2xvbmUiLCJnZXRTZXNzaW9ucyIsInRvUGFpcnMiLCJtYXAiLCJpZCIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsImNhcHMiLCJwcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQiLCJkcml2ZXJOYW1lIiwiZHJpdmVyVmVyc2lvbiIsImRyaXZlckJhc2VWZXJzaW9uIiwiaW5mbyIsIkFQUElVTV9WRVIiLCJiYXNlVmVyc2lvbiIsImFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbiIsImV4dFR5cGUiLCJleHROYW1lIiwiZXh0SW5zdGFuY2UiLCJhbGxDbGlBcmdzRm9yRXh0IiwiaXNFbXB0eSIsImRlZmF1bHRzIiwiY2xpQXJncyIsIm9taXRCeSIsInZhbHVlIiwia2V5IiwiaXNFcXVhbCIsImNyZWF0ZVNlc3Npb24iLCJqc29ud3BDYXBzIiwicmVxQ2FwcyIsInczY0NhcGFiaWxpdGllcyIsImRyaXZlckRhdGEiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwiY2xvbmVEZWVwIiwiZGVmYXVsdFNldHRpbmdzIiwiandwU2V0dGluZ3MiLCJ3M2NTZXR0aW5ncyIsImFsd2F5c01hdGNoIiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsImFzc2lnbiIsInByb3RvY29sIiwiaW5uZXJTZXNzaW9uSWQiLCJkQ2FwcyIsInBhcnNlZENhcHMiLCJkZXNpcmVkQ2FwcyIsInByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyIsInByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyIsImVycm9yIiwiSW5uZXJEcml2ZXIiLCJ2ZXJzaW9uIiwiZmluZE1hdGNoaW5nRHJpdmVyIiwic2Vzc2lvbk92ZXJyaWRlIiwiZGVsZXRlQWxsU2Vzc2lvbnMiLCJydW5uaW5nRHJpdmVyc0RhdGEiLCJvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSIsImRyaXZlckluc3RhbmNlIiwicmVsYXhlZFNlY3VyaXR5RW5hYmxlZCIsImRlbnlJbnNlY3VyZSIsImEiLCJhbGxvd0luc2VjdXJlIiwiYXNzaWduU2VydmVyIiwiYWRkcmVzcyIsInBvcnQiLCJiYXNlUGF0aCIsImN1clNlc3Npb25EYXRhRm9yRHJpdmVyIiwiZSIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJtZXNzYWdlIiwiYWNxdWlyZSIsImNvbXBhY3QiLCJkcnYiLCJwdXNoIiwicHVsbCIsImF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiaXNXM0NQcm90b2NvbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1cGRhdGVTZXR0aW5ncyIsImlzTWpzb253cFByb3RvY29sIiwib25TaHV0ZG93biIsImNhdXNlIiwiRXJyb3IiLCJ3YXJuIiwicGx1Z2luIiwiaXNGdW5jdGlvbiIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZGF0YSIsInZhbHVlcyIsImZpbHRlciIsInMiLCJkYXR1bSIsImRlbGV0ZVNlc3Npb24iLCJvdGhlclNlc3Npb25zRGF0YSIsImN1ckNvbnN0cnVjdG9yTmFtZSIsInNlc3Npb25zQ291bnQiLCJzaXplIiwiZm9yY2UiLCJyZWFzb24iLCJ1dGlsIiwicGx1cmFsaXplIiwiY2xlYW51cFByb21pc2VzIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwiY2xlYW51cFByb21pc2UiLCJwbHVnaW5zRm9yU2Vzc2lvbiIsImNyZWF0ZVBsdWdpbkluc3RhbmNlcyIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJoYW5kbGUiLCJQbHVnaW5DbGFzcyIsInBsdWdpbk5hbWUiLCJleGVjdXRlQ29tbWFuZCIsImlzR2V0U3RhdHVzIiwiR0VUX1NUQVRVU19DT01NQU5EIiwiaXNVbWJyZWxsYUNtZCIsImlzQXBwaXVtRHJpdmVyQ29tbWFuZCIsImlzU2Vzc2lvbkNtZCIsInJlcUZvclByb3h5IiwibGFzdCIsInBvcCIsInBsdWdpbnMiLCJjbWRIYW5kbGVkQnkiLCJkZWZhdWx0IiwiZGVmYXVsdEJlaGF2aW9yIiwibGVuZ3RoIiwicHJveHlDb21tYW5kIiwiTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvciIsIm9yaWdpbmFsVXJsIiwibWV0aG9kIiwiYm9keSIsIkJhc2VEcml2ZXIiLCJwcm90b3R5cGUiLCJjYWxsIiwid3JhcHBlZENtZCIsIndyYXBDb21tYW5kV2l0aFBsdWdpbnMiLCJuZXh0IiwicmVzIiwiZXhlY3V0ZVdyYXBwZWRDb21tYW5kIiwibG9nUGx1Z2luSGFuZGxlclJlcG9ydCIsIkNSRUFURV9TRVNTSU9OX0NPTU1BTkQiLCJmaXJzdCIsIl9uZXh0IiwiZGlkSGFuZGxlIiwiayIsImRpZG50SGFuZGxlIiwiY21kUmVzIiwiY21kRXJyIiwiaXNQbGFpbk9iamVjdCIsImhhcyIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsIkRFTEVURV9TRVNTSU9OX0NPTU1BTkQiLCJjb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQU1BLE1BQU1BLDRCQUE0QixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNqREMsRUFBQUEsY0FBYyxFQUFFO0FBQ2RDLElBQUFBLFFBQVEsRUFBRSxJQURJO0FBRWRDLElBQUFBLFFBQVEsRUFBRTtBQUZJLEdBRGlDO0FBS2pEQyxFQUFBQSxZQUFZLEVBQUU7QUFDWkYsSUFBQUEsUUFBUSxFQUFFLElBREU7QUFFWkMsSUFBQUEsUUFBUSxFQUFFO0FBRkU7QUFMbUMsQ0FBZCxDQUFyQztBQVdBLE1BQU1FLGlCQUFpQixHQUFHLElBQUlDLGtCQUFKLEVBQTFCO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSUQsa0JBQUosRUFBNUI7O0FBS0EsTUFBTUUsWUFBTixTQUEyQkMsc0JBQTNCLENBQXNDO0FBT3BDQyxFQUFBQSxRQUFRLEdBQUcsRUFBSDtBQVFSQyxFQUFBQSxjQUFjLEdBQUcsRUFBSDtBQU9kQyxFQUFBQSxtQkFBbUIsR0FBRyxDQUFIO0FBTW5CQyxFQUFBQSxhQUFhLEdBQUcsRUFBSDtBQU1iQyxFQUFBQSxjQUFjLEdBQUcsRUFBSDtBQU1kQyxFQUFBQSxrQkFBa0IsR0FBRyxFQUFIO0FBR2xCQyxFQUFBQSxZQUFZO0FBR1pDLEVBQUFBLE1BQU07O0FBS05DLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRO0FBS2pCLFFBQUlBLElBQUksQ0FBQ0MsTUFBVCxFQUFpQjtBQUNmQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsY0FBWixHQUE2QkosSUFBSSxDQUFDQyxNQUFsQztBQUNEOztBQUVELFVBQU1E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QmpLLFNBQXBCLENBQXJCO0FBQ0Q7O0FBbHFCbUM7Ozs7QUF1cUJ0QyxTQUFTNkgscUJBQVQsQ0FBZ0NULEdBQWhDLEVBQXFDO0FBQ25DLFNBQU8sQ0FBQyxrQ0FBaUJBLEdBQWpCLENBQUQsSUFBMEJBLEdBQUcsS0FBSzhDLGtDQUF6QztBQUNEOztBQU1NLE1BQU0xQix5QkFBTixTQUF3QzlDLEtBQXhDLENBQThDO0FBSW5EeUUsRUFBQUEsSUFBSSxHQUFHLGtDQUFIOztBQUVKekwsRUFBQUEsV0FBVyxHQUFJO0FBQ2IsVUFBTyxxRUFBRCxHQUNDLG1FQURELEdBRUMseUVBRkQsR0FHQyw2REFIUDtBQUlEOztBQVhrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZ2V0QnVpbGRJbmZvLCB1cGRhdGVCdWlsZEluZm8sIEFQUElVTV9WRVIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBEcml2ZXJDb3JlLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQsXG4gICAgICAgICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELCBERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBHRVRfU1RBVFVTX0NPTU1BTkRcbn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIHB1bGxTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdXRpbCwgbm9kZSwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG4vKipcbiAqIEludmFyaWFudCBzZXQgb2YgYmFzZSBjb25zdHJhaW50c1xuICogQHR5cGUge1JlYWRvbmx5PENvbnN0cmFpbnRzPn1cbiAqL1xuY29uc3QgZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyA9IE9iamVjdC5mcmVlemUoe1xuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBwbGF0Zm9ybU5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5jb25zdCBzZXNzaW9uc0xpc3RHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IHBlbmRpbmdEcml2ZXJzR3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5cbi8qKlxuICogQGltcGxlbWVudHMge1Nlc3Npb25IYW5kbGVyfVxuICovXG5jbGFzcyBBcHBpdW1Ecml2ZXIgZXh0ZW5kcyBEcml2ZXJDb3JlIHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0byBzZXNzaW9ucyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAqIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsRXh0ZXJuYWxEcml2ZXI+fVxuICAgKi9cbiAgc2Vzc2lvbnMgPSB7fTtcblxuICAvKipcbiAgICogQWNjZXNzIHRvIHBlbmRpbmcgZHJpdmVycyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAqIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsRXh0ZXJuYWxEcml2ZXJbXT59XG4gICAqL1xuICBwZW5kaW5nRHJpdmVycyA9IHt9O1xuXG4gIC8qKlxuICAgKiBOb3RlIHRoYXQge0BsaW5rY29kZSBBcHBpdW1Ecml2ZXJ9IGhhcyBubyBgbmV3Q29tbWFuZFRpbWVvdXRgIG1ldGhvZC5cbiAgICogYEFwcGl1bURyaXZlcmAgZG9lcyBub3Qgc2V0IGFuZCBvYnNlcnZlIGl0cyBvd24gdGltZW91dHM7IGluZGl2aWR1YWxcbiAgICogc2Vzc2lvbnMgKG1hbmFnZWQgZHJpdmVycykgZG8gaW5zdGVhZC5cbiAgICovXG4gIG5ld0NvbW1hbmRUaW1lb3V0TXMgPSAwO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFjdGl2ZSBwbHVnaW5zXG4gICAqIEB0eXBlIHtQbHVnaW5DbGFzc1tdfVxuICAgKi9cbiAgcGx1Z2luQ2xhc3NlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBtYXAgb2Ygc2Vzc2lvbnMgdG8gYWN0dWFsIHBsdWdpbiBpbnN0YW5jZXMgcGVyIHNlc3Npb25cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsSW5zdGFuY2VUeXBlPFBsdWdpbkNsYXNzPltdPn1cbiAgICovXG4gIHNlc3Npb25QbHVnaW5zID0ge307XG5cbiAgLyoqXG4gICAqIHNvbWUgY29tbWFuZHMgYXJlIHNlc3Npb25sZXNzLCBzbyB3ZSBuZWVkIGEgc2V0IG9mIHBsdWdpbnMgZm9yIHRoZW1cbiAgICogQHR5cGUge0luc3RhbmNlVHlwZTxQbHVnaW5DbGFzcz5bXX1cbiAgICovXG4gIHNlc3Npb25sZXNzUGx1Z2lucyA9IFtdOztcblxuICAvKiogQHR5cGUge0RyaXZlckNvbmZpZ30gKi9cbiAgZHJpdmVyQ29uZmlnO1xuXG4gIC8qKiBAdHlwZSB7QXBwaXVtU2VydmVyfSAqL1xuICBzZXJ2ZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RHJpdmVyT3B0c30gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc2V0IGAtLXRtcGAgaGVyZSBzaW5jZSBpdCBzaG91bGQgYmUgc2V0IHRvXG4gICAgLy8gcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgb25jZSBhdCBhbiBpbml0aWFsIHBvaW50IGluIHRoZSBBcHBpdW0gbGlmZWN5Y2xlLlxuICAgIC8vIFRoZSBwcm9jZXNzIGFyZ3VtZW50IHdpbGwgYmUgcmVmZXJlbmNlZCBieSBCYXNlRHJpdmVyLlxuICAgIC8vIFBsZWFzZSBjYWxsIEBhcHBpdW0vc3VwcG9ydC50ZW1wRGlyIG1vZHVsZSB0byBhcHBseSB0aGlzIGJlbmVmaXQuXG4gICAgaWYgKG9wdHMudG1wRGlyKSB7XG4gICAgICBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiA9IG9wdHMudG1wRGlyO1xuICAgIH1cblxuICAgIHN1cGVyKG9wdHMpO1xuXG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzO1xuXG4gICAgdGhpcy5hcmdzID0gey4uLm9wdHN9O1xuXG4gICAgLy8gYWxsb3cgdGhpcyB0byBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vIGBhd2FpdGBcbiAgICAvLyBjYXRjaCB0aGlzIHRvIGF2b2lkIGFuIHVuaGFuZGxlZCByZWplY3Rpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlbixwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgICB1cGRhdGVCdWlsZEluZm8oKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlcnIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IHVtYnJlbGxhIGRyaXZlciBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IGxvZyAoKSB7XG4gICAgaWYgKCF0aGlzLl9sb2cpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKHRoaXMpLnN1YnN0cmluZygwLCA0KX1gO1xuICAgICAgdGhpcy5fbG9nID0gbG9nZ2VyLmdldExvZ2dlcihpbnN0YW5jZU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBjb21tYW5kcyBxdWV1ZWluZyBmb3IgdGhlIHVtYnJlbGxhIEFwcGl1bSBkcml2ZXJcbiAgICovXG4gIGdldCBpc0NvbW1hbmRzUXVldWVFbmFibGVkICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzZXNzaW9uRXhpc3RzIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uICYmIGRzdFNlc3Npb24uc2Vzc2lvbklkICE9PSBudWxsO1xuICB9XG5cbiAgZHJpdmVyRm9yU2Vzc2lvbiAoc2Vzc2lvbklkKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIHJldHVybiB7XG4gICAgICBidWlsZDogXy5jbG9uZShnZXRCdWlsZEluZm8oKSksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb25zICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIF8udG9QYWlycyh0aGlzLnNlc3Npb25zKVxuICAgICAgLm1hcCgoW2lkLCBkcml2ZXJdKSA9PiAoe2lkLCBjYXBhYmlsaXRpZXM6IGRyaXZlci5jYXBzfSkpO1xuICB9XG5cbiAgcHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IChkcml2ZXJOYW1lLCBkcml2ZXJWZXJzaW9uLCBkcml2ZXJCYXNlVmVyc2lvbikge1xuICAgIHRoaXMubG9nLmluZm8oZHJpdmVyVmVyc2lvblxuICAgICAgPyBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9ICh2JHtkcml2ZXJWZXJzaW9ufSkgc2Vzc2lvbmBcbiAgICAgIDogYEFwcGl1bSB2JHtBUFBJVU1fVkVSfSBjcmVhdGluZyBuZXcgJHtkcml2ZXJOYW1lfSBzZXNzaW9uYFxuICAgICk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ2hlY2tpbmcgQmFzZURyaXZlciB2ZXJzaW9ucyBmb3IgQXBwaXVtIGFuZCAke2RyaXZlck5hbWV9YCk7XG4gICAgdGhpcy5sb2cuaW5mbyhBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb25cbiAgICAgID8gYEFwcGl1bSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke0FwcGl1bURyaXZlci5iYXNlVmVyc2lvbn1gXG4gICAgICA6IGBDb3VsZCBub3QgZGV0ZXJtaW5lIEFwcGl1bSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICAgIHRoaXMubG9nLmluZm8oZHJpdmVyQmFzZVZlcnNpb25cbiAgICAgID8gYCR7ZHJpdmVyTmFtZX0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtkcml2ZXJCYXNlVmVyc2lvbn1gXG4gICAgICA6IGBDb3VsZCBub3QgZGV0ZXJtaW5lICR7ZHJpdmVyTmFtZX0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgYXNzaWduIENMSSBhcmdzIGZvciBhIGRyaXZlciBvciBwbHVnaW5cbiAgICpcbiAgICogSWYgdGhlIGV4dGVuc2lvbiBoYXMgcHJvdmlkZWQgYSBzY2hlbWEsIHZhbGlkYXRpb24gaGFzIGFscmVhZHkgaGFwcGVuZWQuXG4gICAqXG4gICAqIEFueSBhcmcgd2hpY2ggaXMgZXF1YWwgdG8gaXRzIGRlZmF1bHQgdmFsdWUgd2lsbCBub3QgYmUgYXNzaWduZWQgdG8gdGhlIGV4dGVuc2lvbi5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlICdkcml2ZXInIG9yICdwbHVnaW4nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGV4dEluc3RhbmNlIHRoZSBkcml2ZXIgb3IgcGx1Z2luIGluc3RhbmNlXG4gICAqL1xuICBhc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24gKGV4dFR5cGUsIGV4dE5hbWUsIGV4dEluc3RhbmNlKSB7XG4gICAgY29uc3QgYWxsQ2xpQXJnc0ZvckV4dCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyx1bmtub3duPnx1bmRlZmluZWR9ICovKHRoaXMuYXJnc1tleHRUeXBlXT8uW2V4dE5hbWVdKTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxDbGlBcmdzRm9yRXh0KSkge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgIGNvbnN0IGNsaUFyZ3MgPSBfLmlzRW1wdHkoZGVmYXVsdHMpXG4gICAgICAgID8gYWxsQ2xpQXJnc0ZvckV4dFxuICAgICAgICA6IF8ub21pdEJ5KGFsbENsaUFyZ3NGb3JFeHQsICh2YWx1ZSwga2V5KSA9PiBfLmlzRXF1YWwoZGVmYXVsdHNba2V5XSwgdmFsdWUpKTtcbiAgICAgIGlmICghXy5pc0VtcHR5KGNsaUFyZ3MpKSB7XG4gICAgICAgIGV4dEluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzfSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoanNvbndwQ2FwcywgcmVxQ2FwcywgdzNjQ2FwYWJpbGl0aWVzLCBkcml2ZXJEYXRhKSB7XG4gICAgY29uc3QgZGVmYXVsdENhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKHRoaXMuYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKTtcbiAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3MgPSBwdWxsU2V0dGluZ3MoZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAganNvbndwQ2FwcyA9IF8uY2xvbmVEZWVwKGpzb253cENhcHMpO1xuICAgIGNvbnN0IGp3cFNldHRpbmdzID0gey4uLmRlZmF1bHRTZXR0aW5ncywgLi4ucHVsbFNldHRpbmdzKGpzb253cENhcHMpfTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0ge1xuICAgICAgLi4uandwU2V0dGluZ3MsXG4gICAgICAuLi5wdWxsU2V0dGluZ3MoKHczY0NhcGFiaWxpdGllcyA/PyB7fSkuYWx3YXlzTWF0Y2ggPz8ge30pXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGZpcnN0TWF0Y2hFbnRyeSBvZiAoKHczY0NhcGFiaWxpdGllcyA/PyB7fSkuZmlyc3RNYXRjaCA/PyBbXSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncyhmaXJzdE1hdGNoRW50cnkpKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvdG9jb2w7XG4gICAgbGV0IGlubmVyU2Vzc2lvbklkLCBkQ2FwcztcbiAgICB0cnkge1xuICAgICAgLy8gUGFyc2UgdGhlIGNhcHMgaW50byBhIGZvcm1hdCB0aGF0IHRoZSBJbm5lckRyaXZlciB3aWxsIGFjY2VwdFxuICAgICAgY29uc3QgcGFyc2VkQ2FwcyA9IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyKFxuICAgICAgICBqc29ud3BDYXBzLFxuICAgICAgICB3M2NDYXBhYmlsaXRpZXMsXG4gICAgICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzLFxuICAgICAgICBkZWZhdWx0Q2FwYWJpbGl0aWVzXG4gICAgICApO1xuXG4gICAgICBjb25zdCB7ZGVzaXJlZENhcHMsIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcywgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzfSA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL3V0aWxzJykuUGFyc2VkRHJpdmVyQ2Fwc30gKi8ocGFyc2VkQ2Fwcyk7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG4gICAgICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL3V0aWxzJykuSW52YWxpZENhcHN9ICovKHBhcnNlZENhcHMpLmVycm9yO1xuICAgICAgLy8gSWYgdGhlIHBhcnNpbmcgb2YgdGhlIGNhcHMgcHJvZHVjZWQgYW4gZXJyb3IsIHRocm93IGl0IGluIGhlcmVcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICBkcml2ZXI6IElubmVyRHJpdmVyLFxuICAgICAgICB2ZXJzaW9uOiBkcml2ZXJWZXJzaW9uLFxuICAgICAgICBkcml2ZXJOYW1lXG4gICAgICB9ID0gdGhpcy5kcml2ZXJDb25maWcuZmluZE1hdGNoaW5nRHJpdmVyKGRlc2lyZWRDYXBzKTtcbiAgICAgIHRoaXMucHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50KElubmVyRHJpdmVyLm5hbWUsIGRyaXZlclZlcnNpb24sIElubmVyRHJpdmVyLmJhc2VWZXJzaW9uKTtcblxuICAgICAgaWYgKHRoaXMuYXJncy5zZXNzaW9uT3ZlcnJpZGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVBbGxTZXNzaW9ucygpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHtEcml2ZXJEYXRhW119XG4gICAgICAgKi9cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEgPSBbXTtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0RyaXZlckRhdGFbXX1cbiAgICAgICAqL1xuICAgICAgbGV0IG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhID0gW107XG5cbiAgICAgIGNvbnN0IGRyaXZlckluc3RhbmNlID0gbmV3IElubmVyRHJpdmVyKHRoaXMuYXJncywgdHJ1ZSk7XG5cbiAgICAgIC8vIFdlIHdhbnQgdG8gYXNzaWduIHNlY3VyaXR5IHZhbHVlcyBkaXJlY3RseSBvbiB0aGUgZHJpdmVyLiBUaGUgZHJpdmVyXG4gICAgICAvLyBzaG91bGQgbm90IHJlYWQgc2VjdXJpdHkgdmFsdWVzIGZyb20gYHRoaXMub3B0c2AgYmVjYXVzZSB0aG9zZSB2YWx1ZXNcbiAgICAgIC8vIGNvdWxkIGhhdmUgYmVlbiBzZXQgYnkgYSBtYWxpY2lvdXMgdXNlciB2aWEgY2FwYWJpbGl0aWVzLCB3aGVyZWFzIHdlXG4gICAgICAvLyB3YW50IGEgZ3VhcmFudGVlIHRoZSB2YWx1ZXMgd2VyZSBzZXQgYnkgdGhlIGFwcGl1bSBzZXJ2ZXIgYWRtaW5cbiAgICAgIGlmICh0aGlzLmFyZ3MucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHBseWluZyByZWxheGVkIHNlY3VyaXR5IHRvICcke0lubmVyRHJpdmVyLm5hbWV9JyBhcyBwZXIgYCArXG4gICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgIGBlbmFibGVkIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkIGJ5IC0tZGVueS1pbnNlY3VyZWApO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5yZWxheGVkU2VjdXJpdHlFbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcmdzLmRlbnlJbnNlY3VyZSkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRXhwbGljaXRseSBwcmV2ZW50aW5nIHVzZSBvZiBpbnNlY3VyZSBmZWF0dXJlczonKTtcbiAgICAgICAgdGhpcy5hcmdzLmRlbnlJbnNlY3VyZS5tYXAoKGEpID0+IHRoaXMubG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRXhwbGljaXRseSBlbmFibGluZyB1c2Ugb2YgaW5zZWN1cmUgZmVhdHVyZXM6Jyk7XG4gICAgICAgIHRoaXMuYXJncy5hbGxvd0luc2VjdXJlLm1hcCgoYSkgPT4gdGhpcy5sb2cuaW5mbyhgICAgICR7YX1gKSk7XG4gICAgICAgIGRyaXZlckluc3RhbmNlLmFsbG93SW5zZWN1cmUgPSB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZTtcbiAgICAgIH1cblxuICAgICAgLy8gTGlrZXdpc2UsIGFueSBkcml2ZXItc3BlY2lmaWMgQ0xJIGFyZ3MgdGhhdCB3ZXJlIHBhc3NlZCBpbiBzaG91bGQgYmUgYXNzaWduZWQgZGlyZWN0bHkgdG9cbiAgICAgIC8vIHRoZSBkcml2ZXIgc28gdGhhdCB0aGV5IGNhbm5vdCBiZSBtaW1pY2tlZCBieSBhIG1hbGljaW91cyB1c2VyIHNlbmRpbmcgaW4gY2FwYWJpbGl0aWVzXG4gICAgICB0aGlzLmFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbignZHJpdmVyJywgZHJpdmVyTmFtZSwgZHJpdmVySW5zdGFuY2UpO1xuXG5cbiAgICAgIC8vIFRoaXMgYXNzaWdubWVudCBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCB3ZWIgc29ja2V0cyBmdW5jdGlvbmFsaXR5IGluc2lkZSB0aGUgZHJpdmVyXG4gICAgICAvLyBEcml2ZXJzL3BsdWdpbnMgbWlnaHQgYWxzbyB3YW50IHRvIGtub3cgd2hlcmUgdGhleSBhcmUgaG9zdGVkXG4gICAgICBkcml2ZXJJbnN0YW5jZS5hc3NpZ25TZXJ2ZXIodGhpcy5zZXJ2ZXIsIHRoaXMuYXJncy5hZGRyZXNzLCB0aGlzLmFyZ3MucG9ydCwgdGhpcy5hcmdzLmJhc2VQYXRoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcnVubmluZ0RyaXZlcnNEYXRhID0gYXdhaXQgdGhpcy5jdXJTZXNzaW9uRGF0YUZvckRyaXZlcihJbm5lckRyaXZlcikgPz8gW107XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcGVuZGluZ0RyaXZlcnNHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0gPSB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdIHx8IFtdO1xuICAgICAgICBvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSA9IF8uY29tcGFjdCh0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLm1hcCgoZHJ2KSA9PiBkcnYuZHJpdmVyRGF0YSkpO1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLnB1c2goZHJpdmVySW5zdGFuY2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIFtpbm5lclNlc3Npb25JZCwgZENhcHNdID0gYXdhaXQgZHJpdmVySW5zdGFuY2UuY3JlYXRlU2Vzc2lvbihcbiAgICAgICAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcmVxQ2FwcyxcbiAgICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgWy4uLnJ1bm5pbmdEcml2ZXJzRGF0YSwgLi4ub3RoZXJQZW5kaW5nRHJpdmVyc0RhdGFdXG4gICAgICAgICk7XG4gICAgICAgIHByb3RvY29sID0gZHJpdmVySW5zdGFuY2UucHJvdG9jb2w7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnNbaW5uZXJTZXNzaW9uSWRdID0gZHJpdmVySW5zdGFuY2U7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICBfLnB1bGwodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSwgZHJpdmVySW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyKGRyaXZlckluc3RhbmNlLCBpbm5lclNlc3Npb25JZCk7XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYE5ldyAke0lubmVyRHJpdmVyLm5hbWV9IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHksIHNlc3Npb24gYCArXG4gICAgICAgIGAke2lubmVyU2Vzc2lvbklkfSBhZGRlZCB0byBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG5cbiAgICAgIC8vIHNldCB0aGUgTmV3IENvbW1hbmQgVGltZW91dCBmb3IgdGhlIGlubmVyIGRyaXZlclxuICAgICAgZHJpdmVySW5zdGFuY2Uuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgICAvLyBhcHBseSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgKGlmIHByb3ZpZGVkKVxuICAgICAgaWYgKGRyaXZlckluc3RhbmNlLmlzVzNDUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KHczY1NldHRpbmdzKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHBseWluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIHBhcnNlZCBmcm9tIFczQyBjYXBzOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh3M2NTZXR0aW5ncykpO1xuICAgICAgICBhd2FpdCBkcml2ZXJJbnN0YW5jZS51cGRhdGVTZXR0aW5ncyh3M2NTZXR0aW5ncyk7XG4gICAgICB9IGVsc2UgaWYgKGRyaXZlckluc3RhbmNlLmlzTWpzb253cFByb3RvY29sKCkgJiYgIV8uaXNFbXB0eShqd3BTZXR0aW5ncykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBNSlNPTldQIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGp3cFNldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKGp3cFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2wsXG4gICAgICB2YWx1ZTogW2lubmVyU2Vzc2lvbklkLCBkQ2FwcywgcHJvdG9jb2xdXG4gICAgfTtcbiAgfVxuXG4gIGF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIgKGRyaXZlciwgaW5uZXJTZXNzaW9uSWQpIHtcbiAgICBjb25zdCBvblNodXRkb3duID0gKGNhdXNlID0gbmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEVuZGluZyBzZXNzaW9uLCBjYXVzZSB3YXMgJyR7Y2F1c2UubWVzc2FnZX0nYCk7XG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24ocGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBkZWZpbmVzIGFuIHVuZXhwZWN0ZWQgc2h1dGRvd24gaGFuZGxlcjsgY2FsbGluZyBpdCBub3dgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHBsdWdpbi5vblVuZXhwZWN0ZWRTaHV0ZG93bihkcml2ZXIsIGNhdXNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cud2FybihgR290IGFuIGVycm9yIHdoZW4gcnVubmluZyBwbHVnaW4gJHtwbHVnaW4ubmFtZX0gc2h1dGRvd24gaGFuZGxlcjogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAnJHtpbm5lclNlc3Npb25JZH0nIGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW2lubmVyU2Vzc2lvbklkXTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXTtcbiAgICB9O1xuXG4gICAgaWYgKF8uaXNGdW5jdGlvbihkcml2ZXIub25VbmV4cGVjdGVkU2h1dGRvd24pKSB7XG4gICAgICBkcml2ZXIub25VbmV4cGVjdGVkU2h1dGRvd24ob25TaHV0ZG93bik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEZhaWxlZCB0byBhdHRhY2ggdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24gbGlzdGVuZXIuIGAgK1xuICAgICAgICBgSXMgJ29uVW5leHBlY3RlZFNodXRkb3duJyBtZXRob2QgYXZhaWxhYmxlIGZvciAnJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0nP2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vdHlwZXMvZXh0ZW5zaW9uJykuRHJpdmVyQ2xhc3N9IElubmVyRHJpdmVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPERyaXZlckRhdGFbXT59fVxuICAgKi9cbiAgYXN5bmMgY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIgKElubmVyRHJpdmVyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIGNvbnN0IGRhdGEgPSBfLmNvbXBhY3QoXy52YWx1ZXModGhpcy5zZXNzaW9ucylcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMuY29uc3RydWN0b3IubmFtZSA9PT0gSW5uZXJEcml2ZXIubmFtZSlcbiAgICAgIC5tYXAoKHMpID0+IHMuZHJpdmVyRGF0YSkpO1xuICAgIGZvciAoY29uc3QgZGF0dW0gb2YgZGF0YSkge1xuICAgICAgaWYgKCFkYXR1bSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2JsZW0gZ2V0dGluZyBzZXNzaW9uIGRhdGEgZm9yIGRyaXZlciB0eXBlIGAgK1xuICAgICAgICAgIGAke0lubmVyRHJpdmVyLm5hbWV9OyBkb2VzIGl0IGltcGxlbWVudCAnZ2V0IGRyaXZlckRhdGEnP2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkXG4gICAqL1xuICBhc3luYyBkZWxldGVTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICBsZXQgcHJvdG9jb2w7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBvdGhlclNlc3Npb25zRGF0YTtcbiAgICAgIGNvbnN0IGRzdFNlc3Npb24gPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1ckNvbnN0cnVjdG9yTmFtZSA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBvdGhlclNlc3Npb25zRGF0YSA9IF8udG9QYWlycyh0aGlzLnNlc3Npb25zKVxuICAgICAgICAgICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgPT09IGN1ckNvbnN0cnVjdG9yTmFtZSAmJiBrZXkgIT09IHNlc3Npb25JZClcbiAgICAgICAgICAgICAgLm1hcCgoWywgdmFsdWVdKSA9PiB2YWx1ZS5kcml2ZXJEYXRhKTtcbiAgICAgICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgcHJvdG9jb2wgPSBkc3RTZXNzaW9uLnByb3RvY29sO1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBSZW1vdmluZyBzZXNzaW9uICR7c2Vzc2lvbklkfSBmcm9tIG91ciBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZGVsZXRlU2Vzc2lvbiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IG9yIG5vdFxuICAgICAgICAvLyBtYWtlIHRoZSBzZXNzaW9uIHVuYXZhaWxhYmxlLCBiZWNhdXNlIHdobyBrbm93cyB3aGF0IHN0YXRlIGl0IG1pZ2h0XG4gICAgICAgIC8vIGJlIGluIG90aGVyd2lzZVxuICAgICAgICBkZWxldGUgdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdO1xuICAgICAgICByZXR1cm4gZHN0U2Vzc2lvbjtcbiAgICAgIH0pO1xuICAgICAgLy8gdGhpcyBtYXkgbm90IGJlIGNvcnJlY3QsIGJ1dCBpZiBgZHN0U2Vzc2lvbmAgd2FzIGZhbHN5LCB0aGUgY2FsbCB0byBgZGVsZXRlU2Vzc2lvbigpYCB3b3VsZFxuICAgICAgLy8gdGhyb3cgYW55d2F5LlxuICAgICAgaWYgKCFkc3RTZXNzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2Vzc2lvbiBub3QgZm91bmQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICB2YWx1ZTogYXdhaXQgZHN0U2Vzc2lvbi5kZWxldGVTZXNzaW9uKHNlc3Npb25JZCwgb3RoZXJTZXNzaW9uc0RhdGEpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgSGFkIHRyb3VibGUgZW5kaW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcjogZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsU2Vzc2lvbnMgKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHNlc3Npb25zQ291bnQgPSBfLnNpemUodGhpcy5zZXNzaW9ucyk7XG4gICAgaWYgKDAgPT09IHNlc3Npb25zQ291bnQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdUaGVyZSBhcmUgbm8gYWN0aXZlIHNlc3Npb25zIGZvciBjbGVhbnVwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZm9yY2UgPSBmYWxzZSxcbiAgICAgIHJlYXNvbixcbiAgICB9ID0gb3B0cztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnYWN0aXZlIHNlc3Npb24nLCBzZXNzaW9uc0NvdW50LCB0cnVlKX1gKTtcbiAgICBjb25zdCBjbGVhbnVwUHJvbWlzZXMgPSBmb3JjZVxuICAgICAgPyBfLnZhbHVlcyh0aGlzLnNlc3Npb25zKS5tYXAoKGRydikgPT4gZHJ2LnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKHJlYXNvbiAmJiBuZXcgRXJyb3IocmVhc29uKSkpXG4gICAgICA6IF8ua2V5cyh0aGlzLnNlc3Npb25zKS5tYXAoKGlkKSA9PiB0aGlzLmRlbGV0ZVNlc3Npb24oaWQpKTtcbiAgICBmb3IgKGNvbnN0IGNsZWFudXBQcm9taXNlIG9mIGNsZWFudXBQcm9taXNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xlYW51cFByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIHBsdWdpbnMgZm9yIGEgc2Vzc2lvbiAob3Igc2Vzc2lvbmxlc3MgcGx1Z2lucylcbiAgICpcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIChvciBudWxsKSB0byB1c2UgdG8gZmluZCBwbHVnaW5zXG4gICAqIEByZXR1cm5zIHtBcnJheX0gLSBhcnJheSBvZiBwbHVnaW4gaW5zdGFuY2VzXG4gICAqL1xuICBwbHVnaW5zRm9yU2Vzc2lvbiAoc2Vzc2lvbklkID0gbnVsbCkge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIGlmICghdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSA9IHRoaXMuY3JlYXRlUGx1Z2luSW5zdGFuY2VzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdO1xuICAgIH1cblxuICAgIGlmIChfLmlzRW1wdHkodGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMpKSB7XG4gICAgICB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucyA9IHRoaXMuY3JlYXRlUGx1Z2luSW5zdGFuY2VzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucztcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBnZXQgcGx1Z2lucyBmb3IgYSBjb21tYW5kLCB3ZSBlaXRoZXIgZ2V0IHRoZSBwbHVnaW4gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogcGFydGljdWxhciBjb21tYW5kJ3Mgc2Vzc2lvbiwgb3IgaW4gdGhlIGNhc2Ugb2Ygc2Vzc2lvbmxlc3MgcGx1Z2lucywgcHVsbCBmcm9tIHRoZSBzZXQgb2ZcbiAgICogcGx1Z2luIGluc3RhbmNlcyByZXNlcnZlZCBmb3Igc2Vzc2lvbmxlc3MgY29tbWFuZHMgKGFuZCB3ZSBsYXppbHkgY3JlYXRlIHBsdWdpbiBpbnN0YW5jZXMgb25cbiAgICogZmlyc3QgdXNlKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kIC0gdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdG8gZmluZCBhIHBsdWdpbiB0byBoYW5kbGVcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBzZXNzaW9uSWQgLSB0aGUgcGFydGljdWxhciBzZXNzaW9uIGZvciB3aGljaCB0byBmaW5kIGEgcGx1Z2luLCBvciBudWxsIGlmXG4gICAqIHNlc3Npb25sZXNzXG4gICAqL1xuICBwbHVnaW5zVG9IYW5kbGVDbWQgKGNtZCwgc2Vzc2lvbklkID0gbnVsbCkge1xuICAgIC8vIHRvIGhhbmRsZSBhIGdpdmVuIGNvbW1hbmQsIGEgcGx1Z2luIHNob3VsZCBlaXRoZXIgaW1wbGVtZW50IHRoYXQgY29tbWFuZCBhcyBhIHBsdWdpblxuICAgIC8vIGluc3RhbmNlIG1ldGhvZCBvciBpdCBzaG91bGQgaW1wbGVtZW50IGEgZ2VuZXJpYyAnaGFuZGxlJyBtZXRob2RcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5zRm9yU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgICAuZmlsdGVyKChwKSA9PiBfLmlzRnVuY3Rpb24ocFtjbWRdKSB8fCBfLmlzRnVuY3Rpb24ocC5oYW5kbGUpKTtcbiAgfVxuXG4gIGNyZWF0ZVBsdWdpbkluc3RhbmNlcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luQ2xhc3Nlcy5tYXAoKFBsdWdpbkNsYXNzKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gUGx1Z2luQ2xhc3MucGx1Z2luTmFtZTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW5DbGFzcyhuYW1lKTtcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdwbHVnaW4nLCBuYW1lLCBwbHVnaW4pO1xuICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7dmFsdWU6IGFueSwgZXJyb3I/OiBFcnJvciwgcHJvdG9jb2w6IHN0cmluZ30gfCBpbXBvcnQoJ3R5cGUtZmVzdCcpLkFzeW5jUmV0dXJuVHlwZTxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJbJ2V4ZWN1dGVDb21tYW5kJ10+Pn1cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjbWQsIC4uLmFyZ3MpIHtcbiAgICAvLyBXZSBoYXZlIGJhc2ljYWxseSB0aHJlZSBjYXNlcyBmb3IgaG93IHRvIGhhbmRsZSBjb21tYW5kczpcbiAgICAvLyAxLiBoYW5kbGUgZ2V0U3RhdHVzICh3ZSBkbyB0aGlzIGFzIGEgc3BlY2lhbCBvdXQgb2YgYmFuZCBjYXNlIHNvIGl0IGRvZXNuJ3QgZ2V0IGFkZGVkIHRvIGFuXG4gICAgLy8gICAgZXhlY3V0aW9uIHF1ZXVlLCBhbmQgY2FuIGJlIGNhbGxlZCB3aGlsZSBlLmcuIGNyZWF0ZVNlc3Npb24gaXMgaW4gcHJvZ3Jlc3MpXG4gICAgLy8gMi4gaGFuZGxlIGNvbW1hbmRzIHRoYXQgdGhpcyB1bWJyZWxsYSBkcml2ZXIgc2hvdWxkIGhhbmRsZSwgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBzZXNzaW9uXG4gICAgLy8gICAgZHJpdmVyIChmb3IgZXhhbXBsZSwgZGVsZXRlU2Vzc2lvbiwgb3Igb3RoZXIgbm9uLXNlc3Npb24gY29tbWFuZHMpXG4gICAgLy8gMy4gaGFuZGxlIHNlc3Npb24gZHJpdmVyIGNvbW1hbmRzLlxuICAgIC8vIFRoZSB0cmlja3kgcGFydCBpcyB0aGF0IGJlY2F1c2Ugd2Ugc3VwcG9ydCBjb21tYW5kIHBsdWdpbnMsIHdlIG5lZWQgdG8gd3JhcCBhbnkgb2YgdGhlc2VcbiAgICAvLyBjYXNlcyB3aXRoIHBsdWdpbiBoYW5kbGluZy5cblxuICAgIGNvbnN0IGlzR2V0U3RhdHVzID0gY21kID09PSBHRVRfU1RBVFVTX0NPTU1BTkQ7XG4gICAgY29uc3QgaXNVbWJyZWxsYUNtZCA9IGlzQXBwaXVtRHJpdmVyQ29tbWFuZChjbWQpO1xuICAgIGNvbnN0IGlzU2Vzc2lvbkNtZCA9IGlzU2Vzc2lvbkNvbW1hbmQoY21kKTtcblxuICAgIC8vIGlmIGEgcGx1Z2luIG92ZXJyaWRlIHByb3h5aW5nIGZvciB0aGlzIGNvbW1hbmQgYW5kIHRoYXQgaXMgd2h5IHdlIGFyZSBoZXJlIGluc3RlYWQgb2YganVzdFxuICAgIC8vIGxldHRpbmcgdGhlIHByb3RvY29sIHByb3h5IHRoZSBjb21tYW5kIGVudGlyZWx5LCBkZXRlcm1pbmUgdGhhdCwgZ2V0IHRoZSByZXF1ZXN0IG9iamVjdCBmb3JcbiAgICAvLyB1c2UgbGF0ZXIgb24sIHRoZW4gY2xlYW4gdXAgdGhlIGFyZ3NcbiAgICBjb25zdCByZXFGb3JQcm94eSA9IF8ubGFzdChhcmdzKT8ucmVxRm9yUHJveHk7XG4gICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICBhcmdzLnBvcCgpO1xuICAgIH1cblxuXG4gICAgLy8gZmlyc3QgZG8gc29tZSBlcnJvciBjaGVja2luZy4gSWYgd2UncmUgcmVxdWVzdGluZyBhIHNlc3Npb24gY29tbWFuZCBleGVjdXRpb24sIHRoZW4gbWFrZVxuICAgIC8vIHN1cmUgdGhhdCBzZXNzaW9uIGFjdHVhbGx5IGV4aXN0cyBvbiB0aGUgc2Vzc2lvbiBkcml2ZXIsIGFuZCBzZXQgdGhlIHNlc3Npb24gZHJpdmVyIGl0c2VsZlxuICAgIGxldCBzZXNzaW9uSWQgPSBudWxsO1xuICAgIGxldCBkc3RTZXNzaW9uID0gbnVsbDtcbiAgICBsZXQgcHJvdG9jb2wgPSBudWxsO1xuICAgIC8qKiBAdHlwZSB7dGhpcyB8IEV4dGVybmFsRHJpdmVyfSAqL1xuICAgIGxldCBkcml2ZXIgPSB0aGlzO1xuICAgIGlmIChpc1Nlc3Npb25DbWQpIHtcbiAgICAgIHNlc3Npb25JZCA9IF8ubGFzdChhcmdzKTtcbiAgICAgIGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICBpZiAoIWRzdFNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2Vzc2lvbiB3aXRoIGlkICcke3Nlc3Npb25JZH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICAvLyBub3cgc2F2ZSB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgZ2l2ZW4gdGhhdCB0aGUgc2Vzc2lvbiBkcml2ZXIncyBwcm90b2NvbCBtaWdodCBkaWZmZXJcbiAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgIGlmICghaXNVbWJyZWxsYUNtZCkge1xuICAgICAgICBkcml2ZXIgPSBkc3RTZXNzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBhbnkgcGx1Z2lucyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBhcyBoYW5kbGluZyB0aGlzIGNvbW1hbmRcbiAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5wbHVnaW5zVG9IYW5kbGVDbWQoY21kLCBzZXNzaW9uSWQpO1xuXG4gICAgLy8gbm93IHdlIGRlZmluZSBhICdjbWRIYW5kbGVkQnknIG9iamVjdCB3aGljaCB3aWxsIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcGx1Z2lucyBoYXZlIGhhbmRsZWQgdGhpc1xuICAgIC8vIGNvbW1hbmQuIHdlIGNhcmUgYWJvdXQgdGhpcyBiZWNhdXNlIChhKSBtdWx0aXBsZSBwbHVnaW5zIGNhbiBoYW5kbGUgdGhlIHNhbWUgY29tbWFuZCwgYW5kXG4gICAgLy8gKGIpIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYSBwbHVnaW4gd2lsbCBhY3R1YWxseSBjYWxsIHRoZSBuZXh0KCkgbWV0aG9kIHdoaWNoIHJ1bnMgdGhlXG4gICAgLy8gb3JpZ2luYWwgY29tbWFuZCBleGVjdXRpb24uIFRoaXMgcmVzdWx0cyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgY29tbWFuZCBtaWdodCBiZSBoYW5kbGVkXG4gICAgLy8gYnkgc29tZSBidXQgbm90IGFsbCBwbHVnaW5zLCBvciBieSBwbHVnaW4ocykgYnV0IG5vdCBieSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gU28gc3RhcnQgb3V0XG4gICAgLy8gdGhpcyBvYmplY3QgZGVjbGFyaW5nIHRoYXQgdGhlIGRlZmF1bHQgaGFuZGxlciBoYXMgbm90IGJlZW4gZXhlY3V0ZWQuXG4gICAgY29uc3QgY21kSGFuZGxlZEJ5ID0ge2RlZmF1bHQ6IGZhbHNlfTtcblxuICAgIC8vIG5vdyB3ZSBkZWZpbmUgYW4gYXN5bmMgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gcGx1Z2lucywgYW5kIHN1Y2Nlc3NpdmVseSB3cmFwcGVkXG4gICAgLy8gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwbHVnaW4gdGhhdCBjYW4gaGFuZGxlIHRoZSBjb21tYW5kLiBUbyBzdGFydCBvZmYgd2l0aCwgdGhlIGFzeW5jXG4gICAgLy8gZnVuY3Rpb24gaXMgZGVmaW5lZCBhcyBjYWxsaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBpLmUuLCB3aGljaGV2ZXIgb2YgdGhlIDMgY2FzZXMgYWJvdmUgaXNcbiAgICAvLyB0aGUgYXBwcm9wcmlhdGUgb25lXG4gICAgY29uc3QgZGVmYXVsdEJlaGF2aW9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gaWYgd2UncmUgcnVubmluZyB3aXRoIHBsdWdpbnMsIG1ha2Ugc3VyZSB3ZSBsb2cgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBhY3R1YWxseVxuICAgICAgLy8gaGFwcGVuaW5nIHNvIHdlIGNhbiB0ZWxsIHdoZW4gdGhlIHBsdWdpbiBjYWxsIGNoYWluIGlzIHVud3JhcHBpbmcgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgIC8vIGlmIHRoYXQncyB3aGF0IGhhcHBlbnNcbiAgICAgIHBsdWdpbnMubGVuZ3RoICYmIHRoaXMubG9nLmluZm8oYEV4ZWN1dGluZyBkZWZhdWx0IGhhbmRsaW5nIGJlaGF2aW9yIGZvciBjb21tYW5kICcke2NtZH0nYCk7XG5cbiAgICAgIC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgd2Uga25vdyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGhhbmRsZWRcbiAgICAgIGNtZEhhbmRsZWRCeS5kZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICAgIC8vIHdlIHdvdWxkIGhhdmUgcHJveGllZCB0aGlzIGNvbW1hbmQgaGFkIGEgcGx1Z2luIG5vdCBoYW5kbGVkIGl0LCBzbyB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAvLyBpcyB0byBkbyB0aGUgcHJveHkgYW5kIHJldHJpZXZlIHRoZSByZXN1bHQgaW50ZXJuYWxseSBzbyBpdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgLy8gaW4gY2FzZSBpdCBjYWxscyAnYXdhaXQgbmV4dCgpJy4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkcml2ZXIgaGF2ZSBkZWZpbmVkXG4gICAgICAgIC8vICdwcm94eUNvbW1hbmQnIGFuZCBub3QganVzdCAncHJveHlSZXFSZXMnLlxuICAgICAgICBpZiAoIWRzdFNlc3Npb24ucHJveHlDb21tYW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQocmVxRm9yUHJveHkub3JpZ2luYWxVcmwsIHJlcUZvclByb3h5Lm1ldGhvZCxcbiAgICAgICAgICByZXFGb3JQcm94eS5ib2R5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzR2V0U3RhdHVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbWJyZWxsYUNtZCkge1xuICAgICAgICAvLyBzb21lIGNvbW1hbmRzLCBsaWtlIGRlbGV0ZVNlc3Npb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIGhhbmRsZSBvbiAqdGhpcyogZHJpdmVyLFxuICAgICAgICAvLyBub3QgdGhlIHBsYXRmb3JtIGRyaXZlclxuICAgICAgICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZXhlY3V0ZUNvbW1hbmQuY2FsbCh0aGlzLCBjbWQsIC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBoZXJlIHdlIGtub3cgdGhhdCB3ZSBhcmUgZXhlY3V0aW5nIGEgc2Vzc2lvbiBjb21tYW5kLCBhbmQgaGF2ZSBhIHZhbGlkIHNlc3Npb24gZHJpdmVyXG4gICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5leGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBub3cgdGFrZSBvdXIgZGVmYXVsdCBiZWhhdmlvciwgd3JhcCBpdCB3aXRoIGFueSBudW1iZXIgb2YgcGx1Z2luIGJlaGF2aW9ycywgYW5kIHJ1biBpdFxuICAgIGNvbnN0IHdyYXBwZWRDbWQgPSB0aGlzLndyYXBDb21tYW5kV2l0aFBsdWdpbnMoe1xuICAgICAgZHJpdmVyLCBjbWQsIGFyZ3MsIHBsdWdpbnMsIGNtZEhhbmRsZWRCeSwgbmV4dDogZGVmYXVsdEJlaGF2aW9yXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5leGVjdXRlV3JhcHBlZENvbW1hbmQoe3dyYXBwZWRDbWQsIHByb3RvY29sfSk7XG5cbiAgICAvLyBpZiB3ZSBoYWQgcGx1Z2lucywgbWFrZSBzdXJlIHRvIGxvZyBvdXQgdGhlIGhlbHBmdWwgcmVwb3J0IGFib3V0IHdoaWNoIHBsdWdpbnMgZW5kZWQgdXBcbiAgICAvLyBoYW5kbGluZyB0aGUgY29tbWFuZCBhbmQgd2hpY2ggZGlkbid0XG4gICAgdGhpcy5sb2dQbHVnaW5IYW5kbGVyUmVwb3J0KHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pO1xuXG4gICAgLy8gQW5kIGZpbmFsbHksIGlmIHRoZSBjb21tYW5kIHdhcyBjcmVhdGVTZXNzaW9uLCB3ZSB3YW50IHRvIG1pZ3JhdGUgYW55IHBsdWdpbnMgd2hpY2ggd2VyZVxuICAgIC8vIHByZXZpb3VzbHkgc2Vzc2lvbmxlc3MgdG8gdXNlIHRoZSBuZXcgc2Vzc2lvbklkLCBzbyB0aGF0IHBsdWdpbnMgY2FuIHNoYXJlIHN0YXRlIGJldHdlZW5cbiAgICAvLyB0aGVpciBjcmVhdGVTZXNzaW9uIG1ldGhvZCBhbmQgb3RoZXIgaW5zdGFuY2UgbWV0aG9kc1xuICAgIGlmIChjbWQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQgJiYgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMubGVuZ3RoICYmICFyZXMuZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IF8uZmlyc3QocmVzLnZhbHVlKTtcbiAgICAgIHRoaXMubG9nLmluZm8oYFByb21vdGluZyAke3RoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zLmxlbmd0aH0gc2Vzc2lvbmxlc3MgcGx1Z2lucyB0byBiZSBhdHRhY2hlZCBgICtcbiAgICAgICAgYHRvIHNlc3Npb24gSUQgJHtzZXNzaW9uSWR9YCk7XG4gICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucztcbiAgICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHdyYXBDb21tYW5kV2l0aFBsdWdpbnMgKHtkcml2ZXIsIGNtZCwgYXJncywgbmV4dCwgY21kSGFuZGxlZEJ5LCBwbHVnaW5zfSkge1xuICAgIHBsdWdpbnMubGVuZ3RoICYmIHRoaXMubG9nLmluZm8oYFBsdWdpbnMgd2hpY2ggY2FuIGhhbmRsZSBjbWQgJyR7Y21kfSc6ICR7cGx1Z2lucy5tYXAoKHApID0+IHAubmFtZSl9YCk7XG5cbiAgICAvLyBub3cgd2UgY2FuIGdvIHRocm91Z2ggZWFjaCBwbHVnaW4gYW5kIHdyYXAgYG5leHRgIGFyb3VuZCBpdHMgb3duIGhhbmRsZXIsIHBhc3NpbmcgdGhlICpvbGQqXG4gICAgLy8gbmV4dCBpbiBzbyB0aGF0IGl0IGNhbiBjYWxsIGl0IGlmIGl0IHdhbnRzIHRvXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgLy8gbmVlZCBhbiBJSUZFIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoZSB2YWx1ZSBvZiBuZXh0IHRoYXQncyBwYXNzZWQgdG8gcGx1Z2luLmhhbmRsZSB0byBiZVxuICAgICAgLy8gZXhhY3RseSB0aGUgdmFsdWUgb2YgbmV4dCBoZXJlIGJlZm9yZSByZWFzc2lnbm1lbnQ7IHdlIGRvbid0IHdhbnQgaXQgdG8gYmUgbGF6aWx5XG4gICAgICAvLyBldmFsdWF0ZWQsIG90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24gb2YgdGhlIGxhc3QgYG5leHRgIHRvIGJlIGRlZmluZWQuXG4gICAgICBjbWRIYW5kbGVkQnlbcGx1Z2luLm5hbWVdID0gZmFsc2U7IC8vIHdlIHNlZSBhIG5ldyBwbHVnaW4sIHNvIGFkZCBpdCB0byB0aGUgJ2NtZEhhbmRsZWRCeScgb2JqZWN0XG4gICAgICBuZXh0ID0gKChfbmV4dCkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBQbHVnaW4gJHtwbHVnaW4ubmFtZX0gaXMgbm93IGhhbmRsaW5nIGNtZCAnJHtjbWR9J2ApO1xuICAgICAgICBjbWRIYW5kbGVkQnlbcGx1Z2luLm5hbWVdID0gdHJ1ZTsgLy8gaWYgd2UgbWFrZSBpdCBoZXJlLCB0aGlzIHBsdWdpbiBoYXMgYXR0ZW1wdGVkIHRvIGhhbmRsZSBjbWRcbiAgICAgICAgLy8gZmlyc3QgYXR0ZW1wdCB0byBoYW5kbGUgdGhlIGNvbW1hbmQgdmlhIGEgY29tbWFuZC1zcGVjaWZpYyBoYW5kbGVyIG9uIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKHBsdWdpbltjbWRdKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHBsdWdpbltjbWRdKF9uZXh0LCBkcml2ZXIsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSwgY2FsbCB0aGUgZ2VuZXJpYyAnaGFuZGxlJyBtZXRob2RcbiAgICAgICAgcmV0dXJuIGF3YWl0IHBsdWdpbi5oYW5kbGUoX25leHQsIGRyaXZlciwgY21kLCAuLi5hcmdzKTtcbiAgICAgIH0pKG5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgbG9nUGx1Z2luSGFuZGxlclJlcG9ydCAocGx1Z2lucywge2NtZCwgY21kSGFuZGxlZEJ5fSkge1xuICAgIGlmICghcGx1Z2lucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBkYXksIHdlIGhhdmUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB3aGljaCBwbHVnaW5zIGVuZGVkIHVwIGdldHRpbmdcbiAgICAvLyB0aGVpciBjb2RlIHJ1biBhcyBwYXJ0IG9mIGhhbmRsaW5nIHRoaXMgY29tbWFuZC4gQmVjYXVzZSBwbHVnaW5zIGNhbiBjaG9vc2UgKm5vdCogdG9cbiAgICAvLyBwYXNzIGNvbnRyb2wgdG8gb3RoZXIgcGx1Z2lucyBvciB0byB0aGUgZGVmYXVsdCBkcml2ZXIgYmVoYXZpb3IsIHRoaXMgaXMgaW5mb3JtYXRpb25cbiAgICAvLyB3aGljaCBpcyBwcm9iYWJseSB1c2VmdWwgdG8gdGhlIHVzZXIgKGVzcGVjaWFsbHkgaW4gc2l0dWF0aW9ucyB3aGVyZSBwbHVnaW5zIG1pZ2h0IG5vdFxuICAgIC8vIGludGVyYWN0IHdlbGwgdG9nZXRoZXIsIGFuZCBpdCB3b3VsZCBiZSBoYXJkIHRvIGRlYnVnIG90aGVyd2lzZSB3aXRob3V0IHRoaXMga2luZCBvZlxuICAgIC8vIG1lc3NhZ2UpLlxuICAgIGNvbnN0IGRpZEhhbmRsZSA9IE9iamVjdC5rZXlzKGNtZEhhbmRsZWRCeSkuZmlsdGVyKChrKSA9PiBjbWRIYW5kbGVkQnlba10pO1xuICAgIGNvbnN0IGRpZG50SGFuZGxlID0gT2JqZWN0LmtleXMoY21kSGFuZGxlZEJ5KS5maWx0ZXIoKGspID0+ICFjbWRIYW5kbGVkQnlba10pO1xuICAgIGlmIChkaWRudEhhbmRsZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBDb21tYW5kICcke2NtZH0nIHdhcyAqbm90KiBoYW5kbGVkIGJ5IHRoZSBmb2xsb3dpbmcgYmVoYXZpb3VycyBvciBwbHVnaW5zLCBldmVuIGAgK1xuICAgICAgICBgdGhvdWdoIHRoZXkgd2VyZSByZWdpc3RlcmVkIHRvIGhhbmRsZSBpdDogJHtKU09OLnN0cmluZ2lmeShkaWRudEhhbmRsZSl9LiBUaGUgYCArXG4gICAgICAgIGBjb21tYW5kICp3YXMqIGhhbmRsZWQgYnkgdGhlc2U6ICR7SlNPTi5zdHJpbmdpZnkoZGlkSGFuZGxlKX0uYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVdyYXBwZWRDb21tYW5kICh7d3JhcHBlZENtZCwgcHJvdG9jb2x9KSB7XG4gICAgbGV0IGNtZFJlcywgY21kRXJyLCByZXMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgYHdyYXBwZWRDbWRgIGRlZmluZXMgYSB3aG9sZSBzZXF1ZW5jZSBvZiBwbHVnaW4gaGFuZGxlcnMsIGN1bG1pbmF0aW5nIGluXG4gICAgICAvLyBvdXIgZGVmYXVsdCBoYW5kbGVyLiBXaGF0ZXZlciBpdCByZXR1cm5zIGlzIHdoYXQgd2UncmUgZ29pbmcgdG8gd2FudCB0byBzZW5kIGJhY2sgdG8gdGhlXG4gICAgICAvLyB1c2VyLlxuICAgICAgY21kUmVzID0gYXdhaXQgd3JhcHBlZENtZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNtZEVyciA9IGU7XG4gICAgfVxuXG4gICAgLy8gU2FkbHksIHdlIGRvbid0IGtub3cgZXhhY3RseSB3aGF0IGtpbmQgb2Ygb2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQuIEl0IHdpbGwgZWl0aGVyIGJlIGEgYmFyZVxuICAgIC8vIG9iamVjdCwgb3IgYSBwcm90b2NvbC1hd2FyZSBvYmplY3Qgd2l0aCBwcm90b2NvbCBhbmQgZXJyb3IvdmFsdWUga2V5cy4gU28gd2UgbmVlZCB0byBzbmlmZlxuICAgIC8vIGl0IGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgZG91YmxlLXdyYXAgaXQgaWYgaXQncyB0aGUgbGF0dGVyIGtpbmQuXG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChjbWRSZXMpICYmIF8uaGFzKGNtZFJlcywgJ3Byb3RvY29sJykpIHtcbiAgICAgIHJlcyA9IGNtZFJlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnZhbHVlID0gY21kUmVzO1xuICAgICAgcmVzLmVycm9yID0gY21kRXJyO1xuICAgICAgcmVzLnByb3RvY29sID0gcHJvdG9jb2w7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBfLmlzRnVuY3Rpb24oZHN0U2Vzc2lvbi5wcm94eUFjdGl2ZSkgJiYgZHN0U2Vzc2lvbi5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gPyBkc3RTZXNzaW9uLmdldFByb3h5QXZvaWRMaXN0KCkgOiBbXTtcbiAgfVxuXG4gIGNhblByb3h5IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uICYmIGRzdFNlc3Npb24uY2FuUHJveHkoc2Vzc2lvbklkKTtcbiAgfVxufVxuXG4vLyBoZWxwIGRlY2lkZSB3aGljaCBjb21tYW5kcyBzaG91bGQgYmUgcHJveGllZCB0byBzdWItZHJpdmVycyBhbmQgd2hpY2hcbi8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoaXMsIG91ciB1bWJyZWxsYSBkcml2ZXJcbmZ1bmN0aW9uIGlzQXBwaXVtRHJpdmVyQ29tbWFuZCAoY21kKSB7XG4gIHJldHVybiAhaXNTZXNzaW9uQ29tbWFuZChjbWQpIHx8IGNtZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORDtcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBBcHBpdW0gdHJpZWQgdG8gcHJveHkgYSBjb21tYW5kIHVzaW5nIGEgZHJpdmVyJ3MgYHByb3h5Q29tbWFuZGAgbWV0aG9kIGJ1dCB0aGVcbiAqIG1ldGhvZCBkaWQgbm90IGV4aXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9OT19EUklWRVJfUFJPWFlDT01NQU5EJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoYFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIGNvbW1hbmQgd2FzIHRvIHByb3h5LCBidXQgdGhlIGRyaXZlciBgICtcbiAgICAgICAgICBgZGlkIG5vdCBoYXZlIHRoZSAncHJveHlDb21tYW5kJyBtZXRob2QgZGVmaW5lZC4gVG8gZnVsbHkgc3VwcG9ydCBgICtcbiAgICAgICAgICBgcGx1Z2lucywgZHJpdmVycyBzaG91bGQgaGF2ZSAncHJveHlDb21tYW5kJyBzZXQgdG8gYSBqd3BQcm94eSBvYmplY3QncyBgICtcbiAgICAgICAgICBgJ2NvbW1hbmQoKScgbWV0aG9kLCBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsICdwcm94eVJlcVJlcydgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBcHBpdW1Ecml2ZXIgfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZXJuYWxEcml2ZXJ9IEV4dGVybmFsRHJpdmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzfSBXM0NDYXBhYmlsaXRpZXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJEYXRhfSBEcml2ZXJEYXRhXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyT3B0c30gRHJpdmVyT3B0c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gQXBwaXVtU2VydmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi90eXBlcycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3R5cGVzL2V4dGVuc2lvbicpLlBsdWdpbkNsYXNzfSBQbHVnaW5DbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnLi9leHRlbnNpb24vZHJpdmVyLWNvbmZpZycpLkRyaXZlckNvbmZpZ30gRHJpdmVyQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBVc2VkIGJ5IHtAbGlua2NvZGUgQXBwaXVtRHJpdmVyLmNyZWF0ZVNlc3Npb259IGFuZCB7QGxpbmtjb2RlIEFwcGl1bURyaXZlci5kZWxldGVTZXNzaW9ufSB0byBkZXNjcmliZVxuICogcmVzdWx0LlxuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIFNlc3Npb25IYW5kbGVyUmVzdWx0XG4gKiBAcHJvcGVydHkge1Z9IFt2YWx1ZV1cbiAqIEBwcm9wZXJ0eSB7RXJyb3J9IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJvdG9jb2xdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2Vzc2lvbkhhbmRsZXI8U2Vzc2lvbkhhbmRsZXJSZXN1bHQ8YW55W10+LFNlc3Npb25IYW5kbGVyUmVzdWx0PHZvaWQ+Pn0gU2Vzc2lvbkhhbmRsZXJcbiAqL1xuIl19
568
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsIk9iamVjdCIsImZyZWV6ZSIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkRyaXZlckNvcmUiLCJzZXNzaW9ucyIsInBlbmRpbmdEcml2ZXJzIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImRyaXZlckNvbmZpZyIsInNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInRtcERpciIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fVE1QX0RJUiIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImFyZ3MiLCJjYXRjaCIsImVyciIsImxvZyIsImRlYnVnIiwiX2xvZyIsImluc3RhbmNlTmFtZSIsIm5hbWUiLCJub2RlIiwiZ2V0T2JqZWN0SWQiLCJzdWJzdHJpbmciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJpc0NvbW1hbmRzUXVldWVFbmFibGVkIiwic2Vzc2lvbkV4aXN0cyIsInNlc3Npb25JZCIsImRzdFNlc3Npb24iLCJkcml2ZXJGb3JTZXNzaW9uIiwiZ2V0U3RhdHVzIiwiYnVpbGQiLCJfIiwiY2xvbmUiLCJnZXRTZXNzaW9ucyIsInRvUGFpcnMiLCJtYXAiLCJpZCIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsImNhcHMiLCJwcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQiLCJkcml2ZXJOYW1lIiwiZHJpdmVyVmVyc2lvbiIsImRyaXZlckJhc2VWZXJzaW9uIiwiaW5mbyIsIkFQUElVTV9WRVIiLCJiYXNlVmVyc2lvbiIsImFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbiIsImV4dFR5cGUiLCJleHROYW1lIiwiZXh0SW5zdGFuY2UiLCJhbGxDbGlBcmdzRm9yRXh0IiwiaXNFbXB0eSIsImRlZmF1bHRzIiwiY2xpQXJncyIsIm9taXRCeSIsInZhbHVlIiwia2V5IiwiaXNFcXVhbCIsImNyZWF0ZVNlc3Npb24iLCJqc29ud3BDYXBzIiwicmVxQ2FwcyIsInczY0NhcGFiaWxpdGllcyIsImRyaXZlckRhdGEiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwiY2xvbmVEZWVwIiwiZGVmYXVsdFNldHRpbmdzIiwiandwU2V0dGluZ3MiLCJ3M2NTZXR0aW5ncyIsImFsd2F5c01hdGNoIiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsImFzc2lnbiIsInByb3RvY29sIiwiaW5uZXJTZXNzaW9uSWQiLCJkQ2FwcyIsInBhcnNlZENhcHMiLCJkZXNpcmVkQ2FwcyIsInByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyIsInByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyIsImVycm9yIiwiSW5uZXJEcml2ZXIiLCJ2ZXJzaW9uIiwiZmluZE1hdGNoaW5nRHJpdmVyIiwic2Vzc2lvbk92ZXJyaWRlIiwiZGVsZXRlQWxsU2Vzc2lvbnMiLCJydW5uaW5nRHJpdmVyc0RhdGEiLCJvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSIsImRyaXZlckluc3RhbmNlIiwicmVsYXhlZFNlY3VyaXR5RW5hYmxlZCIsImRlbnlJbnNlY3VyZSIsImEiLCJhbGxvd0luc2VjdXJlIiwic2VydmVySG9zdCIsImFkZHJlc3MiLCJzZXJ2ZXJQb3J0IiwicG9ydCIsInNlcnZlclBhdGgiLCJiYXNlUGF0aCIsImN1clNlc3Npb25EYXRhRm9yRHJpdmVyIiwiZSIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJtZXNzYWdlIiwiYWNxdWlyZSIsImNvbXBhY3QiLCJkcnYiLCJwdXNoIiwicHVsbCIsImF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiaXNXM0NQcm90b2NvbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1cGRhdGVTZXR0aW5ncyIsImlzTWpzb253cFByb3RvY29sIiwib25TaHV0ZG93biIsImNhdXNlIiwiRXJyb3IiLCJ3YXJuIiwicGx1Z2luIiwiaXNGdW5jdGlvbiIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZGF0YSIsInZhbHVlcyIsImZpbHRlciIsInMiLCJkYXR1bSIsImRlbGV0ZVNlc3Npb24iLCJvdGhlclNlc3Npb25zRGF0YSIsImN1ckNvbnN0cnVjdG9yTmFtZSIsInNlc3Npb25zQ291bnQiLCJzaXplIiwiZm9yY2UiLCJyZWFzb24iLCJ1dGlsIiwicGx1cmFsaXplIiwiY2xlYW51cFByb21pc2VzIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwiY2xlYW51cFByb21pc2UiLCJwbHVnaW5zRm9yU2Vzc2lvbiIsImNyZWF0ZVBsdWdpbkluc3RhbmNlcyIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJoYW5kbGUiLCJQbHVnaW5DbGFzcyIsInBsdWdpbk5hbWUiLCJleGVjdXRlQ29tbWFuZCIsImlzR2V0U3RhdHVzIiwiR0VUX1NUQVRVU19DT01NQU5EIiwiaXNVbWJyZWxsYUNtZCIsImlzQXBwaXVtRHJpdmVyQ29tbWFuZCIsImlzU2Vzc2lvbkNtZCIsInJlcUZvclByb3h5IiwibGFzdCIsInBvcCIsInBsdWdpbnMiLCJjbWRIYW5kbGVkQnkiLCJkZWZhdWx0IiwiZGVmYXVsdEJlaGF2aW9yIiwibGVuZ3RoIiwicHJveHlDb21tYW5kIiwiTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvciIsIm9yaWdpbmFsVXJsIiwibWV0aG9kIiwiYm9keSIsIkJhc2VEcml2ZXIiLCJwcm90b3R5cGUiLCJjYWxsIiwid3JhcHBlZENtZCIsIndyYXBDb21tYW5kV2l0aFBsdWdpbnMiLCJuZXh0IiwicmVzIiwiZXhlY3V0ZVdyYXBwZWRDb21tYW5kIiwibG9nUGx1Z2luSGFuZGxlclJlcG9ydCIsIkNSRUFURV9TRVNTSU9OX0NPTU1BTkQiLCJmaXJzdCIsIl9uZXh0IiwiZGlkSGFuZGxlIiwiayIsImRpZG50SGFuZGxlIiwiY21kUmVzIiwiY21kRXJyIiwiaXNQbGFpbk9iamVjdCIsImhhcyIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsIkRFTEVURV9TRVNTSU9OX0NPTU1BTkQiLCJjb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQU1BLE1BQU1BLDRCQUE0QixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNqREMsRUFBQUEsY0FBYyxFQUFFO0FBQ2RDLElBQUFBLFFBQVEsRUFBRSxJQURJO0FBRWRDLElBQUFBLFFBQVEsRUFBRTtBQUZJLEdBRGlDO0FBS2pEQyxFQUFBQSxZQUFZLEVBQUU7QUFDWkYsSUFBQUEsUUFBUSxFQUFFLElBREU7QUFFWkMsSUFBQUEsUUFBUSxFQUFFO0FBRkU7QUFMbUMsQ0FBZCxDQUFyQztBQVdBLE1BQU1FLGlCQUFpQixHQUFHLElBQUlDLGtCQUFKLEVBQTFCO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSUQsa0JBQUosRUFBNUI7O0FBS0EsTUFBTUUsWUFBTixTQUEyQkMsc0JBQTNCLENBQXNDO0FBT3BDQyxFQUFBQSxRQUFRLEdBQUcsRUFBSDtBQVFSQyxFQUFBQSxjQUFjLEdBQUcsRUFBSDtBQU9kQyxFQUFBQSxtQkFBbUIsR0FBRyxDQUFIO0FBTW5CQyxFQUFBQSxhQUFhLEdBQUcsRUFBSDtBQU1iQyxFQUFBQSxjQUFjLEdBQUcsRUFBSDtBQU1kQyxFQUFBQSxrQkFBa0IsR0FBRyxFQUFIO0FBR2xCQyxFQUFBQSxZQUFZO0FBR1pDLEVBQUFBLE1BQU07O0FBS05DLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRO0FBS2pCLFFBQUlBLElBQUksQ0FBQ0MsTUFBVCxFQUFpQjtBQUNmQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsY0FBWixHQUE2QkosSUFBSSxDQUFD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QUVuSyxTQUFGLEVBQWE7QUFDbkIsVUFBTUMsVUFBVSxHQUFHLEtBQUsvQixRQUFMLENBQWM4QixTQUFkLENBQW5CO0FBQ0EsV0FBT0MsVUFBVSxJQUFJQSxVQUFVLENBQUNrSyxRQUFYLENBQW9CbkssU0FBcEIsQ0FBckI7QUFDRDs7QUF0cUJtQzs7OztBQTJxQnRDLFNBQVMrSCxxQkFBVCxDQUFnQ1QsR0FBaEMsRUFBcUM7QUFDbkMsU0FBTyxDQUFDLGtDQUFpQkEsR0FBakIsQ0FBRCxJQUEwQkEsR0FBRyxLQUFLOEMsa0NBQXpDO0FBQ0Q7O0FBTU0sTUFBTTFCLHlCQUFOLFNBQXdDOUMsS0FBeEMsQ0FBOEM7QUFJbkR5RSxFQUFBQSxJQUFJLEdBQUcsa0NBQUg7O0FBRUozTCxFQUFBQSxXQUFXLEdBQUk7QUFDYixVQUFPLHFFQUFELEdBQ0MsbUVBREQsR0FFQyx5RUFGRCxHQUdDLDZEQUhQO0FBSUQ7O0FBWGtEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBnZXRCdWlsZEluZm8sIHVwZGF0ZUJ1aWxkSW5mbywgQVBQSVVNX1ZFUiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERyaXZlckNvcmUsIGVycm9ycywgaXNTZXNzaW9uQ29tbWFuZCxcbiAgICAgICAgIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIEdFVF9TVEFUVVNfQ09NTUFORFxufSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCBBc3luY0xvY2sgZnJvbSAnYXN5bmMtbG9jayc7XG5pbXBvcnQgeyBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciwgcHVsbFNldHRpbmdzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB1dGlsLCBub2RlLCBsb2dnZXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24gfSBmcm9tICcuL3NjaGVtYSc7XG5cbi8qKlxuICogSW52YXJpYW50IHNldCBvZiBiYXNlIGNvbnN0cmFpbnRzXG4gKiBAdHlwZSB7UmVhZG9ubHk8Q29uc3RyYWludHM+fVxuICovXG5jb25zdCBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGF1dG9tYXRpb25OYW1lOiB7XG4gICAgcHJlc2VuY2U6IHRydWUsXG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIHBsYXRmb3JtTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxufSk7XG5cbmNvbnN0IHNlc3Npb25zTGlzdEd1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgcGVuZGluZ0RyaXZlcnNHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcblxuLyoqXG4gKiBAaW1wbGVtZW50cyB7U2Vzc2lvbkhhbmRsZXJ9XG4gKi9cbmNsYXNzIEFwcGl1bURyaXZlciBleHRlbmRzIERyaXZlckNvcmUge1xuICAvKipcbiAgICogQWNjZXNzIHRvIHNlc3Npb25zIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICogaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXNzIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSB0aGUgb3V0c2lkZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxFeHRlcm5hbERyaXZlcj59XG4gICAqL1xuICBzZXNzaW9ucyA9IHt9O1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdG8gcGVuZGluZyBkcml2ZXJzIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICogaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXNzIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSB0aGUgb3V0c2lkZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxFeHRlcm5hbERyaXZlcltdPn1cbiAgICovXG4gIHBlbmRpbmdEcml2ZXJzID0ge307XG5cbiAgLyoqXG4gICAqIE5vdGUgdGhhdCB7QGxpbmtjb2RlIEFwcGl1bURyaXZlcn0gaGFzIG5vIGBuZXdDb21tYW5kVGltZW91dGAgbWV0aG9kLlxuICAgKiBgQXBwaXVtRHJpdmVyYCBkb2VzIG5vdCBzZXQgYW5kIG9ic2VydmUgaXRzIG93biB0aW1lb3V0czsgaW5kaXZpZHVhbFxuICAgKiBzZXNzaW9ucyAobWFuYWdlZCBkcml2ZXJzKSBkbyBpbnN0ZWFkLlxuICAgKi9cbiAgbmV3Q29tbWFuZFRpbWVvdXRNcyA9IDA7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYWN0aXZlIHBsdWdpbnNcbiAgICogQHR5cGUge1BsdWdpbkNsYXNzW119XG4gICAqL1xuICBwbHVnaW5DbGFzc2VzID0gW107XG5cbiAgLyoqXG4gICAqIG1hcCBvZiBzZXNzaW9ucyB0byBhY3R1YWwgcGx1Z2luIGluc3RhbmNlcyBwZXIgc2Vzc2lvblxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxJbnN0YW5jZVR5cGU8UGx1Z2luQ2xhc3M+W10+fVxuICAgKi9cbiAgc2Vzc2lvblBsdWdpbnMgPSB7fTtcblxuICAvKipcbiAgICogc29tZSBjb21tYW5kcyBhcmUgc2Vzc2lvbmxlc3MsIHNvIHdlIG5lZWQgYSBzZXQgb2YgcGx1Z2lucyBmb3IgdGhlbVxuICAgKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFBsdWdpbkNsYXNzPltdfVxuICAgKi9cbiAgc2Vzc2lvbmxlc3NQbHVnaW5zID0gW107O1xuXG4gIC8qKiBAdHlwZSB7RHJpdmVyQ29uZmlnfSAqL1xuICBkcml2ZXJDb25maWc7XG5cbiAgLyoqIEB0eXBlIHtBcHBpdW1TZXJ2ZXJ9ICovXG4gIHNlcnZlcjtcblxuICAvKipcbiAgICogQHBhcmFtIHtEcml2ZXJPcHRzfSBvcHRzXG4gICAqL1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgYC0tdG1wYCBoZXJlIHNpbmNlIGl0IHNob3VsZCBiZSBzZXQgdG9cbiAgICAvLyBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiBvbmNlIGF0IGFuIGluaXRpYWwgcG9pbnQgaW4gdGhlIEFwcGl1bSBsaWZlY3ljbGUuXG4gICAgLy8gVGhlIHByb2Nlc3MgYXJndW1lbnQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IEJhc2VEcml2ZXIuXG4gICAgLy8gUGxlYXNlIGNhbGwgQGFwcGl1bS9zdXBwb3J0LnRlbXBEaXIgbW9kdWxlIHRvIGFwcGx5IHRoaXMgYmVuZWZpdC5cbiAgICBpZiAob3B0cy50bXBEaXIpIHtcbiAgICAgIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSID0gb3B0cy50bXBEaXI7XG4gICAgfVxuXG4gICAgc3VwZXIob3B0cyk7XG5cbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHM7XG5cbiAgICB0aGlzLmFyZ3MgPSB7Li4ub3B0c307XG5cbiAgICAvLyBhbGxvdyB0aGlzIHRvIGhhcHBlbiBpbiB0aGUgYmFja2dyb3VuZCwgc28gbm8gYGF3YWl0YFxuICAgIC8vIGNhdGNoIHRoaXMgdG8gYXZvaWQgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuLHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICAgIHVwZGF0ZUJ1aWxkSW5mbygpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGVycik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgdW1icmVsbGEgZHJpdmVyIGluc3RhbmNlXG4gICAqL1xuICBnZXQgbG9nICgpIHtcbiAgICBpZiAoIXRoaXMuX2xvZykge1xuICAgICAgY29uc3QgaW5zdGFuY2VOYW1lID0gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfUAke25vZGUuZ2V0T2JqZWN0SWQodGhpcykuc3Vic3RyaW5nKDAsIDQpfWA7XG4gICAgICB0aGlzLl9sb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKGluc3RhbmNlTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICByZXR1cm4gXy50b1BhaXJzKHRoaXMuc2Vzc2lvbnMpXG4gICAgICAubWFwKChbaWQsIGRyaXZlcl0pID0+ICh7aWQsIGNhcGFiaWxpdGllczogZHJpdmVyLmNhcHN9KSk7XG4gIH1cblxuICBwcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQgKGRyaXZlck5hbWUsIGRyaXZlclZlcnNpb24sIGRyaXZlckJhc2VWZXJzaW9uKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhkcml2ZXJWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gKHYke2RyaXZlclZlcnNpb259KSBzZXNzaW9uYFxuICAgICAgOiBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9IHNlc3Npb25gXG4gICAgKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBDaGVja2luZyBCYXNlRHJpdmVyIHZlcnNpb25zIGZvciBBcHBpdW0gYW5kICR7ZHJpdmVyTmFtZX1gKTtcbiAgICB0aGlzLmxvZy5pbmZvKEFwcGl1bURyaXZlci5iYXNlVmVyc2lvblxuICAgICAgPyBgQXBwaXVtJ3MgQmFzZURyaXZlciB2ZXJzaW9uIGlzICR7QXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9ufWBcbiAgICAgIDogYENvdWxkIG5vdCBkZXRlcm1pbmUgQXBwaXVtJ3MgQmFzZURyaXZlciB2ZXJzaW9uYFxuICAgICk7XG4gICAgdGhpcy5sb2cuaW5mbyhkcml2ZXJCYXNlVmVyc2lvblxuICAgICAgPyBgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke2RyaXZlckJhc2VWZXJzaW9ufWBcbiAgICAgIDogYENvdWxkIG5vdCBkZXRlcm1pbmUgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBhc3NpZ24gQ0xJIGFyZ3MgZm9yIGEgZHJpdmVyIG9yIHBsdWdpblxuICAgKlxuICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBwcm92aWRlZCBhIHNjaGVtYSwgdmFsaWRhdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZC5cbiAgICpcbiAgICogQW55IGFyZyB3aGljaCBpcyBlcXVhbCB0byBpdHMgZGVmYXVsdCB2YWx1ZSB3aWxsIG5vdCBiZSBhc3NpZ25lZCB0byB0aGUgZXh0ZW5zaW9uLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgJ2RyaXZlcicgb3IgJ3BsdWdpbidcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0gZXh0SW5zdGFuY2UgdGhlIGRyaXZlciBvciBwbHVnaW4gaW5zdGFuY2VcbiAgICovXG4gIGFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbiAoZXh0VHlwZSwgZXh0TmFtZSwgZXh0SW5zdGFuY2UpIHtcbiAgICBjb25zdCBhbGxDbGlBcmdzRm9yRXh0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLHVua25vd24+fHVuZGVmaW5lZH0gKi8odGhpcy5hcmdzW2V4dFR5cGVdPy5bZXh0TmFtZV0pO1xuICAgIGlmICghXy5pc0VtcHR5KGFsbENsaUFyZ3NGb3JFeHQpKSB7XG4gICAgICBjb25zdCBkZWZhdWx0cyA9IGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uKGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgICAgY29uc3QgY2xpQXJncyA9IF8uaXNFbXB0eShkZWZhdWx0cylcbiAgICAgICAgPyBhbGxDbGlBcmdzRm9yRXh0XG4gICAgICAgIDogXy5vbWl0QnkoYWxsQ2xpQXJnc0ZvckV4dCwgKHZhbHVlLCBrZXkpID0+IF8uaXNFcXVhbChkZWZhdWx0c1trZXldLCB2YWx1ZSkpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoY2xpQXJncykpIHtcbiAgICAgICAgZXh0SW5zdGFuY2UuY2xpQXJncyA9IGNsaUFyZ3M7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBzZXNzaW9uXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzfSBqc29ud3BDYXBzIEpTT05XUCBmb3JtYXR0ZWQgZGVzaXJlZCBjYXBhYmlsaXRpZXNcbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IHJlcUNhcHMgUmVxdWlyZWQgY2FwYWJpbGl0aWVzIChKU09OV1Agc3RhbmRhcmQpXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzfSB3M2NDYXBhYmlsaXRpZXMgVzNDIGNhcGFiaWxpdGllc1xuICAgKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckRhdGFbXX0gW2RyaXZlckRhdGFdXG4gICAqL1xuICBhc3luYyBjcmVhdGVTZXNzaW9uIChqc29ud3BDYXBzLCByZXFDYXBzLCB3M2NDYXBhYmlsaXRpZXMsIGRyaXZlckRhdGEpIHtcbiAgICBjb25zdCBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAodGhpcy5hcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5ncyA9IHB1bGxTZXR0aW5ncyhkZWZhdWx0Q2FwYWJpbGl0aWVzKTtcbiAgICBqc29ud3BDYXBzID0gXy5jbG9uZURlZXAoanNvbndwQ2Fwcyk7XG4gICAgY29uc3QgandwU2V0dGluZ3MgPSB7Li4uZGVmYXVsdFNldHRpbmdzLCAuLi5wdWxsU2V0dGluZ3MoanNvbndwQ2Fwcyl9O1xuICAgIHczY0NhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKHczY0NhcGFiaWxpdGllcyk7XG4gICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY2xpZW50IG9ubHkgcHJvdmlkZXMgY2FwcyB1c2luZyBKU09OV1Agc3RhbmRhcmQsXG4gICAgLy8gYWx0aG91Z2ggZmlyc3RNYXRjaC9hbHdheXNNYXRjaCBwcm9wZXJ0aWVzIGFyZSBzdGlsbCBwcmVzZW50LlxuICAgIC8vIEluIHN1Y2ggY2FzZSB3ZSBhc3N1bWUgdGhlIGNsaWVudCB1bmRlcnN0YW5kcyBXM0MgcHJvdG9jb2wgYW5kIG1lcmdlIHRoZSBnaXZlblxuICAgIC8vIEpTT05XUCBjYXBzIHRvIFczQyBjYXBzXG4gICAgY29uc3QgdzNjU2V0dGluZ3MgPSB7XG4gICAgICAuLi5qd3BTZXR0aW5ncyxcbiAgICAgIC4uLnB1bGxTZXR0aW5ncygodzNjQ2FwYWJpbGl0aWVzID8/IHt9KS5hbHdheXNNYXRjaCA/PyB7fSlcbiAgICB9O1xuICAgIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mICgodzNjQ2FwYWJpbGl0aWVzID8/IHt9KS5maXJzdE1hdGNoID8/IFtdKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXN9ID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXRpbHMnKS5QYXJzZWREcml2ZXJDYXBzfSAqLyhwYXJzZWRDYXBzKTtcbiAgICAgIHByb3RvY29sID0gcGFyc2VkQ2Fwcy5wcm90b2NvbDtcbiAgICAgIGNvbnN0IGVycm9yID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXRpbHMnKS5JbnZhbGlkQ2Fwc30gKi8ocGFyc2VkQ2FwcykuZXJyb3I7XG4gICAgICAvLyBJZiB0aGUgcGFyc2luZyBvZiB0aGUgY2FwcyBwcm9kdWNlZCBhbiBlcnJvciwgdGhyb3cgaXQgaW4gaGVyZVxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGRyaXZlcjogSW5uZXJEcml2ZXIsXG4gICAgICAgIHZlcnNpb246IGRyaXZlclZlcnNpb24sXG4gICAgICAgIGRyaXZlck5hbWVcbiAgICAgIH0gPSB0aGlzLmRyaXZlckNvbmZpZy5maW5kTWF0Y2hpbmdEcml2ZXIoZGVzaXJlZENhcHMpO1xuICAgICAgdGhpcy5wcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoSW5uZXJEcml2ZXIubmFtZSwgZHJpdmVyVmVyc2lvbiwgSW5uZXJEcml2ZXIuYmFzZVZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0RyaXZlckRhdGFbXX1cbiAgICAgICAqL1xuICAgICAgbGV0IHJ1bm5pbmdEcml2ZXJzRGF0YSA9IFtdO1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7RHJpdmVyRGF0YVtdfVxuICAgICAgICovXG4gICAgICBsZXQgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEgPSBbXTtcblxuICAgICAgY29uc3QgZHJpdmVySW5zdGFuY2UgPSBuZXcgSW5uZXJEcml2ZXIodGhpcy5hcmdzLCB0cnVlKTtcblxuICAgICAgLy8gV2Ugd2FudCB0byBhc3NpZ24gc2VjdXJpdHkgdmFsdWVzIGRpcmVjdGx5IG9uIHRoZSBkcml2ZXIuIFRoZSBkcml2ZXJcbiAgICAgIC8vIHNob3VsZCBub3QgcmVhZCBzZWN1cml0eSB2YWx1ZXMgZnJvbSBgdGhpcy5vcHRzYCBiZWNhdXNlIHRob3NlIHZhbHVlc1xuICAgICAgLy8gY291bGQgaGF2ZSBiZWVuIHNldCBieSBhIG1hbGljaW91cyB1c2VyIHZpYSBjYXBhYmlsaXRpZXMsIHdoZXJlYXMgd2VcbiAgICAgIC8vIHdhbnQgYSBndWFyYW50ZWUgdGhlIHZhbHVlcyB3ZXJlIHNldCBieSB0aGUgYXBwaXVtIHNlcnZlciBhZG1pblxuICAgICAgaWYgKHRoaXMuYXJncy5yZWxheGVkU2VjdXJpdHlFbmFibGVkKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICBgc2VydmVyIGNvbW1hbmQgbGluZSBhcmd1bWVudC4gQWxsIGluc2VjdXJlIGZlYXR1cmVzIHdpbGwgYmUgYCArXG4gICAgICAgICAgYGVuYWJsZWQgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQgYnkgLS1kZW55LWluc2VjdXJlYCk7XG4gICAgICAgIGRyaXZlckluc3RhbmNlLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuZGVueUluc2VjdXJlKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdFeHBsaWNpdGx5IHByZXZlbnRpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuZGVueUluc2VjdXJlLm1hcCgoYSkgPT4gdGhpcy5sb2cuaW5mbyhgICAgICR7YX1gKSk7XG4gICAgICAgIGRyaXZlckluc3RhbmNlLmRlbnlJbnNlY3VyZSA9IHRoaXMuYXJncy5kZW55SW5zZWN1cmU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5hbGxvd0luc2VjdXJlKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdFeHBsaWNpdGx5IGVuYWJsaW5nIHVzZSBvZiBpbnNlY3VyZSBmZWF0dXJlczonKTtcbiAgICAgICAgdGhpcy5hcmdzLmFsbG93SW5zZWN1cmUubWFwKChhKSA9PiB0aGlzLmxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuYWxsb3dJbnNlY3VyZSA9IHRoaXMuYXJncy5hbGxvd0luc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaWtld2lzZSwgYW55IGRyaXZlci1zcGVjaWZpYyBDTEkgYXJncyB0aGF0IHdlcmUgcGFzc2VkIGluIHNob3VsZCBiZSBhc3NpZ25lZCBkaXJlY3RseSB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIG1pbWlja2VkIGJ5IGEgbWFsaWNpb3VzIHVzZXIgc2VuZGluZyBpbiBjYXBhYmlsaXRpZXNcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdkcml2ZXInLCBkcml2ZXJOYW1lLCBkcml2ZXJJbnN0YW5jZSk7XG5cbiAgICAgIC8vIFRoaXMgYXNzaWdubWVudCBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCB3ZWIgc29ja2V0cyBmdW5jdGlvbmFsaXR5IGluc2lkZSB0aGUgZHJpdmVyXG4gICAgICAvLyBEcml2ZXJzL3BsdWdpbnMgbWlnaHQgYWxzbyB3YW50IHRvIGtub3cgd2hlcmUgdGhleSBhcmUgaG9zdGVkXG5cbiAgICAgIC8vIFhYWDogdGVtcG9yYXJ5IGhhY2sgdG8gd29yayBhcm91bmQgIzE2NzQ3XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXIgPSB0aGlzLnNlcnZlcjtcbiAgICAgIGRyaXZlckluc3RhbmNlLnNlcnZlckhvc3QgPSB0aGlzLmFyZ3MuYWRkcmVzcztcbiAgICAgIGRyaXZlckluc3RhbmNlLnNlcnZlclBvcnQgPSB0aGlzLmFyZ3MucG9ydDtcbiAgICAgIGRyaXZlckluc3RhbmNlLnNlcnZlclBhdGggPSB0aGlzLmFyZ3MuYmFzZVBhdGg7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bm5pbmdEcml2ZXJzRGF0YSA9IGF3YWl0IHRoaXMuY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIoSW5uZXJEcml2ZXIpID8/IFtdO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdID0gdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSB8fCBbXTtcbiAgICAgICAgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEgPSBfLmNvbXBhY3QodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5tYXAoKGRydikgPT4gZHJ2LmRyaXZlckRhdGEpKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5wdXNoKGRyaXZlckluc3RhbmNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzXSA9IGF3YWl0IGRyaXZlckluc3RhbmNlLmNyZWF0ZVNlc3Npb24oXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHJlcUNhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIFsuLi5ydW5uaW5nRHJpdmVyc0RhdGEsIC4uLm90aGVyUGVuZGluZ0RyaXZlcnNEYXRhXVxuICAgICAgICApO1xuICAgICAgICBwcm90b2NvbCA9IGRyaXZlckluc3RhbmNlLnByb3RvY29sO1xuICAgICAgICB0aGlzLnNlc3Npb25zW2lubmVyU2Vzc2lvbklkXSA9IGRyaXZlckluc3RhbmNlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgcGVuZGluZ0RyaXZlcnNHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgICAgXy5wdWxsKHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0sIGRyaXZlckluc3RhbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlcihkcml2ZXJJbnN0YW5jZSwgaW5uZXJTZXNzaW9uSWQpO1xuXG4gICAgICB0aGlzLmxvZy5pbmZvKGBOZXcgJHtJbm5lckRyaXZlci5uYW1lfSBzZXNzaW9uIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCBzZXNzaW9uIGAgK1xuICAgICAgICBgJHtpbm5lclNlc3Npb25JZH0gYWRkZWQgdG8gbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuXG4gICAgICAvLyBzZXQgdGhlIE5ldyBDb21tYW5kIFRpbWVvdXQgZm9yIHRoZSBpbm5lciBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgICAgLy8gYXBwbHkgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIChpZiBwcm92aWRlZClcbiAgICAgIGlmIChkcml2ZXJJbnN0YW5jZS5pc1czQ1Byb3RvY29sKCkgJiYgIV8uaXNFbXB0eSh3M2NTZXR0aW5ncykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBXM0MgY2FwczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodzNjU2V0dGluZ3MpKTtcbiAgICAgICAgYXdhaXQgZHJpdmVySW5zdGFuY2UudXBkYXRlU2V0dGluZ3ModzNjU2V0dGluZ3MpO1xuICAgICAgfSBlbHNlIGlmIChkcml2ZXJJbnN0YW5jZS5pc01qc29ud3BQcm90b2NvbCgpICYmICFfLmlzRW1wdHkoandwU2V0dGluZ3MpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYEFwcGx5aW5nIHRoZSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgcGFyc2VkIGZyb20gTUpTT05XUCBjYXBzOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShqd3BTZXR0aW5ncykpO1xuICAgICAgICBhd2FpdCBkcml2ZXJJbnN0YW5jZS51cGRhdGVTZXR0aW5ncyhqd3BTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3RvY29sLFxuICAgICAgdmFsdWU6IFtpbm5lclNlc3Npb25JZCwgZENhcHMsIHByb3RvY29sXVxuICAgIH07XG4gIH1cblxuICBhdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyIChkcml2ZXIsIGlubmVyU2Vzc2lvbklkKSB7XG4gICAgY29uc3Qgb25TaHV0ZG93biA9IChjYXVzZSA9IG5ldyBFcnJvcignVW5rbm93biBlcnJvcicpKSA9PiB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFbmRpbmcgc2Vzc2lvbiwgY2F1c2Ugd2FzICcke2NhdXNlLm1lc3NhZ2V9J2ApO1xuXG4gICAgICBpZiAodGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF0pIHtcbiAgICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKHBsdWdpbi5vblVuZXhwZWN0ZWRTaHV0ZG93bikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBQbHVnaW4gJHtwbHVnaW4ubmFtZX0gZGVmaW5lcyBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXI7IGNhbGxpbmcgaXQgbm93YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBwbHVnaW4ub25VbmV4cGVjdGVkU2h1dGRvd24oZHJpdmVyLCBjYXVzZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYEdvdCBhbiBlcnJvciB3aGVuIHJ1bm5pbmcgcGx1Z2luICR7cGx1Z2luLm5hbWV9IHNodXRkb3duIGhhbmRsZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBkb2VzIG5vdCBkZWZpbmUgYW4gdW5leHBlY3RlZCBzaHV0ZG93biBoYW5kbGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJyR7aW5uZXJTZXNzaW9uSWR9JyBmcm9tIG91ciBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF07XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF07XG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24oZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKG9uU2h1dGRvd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBGYWlsZWQgdG8gYXR0YWNoIHRoZSB1bmV4cGVjdGVkIHNodXRkb3duIGxpc3RlbmVyLiBgICtcbiAgICAgICAgYElzICdvblVuZXhwZWN0ZWRTaHV0ZG93bicgbWV0aG9kIGF2YWlsYWJsZSBmb3IgJyR7ZHJpdmVyLmNvbnN0cnVjdG9yLm5hbWV9Jz9gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL3R5cGVzL2V4dGVuc2lvbicpLkRyaXZlckNsYXNzfSBJbm5lckRyaXZlclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEcml2ZXJEYXRhW10+fX1cbiAgICovXG4gIGFzeW5jIGN1clNlc3Npb25EYXRhRm9yRHJpdmVyIChJbm5lckRyaXZlcikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICBjb25zdCBkYXRhID0gXy5jb21wYWN0KF8udmFsdWVzKHRoaXMuc2Vzc2lvbnMpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLmNvbnN0cnVjdG9yLm5hbWUgPT09IElubmVyRHJpdmVyLm5hbWUpXG4gICAgICAubWFwKChzKSA9PiBzLmRyaXZlckRhdGEpKTtcbiAgICBmb3IgKGNvbnN0IGRhdHVtIG9mIGRhdGEpIHtcbiAgICAgIGlmICghZGF0dW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ibGVtIGdldHRpbmcgc2Vzc2lvbiBkYXRhIGZvciBkcml2ZXIgdHlwZSBgICtcbiAgICAgICAgICBgJHtJbm5lckRyaXZlci5uYW1lfTsgZG9lcyBpdCBpbXBsZW1lbnQgJ2dldCBkcml2ZXJEYXRhJz9gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoc2Vzc2lvbklkKSB7XG4gICAgbGV0IHByb3RvY29sO1xuICAgIHRyeSB7XG4gICAgICBsZXQgb3RoZXJTZXNzaW9uc0RhdGE7XG4gICAgICBjb25zdCBkc3RTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJDb25zdHJ1Y3Rvck5hbWUgPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgb3RoZXJTZXNzaW9uc0RhdGEgPSBfLnRvUGFpcnModGhpcy5zZXNzaW9ucylcbiAgICAgICAgICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lID09PSBjdXJDb25zdHJ1Y3Rvck5hbWUgJiYga2V5ICE9PSBzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUuZHJpdmVyRGF0YSk7XG4gICAgICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAke3Nlc3Npb25JZH0gZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGRlbGV0ZVNlc3Npb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBvciBub3RcbiAgICAgICAgLy8gbWFrZSB0aGUgc2Vzc2lvbiB1bmF2YWlsYWJsZSwgYmVjYXVzZSB3aG8ga25vd3Mgd2hhdCBzdGF0ZSBpdCBtaWdodFxuICAgICAgICAvLyBiZSBpbiBvdGhlcndpc2VcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgcmV0dXJuIGRzdFNlc3Npb247XG4gICAgICB9KTtcbiAgICAgIC8vIHRoaXMgbWF5IG5vdCBiZSBjb3JyZWN0LCBidXQgaWYgYGRzdFNlc3Npb25gIHdhcyBmYWxzeSwgdGhlIGNhbGwgdG8gYGRlbGV0ZVNlc3Npb24oKWAgd291bGRcbiAgICAgIC8vIHRocm93IGFueXdheS5cbiAgICAgIGlmICghZHN0U2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gbm90IGZvdW5kJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgdmFsdWU6IGF3YWl0IGRzdFNlc3Npb24uZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQsIG90aGVyU2Vzc2lvbnNEYXRhKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEhhZCB0cm91YmxlIGVuZGluZyBzZXNzaW9uICR7c2Vzc2lvbklkfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3I6IGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbFNlc3Npb25zIChvcHRzID0ge30pIHtcbiAgICBjb25zdCBzZXNzaW9uc0NvdW50ID0gXy5zaXplKHRoaXMuc2Vzc2lvbnMpO1xuICAgIGlmICgwID09PSBzZXNzaW9uc0NvdW50KSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnVGhlcmUgYXJlIG5vIGFjdGl2ZSBzZXNzaW9ucyBmb3IgY2xlYW51cCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGZvcmNlID0gZmFsc2UsXG4gICAgICByZWFzb24sXG4gICAgfSA9IG9wdHM7XG4gICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ2FjdGl2ZSBzZXNzaW9uJywgc2Vzc2lvbnNDb3VudCwgdHJ1ZSl9YCk7XG4gICAgY29uc3QgY2xlYW51cFByb21pc2VzID0gZm9yY2VcbiAgICAgID8gXy52YWx1ZXModGhpcy5zZXNzaW9ucykubWFwKChkcnYpID0+IGRydi5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihyZWFzb24gJiYgbmV3IEVycm9yKHJlYXNvbikpKVxuICAgICAgOiBfLmtleXModGhpcy5zZXNzaW9ucykubWFwKChpZCkgPT4gdGhpcy5kZWxldGVTZXNzaW9uKGlkKSk7XG4gICAgZm9yIChjb25zdCBjbGVhbnVwUHJvbWlzZSBvZiBjbGVhbnVwUHJvbWlzZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBQcm9taXNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHByb3ByaWF0ZSBwbHVnaW5zIGZvciBhIHNlc3Npb24gKG9yIHNlc3Npb25sZXNzIHBsdWdpbnMpXG4gICAqXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCAob3IgbnVsbCkgdG8gdXNlIHRvIGZpbmQgcGx1Z2luc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gYXJyYXkgb2YgcGx1Z2luIGluc3RhbmNlc1xuICAgKi9cbiAgcGx1Z2luc0ZvclNlc3Npb24gKHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zKSkge1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHBsdWdpbnMgZm9yIGEgY29tbWFuZCwgd2UgZWl0aGVyIGdldCB0aGUgcGx1Z2luIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIHBhcnRpY3VsYXIgY29tbWFuZCdzIHNlc3Npb24sIG9yIGluIHRoZSBjYXNlIG9mIHNlc3Npb25sZXNzIHBsdWdpbnMsIHB1bGwgZnJvbSB0aGUgc2V0IG9mXG4gICAqIHBsdWdpbiBpbnN0YW5jZXMgcmVzZXJ2ZWQgZm9yIHNlc3Npb25sZXNzIGNvbW1hbmRzIChhbmQgd2UgbGF6aWx5IGNyZWF0ZSBwbHVnaW4gaW5zdGFuY2VzIG9uXG4gICAqIGZpcnN0IHVzZSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZCAtIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGZpbmQgYSBwbHVnaW4gdG8gaGFuZGxlXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHBhcnRpY3VsYXIgc2Vzc2lvbiBmb3Igd2hpY2ggdG8gZmluZCBhIHBsdWdpbiwgb3IgbnVsbCBpZlxuICAgKiBzZXNzaW9ubGVzc1xuICAgKi9cbiAgcGx1Z2luc1RvSGFuZGxlQ21kIChjbWQsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICAvLyB0byBoYW5kbGUgYSBnaXZlbiBjb21tYW5kLCBhIHBsdWdpbiBzaG91bGQgZWl0aGVyIGltcGxlbWVudCB0aGF0IGNvbW1hbmQgYXMgYSBwbHVnaW5cbiAgICAvLyBpbnN0YW5jZSBtZXRob2Qgb3IgaXQgc2hvdWxkIGltcGxlbWVudCBhIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgcmV0dXJuIHRoaXMucGx1Z2luc0ZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgICAgLmZpbHRlcigocCkgPT4gXy5pc0Z1bmN0aW9uKHBbY21kXSkgfHwgXy5pc0Z1bmN0aW9uKHAuaGFuZGxlKSk7XG4gIH1cblxuICBjcmVhdGVQbHVnaW5JbnN0YW5jZXMgKCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbkNsYXNzZXMubWFwKChQbHVnaW5DbGFzcykgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IFBsdWdpbkNsYXNzLnBsdWdpbk5hbWU7XG4gICAgICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luQ2xhc3MobmFtZSk7XG4gICAgICB0aGlzLmFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbigncGx1Z2luJywgbmFtZSwgcGx1Z2luKTtcbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8e3ZhbHVlOiBhbnksIGVycm9yPzogRXJyb3IsIHByb3RvY29sOiBzdHJpbmd9IHwgaW1wb3J0KCd0eXBlLWZlc3QnKS5Bc3luY1JldHVyblR5cGU8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyWydleGVjdXRlQ29tbWFuZCddPj59XG4gICAqL1xuICBhc3luYyBleGVjdXRlQ29tbWFuZCAoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gV2UgaGF2ZSBiYXNpY2FsbHkgdGhyZWUgY2FzZXMgZm9yIGhvdyB0byBoYW5kbGUgY29tbWFuZHM6XG4gICAgLy8gMS4gaGFuZGxlIGdldFN0YXR1cyAod2UgZG8gdGhpcyBhcyBhIHNwZWNpYWwgb3V0IG9mIGJhbmQgY2FzZSBzbyBpdCBkb2Vzbid0IGdldCBhZGRlZCB0byBhblxuICAgIC8vICAgIGV4ZWN1dGlvbiBxdWV1ZSwgYW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgZS5nLiBjcmVhdGVTZXNzaW9uIGlzIGluIHByb2dyZXNzKVxuICAgIC8vIDIuIGhhbmRsZSBjb21tYW5kcyB0aGF0IHRoaXMgdW1icmVsbGEgZHJpdmVyIHNob3VsZCBoYW5kbGUsIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgc2Vzc2lvblxuICAgIC8vICAgIGRyaXZlciAoZm9yIGV4YW1wbGUsIGRlbGV0ZVNlc3Npb24sIG9yIG90aGVyIG5vbi1zZXNzaW9uIGNvbW1hbmRzKVxuICAgIC8vIDMuIGhhbmRsZSBzZXNzaW9uIGRyaXZlciBjb21tYW5kcy5cbiAgICAvLyBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCBiZWNhdXNlIHdlIHN1cHBvcnQgY29tbWFuZCBwbHVnaW5zLCB3ZSBuZWVkIHRvIHdyYXAgYW55IG9mIHRoZXNlXG4gICAgLy8gY2FzZXMgd2l0aCBwbHVnaW4gaGFuZGxpbmcuXG5cbiAgICBjb25zdCBpc0dldFN0YXR1cyA9IGNtZCA9PT0gR0VUX1NUQVRVU19DT01NQU5EO1xuICAgIGNvbnN0IGlzVW1icmVsbGFDbWQgPSBpc0FwcGl1bURyaXZlckNvbW1hbmQoY21kKTtcbiAgICBjb25zdCBpc1Nlc3Npb25DbWQgPSBpc1Nlc3Npb25Db21tYW5kKGNtZCk7XG5cbiAgICAvLyBpZiBhIHBsdWdpbiBvdmVycmlkZSBwcm94eWluZyBmb3IgdGhpcyBjb21tYW5kIGFuZCB0aGF0IGlzIHdoeSB3ZSBhcmUgaGVyZSBpbnN0ZWFkIG9mIGp1c3RcbiAgICAvLyBsZXR0aW5nIHRoZSBwcm90b2NvbCBwcm94eSB0aGUgY29tbWFuZCBlbnRpcmVseSwgZGV0ZXJtaW5lIHRoYXQsIGdldCB0aGUgcmVxdWVzdCBvYmplY3QgZm9yXG4gICAgLy8gdXNlIGxhdGVyIG9uLCB0aGVuIGNsZWFuIHVwIHRoZSBhcmdzXG4gICAgY29uc3QgcmVxRm9yUHJveHkgPSBfLmxhc3QoYXJncyk/LnJlcUZvclByb3h5O1xuICAgIGlmIChyZXFGb3JQcm94eSkge1xuICAgICAgYXJncy5wb3AoKTtcbiAgICB9XG5cblxuICAgIC8vIGZpcnN0IGRvIHNvbWUgZXJyb3IgY2hlY2tpbmcuIElmIHdlJ3JlIHJlcXVlc3RpbmcgYSBzZXNzaW9uIGNvbW1hbmQgZXhlY3V0aW9uLCB0aGVuIG1ha2VcbiAgICAvLyBzdXJlIHRoYXQgc2Vzc2lvbiBhY3R1YWxseSBleGlzdHMgb24gdGhlIHNlc3Npb24gZHJpdmVyLCBhbmQgc2V0IHRoZSBzZXNzaW9uIGRyaXZlciBpdHNlbGZcbiAgICBsZXQgc2Vzc2lvbklkID0gbnVsbDtcbiAgICBsZXQgZHN0U2Vzc2lvbiA9IG51bGw7XG4gICAgbGV0IHByb3RvY29sID0gbnVsbDtcbiAgICAvKiogQHR5cGUge3RoaXMgfCBFeHRlcm5hbERyaXZlcn0gKi9cbiAgICBsZXQgZHJpdmVyID0gdGhpcztcbiAgICBpZiAoaXNTZXNzaW9uQ21kKSB7XG4gICAgICBzZXNzaW9uSWQgPSBfLmxhc3QoYXJncyk7XG4gICAgICBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgaWYgKCFkc3RTZXNzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNlc3Npb24gd2l0aCBpZCAnJHtzZXNzaW9uSWR9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgLy8gbm93IHNhdmUgdGhlIHJlc3BvbnNlIHByb3RvY29sIGdpdmVuIHRoYXQgdGhlIHNlc3Npb24gZHJpdmVyJ3MgcHJvdG9jb2wgbWlnaHQgZGlmZmVyXG4gICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICBpZiAoIWlzVW1icmVsbGFDbWQpIHtcbiAgICAgICAgZHJpdmVyID0gZHN0U2Vzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgYW55IHBsdWdpbnMgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgYXMgaGFuZGxpbmcgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgcGx1Z2lucyA9IHRoaXMucGx1Z2luc1RvSGFuZGxlQ21kKGNtZCwgc2Vzc2lvbklkKTtcblxuICAgIC8vIG5vdyB3ZSBkZWZpbmUgYSAnY21kSGFuZGxlZEJ5JyBvYmplY3Qgd2hpY2ggd2lsbCBrZWVwIHRyYWNrIG9mIHdoaWNoIHBsdWdpbnMgaGF2ZSBoYW5kbGVkIHRoaXNcbiAgICAvLyBjb21tYW5kLiB3ZSBjYXJlIGFib3V0IHRoaXMgYmVjYXVzZSAoYSkgbXVsdGlwbGUgcGx1Z2lucyBjYW4gaGFuZGxlIHRoZSBzYW1lIGNvbW1hbmQsIGFuZFxuICAgIC8vIChiKSB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGEgcGx1Z2luIHdpbGwgYWN0dWFsbHkgY2FsbCB0aGUgbmV4dCgpIG1ldGhvZCB3aGljaCBydW5zIHRoZVxuICAgIC8vIG9yaWdpbmFsIGNvbW1hbmQgZXhlY3V0aW9uLiBUaGlzIHJlc3VsdHMgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGNvbW1hbmQgbWlnaHQgYmUgaGFuZGxlZFxuICAgIC8vIGJ5IHNvbWUgYnV0IG5vdCBhbGwgcGx1Z2lucywgb3IgYnkgcGx1Z2luKHMpIGJ1dCBub3QgYnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFNvIHN0YXJ0IG91dFxuICAgIC8vIHRoaXMgb2JqZWN0IGRlY2xhcmluZyB0aGF0IHRoZSBkZWZhdWx0IGhhbmRsZXIgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLlxuICAgIGNvbnN0IGNtZEhhbmRsZWRCeSA9IHtkZWZhdWx0OiBmYWxzZX07XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHBsdWdpbnMsIGFuZCBzdWNjZXNzaXZlbHkgd3JhcHBlZFxuICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGx1Z2luIHRoYXQgY2FuIGhhbmRsZSB0aGUgY29tbWFuZC4gVG8gc3RhcnQgb2ZmIHdpdGgsIHRoZSBhc3luY1xuICAgIC8vIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgY2FsbGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaS5lLiwgd2hpY2hldmVyIG9mIHRoZSAzIGNhc2VzIGFib3ZlIGlzXG4gICAgLy8gdGhlIGFwcHJvcHJpYXRlIG9uZVxuICAgIGNvbnN0IGRlZmF1bHRCZWhhdmlvciA9IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGlmIHdlJ3JlIHJ1bm5pbmcgd2l0aCBwbHVnaW5zLCBtYWtlIHN1cmUgd2UgbG9nIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgYWN0dWFsbHlcbiAgICAgIC8vIGhhcHBlbmluZyBzbyB3ZSBjYW4gdGVsbCB3aGVuIHRoZSBwbHVnaW4gY2FsbCBjaGFpbiBpcyB1bndyYXBwaW5nIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAvLyBpZiB0aGF0J3Mgd2hhdCBoYXBwZW5zXG4gICAgICBwbHVnaW5zLmxlbmd0aCAmJiB0aGlzLmxvZy5pbmZvKGBFeGVjdXRpbmcgZGVmYXVsdCBoYW5kbGluZyBiZWhhdmlvciBmb3IgY29tbWFuZCAnJHtjbWR9J2ApO1xuXG4gICAgICAvLyBpZiB3ZSBtYWtlIGl0IGhlcmUsIHdlIGtub3cgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBoYW5kbGVkXG4gICAgICBjbWRIYW5kbGVkQnkuZGVmYXVsdCA9IHRydWU7XG5cbiAgICAgIGlmIChyZXFGb3JQcm94eSkge1xuICAgICAgICAvLyB3ZSB3b3VsZCBoYXZlIHByb3hpZWQgdGhpcyBjb21tYW5kIGhhZCBhIHBsdWdpbiBub3QgaGFuZGxlZCBpdCwgc28gdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgICAgLy8gaXMgdG8gZG8gdGhlIHByb3h5IGFuZCByZXRyaWV2ZSB0aGUgcmVzdWx0IGludGVybmFsbHkgc28gaXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGluIGNhc2UgaXQgY2FsbHMgJ2F3YWl0IG5leHQoKScuIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgZHJpdmVyIGhhdmUgZGVmaW5lZFxuICAgICAgICAvLyAncHJveHlDb21tYW5kJyBhbmQgbm90IGp1c3QgJ3Byb3h5UmVxUmVzJy5cbiAgICAgICAgaWYgKCFkc3RTZXNzaW9uLnByb3h5Q29tbWFuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24ucHJveHlDb21tYW5kKHJlcUZvclByb3h5Lm9yaWdpbmFsVXJsLCByZXFGb3JQcm94eS5tZXRob2QsXG4gICAgICAgICAgcmVxRm9yUHJveHkuYm9keSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0dldFN0YXR1cykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW1icmVsbGFDbWQpIHtcbiAgICAgICAgLy8gc29tZSBjb21tYW5kcywgbGlrZSBkZWxldGVTZXNzaW9uLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0byBoYW5kbGUgb24gKnRoaXMqIGRyaXZlcixcbiAgICAgICAgLy8gbm90IHRoZSBwbGF0Zm9ybSBkcml2ZXJcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmV4ZWN1dGVDb21tYW5kLmNhbGwodGhpcywgY21kLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVyZSB3ZSBrbm93IHRoYXQgd2UgYXJlIGV4ZWN1dGluZyBhIHNlc3Npb24gY29tbWFuZCwgYW5kIGhhdmUgYSB2YWxpZCBzZXNzaW9uIGRyaXZlclxuICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24uZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRha2Ugb3VyIGRlZmF1bHQgYmVoYXZpb3IsIHdyYXAgaXQgd2l0aCBhbnkgbnVtYmVyIG9mIHBsdWdpbiBiZWhhdmlvcnMsIGFuZCBydW4gaXRcbiAgICBjb25zdCB3cmFwcGVkQ21kID0gdGhpcy53cmFwQ29tbWFuZFdpdGhQbHVnaW5zKHtcbiAgICAgIGRyaXZlciwgY21kLCBhcmdzLCBwbHVnaW5zLCBjbWRIYW5kbGVkQnksIG5leHQ6IGRlZmF1bHRCZWhhdmlvclxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdyYXBwZWRDb21tYW5kKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pO1xuXG4gICAgLy8gaWYgd2UgaGFkIHBsdWdpbnMsIG1ha2Ugc3VyZSB0byBsb2cgb3V0IHRoZSBoZWxwZnVsIHJlcG9ydCBhYm91dCB3aGljaCBwbHVnaW5zIGVuZGVkIHVwXG4gICAgLy8gaGFuZGxpbmcgdGhlIGNvbW1hbmQgYW5kIHdoaWNoIGRpZG4ndFxuICAgIHRoaXMubG9nUGx1Z2luSGFuZGxlclJlcG9ydChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KTtcblxuICAgIC8vIEFuZCBmaW5hbGx5LCBpZiB0aGUgY29tbWFuZCB3YXMgY3JlYXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtaWdyYXRlIGFueSBwbHVnaW5zIHdoaWNoIHdlcmVcbiAgICAvLyBwcmV2aW91c2x5IHNlc3Npb25sZXNzIHRvIHVzZSB0aGUgbmV3IHNlc3Npb25JZCwgc28gdGhhdCBwbHVnaW5zIGNhbiBzaGFyZSBzdGF0ZSBiZXR3ZWVuXG4gICAgLy8gdGhlaXIgY3JlYXRlU2Vzc2lvbiBtZXRob2QgYW5kIG90aGVyIGluc3RhbmNlIG1ldGhvZHNcbiAgICBpZiAoY21kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EICYmIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zLmxlbmd0aCAmJiAhcmVzLmVycm9yKSB7XG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBfLmZpcnN0KHJlcy52YWx1ZSk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBQcm9tb3RpbmcgJHt0aGlzLnNlc3Npb25sZXNzUGx1Z2lucy5sZW5ndGh9IHNlc3Npb25sZXNzIHBsdWdpbnMgdG8gYmUgYXR0YWNoZWQgYCArXG4gICAgICAgIGB0byBzZXNzaW9uIElEICR7c2Vzc2lvbklkfWApO1xuICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gICAgICB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICB3cmFwQ29tbWFuZFdpdGhQbHVnaW5zICh7ZHJpdmVyLCBjbWQsIGFyZ3MsIG5leHQsIGNtZEhhbmRsZWRCeSwgcGx1Z2luc30pIHtcbiAgICBwbHVnaW5zLmxlbmd0aCAmJiB0aGlzLmxvZy5pbmZvKGBQbHVnaW5zIHdoaWNoIGNhbiBoYW5kbGUgY21kICcke2NtZH0nOiAke3BsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpfWApO1xuXG4gICAgLy8gbm93IHdlIGNhbiBnbyB0aHJvdWdoIGVhY2ggcGx1Z2luIGFuZCB3cmFwIGBuZXh0YCBhcm91bmQgaXRzIG93biBoYW5kbGVyLCBwYXNzaW5nIHRoZSAqb2xkKlxuICAgIC8vIG5leHQgaW4gc28gdGhhdCBpdCBjYW4gY2FsbCBpdCBpZiBpdCB3YW50cyB0b1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgIC8vIG5lZWQgYW4gSUlGRSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgb2YgbmV4dCB0aGF0J3MgcGFzc2VkIHRvIHBsdWdpbi5oYW5kbGUgdG8gYmVcbiAgICAgIC8vIGV4YWN0bHkgdGhlIHZhbHVlIG9mIG5leHQgaGVyZSBiZWZvcmUgcmVhc3NpZ25tZW50OyB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGxhemlseVxuICAgICAgLy8gZXZhbHVhdGVkLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBsYXN0IGBuZXh0YCB0byBiZSBkZWZpbmVkLlxuICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IGZhbHNlOyAvLyB3ZSBzZWUgYSBuZXcgcGx1Z2luLCBzbyBhZGQgaXQgdG8gdGhlICdjbWRIYW5kbGVkQnknIG9iamVjdFxuICAgICAgbmV4dCA9ICgoX25leHQpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGlzIG5vdyBoYW5kbGluZyBjbWQgJyR7Y21kfSdgKTtcbiAgICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IHRydWU7IC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgdGhpcyBwbHVnaW4gaGFzIGF0dGVtcHRlZCB0byBoYW5kbGUgY21kXG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBjb21tYW5kIHZpYSBhIGNvbW1hbmQtc3BlY2lmaWMgaGFuZGxlciBvbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmIChwbHVnaW5bY21kXSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW5bY21kXShfbmV4dCwgZHJpdmVyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UsIGNhbGwgdGhlIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW4uaGFuZGxlKF9uZXh0LCBkcml2ZXIsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9KShuZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIGxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQgKHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pIHtcbiAgICBpZiAoIXBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZGF5LCB3ZSBoYXZlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cCBnZXR0aW5nXG4gICAgLy8gdGhlaXIgY29kZSBydW4gYXMgcGFydCBvZiBoYW5kbGluZyB0aGlzIGNvbW1hbmQuIEJlY2F1c2UgcGx1Z2lucyBjYW4gY2hvb3NlICpub3QqIHRvXG4gICAgLy8gcGFzcyBjb250cm9sIHRvIG90aGVyIHBsdWdpbnMgb3IgdG8gdGhlIGRlZmF1bHQgZHJpdmVyIGJlaGF2aW9yLCB0aGlzIGlzIGluZm9ybWF0aW9uXG4gICAgLy8gd2hpY2ggaXMgcHJvYmFibHkgdXNlZnVsIHRvIHRoZSB1c2VyIChlc3BlY2lhbGx5IGluIHNpdHVhdGlvbnMgd2hlcmUgcGx1Z2lucyBtaWdodCBub3RcbiAgICAvLyBpbnRlcmFjdCB3ZWxsIHRvZ2V0aGVyLCBhbmQgaXQgd291bGQgYmUgaGFyZCB0byBkZWJ1ZyBvdGhlcndpc2Ugd2l0aG91dCB0aGlzIGtpbmQgb2ZcbiAgICAvLyBtZXNzYWdlKS5cbiAgICBjb25zdCBkaWRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBjb25zdCBkaWRudEhhbmRsZSA9IE9iamVjdC5rZXlzKGNtZEhhbmRsZWRCeSkuZmlsdGVyKChrKSA9PiAhY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBpZiAoZGlkbnRIYW5kbGUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ29tbWFuZCAnJHtjbWR9JyB3YXMgKm5vdCogaGFuZGxlZCBieSB0aGUgZm9sbG93aW5nIGJlaGF2aW91cnMgb3IgcGx1Z2lucywgZXZlbiBgICtcbiAgICAgICAgYHRob3VnaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCB0byBoYW5kbGUgaXQ6ICR7SlNPTi5zdHJpbmdpZnkoZGlkbnRIYW5kbGUpfS4gVGhlIGAgK1xuICAgICAgICBgY29tbWFuZCAqd2FzKiBoYW5kbGVkIGJ5IHRoZXNlOiAke0pTT04uc3RyaW5naWZ5KGRpZEhhbmRsZSl9LmApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXcmFwcGVkQ29tbWFuZCAoe3dyYXBwZWRDbWQsIHByb3RvY29sfSkge1xuICAgIGxldCBjbWRSZXMsIGNtZEVyciwgcmVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGB3cmFwcGVkQ21kYCBkZWZpbmVzIGEgd2hvbGUgc2VxdWVuY2Ugb2YgcGx1Z2luIGhhbmRsZXJzLCBjdWxtaW5hdGluZyBpblxuICAgICAgLy8gb3VyIGRlZmF1bHQgaGFuZGxlci4gV2hhdGV2ZXIgaXQgcmV0dXJucyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICAgICAgLy8gdXNlci5cbiAgICAgIGNtZFJlcyA9IGF3YWl0IHdyYXBwZWRDbWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbWRFcnIgPSBlO1xuICAgIH1cblxuICAgIC8vIFNhZGx5LCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCBraW5kIG9mIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLiBJdCB3aWxsIGVpdGhlciBiZSBhIGJhcmVcbiAgICAvLyBvYmplY3QsIG9yIGEgcHJvdG9jb2wtYXdhcmUgb2JqZWN0IHdpdGggcHJvdG9jb2wgYW5kIGVycm9yL3ZhbHVlIGtleXMuIFNvIHdlIG5lZWQgdG8gc25pZmZcbiAgICAvLyBpdCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGRvdWJsZS13cmFwIGl0IGlmIGl0J3MgdGhlIGxhdHRlciBraW5kLlxuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY21kUmVzKSAmJiBfLmhhcyhjbWRSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICByZXMgPSBjbWRSZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy52YWx1ZSA9IGNtZFJlcztcbiAgICAgIHJlcy5lcnJvciA9IGNtZEVycjtcbiAgICAgIHJlcy5wcm90b2NvbCA9IHByb3RvY29sO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uID8gZHN0U2Vzc2lvbi5nZXRQcm94eUF2b2lkTGlzdCgpIDogW107XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLmNhblByb3h5KHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gaGVscCBkZWNpZGUgd2hpY2ggY29tbWFuZHMgc2hvdWxkIGJlIHByb3hpZWQgdG8gc3ViLWRyaXZlcnMgYW5kIHdoaWNoXG4vLyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzLCBvdXIgdW1icmVsbGEgZHJpdmVyXG5mdW5jdGlvbiBpc0FwcGl1bURyaXZlckNvbW1hbmQgKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQ7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gQXBwaXVtIHRyaWVkIHRvIHByb3h5IGEgY29tbWFuZCB1c2luZyBhIGRyaXZlcidzIGBwcm94eUNvbW1hbmRgIG1ldGhvZCBidXQgdGhlXG4gKiBtZXRob2QgZGlkIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfTk9fRFJJVkVSX1BST1hZQ09NTUFORCc7XG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKGBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhpcyBjb21tYW5kIHdhcyB0byBwcm94eSwgYnV0IHRoZSBkcml2ZXIgYCArXG4gICAgICAgICAgYGRpZCBub3QgaGF2ZSB0aGUgJ3Byb3h5Q29tbWFuZCcgbWV0aG9kIGRlZmluZWQuIFRvIGZ1bGx5IHN1cHBvcnQgYCArXG4gICAgICAgICAgYHBsdWdpbnMsIGRyaXZlcnMgc2hvdWxkIGhhdmUgJ3Byb3h5Q29tbWFuZCcgc2V0IHRvIGEgandwUHJveHkgb2JqZWN0J3MgYCArXG4gICAgICAgICAgYCdjb21tYW5kKCknIG1ldGhvZCwgaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCAncHJveHlSZXFSZXMnYCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQXBwaXVtRHJpdmVyIH07XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkV4dGVybmFsRHJpdmVyfSBFeHRlcm5hbERyaXZlclxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllc30gVzNDQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyRGF0YX0gRHJpdmVyRGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlcnZlckFyZ3N9IERyaXZlck9wdHNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Db25zdHJhaW50c30gQ29uc3RyYWludHNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1TZXJ2ZXJ9IEFwcGl1bVNlcnZlclxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi90eXBlcy9leHRlbnNpb24nKS5QbHVnaW5DbGFzc30gUGx1Z2luQ2xhc3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vZXh0ZW5zaW9uL2RyaXZlci1jb25maWcnKS5Ecml2ZXJDb25maWd9IERyaXZlckNvbmZpZ1xuICovXG5cbi8qKlxuICogVXNlZCBieSB7QGxpbmtjb2RlIEFwcGl1bURyaXZlci5jcmVhdGVTZXNzaW9ufSBhbmQge0BsaW5rY29kZSBBcHBpdW1Ecml2ZXIuZGVsZXRlU2Vzc2lvbn0gdG8gZGVzY3JpYmVcbiAqIHJlc3VsdC5cbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiBTZXNzaW9uSGFuZGxlclJlc3VsdFxuICogQHByb3BlcnR5IHtWfSBbdmFsdWVdXG4gKiBAcHJvcGVydHkge0Vycm9yfSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Byb3RvY29sXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlc3Npb25IYW5kbGVyPFNlc3Npb25IYW5kbGVyUmVzdWx0PGFueVtdPixTZXNzaW9uSGFuZGxlclJlc3VsdDx2b2lkPj59IFNlc3Npb25IYW5kbGVyXG4gKi9cbiJdfQ==
@@ -70,10 +70,11 @@ export class ArgParser {
70
70
  * If no subcommand is passed in, this method will inject the `server` subcommand.
71
71
  *
72
72
  * `ArgParser.prototype.parse_args` is an alias of this method.
73
+ * @template [T=import('../../types').WithServerSubcommand]
73
74
  * @param {string[]} [args] - Array of arguments, ostensibly from `process.argv`. Gathers args from `process.argv` if not provided.
74
- * @returns {import('../../types/cli').ParsedArgs} - The parsed arguments
75
+ * @returns {import('../../types').Args<T>} - The parsed arguments
75
76
  */
76
- parseArgs(args?: string[] | undefined): import('../../types/cli').ParsedArgs;
77
+ parseArgs<T = import("../../types").WithServerSubcommand>(args?: string[] | undefined): import("../../types").Args<T>;
77
78
  }
78
79
  import { ArgumentParser } from "argparse";
79
80
  //# sourceMappingURL=parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../lib/cli/parser.js"],"names":[],"mappings":"AA6PA;;;;;;GAMG;AACH,wDAFa,SAAS,CAMrB;AAzOD;;;;;;GAMG;AACH;IA2FE;;;;;;;;OAQG;IACH,kCAHW,MAAM,GACJ,MAAM,CAiBlB;IAED;;;OAGG;IACH,0BAFW,cAAc,QASxB;IAED;;;;OAIG;IACH,qCAHW,OAAO,UAAU,EAAE,SAAS,GAC1B,OAAO,QAAQ,EAAE,mBAAmB,CAkBhD;IAED;;;OAGG;IACH,iDAFW,OAAO,UAAU,EAAE,SAAS,QAyDtC;IAnND;;OAEG;IACH,yCAmDC;IAxCC;;;OAGG;IACH,MAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,OAFU,OAAO,CAEC;IAElB;;;OAGG;IACH,QAFU,cAAc,CAEJ;IAcpB,8CAAyB;IAMzB;;OAEG;IACH,YAFU,SAAS,CAAC,WAAW,CAAC,CAEA;IAGlC;;;;;;;;OAQG;IACH,wCAFa,OAAO,iBAAiB,EAAE,UAAU,CAyBhD;CA4HF"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../lib/cli/parser.js"],"names":[],"mappings":"AA8PA;;;;;;GAMG;AACH,wDAFa,SAAS,CAMrB;AA1OD;;;;;;GAMG;AACH;IA4FE;;;;;;;;OAQG;IACH,kCAHW,MAAM,GACJ,MAAM,CAiBlB;IAED;;;OAGG;IACH,0BAFW,cAAc,QASxB;IAED;;;;OAIG;IACH,qCAHW,OAAO,UAAU,EAAE,SAAS,GAC1B,OAAO,QAAQ,EAAE,mBAAmB,CAkBhD;IAED;;;OAGG;IACH,iDAFW,OAAO,UAAU,EAAE,SAAS,QAyDtC;IApND;;OAEG;IACH,yCAmDC;IAxCC;;;OAGG;IACH,MAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,OAFU,OAAO,CAEC;IAElB;;;OAGG;IACH,QAFU,cAAc,CAEJ;IAcpB,8CAAyB;IAMzB;;OAEG;IACH,YAFU,SAAS,CAAC,WAAW,CAAC,CAEA;IAGlC;;;;;;;;;OASG;IACH,sHAuBC;CA4HF"}
@@ -188,4 +188,4 @@ function getParser(debug) {
188
188
  (0, _schema.finalizeSchema)();
189
189
  return new ArgParser(debug);
190
190
  }
191
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvcGFyc2VyLmpzIl0sIm5hbWVzIjpbIk5PTl9TRVJWRVJfQVJHUyIsIk9iamVjdCIsImZyZWV6ZSIsIlNldCIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJTRVJWRVJfU1VCQ09NTUFORCIsInZlcnNpb24iLCJmcyIsInJlYWRQYWNrYWdlSnNvbkZyb20iLCJyb290RGlyIiwiQXJnUGFyc2VyIiwiY29uc3RydWN0b3IiLCJkZWJ1ZyIsInByb2ciLCJwcm9jZXNzIiwiYXJndiIsInBhdGgiLCJiYXNlbmFtZSIsInBhcnNlciIsIkFyZ3VtZW50UGFyc2VyIiwiYWRkX2hlbHAiLCJkZXNjcmlwdGlvbiIsIl9wYXRjaEV4aXQiLCJhZGRfYXJndW1lbnQiLCJhY3Rpb24iLCJzdWJQYXJzZXJzIiwiYWRkX3N1YnBhcnNlcnMiLCJkZXN0Iiwic2VydmVyQXJncyIsIl9hZGRTZXJ2ZXJUb1BhcnNlciIsInJhd0FyZ3MiLCJfYWRkRXh0ZW5zaW9uQ29tbWFuZHNUb1BhcnNlciIsInBhcnNlX2FyZ3MiLCJwYXJzZUFyZ3MiLCJhcmdzIiwic2xpY2UiLCJoYXMiLCJ1bnNoaWZ0IiwicGFyc2VkIiwiX3RyYW5zZm9ybVBhcnNlZEFyZ3MiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJtZXNzYWdlIiwiZXhpdCIsIl8iLCJyZWR1Y2UiLCJ1bnBhY2tlZCIsInZhbHVlIiwia2V5IiwiaXNVbmRlZmluZWQiLCJzZXQiLCJjb2RlIiwibXNnIiwiRXJyb3IiLCJzdWJQYXJzZXIiLCJzZXJ2ZXJQYXJzZXIiLCJhZGRfcGFyc2VyIiwiaGVscCIsImZsYWdzT3JOYW1lcyIsIm9wdHMiLCJ0eXBlIiwiZXh0UGFyc2VyIiwiZXh0U3ViUGFyc2VycyIsImV4dGVuc2lvbkFyZ3MiLCJwYXJzZXJTcGVjcyIsImNvbW1hbmQiLCJsaXN0IiwiaW5zdGFsbCIsInVuaW5zdGFsbCIsInVwZGF0ZSIsInJ1biIsImdldFBhcnNlciJdLCJtYXBwaW5ncyI6Ijs7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QUFiLENBQW9CUyxNQUY1QjtBQUdFWixRQUFBQSxJQUFJLEVBQUcsb0JBQW1CRyxJQUFLO0FBSGpDLE9BaEJrQixFQXFCbEI7QUFDRUssUUFBQUEsT0FBTyxFQUFFLEtBRFg7QUFFRWhDLFFBQUFBLElBQUksRUFBRThCLGFBQWEsQ0FBQ0gsSUFBRCxDQUFiLENBQW9CVSxHQUY1QjtBQUdFYixRQUFBQSxJQUFJLEVBQ0Qsb0NBQW1DRyxJQUFLLDRCQUF6QyxHQUNDLGdFQUErREEsSUFBSztBQUx6RSxPQXJCa0IsQ0FBcEI7O0FBOEJBLFdBQUssTUFBTTtBQUFDSyxRQUFBQSxPQUFEO0FBQVVoQyxRQUFBQSxJQUFWO0FBQWdCd0IsUUFBQUE7QUFBaEIsT0FBWCxJQUFvQ08sV0FBcEMsRUFBaUQ7QUFDL0MsY0FBTS9DLE1BQU0sR0FBRzZDLGFBQWEsQ0FBQ04sVUFBZCxDQUF5QlMsT0FBekIsRUFBa0M7QUFBQ1IsVUFBQUE7QUFBRCxTQUFsQyxDQUFmOztBQUVBaEQsUUFBQUEsU0FBUyxDQUFDWSxVQUFWLENBQXFCSixNQUFyQjs7QUFFQSxhQUFLLE1BQU0sQ0FBQ3lDLFlBQUQsRUFBZUMsSUFBZixDQUFYLElBQW1DMUIsSUFBbkMsRUFBeUM7QUFHdkNoQixVQUFBQSxNQUFNLENBQUNLLFlBQVAsQ0FBb0IsR0FBR29DLFlBQXZCLEVBQXFDLEVBQUMsR0FBR0M7QUFBSixXQUFyQztBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQXBOYTs7OztBQThOaEIsU0FBU1ksU0FBVCxDQUFvQjVELEtBQXBCLEVBQTJCO0FBQ3pCO0FBRUEsU0FBTyxJQUFJRixTQUFKLENBQWNFLEtBQWQsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBBcmd1bWVudFBhcnNlciB9IGZyb20gJ2FyZ3BhcnNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IERSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSwgU0VSVkVSX1NVQkNPTU1BTkQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZmluYWxpemVTY2hlbWEsIGdldEFyZ1NwZWMsIGhhc0FyZ1NwZWMgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgcm9vdERpciB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge1xuICBnZXRFeHRlbnNpb25BcmdzLFxuICBnZXRTZXJ2ZXJBcmdzXG59IGZyb20gJy4vYXJncyc7XG5cbi8qKlxuICogSWYgdGhlIHBhcnNlZCBhcmdzIGRvIG5vdCBjb250YWluIGFueSBvZiB0aGVzZSB2YWx1ZXMsIHRoZW4gd2VcbiAqIHdpbGwgYXV0b21hdGlhbGx5IGluamVjdCB0aGUgYHNlcnZlcmAgc3ViY29tbWFuZC5cbiAqL1xuY29uc3QgTk9OX1NFUlZFUl9BUkdTID0gT2JqZWN0LmZyZWV6ZShcbiAgbmV3IFNldChbXG4gICAgRFJJVkVSX1RZUEUsXG4gICAgUExVR0lOX1RZUEUsXG4gICAgU0VSVkVSX1NVQkNPTU1BTkQsXG4gICAgJy1oJyxcbiAgICAnLS1oZWxwJyxcbiAgICAnLXYnLFxuICAgICctLXZlcnNpb24nXG4gIF0pXG4pO1xuXG5jb25zdCB2ZXJzaW9uID0gZnMucmVhZFBhY2thZ2VKc29uRnJvbShyb290RGlyKS52ZXJzaW9uO1xuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgYGFyZ3BhcnNlYFxuICpcbiAqIC0gSGFuZGxlcyBpbnN0YW50aWF0aW9uLCBjb25maWd1cmF0aW9uLCBhbmQgbW9ua2V5cGF0Y2hpbmcgb2YgYW5cbiAqICAgIGBBcmd1bWVudFBhcnNlcmAgaW5zdGFuY2UgZm9yIEFwcGl1bSBzZXJ2ZXIgYW5kIGl0cyBleHRlbnNpb25zXG4gKiAtIEhhbmRsZXMgZXJyb3IgY29uZGl0aW9ucywgbWVzc2FnZXMsIGFuZCBleGl0IGJlaGF2aW9yXG4gKi9cbmNsYXNzIEFyZ1BhcnNlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWJ1Z10gLSBJZiB0cnVlLCB0aHJvdyBpbnN0ZWFkIG9mIGV4aXQgb24gZXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGVidWcgPSBmYWxzZSkge1xuICAgIGNvbnN0IHByb2cgPSBwcm9jZXNzLmFyZ3ZbMV0gPyBwYXRoLmJhc2VuYW1lKHByb2Nlc3MuYXJndlsxXSkgOiAnYXBwaXVtJztcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoe1xuICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0Egd2ViZHJpdmVyLWNvbXBhdGlibGUgc2VydmVyIHRoYXQgZmFjaWxpdGF0ZXMgYXV0b21hdGlvbiBvZiB3ZWIsIG1vYmlsZSwgYW5kIG90aGVyIHR5cGVzIG9mIGFwcHMgYWNyb3NzIHZhcmlvdXMgcGxhdGZvcm1zLicsXG4gICAgICBwcm9nLFxuICAgIH0pO1xuXG4gICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQocGFyc2VyKTtcblxuICAgIC8qKlxuICAgICAqIFByb2dyYW0gbmFtZSAodHlwaWNhbGx5IGBhcHBpdW1gKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5wcm9nID0gcHJvZztcblxuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhyb3cgYW4gZXJyb3Igb24gcGFyc2UgZmFpbHVyZSBpbnN0ZWFkIG9mIHByaW50aW5nIGhlbHBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG5cbiAgICAvKipcbiAgICAgKiBXcmFwcGVkIGBBcmd1bWVudFBhcnNlcmAgaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7QXJndW1lbnRQYXJzZXJ9XG4gICAgICovXG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cbiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcnNpb24nLCB7XG4gICAgICBhY3Rpb246ICd2ZXJzaW9uJyxcbiAgICAgIHZlcnNpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdWJQYXJzZXJzID0gcGFyc2VyLmFkZF9zdWJwYXJzZXJzKHtkZXN0OiAnc3ViY29tbWFuZCd9KTtcblxuICAgIC8vIGFkZCB0aGUgJ3NlcnZlcicgc3ViY29tbWFuZCwgYW5kIHN0b3JlIHRoZSByYXcgYXJndW1lbnRzIG9uIHRoZSBwYXJzZXJcbiAgICAvLyBvYmplY3QgYXMgYSB3YXkgZm9yIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlIHRvIHdvcmsgd2l0aCB0aGUgYXJndW1lbnRzXG4gICAgLy8gY29uY2VwdHVhbGx5IHJhdGhlciB0aGFuIGp1c3QgdGhyb3VnaCBhcmdwYXJzZVxuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBBcmdQYXJzZXIuX2FkZFNlcnZlclRvUGFyc2VyKHN1YlBhcnNlcnMpO1xuXG4gICAgdGhpcy5yYXdBcmdzID0gc2VydmVyQXJncztcblxuICAgIC8vIGFkZCB0aGUgJ2RyaXZlcicgYW5kICdwbHVnaW4nIHN1YmNvbW1hbmRzXG4gICAgQXJnUGFyc2VyLl9hZGRFeHRlbnNpb25Db21tYW5kc1RvUGFyc2VyKHN1YlBhcnNlcnMpO1xuXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgLyBkcm9wLWluIHdyYXBwZXJcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7QXJnUGFyc2VyWydwYXJzZUFyZ3MnXX1cbiAgICAgKi9cbiAgICB0aGlzLnBhcnNlX2FyZ3MgPSB0aGlzLnBhcnNlQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhcmd1bWVudHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuICAgKlxuICAgKiBJZiBubyBzdWJjb21tYW5kIGlzIHBhc3NlZCBpbiwgdGhpcyBtZXRob2Qgd2lsbCBpbmplY3QgdGhlIGBzZXJ2ZXJgIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIGBBcmdQYXJzZXIucHJvdG90eXBlLnBhcnNlX2FyZ3NgIGlzIGFuIGFsaWFzIG9mIHRoaXMgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJnc10gLSBBcnJheSBvZiBhcmd1bWVudHMsIG9zdGVuc2libHkgZnJvbSBgcHJvY2Vzcy5hcmd2YC4gR2F0aGVycyBhcmdzIGZyb20gYHByb2Nlc3MuYXJndmAgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuLi8uLi90eXBlcy9jbGknKS5QYXJzZWRBcmdzfSAtIFRoZSBwYXJzZWQgYXJndW1lbnRzXG4gICAqL1xuICBwYXJzZUFyZ3MgKGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpIHtcbiAgICBpZiAoIU5PTl9TRVJWRVJfQVJHUy5oYXMoYXJnc1swXSkpIHtcbiAgICAgIGFyZ3MudW5zaGlmdChTRVJWRVJfU1VCQ09NTUFORCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VyLnBhcnNlX2FyZ3MoYXJncyk7XG4gICAgICByZXR1cm4gQXJnUGFyc2VyLl90cmFuc2Zvcm1QYXJzZWRBcmdzKHBhcnNlZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIGlzbid0IHRlc3RlZCB2aWEgdW5pdCB0ZXN0cyAod2UgdXNlIGBkZWJ1ZzogdHJ1ZWApIHNvIG1heSBlc2NhcGUgY292ZXJhZ2UuXG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKTsgLy8gbmVlZCBhbiBleHRyYSBzcGFjZSBzaW5jZSBhcmdwYXJzZSBwcmludHMgdXNhZ2UuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIG9iamVjdCBmdWxsIG9mIGFyZ3VtZW50cyBhcyByZXR1cm5lZCBieSBgYXJncGFyc2VyLnBhcnNlX2FyZ3NgLFxuICAgKiBleHBhbmQgdGhlIG9uZXMgZm9yIGV4dGVuc2lvbnMgaW50byBhIG5lc3RlZCBvYmplY3Qgc3RydWN0dXJlIGFuZCByZW5hbWVcbiAgICoga2V5cyB0byBtYXRjaCB0aGUgaW50ZW5kZWQgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIEUuZy4sIGB7J2RyaXZlci1mb28tYmFyJzogYmF6fWAgYmVjb21lcyBge2RyaXZlcjoge2Zvbzoge2JhcjogJ2Jheid9fX1gXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBzdGF0aWMgX3RyYW5zZm9ybVBhcnNlZEFyZ3MgKGFyZ3MpIHtcbiAgICByZXR1cm4gXy5yZWR1Y2UoXG4gICAgICBhcmdzLFxuICAgICAgKHVucGFja2VkLCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh2YWx1ZSkgJiYgaGFzQXJnU3BlYyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qge2Rlc3R9ID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4uL3NjaGVtYS9hcmctc3BlYycpLkFyZ1NwZWN9ICovKGdldEFyZ1NwZWMoa2V5KSk7XG4gICAgICAgICAgXy5zZXQodW5wYWNrZWQsIGRlc3QsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGFueXRoaW5nIHRoYXQgX2lzbid0XyBhIHNlcnZlciBhcmdcbiAgICAgICAgICB1bnBhY2tlZFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVucGFja2VkO1xuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgYGV4aXQoKWAgbWV0aG9kIG9mIHRoZSBwYXJzZXIgdG8gdGhyb3cgYW4gZXJyb3IsIHNvIHdlIGNhbiBoYW5kbGUgaXQgbWFudWFsbHkuXG4gICAqIEBwYXJhbSB7QXJndW1lbnRQYXJzZXJ9IHBhcnNlclxuICAgKi9cbiAgc3RhdGljIF9wYXRjaEV4aXQgKHBhcnNlcikge1xuICAgIHBhcnNlci5leGl0ID0gKGNvZGUsIG1zZykgPT4ge1xuICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdhcmdwYXJzZScpLlN1YlBhcnNlcn0gc3ViUGFyc2VyXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJy4vYXJncycpLkFyZ3VtZW50RGVmaW5pdGlvbnN9XG4gICAqL1xuICBzdGF0aWMgX2FkZFNlcnZlclRvUGFyc2VyIChzdWJQYXJzZXIpIHtcbiAgICBjb25zdCBzZXJ2ZXJQYXJzZXIgPSBzdWJQYXJzZXIuYWRkX3BhcnNlcignc2VydmVyJywge1xuICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICBoZWxwOiAnUnVuIGFuIEFwcGl1bSBzZXJ2ZXInLFxuICAgIH0pO1xuXG4gICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQoc2VydmVyUGFyc2VyKTtcblxuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBnZXRTZXJ2ZXJBcmdzKCk7XG4gICAgZm9yIChjb25zdCBbZmxhZ3NPck5hbWVzLCBvcHRzXSBvZiBzZXJ2ZXJBcmdzKSB7XG4gICAgICAvLyBUUyBkb2Vzbid0IGxpa2UgdGhlIHNwcmVhZCBvcGVyYXRvciBoZXJlLlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgc2VydmVyUGFyc2VyLmFkZF9hcmd1bWVudCguLi5mbGFnc09yTmFtZXMsIHsuLi5vcHRzfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZlckFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBleHRlbnNpb24gc3ViLXN1Yi1jb21tYW5kcyB0byBgZHJpdmVyYC9gcGx1Z2luYCBzdWJjb21tYW5kc1xuICAgKiBAcGFyYW0ge2ltcG9ydCgnYXJncGFyc2UnKS5TdWJQYXJzZXJ9IHN1YlBhcnNlcnNcbiAgICovXG4gIHN0YXRpYyBfYWRkRXh0ZW5zaW9uQ29tbWFuZHNUb1BhcnNlciAoc3ViUGFyc2Vycykge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiBbRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFXSkge1xuICAgICAgY29uc3QgZXh0UGFyc2VyID0gc3ViUGFyc2Vycy5hZGRfcGFyc2VyKHR5cGUsIHtcbiAgICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICAgIGhlbHA6IGBBY2Nlc3MgdGhlICR7dHlwZX0gbWFuYWdlbWVudCBDTEkgY29tbWFuZHNgLFxuICAgICAgfSk7XG5cbiAgICAgIEFyZ1BhcnNlci5fcGF0Y2hFeGl0KGV4dFBhcnNlcik7XG5cbiAgICAgIGNvbnN0IGV4dFN1YlBhcnNlcnMgPSBleHRQYXJzZXIuYWRkX3N1YnBhcnNlcnMoe1xuICAgICAgICBkZXN0OiBgJHt0eXBlfUNvbW1hbmRgLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRlbnNpb25BcmdzID0gZ2V0RXh0ZW5zaW9uQXJncygpO1xuICAgICAgY29uc3QgcGFyc2VyU3BlY3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiAnbGlzdCcsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS5saXN0LFxuICAgICAgICAgIGhlbHA6IGBMaXN0IGF2YWlsYWJsZSBhbmQgaW5zdGFsbGVkICR7dHlwZX1zYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICdpbnN0YWxsJyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLmluc3RhbGwsXG4gICAgICAgICAgaGVscDogYEluc3RhbGwgYSAke3R5cGV9YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICd1bmluc3RhbGwnLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0udW5pbnN0YWxsLFxuICAgICAgICAgIGhlbHA6IGBVbmluc3RhbGwgYSAke3R5cGV9YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICd1cGRhdGUnLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0udXBkYXRlLFxuICAgICAgICAgIGhlbHA6IGBVcGRhdGUgaW5zdGFsbGVkICR7dHlwZX1zIHRvIHRoZSBsYXRlc3QgdmVyc2lvbmAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiAncnVuJyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLnJ1bixcbiAgICAgICAgICBoZWxwOlxuICAgICAgICAgICAgYFJ1biBhIHNjcmlwdCAoZGVmaW5lZCBpbnNpZGUgdGhlICR7dHlwZX0ncyBwYWNrYWdlLmpzb24gdW5kZXIgdGhlIGAgK1xuICAgICAgICAgICAgYOKAnHNjcmlwdHPigJ0gZmllbGQgaW5zaWRlIHRoZSDigJxhcHBpdW3igJ0gZmllbGQpIGZyb20gYW4gaW5zdGFsbGVkICR7dHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCB7Y29tbWFuZCwgYXJncywgaGVscH0gb2YgcGFyc2VyU3BlY3MpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gZXh0U3ViUGFyc2Vycy5hZGRfcGFyc2VyKGNvbW1hbmQsIHtoZWxwfSk7XG5cbiAgICAgICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQocGFyc2VyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmbGFnc09yTmFtZXMsIG9wdHNdIG9mIGFyZ3MpIHtcbiAgICAgICAgICAvLyBhZGRfYXJndW1lbnQgbXV0YXRlcyBwYXJhbXMgc28gbWFrZSBzdXJlIHRvIHNlbmQgaW4gY29waWVzIGluc3RlYWRcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCguLi5mbGFnc09yTmFtZXMsIHsuLi5vcHRzfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEFyZ1BhcnNlcn0gaW5zdGFuY2U7IGZpbmFsaXplcyB0aGUgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAY29uc3RydWN0cyBBcmdQYXJzZXJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlYnVnXSAtIElmIGB0cnVlYCwgdGhyb3cgaW5zdGVhZCBvZiBleGl0IHVwb24gcGFyc2luZyBlcnJvclxuICogQHJldHVybnMge0FyZ1BhcnNlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0UGFyc2VyIChkZWJ1Zykge1xuICBmaW5hbGl6ZVNjaGVtYSgpO1xuXG4gIHJldHVybiBuZXcgQXJnUGFyc2VyKGRlYnVnKTtcbn1cblxuZXhwb3J0IHsgZ2V0UGFyc2VyLCBBcmdQYXJzZXIgfTtcbiJdfQ==
191
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvcGFyc2VyLmpzIl0sIm5hbWVzIjpbIk5PTl9TRVJWRVJfQVJHUyIsIk9iamVjdCIsImZyZWV6ZSIsIlNldCIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJTRVJWRVJfU1VCQ09NTUFORCIsInZlcnNpb24iLCJmcyIsInJlYWRQYWNrYWdlSnNvbkZyb20iLCJyb290RGlyIiwiQXJnUGFyc2VyIiwiY29uc3RydWN0b3IiLCJkZWJ1ZyIsInByb2ciLCJwcm9jZXNzIiwiYXJndiIsInBhdGgiLCJiYXNlbmFtZSIsInBhcnNlciIsIkFyZ3VtZW50UGFyc2VyIiwiYWRkX2hlbHAiLCJkZXNjcmlwdGlvbiIsIl9wYXRjaEV4aXQiLCJhZGRfYXJndW1lbnQiLCJhY3Rpb24iLCJzdWJQYXJzZXJzIiwiYWRkX3N1YnBhcnNlcnMiLCJkZXN0Iiwic2VydmVyQXJncyIsIl9hZGRTZXJ2ZXJUb1BhcnNlciIsInJhd0FyZ3MiLCJfYWRkRXh0ZW5zaW9uQ29tbWFuZHNUb1BhcnNlciIsInBhcnNlX2FyZ3MiLCJwYXJzZUFyZ3MiLCJhcmdzIiwic2xpY2UiLCJoYXMiLCJ1bnNoaWZ0IiwicGFyc2VkIiwiX3RyYW5zZm9ybVBhcnNlZEFyZ3MiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJtZXNzYWdlIiwiZXhpdCIsIl8iLCJyZWR1Y2UiLCJ1bnBhY2tlZCIsInZhbHVlIiwia2V5IiwiaXNVbmRlZmluZWQiLCJzZXQiLCJjb2RlIiwibXNnIiwiRXJyb3IiLCJzdWJQYXJzZXIiLCJzZXJ2ZXJQYXJzZXIiLCJhZGRfcGFyc2VyIiwiaGVscCIsImZsYWdzT3JOYW1lcyIsIm9wdHMiLCJ0eXBlIiwiZXh0UGFyc2VyIiwiZXh0U3ViUGFyc2VycyIsImV4dGVuc2lvbkFyZ3MiLCJwYXJzZXJTcGVjcyIsImNvbW1hbmQiLCJsaXN0IiwiaW5zdGFsbCIsInVuaW5zdGFsbCIsInVwZGF0ZSIsInJ1biIsImdldFBhcnNlciJdLCJtYXBwaW5ncyI6Ijs7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QUFiLENBQW9CUyxNQUY1QjtBQUdFWixRQUFBQSxJQUFJLEVBQUcsb0JBQW1CRyxJQUFLO0FBSGpDLE9BaEJrQixFQXFCbEI7QUFDRUssUUFBQUEsT0FBTyxFQUFFLEtBRFg7QUFFRWhDLFFBQUFBLElBQUksRUFBRThCLGFBQWEsQ0FBQ0gsSUFBRCxDQUFiLENBQW9CVSxHQUY1QjtBQUdFYixRQUFBQSxJQUFJLEVBQ0Qsb0NBQW1DRyxJQUFLLDRCQUF6QyxHQUNDLGdFQUErREEsSUFBSztBQUx6RSxPQXJCa0IsQ0FBcEI7O0FBOEJBLFdBQUssTUFBTTtBQUFDSyxRQUFBQSxPQUFEO0FBQVVoQyxRQUFBQSxJQUFWO0FBQWdCd0IsUUFBQUE7QUFBaEIsT0FBWCxJQUFvQ08sV0FBcEMsRUFBaUQ7QUFDL0MsY0FBTS9DLE1BQU0sR0FBRzZDLGFBQWEsQ0FBQ04sVUFBZCxDQUF5QlMsT0FBekIsRUFBa0M7QUFBQ1IsVUFBQUE7QUFBRCxTQUFsQyxDQUFmOztBQUVBaEQsUUFBQUEsU0FBUyxDQUFDWSxVQUFWLENBQXFCSixNQUFyQjs7QUFFQSxhQUFLLE1BQU0sQ0FBQ3lDLFlBQUQsRUFBZUMsSUFBZixDQUFYLElBQW1DMUIsSUFBbkMsRUFBeUM7QUFHdkNoQixVQUFBQSxNQUFNLENBQUNLLFlBQVAsQ0FBb0IsR0FBR29DLFlBQXZCLEVBQXFDLEVBQUMsR0FBR0M7QUFBSixXQUFyQztBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQXJOYTs7OztBQStOaEIsU0FBU1ksU0FBVCxDQUFvQjVELEtBQXBCLEVBQTJCO0FBQ3pCO0FBRUEsU0FBTyxJQUFJRixTQUFKLENBQWNFLEtBQWQsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBBcmd1bWVudFBhcnNlciB9IGZyb20gJ2FyZ3BhcnNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IERSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSwgU0VSVkVSX1NVQkNPTU1BTkQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZmluYWxpemVTY2hlbWEsIGdldEFyZ1NwZWMsIGhhc0FyZ1NwZWMgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgcm9vdERpciB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge1xuICBnZXRFeHRlbnNpb25BcmdzLFxuICBnZXRTZXJ2ZXJBcmdzXG59IGZyb20gJy4vYXJncyc7XG5cbi8qKlxuICogSWYgdGhlIHBhcnNlZCBhcmdzIGRvIG5vdCBjb250YWluIGFueSBvZiB0aGVzZSB2YWx1ZXMsIHRoZW4gd2VcbiAqIHdpbGwgYXV0b21hdGlhbGx5IGluamVjdCB0aGUgYHNlcnZlcmAgc3ViY29tbWFuZC5cbiAqL1xuY29uc3QgTk9OX1NFUlZFUl9BUkdTID0gT2JqZWN0LmZyZWV6ZShcbiAgbmV3IFNldChbXG4gICAgRFJJVkVSX1RZUEUsXG4gICAgUExVR0lOX1RZUEUsXG4gICAgU0VSVkVSX1NVQkNPTU1BTkQsXG4gICAgJy1oJyxcbiAgICAnLS1oZWxwJyxcbiAgICAnLXYnLFxuICAgICctLXZlcnNpb24nXG4gIF0pXG4pO1xuXG5jb25zdCB2ZXJzaW9uID0gZnMucmVhZFBhY2thZ2VKc29uRnJvbShyb290RGlyKS52ZXJzaW9uO1xuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgYGFyZ3BhcnNlYFxuICpcbiAqIC0gSGFuZGxlcyBpbnN0YW50aWF0aW9uLCBjb25maWd1cmF0aW9uLCBhbmQgbW9ua2V5cGF0Y2hpbmcgb2YgYW5cbiAqICAgIGBBcmd1bWVudFBhcnNlcmAgaW5zdGFuY2UgZm9yIEFwcGl1bSBzZXJ2ZXIgYW5kIGl0cyBleHRlbnNpb25zXG4gKiAtIEhhbmRsZXMgZXJyb3IgY29uZGl0aW9ucywgbWVzc2FnZXMsIGFuZCBleGl0IGJlaGF2aW9yXG4gKi9cbmNsYXNzIEFyZ1BhcnNlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWJ1Z10gLSBJZiB0cnVlLCB0aHJvdyBpbnN0ZWFkIG9mIGV4aXQgb24gZXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGVidWcgPSBmYWxzZSkge1xuICAgIGNvbnN0IHByb2cgPSBwcm9jZXNzLmFyZ3ZbMV0gPyBwYXRoLmJhc2VuYW1lKHByb2Nlc3MuYXJndlsxXSkgOiAnYXBwaXVtJztcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoe1xuICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0Egd2ViZHJpdmVyLWNvbXBhdGlibGUgc2VydmVyIHRoYXQgZmFjaWxpdGF0ZXMgYXV0b21hdGlvbiBvZiB3ZWIsIG1vYmlsZSwgYW5kIG90aGVyIHR5cGVzIG9mIGFwcHMgYWNyb3NzIHZhcmlvdXMgcGxhdGZvcm1zLicsXG4gICAgICBwcm9nLFxuICAgIH0pO1xuXG4gICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQocGFyc2VyKTtcblxuICAgIC8qKlxuICAgICAqIFByb2dyYW0gbmFtZSAodHlwaWNhbGx5IGBhcHBpdW1gKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5wcm9nID0gcHJvZztcblxuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhyb3cgYW4gZXJyb3Igb24gcGFyc2UgZmFpbHVyZSBpbnN0ZWFkIG9mIHByaW50aW5nIGhlbHBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG5cbiAgICAvKipcbiAgICAgKiBXcmFwcGVkIGBBcmd1bWVudFBhcnNlcmAgaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7QXJndW1lbnRQYXJzZXJ9XG4gICAgICovXG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cbiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcnNpb24nLCB7XG4gICAgICBhY3Rpb246ICd2ZXJzaW9uJyxcbiAgICAgIHZlcnNpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdWJQYXJzZXJzID0gcGFyc2VyLmFkZF9zdWJwYXJzZXJzKHtkZXN0OiAnc3ViY29tbWFuZCd9KTtcblxuICAgIC8vIGFkZCB0aGUgJ3NlcnZlcicgc3ViY29tbWFuZCwgYW5kIHN0b3JlIHRoZSByYXcgYXJndW1lbnRzIG9uIHRoZSBwYXJzZXJcbiAgICAvLyBvYmplY3QgYXMgYSB3YXkgZm9yIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlIHRvIHdvcmsgd2l0aCB0aGUgYXJndW1lbnRzXG4gICAgLy8gY29uY2VwdHVhbGx5IHJhdGhlciB0aGFuIGp1c3QgdGhyb3VnaCBhcmdwYXJzZVxuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBBcmdQYXJzZXIuX2FkZFNlcnZlclRvUGFyc2VyKHN1YlBhcnNlcnMpO1xuXG4gICAgdGhpcy5yYXdBcmdzID0gc2VydmVyQXJncztcblxuICAgIC8vIGFkZCB0aGUgJ2RyaXZlcicgYW5kICdwbHVnaW4nIHN1YmNvbW1hbmRzXG4gICAgQXJnUGFyc2VyLl9hZGRFeHRlbnNpb25Db21tYW5kc1RvUGFyc2VyKHN1YlBhcnNlcnMpO1xuXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgLyBkcm9wLWluIHdyYXBwZXJcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7QXJnUGFyc2VyWydwYXJzZUFyZ3MnXX1cbiAgICAgKi9cbiAgICB0aGlzLnBhcnNlX2FyZ3MgPSB0aGlzLnBhcnNlQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhcmd1bWVudHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuICAgKlxuICAgKiBJZiBubyBzdWJjb21tYW5kIGlzIHBhc3NlZCBpbiwgdGhpcyBtZXRob2Qgd2lsbCBpbmplY3QgdGhlIGBzZXJ2ZXJgIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIGBBcmdQYXJzZXIucHJvdG90eXBlLnBhcnNlX2FyZ3NgIGlzIGFuIGFsaWFzIG9mIHRoaXMgbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgW1Q9aW1wb3J0KCcuLi8uLi90eXBlcycpLldpdGhTZXJ2ZXJTdWJjb21tYW5kXVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJnc10gLSBBcnJheSBvZiBhcmd1bWVudHMsIG9zdGVuc2libHkgZnJvbSBgcHJvY2Vzcy5hcmd2YC4gR2F0aGVycyBhcmdzIGZyb20gYHByb2Nlc3MuYXJndmAgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuLi8uLi90eXBlcycpLkFyZ3M8VD59IC0gVGhlIHBhcnNlZCBhcmd1bWVudHNcbiAgICovXG4gIHBhcnNlQXJncyAoYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKSkge1xuICAgIGlmICghTk9OX1NFUlZFUl9BUkdTLmhhcyhhcmdzWzBdKSkge1xuICAgICAgYXJncy51bnNoaWZ0KFNFUlZFUl9TVUJDT01NQU5EKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZXIucGFyc2VfYXJncyhhcmdzKTtcbiAgICAgIHJldHVybiBBcmdQYXJzZXIuX3RyYW5zZm9ybVBhcnNlZEFyZ3MocGFyc2VkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMgaXNuJ3QgdGVzdGVkIHZpYSB1bml0IHRlc3RzICh3ZSB1c2UgYGRlYnVnOiB0cnVlYCkgc28gbWF5IGVzY2FwZSBjb3ZlcmFnZS5cblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcigpOyAvLyBuZWVkIGFuIGV4dHJhIHNwYWNlIHNpbmNlIGFyZ3BhcnNlIHByaW50cyB1c2FnZS5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gb2JqZWN0IGZ1bGwgb2YgYXJndW1lbnRzIGFzIHJldHVybmVkIGJ5IGBhcmdwYXJzZXIucGFyc2VfYXJnc2AsXG4gICAqIGV4cGFuZCB0aGUgb25lcyBmb3IgZXh0ZW5zaW9ucyBpbnRvIGEgbmVzdGVkIG9iamVjdCBzdHJ1Y3R1cmUgYW5kIHJlbmFtZVxuICAgKiBrZXlzIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbi5cbiAgICpcbiAgICogRS5nLiwgYHsnZHJpdmVyLWZvby1iYXInOiBiYXp9YCBiZWNvbWVzIGB7ZHJpdmVyOiB7Zm9vOiB7YmFyOiAnYmF6J319fWBcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHN0YXRpYyBfdHJhbnNmb3JtUGFyc2VkQXJncyAoYXJncykge1xuICAgIHJldHVybiBfLnJlZHVjZShcbiAgICAgIGFyZ3MsXG4gICAgICAodW5wYWNrZWQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHZhbHVlKSAmJiBoYXNBcmdTcGVjKGtleSkpIHtcbiAgICAgICAgICBjb25zdCB7ZGVzdH0gPSAvKiogQHR5cGUge2ltcG9ydCgnLi4vc2NoZW1hL2FyZy1zcGVjJykuQXJnU3BlY30gKi8oZ2V0QXJnU3BlYyhrZXkpKTtcbiAgICAgICAgICBfLnNldCh1bnBhY2tlZCwgZGVzdCwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgYW55dGhpbmcgdGhhdCBfaXNuJ3RfIGEgc2VydmVyIGFyZ1xuICAgICAgICAgIHVucGFja2VkW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5wYWNrZWQ7XG4gICAgICB9LFxuICAgICAge30sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSBgZXhpdCgpYCBtZXRob2Qgb2YgdGhlIHBhcnNlciB0byB0aHJvdyBhbiBlcnJvciwgc28gd2UgY2FuIGhhbmRsZSBpdCBtYW51YWxseS5cbiAgICogQHBhcmFtIHtBcmd1bWVudFBhcnNlcn0gcGFyc2VyXG4gICAqL1xuICBzdGF0aWMgX3BhdGNoRXhpdCAocGFyc2VyKSB7XG4gICAgcGFyc2VyLmV4aXQgPSAoY29kZSwgbXNnKSA9PiB7XG4gICAgICBpZiAoY29kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2FyZ3BhcnNlJykuU3ViUGFyc2VyfSBzdWJQYXJzZXJcbiAgICogQHJldHVybnMge2ltcG9ydCgnLi9hcmdzJykuQXJndW1lbnREZWZpbml0aW9uc31cbiAgICovXG4gIHN0YXRpYyBfYWRkU2VydmVyVG9QYXJzZXIgKHN1YlBhcnNlcikge1xuICAgIGNvbnN0IHNlcnZlclBhcnNlciA9IHN1YlBhcnNlci5hZGRfcGFyc2VyKCdzZXJ2ZXInLCB7XG4gICAgICBhZGRfaGVscDogdHJ1ZSxcbiAgICAgIGhlbHA6ICdSdW4gYW4gQXBwaXVtIHNlcnZlcicsXG4gICAgfSk7XG5cbiAgICBBcmdQYXJzZXIuX3BhdGNoRXhpdChzZXJ2ZXJQYXJzZXIpO1xuXG4gICAgY29uc3Qgc2VydmVyQXJncyA9IGdldFNlcnZlckFyZ3MoKTtcbiAgICBmb3IgKGNvbnN0IFtmbGFnc09yTmFtZXMsIG9wdHNdIG9mIHNlcnZlckFyZ3MpIHtcbiAgICAgIC8vIFRTIGRvZXNuJ3QgbGlrZSB0aGUgc3ByZWFkIG9wZXJhdG9yIGhlcmUuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBzZXJ2ZXJQYXJzZXIuYWRkX2FyZ3VtZW50KC4uLmZsYWdzT3JOYW1lcywgey4uLm9wdHN9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmVyQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV4dGVuc2lvbiBzdWItc3ViLWNvbW1hbmRzIHRvIGBkcml2ZXJgL2BwbHVnaW5gIHN1YmNvbW1hbmRzXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdhcmdwYXJzZScpLlN1YlBhcnNlcn0gc3ViUGFyc2Vyc1xuICAgKi9cbiAgc3RhdGljIF9hZGRFeHRlbnNpb25Db21tYW5kc1RvUGFyc2VyIChzdWJQYXJzZXJzKSB7XG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEVdKSB7XG4gICAgICBjb25zdCBleHRQYXJzZXIgPSBzdWJQYXJzZXJzLmFkZF9wYXJzZXIodHlwZSwge1xuICAgICAgICBhZGRfaGVscDogdHJ1ZSxcbiAgICAgICAgaGVscDogYEFjY2VzcyB0aGUgJHt0eXBlfSBtYW5hZ2VtZW50IENMSSBjb21tYW5kc2AsXG4gICAgICB9KTtcblxuICAgICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQoZXh0UGFyc2VyKTtcblxuICAgICAgY29uc3QgZXh0U3ViUGFyc2VycyA9IGV4dFBhcnNlci5hZGRfc3VicGFyc2Vycyh7XG4gICAgICAgIGRlc3Q6IGAke3R5cGV9Q29tbWFuZGAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbkFyZ3MgPSBnZXRFeHRlbnNpb25BcmdzKCk7XG4gICAgICBjb25zdCBwYXJzZXJTcGVjcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICdsaXN0JyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLmxpc3QsXG4gICAgICAgICAgaGVscDogYExpc3QgYXZhaWxhYmxlIGFuZCBpbnN0YWxsZWQgJHt0eXBlfXNgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ2luc3RhbGwnLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0uaW5zdGFsbCxcbiAgICAgICAgICBoZWxwOiBgSW5zdGFsbCBhICR7dHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ3VuaW5zdGFsbCcsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS51bmluc3RhbGwsXG4gICAgICAgICAgaGVscDogYFVuaW5zdGFsbCBhICR7dHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ3VwZGF0ZScsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS51cGRhdGUsXG4gICAgICAgICAgaGVscDogYFVwZGF0ZSBpbnN0YWxsZWQgJHt0eXBlfXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICdydW4nLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0ucnVuLFxuICAgICAgICAgIGhlbHA6XG4gICAgICAgICAgICBgUnVuIGEgc2NyaXB0IChkZWZpbmVkIGluc2lkZSB0aGUgJHt0eXBlfSdzIHBhY2thZ2UuanNvbiB1bmRlciB0aGUgYCArXG4gICAgICAgICAgICBg4oCcc2NyaXB0c+KAnSBmaWVsZCBpbnNpZGUgdGhlIOKAnGFwcGl1beKAnSBmaWVsZCkgZnJvbSBhbiBpbnN0YWxsZWQgJHt0eXBlfWAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IHtjb21tYW5kLCBhcmdzLCBoZWxwfSBvZiBwYXJzZXJTcGVjcykge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBleHRTdWJQYXJzZXJzLmFkZF9wYXJzZXIoY29tbWFuZCwge2hlbHB9KTtcblxuICAgICAgICBBcmdQYXJzZXIuX3BhdGNoRXhpdChwYXJzZXIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ZsYWdzT3JOYW1lcywgb3B0c10gb2YgYXJncykge1xuICAgICAgICAgIC8vIGFkZF9hcmd1bWVudCBtdXRhdGVzIHBhcmFtcyBzbyBtYWtlIHN1cmUgdG8gc2VuZCBpbiBjb3BpZXMgaW5zdGVhZFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KC4uLmZsYWdzT3JOYW1lcywgey4uLm9wdHN9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgQXJnUGFyc2VyfSBpbnN0YW5jZTsgZmluYWxpemVzIHRoZSBjb25maWcgc2NoZW1hLlxuICpcbiAqIEBjb25zdHJ1Y3RzIEFyZ1BhcnNlclxuICogQHBhcmFtIHtib29sZWFufSBbZGVidWddIC0gSWYgYHRydWVgLCB0aHJvdyBpbnN0ZWFkIG9mIGV4aXQgdXBvbiBwYXJzaW5nIGVycm9yXG4gKiBAcmV0dXJucyB7QXJnUGFyc2VyfVxuICovXG5mdW5jdGlvbiBnZXRQYXJzZXIgKGRlYnVnKSB7XG4gIGZpbmFsaXplU2NoZW1hKCk7XG5cbiAgcmV0dXJuIG5ldyBBcmdQYXJzZXIoZGVidWcpO1xufVxuXG5leHBvcnQgeyBnZXRQYXJzZXIsIEFyZ1BhcnNlciB9O1xuIl19
@@ -1,4 +1,5 @@
1
- export type ParsedArgs = import('../types/cli').ParsedArgs;
1
+ export type ParsedArgs = import('../types').ParsedArgs;
2
+ export type Args = import('../types').Args;
2
3
  export type ArgSpec = import("./schema/arg-spec").ArgSpec<any>;
3
4
  /**
4
5
  * Mutable object containing Appium build information. By default it
@@ -17,10 +18,10 @@ export function warnNodeDeprecations(): void;
17
18
  export function validateTmpDir(tmpDir: string): Promise<void>;
18
19
  /**
19
20
  * Returns k/v pairs of server arguments which are _not_ the defaults.
20
- * @param {ParsedArgs} parsedArgs
21
- * @returns {Partial<ParsedArgs>}
21
+ * @param {Args} parsedArgs
22
+ * @returns {Args}
22
23
  */
23
- export function getNonDefaultServerArgs(parsedArgs: ParsedArgs): Partial<ParsedArgs>;
24
+ export function getNonDefaultServerArgs(parsedArgs: Args): Args;
24
25
  export function getGitRev(useGithubApiFallback?: boolean): Promise<any>;
25
26
  export const APPIUM_VER: any;
26
27
  export function updateBuildInfo(useGithubApiFallback?: boolean): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.js"],"names":[],"mappings":"yBAoTa,OAAO,cAAc,EAAE,UAAU;;AAzL9C;;;;;;GAMG;AACH,gCAFa,OAAO,cAAc,EAAE,SAAS,CAI5C;AAED,oCAKC;AAgBD,+CAGC;AAjBD,6CAYC;AAsID;;GAEG;AACH,uCAFW,MAAM,iBAShB;AAzID;;;;GAIG;AACH,oDAHW,UAAU,GACR,QAAQ,UAAU,CAAC,CA8E/B;AA5LD,wEA8BC;AAvED,6BAAsC;AAkBtC,+EAUC;AAwND;;;;;;;;;;GAUG;AACH,0DALW,QAAQ,UAAU,CAAC,gBACnB,OAAO,eAAe,EAAE,oBAAoB,YAC5C,QAAQ,UAAU,CAAC,cACnB,UAAU,QAoBpB;AAcD,6BAAuC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.js"],"names":[],"mappings":"yBAoTa,OAAO,UAAU,EAAE,UAAU;mBAC7B,OAAO,UAAU,EAAE,IAAI;;AA1LpC;;;;;;GAMG;AACH,gCAFa,OAAO,cAAc,EAAE,SAAS,CAI5C;AAED,oCAKC;AAgBD,+CAGC;AAjBD,6CAYC;AAsID;;GAEG;AACH,uCAFW,MAAM,iBAShB;AAzID;;;;GAIG;AACH,oDAHW,IAAI,GACF,IAAI,CA8EhB;AA5LD,wEA8BC;AAvED,6BAAsC;AAkBtC,+EAUC;AAwND;;;;;;;;;;GAUG;AACH,0DALW,QAAQ,UAAU,CAAC,gBACnB,OAAO,eAAe,EAAE,oBAAoB,YAC5C,QAAQ,UAAU,CAAC,cACnB,UAAU,QAoBpB;AAcD,6BAAuC"}
@@ -252,4 +252,4 @@ async function validateTmpDir(tmpDir) {
252
252
  const rootDir = _support.fs.findRoot(__dirname);
253
253
 
254
254
  exports.rootDir = rootDir;
255
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jb25maWcuanMiXSwibmFtZXMiOlsibnBtUGFja2FnZSIsImZzIiwicmVhZFBhY2thZ2VKc29uRnJvbSIsIl9fZGlybmFtZSIsIkFQUElVTV9WRVIiLCJ2ZXJzaW9uIiwiTUlOX05PREVfVkVSU0lPTiIsImVuZ2luZXMiLCJub2RlIiwiR0lUX01FVEFfUk9PVCIsIkdJVF9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJHSVRIVUJfQVBJIiwiQlVJTERfSU5GTyIsImdldE5vZGVWZXJzaW9uIiwic2VtdmVyIiwiY29lcmNlIiwicHJvY2VzcyIsInVwZGF0ZUJ1aWxkSW5mbyIsInVzZUdpdGh1YkFwaUZhbGxiYWNrIiwic2hhIiwiZ2V0R2l0UmV2IiwiYnVpbHQiLCJnZXRHaXRUaW1lc3RhbXAiLCJmaW5kR2l0Um9vdCIsImN3ZCIsInJvb3REaXIiLCJ0eXBlIiwiZ2l0Um9vdCIsInN0ZG91dCIsInRyaW0iLCJpZ24iLCJyZXNCb2R5T2JqIiwiYXhpb3MiLCJnZXQiLCJoZWFkZXJzIiwiZGF0YSIsIl8iLCJpc0FycmF5IiwibmFtZSIsImNvbW1pdCIsImNvbW1pdFNoYSIsImNvbW1pdHRlciIsImRhdGUiLCJhdXRob3IiLCJnZXRCdWlsZEluZm8iLCJjaGVja05vZGVPayIsInNhdGlzZmllcyIsImxvZ2dlciIsImVycm9yQW5kVGhyb3ciLCJ3YXJuTm9kZURlcHJlY2F0aW9ucyIsInNob3dCdWlsZEluZm8iLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzIiwicGFyc2VkQXJncyIsImZsYXR0ZW4iLCJhcmdzIiwiYXJnU3BlY3MiLCJmbGF0dGVuZWQiLCJyZWR1Y2UiLCJ2YWx1ZXMiLCJhY2MiLCJhcmdTcGVjIiwiaGFzIiwiZGVzdCIsInZhbHVlIiwidHlwZXNEaWZmZXIiLCJkZWZhdWx0c0Zyb21TY2hlbWEiLCJkZWZhdWx0VmFsdWVJc0FycmF5IiwiYXJnc1ZhbHVlSXNBcnJheSIsImFycmF5c0RpZmZlciIsImd0Iiwic2l6ZSIsImRpZmZlcmVuY2UiLCJ2YWx1ZXNEaWZmZXIiLCJkZWZhdWx0SXNEZWZpbmVkIiwiaXNVbmRlZmluZWQiLCJhcmdWYWx1ZU5vdEFycmF5T3JBcnJheXNEaWZmZXIiLCJvdmVyU29tZSIsIm5lZ2F0ZSIsImRlZmF1bHRWYWx1ZU5vdEFycmF5QW5kVmFsdWVzRGlmZmVyIiwib3ZlckV2ZXJ5IiwiaXNOb3REZWZhdWx0IiwicGlja0J5IiwiX18iLCJrZXkiLCJzZXQiLCJjb21wYWN0Q29uZmlnIiwicGFydGlhbCIsIm9taXRCeSIsImlzT2JqZWN0IiwiaXNFbXB0eSIsInNob3dDb25maWciLCJub25EZWZhdWx0UHJlQ29uZmlnUGFyc2VkQXJncyIsImNvbmZpZ1Jlc3VsdCIsImRlZmF1bHRzIiwiZGlyIiwiY29uZmlnIiwiZmlsZXBhdGgiLCJ2YWxpZGF0ZVRtcERpciIsInRtcERpciIsIm1rZGlycCIsImUiLCJFcnJvciIsImZpbmRSb290Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUdDLFlBQUdDLG1CQUFILENBQXVCQyxTQUF2QixDQUFuQjs7QUFFQSxNQUFNQyxVQUFVLEdBQUdKLFVBQVUsQ0FBQ0ssT0FBOUI7O0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUdOLFVBQVUsQ0FBQ08sT0FBWCxDQUFtQkMsSUFBNUM7QUFFQSxNQUFNQyxhQUFhLEdBQUcsTUFBdEI7QUFDQSxNQUFNQyxVQUFVLEdBQUksTUFBS0MsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUExRDtBQUNBLE1BQU1DLFVBQVUsR0FBRyw0Q0FBbkI7QUFLQSxNQUFNQyxVQUFVLEdBQUc7QUFDakJULEVBQUFBLE9BQU8sRUFBRUQ7QUFEUSxDQUFuQjs7QUFJQSxTQUFTVyxjQUFULEdBQTJCO0FBQ3pCLFNBQThDQyxnQkFBT0Ms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Q0QsTUFBSWhCLGdCQUFFeUQsT0FBRixDQUFVRSw2QkFBVixDQUFKLEVBQThDO0FBQzVDNUMsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsZ0NBQWI7QUFDRCxHQUZELE1BRU87QUFDTEQsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksK0JBQVo7QUFDQUQsSUFBQUEsT0FBTyxDQUFDK0MsR0FBUixDQUFZVCxhQUFhLENBQUNNLDZCQUFELENBQXpCO0FBQ0Q7O0FBQ0Q1QyxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSwwQkFBWjtBQUNBRCxFQUFBQSxPQUFPLENBQUMrQyxHQUFSLENBQVlULGFBQWEsQ0FBQ2pDLFVBQUQsQ0FBekI7QUFDRDs7QUFLRCxlQUFlNkMsY0FBZixDQUErQkMsTUFBL0IsRUFBdUM7QUFDckMsTUFBSTtBQUNGLFVBQU12RyxZQUFHd0csTUFBSCxDQUFVRCxNQUFWLENBQU47QUFDRCxHQUZELENBRUUsT0FBT0UsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJQyxLQUFKLENBQVcsc0RBQUQsR0FDQyxJQUFHSCxNQUFPLDRDQURyQixDQUFOO0FBRUQ7QUFDRjs7QUFFRCxNQUFNN0UsT0FBTyxHQUFHMUIsWUFBRzJHLFFBQUgsQ0FBWXpHLFNBQVosQ0FBaEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBmaW5kVXAgZnJvbSAnZmluZC11cCc7XG5pbXBvcnQgeyBnZXREZWZhdWx0c0ZvclNjaGVtYSwgZ2V0QWxsQXJnU3BlY3MgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBucG1QYWNrYWdlID0gZnMucmVhZFBhY2thZ2VKc29uRnJvbShfX2Rpcm5hbWUpO1xuXG5jb25zdCBBUFBJVU1fVkVSID0gbnBtUGFja2FnZS52ZXJzaW9uO1xuY29uc3QgTUlOX05PREVfVkVSU0lPTiA9IG5wbVBhY2thZ2UuZW5naW5lcy5ub2RlO1xuXG5jb25zdCBHSVRfTUVUQV9ST09UID0gJy5naXQnO1xuY29uc3QgR0lUX0JJTkFSWSA9IGBnaXQke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBHSVRIVUJfQVBJID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bSc7XG5cbi8qKlxuICogQHR5cGUge2ltcG9ydCgnLi4vdHlwZXMvY2xpJykuQnVpbGRJbmZvfVxuICovXG5jb25zdCBCVUlMRF9JTkZPID0ge1xuICB2ZXJzaW9uOiBBUFBJVU1fVkVSLFxufTtcblxuZnVuY3Rpb24gZ2V0Tm9kZVZlcnNpb24gKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJ3NlbXZlcicpLlNlbVZlcn0gKi8oc2VtdmVyLmNvZXJjZShwcm9jZXNzLnZlcnNpb24pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlQnVpbGRJbmZvICh1c2VHaXRodWJBcGlGYWxsYmFjayA9IGZhbHNlKSB7XG4gIGNvbnN0IHNoYSA9IGF3YWl0IGdldEdpdFJldih1c2VHaXRodWJBcGlGYWxsYmFjayk7XG4gIGlmICghc2hhKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEJVSUxEX0lORk9bJ2dpdC1zaGEnXSA9IHNoYTtcbiAgY29uc3QgYnVpbHQgPSBhd2FpdCBnZXRHaXRUaW1lc3RhbXAoc2hhLCB1c2VHaXRodWJBcGlGYWxsYmFjayk7XG4gIGlmIChidWlsdCkge1xuICAgIEJVSUxEX0lORk8uYnVpbHQgPSBidWlsdDtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBHaXQgbWV0YWRhdGEgZGlyIChzZWUgYEdJVF9NRVRBX1JPT1RgKVxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgQXBwaXVtIGNhbm5vdCBhc3N1bWUgYHBhY2thZ2UuanNvbmAgYW5kIGAuZ2l0YCBhcmUgaW4gdGhlIHNhbWVcbiAqIGRpcmVjdG9yeS4gIE1vbm9yZXBvcywgc2VlP1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nfHVuZGVmaW5lZD59IFBhdGggdG8gZGlyIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kR2l0Um9vdCAoKSB7XG4gIHJldHVybiBhd2FpdCBmaW5kVXAoR0lUX01FVEFfUk9PVCwge2N3ZDogcm9vdERpciwgdHlwZTogJ2RpcmVjdG9yeSd9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2l0UmV2ICh1c2VHaXRodWJBcGlGYWxsYmFjayA9IGZhbHNlKSB7XG4gIGNvbnN0IGdpdFJvb3QgPSBhd2FpdCBmaW5kR2l0Um9vdCgpO1xuICBpZiAoZ2l0Um9vdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR0lUX0JJTkFSWSwgWydyZXYtcGFyc2UnLCAnSEVBRCddLCB7XG4gICAgICAgIGN3ZDogZ2l0Um9vdFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cblxuICBpZiAoIXVzZUdpdGh1YkFwaUZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc0JvZHlPYmogPSAoYXdhaXQgYXhpb3MuZ2V0KGAke0dJVEhVQl9BUEl9L3RhZ3NgLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdVc2VyLUFnZW50JzogYEFwcGl1bSAke0FQUElVTV9WRVJ9YFxuICAgICAgfVxuICAgIH0pKS5kYXRhO1xuICAgIGlmIChfLmlzQXJyYXkocmVzQm9keU9iaikpIHtcbiAgICAgIGZvciAoY29uc3Qge25hbWUsIGNvbW1pdH0gb2YgcmVzQm9keU9iaikge1xuICAgICAgICBpZiAobmFtZSA9PT0gYHYke0FQUElVTV9WRVJ9YCAmJiBjb21taXQgJiYgY29tbWl0LnNoYSkge1xuICAgICAgICAgIHJldHVybiBjb21taXQuc2hhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChpZ24pIHt9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21taXRTaGFcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUdpdGh1YkFwaUZhbGxiYWNrXVxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdpdFRpbWVzdGFtcCAoY29tbWl0U2hhLCB1c2VHaXRodWJBcGlGYWxsYmFjayA9IGZhbHNlKSB7XG4gIGNvbnN0IGdpdFJvb3QgPSBhd2FpdCBmaW5kR2l0Um9vdCgpO1xuICBpZiAoZ2l0Um9vdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR0lUX0JJTkFSWSwgWydzaG93JywgJy1zJywgJy0tZm9ybWF0PSVjaScsIGNvbW1pdFNoYV0sIHtcbiAgICAgICAgY3dkOiBnaXRSb290XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdGRvdXQudHJpbSgpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfVxuXG4gIGlmICghdXNlR2l0aHViQXBpRmFsbGJhY2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzQm9keU9iaiA9IChhd2FpdCBheGlvcy5nZXQoYCR7R0lUSFVCX0FQSX0vY29tbWl0cy8ke2NvbW1pdFNoYX1gLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdVc2VyLUFnZW50JzogYEFwcGl1bSAke0FQUElVTV9WRVJ9YFxuICAgICAgfVxuICAgIH0pKS5kYXRhO1xuICAgIGlmIChyZXNCb2R5T2JqICYmIHJlc0JvZHlPYmouY29tbWl0KSB7XG4gICAgICBpZiAocmVzQm9keU9iai5jb21taXQuY29tbWl0dGVyICYmIHJlc0JvZHlPYmouY29tbWl0LmNvbW1pdHRlci5kYXRlKSB7XG4gICAgICAgIHJldHVybiByZXNCb2R5T2JqLmNvbW1pdC5jb21taXR0ZXIuZGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNCb2R5T2JqLmNvbW1pdC5hdXRob3IgJiYgcmVzQm9keU9iai5jb21taXQuYXV0aG9yLmRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHJlc0JvZHlPYmouY29tbWl0LmF1dGhvci5kYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoaWduKSB7fVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBNdXRhYmxlIG9iamVjdCBjb250YWluaW5nIEFwcGl1bSBidWlsZCBpbmZvcm1hdGlvbi4gQnkgZGVmYXVsdCBpdFxuICogb25seSBjb250YWlucyB0aGUgQXBwaXVtIHZlcnNpb24sIGJ1dCBpcyB1cGRhdGVkIHdpdGggdGhlIGJ1aWxkIHRpbWVzdGFtcFxuICogYW5kIGdpdCBjb21taXQgaGFzaCBhc3luY2hyb25vdXNseSBhcyBzb29uIGFzIGB1cGRhdGVCdWlsZEluZm9gIGlzIGNhbGxlZFxuICogYW5kIHN1Y2NlZWRzLlxuICogQHJldHVybnMge2ltcG9ydCgnLi4vdHlwZXMvY2xpJykuQnVpbGRJbmZvfVxuICovXG5mdW5jdGlvbiBnZXRCdWlsZEluZm8gKCkge1xuICByZXR1cm4gQlVJTERfSU5GTztcbn1cblxuZnVuY3Rpb24gY2hlY2tOb2RlT2sgKCkge1xuICBjb25zdCB2ZXJzaW9uID0gZ2V0Tm9kZVZlcnNpb24oKTtcbiAgaWYgKCFzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIE1JTl9OT0RFX1ZFUlNJT04pKSB7XG4gICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYE5vZGUgdmVyc2lvbiBtdXN0IGJlICR7TUlOX05PREVfVkVSU0lPTn0uIEN1cnJlbnRseSAke3ZlcnNpb24udmVyc2lvbn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9kZURlcHJlY2F0aW9ucyAoKSB7XG4gIC8qKlxuICAgKiBVbmNvbW1lbnQgdGhpcyBzZWN0aW9uIHRvIGdldCBub2RlIHZlcnNpb24gZGVwcmVjYXRpb24gd2FybmluZ3NcbiAgICogQWxzbyBhZGQgdGVzdCBjYXNlcyB0byBjb25maWctc3BlY3MuanMgdG8gY292ZXIgdGhlIGNhc2VzIGFkZGVkXG4gICAqKi9cblxuICAvLyBjb25zdCB2ZXJzaW9uID0gZ2V0Tm9kZVZlcnNpb24oKTtcbiAgLy8gaWYgKHZlcnNpb24ubWFqb3IgPCA4KSB7XG4gIC8vICAgbG9nZ2VyLndhcm4oYEFwcGl1bSBzdXBwb3J0IGZvciB2ZXJzaW9ucyBvZiBub2RlIDwgJHt2ZXJzaW9uLm1ham9yfSBoYXMgYmVlbiBgICtcbiAgLy8gICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFBsZWFzZSAnICtcbiAgLy8gICAgICAgICAgICAgICAndXBncmFkZSEnKTtcbiAgLy8gfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzaG93QnVpbGRJbmZvICgpIHtcbiAgYXdhaXQgdXBkYXRlQnVpbGRJbmZvKHRydWUpO1xuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShnZXRCdWlsZEluZm8oKSkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGsvdiBwYWlycyBvZiBzZXJ2ZXIgYXJndW1lbnRzIHdoaWNoIGFyZSBfbm90XyB0aGUgZGVmYXVsdHMuXG4gKiBAcGFyYW0ge1BhcnNlZEFyZ3N9IHBhcnNlZEFyZ3NcbiAqIEByZXR1cm5zIHtQYXJ0aWFsPFBhcnNlZEFyZ3M+fVxuICovXG5mdW5jdGlvbiBnZXROb25EZWZhdWx0U2VydmVyQXJncyAocGFyc2VkQXJncykge1xuICAvKipcbiAgICogRmxhdHRlbnMgcGFyc2VkIGFyZ3MgaW50byBhIHNpbmdsZSBsZXZlbCBvYmplY3QgZm9yIGNvbXBhcmlzb24gd2l0aFxuICAgKiBmbGF0dGVuZWQgZGVmYXVsdHMgYWNyb3NzIHNlcnZlciBhcmdzIGFuZCBleHRlbnNpb24gYXJncy5cbiAgICogQHBhcmFtIHtQYXJzZWRBcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBhbnksIGFyZ1NwZWM6IEFyZ1NwZWMgfT59XG4gICAqL1xuICBjb25zdCBmbGF0dGVuID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCBhcmdTcGVjcyA9IGdldEFsbEFyZ1NwZWNzKCk7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gXy5yZWR1Y2UoWy4uLmFyZ1NwZWNzLnZhbHVlcygpXSwgKGFjYywgYXJnU3BlYykgPT4ge1xuICAgICAgaWYgKF8uaGFzKGFyZ3MsIGFyZ1NwZWMuZGVzdCkpIHtcbiAgICAgICAgYWNjW2FyZ1NwZWMuZGVzdF0gPSB7dmFsdWU6IF8uZ2V0KGFyZ3MsIGFyZ1NwZWMuZGVzdCksIGFyZ1NwZWN9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHsgdmFsdWU6IGFueSwgYXJnU3BlYzogQXJnU3BlYyB9Pn0gKi8oe30pKTtcblxuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH07XG5cbiAgY29uc3QgYXJncyA9IGZsYXR0ZW4ocGFyc2VkQXJncyk7XG5cbiAgLy8gaG9wZWZ1bGx5IHRoZXNlIGZ1bmN0aW9uIG5hbWVzIGFyZSBkZXNjcmlwdGl2ZSBlbm91Z2hcbiAgY29uc3QgdHlwZXNEaWZmZXIgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gdHlwZW9mIGFyZ3NbZGVzdF0udmFsdWUgIT09IHR5cGVvZiBkZWZhdWx0c0Zyb21TY2hlbWFbZGVzdF07XG5cbiAgY29uc3QgZGVmYXVsdFZhbHVlSXNBcnJheSA9IC8qKiBAcGFyYW0ge3N0cmluZ30gZGVzdCAqLyhkZXN0KSA9PiBfLmlzQXJyYXkoZGVmYXVsdHNGcm9tU2NoZW1hW2Rlc3RdKTtcblxuICBjb25zdCBhcmdzVmFsdWVJc0FycmF5ID0gLyoqIEBwYXJhbSB7c3RyaW5nfSBkZXN0ICovKGRlc3QpID0+IF8uaXNBcnJheShhcmdzW2Rlc3RdLnZhbHVlKTtcblxuICBjb25zdCBhcnJheXNEaWZmZXIgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gXy5ndChfLnNpemUoXy5kaWZmZXJlbmNlKGFyZ3NbZGVzdF0udmFsdWUsIGRlZmF1bHRzRnJvbVNjaGVtYVtkZXN0XSkpLCAwKTtcblxuICBjb25zdCB2YWx1ZXNEaWZmZXIgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gYXJnc1tkZXN0XS52YWx1ZSAhPT0gZGVmYXVsdHNGcm9tU2NoZW1hW2Rlc3RdO1xuXG4gIGNvbnN0IGRlZmF1bHRJc0RlZmluZWQgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gIV8uaXNVbmRlZmluZWQoZGVmYXVsdHNGcm9tU2NoZW1hW2Rlc3RdKTtcblxuICAvLyBub3RlIHRoYXQgYF8ub3ZlckV2ZXJ5YCBpcyBsaWtlIGFuIFwiQU5EXCIsIGFuZCBgXy5vdmVyU29tZWAgaXMgbGlrZSBhbiBcIk9SXCJcblxuICBjb25zdCBhcmdWYWx1ZU5vdEFycmF5T3JBcnJheXNEaWZmZXIgPSBfLm92ZXJTb21lKFtcbiAgICBfLm5lZ2F0ZShhcmdzVmFsdWVJc0FycmF5KSxcbiAgICBhcnJheXNEaWZmZXJcbiAgXSk7XG5cbiAgY29uc3QgZGVmYXVsdFZhbHVlTm90QXJyYXlBbmRWYWx1ZXNEaWZmZXIgPSBfLm92ZXJFdmVyeShbXG4gICAgXy5uZWdhdGUoZGVmYXVsdFZhbHVlSXNBcnJheSksIHZhbHVlc0RpZmZlclxuICBdKTtcblxuICAvKipcbiAgICogVGhpcyB1c2VkIHRvIGJlIGEgaGlkZW91cyBjb25kaXRpb25hbCwgYnV0IGl0J3MgYnJva2VuIHVwIGludG8gYSBoaWRlb3VzIGZ1bmN0aW9uIGluc3RlYWQuXG4gICAqIGhvcGVmdWxseSB0aGlzIG1ha2VzIHRoaW5ncyBhIGxpdHRsZSBtb3JlIHVuZGVyc3RhbmRhYmxlLlxuICAgKiAtIGNoZWNrcyBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkXG4gICAqIC0gaWYgc28sIGFuZCB0aGUgZGVmYXVsdCBpcyBub3QgYW4gYXJyYXk6XG4gICAqICAgLSBlbnN1cmVzIHRoZSB0eXBlcyBhcmUgdGhlIHNhbWVcbiAgICogICAtIGVuc3VyZXMgdGhlIHZhbHVlcyBhcmUgZXF1YWxcbiAgICogLSBpZiBzbywgYW5kIHRoZSBkZWZhdWx0IGlzIGFuIGFycmF5OlxuICAgKiAgIC0gZW5zdXJlcyB0aGUgYXJncyB2YWx1ZSBpcyBhbiBhcnJheVxuICAgKiAgIC0gZW5zdXJlcyB0aGUgYXJncyB2YWx1ZXMgZG8gbm90IGRpZmZlciBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlc1xuICAgKiBAdHlwZSB7KGRlc3Q6IHN0cmluZykgPT4gYm9vbGVhbn1cbiAgICovXG4gIGNvbnN0IGlzTm90RGVmYXVsdCA9IF8ub3ZlckV2ZXJ5KFtcbiAgICBkZWZhdWx0SXNEZWZpbmVkLFxuICAgIF8ub3ZlclNvbWUoW1xuICAgICAgdHlwZXNEaWZmZXIsXG4gICAgICBfLm92ZXJFdmVyeShbXG4gICAgICAgIGRlZmF1bHRWYWx1ZUlzQXJyYXksXG4gICAgICAgIGFyZ1ZhbHVlTm90QXJyYXlPckFycmF5c0RpZmZlclxuICAgICAgXSksXG4gICAgICBkZWZhdWx0VmFsdWVOb3RBcnJheUFuZFZhbHVlc0RpZmZlclxuICAgIF0pXG4gIF0pO1xuXG4gIGNvbnN0IGRlZmF1bHRzRnJvbVNjaGVtYSA9IGdldERlZmF1bHRzRm9yU2NoZW1hKHRydWUpO1xuXG4gIHJldHVybiBfLnJlZHVjZShcbiAgICBfLnBpY2tCeShhcmdzLCAoX18sIGtleSkgPT4gaXNOb3REZWZhdWx0KGtleSkpLFxuICAgIC8vIGV4cGxvZGVzIHRoZSBmbGF0dGVuZWQgb2JqZWN0IGJhY2sgaW50byBuZXN0ZWQgb25lXG4gICAgKGFjYywge3ZhbHVlLCBhcmdTcGVjfSkgPT4gXy5zZXQoYWNjLCBhcmdTcGVjLmRlc3QsIHZhbHVlKSwgLyoqIEB0eXBlIHtQYXJ0aWFsPFBhcnNlZEFyZ3M+fSAqLyh7fSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDb21wYWN0cyBhbiBvYmplY3QgZm9yIHtAbGluayBzaG93Q29uZmlnfTpcbiAqIDEuIFJlbW92ZXMgYHN1YmNvbW1hbmRgIGtleS92YWx1ZVxuICogMi4gUmVtb3ZlcyBgdW5kZWZpbmVkYCB2YWx1ZXNcbiAqIDMuIFJlbW92ZXMgZW1wdHkgb2JqZWN0cyAoYnV0IG5vdCBgZmFsc2VgIHZhbHVlcylcbiAqIERvZXMgbm90IG9wZXJhdGUgcmVjdXJzaXZlbHkuXG4gKi9cbmNvbnN0IGNvbXBhY3RDb25maWcgPSBfLnBhcnRpYWwoXG4gIF8ub21pdEJ5LFxuICBfLFxuICAodmFsdWUsIGtleSkgPT4ga2V5ID09PSAnc3ViY29tbWFuZCcgfHwgXy5pc1VuZGVmaW5lZCh2YWx1ZSkgfHwgKF8uaXNPYmplY3QodmFsdWUpICYmIF8uaXNFbXB0eSh2YWx1ZSkpXG4pO1xuXG4vKipcbiAqIFNob3dzIGEgYnJlYWtkb3duIG9mIHRoZSBjdXJyZW50IGNvbmZpZyBhZnRlciBDTEkgcGFyYW1zLCBjb25maWcgZmlsZSBsb2FkZWQgJiBkZWZhdWx0cyBhcHBsaWVkLlxuICpcbiAqIFRoZSBhY3R1YWwgc2hhcGUgb2YgYHByZUNvbmZpZ1BhcnNlZEFyZ3NgIGFuZCBgZGVmYXVsdHNgIGRvZXMgbm90IG1hdHRlciBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZnVuY3Rpb24sXG4gKiBidXQgaXQncyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgd2l0aCB2YWx1ZXMgb2YgdHlwZSB7QGxpbmsgUGFyc2VkQXJnc30gYW5kIGBEZWZhdWx0VmFsdWVzPHRydWU+YCwgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxQYXJzZWRBcmdzPn0gbm9uRGVmYXVsdFByZUNvbmZpZ1BhcnNlZEFyZ3MgLSBQYXJzZWQgQ0xJIGFyZ3MgKG9yIHBhcmFtIHRvIGBpbml0KClgKSBiZWZvcmUgY29uZmlnICYgZGVmYXVsdHMgYXBwbGllZFxuICogQHBhcmFtIHtpbXBvcnQoJy4vY29uZmlnLWZpbGUnKS5SZWFkQ29uZmlnRmlsZVJlc3VsdH0gY29uZmlnUmVzdWx0IC0gUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gbG9hZCBhIGNvbmZpZyBmaWxlLiAgX011c3RfIGJlIG5vcm1hbGl6ZWRcbiAqIEBwYXJhbSB7UGFydGlhbDxQYXJzZWRBcmdzPn0gZGVmYXVsdHMgLSBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZyb20gc2NoZW1hc1xuICogQHBhcmFtIHtQYXJzZWRBcmdzfSBwYXJzZWRBcmdzIC0gRW50aXJlIHBhcnNlZCBhcmdzIG9iamVjdFxuICovXG5mdW5jdGlvbiBzaG93Q29uZmlnIChub25EZWZhdWx0UHJlQ29uZmlnUGFyc2VkQXJncywgY29uZmlnUmVzdWx0LCBkZWZhdWx0cywgcGFyc2VkQXJncykge1xuICBjb25zb2xlLmxvZygnQXBwaXVtIENvbmZpZ3VyYXRpb25cXG4nKTtcbiAgY29uc29sZS5sb2coJ2Zyb20gZGVmYXVsdHM6XFxuJyk7XG4gIGNvbnNvbGUuZGlyKGNvbXBhY3RDb25maWcoZGVmYXVsdHMpKTtcbiAgaWYgKGNvbmZpZ1Jlc3VsdC5jb25maWcpIHtcbiAgICBjb25zb2xlLmxvZyhgXFxuZnJvbSBjb25maWcgZmlsZSBhdCAke2NvbmZpZ1Jlc3VsdC5maWxlcGF0aH06XFxuYCk7XG4gICAgY29uc29sZS5kaXIoY29tcGFjdENvbmZpZyhjb25maWdSZXN1bHQuY29uZmlnKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYFxcbihubyBjb25maWd1cmF0aW9uIGZpbGUgbG9hZGVkKWApO1xuICB9XG4gIGlmIChfLmlzRW1wdHkobm9uRGVmYXVsdFByZUNvbmZpZ1BhcnNlZEFyZ3MpKSB7XG4gICAgY29uc29sZS5sb2coYFxcbihubyBDTEkgcGFyYW1ldGVycyBwcm92aWRlZClgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnXFxudmlhIENMSSBvciBmdW5jdGlvbiBjYWxsOlxcbicpO1xuICAgIGNvbnNvbGUuZGlyKGNvbXBhY3RDb25maWcobm9uRGVmYXVsdFByZUNvbmZpZ1BhcnNlZEFyZ3MpKTtcbiAgfVxuICBjb25zb2xlLmxvZygnXFxuZmluYWwgY29uZmlndXJhdGlvbjpcXG4nKTtcbiAgY29uc29sZS5kaXIoY29tcGFjdENvbmZpZyhwYXJzZWRBcmdzKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRtcERpclxuICovXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVRtcERpciAodG1wRGlyKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMubWtkaXJwKHRtcERpcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFdlIGNvdWxkIG5vdCBlbnN1cmUgdGhhdCB0aGUgdGVtcCBkaXIgeW91IHNwZWNpZmllZCBgICtcbiAgICAgICAgICAgICAgICAgICAgYCgke3RtcERpcn0pIGV4aXN0cy4gUGxlYXNlIG1ha2Ugc3VyZSBpdCdzIHdyaXRlYWJsZS5gKTtcbiAgfVxufVxuXG5jb25zdCByb290RGlyID0gZnMuZmluZFJvb3QoX19kaXJuYW1lKTtcblxuZXhwb3J0IHtcbiAgZ2V0QnVpbGRJbmZvLCBjaGVja05vZGVPaywgc2hvd0J1aWxkSW5mbyxcbiAgd2Fybk5vZGVEZXByZWNhdGlvbnMsIHZhbGlkYXRlVG1wRGlyLCBnZXROb25EZWZhdWx0U2VydmVyQXJncyxcbiAgZ2V0R2l0UmV2LCBBUFBJVU1fVkVSLCB1cGRhdGVCdWlsZEluZm8sIHNob3dDb25maWcsIHJvb3REaXJcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vdHlwZXMvY2xpJykuUGFyc2VkQXJnc30gUGFyc2VkQXJnc1xuICogQHR5cGVkZWYge2ltcG9ydCgnLi9zY2hlbWEvYXJnLXNwZWMnKS5BcmdTcGVjfSBBcmdTcGVjXG4gKi9cblxuIl19
255
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jb25maWcuanMiXSwibmFtZXMiOlsibnBtUGFja2FnZSIsImZzIiwicmVhZFBhY2thZ2VKc29uRnJvbSIsIl9fZGlybmFtZSIsIkFQUElVTV9WRVIiLCJ2ZXJzaW9uIiwiTUlOX05PREVfVkVSU0lPTiIsImVuZ2luZXMiLCJub2RlIiwiR0lUX01FVEFfUk9PVCIsIkdJVF9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJHSVRIVUJfQVBJIiwiQlVJTERfSU5GTyIsImdldE5vZGVWZXJzaW9uIiwic2VtdmVyIiwiY29lcmNlIiwicHJvY2VzcyIsInVwZGF0ZUJ1aWxkSW5mbyIsInVzZUdpdGh1YkFwaUZhbGxiYWNrIiwic2hhIiwiZ2V0R2l0UmV2IiwiYnVpbHQiLCJnZXRHaXRUaW1lc3RhbXAiLCJmaW5kR2l0Um9vdCIsImN3ZCIsInJvb3REaXIiLCJ0eXBlIiwiZ2l0Um9vdCIsInN0ZG91dCIsInRyaW0iLCJpZ24iLCJyZXNCb2R5T2JqIiwiYXhpb3MiLCJnZXQiLCJoZWFkZXJzIiwiZGF0YSIsIl8iLCJpc0FycmF5IiwibmFtZSIsImNvbW1pdCIsImNvbW1pdFNoYSIsImNvbW1pdHRlciIsImRhdGUiLCJhdXRob3IiLCJnZXRCdWlsZEluZm8iLCJjaGVja05vZGVPayIsInNhdGlzZmllcyIsImxvZ2dlciIsImVycm9yQW5kVGhyb3ciLCJ3YXJuTm9kZURlcHJlY2F0aW9ucyIsInNob3dCdWlsZEluZm8iLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzIiwicGFyc2VkQXJncyIsImZsYXR0ZW4iLCJhcmdzIiwiYXJnU3BlY3MiLCJmbGF0dGVuZWQiLCJyZWR1Y2UiLCJ2YWx1ZXMiLCJhY2MiLCJhcmdTcGVjIiwiaGFzIiwiZGVzdCIsInZhbHVlIiwidHlwZXNEaWZmZXIiLCJkZWZhdWx0c0Zyb21TY2hlbWEiLCJkZWZhdWx0VmFsdWVJc0FycmF5IiwiYXJnc1ZhbHVlSXNBcnJheSIsImFycmF5c0RpZmZlciIsImd0Iiwic2l6ZSIsImRpZmZlcmVuY2UiLCJ2YWx1ZXNEaWZmZXIiLCJkZWZhdWx0SXNEZWZpbmVkIiwiaXNVbmRlZmluZWQiLCJhcmdWYWx1ZU5vdEFycmF5T3JBcnJheXNEaWZmZXIiLCJvdmVyU29tZSIsIm5lZ2F0ZSIsImRlZmF1bHRWYWx1ZU5vdEFycmF5QW5kVmFsdWVzRGlmZmVyIiwib3ZlckV2ZXJ5IiwiaXNOb3REZWZhdWx0IiwicGlja0J5IiwiX18iLCJrZXkiLCJzZXQiLCJjb21wYWN0Q29uZmlnIiwicGFydGlhbCIsIm9taXRCeSIsImlzT2JqZWN0IiwiaXNFbXB0eSIsInNob3dDb25maWciLCJub25EZWZhdWx0UHJlQ29uZmlnUGFyc2VkQXJncyIsImNvbmZpZ1Jlc3VsdCIsImRlZmF1bHRzIiwiZGlyIiwiY29uZmlnIiwiZmlsZXBhdGgiLCJ2YWxpZGF0ZVRtcERpciIsInRtcERpciIsIm1rZGlycCIsImUiLCJFcnJvciIsImZpbmRSb290Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUdDLFlBQUdDLG1CQUFILENBQXVCQyxTQUF2QixDQUFuQjs7QUFFQSxNQUFNQyxVQUFVLEdBQUdKLFVBQVUsQ0FBQ0ssT0FBOUI7O0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUdOLFVBQVUsQ0FBQ08sT0FBWCxDQUFtQkMsSUFBNUM7QUFFQSxNQUFNQyxhQUFhLEdBQUcsTUFBdEI7QUFDQSxNQUFNQyxVQUFVLEdBQUksTUFBS0MsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUExRDtBQUNBLE1BQU1DLFVBQVUsR0FBRyw0Q0FBbkI7QUFLQSxNQUFNQyxVQUFVLEdBQUc7QUFDakJULEVBQUFBLE9BQU8sRUFBRUQ7QUFEUSxDQUFuQjs7QUFJQSxTQUFTVyxjQUFULEdBQTJCO0FBQ3pCLFNBQThDQyxnQkFBT0Ms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Q0QsTUFBSWhCLGdCQUFFeUQsT0FBRixDQUFVRSw2QkFBVixDQUFKLEVBQThDO0FBQzVDNUMsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsZ0NBQWI7QUFDRCxHQUZELE1BRU87QUFDTEQsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksK0JBQVo7QUFDQUQsSUFBQUEsT0FBTyxDQUFDK0MsR0FBUixDQUFZVCxhQUFhLENBQUNNLDZCQUFELENBQXpCO0FBQ0Q7O0FBQ0Q1QyxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSwwQkFBWjtBQUNBRCxFQUFBQSxPQUFPLENBQUMrQyxHQUFSLENBQVlULGFBQWEsQ0FBQ2pDLFVBQUQsQ0FBekI7QUFDRDs7QUFLRCxlQUFlNkMsY0FBZixDQUErQkMsTUFBL0IsRUFBdUM7QUFDckMsTUFBSTtBQUNGLFVBQU12RyxZQUFHd0csTUFBSCxDQUFVRCxNQUFWLENBQU47QUFDRCxHQUZELENBRUUsT0FBT0UsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJQyxLQUFKLENBQVcsc0RBQUQsR0FDQyxJQUFHSCxNQUFPLDRDQURyQixDQUFOO0FBRUQ7QUFDRjs7QUFFRCxNQUFNN0UsT0FBTyxHQUFHMUIsWUFBRzJHLFFBQUgsQ0FBWXpHLFNBQVosQ0FBaEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBmaW5kVXAgZnJvbSAnZmluZC11cCc7XG5pbXBvcnQgeyBnZXREZWZhdWx0c0ZvclNjaGVtYSwgZ2V0QWxsQXJnU3BlY3MgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBucG1QYWNrYWdlID0gZnMucmVhZFBhY2thZ2VKc29uRnJvbShfX2Rpcm5hbWUpO1xuXG5jb25zdCBBUFBJVU1fVkVSID0gbnBtUGFja2FnZS52ZXJzaW9uO1xuY29uc3QgTUlOX05PREVfVkVSU0lPTiA9IG5wbVBhY2thZ2UuZW5naW5lcy5ub2RlO1xuXG5jb25zdCBHSVRfTUVUQV9ST09UID0gJy5naXQnO1xuY29uc3QgR0lUX0JJTkFSWSA9IGBnaXQke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBHSVRIVUJfQVBJID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bSc7XG5cbi8qKlxuICogQHR5cGUge2ltcG9ydCgnLi4vdHlwZXMvY2xpJykuQnVpbGRJbmZvfVxuICovXG5jb25zdCBCVUlMRF9JTkZPID0ge1xuICB2ZXJzaW9uOiBBUFBJVU1fVkVSLFxufTtcblxuZnVuY3Rpb24gZ2V0Tm9kZVZlcnNpb24gKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJ3NlbXZlcicpLlNlbVZlcn0gKi8oc2VtdmVyLmNvZXJjZShwcm9jZXNzLnZlcnNpb24pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlQnVpbGRJbmZvICh1c2VHaXRodWJBcGlGYWxsYmFjayA9IGZhbHNlKSB7XG4gIGNvbnN0IHNoYSA9IGF3YWl0IGdldEdpdFJldih1c2VHaXRodWJBcGlGYWxsYmFjayk7XG4gIGlmICghc2hhKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEJVSUxEX0lORk9bJ2dpdC1zaGEnXSA9IHNoYTtcbiAgY29uc3QgYnVpbHQgPSBhd2FpdCBnZXRHaXRUaW1lc3RhbXAoc2hhLCB1c2VHaXRodWJBcGlGYWxsYmFjayk7XG4gIGlmIChidWlsdCkge1xuICAgIEJVSUxEX0lORk8uYnVpbHQgPSBidWlsdDtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBHaXQgbWV0YWRhdGEgZGlyIChzZWUgYEdJVF9NRVRBX1JPT1RgKVxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgQXBwaXVtIGNhbm5vdCBhc3N1bWUgYHBhY2thZ2UuanNvbmAgYW5kIGAuZ2l0YCBhcmUgaW4gdGhlIHNhbWVcbiAqIGRpcmVjdG9yeS4gIE1vbm9yZXBvcywgc2VlP1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nfHVuZGVmaW5lZD59IFBhdGggdG8gZGlyIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kR2l0Um9vdCAoKSB7XG4gIHJldHVybiBhd2FpdCBmaW5kVXAoR0lUX01FVEFfUk9PVCwge2N3ZDogcm9vdERpciwgdHlwZTogJ2RpcmVjdG9yeSd9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2l0UmV2ICh1c2VHaXRodWJBcGlGYWxsYmFjayA9IGZhbHNlKSB7XG4gIGNvbnN0IGdpdFJvb3QgPSBhd2FpdCBmaW5kR2l0Um9vdCgpO1xuICBpZiAoZ2l0Um9vdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR0lUX0JJTkFSWSwgWydyZXYtcGFyc2UnLCAnSEVBRCddLCB7XG4gICAgICAgIGN3ZDogZ2l0Um9vdFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cblxuICBpZiAoIXVzZUdpdGh1YkFwaUZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc0JvZHlPYmogPSAoYXdhaXQgYXhpb3MuZ2V0KGAke0dJVEhVQl9BUEl9L3RhZ3NgLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdVc2VyLUFnZW50JzogYEFwcGl1bSAke0FQUElVTV9WRVJ9YFxuICAgICAgfVxuICAgIH0pKS5kYXRhO1xuICAgIGlmIChfLmlzQXJyYXkocmVzQm9keU9iaikpIHtcbiAgICAgIGZvciAoY29uc3Qge25hbWUsIGNvbW1pdH0gb2YgcmVzQm9keU9iaikge1xuICAgICAgICBpZiAobmFtZSA9PT0gYHYke0FQUElVTV9WRVJ9YCAmJiBjb21taXQgJiYgY29tbWl0LnNoYSkge1xuICAgICAgICAgIHJldHVybiBjb21taXQuc2hhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChpZ24pIHt9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21taXRTaGFcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUdpdGh1YkFwaUZhbGxiYWNrXVxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdpdFRpbWVzdGFtcCAoY29tbWl0U2hhLCB1c2VHaXRodWJBcGlGYWxsYmFjayA9IGZhbHNlKSB7XG4gIGNvbnN0IGdpdFJvb3QgPSBhd2FpdCBmaW5kR2l0Um9vdCgpO1xuICBpZiAoZ2l0Um9vdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR0lUX0JJTkFSWSwgWydzaG93JywgJy1zJywgJy0tZm9ybWF0PSVjaScsIGNvbW1pdFNoYV0sIHtcbiAgICAgICAgY3dkOiBnaXRSb290XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdGRvdXQudHJpbSgpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfVxuXG4gIGlmICghdXNlR2l0aHViQXBpRmFsbGJhY2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzQm9keU9iaiA9IChhd2FpdCBheGlvcy5nZXQoYCR7R0lUSFVCX0FQSX0vY29tbWl0cy8ke2NvbW1pdFNoYX1gLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdVc2VyLUFnZW50JzogYEFwcGl1bSAke0FQUElVTV9WRVJ9YFxuICAgICAgfVxuICAgIH0pKS5kYXRhO1xuICAgIGlmIChyZXNCb2R5T2JqICYmIHJlc0JvZHlPYmouY29tbWl0KSB7XG4gICAgICBpZiAocmVzQm9keU9iai5jb21taXQuY29tbWl0dGVyICYmIHJlc0JvZHlPYmouY29tbWl0LmNvbW1pdHRlci5kYXRlKSB7XG4gICAgICAgIHJldHVybiByZXNCb2R5T2JqLmNvbW1pdC5jb21taXR0ZXIuZGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNCb2R5T2JqLmNvbW1pdC5hdXRob3IgJiYgcmVzQm9keU9iai5jb21taXQuYXV0aG9yLmRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHJlc0JvZHlPYmouY29tbWl0LmF1dGhvci5kYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoaWduKSB7fVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBNdXRhYmxlIG9iamVjdCBjb250YWluaW5nIEFwcGl1bSBidWlsZCBpbmZvcm1hdGlvbi4gQnkgZGVmYXVsdCBpdFxuICogb25seSBjb250YWlucyB0aGUgQXBwaXVtIHZlcnNpb24sIGJ1dCBpcyB1cGRhdGVkIHdpdGggdGhlIGJ1aWxkIHRpbWVzdGFtcFxuICogYW5kIGdpdCBjb21taXQgaGFzaCBhc3luY2hyb25vdXNseSBhcyBzb29uIGFzIGB1cGRhdGVCdWlsZEluZm9gIGlzIGNhbGxlZFxuICogYW5kIHN1Y2NlZWRzLlxuICogQHJldHVybnMge2ltcG9ydCgnLi4vdHlwZXMvY2xpJykuQnVpbGRJbmZvfVxuICovXG5mdW5jdGlvbiBnZXRCdWlsZEluZm8gKCkge1xuICByZXR1cm4gQlVJTERfSU5GTztcbn1cblxuZnVuY3Rpb24gY2hlY2tOb2RlT2sgKCkge1xuICBjb25zdCB2ZXJzaW9uID0gZ2V0Tm9kZVZlcnNpb24oKTtcbiAgaWYgKCFzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIE1JTl9OT0RFX1ZFUlNJT04pKSB7XG4gICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYE5vZGUgdmVyc2lvbiBtdXN0IGJlICR7TUlOX05PREVfVkVSU0lPTn0uIEN1cnJlbnRseSAke3ZlcnNpb24udmVyc2lvbn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9kZURlcHJlY2F0aW9ucyAoKSB7XG4gIC8qKlxuICAgKiBVbmNvbW1lbnQgdGhpcyBzZWN0aW9uIHRvIGdldCBub2RlIHZlcnNpb24gZGVwcmVjYXRpb24gd2FybmluZ3NcbiAgICogQWxzbyBhZGQgdGVzdCBjYXNlcyB0byBjb25maWctc3BlY3MuanMgdG8gY292ZXIgdGhlIGNhc2VzIGFkZGVkXG4gICAqKi9cblxuICAvLyBjb25zdCB2ZXJzaW9uID0gZ2V0Tm9kZVZlcnNpb24oKTtcbiAgLy8gaWYgKHZlcnNpb24ubWFqb3IgPCA4KSB7XG4gIC8vICAgbG9nZ2VyLndhcm4oYEFwcGl1bSBzdXBwb3J0IGZvciB2ZXJzaW9ucyBvZiBub2RlIDwgJHt2ZXJzaW9uLm1ham9yfSBoYXMgYmVlbiBgICtcbiAgLy8gICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFBsZWFzZSAnICtcbiAgLy8gICAgICAgICAgICAgICAndXBncmFkZSEnKTtcbiAgLy8gfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzaG93QnVpbGRJbmZvICgpIHtcbiAgYXdhaXQgdXBkYXRlQnVpbGRJbmZvKHRydWUpO1xuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShnZXRCdWlsZEluZm8oKSkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGsvdiBwYWlycyBvZiBzZXJ2ZXIgYXJndW1lbnRzIHdoaWNoIGFyZSBfbm90XyB0aGUgZGVmYXVsdHMuXG4gKiBAcGFyYW0ge0FyZ3N9IHBhcnNlZEFyZ3NcbiAqIEByZXR1cm5zIHtBcmdzfVxuICovXG5mdW5jdGlvbiBnZXROb25EZWZhdWx0U2VydmVyQXJncyAocGFyc2VkQXJncykge1xuICAvKipcbiAgICogRmxhdHRlbnMgcGFyc2VkIGFyZ3MgaW50byBhIHNpbmdsZSBsZXZlbCBvYmplY3QgZm9yIGNvbXBhcmlzb24gd2l0aFxuICAgKiBmbGF0dGVuZWQgZGVmYXVsdHMgYWNyb3NzIHNlcnZlciBhcmdzIGFuZCBleHRlbnNpb24gYXJncy5cbiAgICogQHBhcmFtIHtBcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBhbnksIGFyZ1NwZWM6IEFyZ1NwZWMgfT59XG4gICAqL1xuICBjb25zdCBmbGF0dGVuID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCBhcmdTcGVjcyA9IGdldEFsbEFyZ1NwZWNzKCk7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gXy5yZWR1Y2UoWy4uLmFyZ1NwZWNzLnZhbHVlcygpXSwgKGFjYywgYXJnU3BlYykgPT4ge1xuICAgICAgaWYgKF8uaGFzKGFyZ3MsIGFyZ1NwZWMuZGVzdCkpIHtcbiAgICAgICAgYWNjW2FyZ1NwZWMuZGVzdF0gPSB7dmFsdWU6IF8uZ2V0KGFyZ3MsIGFyZ1NwZWMuZGVzdCksIGFyZ1NwZWN9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHsgdmFsdWU6IGFueSwgYXJnU3BlYzogQXJnU3BlYyB9Pn0gKi8oe30pKTtcblxuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH07XG5cbiAgY29uc3QgYXJncyA9IGZsYXR0ZW4ocGFyc2VkQXJncyk7XG5cbiAgLy8gaG9wZWZ1bGx5IHRoZXNlIGZ1bmN0aW9uIG5hbWVzIGFyZSBkZXNjcmlwdGl2ZSBlbm91Z2hcbiAgY29uc3QgdHlwZXNEaWZmZXIgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gdHlwZW9mIGFyZ3NbZGVzdF0udmFsdWUgIT09IHR5cGVvZiBkZWZhdWx0c0Zyb21TY2hlbWFbZGVzdF07XG5cbiAgY29uc3QgZGVmYXVsdFZhbHVlSXNBcnJheSA9IC8qKiBAcGFyYW0ge3N0cmluZ30gZGVzdCAqLyhkZXN0KSA9PiBfLmlzQXJyYXkoZGVmYXVsdHNGcm9tU2NoZW1hW2Rlc3RdKTtcblxuICBjb25zdCBhcmdzVmFsdWVJc0FycmF5ID0gLyoqIEBwYXJhbSB7c3RyaW5nfSBkZXN0ICovKGRlc3QpID0+IF8uaXNBcnJheShhcmdzW2Rlc3RdLnZhbHVlKTtcblxuICBjb25zdCBhcnJheXNEaWZmZXIgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gXy5ndChfLnNpemUoXy5kaWZmZXJlbmNlKGFyZ3NbZGVzdF0udmFsdWUsIGRlZmF1bHRzRnJvbVNjaGVtYVtkZXN0XSkpLCAwKTtcblxuICBjb25zdCB2YWx1ZXNEaWZmZXIgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gYXJnc1tkZXN0XS52YWx1ZSAhPT0gZGVmYXVsdHNGcm9tU2NoZW1hW2Rlc3RdO1xuXG4gIGNvbnN0IGRlZmF1bHRJc0RlZmluZWQgPSAvKiogQHBhcmFtIHtzdHJpbmd9IGRlc3QgKi8oZGVzdCkgPT4gIV8uaXNVbmRlZmluZWQoZGVmYXVsdHNGcm9tU2NoZW1hW2Rlc3RdKTtcblxuICAvLyBub3RlIHRoYXQgYF8ub3ZlckV2ZXJ5YCBpcyBsaWtlIGFuIFwiQU5EXCIsIGFuZCBgXy5vdmVyU29tZWAgaXMgbGlrZSBhbiBcIk9SXCJcblxuICBjb25zdCBhcmdWYWx1ZU5vdEFycmF5T3JBcnJheXNEaWZmZXIgPSBfLm92ZXJTb21lKFtcbiAgICBfLm5lZ2F0ZShhcmdzVmFsdWVJc0FycmF5KSxcbiAgICBhcnJheXNEaWZmZXJcbiAgXSk7XG5cbiAgY29uc3QgZGVmYXVsdFZhbHVlTm90QXJyYXlBbmRWYWx1ZXNEaWZmZXIgPSBfLm92ZXJFdmVyeShbXG4gICAgXy5uZWdhdGUoZGVmYXVsdFZhbHVlSXNBcnJheSksIHZhbHVlc0RpZmZlclxuICBdKTtcblxuICAvKipcbiAgICogVGhpcyB1c2VkIHRvIGJlIGEgaGlkZW91cyBjb25kaXRpb25hbCwgYnV0IGl0J3MgYnJva2VuIHVwIGludG8gYSBoaWRlb3VzIGZ1bmN0aW9uIGluc3RlYWQuXG4gICAqIGhvcGVmdWxseSB0aGlzIG1ha2VzIHRoaW5ncyBhIGxpdHRsZSBtb3JlIHVuZGVyc3RhbmRhYmxlLlxuICAgKiAtIGNoZWNrcyBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkXG4gICAqIC0gaWYgc28sIGFuZCB0aGUgZGVmYXVsdCBpcyBub3QgYW4gYXJyYXk6XG4gICAqICAgLSBlbnN1cmVzIHRoZSB0eXBlcyBhcmUgdGhlIHNhbWVcbiAgICogICAtIGVuc3VyZXMgdGhlIHZhbHVlcyBhcmUgZXF1YWxcbiAgICogLSBpZiBzbywgYW5kIHRoZSBkZWZhdWx0IGlzIGFuIGFycmF5OlxuICAgKiAgIC0gZW5zdXJlcyB0aGUgYXJncyB2YWx1ZSBpcyBhbiBhcnJheVxuICAgKiAgIC0gZW5zdXJlcyB0aGUgYXJncyB2YWx1ZXMgZG8gbm90IGRpZmZlciBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlc1xuICAgKiBAdHlwZSB7KGRlc3Q6IHN0cmluZykgPT4gYm9vbGVhbn1cbiAgICovXG4gIGNvbnN0IGlzTm90RGVmYXVsdCA9IF8ub3ZlckV2ZXJ5KFtcbiAgICBkZWZhdWx0SXNEZWZpbmVkLFxuICAgIF8ub3ZlclNvbWUoW1xuICAgICAgdHlwZXNEaWZmZXIsXG4gICAgICBfLm92ZXJFdmVyeShbXG4gICAgICAgIGRlZmF1bHRWYWx1ZUlzQXJyYXksXG4gICAgICAgIGFyZ1ZhbHVlTm90QXJyYXlPckFycmF5c0RpZmZlclxuICAgICAgXSksXG4gICAgICBkZWZhdWx0VmFsdWVOb3RBcnJheUFuZFZhbHVlc0RpZmZlclxuICAgIF0pXG4gIF0pO1xuXG4gIGNvbnN0IGRlZmF1bHRzRnJvbVNjaGVtYSA9IGdldERlZmF1bHRzRm9yU2NoZW1hKHRydWUpO1xuXG4gIHJldHVybiBfLnJlZHVjZShcbiAgICBfLnBpY2tCeShhcmdzLCAoX18sIGtleSkgPT4gaXNOb3REZWZhdWx0KGtleSkpLFxuICAgIC8vIGV4cGxvZGVzIHRoZSBmbGF0dGVuZWQgb2JqZWN0IGJhY2sgaW50byBuZXN0ZWQgb25lXG4gICAgKGFjYywge3ZhbHVlLCBhcmdTcGVjfSkgPT4gXy5zZXQoYWNjLCBhcmdTcGVjLmRlc3QsIHZhbHVlKSwgLyoqIEB0eXBlIHtBcmdzfSAqLyh7fSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDb21wYWN0cyBhbiBvYmplY3QgZm9yIHtAbGluayBzaG93Q29uZmlnfTpcbiAqIDEuIFJlbW92ZXMgYHN1YmNvbW1hbmRgIGtleS92YWx1ZVxuICogMi4gUmVtb3ZlcyBgdW5kZWZpbmVkYCB2YWx1ZXNcbiAqIDMuIFJlbW92ZXMgZW1wdHkgb2JqZWN0cyAoYnV0IG5vdCBgZmFsc2VgIHZhbHVlcylcbiAqIERvZXMgbm90IG9wZXJhdGUgcmVjdXJzaXZlbHkuXG4gKi9cbmNvbnN0IGNvbXBhY3RDb25maWcgPSBfLnBhcnRpYWwoXG4gIF8ub21pdEJ5LFxuICBfLFxuICAodmFsdWUsIGtleSkgPT4ga2V5ID09PSAnc3ViY29tbWFuZCcgfHwgXy5pc1VuZGVmaW5lZCh2YWx1ZSkgfHwgKF8uaXNPYmplY3QodmFsdWUpICYmIF8uaXNFbXB0eSh2YWx1ZSkpXG4pO1xuXG4vKipcbiAqIFNob3dzIGEgYnJlYWtkb3duIG9mIHRoZSBjdXJyZW50IGNvbmZpZyBhZnRlciBDTEkgcGFyYW1zLCBjb25maWcgZmlsZSBsb2FkZWQgJiBkZWZhdWx0cyBhcHBsaWVkLlxuICpcbiAqIFRoZSBhY3R1YWwgc2hhcGUgb2YgYHByZUNvbmZpZ1BhcnNlZEFyZ3NgIGFuZCBgZGVmYXVsdHNgIGRvZXMgbm90IG1hdHRlciBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZnVuY3Rpb24sXG4gKiBidXQgaXQncyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgd2l0aCB2YWx1ZXMgb2YgdHlwZSB7QGxpbmsgUGFyc2VkQXJnc30gYW5kIGBEZWZhdWx0VmFsdWVzPHRydWU+YCwgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxQYXJzZWRBcmdzPn0gbm9uRGVmYXVsdFByZUNvbmZpZ1BhcnNlZEFyZ3MgLSBQYXJzZWQgQ0xJIGFyZ3MgKG9yIHBhcmFtIHRvIGBpbml0KClgKSBiZWZvcmUgY29uZmlnICYgZGVmYXVsdHMgYXBwbGllZFxuICogQHBhcmFtIHtpbXBvcnQoJy4vY29uZmlnLWZpbGUnKS5SZWFkQ29uZmlnRmlsZVJlc3VsdH0gY29uZmlnUmVzdWx0IC0gUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gbG9hZCBhIGNvbmZpZyBmaWxlLiAgX011c3RfIGJlIG5vcm1hbGl6ZWRcbiAqIEBwYXJhbSB7UGFydGlhbDxQYXJzZWRBcmdzPn0gZGVmYXVsdHMgLSBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZyb20gc2NoZW1hc1xuICogQHBhcmFtIHtQYXJzZWRBcmdzfSBwYXJzZWRBcmdzIC0gRW50aXJlIHBhcnNlZCBhcmdzIG9iamVjdFxuICovXG5mdW5jdGlvbiBzaG93Q29uZmlnIChub25EZWZhdWx0UHJlQ29uZmlnUGFyc2VkQXJncywgY29uZmlnUmVzdWx0LCBkZWZhdWx0cywgcGFyc2VkQXJncykge1xuICBjb25zb2xlLmxvZygnQXBwaXVtIENvbmZpZ3VyYXRpb25cXG4nKTtcbiAgY29uc29sZS5sb2coJ2Zyb20gZGVmYXVsdHM6XFxuJyk7XG4gIGNvbnNvbGUuZGlyKGNvbXBhY3RDb25maWcoZGVmYXVsdHMpKTtcbiAgaWYgKGNvbmZpZ1Jlc3VsdC5jb25maWcpIHtcbiAgICBjb25zb2xlLmxvZyhgXFxuZnJvbSBjb25maWcgZmlsZSBhdCAke2NvbmZpZ1Jlc3VsdC5maWxlcGF0aH06XFxuYCk7XG4gICAgY29uc29sZS5kaXIoY29tcGFjdENvbmZpZyhjb25maWdSZXN1bHQuY29uZmlnKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYFxcbihubyBjb25maWd1cmF0aW9uIGZpbGUgbG9hZGVkKWApO1xuICB9XG4gIGlmIChfLmlzRW1wdHkobm9uRGVmYXVsdFByZUNvbmZpZ1BhcnNlZEFyZ3MpKSB7XG4gICAgY29uc29sZS5sb2coYFxcbihubyBDTEkgcGFyYW1ldGVycyBwcm92aWRlZClgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnXFxudmlhIENMSSBvciBmdW5jdGlvbiBjYWxsOlxcbicpO1xuICAgIGNvbnNvbGUuZGlyKGNvbXBhY3RDb25maWcobm9uRGVmYXVsdFByZUNvbmZpZ1BhcnNlZEFyZ3MpKTtcbiAgfVxuICBjb25zb2xlLmxvZygnXFxuZmluYWwgY29uZmlndXJhdGlvbjpcXG4nKTtcbiAgY29uc29sZS5kaXIoY29tcGFjdENvbmZpZyhwYXJzZWRBcmdzKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRtcERpclxuICovXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVRtcERpciAodG1wRGlyKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMubWtkaXJwKHRtcERpcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFdlIGNvdWxkIG5vdCBlbnN1cmUgdGhhdCB0aGUgdGVtcCBkaXIgeW91IHNwZWNpZmllZCBgICtcbiAgICAgICAgICAgICAgICAgICAgYCgke3RtcERpcn0pIGV4aXN0cy4gUGxlYXNlIG1ha2Ugc3VyZSBpdCdzIHdyaXRlYWJsZS5gKTtcbiAgfVxufVxuXG5jb25zdCByb290RGlyID0gZnMuZmluZFJvb3QoX19kaXJuYW1lKTtcblxuZXhwb3J0IHtcbiAgZ2V0QnVpbGRJbmZvLCBjaGVja05vZGVPaywgc2hvd0J1aWxkSW5mbyxcbiAgd2Fybk5vZGVEZXByZWNhdGlvbnMsIHZhbGlkYXRlVG1wRGlyLCBnZXROb25EZWZhdWx0U2VydmVyQXJncyxcbiAgZ2V0R2l0UmV2LCBBUFBJVU1fVkVSLCB1cGRhdGVCdWlsZEluZm8sIHNob3dDb25maWcsIHJvb3REaXJcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vdHlwZXMnKS5QYXJzZWRBcmdzfSBQYXJzZWRBcmdzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi90eXBlcycpLkFyZ3N9IEFyZ3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vc2NoZW1hL2FyZy1zcGVjJykuQXJnU3BlY30gQXJnU3BlY1xuICovXG5cbiJdfQ==