appium 2.0.0-beta.17 → 2.0.0-beta.20

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 (53) hide show
  1. package/build/lib/appium-config.schema.json +0 -0
  2. package/build/lib/appium.js +84 -69
  3. package/build/lib/cli/argparse-actions.js +1 -1
  4. package/build/lib/cli/args.js +87 -223
  5. package/build/lib/cli/extension-command.js +2 -2
  6. package/build/lib/cli/extension.js +14 -6
  7. package/build/lib/cli/parser.js +142 -106
  8. package/build/lib/cli/utils.js +1 -1
  9. package/build/lib/config-file.js +141 -0
  10. package/build/lib/config.js +42 -64
  11. package/build/lib/driver-config.js +41 -20
  12. package/build/lib/drivers.js +1 -1
  13. package/build/lib/ext-config-io.js +165 -0
  14. package/build/lib/extension-config.js +110 -60
  15. package/build/lib/grid-register.js +19 -21
  16. package/build/lib/logsink.js +1 -1
  17. package/build/lib/main.js +135 -72
  18. package/build/lib/plugin-config.js +17 -8
  19. package/build/lib/schema/appium-config-schema.js +252 -0
  20. package/build/lib/schema/arg-spec.js +120 -0
  21. package/build/lib/schema/cli-args.js +173 -0
  22. package/build/lib/schema/cli-transformers.js +76 -0
  23. package/build/lib/schema/index.js +36 -0
  24. package/build/lib/schema/keywords.js +62 -0
  25. package/build/lib/schema/schema.js +357 -0
  26. package/build/lib/utils.js +26 -35
  27. package/lib/appium-config.schema.json +277 -0
  28. package/lib/appium.js +99 -75
  29. package/lib/cli/args.js +138 -335
  30. package/lib/cli/extension-command.js +7 -6
  31. package/lib/cli/extension.js +12 -4
  32. package/lib/cli/parser.js +248 -96
  33. package/lib/config-file.js +227 -0
  34. package/lib/config.js +71 -61
  35. package/lib/driver-config.js +66 -11
  36. package/lib/ext-config-io.js +287 -0
  37. package/lib/extension-config.js +209 -66
  38. package/lib/grid-register.js +24 -21
  39. package/lib/main.js +139 -68
  40. package/lib/plugin-config.js +32 -2
  41. package/lib/schema/appium-config-schema.js +286 -0
  42. package/lib/schema/arg-spec.js +218 -0
  43. package/lib/schema/cli-args.js +273 -0
  44. package/lib/schema/cli-transformers.js +123 -0
  45. package/lib/schema/index.js +2 -0
  46. package/lib/schema/keywords.js +119 -0
  47. package/lib/schema/schema.js +577 -0
  48. package/lib/utils.js +29 -52
  49. package/package.json +16 -11
  50. package/types/appium-config.d.ts +197 -0
  51. package/types/types.d.ts +201 -0
  52. package/build/lib/cli/parser-helpers.js +0 -106
  53. package/lib/cli/parser-helpers.js +0 -106
@@ -435,7 +435,7 @@ class ExtensionCommand {
435
435
 
436
436
  try {
437
437
  await runner.join();
438
- (0, _utils.log)(this.isJsonOutput, `${scriptName} successfuly ran`.green);
438
+ (0, _utils.log)(this.isJsonOutput, `${scriptName} successfully ran`.green);
439
439
  return {
440
440
  output: output.getBuff()
441
441
  };
@@ -453,4 +453,4 @@ class ExtensionCommand {
453
453
  exports.default = ExtensionCommand;require('source-map-support').install();
454
454
 
455
455
 
456
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImpzb24iLCJ0eXBlIiwiaXNKc29uT3V0cHV0IiwibnBtIiwiTlBNIiwiYXBwaXVtSG9tZSIsImtub3duRXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImluc3RhbGxUeHQiLCJncmVlbiIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsInBrZ0pzb25EYXRhIiwibGlua1BhY2thZ2UiLCJnZXRFeHRlbnNpb25GaWVsZHMiLCJpbnN0YWxsUGF0aCIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJzcGxpdHMiLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiYWRkRXh0ZW5zaW9uIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJpbnN0YWxsUGFja2FnZSIsInBrZ0RpciIsInBhdGgiLCJyZXNvbHZlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwidW5pbnN0YWxsIiwiZnMiLCJyaW1yYWYiLCJnZXRJbnN0YWxsUGF0aCIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJydW4iLCJzY3JpcHROYW1lIiwiaGFzIiwiZXh0Q29uZmlnIiwiZXh0U2NyaXB0cyIsInNjcmlwdHMiLCJpc1BsYWluT2JqZWN0IiwicnVubmVyIiwiU3ViUHJvY2VzcyIsInByb2Nlc3MiLCJleGVjUGF0aCIsImN3ZCIsImdldEV4dGVuc2lvblJlcXVpcmVQYXRoIiwib3V0cHV0IiwiUmluZ0J1ZmZlciIsIm9uIiwibGluZSIsImVucXVldWUiLCJzdGFydCIsImpvaW4iLCJnZXRCdWZmIiwiZXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFBVSxHQUFH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T0FBUDtBQUFULE9BQVA7QUFDRCxLQUpELENBSUUsT0FBTzdDLEdBQVAsRUFBWTtBQUNaLHNCQUFJLEtBQUtwRixZQUFULEVBQXdCLHNDQUFxQzhHLFVBQVcsTUFBSzFCLEdBQUcsQ0FBQ0MsT0FBUSxFQUFsRSxDQUFvRW1CLEdBQTNGO0FBQ0EsYUFBTztBQUFDMEIsUUFBQUEsS0FBSyxFQUFFOUMsR0FBRyxDQUFDQyxPQUFaO0FBQXFCcUMsUUFBQUEsTUFBTSxFQUFFQSxNQUFNLENBQUNPLE9BQVA7QUFBN0IsT0FBUDtBQUNEO0FBQ0Y7O0FBdmhCbUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgTlBNIGZyb20gJy4vbnBtJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgbG9nLCBzcGluV2l0aCwgUmluZ0J1ZmZlciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU3ViUHJvY2Vzc30gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IElOU1RBTExfVFlQRV9OUE0sIElOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gICAgICAgICBJTlNUQUxMX1RZUEVfTE9DQUwgfSBmcm9tICcuLi9leHRlbnNpb24tY29uZmlnJztcblxuY29uc3QgVVBEQVRFX0FMTCA9ICdpbnN0YWxsZWQnO1xuXG5jbGFzcyBOb3RVcGRhdGFibGVFcnJvciBleHRlbmRzIEVycm9yIHt9XG5jbGFzcyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4dGVuc2lvbkNvbW1hbmQge1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFeHRlbnNpb25Db21tYW5kQ29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZyAtIHRoZSBEcml2ZXJDb25maWcgb3IgUGx1Z2luQ29uZmlnIG9iamVjdCB1c2VkIGZvciB0aGlzIGNvbW1hbmRcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBqc29uIC0gd2hldGhlciB0aGUgb3V0cHV0IG9mIHRoaXMgY29tbWFuZCBzaG91bGQgYmUgSlNPTiBvciB0ZXh0XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIC0gRFJJVkVSX1RZUEUgb3IgUExVR0lOX1RZUEVcbiAgICovXG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kQ29uc3RydWN0b3J9IG9wdHNcbiAgICogQHJldHVybiB7RXh0ZW5zaW9uQ29tbWFuZH1cbiAgICovXG4gIGNvbnN0cnVjdG9yICh7Y29uZmlnLCBqc29uLCB0eXBlfSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBqc29uO1xuICAgIHRoaXMubnBtID0gbmV3IE5QTSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB0aGlzLmtub3duRXh0ZW5zaW9ucyA9IHt9OyAvLyB0aGlzIG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4gaW4gZmluYWwgY2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGEgQ0xJIHBhcnNlIGFuZCBydW4gYW4gZXh0ZW5zaW9uIGNvbW1hbmQgYmFzZWQgb24gaXRzIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBhIGtleS92YWx1ZSBvYmplY3Qgd2l0aCBDTEkgZmxhZ3MgYW5kIHZhbHVlc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IHRoZSByZXN1bHQgb2YgdGhlIHNwZWNpZmljIGNvbW1hbmQgd2hpY2ggaXMgZXhlY3V0ZWRcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUgKGFyZ3MpIHtcbiAgICBjb25zdCBjbWQgPSBhcmdzW2Ake3RoaXMudHlwZX1Db21tYW5kYF07XG4gICAgaWYgKCFfLmlzRnVuY3Rpb24oRXh0ZW5zaW9uQ29tbWFuZC5wcm90b3R5cGVbY21kXSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGhhbmRsZSAke3RoaXMudHlwZX0gY29tbWFuZCAke2NtZH1gKTtcbiAgICB9XG4gICAgY29uc3QgZXhlY3V0ZUNtZCA9IHRoaXNbY21kXS5iaW5kKHRoaXMpO1xuICAgIHJldHVybiBhd2FpdCBleGVjdXRlQ21kKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RBcmdzXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd0luc3RhbGxlZCAtIHdoZXRoZXIgc2hvdWxkIHNob3cgb25seSBpbnN0YWxsZWQgZXh0ZW5zaW9uc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dVcGRhdGVzIC0gd2hldGhlciBzaG91bGQgc2hvdyBhdmFpbGFibGUgdXBkYXRlc1xuICAgKi9cblxuICAvKipcbiAgICogTGlzdCBleHRlbnNpb25zXG4gICAqXG4gICAqIEBwYXJhbSB7TGlzdEFyZ3N9IGFyZ3NcbiAgICogQHJldHVybiB7b2JqZWN0fSBtYXAgb2YgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBsaXN0ICh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKChhY2MsIG5hbWUpID0+IHtcbiAgICAgIGlmICghYWNjW25hbWVdKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgIGFjY1tuYW1lXSA9IHsuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLCBpbnN0YWxsZWQ6IHRydWV9O1xuICAgICAgICB9IGVsc2UgaWYgKCFzaG93SW5zdGFsbGVkKSB7XG4gICAgICAgICAgYWNjW25hbWVdID0ge3BrZ05hbWU6IHRoaXMua25vd25FeHRlbnNpb25zW25hbWVdLCBpbnN0YWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICAvLyBpZiB3ZSB3YW50IHRvIHNob3cgd2hldGhlciB1cGRhdGVzIGFyZSBhdmFpbGFibGUsIHB1dCB0aGF0IGJlaGluZCBhIHNwaW5uZXJcbiAgICBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbHNNc2csIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2hvd1VwZGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbZXh0LCBkYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxlZCwgaW5zdGFsbFR5cGV9ID0gZGF0YTtcbiAgICAgICAgaWYgKCFpbnN0YWxsZWQgfHwgaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB3ZSdyZSBqdXN0IGdldHRpbmcgdGhlIGRhdGEsIHNob3J0IGNpcmN1aXQgcmV0dXJuIGhlcmUgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnlcbiAgICAvLyBmb3JtYXR0aW5nIGxvZ2ljXG4gICAgaWYgKHRoaXMuaXNKc29uT3V0cHV0KSB7XG4gICAgICByZXR1cm4gZXh0cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIG5hbWUsXG4gICAgICB7aW5zdGFsbFR5cGUsIGluc3RhbGxTcGVjLCBpbnN0YWxsZWQsIHVwZGF0ZVZlcnNpb24sIHVuc2FmZVVwZGF0ZVZlcnNpb24sIHZlcnNpb24sIHVwVG9EYXRlfVxuICAgIF0gb2YgXy50b1BhaXJzKGV4dHMpKSB7XG4gICAgICBsZXQgdHlwZVR4dDtcbiAgICAgIHN3aXRjaCAoaW5zdGFsbFR5cGUpIHtcbiAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfR0lUOlxuICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgdHlwZVR4dCA9IGAoY2xvbmVkIGZyb20gJHtpbnN0YWxsU3BlY30pYC55ZWxsb3c7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgIHR5cGVUeHQgPSBgKGxpbmtlZCBmcm9tICR7aW5zdGFsbFNwZWN9KWAubWFnZW50YTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0eXBlVHh0ID0gJyhOUE0pJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluc3RhbGxUeHQgPSBpbnN0YWxsZWQgP1xuICAgICAgICBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gIDpcbiAgICAgICAgJyBbbm90IGluc3RhbGxlZF0nLmdyZXk7XG4gICAgICBjb25zdCB1cGRhdGVUeHQgPSBzaG93VXBkYXRlcyAmJiB1cGRhdGVWZXJzaW9uID9cbiAgICAgICAgYCBbJHt1cGRhdGVWZXJzaW9ufSBhdmFpbGFibGVdYC5tYWdlbnRhIDpcbiAgICAgICAgJyc7XG4gICAgICBjb25zdCB1cFRvRGF0ZVR4dCA9IHNob3dVcGRhdGVzICYmIHVwVG9EYXRlID9cbiAgICAgICAgYCBbVXAgdG8gZGF0ZV1gLmdyZWVuIDpcbiAgICAgICAgJyc7XG4gICAgICBjb25zdCB1bnNhZmVVcGRhdGVUeHQgPSBzaG93VXBkYXRlcyAmJiB1bnNhZmVVcGRhdGVWZXJzaW9uID9cbiAgICAgICAgYCBbJHt1bnNhZmVVcGRhdGVWZXJzaW9ufSBhdmFpbGFibGUgKHBvdGVudGlhbGx5IHVuc2FmZSldYC5jeWFuIDpcbiAgICAgICAgJyc7XG5cbiAgICAgIGNvbnNvbGUubG9nKGAtICR7bmFtZS55ZWxsb3d9JHtpbnN0YWxsVHh0fSR7dXBkYXRlVHh0fSR7dXBUb0RhdGVUeHR9JHt1bnNhZmVVcGRhdGVUeHR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dHM7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbEFyZ3NcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxUeXBlIC0gaG93IHRvIGluc3RhbGwgdGhpcyBleHRlbnNpb24uIE9uZSBvZiB0aGUgSU5TVEFMTF9UWVBFU1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIGZvciBnaXQvZ2l0aHViIGluc3RhbGxzLCB0aGUgZXh0ZW5zaW9uIG5vZGUgcGFja2FnZSBuYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge29iamVjdH0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBpbnN0YWxsICh7ZXh0LCBpbnN0YWxsVHlwZSwgcGFja2FnZU5hbWV9KSB7XG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgQXR0ZW1wdGluZyB0byBmaW5kIGFuZCBpbnN0YWxsICR7dGhpcy50eXBlfSAnJHtleHR9J2ApO1xuXG4gICAgbGV0IGV4dERhdGE7XG4gICAgbGV0IGluc3RhbGxTcGVjID0gZXh0O1xuXG4gICAgaWYgKHBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfTE9DQUwsIElOU1RBTExfVFlQRV9OUE1dLmluY2x1ZGVzKGluc3RhbGxUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHVzaW5nIC0tc291cmNlPSR7aW5zdGFsbFR5cGV9LCBjYW5ub3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgaWYgKCFwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0dJVEhVQl0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTE9DQUwpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBMaW5raW5nICR7dGhpcy50eXBlfSBmcm9tIGxvY2FsIHBhdGhgO1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiAoXG4gICAgICAgIGF3YWl0IHRoaXMubnBtLmxpbmtQYWNrYWdlKGluc3RhbGxTcGVjKSlcbiAgICAgICk7XG4gICAgICBleHREYXRhID0gdGhpcy5nZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbkRhdGEpO1xuICAgICAgZXh0RGF0YS5pbnN0YWxsUGF0aCA9IGV4dERhdGEucGtnTmFtZTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUSFVCKSB7XG4gICAgICBpZiAoaW5zdGFsbFNwZWMuc3BsaXQoJy8nKS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHaXRodWIgJHt0aGlzLnR5cGV9IHNwZWMgJHtpbnN0YWxsU3BlY30gYXBwZWFyZWQgdG8gYmUgaW52YWxpZDsgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnaXQgc2hvdWxkIGJlIG9mIHRoZSBmb3JtIDxvcmc+LzxyZXBvPicpO1xuICAgICAgfVxuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0OiBpbnN0YWxsU3BlYywgcGtnTmFtZTogcGFja2FnZU5hbWV9KTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiBwYWNrYWdlTmFtZX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgIC8vIG5hbWUuIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgIC8vIGV4dGVuc2lvbnMgaW5zdGFsbGVkIHZpYSBucG0gY2FuIGluY2x1ZGUgdmVyc2lvbnMgb3IgdGFncyBhZnRlciB0aGUgJ0AnXG4gICAgICAvLyBzaWduLCBzbyBjaGVjayBmb3IgdGhhdC4gV2UgYWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCBwYWNrYWdlIG5hbWVzIHRoZW1zZWx2ZXMgY2FuXG4gICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgIGxldCBuYW1lLCBwa2dWZXI7XG4gICAgICBjb25zdCBzcGxpdHMgPSBpbnN0YWxsU3BlYy5zcGxpdCgnQCcpO1xuICAgICAgaWYgKGluc3RhbGxTcGVjWzBdID09PSAnQCcpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IFtgQCR7c3BsaXRzWzFdfWAsIHNwbGl0c1syXV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IHNwbGl0cztcbiAgICAgIH1cbiAgICAgIGxldCBwa2dOYW1lO1xuXG4gICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgLy8gYWdhaW5zdCB0aGUgYXBwaXVtIGV4dGVuc2lvbiBsaXN0OyBqdXN0IHVzZSB0aGUgaW5zdGFsbFNwZWMgYXMgaXNcbiAgICAgICAgcGtnTmFtZSA9IG5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgYXBwaXVtIGRyaXZlciAobGlrZSAneGN1aXRlc3QnKSB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIGRlcmVmZXJlbmNlIHRoZSBhY3R1YWwgbnBtIHBhY2thZ2UgKCdhcHBpdXBtLXhjdWl0ZXN0LWRyaXZlcicpLCBzb1xuICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgICAgIGlmICghXy5pbmNsdWRlcyhrbm93bk5hbWVzLCBuYW1lKSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBvZiBzdXBwb3J0ZWQgJHt0aGlzLnR5cGV9cz8gJHtKU09OLnN0cmluZ2lmeShrbm93bk5hbWVzKX1gO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHBrZ05hbWUgPSB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXTtcbiAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgIC8vICducG0nIG5vd1xuICAgICAgICBpbnN0YWxsVHlwZSA9IElOU1RBTExfVFlQRV9OUE07XG4gICAgICB9XG5cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0TmFtZSA9IGV4dERhdGFbYCR7dGhpcy50eXBlfU5hbWVgXTtcbiAgICBkZWxldGUgZXh0RGF0YVtgJHt0aGlzLnR5cGV9TmFtZWBdO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dE5hbWV9JyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYERpZCB5b3UgbWVhbiB0byB1cGRhdGU/ICdhcHBpdW0gJHt0aGlzLnR5cGV9IHVwZGF0ZScuIFNlZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgaW5zdGFsbGVkICR7dGhpcy50eXBlfXMgd2l0aCAnYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkJy5gKTtcbiAgICB9XG5cbiAgICBleHREYXRhLmluc3RhbGxUeXBlID0gaW5zdGFsbFR5cGU7XG4gICAgZXh0RGF0YS5pbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLmFkZEV4dGVuc2lvbihleHROYW1lLCBleHREYXRhKTtcblxuICAgIC8vIGxvZyBpbmZvIGZvciB0aGUgdXNlclxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgdGhpcy5nZXRQb3N0SW5zdGFsbFRleHQoe2V4dE5hbWUsIGV4dERhdGF9KSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsVmlhTnBtQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gaW5zdGFsbFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZSAtIHRoZSBOUE0gcGFja2FnZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwa2dWZXJdIC0gdGhlIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIE5QTSBwYWNrYWdlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvbiB2aWEgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdGFsbFZpYU5wbUFyZ3N9IGFyZ3NcbiAgICovXG4gIGFzeW5jIGluc3RhbGxWaWFOcG0gKHtleHQsIHBrZ05hbWUsIHBrZ1Zlcn0pIHtcbiAgICBjb25zdCBucG1TcGVjID0gYCR7cGtnTmFtZX0ke3BrZ1ZlciA/ICdAJyArIHBrZ1ZlciA6ICcnfWA7XG4gICAgY29uc3Qgc3BlY01zZyA9IG5wbVNwZWMgPT09IGV4dCA/ICcnIDogYCB1c2luZyBOUE0gaW5zdGFsbCBzcGVjICcke25wbVNwZWN9J2A7XG4gICAgY29uc3QgbXNnID0gYEluc3RhbGxpbmcgJyR7ZXh0fScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiAoXG4gICAgICAgIGF3YWl0IHRoaXMubnBtLmluc3RhbGxQYWNrYWdlKHtcbiAgICAgICAgICBwa2dEaXI6IHBhdGgucmVzb2x2ZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLCBwa2dOYW1lKSxcbiAgICAgICAgICBwa2dOYW1lLFxuICAgICAgICAgIHBrZ1ZlclxuICAgICAgICB9KVxuICAgICAgKSk7XG4gICAgICBjb25zdCBleHREYXRhID0gdGhpcy5nZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbkRhdGEpO1xuICAgICAgZXh0RGF0YS5pbnN0YWxsUGF0aCA9IHBrZ05hbWU7XG4gICAgICByZXR1cm4gZXh0RGF0YTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBpbnN0YWxsaW5nIHBhY2thZ2U6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvbkFyZ3NcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dE5hbWUgLSB0aGUgbmFtZSBvZiBhbiBleHRlbnNpb25cbiAgICogQHByb3BlcnR5IHtvYmplY3R9IGV4dERhdGEgLSB0aGUgZGF0YSBmb3IgYW4gaW5zdGFsbGVkIGV4dGVuc2lvblxuICAgKi9cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKi9cbiAgZ2V0UG9zdEluc3RhbGxUZXh0ICgvKntleHROYW1lLCBleHREYXRhfSovKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhbiBOUE0gbW9kdWxlJ3MgcGFja2FnZS5qc29uIGFuZCBleHRyYWN0IEFwcGl1bSBkcml2ZXIgaW5mb3JtYXRpb24gZnJvbSBhIHNwZWNpYWxcbiAgICogJ2FwcGl1bScgZmllbGQgaW4gdGhlIEpTT04gZGF0YS4gV2UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIHRvIGUuZy4gZGV0ZXJtaW5lIHdoaWNoIGNsYXNzIHRvXG4gICAqIGxvYWQgYXMgdGhlIG1haW4gZHJpdmVyIGNsYXNzLCBvciB0byBiZSBhYmxlIHRvIGRldGVjdCBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRyaXZlciBhbmRcbiAgICogYXBwaXVtIHZlcnNpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGtnSnNvbkRhdGEgLSB0aGUgcGFja2FnZS5qc29uIGRhdGEgZm9yIGEgZHJpdmVyIG1vZHVsZSwgYXMgaWYgaXQgaGFkIGJlZW5cbiAgICogc3RyYWlnaHRmb3J3YXJkbHkgJ3JlcXVpcmUnZFxuICAgKi9cbiAgZ2V0RXh0ZW5zaW9uRmllbGRzIChwa2dKc29uRGF0YSkge1xuICAgIGlmICghcGtnSnNvbkRhdGEuYXBwaXVtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RhbGxlZCBkcml2ZXIgZGlkIG5vdCBoYXZlIGFuICdhcHBpdW0nIHNlY3Rpb24gaW4gaXRzIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBwYWNrYWdlLmpzb24gZmlsZSBhcyBleHBlY3RlZGApO1xuICAgIH1cbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IHBrZ0pzb25EYXRhO1xuICAgIHRoaXMudmFsaWRhdGVFeHRlbnNpb25GaWVsZHMoYXBwaXVtKTtcblxuICAgIHJldHVybiB7Li4uYXBwaXVtLCBwa2dOYW1lOiBuYW1lLCB2ZXJzaW9ufTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgYW55IHBhY2thZ2UuanNvbiBmaWVsZHMgd2hpY2ggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZXh0ZW5zaW9uIHJlcXVpcmVzLCB2YWxpZGF0ZSB0aGVcbiAgICogcHJlc2VuY2UgYW5kIGZvcm0gb2YgdGhvc2UgZmllbGRzIG9uIHRoZSBwYWNrYWdlLmpzb24gZGF0YSwgdGhyb3dpbmcgYW4gZXJyb3IgaWYgYW55dGhpbmcgaXNcbiAgICogYW1pc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcHBpdW1Qa2dEYXRhIC0gdGhlIGRhdGEgaW4gdGhlIFwiYXBwaXVtXCIgZmllbGQgb2YgcGFja2FnZS5qc29uIGZvciBhblxuICAgKiBleHRlbnNpb25cbiAgICovXG4gIHZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzICgvKmFwcGl1bVBrZ0RhdGEqLykge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFVuaW5zdGFsbEFyZ3NcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIHVuaW5zdGFsbFxuICAgKi9cblxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge1VuaW5zdGFsbEFyZ3N9IGFyZ3NcbiAgICogQHJldHVybiB7b2JqZWN0fSBtYXAgb2YgYWxsIGluc3RhbGxlZCBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIHVuaW5zdGFsbCAoe2V4dH0pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdW5pbnN0YWxsICR7dGhpcy50eXBlfSAnJHtleHR9JzsgaXQgaXMgbm90IGluc3RhbGxlZGApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZy5yZW1vdmVFeHRlbnNpb24oZXh0KTtcbiAgICB9XG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgU3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkICR7dGhpcy50eXBlfSAnJHtleHR9J2AuZ3JlZW4pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvblVwZGF0ZU9wdHNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gdXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdW5zYWZlIC0gaWYgdHJ1ZSwgd2lsbCBwZXJmb3JtIHVuc2FmZSB1cGRhdGVzIHBhc3QgbWFqb3IgcmV2aXNpb25cbiAgICogYm91bmRhcmllc1xuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gVXBkYXRlUmVwb3J0XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmcm9tIC0gdmVyc2lvbiB1cGRhdGVkIGZyb21cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRvIC0gdmVyc2lvbiB1cGRhdGVkIHRvXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gdXBkYXRlcyAtIG1hcCBvZiBleHQgbmFtZXMgdG8ge0BsaW5rIFVwZGF0ZVJlcG9ydH1zXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHVwZGF0ZSBvbmUgb3IgbW9yZSBkcml2ZXJzIHVzaW5nIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblVwZGF0ZU9wdHN9IHVwZGF0ZVNwZWNcbiAgICogQHJldHVybiB7RXh0ZW5zaW9uVXBkYXRlUmVzdWx0fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlICh7ZXh0LCB1bnNhZmV9KSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlQWxsID0gZXh0ID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9ICcke2V4dH0nIHdhcyBub3QgaW5zdGFsbGVkLCBzbyBjYW4ndCBiZSB1cGRhdGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dHNUb1VwZGF0ZSA9IHNob3VsZFVwZGF0ZUFsbCA/IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpIDogW2V4dF07XG5cbiAgICAvLyAnZXJyb3JzJyB3aWxsIGhhdmUgZXh0IG5hbWVzIGFzIGtleXMgYW5kIGVycm9yIG9iamVjdHMgYXMgdmFsdWVzXG4gICAgY29uc3QgZXJyb3JzID0ge307XG5cbiAgICAvLyAndXBkYXRlcycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCB1cGRhdGUgb2JqZWN0cyBhcyB2YWx1ZXMsIHdoZXJlIGFuIHVwZGF0ZVxuICAgIC8vIG9iamVjdCBpcyBvZiB0aGUgZm9ybSB7ZnJvbTogdmVyc2lvblN0cmluZywgdG86IHZlcnNpb25TdHJpbmd9XG4gICAgY29uc3QgdXBkYXRlcyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIGV4dHNUb1VwZGF0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIGlzIHVwZGF0YWJsZWAsICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tlXS5pbnN0YWxsVHlwZSAhPT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFVwZGF0YWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGUpO1xuICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsICdVcGRhdGUgcmVwb3J0OicpO1xuICAgIGZvciAoY29uc3QgW2UsIHVwZGF0ZV0gb2YgXy50b1BhaXJzKHVwZGF0ZXMpKSB7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICR7dGhpcy50eXBlfSAke2V9IHVwZGF0ZWQ6ICR7dXBkYXRlLmZyb219ID0+ICR7dXBkYXRlLnRvfWAuZ3JlZW4pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtlLCBlcnJdIG9mIF8udG9QYWlycyhlcnJvcnMpKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90VXBkYXRhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmb3IgdXBkYXRlc2AueWVsbG93KTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgaGFkIG5vIHVwZGF0ZXMgYXZhaWxhYmxlYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBtYWtlIGl0IHBvcCB3aXRoIHJlZCFcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgZmFpbGVkIHRvIHVwZGF0ZTogJHtlcnJ9YC5yZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7dXBkYXRlcywgZXJyb3JzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiBQb3NzaWJsZVVwZGF0ZXNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnQgLSBjdXJyZW50IHZlcnNpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IHVuc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHVuc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBmaWd1cmUgb3V0IHdoYXQgaXRzIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiB1cGdyYWRlIGlzLCBhbmQgYWxzbyB0aGVcbiAgICogaGlnaGVzdCBwb3NzaWJsZSBzYWZlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcmV0dXJuIHtQb3NzaWJsZVVwZGF0ZXN9XG4gICAqL1xuICBhc3luYyBjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSAoZXh0KSB7XG4gICAgLy8gVE9ETyBkZWNpZGUgaG93IHdlIHdhbnQgdG8gaGFuZGxlIGJldGEgdmVyc2lvbnM/XG4gICAgLy8gdGhpcyBpcyBhIGhlbHBlciBtZXRob2QsICdleHQnIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBpbnN0YWxsZWQgaGVyZSwgYW5kIG9mIHRoZSBucG1cbiAgICAvLyBpbnN0YWxsIHR5cGVcbiAgICBjb25zdCB7dmVyc2lvbiwgcGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dF07XG4gICAgbGV0IHVuc2FmZVVwZGF0ZSA9IGF3YWl0IHRoaXMubnBtLmdldExhdGVzdFZlcnNpb24ocGtnTmFtZSk7XG4gICAgbGV0IHNhZmVVcGRhdGUgPSBhd2FpdCB0aGlzLm5wbS5nZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24ocGtnTmFtZSwgdmVyc2lvbik7XG4gICAgaWYgKCF1dGlsLmNvbXBhcmVWZXJzaW9ucyh1bnNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24sIHNvIHRoZXJlJ3Mgbm8gcG9zc2libGUgdXBkYXRlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh1bnNhZmVVcGRhdGUgJiYgdW5zYWZlVXBkYXRlID09PSBzYWZlVXBkYXRlKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHVwZGF0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2FmZSB1cGRhdGUsIHdoaWNoIG1lYW5zIGl0J3Mgbm90IGFjdHVhbGx5IHVuc2FmZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHNhZmVVcGRhdGUgJiYgIXV0aWwuY29tcGFyZVZlcnNpb25zKHNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIGV2ZW4gdGhlIHNhZmUgdXBkYXRlIGlzIG5vdCBsYXRlciB0aGFuIHRoZSBjdXJyZW50LCBzbyBpdCBpcyBub3QgYWN0dWFsbHkgYW4gdXBkYXRlXG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtjdXJyZW50OiB2ZXJzaW9uLCBzYWZlVXBkYXRlLCB1bnNhZmVVcGRhdGV9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGx5IHVwZGF0ZSBhbiBleHRlbnNpb24gaW5zdGFsbGVkIGJ5IE5QTSwgdXNpbmcgdGhlIE5QTSBjbGkuIEFuZCB1cGRhdGUgdGhlIGluc3RhbGxhdGlvblxuICAgKiBtYW5pZmVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlRXh0ZW5zaW9uIChleHQsIHZlcnNpb24pIHtcbiAgICBjb25zdCB7cGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dF07XG4gICAgYXdhaXQgZnMucmltcmFmKHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCkpO1xuICAgIGNvbnN0IGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyOiB2ZXJzaW9ufSk7XG4gICAgZGVsZXRlIGV4dERhdGFbYCR7dGhpcy50eXBlfU5hbWVgXTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy51cGRhdGVFeHRlbnNpb24oZXh0LCBleHREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiBSdW5PdXRwdXRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfHVuZGVmaW5lZH0gZXJyb3IgLSBlcnJvciBtZXNzYWdlIGlmIHNjcmlwdCByYW4gdW5zdWNjZXNzZnVseSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICAgKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHNjcmlwdCBjYWNoZWQgaW5zaWRlIHRoZSBcInNjcmlwdHNcIiBmaWVsZCB1bmRlciBcImFwcGl1bVwiXG4gICAqIGluc2lkZSBvZiB0aGUgZHJpdmVyL3BsdWdpbnMgXCJwYWNrYWdlLmpzb25cIiBmaWxlLiBXaWxsIHRocm93XG4gICAqIGFuIGVycm9yIGlmIHRoZSBkcml2ZXIvcGx1Z2luIGRvZXMgbm90IGNvbnRhaW4gYSBcInNjcmlwdHNcIiBmaWVsZFxuICAgKiB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb24sIGlmIHRoZVxuICAgKiBcInNjcmlwdHNcIiBmaWVsZCBpcyBub3QgYSBwbGFpbiBvYmplY3QsIG9yIGlmIHRoZSBzY3JpcHROYW1lIGlzXG4gICAqIG5vdCBmb3VuZCB3aXRoaW4gXCJzY3JpcHRzXCIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHJ1biBhIHNjcmlwdCBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY3JpcHROYW1lIC0gbmFtZSBvZiB0aGUgc2NyaXB0IHRvIHJ1blxuICAgKiBAcmV0dXJuIHtSdW5PdXRwdXR9XG4gICAqL1xuICBhc3luYyBydW4gKHtleHQsIHNjcmlwdE5hbWV9KSB7XG4gICAgaWYgKCFfLmhhcyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zLCBleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBsZWFzZSBpbnN0YWxsIHRoZSAke3RoaXMudHlwZX0gZmlyc3RgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRDb25maWcgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dF07XG5cbiAgICBpZiAoIV8uaGFzKGV4dENvbmZpZywgJ3NjcmlwdHMnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dH0nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBcInNjcmlwdHNcIiBmaWVsZCB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb25gKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRTY3JpcHRzID0gZXh0Q29uZmlnLnNjcmlwdHM7XG5cbiAgICBpZiAoIV8uaXNQbGFpbk9iamVjdChleHRTY3JpcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dH0nIFwic2NyaXB0c1wiIGZpZWxkIG11c3QgYmUgYSBwbGFpbiBvYmplY3RgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKGV4dFNjcmlwdHMsIHNjcmlwdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2NyaXB0OiAnJHtzY3JpcHROYW1lfSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCBydW5uZXIgPSBuZXcgU3ViUHJvY2Vzcyhwcm9jZXNzLmV4ZWNQYXRoLCBbZXh0U2NyaXB0c1tzY3JpcHROYW1lXV0sIHtcbiAgICAgIGN3ZDogdGhpcy5jb25maWcuZ2V0RXh0ZW5zaW9uUmVxdWlyZVBhdGgoZXh0KVxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IFJpbmdCdWZmZXIoNTApO1xuXG4gICAgcnVubmVyLm9uKCdzdHJlYW0tbGluZScsIChsaW5lKSA9PiB7XG4gICAgICBvdXRwdXQuZW5xdWV1ZShsaW5lKTtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgbGluZSk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBydW5uZXIuc3RhcnQoMCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVubmVyLmpvaW4oKTtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYCR7c2NyaXB0TmFtZX0gc3VjY2Vzc2Z1bHkgcmFuYC5ncmVlbik7XG4gICAgICByZXR1cm4ge291dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHJ1bm5pbmcgJyR7c2NyaXB0TmFtZX0nOiAke2Vyci5tZXNzYWdlfWAucmVkKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6IGVyci5tZXNzYWdlLCBvdXRwdXQ6IG91dHB1dC5nZXRCdWZmKCl9O1xuICAgIH1cbiAgfVxufVxuIl0sImZpbGUiOiJsaWIvY2xpL2V4dGVuc2lvbi1jb21tYW5kLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
456
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImpzb24iLCJ0eXBlIiwiaXNKc29uT3V0cHV0IiwibnBtIiwiTlBNIiwiYXBwaXVtSG9tZSIsImtub3duRXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImluc3RhbGxUeHQiLCJncmVlbiIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsInBrZ0pzb25EYXRhIiwibGlua1BhY2thZ2UiLCJnZXRFeHRlbnNpb25GaWVsZHMiLCJpbnN0YWxsUGF0aCIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJzcGxpdHMiLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiYWRkRXh0ZW5zaW9uIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJpbnN0YWxsUGFja2FnZSIsInBrZ0RpciIsInBhdGgiLCJyZXNvbHZlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwidW5pbnN0YWxsIiwiZnMiLCJyaW1yYWYiLCJnZXRJbnN0YWxsUGF0aCIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJydW4iLCJzY3JpcHROYW1lIiwiaGFzIiwiZXh0Q29uZmlnIiwiZXh0U2NyaXB0cyIsInNjcmlwdHMiLCJpc1BsYWluT2JqZWN0IiwicnVubmVyIiwiU3ViUHJvY2VzcyIsInByb2Nlc3MiLCJleGVjUGF0aCIsImN3ZCIsImdldEV4dGVuc2lvblJlcXVpcmVQYXRoIiwib3V0cHV0IiwiUmluZ0J1ZmZlciIsIm9uIiwibGluZSIsImVucXVldWUiLCJzdGFydCIsImpvaW4iLCJnZXRCdWZmIiwiZXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFBVSxHQUFH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QUFQO0FBQVQsT0FBUDtBQUNELEtBSkQsQ0FJRSxPQUFPN0MsR0FBUCxFQUFZO0FBQ1osc0JBQUksS0FBS3BGLFlBQVQsRUFBd0Isc0NBQXFDOEcsVUFBVyxNQUFLMUIsR0FBRyxDQUFDQyxPQUFRLEVBQWxFLENBQW9FbUIsR0FBM0Y7QUFDQSxhQUFPO0FBQUMwQixRQUFBQSxLQUFLLEVBQUU5QyxHQUFHLENBQUNDLE9BQVo7QUFBcUJxQyxRQUFBQSxNQUFNLEVBQUVBLE1BQU0sQ0FBQ08sT0FBUDtBQUE3QixPQUFQO0FBQ0Q7QUFDRjs7QUFsaEJtQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBOUE0gZnJvbSAnLi9ucG0nO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmcywgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBsb2csIHNwaW5XaXRoLCBSaW5nQnVmZmVyIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgSU5TVEFMTF9UWVBFX05QTSwgSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgICAgICAgIElOU1RBTExfVFlQRV9MT0NBTCB9IGZyb20gJy4uL2V4dGVuc2lvbi1jb25maWcnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvbkNvbW1hbmRDb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gdGhlIERyaXZlckNvbmZpZyBvciBQbHVnaW5Db25maWcgb2JqZWN0IHVzZWQgZm9yIHRoaXMgY29tbWFuZFxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGpzb24gLSB3aGV0aGVyIHRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIHNob3VsZCBiZSBKU09OIG9yIHRleHRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBEUklWRVJfVFlQRSBvciBQTFVHSU5fVFlQRVxuICAgKi9cblxuICAvKipcbiAgICogQnVpbGQgYW4gRXh0ZW5zaW9uQ29tbWFuZFxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbW1hbmRDb25zdHJ1Y3Rvcn0gb3B0c1xuICAgKiBAcmV0dXJuIHtFeHRlbnNpb25Db21tYW5kfVxuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb24sIHR5cGV9KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmlzSnNvbk91dHB1dCA9IGpzb247XG4gICAgdGhpcy5ucG0gPSBuZXcgTlBNKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUpO1xuICAgIHRoaXMua25vd25FeHRlbnNpb25zID0ge307IC8vIHRoaXMgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbiBpbiBmaW5hbCBjbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge29iamVjdH0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSAoYXJncykge1xuICAgIGNvbnN0IGNtZCA9IGFyZ3NbYCR7dGhpcy50eXBlfUNvbW1hbmRgXTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbihFeHRlbnNpb25Db21tYW5kLnByb3RvdHlwZVtjbWRdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGFuZGxlICR7dGhpcy50eXBlfSBjb21tYW5kICR7Y21kfWApO1xuICAgIH1cbiAgICBjb25zdCBleGVjdXRlQ21kID0gdGhpc1tjbWRdLmJpbmQodGhpcyk7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVDbWQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdEFyZ3NcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93SW5zdGFsbGVkIC0gd2hldGhlciBzaG91bGQgc2hvdyBvbmx5IGluc3RhbGxlZCBleHRlbnNpb25zXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0QXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGxpc3QgKHtzaG93SW5zdGFsbGVkLCBzaG93VXBkYXRlc30pIHtcbiAgICBjb25zdCBsc01zZyA9IGBMaXN0aW5nICR7c2hvd0luc3RhbGxlZCA/ICdpbnN0YWxsZWQnIDogJ2F2YWlsYWJsZSd9ICR7dGhpcy50eXBlfXNgO1xuICAgIGNvbnN0IGluc3RhbGxlZE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucyk7XG4gICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICBjb25zdCBleHRzID0gWy4uLmluc3RhbGxlZE5hbWVzLCAuLi5rbm93bk5hbWVzXS5yZWR1Y2UoKGFjYywgbmFtZSkgPT4ge1xuICAgICAgaWYgKCFhY2NbbmFtZV0pIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZE5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgYWNjW25hbWVdID0gey4uLnRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogdHJ1ZX07XG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7cGtnTmFtZTogdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBjb25zdCB7aW5zdGFsbGVkLCBpbnN0YWxsVHlwZX0gPSBkYXRhO1xuICAgICAgICBpZiAoIWluc3RhbGxlZCB8fCBpbnN0YWxsVHlwZSAhPT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgIC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMgb24gZXh0cyB0aGF0IGFyZW4ndCBpbnN0YWxsZWRcbiAgICAgICAgICAvLyBhbHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMgb24gbm9uLW5wbSBleHRzXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IGF3YWl0IHRoaXMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoZXh0KTtcbiAgICAgICAgZGF0YS51cGRhdGVWZXJzaW9uID0gdXBkYXRlcy5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVuc2FmZVVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnVuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51cFRvRGF0ZSA9IHVwZGF0ZXMuc2FmZVVwZGF0ZSA9PT0gbnVsbCAmJiB1cGRhdGVzLnVuc2FmZVVwZGF0ZSA9PT0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBleHRzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW1xuICAgICAgbmFtZSxcbiAgICAgIHtpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWMsIGluc3RhbGxlZCwgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9XG4gICAgXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGxldCB0eXBlVHh0O1xuICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVQ6XG4gICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVEhVQjpcbiAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfTE9DQUw6XG4gICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFsbFR4dCA9IGluc3RhbGxlZCA/XG4gICAgICAgIGBAJHt2ZXJzaW9uLnllbGxvd30gJHsoJ1tpbnN0YWxsZWQgJyArIHR5cGVUeHQgKyAnXScpLmdyZWVufWAgOlxuICAgICAgICAnIFtub3QgaW5zdGFsbGVkXScuZ3JleTtcbiAgICAgIGNvbnN0IHVwZGF0ZVR4dCA9IHNob3dVcGRhdGVzICYmIHVwZGF0ZVZlcnNpb24gP1xuICAgICAgICBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGEgOlxuICAgICAgICAnJztcbiAgICAgIGNvbnN0IHVwVG9EYXRlVHh0ID0gc2hvd1VwZGF0ZXMgJiYgdXBUb0RhdGUgP1xuICAgICAgICBgIFtVcCB0byBkYXRlXWAuZ3JlZW4gOlxuICAgICAgICAnJztcbiAgICAgIGNvbnN0IHVuc2FmZVVwZGF0ZVR4dCA9IHNob3dVcGRhdGVzICYmIHVuc2FmZVVwZGF0ZVZlcnNpb24gP1xuICAgICAgICBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW4gOlxuICAgICAgICAnJztcblxuICAgICAgY29uc29sZS5sb2coYC0gJHtuYW1lLnllbGxvd30ke2luc3RhbGxUeHR9JHt1cGRhdGVUeHR9JHt1cFRvRGF0ZVR4dH0ke3Vuc2FmZVVwZGF0ZVR4dH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gaW5zdGFsbFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gZm9yIGdpdC9naXRodWIgaW5zdGFsbHMsIHRoZSBleHRlbnNpb24gbm9kZSBwYWNrYWdlIG5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdGFsbEFyZ3N9IGFyZ3NcbiAgICogQHJldHVybiB7b2JqZWN0fSBtYXAgb2YgYWxsIGluc3RhbGxlZCBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGluc3RhbGwgKHtleHQsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBBdHRlbXB0aW5nIHRvIGZpbmQgYW5kIGluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2V4dH0nYCk7XG5cbiAgICBsZXQgZXh0RGF0YTtcbiAgICBsZXQgaW5zdGFsbFNwZWMgPSBleHQ7XG5cbiAgICBpZiAocGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX05QTV0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgbXVzdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgY29uc3QgbXNnID0gYExpbmtpbmcgJHt0aGlzLnR5cGV9IGZyb20gbG9jYWwgcGF0aGA7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgdGhpcy5ucG0ubGlua1BhY2thZ2UoaW5zdGFsbFNwZWMpKVxuICAgICAgKTtcbiAgICAgIGV4dERhdGEgPSB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgICBleHREYXRhLmluc3RhbGxQYXRoID0gZXh0RGF0YS5wa2dOYW1lO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVRIVUIpIHtcbiAgICAgIGlmIChpbnN0YWxsU3BlYy5zcGxpdCgnLycpLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+Jyk7XG4gICAgICB9XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiBwYWNrYWdlTmFtZX0pO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVQpIHtcbiAgICAgIC8vIGdpdCB1cmxzIGNhbiBoYXZlICcuZ2l0JyBhdCB0aGUgZW5kLCBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGFuZCB3b3VsZCBjb21wbGljYXRlIHRoZVxuICAgICAgLy8gd2F5IHdlIGRvd25sb2FkIGFuZCBuYW1lIGRpcmVjdG9yaWVzLCBzbyB3ZSBjYW4ganVzdCByZW1vdmUgaXRcbiAgICAgIGluc3RhbGxTcGVjID0gaW5zdGFsbFNwZWMucmVwbGFjZSgvXFwuZ2l0JC8sICcnKTtcbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IHBhY2thZ2VOYW1lfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBlaXRoZXIgYW4gbnBtIHBhY2thZ2Ugb3IgYW4gYXBwaXVtIHZlcmlmaWVkIGV4dGVuc2lvblxuICAgICAgLy8gbmFtZS4gYm90aCBvZiB3aGljaCB3aWxsIGJlIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgIC8vIHNpZ24sIHNvIGNoZWNrIGZvciB0aGF0LiBXZSBhbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB0aGF0IHBhY2thZ2UgbmFtZXMgdGhlbXNlbHZlcyBjYW5cbiAgICAgIC8vIGNvbnRhaW4gdGhlICdAJyBzeW1ib2wsIGFzIGluIGBucG0gaW5zdGFsbCBAYXBwaXVtL2Zha2UtZHJpdmVyQDEuMi4wYFxuICAgICAgbGV0IG5hbWUsIHBrZ1ZlcjtcbiAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICBpZiAoaW5zdGFsbFNwZWNbMF0gPT09ICdAJykge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gbnBtIG9yZyBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2l0aG91dCBhbiBucG0gb3JnXG4gICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgfVxuICAgICAgbGV0IHBrZ05hbWU7XG5cbiAgICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgcGFja2FnZSBmcm9tIG5wbSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVja1xuICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICBwa2dOYW1lID0gbmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gZGVyZWZlcmVuY2UgdGhlIGFjdHVhbCBucG0gcGFja2FnZSAoJ2FwcGl1cG0teGN1aXRlc3QtZHJpdmVyJyksIHNvXG4gICAgICAgIC8vIGNoZWNrIGl0IGV4aXN0cyBhbmQgZ2V0IHRoZSBjb3JyZWN0IHBhY2thZ2VcbiAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgaWYgKCFfLmluY2x1ZGVzKGtub3duTmFtZXMsIG5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gYENvdWxkIG5vdCByZXNvbHZlICR7dGhpcy50eXBlfTsgYXJlIHlvdSBzdXJlIGl0J3MgaW4gdGhlIGxpc3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYG9mIHN1cHBvcnRlZCAke3RoaXMudHlwZX1zPyAke0pTT04uc3RyaW5naWZ5KGtub3duTmFtZXMpfWA7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGtnTmFtZSA9IHRoaXMua25vd25FeHRlbnNpb25zW25hbWVdO1xuICAgICAgICAvLyBnaXZlbiB0aGF0IHdlJ2xsIHVzZSB0aGUgaW5zdGFsbCB0eXBlIGluIHRoZSBkcml2ZXIganNvbiwgc3RvcmUgaXQgYXNcbiAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgIGluc3RhbGxUeXBlID0gSU5TVEFMTF9UWVBFX05QTTtcbiAgICAgIH1cblxuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KTtcbiAgICB9XG5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVtgJHt0aGlzLnR5cGV9TmFtZWBdO1xuICAgIGRlbGV0ZSBleHREYXRhW2Ake3RoaXMudHlwZX1OYW1lYF07XG5cbiAgICBpZiAodGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0TmFtZX0nIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gJ2FwcGl1bSAke3RoaXMudHlwZX0gdXBkYXRlJy4gU2VlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoICdhcHBpdW0gJHt0aGlzLnR5cGV9IGxpc3QgLS1pbnN0YWxsZWQnLmApO1xuICAgIH1cblxuICAgIGV4dERhdGEuaW5zdGFsbFR5cGUgPSBpbnN0YWxsVHlwZTtcbiAgICBleHREYXRhLmluc3RhbGxTcGVjID0gaW5zdGFsbFNwZWM7XG4gICAgYXdhaXQgdGhpcy5jb25maWcuYWRkRXh0ZW5zaW9uKGV4dE5hbWUsIGV4dERhdGEpO1xuXG4gICAgLy8gbG9nIGluZm8gZm9yIHRoZSB1c2VyXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCB0aGlzLmdldFBvc3RJbnN0YWxsVGV4dCh7ZXh0TmFtZSwgZXh0RGF0YX0pKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxWaWFOcG1BcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BrZ1Zlcl0gLSB0aGUgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgTlBNIHBhY2thZ2VcbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uIHZpYSBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsVmlhTnBtQXJnc30gYXJnc1xuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFZpYU5wbSAoe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gZXh0ID8gJycgOiBgIHVzaW5nIE5QTSBpbnN0YWxsIHNwZWMgJyR7bnBtU3BlY30nYDtcbiAgICBjb25zdCBtc2cgPSBgSW5zdGFsbGluZyAnJHtleHR9JyR7c3BlY01zZ31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgdGhpcy5ucG0uaW5zdGFsbFBhY2thZ2Uoe1xuICAgICAgICAgIHBrZ0RpcjogcGF0aC5yZXNvbHZlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpLFxuICAgICAgICAgIHBrZ05hbWUsXG4gICAgICAgICAgcGtnVmVyXG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICAgIGNvbnN0IGV4dERhdGEgPSB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgICBleHREYXRhLmluc3RhbGxQYXRoID0gcGtnTmFtZTtcbiAgICAgIHJldHVybiBleHREYXRhO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0TmFtZSAtIHRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvblxuICAgKiBAcHJvcGVydHkge29iamVjdH0gZXh0RGF0YSAtIHRoZSBkYXRhIGZvciBhbiBpbnN0YWxsZWQgZXh0ZW5zaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRleHQgd2hpY2ggc2hvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhZnRlciBhbiBleHRlbnNpb24gaGFzIGJlZW4gaW5zdGFsbGVkLiBUaGlzXG4gICAqIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgZHJpdmVycy9wbHVnaW5zIHdpdGggdGhlaXIgb3duIHBhcnRpY3VsYXIgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25BcmdzfSBhcmdzXG4gICAqL1xuICBnZXRQb3N0SW5zdGFsbFRleHQgKC8qe2V4dE5hbWUsIGV4dERhdGF9Ki8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGFuIE5QTSBtb2R1bGUncyBwYWNrYWdlLmpzb24gYW5kIGV4dHJhY3QgQXBwaXVtIGRyaXZlciBpbmZvcm1hdGlvbiBmcm9tIGEgc3BlY2lhbFxuICAgKiAnYXBwaXVtJyBmaWVsZCBpbiB0aGUgSlNPTiBkYXRhLiBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gdG8gZS5nLiBkZXRlcm1pbmUgd2hpY2ggY2xhc3MgdG9cbiAgICogbG9hZCBhcyB0aGUgbWFpbiBkcml2ZXIgY2xhc3MsIG9yIHRvIGJlIGFibGUgdG8gZGV0ZWN0IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gZHJpdmVyIGFuZFxuICAgKiBhcHBpdW0gdmVyc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwa2dKc29uRGF0YSAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlblxuICAgKiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMgKHBrZ0pzb25EYXRhKSB7XG4gICAgaWYgKCFwa2dKc29uRGF0YS5hcHBpdW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdGFsbGVkIGRyaXZlciBkaWQgbm90IGhhdmUgYW4gJ2FwcGl1bScgc2VjdGlvbiBpbiBpdHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGFzIGV4cGVjdGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb259ID0gcGtnSnNvbkRhdGE7XG4gICAgdGhpcy52YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhhcHBpdW0pO1xuXG4gICAgcmV0dXJuIHsuLi5hcHBpdW0sIHBrZ05hbWU6IG5hbWUsIHZlcnNpb259O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFwcGl1bVBrZ0RhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBwYWNrYWdlLmpzb24gZm9yIGFuXG4gICAqIGV4dGVuc2lvblxuICAgKi9cbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKC8qYXBwaXVtUGtnRGF0YSovKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gdW5pbnN0YWxsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgdW5pbnN0YWxsICh7ZXh0fSkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1bmluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2V4dH0nOyBpdCBpcyBub3QgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihleHQpO1xuICAgIH1cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJHt0aGlzLnR5cGV9ICcke2V4dH0nYC5ncmVlbik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSB1bnNhZmUgLSBpZiB0cnVlLCB3aWxsIHBlcmZvcm0gdW5zYWZlIHVwZGF0ZXMgcGFzdCBtYWpvciByZXZpc2lvblxuICAgKiBib3VuZGFyaWVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBVcGRhdGVSZXBvcnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHVwZGF0ZWQgZnJvbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHVwZGF0ZWQgdG9cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvblVwZGF0ZVJlc3VsdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gZXJyb3JzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byBlcnJvciBvYmplY3RzXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1cGRhdGVzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byB7QGxpbmsgVXBkYXRlUmVwb3J0fXNcbiAgICovXG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtFeHRlbnNpb25VcGRhdGVSZXN1bHR9XG4gICAqL1xuICBhc3luYyB1cGRhdGUgKHtleHQsIHVuc2FmZX0pIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVBbGwgPSBleHQgPT09IFVQREFURV9BTEw7XG4gICAgLy8gaWYgd2UncmUgc3BlY2lmaWNhbGx5IHJlcXVlc3RpbmcgYW4gdXBkYXRlIGZvciBhbiBleHRlbnNpb24sIG1ha2Ugc3VyZSBpdCdzIGluc3RhbGxlZFxuICAgIGlmICghc2hvdWxkVXBkYXRlQWxsICYmICF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZXh0fScgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgKTtcbiAgICB9XG4gICAgY29uc3QgZXh0c1RvVXBkYXRlID0gc2hvdWxkVXBkYXRlQWxsID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykgOiBbZXh0XTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICBjb25zdCBlcnJvcnMgPSB7fTtcblxuICAgIC8vICd1cGRhdGVzJyB3aWxsIGhhdmUgZXh0IG5hbWVzIGFzIGtleXMgYW5kIHVwZGF0ZSBvYmplY3RzIGFzIHZhbHVlcywgd2hlcmUgYW4gdXBkYXRlXG4gICAgLy8gb2JqZWN0IGlzIG9mIHRoZSBmb3JtIHtmcm9tOiB2ZXJzaW9uU3RyaW5nLCB0bzogdmVyc2lvblN0cmluZ31cbiAgICBjb25zdCB1cGRhdGVzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGUgb2YgZXh0c1RvVXBkYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgYENoZWNraW5nIGlmICR7dGhpcy50eXBlfSAnJHtlfScgaXMgdXBkYXRhYmxlYCwgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2VdLmluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90VXBkYXRhYmxlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgYENoZWNraW5nIGlmICR7dGhpcy50eXBlfSAnJHtlfScgbmVlZHMgYW4gdXBkYXRlYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoZSk7XG4gICAgICAgICAgaWYgKCEodXBkYXRlLnNhZmVVcGRhdGUgfHwgdXBkYXRlLnVuc2FmZVVwZGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdXBkYXRlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF1bnNhZmUgJiYgIXVwZGF0ZS5zYWZlVXBkYXRlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9ICcke2V9JyBoYXMgYSBtYWpvciByZXZpc2lvbiB1cGRhdGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAoJHt1cGRhdGUuY3VycmVudH0gPT4gJHt1cGRhdGUudW5zYWZlVXBkYXRlfSksIHdoaWNoIGNvdWxkIGluY2x1ZGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBicmVha2luZyBjaGFuZ2VzLiBJZiB5b3Ugd2FudCB0byBhcHBseSB0aGlzIHVwZGF0ZSwgcmUtcnVuIHdpdGggLS11bnNhZmVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVWZXIgPSB1bnNhZmUgJiYgdXBkYXRlLnVuc2FmZVVwZGF0ZSA/IHVwZGF0ZS51bnNhZmVVcGRhdGUgOiB1cGRhdGUuc2FmZVVwZGF0ZTtcbiAgICAgICAgYXdhaXQgc3BpbldpdGgoXG4gICAgICAgICAgdGhpcy5pc0pzb25PdXRwdXQsXG4gICAgICAgICAgYFVwZGF0aW5nIGRyaXZlciAnJHtlfScgZnJvbSAke3VwZGF0ZS5jdXJyZW50fSB0byAke3VwZGF0ZVZlcn1gLFxuICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMudXBkYXRlRXh0ZW5zaW9uKGUsIHVwZGF0ZVZlcilcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlc1tlXSA9IHtmcm9tOiB1cGRhdGUuY3VycmVudCwgdG86IHVwZGF0ZVZlcn07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZXJyb3JzW2VdID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgJ1VwZGF0ZSByZXBvcnQ6Jyk7XG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2UsIGVycl0gb2YgXy50b1BhaXJzKGVycm9ycykpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RVcGRhdGFibGVFcnJvcikge1xuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyB3YXMgbm90IGluc3RhbGxlZCB2aWEgbnBtLCBzbyB3ZSBjb3VsZCBub3QgY2hlY2sgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB1cGRhdGVzYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyBoYWQgbm8gdXBkYXRlcyBhdmFpbGFibGVgLnllbGxvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UsIG1ha2UgaXQgcG9wIHdpdGggcmVkIVxuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyBmYWlsZWQgdG8gdXBkYXRlOiAke2Vycn1gLnJlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICAgKi9cblxuICAvKipcbiAgICogR2l2ZW4gYW4gZXh0ZW5zaW9uIG5hbWUsIGZpZ3VyZSBvdXQgd2hhdCBpdHMgaGlnaGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHVwZ3JhZGUgaXMsIGFuZCBhbHNvIHRoZVxuICAgKiBoaWdoZXN0IHBvc3NpYmxlIHNhZmUgdXBncmFkZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEByZXR1cm4ge1Bvc3NpYmxlVXBkYXRlc31cbiAgICovXG4gIGFzeW5jIGNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIChleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgdGhpcy5ucG0uZ2V0TGF0ZXN0VmVyc2lvbihwa2dOYW1lKTtcbiAgICBsZXQgc2FmZVVwZGF0ZSA9IGF3YWl0IHRoaXMubnBtLmdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbihwa2dOYW1lLCB2ZXJzaW9uKTtcbiAgICBpZiAoIXV0aWwuY29tcGFyZVZlcnNpb25zKHVuc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gdGhlcmUncyBubyBwb3NzaWJsZSB1cGRhdGVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAmJiB1bnNhZmVVcGRhdGUgPT09IHNhZmVVcGRhdGUpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBzYWZlIHVwZGF0ZSwgd2hpY2ggbWVhbnMgaXQncyBub3QgYWN0dWFsbHkgdW5zYWZlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoc2FmZVVwZGF0ZSAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnMoc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gZXZlbiB0aGUgc2FmZSB1cGRhdGUgaXMgbm90IGxhdGVyIHRoYW4gdGhlIGN1cnJlbnQsIHNvIGl0IGlzIG5vdCBhY3R1YWxseSBhbiB1cGRhdGVcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge2N1cnJlbnQ6IHZlcnNpb24sIHNhZmVVcGRhdGUsIHVuc2FmZVVwZGF0ZX07XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsbHkgdXBkYXRlIGFuIGV4dGVuc2lvbiBpbnN0YWxsZWQgYnkgTlBNLCB1c2luZyB0aGUgTlBNIGNsaS4gQW5kIHVwZGF0ZSB0aGUgaW5zdGFsbGF0aW9uXG4gICAqIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb24gdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBzdHJpbmcgaWRlbnRpZmllciB0byB1cGRhdGUgZXh0ZW5zaW9uIHRvXG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dCwgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgY29uc3QgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXI6IHZlcnNpb259KTtcbiAgICBkZWxldGUgZXh0RGF0YVtgJHt0aGlzLnR5cGV9TmFtZWBdO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihleHQsIGV4dERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzY3JpcHQgY2FjaGVkIGluc2lkZSB0aGUgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXIgXCJhcHBpdW1cIlxuICAgKiBpbnNpZGUgb2YgdGhlIGRyaXZlci9wbHVnaW5zIFwicGFja2FnZS5qc29uXCIgZmlsZS4gV2lsbCB0aHJvd1xuICAgKiBhbiBlcnJvciBpZiB0aGUgZHJpdmVyL3BsdWdpbiBkb2VzIG5vdCBjb250YWluIGEgXCJzY3JpcHRzXCIgZmllbGRcbiAgICogdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uLCBpZiB0aGVcbiAgICogXCJzY3JpcHRzXCIgZmllbGQgaXMgbm90IGEgcGxhaW4gb2JqZWN0LCBvciBpZiB0aGUgc2NyaXB0TmFtZSBpc1xuICAgKiBub3QgZm91bmQgd2l0aGluIFwic2NyaXB0c1wiIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0TmFtZSAtIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW5cbiAgICogQHJldHVybiB7UnVuT3V0cHV0fVxuICAgKi9cbiAgYXN5bmMgcnVuICh7ZXh0LCBzY3JpcHROYW1lfSkge1xuICAgIGlmICghXy5oYXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucywgZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwbGVhc2UgaW5zdGFsbCB0aGUgJHt0aGlzLnR5cGV9IGZpcnN0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0Q29uZmlnID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuXG4gICAgaWYgKCFfLmhhcyhleHRDb25maWcsICdzY3JpcHRzJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBjb250YWluIHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0U2NyaXB0cyA9IGV4dENvbmZpZy5zY3JpcHRzO1xuXG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZXh0U2NyaXB0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBcInNjcmlwdHNcIiBmaWVsZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyhleHRTY3JpcHRzLCBzY3JpcHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dH0nIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNjcmlwdDogJyR7c2NyaXB0TmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVubmVyID0gbmV3IFN1YlByb2Nlc3MocHJvY2Vzcy5leGVjUGF0aCwgW2V4dFNjcmlwdHNbc2NyaXB0TmFtZV1dLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEV4dGVuc2lvblJlcXVpcmVQYXRoKGV4dClcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gcnVubmluZyAnJHtzY3JpcHROYW1lfSc6ICR7ZXJyLm1lc3NhZ2V9YC5yZWQpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZXJyLm1lc3NhZ2UsIG91dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ3x1bmRlZmluZWR9IGVycm9yIC0gZXJyb3IgbWVzc2FnZSBpZiBzY3JpcHQgcmFuIHVuc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gKi9cbiJdLCJmaWxlIjoibGliL2NsaS9leHRlbnNpb24tY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -21,7 +21,9 @@ var _extensionConfig = require("../extension-config");
21
21
 
22
22
  var _utils = require("./utils");
23
23
 
24
- async function runExtensionCommand(args, type) {
24
+ var _args = require("./args");
25
+
26
+ async function runExtensionCommand(args, type, configObject) {
25
27
  let jsonResult = null;
26
28
  const extCmd = args[`${type}Command`];
27
29
 
@@ -31,8 +33,7 @@ async function runExtensionCommand(args, type) {
31
33
 
32
34
  let {
33
35
  json,
34
- suppressOutput,
35
- appiumHome
36
+ suppressOutput
36
37
  } = args;
37
38
 
38
39
  if (suppressOutput) {
@@ -41,9 +42,16 @@ async function runExtensionCommand(args, type) {
41
42
 
42
43
  const logFn = msg => (0, _utils.log)(json, msg);
43
44
 
44
- const ConfigClass = type === _extensionConfig.DRIVER_TYPE ? _driverConfig.default : _pluginConfig.default;
45
+ let config;
46
+
47
+ if (configObject) {
48
+ config = configObject;
49
+ config.log = logFn;
50
+ } else {
51
+ config = (type === _extensionConfig.DRIVER_TYPE ? _driverConfig.default : _pluginConfig.default).getInstance(_args.APPIUM_HOME, logFn);
52
+ }
53
+
45
54
  const CommandClass = type === _extensionConfig.DRIVER_TYPE ? _driverCommand.default : _pluginCommand.default;
46
- const config = new ConfigClass(appiumHome, logFn);
47
55
  const cmd = new CommandClass({
48
56
  config,
49
57
  json
@@ -68,4 +76,4 @@ async function runExtensionCommand(args, type) {
68
76
  }require('source-map-support').install();
69
77
 
70
78
 
71
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sIm5hbWVzIjpbInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwidHlwZSIsImpzb25SZXN1bHQiLCJleHRDbWQiLCJUeXBlRXJyb3IiLCJqc29uIiwic3VwcHJlc3NPdXRwdXQiLCJhcHBpdW1Ib21lIiwibG9nRm4iLCJtc2ciLCJDb25maWdDbGFzcyIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29uZmlnIiwiUGx1Z2luQ29uZmlnIiwiQ29tbWFuZENsYXNzIiwiRHJpdmVyQ29tbWFuZCIsIlBsdWdpbkNvbW1hbmQiLCJjb25maWciLCJjbWQiLCJyZWFkIiwiZXhlY3V0ZSIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiSlNPTl9TUEFDRVMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBU0EsZUFBZUEsbUJBQWYsQ0FBb0NDLElBQXBDLEVBQTBDQyxJQUExQyxFQUFnRDtBQUc5QyxNQUFJQyxVQUFVLEdBQUcsSUFBakI7QUFDQSxRQUFNQyxNQUFNLEdBQUdILElBQUksQ0FBRSxHQUFFQyxJQUFLLFNBQVQsQ0FBbkI7O0FBQ0EsTUFBSSxDQUFDRSxNQUFMLEVBQWE7QUFDWCxVQUFNLElBQUlDLFNBQUosQ0FBZSxlQUFjSCxJQUFLLDhDQUFsQyxDQUFOO0FBQ0Q7O0FBQ0QsTUFBSTtBQUFDSSxJQUFBQSxJQUFEO0FBQU9DLElBQUFBLGNBQVA7QUFBdUJDLElBQUFBO0FBQXZCLE1BQXFDUCxJQUF6Qzs7QUFDQSxNQUFJTSxjQUFKLEVBQW9CO0FBQ2xCRCxJQUFBQSxJQUFJLEdBQUcsSUFBUDtBQUNEOztBQUNELFFBQU1HLEtBQUssR0FBSUMsR0FBRCxJQUFTLGdCQUFJSixJQUFKLEVBQVVJLEdBQVYsQ0FBdkI7O0FBQ0EsUUFBTUMsV0FBVyxHQUFHVCxJQUFJLEtBQUtVLDRCQUFULEdBQXVCQyxxQkFBdkIsR0FBc0NDLHFCQUExRDtBQUNBLFFBQU1DLFlBQVksR0FBR2IsSUFBSSxLQUFLVSw0QkFBVCxHQUF1Qkksc0JBQXZCLEdBQXVDQyxzQkFBNUQ7QUFDQSxRQUFNQyxNQUFNLEdBQUcsSUFBSVAsV0FBSixDQUFnQkgsVUFBaEIsRUFBNEJDLEtBQTVCLENBQWY7QUFDQSxRQUFNVSxHQUFHLEdBQUcsSUFBSUosWUFBSixDQUFpQjtBQUFDRyxJQUFBQSxNQUFEO0FBQVNaLElBQUFBO0FBQVQsR0FBakIsQ0FBWjs7QUFDQSxNQUFJO0FBQ0YsVUFBTVksTUFBTSxDQUFDRSxJQUFQLEVBQU47QUFDQWpCLElBQUFBLFVBQVUsR0FBRyxNQUFNZ0IsR0FBRyxDQUFDRSxPQUFKLENBQVlwQixJQUFaLENBQW5CO0FBQ0QsR0FIRCxDQUdFLE9BQU9xQixHQUFQLEVBQVk7QUFHWixRQUFJZixjQUFKLEVBQW9CO0FBQ2xCLFlBQU1lLEdBQU47QUFDRDs7QUFDRCwyQkFBV2hCLElBQVgsRUFBaUJnQixHQUFqQjtBQUNEOztBQUVELE1BQUloQixJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtBQUMzQmdCLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxJQUFJLENBQUNDLFNBQUwsQ0FBZXZCLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUN3QixrQkFBakMsQ0FBWjtBQUNEOztBQUVELFNBQU94QixVQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQgRHJpdmVyQ29uZmlnIGZyb20gJy4uL2RyaXZlci1jb25maWcnO1xuaW1wb3J0IFBsdWdpbkNvbmZpZyBmcm9tICcuLi9wbHVnaW4tY29uZmlnJztcbmltcG9ydCB7IERSSVZFUl9UWVBFIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBlcnJBbmRRdWl0LCBsb2csIEpTT05fU1BBQ0VTIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkV4dGVuc2lvbkNvbW1hbmQgKGFyZ3MsIHR5cGUpIHtcbiAgLy8gVE9ETyBkcml2ZXIgY29uZmlnIGZpbGUgc2hvdWxkIGJlIGxvY2tlZCB3aGlsZSBhbnkgb2YgdGhlc2UgY29tbWFuZHMgYXJlXG4gIC8vIHJ1bm5pbmcgdG8gcHJldmVudCB3ZWlyZCBzaXR1YXRpb25zXG4gIGxldCBqc29uUmVzdWx0ID0gbnVsbDtcbiAgY29uc3QgZXh0Q21kID0gYXJnc1tgJHt0eXBlfUNvbW1hbmRgXTtcbiAgaWYgKCFleHRDbWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgY2FsbCAke3R5cGV9IGNvbW1hbmQgd2l0aG91dCBhIHN1YmNvbW1hbmQgbGlrZSAnaW5zdGFsbCdgKTtcbiAgfVxuICBsZXQge2pzb24sIHN1cHByZXNzT3V0cHV0LCBhcHBpdW1Ib21lfSA9IGFyZ3M7XG4gIGlmIChzdXBwcmVzc091dHB1dCkge1xuICAgIGpzb24gPSB0cnVlO1xuICB9XG4gIGNvbnN0IGxvZ0ZuID0gKG1zZykgPT4gbG9nKGpzb24sIG1zZyk7XG4gIGNvbnN0IENvbmZpZ0NsYXNzID0gdHlwZSA9PT0gRFJJVkVSX1RZUEUgPyBEcml2ZXJDb25maWcgOiBQbHVnaW5Db25maWc7XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IHR5cGUgPT09IERSSVZFUl9UWVBFID8gRHJpdmVyQ29tbWFuZCA6IFBsdWdpbkNvbW1hbmQ7XG4gIGNvbnN0IGNvbmZpZyA9IG5ldyBDb25maWdDbGFzcyhhcHBpdW1Ib21lLCBsb2dGbik7XG4gIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kQ2xhc3Moe2NvbmZpZywganNvbn0pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbmZpZy5yZWFkKCk7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge1xuICBydW5FeHRlbnNpb25Db21tYW5kLFxufTtcbiJdLCJmaWxlIjoibGliL2NsaS9leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
79
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sIm5hbWVzIjpbInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwidHlwZSIsImNvbmZpZ09iamVjdCIsImpzb25SZXN1bHQiLCJleHRDbWQiLCJUeXBlRXJyb3IiLCJqc29uIiwic3VwcHJlc3NPdXRwdXQiLCJsb2dGbiIsIm1zZyIsImNvbmZpZyIsImxvZyIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29uZmlnIiwiUGx1Z2luQ29uZmlnIiwiZ2V0SW5zdGFuY2UiLCJBUFBJVU1fSE9NRSIsIkNvbW1hbmRDbGFzcyIsIkRyaXZlckNvbW1hbmQiLCJQbHVnaW5Db21tYW5kIiwiY21kIiwicmVhZCIsImV4ZWN1dGUiLCJlcnIiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsIkpTT05fU1BBQ0VTIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVdBLGVBQWVBLG1CQUFmLENBQW9DQyxJQUFwQyxFQUEwQ0MsSUFBMUMsRUFBZ0RDLFlBQWhELEVBQThEO0FBRzVELE1BQUlDLFVBQVUsR0FBRyxJQUFqQjtBQUNBLFFBQU1DLE1BQU0sR0FBR0osSUFBSSxDQUFFLEdBQUVDLElBQUssU0FBVCxDQUFuQjs7QUFDQSxNQUFJLENBQUNHLE1BQUwsRUFBYTtBQUNYLFVBQU0sSUFBSUMsU0FBSixDQUFlLGVBQWNKLElBQUssOENBQWxDLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQUNLLElBQUFBLElBQUQ7QUFBT0MsSUFBQUE7QUFBUCxNQUF5QlAsSUFBN0I7O0FBQ0EsTUFBSU8sY0FBSixFQUFvQjtBQUNsQkQsSUFBQUEsSUFBSSxHQUFHLElBQVA7QUFDRDs7QUFDRCxRQUFNRSxLQUFLLEdBQUlDLEdBQUQsSUFBUyxnQkFBSUgsSUFBSixFQUFVRyxHQUFWLENBQXZCOztBQUNBLE1BQUlDLE1BQUo7O0FBQ0EsTUFBSVIsWUFBSixFQUFrQjtBQUNoQlEsSUFBQUEsTUFBTSxHQUFHUixZQUFUO0FBQ0FRLElBQUFBLE1BQU0sQ0FBQ0MsR0FBUCxHQUFhSCxLQUFiO0FBQ0QsR0FIRCxNQUdPO0FBQ0xFLElBQUFBLE1BQU0sR0FBRyxDQUFDVCxJQUFJLEtBQUtXLDRCQUFULEdBQXVCQyxxQkFBdkIsR0FBc0NDLHFCQUF2QyxFQUFxREMsV0FBckQsQ0FBaUVDLGlCQUFqRSxFQUE4RVIsS0FBOUUsQ0FBVDtBQUNEOztBQUNELFFBQU1TLFlBQVksR0FBR2hCLElBQUksS0FBS1csNEJBQVQsR0FBdUJNLHNCQUF2QixHQUF1Q0Msc0JBQTVEO0FBQ0EsUUFBTUMsR0FBRyxHQUFHLElBQUlILFlBQUosQ0FBaUI7QUFBQ1AsSUFBQUEsTUFBRDtBQUFTSixJQUFBQTtBQUFULEdBQWpCLENBQVo7O0FBQ0EsTUFBSTtBQUNGLFVBQU1JLE1BQU0sQ0FBQ1csSUFBUCxFQUFOO0FBQ0FsQixJQUFBQSxVQUFVLEdBQUcsTUFBTWlCLEdBQUcsQ0FBQ0UsT0FBSixDQUFZdEIsSUFBWixDQUFuQjtBQUNELEdBSEQsQ0FHRSxPQUFPdUIsR0FBUCxFQUFZO0FBR1osUUFBSWhCLGNBQUosRUFBb0I7QUFDbEIsWUFBTWdCLEdBQU47QUFDRDs7QUFDRCwyQkFBV2pCLElBQVgsRUFBaUJpQixHQUFqQjtBQUNEOztBQUVELE1BQUlqQixJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtBQUMzQmlCLElBQUFBLE9BQU8sQ0FBQ2IsR0FBUixDQUFZYyxJQUFJLENBQUNDLFNBQUwsQ0FBZXZCLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUN3QixrQkFBakMsQ0FBWjtBQUNEOztBQUVELFNBQU94QixVQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQgRHJpdmVyQ29uZmlnIGZyb20gJy4uL2RyaXZlci1jb25maWcnO1xuaW1wb3J0IFBsdWdpbkNvbmZpZyBmcm9tICcuLi9wbHVnaW4tY29uZmlnJztcbmltcG9ydCB7IERSSVZFUl9UWVBFIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBlcnJBbmRRdWl0LCBsb2csIEpTT05fU1BBQ0VTIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBBUFBJVU1fSE9NRSB9IGZyb20gJy4vYXJncyc7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IHR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICogQG9hcmFtIHtFeHRlbnNpb25Db25maWd9IFtjb25maWdPYmplY3RdIC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3QsIGlmIHdlIGhhdmUgb25lXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkV4dGVuc2lvbkNvbW1hbmQgKGFyZ3MsIHR5cGUsIGNvbmZpZ09iamVjdCkge1xuICAvLyBUT0RPIGRyaXZlciBjb25maWcgZmlsZSBzaG91bGQgYmUgbG9ja2VkIHdoaWxlIGFueSBvZiB0aGVzZSBjb21tYW5kcyBhcmVcbiAgLy8gcnVubmluZyB0byBwcmV2ZW50IHdlaXJkIHNpdHVhdGlvbnNcbiAgbGV0IGpzb25SZXN1bHQgPSBudWxsO1xuICBjb25zdCBleHRDbWQgPSBhcmdzW2Ake3R5cGV9Q29tbWFuZGBdO1xuICBpZiAoIWV4dENtZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsICR7dHlwZX0gY29tbWFuZCB3aXRob3V0IGEgc3ViY29tbWFuZCBsaWtlICdpbnN0YWxsJ2ApO1xuICB9XG4gIGxldCB7anNvbiwgc3VwcHJlc3NPdXRwdXR9ID0gYXJncztcbiAgaWYgKHN1cHByZXNzT3V0cHV0KSB7XG4gICAganNvbiA9IHRydWU7XG4gIH1cbiAgY29uc3QgbG9nRm4gPSAobXNnKSA9PiBsb2coanNvbiwgbXNnKTtcbiAgbGV0IGNvbmZpZztcbiAgaWYgKGNvbmZpZ09iamVjdCkge1xuICAgIGNvbmZpZyA9IGNvbmZpZ09iamVjdDtcbiAgICBjb25maWcubG9nID0gbG9nRm47XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gKHR5cGUgPT09IERSSVZFUl9UWVBFID8gRHJpdmVyQ29uZmlnIDogUGx1Z2luQ29uZmlnKS5nZXRJbnN0YW5jZShBUFBJVU1fSE9NRSwgbG9nRm4pO1xuICB9XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IHR5cGUgPT09IERSSVZFUl9UWVBFID8gRHJpdmVyQ29tbWFuZCA6IFBsdWdpbkNvbW1hbmQ7XG4gIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kQ2xhc3Moe2NvbmZpZywganNvbn0pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbmZpZy5yZWFkKCk7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge1xuICBydW5FeHRlbnNpb25Db21tYW5kLFxufTtcbiJdLCJmaWxlIjoibGliL2NsaS9leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==