appium 2.0.0-beta.25 → 2.0.0-beta.28

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 (191) hide show
  1. package/build/lib/appium.d.ts +215 -0
  2. package/build/lib/appium.d.ts.map +1 -0
  3. package/build/lib/appium.js +94 -101
  4. package/build/lib/cli/args.d.ts +20 -0
  5. package/build/lib/cli/args.d.ts.map +1 -0
  6. package/build/lib/cli/args.js +19 -39
  7. package/build/lib/cli/driver-command.d.ts +36 -0
  8. package/build/lib/cli/driver-command.d.ts.map +1 -0
  9. package/build/lib/cli/driver-command.js +10 -13
  10. package/build/lib/cli/extension-command.d.ts +345 -0
  11. package/build/lib/cli/extension-command.d.ts.map +1 -0
  12. package/build/lib/cli/extension-command.js +117 -94
  13. package/build/lib/cli/extension.d.ts +14 -0
  14. package/build/lib/cli/extension.d.ts.map +1 -0
  15. package/build/lib/cli/extension.js +14 -22
  16. package/build/lib/cli/parser.d.ts +79 -0
  17. package/build/lib/cli/parser.d.ts.map +1 -0
  18. package/build/lib/cli/parser.js +9 -19
  19. package/build/lib/cli/plugin-command.d.ts +39 -0
  20. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  21. package/build/lib/cli/plugin-command.js +9 -14
  22. package/build/lib/cli/utils.d.ts +29 -0
  23. package/build/lib/cli/utils.d.ts.map +1 -0
  24. package/build/lib/cli/utils.js +2 -4
  25. package/build/lib/config-file.d.ts +100 -0
  26. package/build/lib/config-file.d.ts.map +1 -0
  27. package/build/lib/config-file.js +2 -4
  28. package/build/lib/config.d.ts +40 -0
  29. package/build/lib/config.d.ts.map +1 -0
  30. package/build/lib/config.js +8 -7
  31. package/build/lib/constants.d.ts +48 -0
  32. package/build/lib/constants.d.ts.map +1 -0
  33. package/build/lib/constants.js +60 -0
  34. package/build/lib/extension/driver-config.d.ts +84 -0
  35. package/build/lib/extension/driver-config.d.ts.map +1 -0
  36. package/build/lib/extension/driver-config.js +190 -0
  37. package/build/lib/extension/extension-config.d.ts +170 -0
  38. package/build/lib/extension/extension-config.d.ts.map +1 -0
  39. package/build/lib/extension/extension-config.js +297 -0
  40. package/build/lib/extension/index.d.ts +39 -0
  41. package/build/lib/extension/index.d.ts.map +1 -0
  42. package/build/lib/extension/index.js +77 -0
  43. package/build/lib/extension/manifest.d.ts +174 -0
  44. package/build/lib/extension/manifest.d.ts.map +1 -0
  45. package/build/lib/extension/manifest.js +246 -0
  46. package/build/lib/extension/package-changed.d.ts +11 -0
  47. package/build/lib/extension/package-changed.d.ts.map +1 -0
  48. package/build/lib/extension/package-changed.js +68 -0
  49. package/build/lib/extension/plugin-config.d.ts +62 -0
  50. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  51. package/build/lib/extension/plugin-config.js +87 -0
  52. package/build/lib/grid-register.d.ts +10 -0
  53. package/build/lib/grid-register.d.ts.map +1 -0
  54. package/build/lib/grid-register.js +2 -4
  55. package/build/lib/logger.d.ts +3 -0
  56. package/build/lib/logger.d.ts.map +1 -0
  57. package/build/lib/logger.js +2 -4
  58. package/build/lib/logsink.d.ts +4 -0
  59. package/build/lib/logsink.d.ts.map +1 -0
  60. package/build/lib/logsink.js +2 -4
  61. package/build/lib/main.d.ts +51 -0
  62. package/build/lib/main.d.ts.map +1 -0
  63. package/build/lib/main.js +40 -68
  64. package/build/lib/schema/arg-spec.d.ts +143 -0
  65. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  66. package/build/lib/schema/arg-spec.js +11 -14
  67. package/build/lib/schema/cli-args.d.ts +19 -0
  68. package/build/lib/schema/cli-args.d.ts.map +1 -0
  69. package/build/lib/schema/cli-args.js +2 -4
  70. package/build/lib/schema/cli-transformers.d.ts +5 -0
  71. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  72. package/build/lib/schema/cli-transformers.js +2 -4
  73. package/build/lib/schema/index.d.ts +3 -0
  74. package/build/lib/schema/index.d.ts.map +1 -0
  75. package/build/lib/schema/index.js +2 -4
  76. package/build/lib/schema/keywords.d.ts +24 -0
  77. package/build/lib/schema/keywords.d.ts.map +1 -0
  78. package/build/lib/schema/keywords.js +2 -4
  79. package/build/lib/schema/schema.d.ts +259 -0
  80. package/build/lib/schema/schema.d.ts.map +1 -0
  81. package/build/lib/schema/schema.js +57 -39
  82. package/build/lib/utils.d.ts +66 -0
  83. package/build/lib/utils.d.ts.map +1 -0
  84. package/build/lib/utils.js +6 -35
  85. package/build/tsconfig.tsbuildinfo +1 -0
  86. package/lib/appium.js +188 -117
  87. package/lib/cli/args.js +19 -24
  88. package/lib/cli/driver-command.js +19 -8
  89. package/lib/cli/extension-command.js +314 -184
  90. package/lib/cli/extension.js +18 -16
  91. package/lib/cli/parser.js +7 -16
  92. package/lib/cli/plugin-command.js +16 -7
  93. package/lib/cli/utils.js +1 -1
  94. package/lib/config-file.js +6 -7
  95. package/lib/config.js +17 -12
  96. package/lib/constants.js +78 -0
  97. package/lib/extension/driver-config.js +249 -0
  98. package/lib/extension/extension-config.js +458 -0
  99. package/lib/extension/index.js +102 -0
  100. package/lib/extension/manifest.js +486 -0
  101. package/lib/extension/package-changed.js +63 -0
  102. package/lib/extension/plugin-config.js +113 -0
  103. package/lib/grid-register.js +4 -4
  104. package/lib/logsink.js +4 -0
  105. package/lib/main.js +54 -92
  106. package/lib/schema/arg-spec.js +11 -7
  107. package/lib/schema/cli-args.js +1 -1
  108. package/lib/schema/cli-transformers.js +0 -1
  109. package/lib/schema/keywords.js +1 -2
  110. package/lib/schema/schema.js +62 -31
  111. package/lib/utils.js +48 -45
  112. package/package.json +30 -24
  113. package/{postinstall.js → scripts/postinstall.js} +1 -1
  114. package/types/appium-manifest.d.ts +61 -0
  115. package/types/cli.d.ts +134 -0
  116. package/types/extension.d.ts +56 -0
  117. package/types/external-manifest.d.ts +58 -0
  118. package/types/index.d.ts +7 -0
  119. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  120. package/build/check-npm-pack-files.js +0 -23
  121. package/build/commands-yml/parse.js +0 -319
  122. package/build/commands-yml/validator.js +0 -130
  123. package/build/index.js +0 -19
  124. package/build/lib/appium-config.schema.json +0 -0
  125. package/build/lib/cli/npm.js +0 -220
  126. package/build/lib/driver-config.js +0 -100
  127. package/build/lib/drivers.js +0 -100
  128. package/build/lib/ext-config-io.js +0 -165
  129. package/build/lib/extension-config.js +0 -320
  130. package/build/lib/plugin-config.js +0 -69
  131. package/build/lib/plugins.js +0 -18
  132. package/build/lib/schema/appium-config-schema.js +0 -253
  133. package/build/postinstall.js +0 -90
  134. package/build/test/cli/cli-e2e-specs.js +0 -221
  135. package/build/test/cli/cli-helpers.js +0 -86
  136. package/build/test/cli/cli-specs.js +0 -71
  137. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  138. package/build/test/cli/schema-args-specs.js +0 -48
  139. package/build/test/cli/schema-e2e-specs.js +0 -47
  140. package/build/test/config-e2e-specs.js +0 -112
  141. package/build/test/config-file-e2e-specs.js +0 -191
  142. package/build/test/config-file-specs.js +0 -281
  143. package/build/test/config-specs.js +0 -258
  144. package/build/test/driver-e2e-specs.js +0 -435
  145. package/build/test/driver-specs.js +0 -386
  146. package/build/test/ext-config-io-specs.js +0 -181
  147. package/build/test/extension-config-specs.js +0 -365
  148. package/build/test/fixtures/allow-feat.txt +0 -5
  149. package/build/test/fixtures/caps.json +0 -3
  150. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  151. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  152. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  153. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  154. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  155. package/build/test/fixtures/config/appium.config.good.js +0 -40
  156. package/build/test/fixtures/config/appium.config.good.json +0 -33
  157. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  158. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  159. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  160. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  161. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  162. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  163. package/build/test/fixtures/config/nodeconfig.json +0 -3
  164. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  165. package/build/test/fixtures/default-args.js +0 -35
  166. package/build/test/fixtures/deny-feat.txt +0 -5
  167. package/build/test/fixtures/driver.schema.js +0 -20
  168. package/build/test/fixtures/extensions.yaml +0 -27
  169. package/build/test/fixtures/flattened-schema.js +0 -532
  170. package/build/test/fixtures/plugin.schema.js +0 -20
  171. package/build/test/fixtures/schema-with-extensions.js +0 -28
  172. package/build/test/grid-register-specs.js +0 -74
  173. package/build/test/helpers.js +0 -75
  174. package/build/test/logger-specs.js +0 -76
  175. package/build/test/npm-specs.js +0 -20
  176. package/build/test/parser-specs.js +0 -319
  177. package/build/test/plugin-e2e-specs.js +0 -316
  178. package/build/test/schema/arg-spec-specs.js +0 -70
  179. package/build/test/schema/cli-args-specs.js +0 -408
  180. package/build/test/schema/schema-specs.js +0 -407
  181. package/build/test/utils-specs.js +0 -288
  182. package/lib/cli/npm.js +0 -251
  183. package/lib/driver-config.js +0 -101
  184. package/lib/drivers.js +0 -84
  185. package/lib/ext-config-io.js +0 -287
  186. package/lib/extension-config.js +0 -366
  187. package/lib/plugin-config.js +0 -63
  188. package/lib/plugins.js +0 -13
  189. package/lib/schema/appium-config-schema.js +0 -287
  190. package/types/appium-config.d.ts +0 -197
  191. package/types/types.d.ts +0 -206
@@ -7,18 +7,12 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.NoDriverProxyCommandError = exports.AppiumDriver = void 0;
9
9
 
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
10
  require("source-map-support/register");
13
11
 
14
12
  var _lodash = _interopRequireDefault(require("lodash"));
15
13
 
16
- var _logger = _interopRequireDefault(require("./logger"));
17
-
18
14
  var _config = require("./config");
19
15
 
20
- var _drivers = require("./drivers");
21
-
22
16
  var _baseDriver = require("@appium/base-driver");
23
17
 
24
18
  var _asyncLock = _interopRequireDefault(require("async-lock"));
@@ -29,7 +23,7 @@ var _support = require("@appium/support");
29
23
 
30
24
  var _schema = require("./schema");
31
25
 
32
- const desiredCapabilityConstraints = {
26
+ const desiredCapabilityConstraints = Object.freeze({
33
27
  automationName: {
34
28
  presence: true,
35
29
  isString: true
@@ -38,29 +32,41 @@ const desiredCapabilityConstraints = {
38
32
  presence: true,
39
33
  isString: true
40
34
  }
41
- };
35
+ });
42
36
  const sessionsListGuard = new _asyncLock.default();
43
37
  const pendingDriversGuard = new _asyncLock.default();
44
38
 
45
- class AppiumDriver extends _baseDriver.BaseDriver {
46
- constructor(args) {
47
- if (args.tmpDir) {
48
- process.env.APPIUM_TMP_DIR = args.tmpDir;
39
+ class AppiumDriver extends _baseDriver.DriverCore {
40
+ sessions = {};
41
+ pendingDrivers = {};
42
+ newCommandTimeoutMs = 0;
43
+ pluginClasses = [];
44
+ sessionPlugins = {};
45
+ sessionlessPlugins = [];
46
+ driverConfig;
47
+ server;
48
+
49
+ constructor(opts) {
50
+ if (opts.tmpDir) {
51
+ process.env.APPIUM_TMP_DIR = opts.tmpDir;
49
52
  }
50
53
 
51
- super(args);
52
- (0, _defineProperty2.default)(this, "driverConfig", void 0);
53
- (0, _defineProperty2.default)(this, "server", void 0);
54
+ super(opts);
54
55
  this.desiredCapConstraints = desiredCapabilityConstraints;
55
- this.newCommandTimeoutMs = 0;
56
- this.args = { ...args
56
+ this.args = { ...opts
57
57
  };
58
- this.sessions = {};
59
- this.pendingDrivers = {};
60
- this.pluginClasses = [];
61
- this.sessionPlugins = {};
62
- this.sessionlessPlugins = [];
63
- (0, _config.updateBuildInfo)();
58
+ (0, _config.updateBuildInfo)().catch(err => {
59
+ this.log.debug(err);
60
+ });
61
+ }
62
+
63
+ get log() {
64
+ if (!this._log) {
65
+ const instanceName = `${this.constructor.name}@${_support.node.getObjectId(this).substring(0, 4)}`;
66
+ this._log = _support.logger.getLogger(instanceName);
67
+ }
68
+
69
+ return this._log;
64
70
  }
65
71
 
66
72
  get isCommandsQueueEnabled() {
@@ -91,17 +97,10 @@ class AppiumDriver extends _baseDriver.BaseDriver {
91
97
  }
92
98
 
93
99
  printNewSessionAnnouncement(driverName, driverVersion, driverBaseVersion) {
94
- _logger.default.info(driverVersion ? `Appium v${_config.APPIUM_VER} creating new ${driverName} (v${driverVersion}) session` : `Appium v${_config.APPIUM_VER} creating new ${driverName} session`);
95
-
96
- _logger.default.info(`Checking BaseDriver versions for Appium and ${driverName}`);
97
-
98
- _logger.default.info(AppiumDriver.baseVersion ? `Appium's BaseDriver version is ${AppiumDriver.baseVersion}` : `Could not determine Appium's BaseDriver version`);
99
-
100
- _logger.default.info(driverBaseVersion ? `${driverName}'s BaseDriver version is ${driverBaseVersion}` : `Could not determine ${driverName}'s BaseDriver version`);
101
- }
102
-
103
- _findMatchingDriver(...args) {
104
- return (0, _drivers.findMatchingDriver)(...args);
100
+ this.log.info(driverVersion ? `Appium v${_config.APPIUM_VER} creating new ${driverName} (v${driverVersion}) session` : `Appium v${_config.APPIUM_VER} creating new ${driverName} session`);
101
+ this.log.info(`Checking BaseDriver versions for Appium and ${driverName}`);
102
+ this.log.info(AppiumDriver.baseVersion ? `Appium's BaseDriver version is ${AppiumDriver.baseVersion}` : `Could not determine Appium's BaseDriver version`);
103
+ this.log.info(driverBaseVersion ? `${driverName}'s BaseDriver version is ${driverBaseVersion}` : `Could not determine ${driverName}'s BaseDriver version`);
105
104
  }
106
105
 
107
106
  assignCliArgsToExtension(extType, extName, extInstance) {
@@ -119,17 +118,24 @@ class AppiumDriver extends _baseDriver.BaseDriver {
119
118
  }
120
119
  }
121
120
 
122
- async createSession(jsonwpCaps, reqCaps, w3cCapabilities) {
121
+ async createSession(jsonwpCaps, reqCaps, w3cCapabilities, driverData) {
122
+ var _alwaysMatch, _w3cCapabilities;
123
+
123
124
  const defaultCapabilities = _lodash.default.cloneDeep(this.args.defaultCapabilities);
124
125
 
125
126
  const defaultSettings = (0, _utils.pullSettings)(defaultCapabilities);
126
127
  jsonwpCaps = _lodash.default.cloneDeep(jsonwpCaps);
127
- const jwpSettings = Object.assign({}, defaultSettings, (0, _utils.pullSettings)(jsonwpCaps));
128
+ const jwpSettings = { ...defaultSettings,
129
+ ...(0, _utils.pullSettings)(jsonwpCaps)
130
+ };
128
131
  w3cCapabilities = _lodash.default.cloneDeep(w3cCapabilities);
129
- const w3cSettings = Object.assign({}, jwpSettings);
130
- Object.assign(w3cSettings, (0, _utils.pullSettings)((w3cCapabilities || {}).alwaysMatch || {}));
132
+ const w3cSettings = { ...jwpSettings,
133
+ ...(0, _utils.pullSettings)((_alwaysMatch = ((_w3cCapabilities = w3cCapabilities) !== null && _w3cCapabilities !== void 0 ? _w3cCapabilities : {}).alwaysMatch) !== null && _alwaysMatch !== void 0 ? _alwaysMatch : {})
134
+ };
135
+
136
+ for (const firstMatchEntry of (_firstMatch = ((_w3cCapabilities2 = w3cCapabilities) !== null && _w3cCapabilities2 !== void 0 ? _w3cCapabilities2 : {}).firstMatch) !== null && _firstMatch !== void 0 ? _firstMatch : []) {
137
+ var _firstMatch, _w3cCapabilities2;
131
138
 
132
- for (const firstMatchEntry of (w3cCapabilities || {}).firstMatch || []) {
133
139
  Object.assign(w3cSettings, (0, _utils.pullSettings)(firstMatchEntry));
134
140
  }
135
141
 
@@ -141,10 +147,10 @@ class AppiumDriver extends _baseDriver.BaseDriver {
141
147
  const {
142
148
  desiredCaps,
143
149
  processedJsonwpCapabilities,
144
- processedW3CCapabilities,
145
- error
150
+ processedW3CCapabilities
146
151
  } = parsedCaps;
147
152
  protocol = parsedCaps.protocol;
153
+ const error = parsedCaps.error;
148
154
 
149
155
  if (error) {
150
156
  throw error;
@@ -154,52 +160,48 @@ class AppiumDriver extends _baseDriver.BaseDriver {
154
160
  driver: InnerDriver,
155
161
  version: driverVersion,
156
162
  driverName
157
- } = this._findMatchingDriver(this.driverConfig, desiredCaps);
158
-
163
+ } = this.driverConfig.findMatchingDriver(desiredCaps);
159
164
  this.printNewSessionAnnouncement(InnerDriver.name, driverVersion, InnerDriver.baseVersion);
160
165
 
161
166
  if (this.args.sessionOverride) {
162
167
  await this.deleteAllSessions();
163
168
  }
164
169
 
165
- let runningDriversData, otherPendingDriversData;
170
+ let runningDriversData = [];
171
+ let otherPendingDriversData = [];
166
172
  const driverInstance = new InnerDriver(this.args, true);
167
173
 
168
174
  if (this.args.relaxedSecurityEnabled) {
169
- _logger.default.info(`Applying relaxed security to '${InnerDriver.name}' as per ` + `server command line argument. All insecure features will be ` + `enabled unless explicitly disabled by --deny-insecure`);
170
-
175
+ this.log.info(`Applying relaxed security to '${InnerDriver.name}' as per ` + `server command line argument. All insecure features will be ` + `enabled unless explicitly disabled by --deny-insecure`);
171
176
  driverInstance.relaxedSecurityEnabled = true;
172
177
  }
173
178
 
174
179
  if (!_lodash.default.isEmpty(this.args.denyInsecure)) {
175
- _logger.default.info('Explicitly preventing use of insecure features:');
176
-
177
- this.args.denyInsecure.map(a => _logger.default.info(` ${a}`));
180
+ this.log.info('Explicitly preventing use of insecure features:');
181
+ this.args.denyInsecure.map(a => this.log.info(` ${a}`));
178
182
  driverInstance.denyInsecure = this.args.denyInsecure;
179
183
  }
180
184
 
181
185
  if (!_lodash.default.isEmpty(this.args.allowInsecure)) {
182
- _logger.default.info('Explicitly enabling use of insecure features:');
183
-
184
- this.args.allowInsecure.map(a => _logger.default.info(` ${a}`));
186
+ this.log.info('Explicitly enabling use of insecure features:');
187
+ this.args.allowInsecure.map(a => this.log.info(` ${a}`));
185
188
  driverInstance.allowInsecure = this.args.allowInsecure;
186
189
  }
187
190
 
188
191
  this.assignCliArgsToExtension('driver', driverName, driverInstance);
189
- driverInstance.server = this.server;
190
- driverInstance.serverHost = this.args.address;
191
- driverInstance.serverPort = this.args.port;
192
- driverInstance.serverPath = this.args.basePath;
192
+ driverInstance.assignServer(this.server, this.args.address, this.args.port, this.args.basePath);
193
193
 
194
194
  try {
195
- runningDriversData = await this.curSessionDataForDriver(InnerDriver);
195
+ var _await$this$curSessio;
196
+
197
+ runningDriversData = (_await$this$curSessio = await this.curSessionDataForDriver(InnerDriver)) !== null && _await$this$curSessio !== void 0 ? _await$this$curSessio : [];
196
198
  } catch (e) {
197
199
  throw new _baseDriver.errors.SessionNotCreatedError(e.message);
198
200
  }
199
201
 
200
202
  await pendingDriversGuard.acquire(AppiumDriver.name, () => {
201
203
  this.pendingDrivers[InnerDriver.name] = this.pendingDrivers[InnerDriver.name] || [];
202
- otherPendingDriversData = this.pendingDrivers[InnerDriver.name].map(drv => drv.driverData);
204
+ otherPendingDriversData = _lodash.default.compact(this.pendingDrivers[InnerDriver.name].map(drv => drv.driverData));
203
205
  this.pendingDrivers[InnerDriver.name].push(driverInstance);
204
206
  });
205
207
 
@@ -216,18 +218,14 @@ class AppiumDriver extends _baseDriver.BaseDriver {
216
218
  }
217
219
 
218
220
  this.attachUnexpectedShutdownHandler(driverInstance, innerSessionId);
219
-
220
- _logger.default.info(`New ${InnerDriver.name} session created successfully, session ` + `${innerSessionId} added to master session list`);
221
-
221
+ this.log.info(`New ${InnerDriver.name} session created successfully, session ` + `${innerSessionId} added to master session list`);
222
222
  driverInstance.startNewCommandTimeout();
223
223
 
224
224
  if (driverInstance.isW3CProtocol() && !_lodash.default.isEmpty(w3cSettings)) {
225
- _logger.default.info(`Applying the initial values to Appium settings parsed from W3C caps: ` + JSON.stringify(w3cSettings));
226
-
225
+ this.log.info(`Applying the initial values to Appium settings parsed from W3C caps: ` + JSON.stringify(w3cSettings));
227
226
  await driverInstance.updateSettings(w3cSettings);
228
227
  } else if (driverInstance.isMjsonwpProtocol() && !_lodash.default.isEmpty(jwpSettings)) {
229
- _logger.default.info(`Applying the initial values to Appium settings parsed from MJSONWP caps: ` + JSON.stringify(jwpSettings));
230
-
228
+ this.log.info(`Applying the initial values to Appium settings parsed from MJSONWP caps: ` + JSON.stringify(jwpSettings));
231
229
  await driverInstance.updateSettings(jwpSettings);
232
230
  }
233
231
  } catch (error) {
@@ -245,26 +243,25 @@ class AppiumDriver extends _baseDriver.BaseDriver {
245
243
 
246
244
  attachUnexpectedShutdownHandler(driver, innerSessionId) {
247
245
  const onShutdown = (cause = new Error('Unknown error')) => {
248
- _logger.default.warn(`Ending session, cause was '${cause.message}'`);
246
+ this.log.warn(`Ending session, cause was '${cause.message}'`);
249
247
 
250
248
  if (this.sessionPlugins[innerSessionId]) {
251
249
  for (const plugin of this.sessionPlugins[innerSessionId]) {
252
250
  if (_lodash.default.isFunction(plugin.onUnexpectedShutdown)) {
253
- _logger.default.debug(`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`);
251
+ this.log.debug(`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`);
254
252
 
255
253
  try {
256
254
  plugin.onUnexpectedShutdown(driver, cause);
257
255
  } catch (e) {
258
- _logger.default.warn(`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`);
256
+ this.log.warn(`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`);
259
257
  }
260
258
  } else {
261
- _logger.default.debug(`Plugin ${plugin.name} does not define an unexpected shutdown handler`);
259
+ this.log.debug(`Plugin ${plugin.name} does not define an unexpected shutdown handler`);
262
260
  }
263
261
  }
264
262
  }
265
263
 
266
- _logger.default.info(`Removing session '${innerSessionId}' from our master session list`);
267
-
264
+ this.log.info(`Removing session '${innerSessionId}' from our master session list`);
268
265
  delete this.sessions[innerSessionId];
269
266
  delete this.sessionPlugins[innerSessionId];
270
267
  };
@@ -272,14 +269,14 @@ class AppiumDriver extends _baseDriver.BaseDriver {
272
269
  if (_lodash.default.isFunction(driver.onUnexpectedShutdown)) {
273
270
  driver.onUnexpectedShutdown(onShutdown);
274
271
  } else {
275
- _logger.default.warn(`Failed to attach the unexpected shutdown listener. ` + `Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`);
272
+ this.log.warn(`Failed to attach the unexpected shutdown listener. ` + `Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`);
276
273
  }
277
274
  }
278
275
 
279
276
  async curSessionDataForDriver(InnerDriver) {
280
277
  const sessions = await sessionsListGuard.acquire(AppiumDriver.name, () => this.sessions);
281
278
 
282
- const data = _lodash.default.values(sessions).filter(s => s.constructor.name === InnerDriver.name).map(s => s.driverData);
279
+ const data = _lodash.default.compact(_lodash.default.values(sessions).filter(s => s.constructor.name === InnerDriver.name).map(s => s.driverData));
283
280
 
284
281
  for (let datum of data) {
285
282
  if (!datum) {
@@ -294,30 +291,32 @@ class AppiumDriver extends _baseDriver.BaseDriver {
294
291
  let protocol;
295
292
 
296
293
  try {
297
- let otherSessionsData = null;
298
- let dstSession = null;
299
- await sessionsListGuard.acquire(AppiumDriver.name, () => {
294
+ let otherSessionsData;
295
+ const dstSession = await sessionsListGuard.acquire(AppiumDriver.name, () => {
300
296
  if (!this.sessions[sessionId]) {
301
297
  return;
302
298
  }
303
299
 
304
300
  const curConstructorName = this.sessions[sessionId].constructor.name;
305
301
  otherSessionsData = _lodash.default.toPairs(this.sessions).filter(([key, value]) => value.constructor.name === curConstructorName && key !== sessionId).map(([, value]) => value.driverData);
306
- dstSession = this.sessions[sessionId];
302
+ const dstSession = this.sessions[sessionId];
307
303
  protocol = dstSession.protocol;
308
-
309
- _logger.default.info(`Removing session ${sessionId} from our master session list`);
310
-
304
+ this.log.info(`Removing session ${sessionId} from our master session list`);
311
305
  delete this.sessions[sessionId];
312
306
  delete this.sessionPlugins[sessionId];
307
+ return dstSession;
313
308
  });
309
+
310
+ if (!dstSession) {
311
+ throw new Error('Session not found');
312
+ }
313
+
314
314
  return {
315
315
  protocol,
316
316
  value: await dstSession.deleteSession(sessionId, otherSessionsData)
317
317
  };
318
318
  } catch (e) {
319
- _logger.default.error(`Had trouble ending session ${sessionId}: ${e.message}`);
320
-
319
+ this.log.error(`Had trouble ending session ${sessionId}: ${e.message}`);
321
320
  return {
322
321
  protocol,
323
322
  error: e
@@ -329,8 +328,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
329
328
  const sessionsCount = _lodash.default.size(this.sessions);
330
329
 
331
330
  if (0 === sessionsCount) {
332
- _logger.default.debug('There are no active sessions for cleanup');
333
-
331
+ this.log.debug('There are no active sessions for cleanup');
334
332
  return;
335
333
  }
336
334
 
@@ -338,16 +336,14 @@ class AppiumDriver extends _baseDriver.BaseDriver {
338
336
  force = false,
339
337
  reason
340
338
  } = opts;
341
-
342
- _logger.default.debug(`Cleaning up ${_support.util.pluralize('active session', sessionsCount, true)}`);
343
-
339
+ this.log.debug(`Cleaning up ${_support.util.pluralize('active session', sessionsCount, true)}`);
344
340
  const cleanupPromises = force ? _lodash.default.values(this.sessions).map(drv => drv.startUnexpectedShutdown(reason && new Error(reason))) : _lodash.default.keys(this.sessions).map(id => this.deleteSession(id));
345
341
 
346
342
  for (const cleanupPromise of cleanupPromises) {
347
343
  try {
348
344
  await cleanupPromise;
349
345
  } catch (e) {
350
- _logger.default.debug(e);
346
+ this.log.debug(e);
351
347
  }
352
348
  }
353
349
  }
@@ -420,7 +416,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
420
416
  };
421
417
 
422
418
  const defaultBehavior = async () => {
423
- plugins.length && _logger.default.info(`Executing default handling behavior for command '${cmd}'`);
419
+ plugins.length && this.log.info(`Executing default handling behavior for command '${cmd}'`);
424
420
  cmdHandledBy.default = true;
425
421
 
426
422
  if (reqForProxy) {
@@ -436,7 +432,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
436
432
  }
437
433
 
438
434
  if (isUmbrellaCmd) {
439
- return await super.executeCommand(cmd, ...args);
435
+ return await _baseDriver.BaseDriver.prototype.executeCommand.call(this, cmd, ...args);
440
436
  }
441
437
 
442
438
  return await dstSession.executeCommand(cmd, ...args);
@@ -462,8 +458,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
462
458
  if (cmd === _baseDriver.CREATE_SESSION_COMMAND && this.sessionlessPlugins.length && !res.error) {
463
459
  const sessionId = _lodash.default.first(res.value);
464
460
 
465
- _logger.default.info(`Promoting ${this.sessionlessPlugins.length} sessionless plugins to be attached ` + `to session ID ${sessionId}`);
466
-
461
+ this.log.info(`Promoting ${this.sessionlessPlugins.length} sessionless plugins to be attached ` + `to session ID ${sessionId}`);
467
462
  this.sessionPlugins[sessionId] = this.sessionlessPlugins;
468
463
  this.sessionlessPlugins = [];
469
464
  }
@@ -479,14 +474,13 @@ class AppiumDriver extends _baseDriver.BaseDriver {
479
474
  cmdHandledBy,
480
475
  plugins
481
476
  }) {
482
- plugins.length && _logger.default.info(`Plugins which can handle cmd '${cmd}': ${plugins.map(p => p.name)}`);
477
+ plugins.length && this.log.info(`Plugins which can handle cmd '${cmd}': ${plugins.map(p => p.name)}`);
483
478
 
484
479
  for (const plugin of plugins) {
485
480
  cmdHandledBy[plugin.name] = false;
486
481
 
487
482
  next = (_next => async () => {
488
- _logger.default.info(`Plugin ${plugin.name} is now handling cmd '${cmd}'`);
489
-
483
+ this.log.info(`Plugin ${plugin.name} is now handling cmd '${cmd}'`);
490
484
  cmdHandledBy[plugin.name] = true;
491
485
 
492
486
  if (plugin[cmd]) {
@@ -512,7 +506,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
512
506
  const didntHandle = Object.keys(cmdHandledBy).filter(k => !cmdHandledBy[k]);
513
507
 
514
508
  if (didntHandle.length > 0) {
515
- _logger.default.info(`Command '${cmd}' was *not* handled by the following behaviours or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
509
+ this.log.info(`Command '${cmd}' was *not* handled by the following behaviours or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
516
510
  }
517
511
  }
518
512
 
@@ -565,14 +559,13 @@ function isAppiumDriverCommand(cmd) {
565
559
  }
566
560
 
567
561
  class NoDriverProxyCommandError extends Error {
562
+ code = 'APPIUMERR_NO_DRIVER_PROXYCOMMAND';
563
+
568
564
  constructor() {
569
565
  super(`The default behavior for this command was to proxy, but the driver ` + `did not have the 'proxyCommand' method defined. To fully support ` + `plugins, drivers should have 'proxyCommand' set to a jwpProxy object's ` + `'command()' method, in addition to the normal 'proxyReqRes'`);
570
- (0, _defineProperty2.default)(this, "code", 'APPIUMERR_NO_DRIVER_PROXYCOMMAND');
571
566
  }
572
567
 
573
568
  }
574
569
 
575
- exports.NoDriverProxyCommandError = NoDriverProxyCommandError;require('source-map-support').install();
576
-
577
-
578
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ0bXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1RNUF9ESVIiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwic2Vzc2lvbnMiLCJwZW5kaW5nRHJpdmVycyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJzZXNzaW9uRXhpc3RzIiwic2Vzc2lvbklkIiwiZHN0U2Vzc2lvbiIsImRyaXZlckZvclNlc3Npb24iLCJnZXRTdGF0dXMiLCJidWlsZCIsIl8iLCJjbG9uZSIsImdldFNlc3Npb25zIiwiYWNxdWlyZSIsIm5hbWUiLCJ0b1BhaXJzIiwibWFwIiwiaWQiLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJjYXBzIiwicHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IiwiZHJpdmVyTmFtZSIsImRyaXZlclZlcnNpb24iLCJkcml2ZXJCYXNlVmVyc2lvbiIsImxvZyIsImluZm8iLCJBUFBJVU1fVkVSIiwiYmFzZVZlcnNpb24iLCJfZmluZE1hdGNoaW5nRHJpdmVyIiwiYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHRJbnN0YW5jZSIsImFsbENsaUFyZ3NGb3JFeHQiLCJpc0VtcHR5IiwiZGVmYXVsdHMiLCJjbGlBcmdzIiwib21pdEJ5IiwidmFsdWUiLCJrZXkiLCJpc0VxdWFsIiwiY3JlYXRlU2Vzc2lvbiIsImpzb253cENhcHMiLCJyZXFDYXBzIiwidzNjQ2FwYWJpbGl0aWVzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImNsb25lRGVlcCIsImRlZmF1bHRTZXR0aW5ncyIsImp3cFNldHRpbmdzIiwiT2JqZWN0IiwiYXNzaWduIiwidzNjU2V0dGluZ3MiLCJhbHdheXNNYXRjaCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJwcm90b2NvbCIsImlubmVyU2Vzc2lvbklkIiwiZENhcHMiLCJwYXJzZWRDYXBzIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJlcnJvciIsIklubmVyRHJpdmVyIiwidmVyc2lvbiIsImRyaXZlckNvbmZpZyIsInNlc3Npb25PdmVycmlkZSIsImRlbGV0ZUFsbFNlc3Npb25zIiwicnVubmluZ0RyaXZlcnNEYXRhIiwib3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEiLCJkcml2ZXJJbnN0YW5jZSIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJkZW55SW5zZWN1cmUiLCJhIiwiYWxsb3dJbnNlY3VyZSIsInNlcnZlciIsInNlcnZlckhvc3QiLCJhZGRyZXNzIiwic2VydmVyUG9ydCIsInBvcnQiLCJzZXJ2ZXJQYXRoIiwiYmFzZVBhdGgiLCJjdXJTZXNzaW9uRGF0YUZvckRyaXZlciIsImUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwibWVzc2FnZSIsImRydiIsImRyaXZlckRhdGEiLCJwdXNoIiwicHVsbCIsImF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiaXNXM0NQcm90b2NvbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1cGRhdGVTZXR0aW5ncyIsImlzTWpzb253cFByb3RvY29sIiwib25TaHV0ZG93biIsImNhdXNlIiwiRXJyb3IiLCJ3YXJuIiwicGx1Z2luIiwiaXNGdW5jdGlvbiIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZGVidWciLCJkYXRhIiwidmFsdWVzIiwiZmlsdGVyIiwicyIsImRhdHVtIiwiZGVsZXRlU2Vzc2lvbiIsIm90aGVyU2Vzc2lvbnNEYXRhIiwiY3VyQ29uc3RydWN0b3JOYW1lIiwib3B0cyIsInNlc3Npb25zQ291bnQiLCJzaXplIiwiZm9yY2UiLCJyZWFzb24iLCJ1dGlsIiwicGx1cmFsaXplIiwiY2xlYW51cFByb21pc2VzIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwiY2xlYW51cFByb21pc2UiLCJwbHVnaW5zRm9yU2Vzc2lvbiIsImNyZWF0ZVBsdWdpbkluc3RhbmNlcyIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJoYW5kbGUiLCJQbHVnaW5DbGFzcyIsInBsdWdpbk5hbWUiLCJleGVjdXRlQ29tbWFuZCIsImlzR2V0U3RhdHVzIiwiR0VUX1NUQVRVU19DT01NQU5EIiwiaXNEZWxldGVTZXNzaW9uIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJyZXFGb3JQcm94eSIsImxhc3QiLCJwb3AiLCJwbHVnaW5zIiwiY21kSGFuZGxlZEJ5IiwiZGVmYXVsdCIsImRlZmF1bHRCZWhhdmlvciIsImxlbmd0aCIsInByb3h5Q29tbWFuZCIsIk5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IiLCJvcmlnaW5hbFVybCIsIm1ldGhvZCIsImJvZHkiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsImZpcnN0IiwiX25leHQiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUi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QUN0RyxRQUFKLEdBQWVBLFFBQWY7QUFDRDs7QUFDRCxXQUFPc0csR0FBUDtBQUNEOztBQUVEYSxFQUFBQSxXQUFXLENBQUV0SyxTQUFGLEVBQWE7QUFDdEIsVUFBTUMsVUFBVSxHQUFHLEtBQUtSLFFBQUwsQ0FBY08sU0FBZCxDQUFuQjtBQUNBLFdBQU9DLFVBQVUsSUFBSUksZ0JBQUU4RixVQUFGLENBQWFsRyxVQUFVLENBQUNxSyxXQUF4QixDQUFkLElBQXNEckssVUFBVSxDQUFDcUssV0FBWCxDQUF1QnRLLFNBQXZCLENBQTdEO0FBQ0Q7O0FBRUR1SyxFQUFBQSxpQkFBaUIsQ0FBRXZLLFNBQUYsRUFBYTtBQUM1QixVQUFNQyxVQUFVLEdBQUcsS0FBS1IsUUFBTCxDQUFjTyxTQUFkLENBQW5CO0FBQ0EsV0FBT0MsVUFBVSxHQUFHQSxVQUFVLENBQUNzSyxpQkFBWCxFQUFILEdBQW9DLEVBQXJEO0FBQ0Q7O0FBRURDLEVBQUFBLFFBQVEsQ0FBRXhLLFNBQUYsRUFBYTtBQUNuQixVQUFNQyxVQUFVLEdBQUcsS0FBS1IsUUFBTCxDQUFjTyxTQUFkLENBQW5CO0FBQ0EsV0FBT0MsVUFBVSxJQUFJQSxVQUFVLENBQUN1SyxRQUFYLENBQW9CeEssU0FBcEIsQ0FBckI7QUFDRDs7QUE5bUJtQzs7OztBQW1uQnRDLFNBQVN1SSxxQkFBVCxDQUFnQ1gsR0FBaEMsRUFBcUM7QUFDbkMsU0FBTyxDQUFDLGtDQUFpQkEsR0FBakIsQ0FBRCxJQUEwQkEsR0FBRyxLQUFLLGVBQXpDO0FBQ0Q7O0FBTU0sTUFBTXNCLHlCQUFOLFNBQXdDbEQsS0FBeEMsQ0FBOEM7QUFNbkQvRyxFQUFBQSxXQUFXLEdBQUk7QUFDYixVQUFPLHFFQUFELEdBQ0MsbUVBREQsR0FFQyx5RUFGRCxHQUdDLDZEQUhQO0FBRGEsZ0RBRlIsa0NBRVE7QUFLZDs7QUFYa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXRCdWlsZEluZm8sIHVwZGF0ZUJ1aWxkSW5mbywgQVBQSVVNX1ZFUiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGZpbmRNYXRjaGluZ0RyaXZlciB9IGZyb20gJy4vZHJpdmVycyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQsXG4gICAgICAgICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELCBERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBHRVRfU1RBVFVTX0NPTU1BTkRcbn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIHB1bGxTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbiB9IGZyb20gJy4vc2NoZW1hJztcblxuY29uc3QgZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyA9IHtcbiAgYXV0b21hdGlvbk5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbiAgcGxhdGZvcm1OYW1lOiB7XG4gICAgcHJlc2VuY2U6IHRydWUsXG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG59O1xuXG5jb25zdCBzZXNzaW9uc0xpc3RHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IHBlbmRpbmdEcml2ZXJzR3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5cbmNsYXNzIEFwcGl1bURyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncykge1xuICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgYC0tdG1wYCBoZXJlIHNpbmNlIGl0IHNob3VsZCBiZSBzZXQgdG9cbiAgICAvLyBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiBvbmNlIGF0IGFuIGluaXRpYWwgcG9pbnQgaW4gdGhlIEFwcGl1bSBsaWZlY3ljbGUuXG4gICAgLy8gVGhlIHByb2Nlc3MgYXJndW1lbnQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IEJhc2VEcml2ZXIuXG4gICAgLy8gUGxlYXNlIGNhbGwgQGFwcGl1bS9zdXBwb3J0LnRlbXBEaXIgbW9kdWxlIHRvIGFwcGx5IHRoaXMgYmVuZWZpdC5cbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSID0gYXJncy50bXBEaXI7XG4gICAgfVxuXG4gICAgc3VwZXIoYXJncyk7XG5cbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHM7XG5cbiAgICAvLyB0aGUgbWFpbiBBcHBpdW0gRHJpdmVyIGhhcyBubyBuZXcgY29tbWFuZCB0aW1lb3V0XG4gICAgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zID0gMDtcblxuICAgIHRoaXMuYXJncyA9IHsuLi5hcmdzfTtcblxuICAgIC8vIEFjY2VzcyB0byBzZXNzaW9ucyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAgLy8gaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgIC8vIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSBmcm9tIHRoZSBvdXRzaWRlXG4gICAgdGhpcy5zZXNzaW9ucyA9IHt9O1xuXG4gICAgLy8gQWNjZXNzIHRvIHBlbmRpbmcgZHJpdmVycyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAgLy8gaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgIC8vIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSBmcm9tIHRoZSBvdXRzaWRlXG4gICAgdGhpcy5wZW5kaW5nRHJpdmVycyA9IHt9O1xuXG4gICAgLyoqIEB0eXBlIHtQbHVnaW5FeHRlbnNpb25DbGFzc1tdfSAqL1xuICAgIHRoaXMucGx1Z2luQ2xhc3NlcyA9IFtdOyAvLyBsaXN0IG9mIHdoaWNoIHBsdWdpbnMgYXJlIGFjdGl2ZVxuICAgIHRoaXMuc2Vzc2lvblBsdWdpbnMgPSB7fTsgLy8gbWFwIG9mIHNlc3Npb25zIHRvIGFjdHVhbCBwbHVnaW4gaW5zdGFuY2VzIHBlciBzZXNzaW9uXG4gICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSBbXTsgLy8gc29tZSBjb21tYW5kcyBhcmUgc2Vzc2lvbmxlc3MsIHNvIHdlIG5lZWQgYSBzZXQgb2YgcGx1Z2lucyBmb3IgdGhlbVxuXG4gICAgLy8gYWxsb3cgdGhpcyB0byBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vIGBhd2FpdGBcbiAgICB1cGRhdGVCdWlsZEluZm8oKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCcuL2RyaXZlci1jb25maWcnKS5kZWZhdWx0fHVuZGVmaW5lZH0gKi9cbiAgZHJpdmVyQ29uZmlnO1xuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdleHByZXNzJykuRXhwcmVzc3x1bmRlZmluZWR9ICovXG4gIHNlcnZlcjtcblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgcmV0dXJuIF8udG9QYWlycyhzZXNzaW9ucylcbiAgICAgIC5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtpZCwgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2Fwc30pKTtcbiAgfVxuXG4gIHByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCAoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbiwgZHJpdmVyQmFzZVZlcnNpb24pIHtcbiAgICBsb2cuaW5mbyhkcml2ZXJWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gKHYke2RyaXZlclZlcnNpb259KSBzZXNzaW9uYFxuICAgICAgOiBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9IHNlc3Npb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ2hlY2tpbmcgQmFzZURyaXZlciB2ZXJzaW9ucyBmb3IgQXBwaXVtIGFuZCAke2RyaXZlck5hbWV9YCk7XG4gICAgbG9nLmluZm8oQXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhkcml2ZXJCYXNlVmVyc2lvblxuICAgICAgPyBgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke2RyaXZlckJhc2VWZXJzaW9ufWBcbiAgICAgIDogYENvdWxkIG5vdCBkZXRlcm1pbmUgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMganVzdCBhbiBhbGlhcyBmb3IgZHJpdmVyLmpzJ3MgbWV0aG9kLCB3aGljaCBpcyBuZWNlc3NhcnkgZm9yXG4gICAqIG1vY2tpbmcgaW4gdGhlIHRlc3Qgc3VpdGVcbiAgICovXG4gIF9maW5kTWF0Y2hpbmdEcml2ZXIgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZmluZE1hdGNoaW5nRHJpdmVyKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBhc3NpZ24gQ0xJIGFyZ3MgZm9yIGEgZHJpdmVyIG9yIHBsdWdpblxuICAgKlxuICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBwcm92aWRlZCBhIHNjaGVtYSwgdmFsaWRhdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZC5cbiAgICpcbiAgICogQW55IGFyZyB3aGljaCBpcyBlcXVhbCB0byBpdHMgZGVmYXVsdCB2YWx1ZSB3aWxsIG5vdCBiZSBhc3NpZ25lZCB0byB0aGUgZXh0ZW5zaW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi9leHQtY29uZmlnLWlvJykuRXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAnZHJpdmVyJyBvciAncGx1Z2luJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRJbnN0YW5jZSB0aGUgZHJpdmVyIG9yIHBsdWdpbiBpbnN0YW5jZVxuICAgKi9cbiAgYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lLCBleHRJbnN0YW5jZSkge1xuICAgIGNvbnN0IGFsbENsaUFyZ3NGb3JFeHQgPSB0aGlzLmFyZ3NbZXh0VHlwZV0/LltleHROYW1lXTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxDbGlBcmdzRm9yRXh0KSkge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgIGNvbnN0IGNsaUFyZ3MgPSBfLmlzRW1wdHkoZGVmYXVsdHMpXG4gICAgICAgID8gYWxsQ2xpQXJnc0ZvckV4dFxuICAgICAgICA6IF8ub21pdEJ5KGFsbENsaUFyZ3NGb3JFeHQsICh2YWx1ZSwga2V5KSA9PiBfLmlzRXF1YWwoZGVmYXVsdHNba2V5XSwgdmFsdWUpKTtcbiAgICAgIGlmICghXy5pc0VtcHR5KGNsaUFyZ3MpKSB7XG4gICAgICAgIGV4dEluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHJldHVybiB7QXJyYXl9IFVuaXF1ZSBzZXNzaW9uIElEIGFuZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGpzb253cENhcHMsIHJlcUNhcHMsIHczY0NhcGFiaWxpdGllcykge1xuICAgIGNvbnN0IGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh0aGlzLmFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZGVmYXVsdFNldHRpbmdzID0gcHVsbFNldHRpbmdzKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGpzb253cENhcHMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBzKTtcbiAgICBjb25zdCBqd3BTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgcHVsbFNldHRpbmdzKGpzb253cENhcHMpKTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgandwU2V0dGluZ3MpO1xuICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncygodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5hbHdheXNNYXRjaCB8fCB7fSkpO1xuICAgIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mICgodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIGVycm9yfSA9IHBhcnNlZENhcHM7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZVxuICAgICAgfSA9IHRoaXMuX2ZpbmRNYXRjaGluZ0RyaXZlcih0aGlzLmRyaXZlckNvbmZpZywgZGVzaXJlZENhcHMpO1xuICAgICAgdGhpcy5wcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoSW5uZXJEcml2ZXIubmFtZSwgZHJpdmVyVmVyc2lvbiwgSW5uZXJEcml2ZXIuYmFzZVZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEsIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhO1xuXG4gICAgICBjb25zdCBkcml2ZXJJbnN0YW5jZSA9IG5ldyBJbm5lckRyaXZlcih0aGlzLmFyZ3MsIHRydWUpO1xuXG4gICAgICAvLyBXZSB3YW50IHRvIGFzc2lnbiBzZWN1cml0eSB2YWx1ZXMgZGlyZWN0bHkgb24gdGhlIGRyaXZlci4gVGhlIGRyaXZlclxuICAgICAgLy8gc2hvdWxkIG5vdCByZWFkIHNlY3VyaXR5IHZhbHVlcyBmcm9tIGB0aGlzLm9wdHNgIGJlY2F1c2UgdGhvc2UgdmFsdWVzXG4gICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gc2V0IGJ5IGEgbWFsaWNpb3VzIHVzZXIgdmlhIGNhcGFiaWxpdGllcywgd2hlcmVhcyB3ZVxuICAgICAgLy8gd2FudCBhIGd1YXJhbnRlZSB0aGUgdmFsdWVzIHdlcmUgc2V0IGJ5IHRoZSBhcHBpdW0gc2VydmVyIGFkbWluXG4gICAgICBpZiAodGhpcy5hcmdzLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICBgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSAtLWRlbnktaW5zZWN1cmVgKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5kZW55SW5zZWN1cmUpKSB7XG4gICAgICAgIGxvZy5pbmZvKCdFeHBsaWNpdGx5IHByZXZlbnRpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuZGVueUluc2VjdXJlLm1hcCgoYSkgPT4gbG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0V4cGxpY2l0bHkgZW5hYmxpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZS5tYXAoKGEpID0+IGxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuYWxsb3dJbnNlY3VyZSA9IHRoaXMuYXJncy5hbGxvd0luc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaWtld2lzZSwgYW55IGRyaXZlci1zcGVjaWZpYyBDTEkgYXJncyB0aGF0IHdlcmUgcGFzc2VkIGluIHNob3VsZCBiZSBhc3NpZ25lZCBkaXJlY3RseSB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIG1pbWlja2VkIGJ5IGEgbWFsaWNpb3VzIHVzZXIgc2VuZGluZyBpbiBjYXBhYmlsaXRpZXNcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdkcml2ZXInLCBkcml2ZXJOYW1lLCBkcml2ZXJJbnN0YW5jZSk7XG5cblxuICAgICAgLy8gVGhpcyBhc3NpZ25tZW50IGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IHdlYiBzb2NrZXRzIGZ1bmN0aW9uYWxpdHkgaW5zaWRlIHRoZSBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnNlcnZlciA9IHRoaXMuc2VydmVyO1xuXG4gICAgICAvLyBEcml2ZXJzL3BsdWdpbnMgbWlnaHQgYWxzbyB3YW50IHRvIGtub3cgd2hlcmUgdGhleSBhcmUgaG9zdGVkXG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJIb3N0ID0gdGhpcy5hcmdzLmFkZHJlc3M7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQb3J0ID0gdGhpcy5hcmdzLnBvcnQ7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQYXRoID0gdGhpcy5hcmdzLmJhc2VQYXRoO1xuXG4gICAgICB0cnkge1xuICAgICAgICBydW5uaW5nRHJpdmVyc0RhdGEgPSBhd2FpdCB0aGlzLmN1clNlc3Npb25EYXRhRm9yRHJpdmVyKElubmVyRHJpdmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKGUubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSA9IHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0gfHwgW107XG4gICAgICAgIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhID0gdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5tYXAoKGRydikgPT4gZHJ2LmRyaXZlckRhdGEpO1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLnB1c2goZHJpdmVySW5zdGFuY2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIFtpbm5lclNlc3Npb25JZCwgZENhcHNdID0gYXdhaXQgZHJpdmVySW5zdGFuY2UuY3JlYXRlU2Vzc2lvbihcbiAgICAgICAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcmVxQ2FwcyxcbiAgICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgWy4uLnJ1bm5pbmdEcml2ZXJzRGF0YSwgLi4ub3RoZXJQZW5kaW5nRHJpdmVyc0RhdGFdXG4gICAgICAgICk7XG4gICAgICAgIHByb3RvY29sID0gZHJpdmVySW5zdGFuY2UucHJvdG9jb2w7XG4gICAgICAgIGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25zW2lubmVyU2Vzc2lvbklkXSA9IGRyaXZlckluc3RhbmNlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICAgIF8ucHVsbCh0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLCBkcml2ZXJJbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIoZHJpdmVySW5zdGFuY2UsIGlubmVyU2Vzc2lvbklkKTtcblxuICAgICAgbG9nLmluZm8oYE5ldyAke0lubmVyRHJpdmVyLm5hbWV9IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHksIHNlc3Npb24gYCArXG4gICAgICAgICAgICAgIGAke2lubmVyU2Vzc2lvbklkfSBhZGRlZCB0byBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG5cbiAgICAgIC8vIHNldCB0aGUgTmV3IENvbW1hbmQgVGltZW91dCBmb3IgdGhlIGlubmVyIGRyaXZlclxuICAgICAgZHJpdmVySW5zdGFuY2Uuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgICAvLyBhcHBseSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgKGlmIHByb3ZpZGVkKVxuICAgICAgaWYgKGRyaXZlckluc3RhbmNlLmlzVzNDUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KHczY1NldHRpbmdzKSkge1xuICAgICAgICBsb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBXM0MgY2FwczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodzNjU2V0dGluZ3MpKTtcbiAgICAgICAgYXdhaXQgZHJpdmVySW5zdGFuY2UudXBkYXRlU2V0dGluZ3ModzNjU2V0dGluZ3MpO1xuICAgICAgfSBlbHNlIGlmIChkcml2ZXJJbnN0YW5jZS5pc01qc29ud3BQcm90b2NvbCgpICYmICFfLmlzRW1wdHkoandwU2V0dGluZ3MpKSB7XG4gICAgICAgIGxvZy5pbmZvKGBBcHBseWluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIHBhcnNlZCBmcm9tIE1KU09OV1AgY2FwczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoandwU2V0dGluZ3MpKTtcbiAgICAgICAgYXdhaXQgZHJpdmVySW5zdGFuY2UudXBkYXRlU2V0dGluZ3MoandwU2V0dGluZ3MpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwcm90b2NvbCxcbiAgICAgIHZhbHVlOiBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzLCBwcm90b2NvbF1cbiAgICB9O1xuICB9XG5cbiAgYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlciAoZHJpdmVyLCBpbm5lclNlc3Npb25JZCkge1xuICAgIGNvbnN0IG9uU2h1dGRvd24gPSAoY2F1c2UgPSBuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSkgPT4ge1xuICAgICAgbG9nLndhcm4oYEVuZGluZyBzZXNzaW9uLCBjYXVzZSB3YXMgJyR7Y2F1c2UubWVzc2FnZX0nYCk7XG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24ocGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBQbHVnaW4gJHtwbHVnaW4ubmFtZX0gZGVmaW5lcyBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXI7IGNhbGxpbmcgaXQgbm93YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBwbHVnaW4ub25VbmV4cGVjdGVkU2h1dGRvd24oZHJpdmVyLCBjYXVzZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gZXJyb3Igd2hlbiBydW5uaW5nIHBsdWdpbiAke3BsdWdpbi5uYW1lfSBzaHV0ZG93biBoYW5kbGVyOiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJyR7aW5uZXJTZXNzaW9uSWR9JyBmcm9tIG91ciBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF07XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF07XG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24oZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKG9uU2h1dGRvd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihgRmFpbGVkIHRvIGF0dGFjaCB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biBsaXN0ZW5lci4gYCArXG4gICAgICAgIGBJcyAnb25VbmV4cGVjdGVkU2h1dGRvd24nIG1ldGhvZCBhdmFpbGFibGUgZm9yICcke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSc/YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIgKElubmVyRHJpdmVyKSB7XG4gICAgY29uc3Qgc2Vzc2lvbnMgPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zKTtcbiAgICBjb25zdCBkYXRhID0gXy52YWx1ZXMoc2Vzc2lvbnMpXG4gICAgICAgICAgICAgICAgICAgLmZpbHRlcigocykgPT4gcy5jb25zdHJ1Y3Rvci5uYW1lID09PSBJbm5lckRyaXZlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZHJpdmVyRGF0YSk7XG4gICAgZm9yIChsZXQgZGF0dW0gb2YgZGF0YSkge1xuICAgICAgaWYgKCFkYXR1bSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2JsZW0gZ2V0dGluZyBzZXNzaW9uIGRhdGEgZm9yIGRyaXZlciB0eXBlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7SW5uZXJEcml2ZXIubmFtZX07IGRvZXMgaXQgaW1wbGVtZW50ICdnZXQgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZHJpdmVyRGF0YSc/YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoc2Vzc2lvbklkKSB7XG4gICAgbGV0IHByb3RvY29sO1xuICAgIHRyeSB7XG4gICAgICBsZXQgb3RoZXJTZXNzaW9uc0RhdGEgPSBudWxsO1xuICAgICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgICAgYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJDb25zdHJ1Y3Rvck5hbWUgPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgb3RoZXJTZXNzaW9uc0RhdGEgPSBfLnRvUGFpcnModGhpcy5zZXNzaW9ucylcbiAgICAgICAgICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lID09PSBjdXJDb25zdHJ1Y3Rvck5hbWUgJiYga2V5ICE9PSBzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUuZHJpdmVyRGF0YSk7XG4gICAgICAgIGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgICAgbG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9IGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkZWxldGVTZXNzaW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgb3Igbm90XG4gICAgICAgIC8vIG1ha2UgdGhlIHNlc3Npb24gdW5hdmFpbGFibGUsIGJlY2F1c2Ugd2hvIGtub3dzIHdoYXQgc3RhdGUgaXQgbWlnaHRcbiAgICAgICAgLy8gYmUgaW4gb3RoZXJ3aXNlXG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICB2YWx1ZTogYXdhaXQgZHN0U2Vzc2lvbi5kZWxldGVTZXNzaW9uKHNlc3Npb25JZCwgb3RoZXJTZXNzaW9uc0RhdGEpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoYEhhZCB0cm91YmxlIGVuZGluZyBzZXNzaW9uICR7c2Vzc2lvbklkfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3I6IGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbFNlc3Npb25zIChvcHRzID0ge30pIHtcbiAgICBjb25zdCBzZXNzaW9uc0NvdW50ID0gXy5zaXplKHRoaXMuc2Vzc2lvbnMpO1xuICAgIGlmICgwID09PSBzZXNzaW9uc0NvdW50KSB7XG4gICAgICBsb2cuZGVidWcoJ1RoZXJlIGFyZSBubyBhY3RpdmUgc2Vzc2lvbnMgZm9yIGNsZWFudXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBmb3JjZSA9IGZhbHNlLFxuICAgICAgcmVhc29uLFxuICAgIH0gPSBvcHRzO1xuICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnYWN0aXZlIHNlc3Npb24nLCBzZXNzaW9uc0NvdW50LCB0cnVlKX1gKTtcbiAgICBjb25zdCBjbGVhbnVwUHJvbWlzZXMgPSBmb3JjZVxuICAgICAgPyBfLnZhbHVlcyh0aGlzLnNlc3Npb25zKS5tYXAoKGRydikgPT4gZHJ2LnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKHJlYXNvbiAmJiBuZXcgRXJyb3IocmVhc29uKSkpXG4gICAgICA6IF8ua2V5cyh0aGlzLnNlc3Npb25zKS5tYXAoKGlkKSA9PiB0aGlzLmRlbGV0ZVNlc3Npb24oaWQpKTtcbiAgICBmb3IgKGNvbnN0IGNsZWFudXBQcm9taXNlIG9mIGNsZWFudXBQcm9taXNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xlYW51cFByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHByb3ByaWF0ZSBwbHVnaW5zIGZvciBhIHNlc3Npb24gKG9yIHNlc3Npb25sZXNzIHBsdWdpbnMpXG4gICAqXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCAob3IgbnVsbCkgdG8gdXNlIHRvIGZpbmQgcGx1Z2luc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gYXJyYXkgb2YgcGx1Z2luIGluc3RhbmNlc1xuICAgKi9cbiAgcGx1Z2luc0ZvclNlc3Npb24gKHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zKSkge1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHBsdWdpbnMgZm9yIGEgY29tbWFuZCwgd2UgZWl0aGVyIGdldCB0aGUgcGx1Z2luIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIHBhcnRpY3VsYXIgY29tbWFuZCdzIHNlc3Npb24sIG9yIGluIHRoZSBjYXNlIG9mIHNlc3Npb25sZXNzIHBsdWdpbnMsIHB1bGwgZnJvbSB0aGUgc2V0IG9mXG4gICAqIHBsdWdpbiBpbnN0YW5jZXMgcmVzZXJ2ZWQgZm9yIHNlc3Npb25sZXNzIGNvbW1hbmRzIChhbmQgd2UgbGF6aWx5IGNyZWF0ZSBwbHVnaW4gaW5zdGFuY2VzIG9uXG4gICAqIGZpcnN0IHVzZSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZCAtIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGZpbmQgYSBwbHVnaW4gdG8gaGFuZGxlXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHBhcnRpY3VsYXIgc2Vzc2lvbiBmb3Igd2hpY2ggdG8gZmluZCBhIHBsdWdpbiwgb3IgbnVsbCBpZlxuICAgKiBzZXNzaW9ubGVzc1xuICAgKi9cbiAgcGx1Z2luc1RvSGFuZGxlQ21kIChjbWQsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICAvLyB0byBoYW5kbGUgYSBnaXZlbiBjb21tYW5kLCBhIHBsdWdpbiBzaG91bGQgZWl0aGVyIGltcGxlbWVudCB0aGF0IGNvbW1hbmQgYXMgYSBwbHVnaW5cbiAgICAvLyBpbnN0YW5jZSBtZXRob2Qgb3IgaXQgc2hvdWxkIGltcGxlbWVudCBhIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgcmV0dXJuIHRoaXMucGx1Z2luc0ZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgICAgLmZpbHRlcigocCkgPT4gXy5pc0Z1bmN0aW9uKHBbY21kXSkgfHwgXy5pc0Z1bmN0aW9uKHAuaGFuZGxlKSk7XG4gIH1cblxuICBjcmVhdGVQbHVnaW5JbnN0YW5jZXMgKCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbkNsYXNzZXMubWFwKChQbHVnaW5DbGFzcykgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IFBsdWdpbkNsYXNzLnBsdWdpbk5hbWU7XG4gICAgICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luQ2xhc3MobmFtZSk7XG4gICAgICB0aGlzLmFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbigncGx1Z2luJywgbmFtZSwgcGx1Z2luKTtcbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBleGVjdXRlQ29tbWFuZCAoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gV2UgaGF2ZSBiYXNpY2FsbHkgdGhyZWUgY2FzZXMgZm9yIGhvdyB0byBoYW5kbGUgY29tbWFuZHM6XG4gICAgLy8gMS4gaGFuZGxlIGdldFN0YXR1cyAod2UgZG8gdGhpcyBhcyBhIHNwZWNpYWwgb3V0IG9mIGJhbmQgY2FzZSBzbyBpdCBkb2Vzbid0IGdldCBhZGRlZCB0byBhblxuICAgIC8vICAgIGV4ZWN1dGlvbiBxdWV1ZSwgYW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgZS5nLiBjcmVhdGVTZXNzaW9uIGlzIGluIHByb2dyZXNzKVxuICAgIC8vIDIuIGhhbmRsZSBjb21tYW5kcyB0aGF0IHRoaXMgdW1icmVsbGEgZHJpdmVyIHNob3VsZCBoYW5kbGUsIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgc2Vzc2lvblxuICAgIC8vICAgIGRyaXZlciAoZm9yIGV4YW1wbGUsIGRlbGV0ZVNlc3Npb24sIG9yIG90aGVyIG5vbi1zZXNzaW9uIGNvbW1hbmRzKVxuICAgIC8vIDMuIGhhbmRsZSBzZXNzaW9uIGRyaXZlciBjb21tYW5kcy5cbiAgICAvLyBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCBiZWNhdXNlIHdlIHN1cHBvcnQgY29tbWFuZCBwbHVnaW5zLCB3ZSBuZWVkIHRvIHdyYXAgYW55IG9mIHRoZXNlXG4gICAgLy8gY2FzZXMgd2l0aCBwbHVnaW4gaGFuZGxpbmcuXG5cbiAgICBjb25zdCBpc0dldFN0YXR1cyA9IGNtZCA9PT0gR0VUX1NUQVRVU19DT01NQU5EO1xuICAgIGNvbnN0IGlzRGVsZXRlU2Vzc2lvbiA9IGNtZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORDtcbiAgICBjb25zdCBpc1VtYnJlbGxhQ21kID0gIWlzR2V0U3RhdHVzICYmIGlzQXBwaXVtRHJpdmVyQ29tbWFuZChjbWQpO1xuICAgIGNvbnN0IGlzU2Vzc2lvbkNtZCA9ICFpc1VtYnJlbGxhQ21kIHx8IGlzRGVsZXRlU2Vzc2lvbjtcblxuICAgIC8vIGlmIGEgcGx1Z2luIG92ZXJyaWRlIHByb3h5aW5nIGZvciB0aGlzIGNvbW1hbmQgYW5kIHRoYXQgaXMgd2h5IHdlIGFyZSBoZXJlIGluc3RlYWQgb2YganVzdFxuICAgIC8vIGxldHRpbmcgdGhlIHByb3RvY29sIHByb3h5IHRoZSBjb21tYW5kIGVudGlyZWx5LCBkZXRlcm1pbmUgdGhhdCwgZ2V0IHRoZSByZXF1ZXN0IG9iamVjdCBmb3JcbiAgICAvLyB1c2UgbGF0ZXIgb24sIHRoZW4gY2xlYW4gdXAgdGhlIGFyZ3NcbiAgICBjb25zdCByZXFGb3JQcm94eSA9IF8ubGFzdChhcmdzKT8ucmVxRm9yUHJveHk7XG4gICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICBhcmdzLnBvcCgpO1xuICAgIH1cblxuXG4gICAgLy8gZmlyc3QgZG8gc29tZSBlcnJvciBjaGVja2luZy4gSWYgd2UncmUgcmVxdWVzdGluZyBhIHNlc3Npb24gY29tbWFuZCBleGVjdXRpb24sIHRoZW4gbWFrZVxuICAgIC8vIHN1cmUgdGhhdCBzZXNzaW9uIGFjdHVhbGx5IGV4aXN0cyBvbiB0aGUgc2Vzc2lvbiBkcml2ZXIsIGFuZCBzZXQgdGhlIHNlc3Npb24gZHJpdmVyIGl0c2VsZlxuICAgIGxldCBzZXNzaW9uSWQgPSBudWxsO1xuICAgIGxldCBkc3RTZXNzaW9uID0gbnVsbDtcbiAgICBsZXQgcHJvdG9jb2wgPSBudWxsO1xuICAgIGxldCBkcml2ZXIgPSB0aGlzO1xuICAgIGlmIChpc1Nlc3Npb25DbWQpIHtcbiAgICAgIHNlc3Npb25JZCA9IF8ubGFzdChhcmdzKTtcbiAgICAgIGRzdFNlc3Npb24gPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0pO1xuICAgICAgaWYgKCFkc3RTZXNzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNlc3Npb24gd2l0aCBpZCAnJHtzZXNzaW9uSWR9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgLy8gbm93IHNhdmUgdGhlIHJlc3BvbnNlIHByb3RvY29sIGdpdmVuIHRoYXQgdGhlIHNlc3Npb24gZHJpdmVyJ3MgcHJvdG9jb2wgbWlnaHQgZGlmZmVyXG4gICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICBpZiAoIWlzVW1icmVsbGFDbWQpIHtcbiAgICAgICAgZHJpdmVyID0gZHN0U2Vzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgYW55IHBsdWdpbnMgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgYXMgaGFuZGxpbmcgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgcGx1Z2lucyA9IHRoaXMucGx1Z2luc1RvSGFuZGxlQ21kKGNtZCwgc2Vzc2lvbklkKTtcblxuICAgIC8vIG5vdyB3ZSBkZWZpbmUgYSAnY21kSGFuZGxlZEJ5JyBvYmplY3Qgd2hpY2ggd2lsbCBrZWVwIHRyYWNrIG9mIHdoaWNoIHBsdWdpbnMgaGF2ZSBoYW5kbGVkIHRoaXNcbiAgICAvLyBjb21tYW5kLiB3ZSBjYXJlIGFib3V0IHRoaXMgYmVjYXVzZSAoYSkgbXVsdGlwbGUgcGx1Z2lucyBjYW4gaGFuZGxlIHRoZSBzYW1lIGNvbW1hbmQsIGFuZFxuICAgIC8vIChiKSB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGEgcGx1Z2luIHdpbGwgYWN0dWFsbHkgY2FsbCB0aGUgbmV4dCgpIG1ldGhvZCB3aGljaCBydW5zIHRoZVxuICAgIC8vIG9yaWdpbmFsIGNvbW1hbmQgZXhlY3V0aW9uLiBUaGlzIHJlc3VsdHMgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGNvbW1hbmQgbWlnaHQgYmUgaGFuZGxlZFxuICAgIC8vIGJ5IHNvbWUgYnV0IG5vdCBhbGwgcGx1Z2lucywgb3IgYnkgcGx1Z2luKHMpIGJ1dCBub3QgYnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFNvIHN0YXJ0IG91dFxuICAgIC8vIHRoaXMgb2JqZWN0IGRlY2xhcmluZyB0aGF0IHRoZSBkZWZhdWx0IGhhbmRsZXIgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLlxuICAgIGNvbnN0IGNtZEhhbmRsZWRCeSA9IHtkZWZhdWx0OiBmYWxzZX07XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHBsdWdpbnMsIGFuZCBzdWNjZXNzaXZlbHkgd3JhcHBlZFxuICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGx1Z2luIHRoYXQgY2FuIGhhbmRsZSB0aGUgY29tbWFuZC4gVG8gc3RhcnQgb2ZmIHdpdGgsIHRoZSBhc3luY1xuICAgIC8vIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgY2FsbGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaS5lLiwgd2hpY2hldmVyIG9mIHRoZSAzIGNhc2VzIGFib3ZlIGlzXG4gICAgLy8gdGhlIGFwcHJvcHJpYXRlIG9uZVxuICAgIGNvbnN0IGRlZmF1bHRCZWhhdmlvciA9IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGlmIHdlJ3JlIHJ1bm5pbmcgd2l0aCBwbHVnaW5zLCBtYWtlIHN1cmUgd2UgbG9nIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgYWN0dWFsbHlcbiAgICAgIC8vIGhhcHBlbmluZyBzbyB3ZSBjYW4gdGVsbCB3aGVuIHRoZSBwbHVnaW4gY2FsbCBjaGFpbiBpcyB1bndyYXBwaW5nIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAvLyBpZiB0aGF0J3Mgd2hhdCBoYXBwZW5zXG4gICAgICBwbHVnaW5zLmxlbmd0aCAmJiBsb2cuaW5mbyhgRXhlY3V0aW5nIGRlZmF1bHQgaGFuZGxpbmcgYmVoYXZpb3IgZm9yIGNvbW1hbmQgJyR7Y21kfSdgKTtcblxuICAgICAgLy8gaWYgd2UgbWFrZSBpdCBoZXJlLCB3ZSBrbm93IHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgaGFuZGxlZFxuICAgICAgY21kSGFuZGxlZEJ5LmRlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgICAgLy8gd2Ugd291bGQgaGF2ZSBwcm94aWVkIHRoaXMgY29tbWFuZCBoYWQgYSBwbHVnaW4gbm90IGhhbmRsZWQgaXQsIHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAgIC8vIGlzIHRvIGRvIHRoZSBwcm94eSBhbmQgcmV0cmlldmUgdGhlIHJlc3VsdCBpbnRlcm5hbGx5IHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHBsdWdpblxuICAgICAgICAvLyBpbiBjYXNlIGl0IGNhbGxzICdhd2FpdCBuZXh0KCknLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRyaXZlciBoYXZlIGRlZmluZWRcbiAgICAgICAgLy8gJ3Byb3h5Q29tbWFuZCcgYW5kIG5vdCBqdXN0ICdwcm94eVJlcVJlcycuXG4gICAgICAgIGlmICghZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkc3RTZXNzaW9uLnByb3h5Q29tbWFuZChyZXFGb3JQcm94eS5vcmlnaW5hbFVybCwgcmVxRm9yUHJveHkubWV0aG9kLFxuICAgICAgICAgIHJlcUZvclByb3h5LmJvZHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNHZXRTdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1VtYnJlbGxhQ21kKSB7XG4gICAgICAgIC8vIHNvbWUgY29tbWFuZHMsIGxpa2UgZGVsZXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gaGFuZGxlIG9uICp0aGlzKiBkcml2ZXIsXG4gICAgICAgIC8vIG5vdCB0aGUgcGxhdGZvcm0gZHJpdmVyXG4gICAgICAgIHJldHVybiBhd2FpdCBzdXBlci5leGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBoZXJlIHdlIGtub3cgdGhhdCB3ZSBhcmUgZXhlY3V0aW5nIGEgc2Vzc2lvbiBjb21tYW5kLCBhbmQgaGF2ZSBhIHZhbGlkIHNlc3Npb24gZHJpdmVyXG4gICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5leGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBub3cgdGFrZSBvdXIgZGVmYXVsdCBiZWhhdmlvciwgd3JhcCBpdCB3aXRoIGFueSBudW1iZXIgb2YgcGx1Z2luIGJlaGF2aW9ycywgYW5kIHJ1biBpdFxuICAgIGNvbnN0IHdyYXBwZWRDbWQgPSB0aGlzLndyYXBDb21tYW5kV2l0aFBsdWdpbnMoe1xuICAgICAgZHJpdmVyLCBjbWQsIGFyZ3MsIHBsdWdpbnMsIGNtZEhhbmRsZWRCeSwgbmV4dDogZGVmYXVsdEJlaGF2aW9yXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5leGVjdXRlV3JhcHBlZENvbW1hbmQoe3dyYXBwZWRDbWQsIHByb3RvY29sfSk7XG5cbiAgICAvLyBpZiB3ZSBoYWQgcGx1Z2lucywgbWFrZSBzdXJlIHRvIGxvZyBvdXQgdGhlIGhlbHBmdWwgcmVwb3J0IGFib3V0IHdoaWNoIHBsdWdpbnMgZW5kZWQgdXBcbiAgICAvLyBoYW5kbGluZyB0aGUgY29tbWFuZCBhbmQgd2hpY2ggZGlkbid0XG4gICAgdGhpcy5sb2dQbHVnaW5IYW5kbGVyUmVwb3J0KHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pO1xuXG4gICAgLy8gQW5kIGZpbmFsbHksIGlmIHRoZSBjb21tYW5kIHdhcyBjcmVhdGVTZXNzaW9uLCB3ZSB3YW50IHRvIG1pZ3JhdGUgYW55IHBsdWdpbnMgd2hpY2ggd2VyZVxuICAgIC8vIHByZXZpb3VzbHkgc2Vzc2lvbmxlc3MgdG8gdXNlIHRoZSBuZXcgc2Vzc2lvbklkLCBzbyB0aGF0IHBsdWdpbnMgY2FuIHNoYXJlIHN0YXRlIGJldHdlZW5cbiAgICAvLyB0aGVpciBjcmVhdGVTZXNzaW9uIG1ldGhvZCBhbmQgb3RoZXIgaW5zdGFuY2UgbWV0aG9kc1xuICAgIGlmIChjbWQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQgJiYgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMubGVuZ3RoICYmICFyZXMuZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IF8uZmlyc3QocmVzLnZhbHVlKTtcbiAgICAgIGxvZy5pbmZvKGBQcm9tb3RpbmcgJHt0aGlzLnNlc3Npb25sZXNzUGx1Z2lucy5sZW5ndGh9IHNlc3Npb25sZXNzIHBsdWdpbnMgdG8gYmUgYXR0YWNoZWQgYCArXG4gICAgICAgICAgICAgICBgdG8gc2Vzc2lvbiBJRCAke3Nlc3Npb25JZH1gKTtcbiAgICAgIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSA9IHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zO1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgd3JhcENvbW1hbmRXaXRoUGx1Z2lucyAoe2RyaXZlciwgY21kLCBhcmdzLCBuZXh0LCBjbWRIYW5kbGVkQnksIHBsdWdpbnN9KSB7XG4gICAgcGx1Z2lucy5sZW5ndGggJiYgbG9nLmluZm8oYFBsdWdpbnMgd2hpY2ggY2FuIGhhbmRsZSBjbWQgJyR7Y21kfSc6ICR7cGx1Z2lucy5tYXAoKHApID0+IHAubmFtZSl9YCk7XG5cbiAgICAvLyBub3cgd2UgY2FuIGdvIHRocm91Z2ggZWFjaCBwbHVnaW4gYW5kIHdyYXAgYG5leHRgIGFyb3VuZCBpdHMgb3duIGhhbmRsZXIsIHBhc3NpbmcgdGhlICpvbGQqXG4gICAgLy8gbmV4dCBpbiBzbyB0aGF0IGl0IGNhbiBjYWxsIGl0IGlmIGl0IHdhbnRzIHRvXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgLy8gbmVlZCBhbiBJSUZFIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoZSB2YWx1ZSBvZiBuZXh0IHRoYXQncyBwYXNzZWQgdG8gcGx1Z2luLmhhbmRsZSB0byBiZVxuICAgICAgLy8gZXhhY3RseSB0aGUgdmFsdWUgb2YgbmV4dCBoZXJlIGJlZm9yZSByZWFzc2lnbm1lbnQ7IHdlIGRvbid0IHdhbnQgaXQgdG8gYmUgbGF6aWx5XG4gICAgICAvLyBldmFsdWF0ZWQsIG90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24gb2YgdGhlIGxhc3QgYG5leHRgIHRvIGJlIGRlZmluZWQuXG4gICAgICBjbWRIYW5kbGVkQnlbcGx1Z2luLm5hbWVdID0gZmFsc2U7IC8vIHdlIHNlZSBhIG5ldyBwbHVnaW4sIHNvIGFkZCBpdCB0byB0aGUgJ2NtZEhhbmRsZWRCeScgb2JqZWN0XG4gICAgICBuZXh0ID0gKChfbmV4dCkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICBsb2cuaW5mbyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGlzIG5vdyBoYW5kbGluZyBjbWQgJyR7Y21kfSdgKTtcbiAgICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IHRydWU7IC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgdGhpcyBwbHVnaW4gaGFzIGF0dGVtcHRlZCB0byBoYW5kbGUgY21kXG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBjb21tYW5kIHZpYSBhIGNvbW1hbmQtc3BlY2lmaWMgaGFuZGxlciBvbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmIChwbHVnaW5bY21kXSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW5bY21kXShfbmV4dCwgZHJpdmVyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UsIGNhbGwgdGhlIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW4uaGFuZGxlKF9uZXh0LCBkcml2ZXIsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9KShuZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIGxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQgKHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pIHtcbiAgICBpZiAoIXBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZGF5LCB3ZSBoYXZlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cCBnZXR0aW5nXG4gICAgLy8gdGhlaXIgY29kZSBydW4gYXMgcGFydCBvZiBoYW5kbGluZyB0aGlzIGNvbW1hbmQuIEJlY2F1c2UgcGx1Z2lucyBjYW4gY2hvb3NlICpub3QqIHRvXG4gICAgLy8gcGFzcyBjb250cm9sIHRvIG90aGVyIHBsdWdpbnMgb3IgdG8gdGhlIGRlZmF1bHQgZHJpdmVyIGJlaGF2aW9yLCB0aGlzIGlzIGluZm9ybWF0aW9uXG4gICAgLy8gd2hpY2ggaXMgcHJvYmFibHkgdXNlZnVsIHRvIHRoZSB1c2VyIChlc3BlY2lhbGx5IGluIHNpdHVhdGlvbnMgd2hlcmUgcGx1Z2lucyBtaWdodCBub3RcbiAgICAvLyBpbnRlcmFjdCB3ZWxsIHRvZ2V0aGVyLCBhbmQgaXQgd291bGQgYmUgaGFyZCB0byBkZWJ1ZyBvdGhlcndpc2Ugd2l0aG91dCB0aGlzIGtpbmQgb2ZcbiAgICAvLyBtZXNzYWdlKS5cbiAgICBjb25zdCBkaWRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBjb25zdCBkaWRudEhhbmRsZSA9IE9iamVjdC5rZXlzKGNtZEhhbmRsZWRCeSkuZmlsdGVyKChrKSA9PiAhY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBpZiAoZGlkbnRIYW5kbGUubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLmluZm8oYENvbW1hbmQgJyR7Y21kfScgd2FzICpub3QqIGhhbmRsZWQgYnkgdGhlIGZvbGxvd2luZyBiZWhhdmlvdXJzIG9yIHBsdWdpbnMsIGV2ZW4gYCArXG4gICAgICAgICAgICAgICBgdGhvdWdoIHRoZXkgd2VyZSByZWdpc3RlcmVkIHRvIGhhbmRsZSBpdDogJHtKU09OLnN0cmluZ2lmeShkaWRudEhhbmRsZSl9LiBUaGUgYCArXG4gICAgICAgICAgICAgICBgY29tbWFuZCAqd2FzKiBoYW5kbGVkIGJ5IHRoZXNlOiAke0pTT04uc3RyaW5naWZ5KGRpZEhhbmRsZSl9LmApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXcmFwcGVkQ29tbWFuZCAoe3dyYXBwZWRDbWQsIHByb3RvY29sfSkge1xuICAgIGxldCBjbWRSZXMsIGNtZEVyciwgcmVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGB3cmFwcGVkQ21kYCBkZWZpbmVzIGEgd2hvbGUgc2VxdWVuY2Ugb2YgcGx1Z2luIGhhbmRsZXJzLCBjdWxtaW5hdGluZyBpblxuICAgICAgLy8gb3VyIGRlZmF1bHQgaGFuZGxlci4gV2hhdGV2ZXIgaXQgcmV0dXJucyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICAgICAgLy8gdXNlci5cbiAgICAgIGNtZFJlcyA9IGF3YWl0IHdyYXBwZWRDbWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbWRFcnIgPSBlO1xuICAgIH1cblxuICAgIC8vIFNhZGx5LCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCBraW5kIG9mIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLiBJdCB3aWxsIGVpdGhlciBiZSBhIGJhcmVcbiAgICAvLyBvYmplY3QsIG9yIGEgcHJvdG9jb2wtYXdhcmUgb2JqZWN0IHdpdGggcHJvdG9jb2wgYW5kIGVycm9yL3ZhbHVlIGtleXMuIFNvIHdlIG5lZWQgdG8gc25pZmZcbiAgICAvLyBpdCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGRvdWJsZS13cmFwIGl0IGlmIGl0J3MgdGhlIGxhdHRlciBraW5kLlxuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY21kUmVzKSAmJiBfLmhhcyhjbWRSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICByZXMgPSBjbWRSZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy52YWx1ZSA9IGNtZFJlcztcbiAgICAgIHJlcy5lcnJvciA9IGNtZEVycjtcbiAgICAgIHJlcy5wcm90b2NvbCA9IHByb3RvY29sO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uID8gZHN0U2Vzc2lvbi5nZXRQcm94eUF2b2lkTGlzdCgpIDogW107XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLmNhblByb3h5KHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gaGVscCBkZWNpZGUgd2hpY2ggY29tbWFuZHMgc2hvdWxkIGJlIHByb3hpZWQgdG8gc3ViLWRyaXZlcnMgYW5kIHdoaWNoXG4vLyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzLCBvdXIgdW1icmVsbGEgZHJpdmVyXG5mdW5jdGlvbiBpc0FwcGl1bURyaXZlckNvbW1hbmQgKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09ICdkZWxldGVTZXNzaW9uJztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBBcHBpdW0gdHJpZWQgdG8gcHJveHkgYSBjb21tYW5kIHVzaW5nIGEgZHJpdmVyJ3MgYHByb3h5Q29tbWFuZGAgbWV0aG9kIGJ1dCB0aGVcbiAqIG1ldGhvZCBkaWQgbm90IGV4aXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9OT19EUklWRVJfUFJPWFlDT01NQU5EJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoYFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIGNvbW1hbmQgd2FzIHRvIHByb3h5LCBidXQgdGhlIGRyaXZlciBgICtcbiAgICAgICAgICBgZGlkIG5vdCBoYXZlIHRoZSAncHJveHlDb21tYW5kJyBtZXRob2QgZGVmaW5lZC4gVG8gZnVsbHkgc3VwcG9ydCBgICtcbiAgICAgICAgICBgcGx1Z2lucywgZHJpdmVycyBzaG91bGQgaGF2ZSAncHJveHlDb21tYW5kJyBzZXQgdG8gYSBqd3BQcm94eSBvYmplY3QncyBgICtcbiAgICAgICAgICBgJ2NvbW1hbmQoKScgbWV0aG9kLCBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsICdwcm94eVJlcVJlcydgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBcHBpdW1Ecml2ZXIgfTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXRpY0V4dE1lbWJlcnNcbiAqIEBwcm9wZXJ0eSB7KGFwcDogaW1wb3J0KCdleHByZXNzJykuRXhwcmVzcywgaHR0cFNlcnZlcjogaW1wb3J0KCdodHRwJykuU2VydmVyKSA9PiBpbXBvcnQoJ3R5cGUtZmVzdCcpLlByb21pc2FibGU8dm9pZD59IFt1cGRhdGVTZXJ2ZXJdXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnQGFwcGl1bS9iYXNlLWRyaXZlcicpLk1ldGhvZE1hcH0gW25ld01ldGhvZE1hcF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXRpY1BsdWdpbk1lbWJlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbHVnaW5OYW1lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd0eXBlLWZlc3QnKS5DbGFzczx1bmtub3duPiAmIFN0YXRpY1BsdWdpbk1lbWJlcnMgJiBTdGF0aWNFeHRNZW1iZXJzfSBQbHVnaW5FeHRlbnNpb25DbGFzc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgndHlwZS1mZXN0JykuQ2xhc3M8dW5rbm93bj4gJiBTdGF0aWNFeHRNZW1iZXJzfSBEcml2ZXJFeHRlbnNpb25DbGFzc1xuICovXG4iXSwiZmlsZSI6ImxpYi9hcHBpdW0uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
570
+ exports.NoDriverProxyCommandError = NoDriverProxyCommandError;
571
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsIk9iamVjdCIsImZyZWV6ZSIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkRyaXZlckNvcmUiLCJzZXNzaW9ucyIsInBlbmRpbmdEcml2ZXJzIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImRyaXZlckNvbmZpZyIsInNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInRtcERpciIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fVE1QX0RJUiIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImFyZ3MiLCJjYXRjaCIsImVyciIsImxvZyIsImRlYnVnIiwiX2xvZyIsImluc3RhbmNlTmFtZSIsIm5hbWUiLCJub2RlIiwiZ2V0T2JqZWN0SWQiLCJzdWJzdHJpbmciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJpc0NvbW1hbmRzUXVldWVFbmFibGVkIiwic2Vzc2lvbkV4aXN0cyIsInNlc3Npb25JZCIsImRzdFNlc3Npb24iLCJkcml2ZXJGb3JTZXNzaW9uIiwiZ2V0U3RhdHVzIiwiYnVpbGQiLCJfIiwiY2xvbmUiLCJnZXRTZXNzaW9ucyIsImFjcXVpcmUiLCJ0b1BhaXJzIiwibWFwIiwiaWQiLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJjYXBzIiwicHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IiwiZHJpdmVyTmFtZSIsImRyaXZlclZlcnNpb24iLCJkcml2ZXJCYXNlVmVyc2lvbiIsImluZm8iLCJBUFBJVU1fVkVSIiwiYmFzZVZlcnNpb24iLCJhc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24iLCJleHRUeXBlIiwiZXh0TmFtZSIsImV4dEluc3RhbmNlIiwiYWxsQ2xpQXJnc0ZvckV4dCIsImlzRW1wdHkiLCJkZWZhdWx0cyIsImNsaUFyZ3MiLCJvbWl0QnkiLCJ2YWx1ZSIsImtleSIsImlzRXF1YWwiLCJjcmVhdGVTZXNzaW9uIiwianNvbndwQ2FwcyIsInJlcUNhcHMiLCJ3M2NDYXBhYmlsaXRpZXMiLCJkcml2ZXJEYXRhIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImNsb25lRGVlcCIsImRlZmF1bHRTZXR0aW5ncyIsImp3cFNldHRpbmdzIiwidzNjU2V0dGluZ3MiLCJhbHdheXNNYXRjaCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJhc3NpZ24iLCJwcm90b2NvbCIsImlubmVyU2Vzc2lvbklkIiwiZENhcHMiLCJwYXJzZWRDYXBzIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJlcnJvciIsIklubmVyRHJpdmVyIiwidmVyc2lvbiIsImZpbmRNYXRjaGluZ0RyaXZlciIsInNlc3Npb25PdmVycmlkZSIsImRlbGV0ZUFsbFNlc3Npb25zIiwicnVubmluZ0RyaXZlcnNEYXRhIiwib3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEiLCJkcml2ZXJJbnN0YW5jZSIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJkZW55SW5zZWN1cmUiLCJhIiwiYWxsb3dJbnNlY3VyZSIsImFzc2lnblNlcnZlciIsImFkZHJlc3MiLCJwb3J0IiwiYmFzZVBhdGgiLCJjdXJTZXNzaW9uRGF0YUZvckRyaXZlciIsImUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwibWVzc2FnZSIsImNvbXBhY3QiLCJkcnYiLCJwdXNoIiwicHVsbCIsImF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiaXNXM0NQcm90b2NvbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1cGRhdGVTZXR0aW5ncyIsImlzTWpzb253cFByb3RvY29sIiwib25TaHV0ZG93biIsImNhdXNlIiwiRXJyb3IiLCJ3YXJuIiwicGx1Z2luIiwiaXNGdW5jdGlvbiIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZGF0YSIsInZhbHVlcyIsImZpbHRlciIsInMiLCJkYXR1bSIsImRlbGV0ZVNlc3Npb24iLCJvdGhlclNlc3Npb25zRGF0YSIsImN1ckNvbnN0cnVjdG9yTmFtZSIsInNlc3Npb25zQ291bnQiLCJzaXplIiwiZm9yY2UiLCJyZWFzb24iLCJ1dGlsIiwicGx1cmFsaXplIiwiY2xlYW51cFByb21pc2VzIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwiY2xlYW51cFByb21pc2UiLCJwbHVnaW5zRm9yU2Vzc2lvbiIsImNyZWF0ZVBsdWdpbkluc3RhbmNlcyIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJoYW5kbGUiLCJQbHVnaW5DbGFzcyIsInBsdWdpbk5hbWUiLCJleGVjdXRlQ29tbWFuZCIsImlzR2V0U3RhdHVzIiwiR0VUX1NUQVRVU19DT01NQU5EIiwiaXNEZWxldGVTZXNzaW9uIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJyZXFGb3JQcm94eSIsImxhc3QiLCJwb3AiLCJwbHVnaW5zIiwiY21kSGFuZGxlZEJ5IiwiZGVmYXVsdCIsImRlZmF1bHRCZWhhdmlvciIsImxlbmd0aCIsInByb3h5Q29tbWFuZCIsIk5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IiLCJvcmlnaW5hbFVybCIsIm1ldGhvZCIsImJvZHkiLCJCYXNlRHJpdmVyIiwicHJvdG90eXBlIiwiY2FsbCIsIndyYXBwZWRDbWQiLCJ3cmFwQ29tbWFuZFdpdGhQbHVnaW5zIiwibmV4dCIsInJlcyIsImV4ZWN1dGVXcmFwcGVkQ29tbWFuZCIsImxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQiLCJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiZmlyc3QiLCJfbmV4dCIsImRpZEhhbmRsZSIsImsiLCJkaWRudEhhbmRsZSIsImNtZFJlcyIsImNtZEVyciIsImlzUGxhaW5PYmplY3QiLCJoYXMiLCJwcm94eUFjdGl2ZSIsImdldFByb3h5QXZvaWRMaXN0IiwiY2FuUHJveHkiLCJjb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQU1BLE1BQU1BLDRCQUE0QixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNqREMsRUFBQUEsY0FBYyxFQUFFO0FBQ2RDLElBQUFBLFFBQVEsRUFBRSxJQURJO0FBRWRDLElBQUFBLFFBQVEsRUFBRTtBQUZJLEdBRGlDO0FBS2pEQyxFQUFBQSxZQUFZLEVBQUU7QUFDWkYsSUFBQUEsUUFBUSxFQUFFLElBREU7QUFFWkMsSUFBQUEsUUFBUSxFQUFFO0FBRkU7QUFMbUMsQ0FBZCxDQUFyQztBQVdBLE1BQU1FLGlCQUFpQixHQUFHLElBQUlDLGtCQUFKLEVBQTFCO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSUQsa0JBQUosRUFBNUI7O0FBS0EsTUFBTUUsWUFBTixTQUEyQkMsc0JBQTNCLENBQXNDO0FBT3BDQyxFQUFBQSxRQUFRLEdBQUcsRUFBSDtBQVFSQyxFQUFBQSxjQUFjLEdBQUcsRUFBSDtBQU9kQyxFQUFBQSxtQkFBbUIsR0FBRyxDQUFIO0FBTW5CQyxFQUFBQSxhQUFhLEdBQUcsRUFBSDtBQU1iQyxFQUFBQSxjQUFjLEdBQUcsRUFBSDtBQU1kQyxFQUFBQSxrQkFBa0IsR0FBRyxFQUFIO0FBR2xCQyxFQUFBQSxZQUFZO0FBR1pDLEVBQUFBLE1BQU07O0FBS05DLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRO0FBS2pCLFFBQUlBLElBQUksQ0FBQ0MsTUFBVCxFQUFpQjtBQUNmQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsY0FBWixHQUE2QkosSUFBSSxDQUFDQyxNQUFs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O0FBQ3RCLFVBQU1DLFVBQVUsR0FBRyxLQUFLL0IsUUFBTCxDQUFjOEIsU0FBZCxDQUFuQjtBQUNBLFdBQU9DLFVBQVUsSUFBSUksZ0JBQUV3RixVQUFGLENBQWE1RixVQUFVLENBQUNnSyxXQUF4QixDQUFkLElBQXNEaEssVUFBVSxDQUFDZ0ssV0FBWCxDQUF1QmpLLFNBQXZCLENBQTdEO0FBQ0Q7O0FBRURrSyxFQUFBQSxpQkFBaUIsQ0FBRWxLLFNBQUYsRUFBYTtBQUM1QixVQUFNQyxVQUFVLEdBQUcsS0FBSy9CLFFBQUwsQ0FBYzhCLFNBQWQsQ0FBbkI7QUFDQSxXQUFPQyxVQUFVLEdBQUdBLFVBQVUsQ0FBQ2lLLGlCQUFYLEVBQUgsR0FBb0MsRUFBckQ7QUFDRDs7QUFFREMsRUFBQUEsUUFBUSxDQUFFbkssU0FBRixFQUFhO0FBQ25CLFVBQU1DLFVBQVUsR0FBRyxLQUFLL0IsUUFBTCxDQUFjOEIsU0FBZCxDQUFuQjtBQUNBLFdBQU9DLFVBQVUsSUFBSUEsVUFBVSxDQUFDa0ssUUFBWCxDQUFvQm5LLFNBQXBCLENBQXJCO0FBQ0Q7O0FBenFCbUM7Ozs7QUE4cUJ0QyxTQUFTK0gscUJBQVQsQ0FBZ0NYLEdBQWhDLEVBQXFDO0FBQ25DLFNBQU8sQ0FBQyxrQ0FBaUJBLEdBQWpCLENBQUQsSUFBMEJBLEdBQUcsS0FBSyxlQUF6QztBQUNEOztBQU1NLE1BQU1zQix5QkFBTixTQUF3Q2hELEtBQXhDLENBQThDO0FBSW5EMEUsRUFBQUEsSUFBSSxHQUFHLGtDQUFIOztBQUVKMUwsRUFBQUEsV0FBVyxHQUFJO0FBQ2IsVUFBTyxxRUFBRCxHQUNDLG1FQURELEdBRUMseUVBRkQsR0FHQyw2REFIUDtBQUlEOztBQVhrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZ2V0QnVpbGRJbmZvLCB1cGRhdGVCdWlsZEluZm8sIEFQUElVTV9WRVIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBEcml2ZXJDb3JlLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQsXG4gICAgICAgICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELCBERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBHRVRfU1RBVFVTX0NPTU1BTkRcbn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIHB1bGxTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdXRpbCwgbm9kZSwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG4vKipcbiAqIEludmFyaWFudCBzZXQgb2YgYmFzZSBjb25zdHJhaW50c1xuICogQHR5cGUge1JlYWRvbmx5PENvbnN0cmFpbnRzPn1cbiAqL1xuY29uc3QgZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyA9IE9iamVjdC5mcmVlemUoe1xuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBwbGF0Zm9ybU5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5jb25zdCBzZXNzaW9uc0xpc3RHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IHBlbmRpbmdEcml2ZXJzR3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5cbi8qKlxuICogQGltcGxlbWVudHMge1Nlc3Npb25IYW5kbGVyfVxuICovXG5jbGFzcyBBcHBpdW1Ecml2ZXIgZXh0ZW5kcyBEcml2ZXJDb3JlIHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0byBzZXNzaW9ucyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAqIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsRXh0ZXJuYWxEcml2ZXI+fVxuICAgKi9cbiAgc2Vzc2lvbnMgPSB7fTtcblxuICAvKipcbiAgICogQWNjZXNzIHRvIHBlbmRpbmcgZHJpdmVycyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAqIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsRXh0ZXJuYWxEcml2ZXJbXT59XG4gICAqL1xuICBwZW5kaW5nRHJpdmVycyA9IHt9O1xuXG4gIC8qKlxuICAgKiBOb3RlIHRoYXQge0BsaW5rY29kZSBBcHBpdW1Ecml2ZXJ9IGhhcyBubyBgbmV3Q29tbWFuZFRpbWVvdXRgIG1ldGhvZC5cbiAgICogYEFwcGl1bURyaXZlcmAgZG9lcyBub3Qgc2V0IGFuZCBvYnNlcnZlIGl0cyBvd24gdGltZW91dHM7IGluZGl2aWR1YWxcbiAgICogc2Vzc2lvbnMgKG1hbmFnZWQgZHJpdmVycykgZG8gaW5zdGVhZC5cbiAgICovXG4gIG5ld0NvbW1hbmRUaW1lb3V0TXMgPSAwO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFjdGl2ZSBwbHVnaW5zXG4gICAqIEB0eXBlIHtQbHVnaW5DbGFzc1tdfVxuICAgKi9cbiAgcGx1Z2luQ2xhc3NlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBtYXAgb2Ygc2Vzc2lvbnMgdG8gYWN0dWFsIHBsdWdpbiBpbnN0YW5jZXMgcGVyIHNlc3Npb25cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsSW5zdGFuY2VUeXBlPFBsdWdpbkNsYXNzPltdPn1cbiAgICovXG4gIHNlc3Npb25QbHVnaW5zID0ge307XG5cbiAgLyoqXG4gICAqIHNvbWUgY29tbWFuZHMgYXJlIHNlc3Npb25sZXNzLCBzbyB3ZSBuZWVkIGEgc2V0IG9mIHBsdWdpbnMgZm9yIHRoZW1cbiAgICogQHR5cGUge0luc3RhbmNlVHlwZTxQbHVnaW5DbGFzcz5bXX1cbiAgICovXG4gIHNlc3Npb25sZXNzUGx1Z2lucyA9IFtdOztcblxuICAvKiogQHR5cGUge0RyaXZlckNvbmZpZ30gKi9cbiAgZHJpdmVyQ29uZmlnO1xuXG4gIC8qKiBAdHlwZSB7QXBwaXVtU2VydmVyfSAqL1xuICBzZXJ2ZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RHJpdmVyT3B0c30gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc2V0IGAtLXRtcGAgaGVyZSBzaW5jZSBpdCBzaG91bGQgYmUgc2V0IHRvXG4gICAgLy8gcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgb25jZSBhdCBhbiBpbml0aWFsIHBvaW50IGluIHRoZSBBcHBpdW0gbGlmZWN5Y2xlLlxuICAgIC8vIFRoZSBwcm9jZXNzIGFyZ3VtZW50IHdpbGwgYmUgcmVmZXJlbmNlZCBieSBCYXNlRHJpdmVyLlxuICAgIC8vIFBsZWFzZSBjYWxsIEBhcHBpdW0vc3VwcG9ydC50ZW1wRGlyIG1vZHVsZSB0byBhcHBseSB0aGlzIGJlbmVmaXQuXG4gICAgaWYgKG9wdHMudG1wRGlyKSB7XG4gICAgICBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiA9IG9wdHMudG1wRGlyO1xuICAgIH1cblxuICAgIHN1cGVyKG9wdHMpO1xuXG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzO1xuXG4gICAgdGhpcy5hcmdzID0gey4uLm9wdHN9O1xuXG4gICAgLy8gYWxsb3cgdGhpcyB0byBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vIGBhd2FpdGBcbiAgICAvLyBjYXRjaCB0aGlzIHRvIGF2b2lkIGFuIHVuaGFuZGxlZCByZWplY3Rpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlbixwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgICB1cGRhdGVCdWlsZEluZm8oKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlcnIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IHVtYnJlbGxhIGRyaXZlciBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IGxvZyAoKSB7XG4gICAgaWYgKCF0aGlzLl9sb2cpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKHRoaXMpLnN1YnN0cmluZygwLCA0KX1gO1xuICAgICAgdGhpcy5fbG9nID0gbG9nZ2VyLmdldExvZ2dlcihpbnN0YW5jZU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nO1xuICB9XG5cblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgcmV0dXJuIF8udG9QYWlycyhzZXNzaW9ucylcbiAgICAgIC5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtpZCwgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2Fwc30pKTtcbiAgfVxuXG4gIHByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCAoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbiwgZHJpdmVyQmFzZVZlcnNpb24pIHtcbiAgICB0aGlzLmxvZy5pbmZvKGRyaXZlclZlcnNpb25cbiAgICAgID8gYEFwcGl1bSB2JHtBUFBJVU1fVkVSfSBjcmVhdGluZyBuZXcgJHtkcml2ZXJOYW1lfSAodiR7ZHJpdmVyVmVyc2lvbn0pIHNlc3Npb25gXG4gICAgICA6IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gc2Vzc2lvbmBcbiAgICApO1xuICAgIHRoaXMubG9nLmluZm8oYENoZWNraW5nIEJhc2VEcml2ZXIgdmVyc2lvbnMgZm9yIEFwcGl1bSBhbmQgJHtkcml2ZXJOYW1lfWApO1xuICAgIHRoaXMubG9nLmluZm8oQXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgICB0aGlzLmxvZy5pbmZvKGRyaXZlckJhc2VWZXJzaW9uXG4gICAgICA/IGAke2RyaXZlck5hbWV9J3MgQmFzZURyaXZlciB2ZXJzaW9uIGlzICR7ZHJpdmVyQmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSAke2RyaXZlck5hbWV9J3MgQmFzZURyaXZlciB2ZXJzaW9uYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIGFzc2lnbiBDTEkgYXJncyBmb3IgYSBkcml2ZXIgb3IgcGx1Z2luXG4gICAqXG4gICAqIElmIHRoZSBleHRlbnNpb24gaGFzIHByb3ZpZGVkIGEgc2NoZW1hLCB2YWxpZGF0aW9uIGhhcyBhbHJlYWR5IGhhcHBlbmVkLlxuICAgKlxuICAgKiBBbnkgYXJnIHdoaWNoIGlzIGVxdWFsIHRvIGl0cyBkZWZhdWx0IHZhbHVlIHdpbGwgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSBleHRlbnNpb24uXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAnZHJpdmVyJyBvciAncGx1Z2luJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRJbnN0YW5jZSB0aGUgZHJpdmVyIG9yIHBsdWdpbiBpbnN0YW5jZVxuICAgKi9cbiAgYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lLCBleHRJbnN0YW5jZSkge1xuICAgIGNvbnN0IGFsbENsaUFyZ3NGb3JFeHQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsdW5rbm93bj58dW5kZWZpbmVkfSAqLyh0aGlzLmFyZ3NbZXh0VHlwZV0/LltleHROYW1lXSk7XG4gICAgaWYgKCFfLmlzRW1wdHkoYWxsQ2xpQXJnc0ZvckV4dCkpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRzID0gZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24oZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgICBjb25zdCBjbGlBcmdzID0gXy5pc0VtcHR5KGRlZmF1bHRzKVxuICAgICAgICA/IGFsbENsaUFyZ3NGb3JFeHRcbiAgICAgICAgOiBfLm9taXRCeShhbGxDbGlBcmdzRm9yRXh0LCAodmFsdWUsIGtleSkgPT4gXy5pc0VxdWFsKGRlZmF1bHRzW2tleV0sIHZhbHVlKSk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShjbGlBcmdzKSkge1xuICAgICAgICBleHRJbnN0YW5jZS5jbGlBcmdzID0gY2xpQXJncztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHNlc3Npb25cbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IGpzb253cENhcHMgSlNPTldQIGZvcm1hdHRlZCBkZXNpcmVkIGNhcGFiaWxpdGllc1xuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gcmVxQ2FwcyBSZXF1aXJlZCBjYXBhYmlsaXRpZXMgKEpTT05XUCBzdGFuZGFyZClcbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IHczY0NhcGFiaWxpdGllcyBXM0MgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyRGF0YVtdfSBbZHJpdmVyRGF0YV1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGpzb253cENhcHMsIHJlcUNhcHMsIHczY0NhcGFiaWxpdGllcywgZHJpdmVyRGF0YSkge1xuICAgIGNvbnN0IGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh0aGlzLmFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZGVmYXVsdFNldHRpbmdzID0gcHVsbFNldHRpbmdzKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGpzb253cENhcHMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBzKTtcbiAgICBjb25zdCBqd3BTZXR0aW5ncyA9IHsuLi5kZWZhdWx0U2V0dGluZ3MsIC4uLnB1bGxTZXR0aW5ncyhqc29ud3BDYXBzKX07XG4gICAgdzNjQ2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAodzNjQ2FwYWJpbGl0aWVzKTtcbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjbGllbnQgb25seSBwcm92aWRlcyBjYXBzIHVzaW5nIEpTT05XUCBzdGFuZGFyZCxcbiAgICAvLyBhbHRob3VnaCBmaXJzdE1hdGNoL2Fsd2F5c01hdGNoIHByb3BlcnRpZXMgYXJlIHN0aWxsIHByZXNlbnQuXG4gICAgLy8gSW4gc3VjaCBjYXNlIHdlIGFzc3VtZSB0aGUgY2xpZW50IHVuZGVyc3RhbmRzIFczQyBwcm90b2NvbCBhbmQgbWVyZ2UgdGhlIGdpdmVuXG4gICAgLy8gSlNPTldQIGNhcHMgdG8gVzNDIGNhcHNcbiAgICBjb25zdCB3M2NTZXR0aW5ncyA9IHtcbiAgICAgIC4uLmp3cFNldHRpbmdzLFxuICAgICAgLi4ucHVsbFNldHRpbmdzKCh3M2NDYXBhYmlsaXRpZXMgPz8ge30pLmFsd2F5c01hdGNoID8/IHt9KVxuICAgIH07XG4gICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKCh3M2NDYXBhYmlsaXRpZXMgPz8ge30pLmZpcnN0TWF0Y2ggPz8gW10pKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHczY1NldHRpbmdzLCBwdWxsU2V0dGluZ3MoZmlyc3RNYXRjaEVudHJ5KSk7XG4gICAgfVxuXG4gICAgbGV0IHByb3RvY29sO1xuICAgIGxldCBpbm5lclNlc3Npb25JZCwgZENhcHM7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFBhcnNlIHRoZSBjYXBzIGludG8gYSBmb3JtYXQgdGhhdCB0aGUgSW5uZXJEcml2ZXIgd2lsbCBhY2NlcHRcbiAgICAgIGNvbnN0IHBhcnNlZENhcHMgPSBwYXJzZUNhcHNGb3JJbm5lckRyaXZlcihcbiAgICAgICAganNvbndwQ2FwcyxcbiAgICAgICAgdzNjQ2FwYWJpbGl0aWVzLFxuICAgICAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyxcbiAgICAgICAgZGVmYXVsdENhcGFiaWxpdGllc1xuICAgICAgKTtcblxuICAgICAgY29uc3Qge2Rlc2lyZWRDYXBzLCBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllc30gPSAvKiogQHR5cGUge2ltcG9ydCgnLi91dGlscycpLlBhcnNlZERyaXZlckNhcHN9ICovKHBhcnNlZENhcHMpO1xuICAgICAgcHJvdG9jb2wgPSBwYXJzZWRDYXBzLnByb3RvY29sO1xuICAgICAgY29uc3QgZXJyb3IgPSAvKiogQHR5cGUge2ltcG9ydCgnLi91dGlscycpLkludmFsaWRDYXBzfSAqLyhwYXJzZWRDYXBzKS5lcnJvcjtcbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZVxuICAgICAgfSA9IHRoaXMuZHJpdmVyQ29uZmlnLmZpbmRNYXRjaGluZ0RyaXZlcihkZXNpcmVkQ2Fwcyk7XG4gICAgICB0aGlzLnByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudChJbm5lckRyaXZlci5uYW1lLCBkcml2ZXJWZXJzaW9uLCBJbm5lckRyaXZlci5iYXNlVmVyc2lvbik7XG5cbiAgICAgIGlmICh0aGlzLmFyZ3Muc2Vzc2lvbk92ZXJyaWRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQWxsU2Vzc2lvbnMoKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7RHJpdmVyRGF0YVtdfVxuICAgICAgICovXG4gICAgICBsZXQgcnVubmluZ0RyaXZlcnNEYXRhID0gW107XG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHtEcml2ZXJEYXRhW119XG4gICAgICAgKi9cbiAgICAgIGxldCBvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSA9IFtdO1xuXG4gICAgICBjb25zdCBkcml2ZXJJbnN0YW5jZSA9IG5ldyBJbm5lckRyaXZlcih0aGlzLmFyZ3MsIHRydWUpO1xuXG4gICAgICAvLyBXZSB3YW50IHRvIGFzc2lnbiBzZWN1cml0eSB2YWx1ZXMgZGlyZWN0bHkgb24gdGhlIGRyaXZlci4gVGhlIGRyaXZlclxuICAgICAgLy8gc2hvdWxkIG5vdCByZWFkIHNlY3VyaXR5IHZhbHVlcyBmcm9tIGB0aGlzLm9wdHNgIGJlY2F1c2UgdGhvc2UgdmFsdWVzXG4gICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gc2V0IGJ5IGEgbWFsaWNpb3VzIHVzZXIgdmlhIGNhcGFiaWxpdGllcywgd2hlcmVhcyB3ZVxuICAgICAgLy8gd2FudCBhIGd1YXJhbnRlZSB0aGUgdmFsdWVzIHdlcmUgc2V0IGJ5IHRoZSBhcHBpdW0gc2VydmVyIGFkbWluXG4gICAgICBpZiAodGhpcy5hcmdzLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwbHlpbmcgcmVsYXhlZCBzZWN1cml0eSB0byAnJHtJbm5lckRyaXZlci5uYW1lfScgYXMgcGVyIGAgK1xuICAgICAgICAgIGBzZXJ2ZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiBBbGwgaW5zZWN1cmUgZmVhdHVyZXMgd2lsbCBiZSBgICtcbiAgICAgICAgICBgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSAtLWRlbnktaW5zZWN1cmVgKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5kZW55SW5zZWN1cmUpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0V4cGxpY2l0bHkgcHJldmVudGluZyB1c2Ugb2YgaW5zZWN1cmUgZmVhdHVyZXM6Jyk7XG4gICAgICAgIHRoaXMuYXJncy5kZW55SW5zZWN1cmUubWFwKChhKSA9PiB0aGlzLmxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuZGVueUluc2VjdXJlID0gdGhpcy5hcmdzLmRlbnlJbnNlY3VyZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcmdzLmFsbG93SW5zZWN1cmUpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0V4cGxpY2l0bHkgZW5hYmxpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZS5tYXAoKGEpID0+IHRoaXMubG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5hbGxvd0luc2VjdXJlID0gdGhpcy5hcmdzLmFsbG93SW5zZWN1cmU7XG4gICAgICB9XG5cbiAgICAgIC8vIExpa2V3aXNlLCBhbnkgZHJpdmVyLXNwZWNpZmljIENMSSBhcmdzIHRoYXQgd2VyZSBwYXNzZWQgaW4gc2hvdWxkIGJlIGFzc2lnbmVkIGRpcmVjdGx5IHRvXG4gICAgICAvLyB0aGUgZHJpdmVyIHNvIHRoYXQgdGhleSBjYW5ub3QgYmUgbWltaWNrZWQgYnkgYSBtYWxpY2lvdXMgdXNlciBzZW5kaW5nIGluIGNhcGFiaWxpdGllc1xuICAgICAgdGhpcy5hc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24oJ2RyaXZlcicsIGRyaXZlck5hbWUsIGRyaXZlckluc3RhbmNlKTtcblxuXG4gICAgICAvLyBUaGlzIGFzc2lnbm1lbnQgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3Qgd2ViIHNvY2tldHMgZnVuY3Rpb25hbGl0eSBpbnNpZGUgdGhlIGRyaXZlclxuICAgICAgLy8gRHJpdmVycy9wbHVnaW5zIG1pZ2h0IGFsc28gd2FudCB0byBrbm93IHdoZXJlIHRoZXkgYXJlIGhvc3RlZFxuICAgICAgZHJpdmVySW5zdGFuY2UuYXNzaWduU2VydmVyKHRoaXMuc2VydmVyLCB0aGlzLmFyZ3MuYWRkcmVzcywgdGhpcy5hcmdzLnBvcnQsIHRoaXMuYXJncy5iYXNlUGF0aCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bm5pbmdEcml2ZXJzRGF0YSA9IGF3YWl0IHRoaXMuY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIoSW5uZXJEcml2ZXIpID8/IFtdO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdID0gdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSB8fCBbXTtcbiAgICAgICAgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEgPSBfLmNvbXBhY3QodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5tYXAoKGRydikgPT4gZHJ2LmRyaXZlckRhdGEpKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5wdXNoKGRyaXZlckluc3RhbmNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzXSA9IGF3YWl0IGRyaXZlckluc3RhbmNlLmNyZWF0ZVNlc3Npb24oXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHJlcUNhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIFsuLi5ydW5uaW5nRHJpdmVyc0RhdGEsIC4uLm90aGVyUGVuZGluZ0RyaXZlcnNEYXRhXVxuICAgICAgICApO1xuICAgICAgICBwcm90b2NvbCA9IGRyaXZlckluc3RhbmNlLnByb3RvY29sO1xuICAgICAgICBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF0gPSBkcml2ZXJJbnN0YW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICBfLnB1bGwodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSwgZHJpdmVySW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyKGRyaXZlckluc3RhbmNlLCBpbm5lclNlc3Npb25JZCk7XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYE5ldyAke0lubmVyRHJpdmVyLm5hbWV9IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHksIHNlc3Npb24gYCArXG4gICAgICAgIGAke2lubmVyU2Vzc2lvbklkfSBhZGRlZCB0byBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG5cbiAgICAgIC8vIHNldCB0aGUgTmV3IENvbW1hbmQgVGltZW91dCBmb3IgdGhlIGlubmVyIGRyaXZlclxuICAgICAgZHJpdmVySW5zdGFuY2Uuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgICAvLyBhcHBseSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgKGlmIHByb3ZpZGVkKVxuICAgICAgaWYgKGRyaXZlckluc3RhbmNlLmlzVzNDUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KHczY1NldHRpbmdzKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHBseWluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIHBhcnNlZCBmcm9tIFczQyBjYXBzOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh3M2NTZXR0aW5ncykpO1xuICAgICAgICBhd2FpdCBkcml2ZXJJbnN0YW5jZS51cGRhdGVTZXR0aW5ncyh3M2NTZXR0aW5ncyk7XG4gICAgICB9IGVsc2UgaWYgKGRyaXZlckluc3RhbmNlLmlzTWpzb253cFByb3RvY29sKCkgJiYgIV8uaXNFbXB0eShqd3BTZXR0aW5ncykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBNSlNPTldQIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGp3cFNldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKGp3cFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2wsXG4gICAgICB2YWx1ZTogW2lubmVyU2Vzc2lvbklkLCBkQ2FwcywgcHJvdG9jb2xdXG4gICAgfTtcbiAgfVxuXG4gIGF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIgKGRyaXZlciwgaW5uZXJTZXNzaW9uSWQpIHtcbiAgICBjb25zdCBvblNodXRkb3duID0gKGNhdXNlID0gbmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEVuZGluZyBzZXNzaW9uLCBjYXVzZSB3YXMgJyR7Y2F1c2UubWVzc2FnZX0nYCk7XG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24ocGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBkZWZpbmVzIGFuIHVuZXhwZWN0ZWQgc2h1dGRvd24gaGFuZGxlcjsgY2FsbGluZyBpdCBub3dgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHBsdWdpbi5vblVuZXhwZWN0ZWRTaHV0ZG93bihkcml2ZXIsIGNhdXNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cud2FybihgR290IGFuIGVycm9yIHdoZW4gcnVubmluZyBwbHVnaW4gJHtwbHVnaW4ubmFtZX0gc2h1dGRvd24gaGFuZGxlcjogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAnJHtpbm5lclNlc3Npb25JZH0nIGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW2lubmVyU2Vzc2lvbklkXTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXTtcbiAgICB9O1xuXG4gICAgaWYgKF8uaXNGdW5jdGlvbihkcml2ZXIub25VbmV4cGVjdGVkU2h1dGRvd24pKSB7XG4gICAgICBkcml2ZXIub25VbmV4cGVjdGVkU2h1dGRvd24ob25TaHV0ZG93bik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEZhaWxlZCB0byBhdHRhY2ggdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24gbGlzdGVuZXIuIGAgK1xuICAgICAgICBgSXMgJ29uVW5leHBlY3RlZFNodXRkb3duJyBtZXRob2QgYXZhaWxhYmxlIGZvciAnJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0nP2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vdHlwZXMvZXh0ZW5zaW9uJykuRHJpdmVyQ2xhc3N9IElubmVyRHJpdmVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPERyaXZlckRhdGFbXT59fVxuICAgKi9cbiAgYXN5bmMgY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIgKElubmVyRHJpdmVyKSB7XG4gICAgY29uc3Qgc2Vzc2lvbnMgPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zKTtcbiAgICBjb25zdCBkYXRhID0gXy5jb21wYWN0KF8udmFsdWVzKHNlc3Npb25zKVxuICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMuY29uc3RydWN0b3IubmFtZSA9PT0gSW5uZXJEcml2ZXIubmFtZSlcbiAgICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLmRyaXZlckRhdGEpKTtcbiAgICBmb3IgKGxldCBkYXR1bSBvZiBkYXRhKSB7XG4gICAgICBpZiAoIWRhdHVtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvYmxlbSBnZXR0aW5nIHNlc3Npb24gZGF0YSBmb3IgZHJpdmVyIHR5cGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtJbm5lckRyaXZlci5uYW1lfTsgZG9lcyBpdCBpbXBsZW1lbnQgJ2dldCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBkcml2ZXJEYXRhJz9gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoc2Vzc2lvbklkKSB7XG4gICAgbGV0IHByb3RvY29sO1xuICAgIHRyeSB7XG4gICAgICBsZXQgb3RoZXJTZXNzaW9uc0RhdGE7XG4gICAgICBjb25zdCBkc3RTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJDb25zdHJ1Y3Rvck5hbWUgPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgb3RoZXJTZXNzaW9uc0RhdGEgPSBfLnRvUGFpcnModGhpcy5zZXNzaW9ucylcbiAgICAgICAgICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lID09PSBjdXJDb25zdHJ1Y3Rvck5hbWUgJiYga2V5ICE9PSBzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUuZHJpdmVyRGF0YSk7XG4gICAgICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAke3Nlc3Npb25JZH0gZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGRlbGV0ZVNlc3Npb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBvciBub3RcbiAgICAgICAgLy8gbWFrZSB0aGUgc2Vzc2lvbiB1bmF2YWlsYWJsZSwgYmVjYXVzZSB3aG8ga25vd3Mgd2hhdCBzdGF0ZSBpdCBtaWdodFxuICAgICAgICAvLyBiZSBpbiBvdGhlcndpc2VcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgcmV0dXJuIGRzdFNlc3Npb247XG4gICAgICB9KTtcbiAgICAgIC8vIHRoaXMgbWF5IG5vdCBiZSBjb3JyZWN0LCBidXQgaWYgYGRzdFNlc3Npb25gIHdhcyBmYWxzeSwgdGhlIGNhbGwgdG8gYGRlbGV0ZVNlc3Npb24oKWAgd291bGRcbiAgICAgIC8vIHRocm93IGFueXdheS5cbiAgICAgIGlmICghZHN0U2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gbm90IGZvdW5kJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgdmFsdWU6IGF3YWl0IGRzdFNlc3Npb24uZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQsIG90aGVyU2Vzc2lvbnNEYXRhKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEhhZCB0cm91YmxlIGVuZGluZyBzZXNzaW9uICR7c2Vzc2lvbklkfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3I6IGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbFNlc3Npb25zIChvcHRzID0ge30pIHtcbiAgICBjb25zdCBzZXNzaW9uc0NvdW50ID0gXy5zaXplKHRoaXMuc2Vzc2lvbnMpO1xuICAgIGlmICgwID09PSBzZXNzaW9uc0NvdW50KSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnVGhlcmUgYXJlIG5vIGFjdGl2ZSBzZXNzaW9ucyBmb3IgY2xlYW51cCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGZvcmNlID0gZmFsc2UsXG4gICAgICByZWFzb24sXG4gICAgfSA9IG9wdHM7XG4gICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ2FjdGl2ZSBzZXNzaW9uJywgc2Vzc2lvbnNDb3VudCwgdHJ1ZSl9YCk7XG4gICAgY29uc3QgY2xlYW51cFByb21pc2VzID0gZm9yY2VcbiAgICAgID8gXy52YWx1ZXModGhpcy5zZXNzaW9ucykubWFwKChkcnYpID0+IGRydi5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihyZWFzb24gJiYgbmV3IEVycm9yKHJlYXNvbikpKVxuICAgICAgOiBfLmtleXModGhpcy5zZXNzaW9ucykubWFwKChpZCkgPT4gdGhpcy5kZWxldGVTZXNzaW9uKGlkKSk7XG4gICAgZm9yIChjb25zdCBjbGVhbnVwUHJvbWlzZSBvZiBjbGVhbnVwUHJvbWlzZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBQcm9taXNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHByb3ByaWF0ZSBwbHVnaW5zIGZvciBhIHNlc3Npb24gKG9yIHNlc3Npb25sZXNzIHBsdWdpbnMpXG4gICAqXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCAob3IgbnVsbCkgdG8gdXNlIHRvIGZpbmQgcGx1Z2luc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gYXJyYXkgb2YgcGx1Z2luIGluc3RhbmNlc1xuICAgKi9cbiAgcGx1Z2luc0ZvclNlc3Npb24gKHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zKSkge1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHBsdWdpbnMgZm9yIGEgY29tbWFuZCwgd2UgZWl0aGVyIGdldCB0aGUgcGx1Z2luIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIHBhcnRpY3VsYXIgY29tbWFuZCdzIHNlc3Npb24sIG9yIGluIHRoZSBjYXNlIG9mIHNlc3Npb25sZXNzIHBsdWdpbnMsIHB1bGwgZnJvbSB0aGUgc2V0IG9mXG4gICAqIHBsdWdpbiBpbnN0YW5jZXMgcmVzZXJ2ZWQgZm9yIHNlc3Npb25sZXNzIGNvbW1hbmRzIChhbmQgd2UgbGF6aWx5IGNyZWF0ZSBwbHVnaW4gaW5zdGFuY2VzIG9uXG4gICAqIGZpcnN0IHVzZSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZCAtIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGZpbmQgYSBwbHVnaW4gdG8gaGFuZGxlXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHBhcnRpY3VsYXIgc2Vzc2lvbiBmb3Igd2hpY2ggdG8gZmluZCBhIHBsdWdpbiwgb3IgbnVsbCBpZlxuICAgKiBzZXNzaW9ubGVzc1xuICAgKi9cbiAgcGx1Z2luc1RvSGFuZGxlQ21kIChjbWQsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICAvLyB0byBoYW5kbGUgYSBnaXZlbiBjb21tYW5kLCBhIHBsdWdpbiBzaG91bGQgZWl0aGVyIGltcGxlbWVudCB0aGF0IGNvbW1hbmQgYXMgYSBwbHVnaW5cbiAgICAvLyBpbnN0YW5jZSBtZXRob2Qgb3IgaXQgc2hvdWxkIGltcGxlbWVudCBhIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgcmV0dXJuIHRoaXMucGx1Z2luc0ZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgICAgLmZpbHRlcigocCkgPT4gXy5pc0Z1bmN0aW9uKHBbY21kXSkgfHwgXy5pc0Z1bmN0aW9uKHAuaGFuZGxlKSk7XG4gIH1cblxuICBjcmVhdGVQbHVnaW5JbnN0YW5jZXMgKCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbkNsYXNzZXMubWFwKChQbHVnaW5DbGFzcykgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IFBsdWdpbkNsYXNzLnBsdWdpbk5hbWU7XG4gICAgICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luQ2xhc3MobmFtZSk7XG4gICAgICB0aGlzLmFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbigncGx1Z2luJywgbmFtZSwgcGx1Z2luKTtcbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8e3ZhbHVlOiBhbnksIGVycm9yPzogRXJyb3IsIHByb3RvY29sOiBzdHJpbmd9IHwgaW1wb3J0KCd0eXBlLWZlc3QnKS5Bc3luY1JldHVyblR5cGU8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyWydleGVjdXRlQ29tbWFuZCddPj59XG4gICAqL1xuICBhc3luYyBleGVjdXRlQ29tbWFuZCAoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gV2UgaGF2ZSBiYXNpY2FsbHkgdGhyZWUgY2FzZXMgZm9yIGhvdyB0byBoYW5kbGUgY29tbWFuZHM6XG4gICAgLy8gMS4gaGFuZGxlIGdldFN0YXR1cyAod2UgZG8gdGhpcyBhcyBhIHNwZWNpYWwgb3V0IG9mIGJhbmQgY2FzZSBzbyBpdCBkb2Vzbid0IGdldCBhZGRlZCB0byBhblxuICAgIC8vICAgIGV4ZWN1dGlvbiBxdWV1ZSwgYW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgZS5nLiBjcmVhdGVTZXNzaW9uIGlzIGluIHByb2dyZXNzKVxuICAgIC8vIDIuIGhhbmRsZSBjb21tYW5kcyB0aGF0IHRoaXMgdW1icmVsbGEgZHJpdmVyIHNob3VsZCBoYW5kbGUsIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgc2Vzc2lvblxuICAgIC8vICAgIGRyaXZlciAoZm9yIGV4YW1wbGUsIGRlbGV0ZVNlc3Npb24sIG9yIG90aGVyIG5vbi1zZXNzaW9uIGNvbW1hbmRzKVxuICAgIC8vIDMuIGhhbmRsZSBzZXNzaW9uIGRyaXZlciBjb21tYW5kcy5cbiAgICAvLyBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCBiZWNhdXNlIHdlIHN1cHBvcnQgY29tbWFuZCBwbHVnaW5zLCB3ZSBuZWVkIHRvIHdyYXAgYW55IG9mIHRoZXNlXG4gICAgLy8gY2FzZXMgd2l0aCBwbHVnaW4gaGFuZGxpbmcuXG5cbiAgICBjb25zdCBpc0dldFN0YXR1cyA9IGNtZCA9PT0gR0VUX1NUQVRVU19DT01NQU5EO1xuICAgIGNvbnN0IGlzRGVsZXRlU2Vzc2lvbiA9IGNtZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORDtcbiAgICBjb25zdCBpc1VtYnJlbGxhQ21kID0gIWlzR2V0U3RhdHVzICYmIGlzQXBwaXVtRHJpdmVyQ29tbWFuZChjbWQpO1xuICAgIGNvbnN0IGlzU2Vzc2lvbkNtZCA9ICFpc1VtYnJlbGxhQ21kIHx8IGlzRGVsZXRlU2Vzc2lvbjtcblxuICAgIC8vIGlmIGEgcGx1Z2luIG92ZXJyaWRlIHByb3h5aW5nIGZvciB0aGlzIGNvbW1hbmQgYW5kIHRoYXQgaXMgd2h5IHdlIGFyZSBoZXJlIGluc3RlYWQgb2YganVzdFxuICAgIC8vIGxldHRpbmcgdGhlIHByb3RvY29sIHByb3h5IHRoZSBjb21tYW5kIGVudGlyZWx5LCBkZXRlcm1pbmUgdGhhdCwgZ2V0IHRoZSByZXF1ZXN0IG9iamVjdCBmb3JcbiAgICAvLyB1c2UgbGF0ZXIgb24sIHRoZW4gY2xlYW4gdXAgdGhlIGFyZ3NcbiAgICBjb25zdCByZXFGb3JQcm94eSA9IF8ubGFzdChhcmdzKT8ucmVxRm9yUHJveHk7XG4gICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICBhcmdzLnBvcCgpO1xuICAgIH1cblxuXG4gICAgLy8gZmlyc3QgZG8gc29tZSBlcnJvciBjaGVja2luZy4gSWYgd2UncmUgcmVxdWVzdGluZyBhIHNlc3Npb24gY29tbWFuZCBleGVjdXRpb24sIHRoZW4gbWFrZVxuICAgIC8vIHN1cmUgdGhhdCBzZXNzaW9uIGFjdHVhbGx5IGV4aXN0cyBvbiB0aGUgc2Vzc2lvbiBkcml2ZXIsIGFuZCBzZXQgdGhlIHNlc3Npb24gZHJpdmVyIGl0c2VsZlxuICAgIGxldCBzZXNzaW9uSWQgPSBudWxsO1xuICAgIGxldCBkc3RTZXNzaW9uID0gbnVsbDtcbiAgICBsZXQgcHJvdG9jb2wgPSBudWxsO1xuICAgIC8qKiBAdHlwZSB7dGhpcyB8IEV4dGVybmFsRHJpdmVyfSAqL1xuICAgIGxldCBkcml2ZXIgPSB0aGlzO1xuICAgIGlmIChpc1Nlc3Npb25DbWQpIHtcbiAgICAgIHNlc3Npb25JZCA9IF8ubGFzdChhcmdzKTtcbiAgICAgIGRzdFNlc3Npb24gPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0pO1xuICAgICAgaWYgKCFkc3RTZXNzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNlc3Npb24gd2l0aCBpZCAnJHtzZXNzaW9uSWR9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgLy8gbm93IHNhdmUgdGhlIHJlc3BvbnNlIHByb3RvY29sIGdpdmVuIHRoYXQgdGhlIHNlc3Npb24gZHJpdmVyJ3MgcHJvdG9jb2wgbWlnaHQgZGlmZmVyXG4gICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICBpZiAoIWlzVW1icmVsbGFDbWQpIHtcbiAgICAgICAgZHJpdmVyID0gZHN0U2Vzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgYW55IHBsdWdpbnMgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgYXMgaGFuZGxpbmcgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgcGx1Z2lucyA9IHRoaXMucGx1Z2luc1RvSGFuZGxlQ21kKGNtZCwgc2Vzc2lvbklkKTtcblxuICAgIC8vIG5vdyB3ZSBkZWZpbmUgYSAnY21kSGFuZGxlZEJ5JyBvYmplY3Qgd2hpY2ggd2lsbCBrZWVwIHRyYWNrIG9mIHdoaWNoIHBsdWdpbnMgaGF2ZSBoYW5kbGVkIHRoaXNcbiAgICAvLyBjb21tYW5kLiB3ZSBjYXJlIGFib3V0IHRoaXMgYmVjYXVzZSAoYSkgbXVsdGlwbGUgcGx1Z2lucyBjYW4gaGFuZGxlIHRoZSBzYW1lIGNvbW1hbmQsIGFuZFxuICAgIC8vIChiKSB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGEgcGx1Z2luIHdpbGwgYWN0dWFsbHkgY2FsbCB0aGUgbmV4dCgpIG1ldGhvZCB3aGljaCBydW5zIHRoZVxuICAgIC8vIG9yaWdpbmFsIGNvbW1hbmQgZXhlY3V0aW9uLiBUaGlzIHJlc3VsdHMgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGNvbW1hbmQgbWlnaHQgYmUgaGFuZGxlZFxuICAgIC8vIGJ5IHNvbWUgYnV0IG5vdCBhbGwgcGx1Z2lucywgb3IgYnkgcGx1Z2luKHMpIGJ1dCBub3QgYnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFNvIHN0YXJ0IG91dFxuICAgIC8vIHRoaXMgb2JqZWN0IGRlY2xhcmluZyB0aGF0IHRoZSBkZWZhdWx0IGhhbmRsZXIgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLlxuICAgIGNvbnN0IGNtZEhhbmRsZWRCeSA9IHtkZWZhdWx0OiBmYWxzZX07XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHBsdWdpbnMsIGFuZCBzdWNjZXNzaXZlbHkgd3JhcHBlZFxuICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGx1Z2luIHRoYXQgY2FuIGhhbmRsZSB0aGUgY29tbWFuZC4gVG8gc3RhcnQgb2ZmIHdpdGgsIHRoZSBhc3luY1xuICAgIC8vIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgY2FsbGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaS5lLiwgd2hpY2hldmVyIG9mIHRoZSAzIGNhc2VzIGFib3ZlIGlzXG4gICAgLy8gdGhlIGFwcHJvcHJpYXRlIG9uZVxuICAgIGNvbnN0IGRlZmF1bHRCZWhhdmlvciA9IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGlmIHdlJ3JlIHJ1bm5pbmcgd2l0aCBwbHVnaW5zLCBtYWtlIHN1cmUgd2UgbG9nIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgYWN0dWFsbHlcbiAgICAgIC8vIGhhcHBlbmluZyBzbyB3ZSBjYW4gdGVsbCB3aGVuIHRoZSBwbHVnaW4gY2FsbCBjaGFpbiBpcyB1bndyYXBwaW5nIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAvLyBpZiB0aGF0J3Mgd2hhdCBoYXBwZW5zXG4gICAgICBwbHVnaW5zLmxlbmd0aCAmJiB0aGlzLmxvZy5pbmZvKGBFeGVjdXRpbmcgZGVmYXVsdCBoYW5kbGluZyBiZWhhdmlvciBmb3IgY29tbWFuZCAnJHtjbWR9J2ApO1xuXG4gICAgICAvLyBpZiB3ZSBtYWtlIGl0IGhlcmUsIHdlIGtub3cgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBoYW5kbGVkXG4gICAgICBjbWRIYW5kbGVkQnkuZGVmYXVsdCA9IHRydWU7XG5cbiAgICAgIGlmIChyZXFGb3JQcm94eSkge1xuICAgICAgICAvLyB3ZSB3b3VsZCBoYXZlIHByb3hpZWQgdGhpcyBjb21tYW5kIGhhZCBhIHBsdWdpbiBub3QgaGFuZGxlZCBpdCwgc28gdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgICAgLy8gaXMgdG8gZG8gdGhlIHByb3h5IGFuZCByZXRyaWV2ZSB0aGUgcmVzdWx0IGludGVybmFsbHkgc28gaXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGluIGNhc2UgaXQgY2FsbHMgJ2F3YWl0IG5leHQoKScuIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgZHJpdmVyIGhhdmUgZGVmaW5lZFxuICAgICAgICAvLyAncHJveHlDb21tYW5kJyBhbmQgbm90IGp1c3QgJ3Byb3h5UmVxUmVzJy5cbiAgICAgICAgaWYgKCFkc3RTZXNzaW9uLnByb3h5Q29tbWFuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24ucHJveHlDb21tYW5kKHJlcUZvclByb3h5Lm9yaWdpbmFsVXJsLCByZXFGb3JQcm94eS5tZXRob2QsXG4gICAgICAgICAgcmVxRm9yUHJveHkuYm9keSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0dldFN0YXR1cykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW1icmVsbGFDbWQpIHtcbiAgICAgICAgLy8gc29tZSBjb21tYW5kcywgbGlrZSBkZWxldGVTZXNzaW9uLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0byBoYW5kbGUgb24gKnRoaXMqIGRyaXZlcixcbiAgICAgICAgLy8gbm90IHRoZSBwbGF0Zm9ybSBkcml2ZXJcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmV4ZWN1dGVDb21tYW5kLmNhbGwodGhpcywgY21kLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVyZSB3ZSBrbm93IHRoYXQgd2UgYXJlIGV4ZWN1dGluZyBhIHNlc3Npb24gY29tbWFuZCwgYW5kIGhhdmUgYSB2YWxpZCBzZXNzaW9uIGRyaXZlclxuICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24uZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRha2Ugb3VyIGRlZmF1bHQgYmVoYXZpb3IsIHdyYXAgaXQgd2l0aCBhbnkgbnVtYmVyIG9mIHBsdWdpbiBiZWhhdmlvcnMsIGFuZCBydW4gaXRcbiAgICBjb25zdCB3cmFwcGVkQ21kID0gdGhpcy53cmFwQ29tbWFuZFdpdGhQbHVnaW5zKHtcbiAgICAgIGRyaXZlciwgY21kLCBhcmdzLCBwbHVnaW5zLCBjbWRIYW5kbGVkQnksIG5leHQ6IGRlZmF1bHRCZWhhdmlvclxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdyYXBwZWRDb21tYW5kKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pO1xuXG4gICAgLy8gaWYgd2UgaGFkIHBsdWdpbnMsIG1ha2Ugc3VyZSB0byBsb2cgb3V0IHRoZSBoZWxwZnVsIHJlcG9ydCBhYm91dCB3aGljaCBwbHVnaW5zIGVuZGVkIHVwXG4gICAgLy8gaGFuZGxpbmcgdGhlIGNvbW1hbmQgYW5kIHdoaWNoIGRpZG4ndFxuICAgIHRoaXMubG9nUGx1Z2luSGFuZGxlclJlcG9ydChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KTtcblxuICAgIC8vIEFuZCBmaW5hbGx5LCBpZiB0aGUgY29tbWFuZCB3YXMgY3JlYXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtaWdyYXRlIGFueSBwbHVnaW5zIHdoaWNoIHdlcmVcbiAgICAvLyBwcmV2aW91c2x5IHNlc3Npb25sZXNzIHRvIHVzZSB0aGUgbmV3IHNlc3Npb25JZCwgc28gdGhhdCBwbHVnaW5zIGNhbiBzaGFyZSBzdGF0ZSBiZXR3ZWVuXG4gICAgLy8gdGhlaXIgY3JlYXRlU2Vzc2lvbiBtZXRob2QgYW5kIG90aGVyIGluc3RhbmNlIG1ldGhvZHNcbiAgICBpZiAoY21kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EICYmIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zLmxlbmd0aCAmJiAhcmVzLmVycm9yKSB7XG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBfLmZpcnN0KHJlcy52YWx1ZSk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBQcm9tb3RpbmcgJHt0aGlzLnNlc3Npb25sZXNzUGx1Z2lucy5sZW5ndGh9IHNlc3Npb25sZXNzIHBsdWdpbnMgdG8gYmUgYXR0YWNoZWQgYCArXG4gICAgICAgIGB0byBzZXNzaW9uIElEICR7c2Vzc2lvbklkfWApO1xuICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gICAgICB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICB3cmFwQ29tbWFuZFdpdGhQbHVnaW5zICh7ZHJpdmVyLCBjbWQsIGFyZ3MsIG5leHQsIGNtZEhhbmRsZWRCeSwgcGx1Z2luc30pIHtcbiAgICBwbHVnaW5zLmxlbmd0aCAmJiB0aGlzLmxvZy5pbmZvKGBQbHVnaW5zIHdoaWNoIGNhbiBoYW5kbGUgY21kICcke2NtZH0nOiAke3BsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpfWApO1xuXG4gICAgLy8gbm93IHdlIGNhbiBnbyB0aHJvdWdoIGVhY2ggcGx1Z2luIGFuZCB3cmFwIGBuZXh0YCBhcm91bmQgaXRzIG93biBoYW5kbGVyLCBwYXNzaW5nIHRoZSAqb2xkKlxuICAgIC8vIG5leHQgaW4gc28gdGhhdCBpdCBjYW4gY2FsbCBpdCBpZiBpdCB3YW50cyB0b1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgIC8vIG5lZWQgYW4gSUlGRSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgb2YgbmV4dCB0aGF0J3MgcGFzc2VkIHRvIHBsdWdpbi5oYW5kbGUgdG8gYmVcbiAgICAgIC8vIGV4YWN0bHkgdGhlIHZhbHVlIG9mIG5leHQgaGVyZSBiZWZvcmUgcmVhc3NpZ25tZW50OyB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGxhemlseVxuICAgICAgLy8gZXZhbHVhdGVkLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBsYXN0IGBuZXh0YCB0byBiZSBkZWZpbmVkLlxuICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IGZhbHNlOyAvLyB3ZSBzZWUgYSBuZXcgcGx1Z2luLCBzbyBhZGQgaXQgdG8gdGhlICdjbWRIYW5kbGVkQnknIG9iamVjdFxuICAgICAgbmV4dCA9ICgoX25leHQpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGlzIG5vdyBoYW5kbGluZyBjbWQgJyR7Y21kfSdgKTtcbiAgICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IHRydWU7IC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgdGhpcyBwbHVnaW4gaGFzIGF0dGVtcHRlZCB0byBoYW5kbGUgY21kXG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBjb21tYW5kIHZpYSBhIGNvbW1hbmQtc3BlY2lmaWMgaGFuZGxlciBvbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmIChwbHVnaW5bY21kXSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW5bY21kXShfbmV4dCwgZHJpdmVyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UsIGNhbGwgdGhlIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW4uaGFuZGxlKF9uZXh0LCBkcml2ZXIsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9KShuZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIGxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQgKHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pIHtcbiAgICBpZiAoIXBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZGF5LCB3ZSBoYXZlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cCBnZXR0aW5nXG4gICAgLy8gdGhlaXIgY29kZSBydW4gYXMgcGFydCBvZiBoYW5kbGluZyB0aGlzIGNvbW1hbmQuIEJlY2F1c2UgcGx1Z2lucyBjYW4gY2hvb3NlICpub3QqIHRvXG4gICAgLy8gcGFzcyBjb250cm9sIHRvIG90aGVyIHBsdWdpbnMgb3IgdG8gdGhlIGRlZmF1bHQgZHJpdmVyIGJlaGF2aW9yLCB0aGlzIGlzIGluZm9ybWF0aW9uXG4gICAgLy8gd2hpY2ggaXMgcHJvYmFibHkgdXNlZnVsIHRvIHRoZSB1c2VyIChlc3BlY2lhbGx5IGluIHNpdHVhdGlvbnMgd2hlcmUgcGx1Z2lucyBtaWdodCBub3RcbiAgICAvLyBpbnRlcmFjdCB3ZWxsIHRvZ2V0aGVyLCBhbmQgaXQgd291bGQgYmUgaGFyZCB0byBkZWJ1ZyBvdGhlcndpc2Ugd2l0aG91dCB0aGlzIGtpbmQgb2ZcbiAgICAvLyBtZXNzYWdlKS5cbiAgICBjb25zdCBkaWRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBjb25zdCBkaWRudEhhbmRsZSA9IE9iamVjdC5rZXlzKGNtZEhhbmRsZWRCeSkuZmlsdGVyKChrKSA9PiAhY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBpZiAoZGlkbnRIYW5kbGUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ29tbWFuZCAnJHtjbWR9JyB3YXMgKm5vdCogaGFuZGxlZCBieSB0aGUgZm9sbG93aW5nIGJlaGF2aW91cnMgb3IgcGx1Z2lucywgZXZlbiBgICtcbiAgICAgICAgYHRob3VnaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCB0byBoYW5kbGUgaXQ6ICR7SlNPTi5zdHJpbmdpZnkoZGlkbnRIYW5kbGUpfS4gVGhlIGAgK1xuICAgICAgICBgY29tbWFuZCAqd2FzKiBoYW5kbGVkIGJ5IHRoZXNlOiAke0pTT04uc3RyaW5naWZ5KGRpZEhhbmRsZSl9LmApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXcmFwcGVkQ29tbWFuZCAoe3dyYXBwZWRDbWQsIHByb3RvY29sfSkge1xuICAgIGxldCBjbWRSZXMsIGNtZEVyciwgcmVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGB3cmFwcGVkQ21kYCBkZWZpbmVzIGEgd2hvbGUgc2VxdWVuY2Ugb2YgcGx1Z2luIGhhbmRsZXJzLCBjdWxtaW5hdGluZyBpblxuICAgICAgLy8gb3VyIGRlZmF1bHQgaGFuZGxlci4gV2hhdGV2ZXIgaXQgcmV0dXJucyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICAgICAgLy8gdXNlci5cbiAgICAgIGNtZFJlcyA9IGF3YWl0IHdyYXBwZWRDbWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbWRFcnIgPSBlO1xuICAgIH1cblxuICAgIC8vIFNhZGx5LCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCBraW5kIG9mIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLiBJdCB3aWxsIGVpdGhlciBiZSBhIGJhcmVcbiAgICAvLyBvYmplY3QsIG9yIGEgcHJvdG9jb2wtYXdhcmUgb2JqZWN0IHdpdGggcHJvdG9jb2wgYW5kIGVycm9yL3ZhbHVlIGtleXMuIFNvIHdlIG5lZWQgdG8gc25pZmZcbiAgICAvLyBpdCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGRvdWJsZS13cmFwIGl0IGlmIGl0J3MgdGhlIGxhdHRlciBraW5kLlxuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY21kUmVzKSAmJiBfLmhhcyhjbWRSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICByZXMgPSBjbWRSZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy52YWx1ZSA9IGNtZFJlcztcbiAgICAgIHJlcy5lcnJvciA9IGNtZEVycjtcbiAgICAgIHJlcy5wcm90b2NvbCA9IHByb3RvY29sO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uID8gZHN0U2Vzc2lvbi5nZXRQcm94eUF2b2lkTGlzdCgpIDogW107XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLmNhblByb3h5KHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gaGVscCBkZWNpZGUgd2hpY2ggY29tbWFuZHMgc2hvdWxkIGJlIHByb3hpZWQgdG8gc3ViLWRyaXZlcnMgYW5kIHdoaWNoXG4vLyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzLCBvdXIgdW1icmVsbGEgZHJpdmVyXG5mdW5jdGlvbiBpc0FwcGl1bURyaXZlckNvbW1hbmQgKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09ICdkZWxldGVTZXNzaW9uJztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBBcHBpdW0gdHJpZWQgdG8gcHJveHkgYSBjb21tYW5kIHVzaW5nIGEgZHJpdmVyJ3MgYHByb3h5Q29tbWFuZGAgbWV0aG9kIGJ1dCB0aGVcbiAqIG1ldGhvZCBkaWQgbm90IGV4aXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9OT19EUklWRVJfUFJPWFlDT01NQU5EJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoYFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIGNvbW1hbmQgd2FzIHRvIHByb3h5LCBidXQgdGhlIGRyaXZlciBgICtcbiAgICAgICAgICBgZGlkIG5vdCBoYXZlIHRoZSAncHJveHlDb21tYW5kJyBtZXRob2QgZGVmaW5lZC4gVG8gZnVsbHkgc3VwcG9ydCBgICtcbiAgICAgICAgICBgcGx1Z2lucywgZHJpdmVycyBzaG91bGQgaGF2ZSAncHJveHlDb21tYW5kJyBzZXQgdG8gYSBqd3BQcm94eSBvYmplY3QncyBgICtcbiAgICAgICAgICBgJ2NvbW1hbmQoKScgbWV0aG9kLCBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsICdwcm94eVJlcVJlcydgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBcHBpdW1Ecml2ZXIgfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZXJuYWxEcml2ZXJ9IEV4dGVybmFsRHJpdmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzfSBXM0NDYXBhYmlsaXRpZXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJEYXRhfSBEcml2ZXJEYXRhXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyT3B0c30gRHJpdmVyT3B0c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gQXBwaXVtU2VydmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi90eXBlcycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3R5cGVzL2V4dGVuc2lvbicpLlBsdWdpbkNsYXNzfSBQbHVnaW5DbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnLi9leHRlbnNpb24vZHJpdmVyLWNvbmZpZycpLkRyaXZlckNvbmZpZ30gRHJpdmVyQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBVc2VkIGJ5IHtAbGlua2NvZGUgQXBwaXVtRHJpdmVyLmNyZWF0ZVNlc3Npb259IGFuZCB7QGxpbmtjb2RlIEFwcGl1bURyaXZlci5kZWxldGVTZXNzaW9ufSB0byBkZXNjcmliZVxuICogcmVzdWx0LlxuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIFNlc3Npb25IYW5kbGVyUmVzdWx0XG4gKiBAcHJvcGVydHkge1Z9IFt2YWx1ZV1cbiAqIEBwcm9wZXJ0eSB7RXJyb3J9IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJvdG9jb2xdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2Vzc2lvbkhhbmRsZXI8U2Vzc2lvbkhhbmRsZXJSZXN1bHQ8YW55W10+LFNlc3Npb25IYW5kbGVyUmVzdWx0PHZvaWQ+Pn0gU2Vzc2lvbkhhbmRsZXJcbiAqL1xuIl19