@appium/driver-test-support 0.2.0 → 0.2.1

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.
@@ -11,32 +11,282 @@ export function createSessionHelpers<CommandData = unknown, ResponseData = any>(
11
11
  * Creates E2E test suites for a driver.
12
12
  * @template {Driver} P
13
13
  * @param {DriverClass<P>} DriverClass
14
- * @param {AppiumW3CCapabilities} [defaultCaps]
14
+ * @param {Partial<BaseNSCapabilities>} [defaultCaps]
15
15
  */
16
- export function driverE2ETestSuite<P extends import("@appium/types").Driver>(DriverClass: DriverClass<P>, defaultCaps?: Partial<import("@wdio/types/build/Capabilities").Capabilities & import("@wdio/types/build/Capabilities").AppiumW3CCapabilities & {
17
- [x: `${string}:${string}`]: any;
18
- }> | undefined): void;
16
+ export function driverE2ETestSuite<P extends import("@appium/types").Driver<{
17
+ readonly platformName: {
18
+ readonly presence: true;
19
+ readonly isString: true;
20
+ };
21
+ readonly app: {
22
+ readonly isString: true;
23
+ };
24
+ readonly deviceName: {
25
+ readonly isString: true;
26
+ };
27
+ readonly platformVersion: {
28
+ readonly isString: true;
29
+ };
30
+ readonly newCommandTimeout: {
31
+ readonly isNumber: true;
32
+ };
33
+ readonly automationName: {
34
+ readonly isString: true;
35
+ };
36
+ readonly autoLaunch: {
37
+ readonly isBoolean: true;
38
+ };
39
+ readonly udid: {
40
+ readonly isString: true;
41
+ };
42
+ readonly orientation: {
43
+ readonly inclusion: readonly ["LANDSCAPE", "PORTRAIT"];
44
+ };
45
+ readonly autoWebview: {
46
+ readonly isBoolean: true;
47
+ };
48
+ readonly noReset: {
49
+ readonly isBoolean: true;
50
+ };
51
+ readonly fullReset: {
52
+ readonly isBoolean: true;
53
+ };
54
+ readonly language: {
55
+ readonly isString: true;
56
+ };
57
+ readonly locale: {
58
+ readonly isString: true;
59
+ };
60
+ readonly eventTimings: {
61
+ readonly isBoolean: true;
62
+ };
63
+ readonly printPageSourceOnFindFailure: {
64
+ readonly isBoolean: true;
65
+ };
66
+ }, import("@appium/types").StringRecord>>(DriverClass: DriverClass<P>, defaultCaps?: Partial<import("@appium/types").CapsToNSCaps<import("@appium/types").ConstraintsToCaps<{
67
+ readonly platformName: {
68
+ readonly presence: true;
69
+ readonly isString: true;
70
+ };
71
+ readonly app: {
72
+ readonly isString: true;
73
+ };
74
+ readonly deviceName: {
75
+ readonly isString: true;
76
+ };
77
+ readonly platformVersion: {
78
+ readonly isString: true;
79
+ };
80
+ readonly newCommandTimeout: {
81
+ readonly isNumber: true;
82
+ };
83
+ readonly automationName: {
84
+ readonly isString: true;
85
+ };
86
+ readonly autoLaunch: {
87
+ readonly isBoolean: true;
88
+ };
89
+ readonly udid: {
90
+ readonly isString: true;
91
+ };
92
+ readonly orientation: {
93
+ readonly inclusion: readonly ["LANDSCAPE", "PORTRAIT"];
94
+ };
95
+ readonly autoWebview: {
96
+ readonly isBoolean: true;
97
+ };
98
+ readonly noReset: {
99
+ readonly isBoolean: true;
100
+ };
101
+ readonly fullReset: {
102
+ readonly isBoolean: true;
103
+ };
104
+ readonly language: {
105
+ readonly isString: true;
106
+ };
107
+ readonly locale: {
108
+ readonly isString: true;
109
+ };
110
+ readonly eventTimings: {
111
+ readonly isBoolean: true;
112
+ };
113
+ readonly printPageSourceOnFindFailure: {
114
+ readonly isBoolean: true;
115
+ };
116
+ }>, "appium">> | undefined): void;
19
117
  /**
20
118
  * A {@linkcode DriverClass }, except using the base {@linkcode Driver } type instead of `ExternalDriver`.
21
119
  * This allows the suite to work for `BaseDriver`.
22
120
  */
23
- export type DriverClass<P extends import("@appium/types").Driver> = import('@appium/types').DriverClass<P>;
24
- export type Capabilities = import('@appium/types').Capabilities;
121
+ export type DriverClass<P extends import("@appium/types").Driver<{
122
+ readonly platformName: {
123
+ readonly presence: true;
124
+ readonly isString: true;
125
+ };
126
+ readonly app: {
127
+ readonly isString: true;
128
+ };
129
+ readonly deviceName: {
130
+ readonly isString: true;
131
+ };
132
+ readonly platformVersion: {
133
+ readonly isString: true;
134
+ };
135
+ readonly newCommandTimeout: {
136
+ readonly isNumber: true;
137
+ };
138
+ readonly automationName: {
139
+ readonly isString: true;
140
+ };
141
+ readonly autoLaunch: {
142
+ readonly isBoolean: true;
143
+ };
144
+ readonly udid: {
145
+ readonly isString: true;
146
+ };
147
+ readonly orientation: {
148
+ readonly inclusion: readonly ["LANDSCAPE", "PORTRAIT"];
149
+ };
150
+ readonly autoWebview: {
151
+ readonly isBoolean: true;
152
+ };
153
+ readonly noReset: {
154
+ readonly isBoolean: true;
155
+ };
156
+ readonly fullReset: {
157
+ readonly isBoolean: true;
158
+ };
159
+ readonly language: {
160
+ readonly isString: true;
161
+ };
162
+ readonly locale: {
163
+ readonly isString: true;
164
+ };
165
+ readonly eventTimings: {
166
+ readonly isBoolean: true;
167
+ };
168
+ readonly printPageSourceOnFindFailure: {
169
+ readonly isBoolean: true;
170
+ };
171
+ }, import("@appium/types").StringRecord>> = import('@appium/types').DriverClass<P>;
25
172
  export type Driver = import('@appium/types').Driver;
173
+ export type Constraints = import('@appium/types').Constraints;
26
174
  export type DriverStatic = import('@appium/types').DriverStatic;
27
- export type AppiumW3CCapabilities = import('@appium/types').AppiumW3CCapabilities;
175
+ export type StringRecord = import('@appium/types').StringRecord;
176
+ export type BaseDriverCapConstraints = import('@appium/types').BaseDriverCapConstraints;
177
+ export type BaseNSCapabilities = import('@appium/types').BaseNSCapabilities;
28
178
  export type AxiosRequestConfig = import('axios').AxiosRequestConfig;
29
179
  export type SingularSessionData = import('@appium/types').SingularSessionData;
30
180
  export type AxiosResponse<T, D> = import('axios').AxiosResponse<T, D>;
31
- export type NewSessionData = {
32
- capabilities: import('type-fest').RequireAtLeastOne<import('@appium/types').W3CCapabilities, 'firstMatch' | 'alwaysMatch'>;
181
+ export type NewSessionData<C extends Readonly<Record<string, import("@appium/types").Constraint>> = {
182
+ readonly platformName: {
183
+ readonly presence: true;
184
+ readonly isString: true;
185
+ };
186
+ readonly app: {
187
+ readonly isString: true;
188
+ };
189
+ readonly deviceName: {
190
+ readonly isString: true;
191
+ };
192
+ readonly platformVersion: {
193
+ readonly isString: true;
194
+ };
195
+ readonly newCommandTimeout: {
196
+ readonly isNumber: true;
197
+ };
198
+ readonly automationName: {
199
+ readonly isString: true;
200
+ };
201
+ readonly autoLaunch: {
202
+ readonly isBoolean: true;
203
+ };
204
+ readonly udid: {
205
+ readonly isString: true;
206
+ };
207
+ readonly orientation: {
208
+ readonly inclusion: readonly ["LANDSCAPE", "PORTRAIT"];
209
+ };
210
+ readonly autoWebview: {
211
+ readonly isBoolean: true;
212
+ };
213
+ readonly noReset: {
214
+ readonly isBoolean: true;
215
+ };
216
+ readonly fullReset: {
217
+ readonly isBoolean: true;
218
+ };
219
+ readonly language: {
220
+ readonly isString: true;
221
+ };
222
+ readonly locale: {
223
+ readonly isString: true;
224
+ };
225
+ readonly eventTimings: {
226
+ readonly isBoolean: true;
227
+ };
228
+ readonly printPageSourceOnFindFailure: {
229
+ readonly isBoolean: true;
230
+ };
231
+ }, Extra extends void | import("@appium/types").StringRecord = void> = {
232
+ capabilities: import('type-fest').RequireAtLeastOne<import('@appium/types').W3CCapabilities<C, Extra>, 'firstMatch' | 'alwaysMatch'>;
33
233
  };
34
- export type NewSessionResponse = {
234
+ export type NewSessionResponse<C extends Readonly<Record<string, import("@appium/types").Constraint>> = {
235
+ readonly platformName: {
236
+ readonly presence: true;
237
+ readonly isString: true;
238
+ };
239
+ readonly app: {
240
+ readonly isString: true;
241
+ };
242
+ readonly deviceName: {
243
+ readonly isString: true;
244
+ };
245
+ readonly platformVersion: {
246
+ readonly isString: true;
247
+ };
248
+ readonly newCommandTimeout: {
249
+ readonly isNumber: true;
250
+ };
251
+ readonly automationName: {
252
+ readonly isString: true;
253
+ };
254
+ readonly autoLaunch: {
255
+ readonly isBoolean: true;
256
+ };
257
+ readonly udid: {
258
+ readonly isString: true;
259
+ };
260
+ readonly orientation: {
261
+ readonly inclusion: readonly ["LANDSCAPE", "PORTRAIT"];
262
+ };
263
+ readonly autoWebview: {
264
+ readonly isBoolean: true;
265
+ };
266
+ readonly noReset: {
267
+ readonly isBoolean: true;
268
+ };
269
+ readonly fullReset: {
270
+ readonly isBoolean: true;
271
+ };
272
+ readonly language: {
273
+ readonly isString: true;
274
+ };
275
+ readonly locale: {
276
+ readonly isString: true;
277
+ };
278
+ readonly eventTimings: {
279
+ readonly isBoolean: true;
280
+ };
281
+ readonly printPageSourceOnFindFailure: {
282
+ readonly isBoolean: true;
283
+ };
284
+ }, Extra extends void | import("@appium/types").StringRecord = void> = {
35
285
  /**
36
286
  * ,
37
287
  */
38
288
  sessionId: string;
39
- capabilities: import('@appium/types').Capabilities;
289
+ capabilities: import('@appium/types').Capabilities<C, Extra>;
40
290
  };
41
291
  /**
42
292
  * Some E2E helpers for making requests and managing sessions
@@ -1 +1 @@
1
- {"version":3,"file":"e2e-suite.d.ts","sourceRoot":"","sources":["../../lib/e2e-suite.js"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,sFAJW,MAAM,2EAmFhB;AAED;;;;;GAKG;AACH;;sBAyTC;;;;;oEAMY,OAAO,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;2BAItC,OAAO,eAAe,EAAE,YAAY;qBACpC,OAAO,eAAe,EAAE,MAAM;2BAC9B,OAAO,eAAe,EAAE,YAAY;oCACpC,OAAO,eAAe,EAAE,qBAAqB;iCAC7C,OAAO,OAAO,EAAE,kBAAkB;kCAClC,OAAO,eAAe,EAAE,mBAAmB;kCAK3C,OAAO,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;;kBAKlC,OAAO,WAAW,EAAE,iBAAiB,CAAC,OAAO,eAAe,EAAE,eAAe,EAAE,YAAY,GAAC,aAAa,CAAC;;;;;;eAK1G,MAAM;kBACN,OAAO,eAAe,EAAE,YAAY;;;;;;;;;;mBASpC,MAAM;;;;yBACC,cAAc,WAAW,kBAAkB,KAAK,QAAQ,kBAAkB,CAAC;;;;4BACtE,MAAM,KAAK,QAAQ,cAAc;QAAC,KAAK,EAAE;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAC,QAAC;KAAC,EAAE;QAAC,cAAc,EAAE,IAAI,CAAA;KAAC,CAAC,CAAC;;;;4BACrF,MAAM,KAAK,QAAQ,mBAAmB,CAAC;;;;6BACvC,MAAM,WAAW,MAAM,SAAS,WAAW,WAAW,kBAAkB,KAAK,QAAQ,YAAY,CAAC;;;;qCACzF,MAAM,mBAAmB,MAAM,GAAC,kBAAkB,WAAW,kBAAkB,KAAK,QAAQ,YAAY,CAAC"}
1
+ {"version":3,"file":"e2e-suite.d.ts","sourceRoot":"","sources":["../../lib/e2e-suite.js"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,sFAJW,MAAM,2EAmFhB;AAED;;;;;GAKG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAyTC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAMY,OAAO,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;qBAItC,OAAO,eAAe,EAAE,MAAM;0BAC9B,OAAO,eAAe,EAAE,WAAW;2BACnC,OAAO,eAAe,EAAE,YAAY;2BACpC,OAAO,eAAe,EAAE,YAAY;uCACpC,OAAO,eAAe,EAAE,wBAAwB;iCAChD,OAAO,eAAe,EAAE,kBAAkB;iCAC1C,OAAO,OAAO,EAAE,kBAAkB;kCAClC,OAAO,eAAe,EAAE,mBAAmB;kCAK3C,OAAO,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOlC,OAAO,WAAW,EAAE,iBAAiB,CAAC,OAAO,eAAe,EAAE,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,YAAY,GAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAOpH,MAAM;kBACN,OAAO,eAAe,EAAE,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC;;;;;;;;;;mBAS9C,MAAM;;;;yBACC,cAAc,WAAW,kBAAkB,KAAK,QAAQ,kBAAkB,CAAC;;;;4BACtE,MAAM,KAAK,QAAQ,cAAc;QAAC,KAAK,EAAE;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAC,QAAC;KAAC,EAAE;QAAC,cAAc,EAAE,IAAI,CAAA;KAAC,CAAC,CAAC;;;;4BACrF,MAAM,KAAK,QAAQ,mBAAmB,CAAC;;;;6BACvC,MAAM,WAAW,MAAM,SAAS,WAAW,WAAW,kBAAkB,KAAK,QAAQ,YAAY,CAAC;;;;qCACzF,MAAM,mBAAmB,MAAM,GAAC,kBAAkB,WAAW,kBAAkB,KAAK,QAAQ,YAAY,CAAC"}
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -24,6 +22,8 @@ var _chai = _interopRequireDefault(require("chai"));
24
22
 
25
23
  var _sinon = _interopRequireDefault(require("sinon"));
26
24
 
25
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
+
27
27
  const should = _chai.default.should();
28
28
 
29
29
  function createSessionHelpers(port, address = _helpers.TEST_HOST) {
@@ -98,8 +98,7 @@ function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
98
98
  let postCommand;
99
99
  before(async function () {
100
100
  port = port ?? (await (0, _helpers.getTestPort)());
101
- defaultCaps = { ...defaultCaps,
102
- 'appium:port': port
101
+ defaultCaps = { ...defaultCaps
103
102
  };
104
103
  d = new DriverClass({
105
104
  port,
@@ -386,4 +385,4 @@ function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
386
385
  });
387
386
  });
388
387
  }
389
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaG91bGQiLCJjaGFpIiwiY3JlYXRlU2Vzc2lvbkhlbHBlcnMiLCJwb3J0IiwiYWRkcmVzcyIsIlRFU1RfSE9TVCIsImNyZWF0ZUFwcGl1bVRlc3RVUkwiLCJjcmVhdGVBcHBpdW1VUkwiLCJjcmVhdGVTZXNzaW9uVVJMIiwiXyIsIm5ld1Nlc3Npb25VUkwiLCJwb3N0Q29tbWFuZCIsInNlc3Npb25JZCIsImNtZE5hbWUiLCJkYXRhIiwiY29uZmlnIiwidXJsIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJ2YWx1ZSIsImdldENvbW1hbmQiLCJzZXNzaW9uSWRPckNtZE5hbWUiLCJjbWROYW1lT3JDb25maWciLCJpc1N0cmluZyIsInZhbGlkYXRlU3RhdHVzIiwic3RhcnRTZXNzaW9uIiwiZGVmYXVsdHNEZWVwIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwiZW5kU2Vzc2lvbiIsImRlbGV0ZSIsImdldFNlc3Npb24iLCJkcml2ZXJFMkVUZXN0U3VpdGUiLCJEcml2ZXJDbGFzcyIsImRlZmF1bHRDYXBzIiwiY2xhc3NOYW1lIiwibmFtZSIsImRlc2NyaWJlIiwiYmFzZVNlcnZlciIsImQiLCJiZWZvcmUiLCJnZXRUZXN0UG9ydCIsInNlcnZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsImhvc3RuYW1lIiwiY2xpQXJncyIsImFmdGVyIiwiY2xvc2UiLCJpdCIsInNlc3Npb25JZHMiLCJ0aW1lcyIsImhlYWRlcnMiLCJzaW1wbGUiLCJyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSIsInB1c2giLCJ1bmlxIiwibGVuZ3RoIiwiZXF1YWwiLCJzdGF0dXMiLCJyZXFzIiwibWFwIiwiQiIsImFsbCIsImV4aXN0IiwicGxhdGZvcm1OYW1lIiwiZGV2aWNlTmFtZSIsInNraXAiLCJvcmlnaW5hbEZpbmRFbGVtZW50Iiwib3JpZ2luYWxGaW5kRWxlbWVudHMiLCJzdGFydFRpbWVvdXRTZXNzaW9uIiwidGltZW91dCIsImNhcHMiLCJjbG9uZURlZXAiLCJmaW5kRWxlbWVudCIsImJpbmQiLCJmaW5kRWxlbWVudHMiLCJkZWxheSIsIm5ld1Nlc3Npb24iLCJuZXdDb21tYW5kVGltZW91dE1zIiwiYmUiLCJhYm92ZSIsInVzaW5nIiwiZXJyb3IiLCJyZXNwIiwic3RhcnQiLCJEYXRlIiwibm93IiwiZXFsIiwibm90Iiwibm9Db21tYW5kVGltZXIiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImdldFNldHRpbmdzIiwiZmFsc2UiLCJ1cGRhdGUiLCJyZWplY3RlZCIsInJlamVjdGVkV2l0aCIsInNhbmRib3giLCJiZWZvcmVFYWNoIiwic2lub24iLCJjcmVhdGVTYW5kYm94IiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsInN0dWIiLCJjYWxsc0Zha2UiLCJyZXFQcm9taXNlIiwic2h1dGRvd25FdmVudFByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsIkVycm9yIiwib25VbmV4cGVjdGVkU2h1dGRvd24iLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsIm1lc3NhZ2UiLCJjb250YWluIiwic2Vzc2lvbiIsInJlcyIsImV2ZW50cyIsIm5ld1Nlc3Npb25SZXF1ZXN0ZWQiLCJuZXdTZXNzaW9uU3RhcnRlZCIsImEiXSwic291cmNlcyI6WyIuLi8uLi9saWIvZTJlLXN1aXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge3NlcnZlciwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtURVNUX0hPU1QsIGdldFRlc3RQb3J0LCBjcmVhdGVBcHBpdW1VUkx9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmNvbnN0IHNob3VsZCA9IGNoYWkuc2hvdWxkKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBzb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIEUyRSB0ZXN0cyB0byBtYW5hZ2Ugc2Vzc2lvbnMuXG4gKiBAdGVtcGxhdGUgW0NvbW1hbmREYXRhPXVua25vd25dXG4gKiBAdGVtcGxhdGUgW1Jlc3BvbnNlRGF0YT1hbnldXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBpcyBydW5uaW5nLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHJldHJpZXZlZCB2aWEgYGdldC1wb3J0YCBiZWZvcmVoYW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FkZHJlc3NdIC0gQWRkcmVzcy9ob3N0IG9uIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4gRGVmYXVsdHMgdG8ge0BsaW5rY29kZSBURVNUX0hPU1R9XG4gKiBAcmV0dXJucyB7U2Vzc2lvbkhlbHBlcnM8Q29tbWFuZERhdGEsIFJlc3BvbnNlRGF0YT59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXNzaW9uSGVscGVycyhwb3J0LCBhZGRyZXNzID0gVEVTVF9IT1NUKSB7XG4gIGNvbnN0IGNyZWF0ZUFwcGl1bVRlc3RVUkwgPVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdsb2Rhc2gnKS5DdXJyaWVkRnVuY3Rpb24yPHN0cmluZyxzdHJpbmcsc3RyaW5nPn0gKi8gKFxuICAgICAgY3JlYXRlQXBwaXVtVVJMKGFkZHJlc3MsIHBvcnQpXG4gICAgKTtcblxuICBjb25zdCBjcmVhdGVTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVGVzdFVSTChfLCAnJyk7XG4gIGNvbnN0IG5ld1Nlc3Npb25VUkwgPSBjcmVhdGVBcHBpdW1UZXN0VVJMKCcnLCAnc2Vzc2lvbicpO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyczxDb21tYW5kRGF0YSwgUmVzcG9uc2VEYXRhPn0gKi8gKHtcbiAgICBuZXdTZXNzaW9uVVJMLFxuICAgIGNyZWF0ZUFwcGl1bVRlc3RVUkwsXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNtZE5hbWVcbiAgICAgKiBAcGFyYW0ge2FueX0gW2RhdGFdXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBwb3N0Q29tbWFuZDogYXN5bmMgKHNlc3Npb25JZCwgY21kTmFtZSwgZGF0YSA9IHt9LCBjb25maWcgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gY3JlYXRlQXBwaXVtVGVzdFVSTChzZXNzaW9uSWQsIGNtZE5hbWUpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgZGF0YSwgY29uZmlnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZE9yQ21kTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEF4aW9zUmVxdWVzdENvbmZpZ30gY21kTmFtZU9yQ29uZmlnXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBnZXRDb21tYW5kOiBhc3luYyAoc2Vzc2lvbklkT3JDbWROYW1lLCBjbWROYW1lT3JDb25maWcsIGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoY21kTmFtZU9yQ29uZmlnKSkge1xuICAgICAgICBjb25maWcgPSBjbWROYW1lT3JDb25maWc7XG4gICAgICAgIGNtZE5hbWVPckNvbmZpZyA9IHNlc3Npb25JZE9yQ21kTmFtZTtcbiAgICAgICAgc2Vzc2lvbklkT3JDbWROYW1lID0gJyc7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBjcmVhdGVBcHBpdW1UZXN0VVJMKHNlc3Npb25JZE9yQ21kTmFtZSwgY21kTmFtZU9yQ29uZmlnKSxcbiAgICAgICAgdmFsaWRhdGVTdGF0dXM6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LnZhbHVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge05ld1Nlc3Npb25EYXRhfSBkYXRhXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICovXG4gICAgc3RhcnRTZXNzaW9uOiBhc3luYyAoZGF0YSwgY29uZmlnID0ge30pID0+IHtcbiAgICAgIGRhdGEgPSBfLmRlZmF1bHRzRGVlcChkYXRhLCB7XG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgICAgICBmaXJzdE1hdGNoOiBbe31dLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QobmV3U2Vzc2lvblVSTCwgZGF0YSwgY29uZmlnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqL1xuICAgIGVuZFNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+XG4gICAgICBhd2FpdCBheGlvcy5kZWxldGUoY3JlYXRlU2Vzc2lvblVSTChzZXNzaW9uSWQpLCB7XG4gICAgICAgIHZhbGlkYXRlU3RhdHVzOiBudWxsLFxuICAgICAgfSksXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgZ2V0U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogY3JlYXRlU2Vzc2lvblVSTChzZXNzaW9uSWQpLFxuICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LnZhbHVlO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRTJFIHRlc3Qgc3VpdGVzIGZvciBhIGRyaXZlci5cbiAqIEB0ZW1wbGF0ZSB7RHJpdmVyfSBQXG4gKiBAcGFyYW0ge0RyaXZlckNsYXNzPFA+fSBEcml2ZXJDbGFzc1xuICogQHBhcmFtIHtBcHBpdW1XM0NDYXBhYmlsaXRpZXN9IFtkZWZhdWx0Q2Fwc11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXZlckUyRVRlc3RTdWl0ZShEcml2ZXJDbGFzcywgZGVmYXVsdENhcHMgPSB7fSkge1xuICBsZXQgYWRkcmVzcyA9IGRlZmF1bHRDYXBzWydhcHBpdW06YWRkcmVzcyddID8/IFRFU1RfSE9TVDtcbiAgbGV0IHBvcnQgPSBkZWZhdWx0Q2Fwc1snYXBwaXVtOnBvcnQnXTtcbiAgY29uc3QgY2xhc3NOYW1lID0gRHJpdmVyQ2xhc3MubmFtZSB8fCAnKHVua25vd24gZHJpdmVyKSc7XG5cbiAgZGVzY3JpYmUoYEJhc2VEcml2ZXIgRTJFIChhcyAke2NsYXNzTmFtZX0pYCwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBiYXNlU2VydmVyO1xuICAgIC8qKiBAdHlwZSB7UH0gKi9cbiAgICBsZXQgZDtcbiAgICAvKipcbiAgICAgKiBUaGlzIFVSTCBjcmVhdGVzIGEgbmV3IHNlc3Npb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqKi9cbiAgICBsZXQgbmV3U2Vzc2lvblVSTDtcblxuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ3N0YXJ0U2Vzc2lvbiddfSAqL1xuICAgIGxldCBzdGFydFNlc3Npb247XG4gICAgLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyc1snZ2V0U2Vzc2lvbiddfSAqL1xuICAgIGxldCBnZXRTZXNzaW9uO1xuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ2VuZFNlc3Npb24nXX0gKi9cbiAgICBsZXQgZW5kU2Vzc2lvbjtcbiAgICAvKiogQHR5cGUge1Nlc3Npb25IZWxwZXJzWydnZXRDb21tYW5kJ119ICovXG4gICAgbGV0IGdldENvbW1hbmQ7XG4gICAgLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyc1sncG9zdENvbW1hbmQnXX0gKi9cbiAgICBsZXQgcG9zdENvbW1hbmQ7XG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHBvcnQgPSBwb3J0ID8/IChhd2FpdCBnZXRUZXN0UG9ydCgpKTtcbiAgICAgIGRlZmF1bHRDYXBzID0gey4uLmRlZmF1bHRDYXBzLCAnYXBwaXVtOnBvcnQnOiBwb3J0fTtcbiAgICAgIGQgPSBuZXcgRHJpdmVyQ2xhc3Moe3BvcnQsIGFkZHJlc3N9KTtcbiAgICAgIGJhc2VTZXJ2ZXIgPSBhd2FpdCBzZXJ2ZXIoe1xuICAgICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbihkKSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgaG9zdG5hbWU6IGFkZHJlc3MsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY2xpQXJnczoge30sXG4gICAgICB9KTtcbiAgICAgICh7c3RhcnRTZXNzaW9uLCBnZXRTZXNzaW9uLCBlbmRTZXNzaW9uLCBuZXdTZXNzaW9uVVJMLCBnZXRDb21tYW5kLCBwb3N0Q29tbWFuZH0gPVxuICAgICAgICBjcmVhdGVTZXNzaW9uSGVscGVycyhwb3J0LCBhZGRyZXNzKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBiYXNlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2Vzc2lvbiBoYW5kbGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGlkZW1wb3RlbmN5IHdoaWxlIGNyZWF0aW5nIHNlc3Npb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRzID0gW107XG4gICAgICAgIGxldCB0aW1lcyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCB7c2Vzc2lvbklkfSA9IGF3YWl0IHN0YXJ0U2Vzc2lvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnWC1JZGVtcG90ZW5jeS1LZXknOiAnMTIzNDU2JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gWFhYOiBJJ20gbm90IHN1cmUgd2hhdCB0aGVzZSBhcmUsIGFzIHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIGF4aW9zIG9wdGlvbnMsXG4gICAgICAgICAgICAgIC8vIG5vciBhcmUgdGhleSBtZW50aW9uZWQgaW4gb3VyIHNvdXJjZVxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgIHNpbXBsZTogZmFsc2UsXG4gICAgICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzZXNzaW9uSWRzLnB1c2goc2Vzc2lvbklkKTtcbiAgICAgICAgICB0aW1lcysrO1xuICAgICAgICB9IHdoaWxlICh0aW1lcyA8IDIpO1xuICAgICAgICBfLnVuaXEoc2Vzc2lvbklkcykubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgICBjb25zdCB7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGVuZFNlc3Npb24oc2Vzc2lvbklkc1swXSk7XG4gICAgICAgIHN0YXR1cy5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGRhdGEudmFsdWUsIG51bGwpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGlkZW1wb3RlbmN5IHdoaWxlIGNyZWF0aW5nIHBhcmFsbGVsIHNlc3Npb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXFzID0gW107XG4gICAgICAgIGxldCB0aW1lcyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXFzLnB1c2goXG4gICAgICAgICAgICBzdGFydFNlc3Npb24oXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIGFsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgJ1gtSWRlbXBvdGVuY3ktS2V5JzogJzEyMzQ1JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aW1lcysrO1xuICAgICAgICB9IHdoaWxlICh0aW1lcyA8IDIpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRzID0gXy5tYXAoYXdhaXQgQi5hbGwocmVxcyksICdzZXNzaW9uSWQnKTtcbiAgICAgICAgXy51bmlxKHNlc3Npb25JZHMpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgICAgY29uc3Qge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBlbmRTZXNzaW9uKHNlc3Npb25JZHNbMF0pO1xuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLCBudWxsKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBzZXNzaW9uIGFuZCByZXRyaWV2ZSBhIHNlc3Npb24gaWQsIHRoZW4gZGVsZXRlIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBheGlvcy5wb3N0KG5ld1Nlc3Npb25VUkwsIHtcbiAgICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgIGFsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5leGlzdChkYXRhLnZhbHVlLnNlc3Npb25JZCk7XG4gICAgICAgIGRhdGEudmFsdWUuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHMucGxhdGZvcm1OYW1lKTtcbiAgICAgICAgZGF0YS52YWx1ZS5jYXBhYmlsaXRpZXMuZGV2aWNlTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10pO1xuXG4gICAgICAgICh7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGVuZFNlc3Npb24oLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCkpKTtcblxuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLCBudWxsKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkLCBudWxsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQuc2tpcCgnc2hvdWxkIHRocm93IE5ZSSBmb3IgY29tbWFuZHMgbm90IGltcGxlbWVudGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge30pO1xuXG4gICAgZGVzY3JpYmUoJ2NvbW1hbmQgdGltZW91dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgb3JpZ2luYWxGaW5kRWxlbWVudCwgb3JpZ2luYWxGaW5kRWxlbWVudHM7XG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAgICovXG4gICAgICBhc3luYyBmdW5jdGlvbiBzdGFydFRpbWVvdXRTZXNzaW9uKHRpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgY2FwcyA9IF8uY2xvbmVEZWVwKGRlZmF1bHRDYXBzKTtcbiAgICAgICAgY2Fwc1snYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0J10gPSB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gYXdhaXQgc3RhcnRTZXNzaW9uKHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogY2Fwc319KTtcbiAgICAgIH1cblxuICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudCA9IGQuZmluZEVsZW1lbnQ7XG4gICAgICAgIGQuZmluZEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICdmb28nO1xuICAgICAgICB9LmJpbmQoZCk7XG5cbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudHMgPSBkLmZpbmRFbGVtZW50cztcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSgyMDApO1xuICAgICAgICAgIHJldHVybiBbJ2ZvbyddO1xuICAgICAgICB9LmJpbmQoZCk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkLmZpbmRFbGVtZW50ID0gb3JpZ2luYWxGaW5kRWxlbWVudDtcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBvcmlnaW5hbEZpbmRFbGVtZW50cztcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBhIGRlZmF1bHQgY29tbWFuZFRpbWVvdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigpO1xuICAgICAgICBkLm5ld0NvbW1hbmRUaW1lb3V0TXMuc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRpbWVvdXQgb24gY29tbWFuZHMgdXNpbmcgY29tbWFuZFRpbWVvdXQgY2FwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oMC4yNSk7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpO1xuICAgICAgICBhd2FpdCBwb3N0Q29tbWFuZChzZXNzaW9uSWQsICdlbGVtZW50Jywge1xuICAgICAgICAgIHVzaW5nOiAnbmFtZScsXG4gICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg0MDApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHZhbHVlLmVycm9yLCAnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSAoYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCkpLmRhdGEudmFsdWU7XG4gICAgICAgIHNob3VsZC5lcXVhbChyZXNwPy5lcnJvciwgJ2ludmFsaWQgc2Vzc2lvbiBpZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHRpbWVvdXQgd2l0aCBjb21tYW5kVGltZW91dCBvZiBmYWxzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDAuMSk7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcG9zdENvbW1hbmQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCksICdlbGVtZW50cycsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIChEYXRlLm5vdygpIC0gc3RhcnQpLnNob3VsZC5iZS5hYm92ZSgxNTApO1xuICAgICAgICB2YWx1ZS5zaG91bGQuZXFsKFsnZm9vJ10pO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IHdpdGggY29tbWFuZFRpbWVvdXQgb2YgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5uZXdDb21tYW5kVGltZW91dE1zID0gMjtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDApO1xuXG4gICAgICAgIGF3YWl0IHBvc3RDb21tYW5kKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpLCAnZWxlbWVudCcsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBnZXRTZXNzaW9uKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpKTtcbiAgICAgICAgdmFsdWUucGxhdGZvcm1OYW1lPy5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHMucGxhdGZvcm1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVzcCA9IChhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKSkuZGF0YS52YWx1ZTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlc3AsIG51bGwpO1xuXG4gICAgICAgIGQubmV3Q29tbWFuZFRpbWVvdXRNcyA9IDYwICogMTAwMDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IGlmIGl0cyBqdXN0IHRoZSBjb21tYW5kIHRha2luZyBhd2hpbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgLy8gWFhYOiByYWNlIGNvbmRpdGlvbjogd2UgbXVzdCBidWlsZCB0aGlzIFVSTCBiZWZvcmUgLi4uc29tZXRoaW5nIGhhcHBlbnMuLi5cbiAgICAgICAgLy8gd2hpY2ggY2F1c2VzIGBkLnNlc3Npb25JZGAgdG8gYmUgbWlzc2luZ1xuICAgICAgICBjb25zdCB7c2Vzc2lvbklkfSA9IGQ7XG5cbiAgICAgICAgYXdhaXQgcG9zdENvbW1hbmQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCksICdlbGVtZW50Jywge1xuICAgICAgICAgIHVzaW5nOiAnbmFtZScsXG4gICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg0MDApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGdldFNlc3Npb24oLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzZXNzaW9uSWQpKTtcbiAgICAgICAgdmFsdWUuZXJyb3Iuc2hvdWxkLmVxdWFsKCdpbnZhbGlkIHNlc3Npb24gaWQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkLCBudWxsKTtcbiAgICAgICAgY29uc3QgcmVzcCA9IChhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKSkuZGF0YS52YWx1ZTtcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovICgvKiogQHR5cGUgeyB7ZXJyb3I6IHN0cmluZ30gfSAqLyAocmVzcCkuZXJyb3IpLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAnaW52YWxpZCBzZXNzaW9uIGlkJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGhhdmUgYSB0aW1lciBydW5uaW5nIGJlZm9yZSBvciBhZnRlciBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDAuMjUpO1xuICAgICAgICBuZXdTZXNzaW9uLnNlc3Npb25JZC5zaG91bGQuZXF1YWwoZC5zZXNzaW9uSWQpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHNob3VsZC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldHRpbmdzIGFwaScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlfSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byBnZXQgc2V0dGluZ3Mgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkLnNldHRpbmdzLmdldFNldHRpbmdzKCkuaWdub3JlVW5pbXBvcnRhbnRWaWV3cy5zaG91bGQuYmUuZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgbm90IHJlamVjdCB3aGVuIGB1cGRhdGVTZXR0aW5nc2AgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IHRydWV9KS5zaG91bGQubm90LmJlLnJlamVjdGVkO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBmb3IgaW52YWxpZCB1cGRhdGUgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBkLnNldHRpbmdzXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIC51cGRhdGUoJ2ludmFsaWQganNvbicpXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0pTT04nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3VuZXhwZWN0ZWQgZXhpdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvKiogQHR5cGUge2ltcG9ydCgnc2lub24nKS5TaW5vblNhbmRib3h9ICovXG4gICAgICBsZXQgc2FuZGJveDtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgY3VycmVudCBjb21tYW5kIHdoZW4gdGhlIGRyaXZlciBjcmFzaGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94LnN0dWIoZCwgJ2dldFN0YXR1cycpLmNhbGxzRmFrZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSg1MDAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlcVByb21pc2UgPSBnZXRDb21tYW5kKCdzdGF0dXMnLCB7dmFsaWRhdGVTdGF0dXM6IG51bGx9KTtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3QgZ2V0cyB0byB0aGUgc2VydmVyIGJlZm9yZSBvdXIgc2h1dGRvd25cbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDApO1xuICAgICAgICBjb25zdCBzaHV0ZG93bkV2ZW50UHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICdvblVuZXhwZWN0ZWRTaHV0ZG93biBldmVudCBpcyBleHBlY3RlZCB0byBiZSBmaXJlZCB3aXRoaW4gNSBzZWNvbmRzIHRpbWVvdXQnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgNTAwMFxuICAgICAgICAgICk7XG4gICAgICAgICAgZC5vblVuZXhwZWN0ZWRTaHV0ZG93bihyZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGQuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24obmV3IEVycm9yKCdDcmFzaHl0aW1lcycpKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCByZXFQcm9taXNlO1xuICAgICAgICB2YWx1ZS5tZXNzYWdlLnNob3VsZC5jb250YWluKCdDcmFzaHl0aW1lcycpO1xuICAgICAgICBhd2FpdCBzaHV0ZG93bkV2ZW50UHJvbWlzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2V2ZW50IHRpbWluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBhZGQgdGltaW5ncyBpZiBub3QgdXNpbmcgb3B0LWluIGNhcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbih7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzfX0pO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRTZXNzaW9uKHNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChyZXMuZXZlbnRzKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWRkIHN0YXJ0IHNlc3Npb24gdGltaW5ncycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY2FwcyA9IHsuLi5kZWZhdWx0Q2FwcywgJ2FwcGl1bTpldmVudFRpbWluZ3MnOiB0cnVlfTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbih7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGNhcHN9fSk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzLmV2ZW50cyk7XG4gICAgICAgIHNob3VsZC5leGlzdChyZXMuZXZlbnRzPy5uZXdTZXNzaW9uUmVxdWVzdGVkKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHJlcy5ldmVudHM/Lm5ld1Nlc3Npb25TdGFydGVkKTtcbiAgICAgICAgcmVzLmV2ZW50cz8ubmV3U2Vzc2lvblJlcXVlc3RlZFswXS5zaG91bGQuYmUuYSgnbnVtYmVyJyk7XG4gICAgICAgIHJlcy5ldmVudHM/Lm5ld1Nlc3Npb25TdGFydGVkWzBdLnNob3VsZC5iZS5hKCdudW1iZXInKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQSB7QGxpbmtjb2RlIERyaXZlckNsYXNzfSwgZXhjZXB0IHVzaW5nIHRoZSBiYXNlIHtAbGlua2NvZGUgRHJpdmVyfSB0eXBlIGluc3RlYWQgb2YgYEV4dGVybmFsRHJpdmVyYC5cbiAqIFRoaXMgYWxsb3dzIHRoZSBzdWl0ZSB0byB3b3JrIGZvciBgQmFzZURyaXZlcmAuXG4gKiBAdGVtcGxhdGUge0RyaXZlcn0gUFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckNsYXNzPFA+fSBEcml2ZXJDbGFzc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllc30gQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyfSBEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJTdGF0aWN9IERyaXZlclN0YXRpY1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVczQ0NhcGFiaWxpdGllc30gQXBwaXVtVzNDQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdheGlvcycpLkF4aW9zUmVxdWVzdENvbmZpZ30gQXhpb3NSZXF1ZXN0Q29uZmlnXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2luZ3VsYXJTZXNzaW9uRGF0YX0gU2luZ3VsYXJTZXNzaW9uRGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFQsRFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXhpb3MnKS5BeGlvc1Jlc3BvbnNlPFQsIEQ+fSBBeGlvc1Jlc3BvbnNlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBOZXdTZXNzaW9uRGF0YVxuICogQHByb3BlcnR5IHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlJlcXVpcmVBdExlYXN0T25lPGltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnfCdhbHdheXNNYXRjaCc+fSBjYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE5ld1Nlc3Npb25SZXNwb25zZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlc3Npb25JZCxcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2FwYWJpbGl0aWVzfSBjYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIFNvbWUgRTJFIGhlbHBlcnMgZm9yIG1ha2luZyByZXF1ZXN0cyBhbmQgbWFuYWdpbmcgc2Vzc2lvbnNcbiAqIFNlZSB7QGxpbmtjb2RlIGNyZWF0ZVNlc3Npb25IZWxwZXJzfVxuICogQHRlbXBsYXRlIFtDb21tYW5kRGF0YT11bmtub3duXVxuICogQHRlbXBsYXRlIFtSZXNwb25zZURhdGE9YW55XVxuICogQHR5cGVkZWYgU2Vzc2lvbkhlbHBlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuZXdTZXNzaW9uVVJMIC0gVVJMIHRvIGNyZWF0ZSBhIG5ldyBzZXNzaW9uLiBDYW4gYmUgdXNlZCB3aXRoIHJhdyBgYXhpb3NgIHJlcXVlc3RzIHRvIGZ1bGx5IGluc3BlY3QgcmF3IHJlc3BvbnNlLiAgTW9zdGx5LCB0aGlzIHdpbGwgbm90IGJlIHVzZWQuXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBOZXdTZXNzaW9uRGF0YSwgY29uZmlnPzogQXhpb3NSZXF1ZXN0Q29uZmlnKSA9PiBQcm9taXNlPE5ld1Nlc3Npb25SZXNwb25zZT59IHN0YXJ0U2Vzc2lvbiAtIEJlZ2luIGEgc2Vzc2lvblxuICogQHByb3BlcnR5IHsoc2Vzc2lvbklkOiBzdHJpbmcpID0+IFByb21pc2U8QXhpb3NSZXNwb25zZTx7dmFsdWU6IHtlcnJvcj86IHN0cmluZ30/fSwge3ZhbGlkYXRlU3RhdHVzOiBudWxsfT4+fSBlbmRTZXNzaW9uIC0gRW5kIGEgc2Vzc2lvbi4gX05vdGU6IHJlc29sdmVzIHdpdGggcmF3IHJlc3BvbnNlIG9iamVjdF9cbiAqIEBwcm9wZXJ0eSB7KHNlc3Npb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPFNpbmd1bGFyU2Vzc2lvbkRhdGE+fSBnZXRTZXNzaW9uIC0gR2V0IGluZm8gYWJvdXQgYSBzZXNzaW9uXG4gKiBAcHJvcGVydHkgeyhzZXNzaW9uSWQ6IHN0cmluZywgY21kTmFtZTogc3RyaW5nLCBkYXRhPzogQ29tbWFuZERhdGEsIGNvbmZpZz86IEF4aW9zUmVxdWVzdENvbmZpZykgPT4gUHJvbWlzZTxSZXNwb25zZURhdGE+fSBwb3N0Q29tbWFuZCAtIFNlbmQgYW4gYXJiaXRyYXJ5IGNvbW1hbmQgdmlhIGBQT1NUYC5cbiAqIEBwcm9wZXJ0eSB7KHNlc3Npb25JZE9yQ21kTmFtZTogc3RyaW5nLCBjbWROYW1lT3JDb25maWc6IHN0cmluZ3xBeGlvc1JlcXVlc3RDb25maWcsIGNvbmZpZz86IEF4aW9zUmVxdWVzdENvbmZpZykgPT4gUHJvbWlzZTxSZXNwb25zZURhdGE+fSBnZXRDb21tYW5kIC0gU2VuZCBhbiBhcmJpdHJhcnkgY29tbWFuZCB2aWEgYEdFVGAuIE9wdGlvbmFsIGBzZXNzaW9uSWRgLlxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLE1BQU0sR0FBR0MsYUFBQSxDQUFLRCxNQUFMLEVBQWY7O0FBVU8sU0FBU0Usb0JBQVQsQ0FBOEJDLElBQTlCLEVBQW9DQyxPQUFPLEdBQUdDLGtCQUE5QyxFQUF5RDtFQUM5RCxNQUFNQyxtQkFBbUIsR0FFckIsSUFBQUMsd0JBQUEsRUFBZ0JILE9BQWhCLEVBQXlCRCxJQUF6QixDQUZKO0VBS0EsTUFBTUssZ0JBQWdCLEdBQUdG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
388
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaG91bGQiLCJjaGFpIiwiY3JlYXRlU2Vzc2lvbkhlbHBlcnMiLCJwb3J0IiwiYWRkcmVzcyIsIlRFU1RfSE9TVCIsImNyZWF0ZUFwcGl1bVRlc3RVUkwiLCJjcmVhdGVBcHBpdW1VUkwiLCJjcmVhdGVTZXNzaW9uVVJMIiwiXyIsIm5ld1Nlc3Npb25VUkwiLCJwb3N0Q29tbWFuZCIsInNlc3Npb25JZCIsImNtZE5hbWUiLCJkYXRhIiwiY29uZmlnIiwidXJsIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJ2YWx1ZSIsImdldENvbW1hbmQiLCJzZXNzaW9uSWRPckNtZE5hbWUiLCJjbWROYW1lT3JDb25maWciLCJpc1N0cmluZyIsInZhbGlkYXRlU3RhdHVzIiwic3RhcnRTZXNzaW9uIiwiZGVmYXVsdHNEZWVwIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwiZW5kU2Vzc2lvbiIsImRlbGV0ZSIsImdldFNlc3Npb24iLCJkcml2ZXJFMkVUZXN0U3VpdGUiLCJEcml2ZXJDbGFzcyIsImRlZmF1bHRDYXBzIiwiY2xhc3NOYW1lIiwibmFtZSIsImRlc2NyaWJlIiwiYmFzZVNlcnZlciIsImQiLCJiZWZvcmUiLCJnZXRUZXN0UG9ydCIsInNlcnZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsImhvc3RuYW1lIiwiY2xpQXJncyIsImFmdGVyIiwiY2xvc2UiLCJpdCIsInNlc3Npb25JZHMiLCJ0aW1lcyIsImhlYWRlcnMiLCJzaW1wbGUiLCJyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSIsInB1c2giLCJ1bmlxIiwibGVuZ3RoIiwiZXF1YWwiLCJzdGF0dXMiLCJyZXFzIiwibWFwIiwiQiIsImFsbCIsImV4aXN0IiwicGxhdGZvcm1OYW1lIiwiZGV2aWNlTmFtZSIsInNraXAiLCJvcmlnaW5hbEZpbmRFbGVtZW50Iiwib3JpZ2luYWxGaW5kRWxlbWVudHMiLCJzdGFydFRpbWVvdXRTZXNzaW9uIiwidGltZW91dCIsImNhcHMiLCJjbG9uZURlZXAiLCJmaW5kRWxlbWVudCIsImJpbmQiLCJmaW5kRWxlbWVudHMiLCJkZWxheSIsIm5ld1Nlc3Npb24iLCJuZXdDb21tYW5kVGltZW91dE1zIiwiYmUiLCJhYm92ZSIsInVzaW5nIiwiZXJyb3IiLCJyZXNwIiwic3RhcnQiLCJEYXRlIiwibm93IiwiZXFsIiwibm90Iiwibm9Db21tYW5kVGltZXIiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImdldFNldHRpbmdzIiwiZmFsc2UiLCJ1cGRhdGUiLCJyZWplY3RlZCIsInJlamVjdGVkV2l0aCIsInNhbmRib3giLCJiZWZvcmVFYWNoIiwic2lub24iLCJjcmVhdGVTYW5kYm94IiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsInN0dWIiLCJjYWxsc0Zha2UiLCJyZXFQcm9taXNlIiwic2h1dGRvd25FdmVudFByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsIkVycm9yIiwib25VbmV4cGVjdGVkU2h1dGRvd24iLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsIm1lc3NhZ2UiLCJjb250YWluIiwic2Vzc2lvbiIsInJlcyIsImV2ZW50cyIsIm5ld1Nlc3Npb25SZXF1ZXN0ZWQiLCJuZXdTZXNzaW9uU3RhcnRlZCIsImEiXSwic291cmNlcyI6WyIuLi8uLi9saWIvZTJlLXN1aXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge3NlcnZlciwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtURVNUX0hPU1QsIGdldFRlc3RQb3J0LCBjcmVhdGVBcHBpdW1VUkx9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmNvbnN0IHNob3VsZCA9IGNoYWkuc2hvdWxkKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBzb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIEUyRSB0ZXN0cyB0byBtYW5hZ2Ugc2Vzc2lvbnMuXG4gKiBAdGVtcGxhdGUgW0NvbW1hbmREYXRhPXVua25vd25dXG4gKiBAdGVtcGxhdGUgW1Jlc3BvbnNlRGF0YT1hbnldXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBpcyBydW5uaW5nLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHJldHJpZXZlZCB2aWEgYGdldC1wb3J0YCBiZWZvcmVoYW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FkZHJlc3NdIC0gQWRkcmVzcy9ob3N0IG9uIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4gRGVmYXVsdHMgdG8ge0BsaW5rY29kZSBURVNUX0hPU1R9XG4gKiBAcmV0dXJucyB7U2Vzc2lvbkhlbHBlcnM8Q29tbWFuZERhdGEsIFJlc3BvbnNlRGF0YT59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXNzaW9uSGVscGVycyhwb3J0LCBhZGRyZXNzID0gVEVTVF9IT1NUKSB7XG4gIGNvbnN0IGNyZWF0ZUFwcGl1bVRlc3RVUkwgPVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdsb2Rhc2gnKS5DdXJyaWVkRnVuY3Rpb24yPHN0cmluZyxzdHJpbmcsc3RyaW5nPn0gKi8gKFxuICAgICAgY3JlYXRlQXBwaXVtVVJMKGFkZHJlc3MsIHBvcnQpXG4gICAgKTtcblxuICBjb25zdCBjcmVhdGVTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVGVzdFVSTChfLCAnJyk7XG4gIGNvbnN0IG5ld1Nlc3Npb25VUkwgPSBjcmVhdGVBcHBpdW1UZXN0VVJMKCcnLCAnc2Vzc2lvbicpO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyczxDb21tYW5kRGF0YSwgUmVzcG9uc2VEYXRhPn0gKi8gKHtcbiAgICBuZXdTZXNzaW9uVVJMLFxuICAgIGNyZWF0ZUFwcGl1bVRlc3RVUkwsXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNtZE5hbWVcbiAgICAgKiBAcGFyYW0ge2FueX0gW2RhdGFdXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBwb3N0Q29tbWFuZDogYXN5bmMgKHNlc3Npb25JZCwgY21kTmFtZSwgZGF0YSA9IHt9LCBjb25maWcgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gY3JlYXRlQXBwaXVtVGVzdFVSTChzZXNzaW9uSWQsIGNtZE5hbWUpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgZGF0YSwgY29uZmlnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZE9yQ21kTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEF4aW9zUmVxdWVzdENvbmZpZ30gY21kTmFtZU9yQ29uZmlnXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBnZXRDb21tYW5kOiBhc3luYyAoc2Vzc2lvbklkT3JDbWROYW1lLCBjbWROYW1lT3JDb25maWcsIGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoY21kTmFtZU9yQ29uZmlnKSkge1xuICAgICAgICBjb25maWcgPSBjbWROYW1lT3JDb25maWc7XG4gICAgICAgIGNtZE5hbWVPckNvbmZpZyA9IHNlc3Npb25JZE9yQ21kTmFtZTtcbiAgICAgICAgc2Vzc2lvbklkT3JDbWROYW1lID0gJyc7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBjcmVhdGVBcHBpdW1UZXN0VVJMKHNlc3Npb25JZE9yQ21kTmFtZSwgY21kTmFtZU9yQ29uZmlnKSxcbiAgICAgICAgdmFsaWRhdGVTdGF0dXM6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LnZhbHVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge05ld1Nlc3Npb25EYXRhfSBkYXRhXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICovXG4gICAgc3RhcnRTZXNzaW9uOiBhc3luYyAoZGF0YSwgY29uZmlnID0ge30pID0+IHtcbiAgICAgIGRhdGEgPSBfLmRlZmF1bHRzRGVlcChkYXRhLCB7XG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgICAgICBmaXJzdE1hdGNoOiBbe31dLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QobmV3U2Vzc2lvblVSTCwgZGF0YSwgY29uZmlnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqL1xuICAgIGVuZFNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+XG4gICAgICBhd2FpdCBheGlvcy5kZWxldGUoY3JlYXRlU2Vzc2lvblVSTChzZXNzaW9uSWQpLCB7XG4gICAgICAgIHZhbGlkYXRlU3RhdHVzOiBudWxsLFxuICAgICAgfSksXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgZ2V0U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogY3JlYXRlU2Vzc2lvblVSTChzZXNzaW9uSWQpLFxuICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LnZhbHVlO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRTJFIHRlc3Qgc3VpdGVzIGZvciBhIGRyaXZlci5cbiAqIEB0ZW1wbGF0ZSB7RHJpdmVyfSBQXG4gKiBAcGFyYW0ge0RyaXZlckNsYXNzPFA+fSBEcml2ZXJDbGFzc1xuICogQHBhcmFtIHtQYXJ0aWFsPEJhc2VOU0NhcGFiaWxpdGllcz59IFtkZWZhdWx0Q2Fwc11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXZlckUyRVRlc3RTdWl0ZShEcml2ZXJDbGFzcywgZGVmYXVsdENhcHMgPSB7fSkge1xuICBsZXQgYWRkcmVzcyA9IGRlZmF1bHRDYXBzWydhcHBpdW06YWRkcmVzcyddID8/IFRFU1RfSE9TVDtcbiAgbGV0IHBvcnQgPSBkZWZhdWx0Q2Fwc1snYXBwaXVtOnBvcnQnXTtcbiAgY29uc3QgY2xhc3NOYW1lID0gRHJpdmVyQ2xhc3MubmFtZSB8fCAnKHVua25vd24gZHJpdmVyKSc7XG5cbiAgZGVzY3JpYmUoYEJhc2VEcml2ZXIgRTJFIChhcyAke2NsYXNzTmFtZX0pYCwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBiYXNlU2VydmVyO1xuICAgIC8qKiBAdHlwZSB7UH0gKi9cbiAgICBsZXQgZDtcbiAgICAvKipcbiAgICAgKiBUaGlzIFVSTCBjcmVhdGVzIGEgbmV3IHNlc3Npb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqKi9cbiAgICBsZXQgbmV3U2Vzc2lvblVSTDtcblxuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ3N0YXJ0U2Vzc2lvbiddfSAqL1xuICAgIGxldCBzdGFydFNlc3Npb247XG4gICAgLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyc1snZ2V0U2Vzc2lvbiddfSAqL1xuICAgIGxldCBnZXRTZXNzaW9uO1xuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ2VuZFNlc3Npb24nXX0gKi9cbiAgICBsZXQgZW5kU2Vzc2lvbjtcbiAgICAvKiogQHR5cGUge1Nlc3Npb25IZWxwZXJzWydnZXRDb21tYW5kJ119ICovXG4gICAgbGV0IGdldENvbW1hbmQ7XG4gICAgLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyc1sncG9zdENvbW1hbmQnXX0gKi9cbiAgICBsZXQgcG9zdENvbW1hbmQ7XG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHBvcnQgPSBwb3J0ID8/IChhd2FpdCBnZXRUZXN0UG9ydCgpKTtcbiAgICAgIGRlZmF1bHRDYXBzID0gey4uLmRlZmF1bHRDYXBzfTtcbiAgICAgIGQgPSBuZXcgRHJpdmVyQ2xhc3Moe3BvcnQsIGFkZHJlc3N9KTtcbiAgICAgIGJhc2VTZXJ2ZXIgPSBhd2FpdCBzZXJ2ZXIoe1xuICAgICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbihkKSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgaG9zdG5hbWU6IGFkZHJlc3MsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY2xpQXJnczoge30sXG4gICAgICB9KTtcbiAgICAgICh7c3RhcnRTZXNzaW9uLCBnZXRTZXNzaW9uLCBlbmRTZXNzaW9uLCBuZXdTZXNzaW9uVVJMLCBnZXRDb21tYW5kLCBwb3N0Q29tbWFuZH0gPVxuICAgICAgICBjcmVhdGVTZXNzaW9uSGVscGVycyhwb3J0LCBhZGRyZXNzKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBiYXNlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2Vzc2lvbiBoYW5kbGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGlkZW1wb3RlbmN5IHdoaWxlIGNyZWF0aW5nIHNlc3Npb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRzID0gW107XG4gICAgICAgIGxldCB0aW1lcyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCB7c2Vzc2lvbklkfSA9IGF3YWl0IHN0YXJ0U2Vzc2lvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnWC1JZGVtcG90ZW5jeS1LZXknOiAnMTIzNDU2JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gWFhYOiBJJ20gbm90IHN1cmUgd2hhdCB0aGVzZSBhcmUsIGFzIHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIGF4aW9zIG9wdGlvbnMsXG4gICAgICAgICAgICAgIC8vIG5vciBhcmUgdGhleSBtZW50aW9uZWQgaW4gb3VyIHNvdXJjZVxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgIHNpbXBsZTogZmFsc2UsXG4gICAgICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzZXNzaW9uSWRzLnB1c2goc2Vzc2lvbklkKTtcbiAgICAgICAgICB0aW1lcysrO1xuICAgICAgICB9IHdoaWxlICh0aW1lcyA8IDIpO1xuICAgICAgICBfLnVuaXEoc2Vzc2lvbklkcykubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgICBjb25zdCB7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGVuZFNlc3Npb24oc2Vzc2lvbklkc1swXSk7XG4gICAgICAgIHN0YXR1cy5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGRhdGEudmFsdWUsIG51bGwpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGlkZW1wb3RlbmN5IHdoaWxlIGNyZWF0aW5nIHBhcmFsbGVsIHNlc3Npb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXFzID0gW107XG4gICAgICAgIGxldCB0aW1lcyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXFzLnB1c2goXG4gICAgICAgICAgICBzdGFydFNlc3Npb24oXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIGFsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgJ1gtSWRlbXBvdGVuY3ktS2V5JzogJzEyMzQ1JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aW1lcysrO1xuICAgICAgICB9IHdoaWxlICh0aW1lcyA8IDIpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRzID0gXy5tYXAoYXdhaXQgQi5hbGwocmVxcyksICdzZXNzaW9uSWQnKTtcbiAgICAgICAgXy51bmlxKHNlc3Npb25JZHMpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgICAgY29uc3Qge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBlbmRTZXNzaW9uKHNlc3Npb25JZHNbMF0pO1xuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLCBudWxsKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBzZXNzaW9uIGFuZCByZXRyaWV2ZSBhIHNlc3Npb24gaWQsIHRoZW4gZGVsZXRlIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBheGlvcy5wb3N0KG5ld1Nlc3Npb25VUkwsIHtcbiAgICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgIGFsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5leGlzdChkYXRhLnZhbHVlLnNlc3Npb25JZCk7XG4gICAgICAgIGRhdGEudmFsdWUuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHMucGxhdGZvcm1OYW1lKTtcbiAgICAgICAgZGF0YS52YWx1ZS5jYXBhYmlsaXRpZXMuZGV2aWNlTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10pO1xuXG4gICAgICAgICh7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGVuZFNlc3Npb24oLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCkpKTtcblxuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLCBudWxsKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkLCBudWxsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQuc2tpcCgnc2hvdWxkIHRocm93IE5ZSSBmb3IgY29tbWFuZHMgbm90IGltcGxlbWVudGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge30pO1xuXG4gICAgZGVzY3JpYmUoJ2NvbW1hbmQgdGltZW91dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgb3JpZ2luYWxGaW5kRWxlbWVudCwgb3JpZ2luYWxGaW5kRWxlbWVudHM7XG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAgICovXG4gICAgICBhc3luYyBmdW5jdGlvbiBzdGFydFRpbWVvdXRTZXNzaW9uKHRpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgY2FwcyA9IF8uY2xvbmVEZWVwKGRlZmF1bHRDYXBzKTtcbiAgICAgICAgY2Fwc1snYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0J10gPSB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gYXdhaXQgc3RhcnRTZXNzaW9uKHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogY2Fwc319KTtcbiAgICAgIH1cblxuICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudCA9IGQuZmluZEVsZW1lbnQ7XG4gICAgICAgIGQuZmluZEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICdmb28nO1xuICAgICAgICB9LmJpbmQoZCk7XG5cbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudHMgPSBkLmZpbmRFbGVtZW50cztcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSgyMDApO1xuICAgICAgICAgIHJldHVybiBbJ2ZvbyddO1xuICAgICAgICB9LmJpbmQoZCk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkLmZpbmRFbGVtZW50ID0gb3JpZ2luYWxGaW5kRWxlbWVudDtcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBvcmlnaW5hbEZpbmRFbGVtZW50cztcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBhIGRlZmF1bHQgY29tbWFuZFRpbWVvdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigpO1xuICAgICAgICBkLm5ld0NvbW1hbmRUaW1lb3V0TXMuc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRpbWVvdXQgb24gY29tbWFuZHMgdXNpbmcgY29tbWFuZFRpbWVvdXQgY2FwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oMC4yNSk7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpO1xuICAgICAgICBhd2FpdCBwb3N0Q29tbWFuZChzZXNzaW9uSWQsICdlbGVtZW50Jywge1xuICAgICAgICAgIHVzaW5nOiAnbmFtZScsXG4gICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg0MDApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHZhbHVlLmVycm9yLCAnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSAoYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCkpLmRhdGEudmFsdWU7XG4gICAgICAgIHNob3VsZC5lcXVhbChyZXNwPy5lcnJvciwgJ2ludmFsaWQgc2Vzc2lvbiBpZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHRpbWVvdXQgd2l0aCBjb21tYW5kVGltZW91dCBvZiBmYWxzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDAuMSk7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcG9zdENvbW1hbmQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCksICdlbGVtZW50cycsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIChEYXRlLm5vdygpIC0gc3RhcnQpLnNob3VsZC5iZS5hYm92ZSgxNTApO1xuICAgICAgICB2YWx1ZS5zaG91bGQuZXFsKFsnZm9vJ10pO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IHdpdGggY29tbWFuZFRpbWVvdXQgb2YgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5uZXdDb21tYW5kVGltZW91dE1zID0gMjtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDApO1xuXG4gICAgICAgIGF3YWl0IHBvc3RDb21tYW5kKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpLCAnZWxlbWVudCcsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBnZXRTZXNzaW9uKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpKTtcbiAgICAgICAgdmFsdWUucGxhdGZvcm1OYW1lPy5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHMucGxhdGZvcm1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVzcCA9IChhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKSkuZGF0YS52YWx1ZTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlc3AsIG51bGwpO1xuXG4gICAgICAgIGQubmV3Q29tbWFuZFRpbWVvdXRNcyA9IDYwICogMTAwMDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IGlmIGl0cyBqdXN0IHRoZSBjb21tYW5kIHRha2luZyBhd2hpbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgLy8gWFhYOiByYWNlIGNvbmRpdGlvbjogd2UgbXVzdCBidWlsZCB0aGlzIFVSTCBiZWZvcmUgLi4uc29tZXRoaW5nIGhhcHBlbnMuLi5cbiAgICAgICAgLy8gd2hpY2ggY2F1c2VzIGBkLnNlc3Npb25JZGAgdG8gYmUgbWlzc2luZ1xuICAgICAgICBjb25zdCB7c2Vzc2lvbklkfSA9IGQ7XG5cbiAgICAgICAgYXdhaXQgcG9zdENvbW1hbmQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCksICdlbGVtZW50Jywge1xuICAgICAgICAgIHVzaW5nOiAnbmFtZScsXG4gICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg0MDApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGdldFNlc3Npb24oLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzZXNzaW9uSWQpKTtcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovICh2YWx1ZS5lcnJvcikuc2hvdWxkLmVxdWFsKCdpbnZhbGlkIHNlc3Npb24gaWQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkLCBudWxsKTtcbiAgICAgICAgY29uc3QgcmVzcCA9IChhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKSkuZGF0YS52YWx1ZTtcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovICgvKiogQHR5cGUgeyB7ZXJyb3I6IHN0cmluZ30gfSAqLyAocmVzcCkuZXJyb3IpLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAnaW52YWxpZCBzZXNzaW9uIGlkJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGhhdmUgYSB0aW1lciBydW5uaW5nIGJlZm9yZSBvciBhZnRlciBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDAuMjUpO1xuICAgICAgICBuZXdTZXNzaW9uLnNlc3Npb25JZC5zaG91bGQuZXF1YWwoZC5zZXNzaW9uSWQpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHNob3VsZC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldHRpbmdzIGFwaScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlfSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byBnZXQgc2V0dGluZ3Mgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkLnNldHRpbmdzLmdldFNldHRpbmdzKCkuaWdub3JlVW5pbXBvcnRhbnRWaWV3cy5zaG91bGQuYmUuZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgbm90IHJlamVjdCB3aGVuIGB1cGRhdGVTZXR0aW5nc2AgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IHRydWV9KS5zaG91bGQubm90LmJlLnJlamVjdGVkO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBmb3IgaW52YWxpZCB1cGRhdGUgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBkLnNldHRpbmdzXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIC51cGRhdGUoJ2ludmFsaWQganNvbicpXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0pTT04nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3VuZXhwZWN0ZWQgZXhpdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvKiogQHR5cGUge2ltcG9ydCgnc2lub24nKS5TaW5vblNhbmRib3h9ICovXG4gICAgICBsZXQgc2FuZGJveDtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgY3VycmVudCBjb21tYW5kIHdoZW4gdGhlIGRyaXZlciBjcmFzaGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94LnN0dWIoZCwgJ2dldFN0YXR1cycpLmNhbGxzRmFrZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSg1MDAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlcVByb21pc2UgPSBnZXRDb21tYW5kKCdzdGF0dXMnLCB7dmFsaWRhdGVTdGF0dXM6IG51bGx9KTtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3QgZ2V0cyB0byB0aGUgc2VydmVyIGJlZm9yZSBvdXIgc2h1dGRvd25cbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDApO1xuICAgICAgICBjb25zdCBzaHV0ZG93bkV2ZW50UHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICdvblVuZXhwZWN0ZWRTaHV0ZG93biBldmVudCBpcyBleHBlY3RlZCB0byBiZSBmaXJlZCB3aXRoaW4gNSBzZWNvbmRzIHRpbWVvdXQnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgNTAwMFxuICAgICAgICAgICk7XG4gICAgICAgICAgZC5vblVuZXhwZWN0ZWRTaHV0ZG93bihyZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGQuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24obmV3IEVycm9yKCdDcmFzaHl0aW1lcycpKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCByZXFQcm9taXNlO1xuICAgICAgICB2YWx1ZS5tZXNzYWdlLnNob3VsZC5jb250YWluKCdDcmFzaHl0aW1lcycpO1xuICAgICAgICBhd2FpdCBzaHV0ZG93bkV2ZW50UHJvbWlzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2V2ZW50IHRpbWluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBhZGQgdGltaW5ncyBpZiBub3QgdXNpbmcgb3B0LWluIGNhcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbih7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzfX0pO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRTZXNzaW9uKHNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChyZXMuZXZlbnRzKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWRkIHN0YXJ0IHNlc3Npb24gdGltaW5ncycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY2FwcyA9IHsuLi5kZWZhdWx0Q2FwcywgJ2FwcGl1bTpldmVudFRpbWluZ3MnOiB0cnVlfTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbih7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGNhcHN9fSk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzLmV2ZW50cyk7XG4gICAgICAgIHNob3VsZC5leGlzdChyZXMuZXZlbnRzPy5uZXdTZXNzaW9uUmVxdWVzdGVkKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHJlcy5ldmVudHM/Lm5ld1Nlc3Npb25TdGFydGVkKTtcbiAgICAgICAgcmVzLmV2ZW50cz8ubmV3U2Vzc2lvblJlcXVlc3RlZFswXS5zaG91bGQuYmUuYSgnbnVtYmVyJyk7XG4gICAgICAgIHJlcy5ldmVudHM/Lm5ld1Nlc3Npb25TdGFydGVkWzBdLnNob3VsZC5iZS5hKCdudW1iZXInKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQSB7QGxpbmtjb2RlIERyaXZlckNsYXNzfSwgZXhjZXB0IHVzaW5nIHRoZSBiYXNlIHtAbGlua2NvZGUgRHJpdmVyfSB0eXBlIGluc3RlYWQgb2YgYEV4dGVybmFsRHJpdmVyYC5cbiAqIFRoaXMgYWxsb3dzIHRoZSBzdWl0ZSB0byB3b3JrIGZvciBgQmFzZURyaXZlcmAuXG4gKiBAdGVtcGxhdGUge0RyaXZlcn0gUFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckNsYXNzPFA+fSBEcml2ZXJDbGFzc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlcn0gRHJpdmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludHN9IENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyU3RhdGljfSBEcml2ZXJTdGF0aWNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TdHJpbmdSZWNvcmR9IFN0cmluZ1JlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkJhc2VEcml2ZXJDYXBDb25zdHJhaW50c30gQmFzZURyaXZlckNhcENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQmFzZU5TQ2FwYWJpbGl0aWVzfSBCYXNlTlNDYXBhYmlsaXRpZXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2F4aW9zJykuQXhpb3NSZXF1ZXN0Q29uZmlnfSBBeGlvc1JlcXVlc3RDb25maWdcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TaW5ndWxhclNlc3Npb25EYXRhfSBTaW5ndWxhclNlc3Npb25EYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVCxEXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdheGlvcycpLkF4aW9zUmVzcG9uc2U8VCwgRD59IEF4aW9zUmVzcG9uc2VcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYgTmV3U2Vzc2lvbkRhdGFcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCd0eXBlLWZlc3QnKS5SZXF1aXJlQXRMZWFzdE9uZTxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8QywgRXh0cmE+LCAnZmlyc3RNYXRjaCd8J2Fsd2F5c01hdGNoJz59IGNhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIHtTdHJpbmdSZWNvcmR8dm9pZH0gW0V4dHJhPXZvaWRdXG4gKiBAdHlwZWRlZiBOZXdTZXNzaW9uUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXNzaW9uSWQsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllczxDLCBFeHRyYT59IGNhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogU29tZSBFMkUgaGVscGVycyBmb3IgbWFraW5nIHJlcXVlc3RzIGFuZCBtYW5hZ2luZyBzZXNzaW9uc1xuICogU2VlIHtAbGlua2NvZGUgY3JlYXRlU2Vzc2lvbkhlbHBlcnN9XG4gKiBAdGVtcGxhdGUgW0NvbW1hbmREYXRhPXVua25vd25dXG4gKiBAdGVtcGxhdGUgW1Jlc3BvbnNlRGF0YT1hbnldXG4gKiBAdHlwZWRlZiBTZXNzaW9uSGVscGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5ld1Nlc3Npb25VUkwgLSBVUkwgdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24uIENhbiBiZSB1c2VkIHdpdGggcmF3IGBheGlvc2AgcmVxdWVzdHMgdG8gZnVsbHkgaW5zcGVjdCByYXcgcmVzcG9uc2UuICBNb3N0bHksIHRoaXMgd2lsbCBub3QgYmUgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IE5ld1Nlc3Npb25EYXRhLCBjb25maWc/OiBBeGlvc1JlcXVlc3RDb25maWcpID0+IFByb21pc2U8TmV3U2Vzc2lvblJlc3BvbnNlPn0gc3RhcnRTZXNzaW9uIC0gQmVnaW4gYSBzZXNzaW9uXG4gKiBAcHJvcGVydHkgeyhzZXNzaW9uSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxBeGlvc1Jlc3BvbnNlPHt2YWx1ZToge2Vycm9yPzogc3RyaW5nfT99LCB7dmFsaWRhdGVTdGF0dXM6IG51bGx9Pj59IGVuZFNlc3Npb24gLSBFbmQgYSBzZXNzaW9uLiBfTm90ZTogcmVzb2x2ZXMgd2l0aCByYXcgcmVzcG9uc2Ugb2JqZWN0X1xuICogQHByb3BlcnR5IHsoc2Vzc2lvbklkOiBzdHJpbmcpID0+IFByb21pc2U8U2luZ3VsYXJTZXNzaW9uRGF0YT59IGdldFNlc3Npb24gLSBHZXQgaW5mbyBhYm91dCBhIHNlc3Npb25cbiAqIEBwcm9wZXJ0eSB7KHNlc3Npb25JZDogc3RyaW5nLCBjbWROYW1lOiBzdHJpbmcsIGRhdGE/OiBDb21tYW5kRGF0YSwgY29uZmlnPzogQXhpb3NSZXF1ZXN0Q29uZmlnKSA9PiBQcm9taXNlPFJlc3BvbnNlRGF0YT59IHBvc3RDb21tYW5kIC0gU2VuZCBhbiBhcmJpdHJhcnkgY29tbWFuZCB2aWEgYFBPU1RgLlxuICogQHByb3BlcnR5IHsoc2Vzc2lvbklkT3JDbWROYW1lOiBzdHJpbmcsIGNtZE5hbWVPckNvbmZpZzogc3RyaW5nfEF4aW9zUmVxdWVzdENvbmZpZywgY29uZmlnPzogQXhpb3NSZXF1ZXN0Q29uZmlnKSA9PiBQcm9taXNlPFJlc3BvbnNlRGF0YT59IGdldENvbW1hbmQgLSBTZW5kIGFuIGFyYml0cmFyeSBjb21tYW5kIHZpYSBgR0VUYC4gT3B0aW9uYWwgYHNlc3Npb25JZGAuXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsTUFBTSxHQUFHQyxhQUFBLENBQUtELE1BQUwsRUFBZjs7QUFVTyxTQUFTRSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLE9BQU8sR0FBR0Msa0JBQTlDLEVBQXlEO0VBQzlELE1BQU1DLG1CQUFtQixHQUVyQixJQUFBQyx3QkFBQSxFQUFnQkgsT0FBaEIsRUFBeUJELElBQXpCLENBRko7RUFLQSxNQUFNSyxnQkFBZ0IsR0FBR0YsbUJBQW1CLENBQUNHLGVBQUQsRUFBSSxFQUFKLENBQTVDO0VBQ0EsTUFBTUMsYUFBYSxHQUFHSixtQkFBbUIsQ0FBQyxFQUFELEVBQUssU0FBTCxDQUF6QztFQUNBLE9BQWlFO0lBQy9ESSxhQUQrRDtJQUUvREosbUJBRitEO0lBVy9ESyxXQUFXLEVBQUUsT0FBT0MsU0FBUCxFQUFrQkMsT0FBbEIsRUFBMkJDLElBQUksR0FBRyxFQUFsQyxFQUFzQ0MsTUFBTSxHQUFHLEVBQS9DLEtBQXNEO01BQUE7O01BQ2pFLE1BQU1DLEdBQUcsR0FBR1YsbUJBQW1CLENBQUNNLFNBQUQsRUFBWUMsT0FBWixDQUEvQjtNQUNBLE1BQU1JLFFBQVEsR0FBRyxNQUFNQyxjQUFBLENBQU1DLElBQU4sQ0FBV0gsR0FBWCxFQUFnQkYsSUFBaEIsRUFBc0JDLE1BQXRCLENBQXZCO01BQ0EseUJBQU9FLFFBQVEsQ0FBQ0gsSUFBaEIsbURBQU8sZUFBZU0sS0FBdEI7SUFDRCxDQWY4RDtJQXVCL0RDLFVBQVUsRUFBRSxPQUFPQyxrQkFBUCxFQUEyQkMsZUFBM0IsRUFBNENSLE1BQU0sR0FBRyxFQUFyRCxLQUE0RDtNQUFBOztNQUN0RSxJQUFJ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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-suite.js","names":["should","chai","createSessionHelpers","port","address","TEST_HOST","createAppiumTestURL","createAppiumURL","createSessionURL","_","newSessionURL","postCommand","sessionId","cmdName","data","config","url","response","axios","post","value","getCommand","sessionIdOrCmdName","cmdNameOrConfig","isString","validateStatus","startSession","defaultsDeep","capabilities","alwaysMatch","firstMatch","endSession","delete","getSession","driverE2ETestSuite","DriverClass","defaultCaps","className","name","describe","baseServer","d","before","getTestPort","server","routeConfiguringFunction","hostname","cliArgs","after","close","it","sessionIds","times","headers","simple","resolveWithFullResponse","push","uniq","length","equal","status","reqs","map","B","all","exist","platformName","deviceName","skip","originalFindElement","originalFindElements","startTimeoutSession","timeout","caps","cloneDeep","findElement","bind","findElements","delay","newSession","newCommandTimeoutMs","be","above","using","error","resp","start","Date","now","eql","not","noCommandTimer","settings","DeviceSettings","ignoreUnimportantViews","getSettings","false","update","rejected","rejectedWith","sandbox","beforeEach","sinon","createSandbox","afterEach","restore","stub","callsFake","reqPromise","shutdownEventPromise","resolve","reject","setTimeout","Error","onUnexpectedShutdown","startUnexpectedShutdown","message","contain","session","res","events","newSessionRequested","newSessionStarted","a"],"sources":["../../lib/e2e-suite.js"],"sourcesContent":["import _ from 'lodash';\nimport {server, routeConfiguringFunction, DeviceSettings} from 'appium/driver';\nimport axios from 'axios';\nimport B from 'bluebird';\nimport {TEST_HOST, getTestPort, createAppiumURL} from './helpers';\nimport chai from 'chai';\nimport sinon from 'sinon';\n\nconst should = chai.should();\n\n/**\n * Creates some helper functions for E2E tests to manage sessions.\n * @template [CommandData=unknown]\n * @template [ResponseData=any]\n * @param {number} port - Port on which the server is running. Typically this will be retrieved via `get-port` beforehand\n * @param {string} [address] - Address/host on which the server is running. Defaults to {@linkcode TEST_HOST}\n * @returns {SessionHelpers<CommandData, ResponseData>}\n */\nexport function createSessionHelpers(port, address = TEST_HOST) {\n const createAppiumTestURL =\n /** @type {import('lodash').CurriedFunction2<string,string,string>} */ (\n createAppiumURL(address, port)\n );\n\n const createSessionURL = createAppiumTestURL(_, '');\n const newSessionURL = createAppiumTestURL('', 'session');\n return /** @type {SessionHelpers<CommandData, ResponseData>} */ ({\n newSessionURL,\n createAppiumTestURL,\n /**\n *\n * @param {string} sessionId\n * @param {string} cmdName\n * @param {any} [data]\n * @param {AxiosRequestConfig} [config]\n * @returns {Promise<any>}\n */\n postCommand: async (sessionId, cmdName, data = {}, config = {}) => {\n const url = createAppiumTestURL(sessionId, cmdName);\n const response = await axios.post(url, data, config);\n return response.data?.value;\n },\n /**\n *\n * @param {string} sessionIdOrCmdName\n * @param {string|AxiosRequestConfig} cmdNameOrConfig\n * @param {AxiosRequestConfig} [config]\n * @returns {Promise<any>}\n */\n getCommand: async (sessionIdOrCmdName, cmdNameOrConfig, config = {}) => {\n if (!_.isString(cmdNameOrConfig)) {\n config = cmdNameOrConfig;\n cmdNameOrConfig = sessionIdOrCmdName;\n sessionIdOrCmdName = '';\n }\n const response = await axios({\n url: createAppiumTestURL(sessionIdOrCmdName, cmdNameOrConfig),\n validateStatus: null,\n ...config,\n });\n return response.data?.value;\n },\n /**\n *\n * @param {NewSessionData} data\n * @param {AxiosRequestConfig} [config]\n */\n startSession: async (data, config = {}) => {\n data = _.defaultsDeep(data, {\n capabilities: {\n alwaysMatch: {},\n firstMatch: [{}],\n },\n });\n const response = await axios.post(newSessionURL, data, config);\n return response.data?.value;\n },\n /**\n *\n * @param {string} sessionId\n */\n endSession: async (sessionId) =>\n await axios.delete(createSessionURL(sessionId), {\n validateStatus: null,\n }),\n /**\n * @param {string} sessionId\n * @returns {Promise<any>}\n */\n getSession: async (sessionId) => {\n const response = await axios({\n url: createSessionURL(sessionId),\n validateStatus: null,\n });\n return response.data?.value;\n },\n });\n}\n\n/**\n * Creates E2E test suites for a driver.\n * @template {Driver} P\n * @param {DriverClass<P>} DriverClass\n * @param {Partial<BaseNSCapabilities>} [defaultCaps]\n */\nexport function driverE2ETestSuite(DriverClass, defaultCaps = {}) {\n let address = defaultCaps['appium:address'] ?? TEST_HOST;\n let port = defaultCaps['appium:port'];\n const className = DriverClass.name || '(unknown driver)';\n\n describe(`BaseDriver E2E (as ${className})`, function () {\n let baseServer;\n /** @type {P} */\n let d;\n /**\n * This URL creates a new session\n * @type {string}\n **/\n let newSessionURL;\n\n /** @type {SessionHelpers['startSession']} */\n let startSession;\n /** @type {SessionHelpers['getSession']} */\n let getSession;\n /** @type {SessionHelpers['endSession']} */\n let endSession;\n /** @type {SessionHelpers['getCommand']} */\n let getCommand;\n /** @type {SessionHelpers['postCommand']} */\n let postCommand;\n before(async function () {\n port = port ?? (await getTestPort());\n defaultCaps = {...defaultCaps};\n d = new DriverClass({port, address});\n baseServer = await server({\n routeConfiguringFunction: routeConfiguringFunction(d),\n port,\n hostname: address,\n // @ts-expect-error\n cliArgs: {},\n });\n ({startSession, getSession, endSession, newSessionURL, getCommand, postCommand} =\n createSessionHelpers(port, address));\n });\n\n after(async function () {\n await baseServer.close();\n });\n\n describe('session handling', function () {\n it('should handle idempotency while creating sessions', async function () {\n const sessionIds = [];\n let times = 0;\n do {\n const {sessionId} = await startSession(\n {\n capabilities: {alwaysMatch: defaultCaps},\n },\n {\n headers: {\n 'X-Idempotency-Key': '123456',\n },\n // XXX: I'm not sure what these are, as they are not documented axios options,\n // nor are they mentioned in our source\n // @ts-expect-error\n simple: false,\n resolveWithFullResponse: true,\n }\n );\n\n sessionIds.push(sessionId);\n times++;\n } while (times < 2);\n _.uniq(sessionIds).length.should.equal(1);\n\n const {status, data} = await endSession(sessionIds[0]);\n status.should.equal(200);\n should.equal(data.value, null);\n });\n\n it('should handle idempotency while creating parallel sessions', async function () {\n const reqs = [];\n let times = 0;\n do {\n reqs.push(\n startSession(\n {\n capabilities: {\n alwaysMatch: defaultCaps,\n },\n },\n {\n headers: {\n 'X-Idempotency-Key': '12345',\n },\n }\n )\n );\n times++;\n } while (times < 2);\n const sessionIds = _.map(await B.all(reqs), 'sessionId');\n _.uniq(sessionIds).length.should.equal(1);\n\n const {status, data} = await endSession(sessionIds[0]);\n status.should.equal(200);\n should.equal(data.value, null);\n });\n\n it('should create session and retrieve a session id, then delete it', async function () {\n let {status, data} = await axios.post(newSessionURL, {\n capabilities: {\n alwaysMatch: defaultCaps,\n },\n });\n\n status.should.equal(200);\n should.exist(data.value.sessionId);\n data.value.capabilities.platformName.should.equal(defaultCaps.platformName);\n data.value.capabilities.deviceName.should.equal(defaultCaps['appium:deviceName']);\n\n ({status, data} = await endSession(/** @type {string} */ (d.sessionId)));\n\n status.should.equal(200);\n should.equal(data.value, null);\n should.equal(d.sessionId, null);\n });\n });\n\n it.skip('should throw NYI for commands not implemented', async function () {});\n\n describe('command timeouts', function () {\n let originalFindElement, originalFindElements;\n\n /**\n * @param {number} [timeout]\n */\n async function startTimeoutSession(timeout) {\n const caps = _.cloneDeep(defaultCaps);\n caps['appium:newCommandTimeout'] = timeout;\n return await startSession({capabilities: {alwaysMatch: caps}});\n }\n\n before(function () {\n originalFindElement = d.findElement;\n d.findElement = function () {\n return 'foo';\n }.bind(d);\n\n originalFindElements = d.findElements;\n d.findElements = async function () {\n await B.delay(200);\n return ['foo'];\n }.bind(d);\n });\n\n after(function () {\n d.findElement = originalFindElement;\n d.findElements = originalFindElements;\n });\n\n it('should set a default commandTimeout', async function () {\n let newSession = await startTimeoutSession();\n d.newCommandTimeoutMs.should.be.above(0);\n await endSession(newSession.sessionId);\n });\n\n it('should timeout on commands using commandTimeout cap', async function () {\n let newSession = await startTimeoutSession(0.25);\n const sessionId = /** @type {string} */ (d.sessionId);\n await postCommand(sessionId, 'element', {\n using: 'name',\n value: 'foo',\n });\n await B.delay(400);\n const value = await getSession(sessionId);\n should.equal(value.error, 'invalid session id');\n should.equal(d.sessionId, null);\n const resp = (await endSession(newSession.sessionId)).data.value;\n should.equal(resp?.error, 'invalid session id');\n });\n\n it('should not timeout with commandTimeout of false', async function () {\n let newSession = await startTimeoutSession(0.1);\n let start = Date.now();\n const value = await postCommand(/** @type {string} */ (d.sessionId), 'elements', {\n using: 'name',\n value: 'foo',\n });\n (Date.now() - start).should.be.above(150);\n value.should.eql(['foo']);\n await endSession(newSession.sessionId);\n });\n\n it('should not timeout with commandTimeout of 0', async function () {\n d.newCommandTimeoutMs = 2;\n let newSession = await startTimeoutSession(0);\n\n await postCommand(/** @type {string} */ (d.sessionId), 'element', {\n using: 'name',\n value: 'foo',\n });\n await B.delay(400);\n const value = await getSession(/** @type {string} */ (d.sessionId));\n value.platformName?.should.equal(defaultCaps.platformName);\n const resp = (await endSession(newSession.sessionId)).data.value;\n should.equal(resp, null);\n\n d.newCommandTimeoutMs = 60 * 1000;\n });\n\n it('should not timeout if its just the command taking awhile', async function () {\n let newSession = await startTimeoutSession(0.25);\n // XXX: race condition: we must build this URL before ...something happens...\n // which causes `d.sessionId` to be missing\n const {sessionId} = d;\n\n await postCommand(/** @type {string} */ (d.sessionId), 'element', {\n using: 'name',\n value: 'foo',\n });\n await B.delay(400);\n const value = await getSession(/** @type {string} */ (sessionId));\n /** @type {string} */ (value.error).should.equal('invalid session id');\n should.equal(d.sessionId, null);\n const resp = (await endSession(newSession.sessionId)).data.value;\n /** @type {string} */ (/** @type { {error: string} } */ (resp).error).should.equal(\n 'invalid session id'\n );\n });\n\n it('should not have a timer running before or after a session', async function () {\n // @ts-expect-error\n should.not.exist(d.noCommandTimer);\n let newSession = await startTimeoutSession(0.25);\n newSession.sessionId.should.equal(d.sessionId);\n // @ts-expect-error\n should.exist(d.noCommandTimer);\n await endSession(newSession.sessionId);\n // @ts-expect-error\n should.not.exist(d.noCommandTimer);\n });\n });\n\n describe('settings api', function () {\n before(function () {\n d.settings = new DeviceSettings({ignoreUnimportantViews: false});\n });\n it('should be able to get settings object', function () {\n d.settings.getSettings().ignoreUnimportantViews.should.be.false;\n });\n it('should not reject when `updateSettings` method is not provided', async function () {\n await d.settings.update({ignoreUnimportantViews: true}).should.not.be.rejected;\n });\n it('should reject for invalid update object', async function () {\n await d.settings\n // @ts-expect-error\n .update('invalid json')\n .should.be.rejectedWith('JSON');\n });\n });\n\n describe('unexpected exits', function () {\n /** @type {import('sinon').SinonSandbox} */\n let sandbox;\n beforeEach(function () {\n sandbox = sinon.createSandbox();\n });\n\n afterEach(function () {\n sandbox.restore();\n });\n\n it('should reject a current command when the driver crashes', async function () {\n sandbox.stub(d, 'getStatus').callsFake(async function () {\n await B.delay(5000);\n });\n const reqPromise = getCommand('status', {validateStatus: null});\n // make sure that the request gets to the server before our shutdown\n await B.delay(100);\n const shutdownEventPromise = new B((resolve, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(\n 'onUnexpectedShutdown event is expected to be fired within 5 seconds timeout'\n )\n ),\n 5000\n );\n d.onUnexpectedShutdown(resolve);\n });\n d.startUnexpectedShutdown(new Error('Crashytimes'));\n const value = await reqPromise;\n value.message.should.contain('Crashytimes');\n await shutdownEventPromise;\n });\n });\n\n describe('event timings', function () {\n it('should not add timings if not using opt-in cap', async function () {\n const session = await startSession({capabilities: {alwaysMatch: defaultCaps}});\n const res = await getSession(session.sessionId);\n should.not.exist(res.events);\n await endSession(session.sessionId);\n });\n it('should add start session timings', async function () {\n const caps = {...defaultCaps, 'appium:eventTimings': true};\n const session = await startSession({capabilities: {alwaysMatch: caps}});\n const res = await getSession(session.sessionId);\n should.exist(res.events);\n should.exist(res.events?.newSessionRequested);\n should.exist(res.events?.newSessionStarted);\n res.events?.newSessionRequested[0].should.be.a('number');\n res.events?.newSessionStarted[0].should.be.a('number');\n await endSession(session.sessionId);\n });\n });\n });\n}\n\n/**\n * A {@linkcode DriverClass}, except using the base {@linkcode Driver} type instead of `ExternalDriver`.\n * This allows the suite to work for `BaseDriver`.\n * @template {Driver} P\n * @typedef {import('@appium/types').DriverClass<P>} DriverClass\n */\n\n/**\n * @typedef {import('@appium/types').Driver} Driver\n * @typedef {import('@appium/types').Constraints} Constraints\n * @typedef {import('@appium/types').DriverStatic} DriverStatic\n * @typedef {import('@appium/types').StringRecord} StringRecord\n * @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints\n * @typedef {import('@appium/types').BaseNSCapabilities} BaseNSCapabilities\n * @typedef {import('axios').AxiosRequestConfig} AxiosRequestConfig\n * @typedef {import('@appium/types').SingularSessionData} SingularSessionData\n */\n\n/**\n * @template T,D\n * @typedef {import('axios').AxiosResponse<T, D>} AxiosResponse\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @template {StringRecord|void} [Extra=void]\n * @typedef NewSessionData\n * @property {import('type-fest').RequireAtLeastOne<import('@appium/types').W3CCapabilities<C, Extra>, 'firstMatch'|'alwaysMatch'>} capabilities\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @template {StringRecord|void} [Extra=void]\n * @typedef NewSessionResponse\n * @property {string} sessionId,\n * @property {import('@appium/types').Capabilities<C, Extra>} capabilities\n */\n\n/**\n * Some E2E helpers for making requests and managing sessions\n * See {@linkcode createSessionHelpers}\n * @template [CommandData=unknown]\n * @template [ResponseData=any]\n * @typedef SessionHelpers\n * @property {string} newSessionURL - URL to create a new session. Can be used with raw `axios` requests to fully inspect raw response. Mostly, this will not be used.\n * @property {(data: NewSessionData, config?: AxiosRequestConfig) => Promise<NewSessionResponse>} startSession - Begin a session\n * @property {(sessionId: string) => Promise<AxiosResponse<{value: {error?: string}?}, {validateStatus: null}>>} endSession - End a session. _Note: resolves with raw response object_\n * @property {(sessionId: string) => Promise<SingularSessionData>} getSession - Get info about a session\n * @property {(sessionId: string, cmdName: string, data?: CommandData, config?: AxiosRequestConfig) => Promise<ResponseData>} postCommand - Send an arbitrary command via `POST`.\n * @property {(sessionIdOrCmdName: string, cmdNameOrConfig: string|AxiosRequestConfig, config?: AxiosRequestConfig) => Promise<ResponseData>} getCommand - Send an arbitrary command via `GET`. Optional `sessionId`.\n */\n"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -14,6 +12,8 @@ var _getPort = _interopRequireDefault(require("get-port"));
14
12
 
15
13
  var _lodash = require("lodash");
16
14
 
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+
17
17
  const TEST_HOST = '127.0.0.1';
18
18
  exports.TEST_HOST = TEST_HOST;
19
19
  let testPort;
@@ -46,4 +46,4 @@ const createAppiumURL = (0, _lodash.curry)((address, port, session, pathname) =>
46
46
  return new URL(path, `${address}:${port}`).href;
47
47
  });
48
48
  exports.createAppiumURL = createAppiumURL;
49
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJURVNUX0hPU1QiLCJ0ZXN0UG9ydCIsImdldFRlc3RQb3J0IiwiZm9yY2UiLCJwb3J0IiwiZ2V0UG9ydCIsImNyZWF0ZUFwcGl1bVVSTCIsImN1cnJ5IiwiYWRkcmVzcyIsInNlc3Npb24iLCJwYXRobmFtZSIsInRlc3QiLCJwYXRoIiwiVVJMIiwiaHJlZiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0JztcbmltcG9ydCB7Y3Vycnl9IGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogRGVmYXVsdCB0ZXN0IGhvc3RcbiAqL1xuY29uc3QgVEVTVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5cbmxldCB0ZXN0UG9ydDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnJlZSBwb3J0OyBvbmUgcGVyIHByb2Nlc3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlXSAtIElmIHRydWUsIGRvIG5vdCByZXVzZSB0aGUgcG9ydCAoaWYgaXQgYWxyZWFkeSBleGlzdHMpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBhIGZyZWUgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUZXN0UG9ydChmb3JjZSA9IGZhbHNlKSB7XG4gIGlmIChmb3JjZSB8fCAhdGVzdFBvcnQpIHtcbiAgICBsZXQgcG9ydCA9IGF3YWl0IGdldFBvcnQoKTtcbiAgICBpZiAoIXRlc3RQb3J0KSB7XG4gICAgICB0ZXN0UG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHJldHVybiBwb3J0O1xuICB9XG4gIHJldHVybiB0ZXN0UG9ydDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBBcHBpdW0gVVJMIGZyb20gY29tcG9uZW50cy5cbiAqXG4gKiAqKkFsbCoqIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLiAgUHJvdmlkZSBhbiBlbXB0eSBzdHJpbmcgKGAnJ2ApIGlmIHlvdSBkb24ndCBuZWVkIG9uZS5cbiAqIFRvIHJlYXJyYW5nZSBhcmd1bWVudHMgKGlmIG5lZWRlZCksIHVzZSB0aGUgcGxhY2Vob2xkZXIgZnJvbSBMb2Rhc2ggKGBfYCkuXG4gKlxuICovXG5jb25zdCBjcmVhdGVBcHBpdW1VUkwgPSBjdXJyeShcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQmFzZSBhZGRyZXNzICh3LyBvcHRpb25hbCBwcm90b2NvbClcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwb3J0IC0gUG9ydCBudW1iZXJcbiAgICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uIC0gU2Vzc2lvbiBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aG5hbWUgLSBFeHRyYSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE5ldyBVUkxcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbiAgICpcbiAgICogLy8gaHR0cDovLzEyNy4wLjAuMTozMTMzNy9zZXNzaW9uXG4gICAqIGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICcnLCAnc2Vzc2lvbicpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbFxuICAgKiBjb25zdCBjcmVhdGVTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVVJMKCcxMjcuMC4wLjEnLCAzMTMzNywgXywgJ3Nlc3Npb24nKVxuICAgKiBjcmVhdGVTZXNzaW9uVVJMKCdhc2RmZ2prbCcpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbC9hcHBpdW0vZXhlY3V0ZVxuICAgKiBjb25zdCBjcmVhdGVVUkxXaXRoUGF0aCA9IGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICdhc2RmZ2prbCcpO1xuICAgKiBjcmVhdGVVUkxXaXRoUGF0aCgnYXBwaXVtL2V4ZWN1dGUnKVxuICAgKi9cbiAgKGFkZHJlc3MsIHBvcnQsIHNlc3Npb24sIHBhdGhuYW1lKSA9PiB7XG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8vLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgIGFkZHJlc3MgPSBgaHR0cDovLyR7YWRkcmVzc31gO1xuICAgIH1cbiAgICBsZXQgcGF0aCA9IHNlc3Npb24gPyBgc2Vzc2lvbi8ke3Nlc3Npb259YCA6ICcnO1xuICAgIGlmIChwYXRobmFtZSkge1xuICAgICAgcGF0aCA9IGAke3BhdGh9LyR7cGF0aG5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVUkwocGF0aCwgYCR7YWRkcmVzc306JHtwb3J0fWApLmhyZWY7XG4gIH1cbik7XG5cbmV4cG9ydCB7VEVTVF9IT1NULCBnZXRUZXN0UG9ydCwgY3JlYXRlQXBwaXVtVVJMfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBS0EsTUFBTUEsU0FBUyxHQUFHLFdBQWxCOztBQUVBLElBQUlDLFFBQUo7O0FBT0EsZUFBZUMsV0FBZixDQUEyQkMsS0FBSyxHQUFHLEtBQW5DLEVBQTBDO0VBQ3hDLElBQUlBLEtBQUssSUFBSSxDQUFDRixRQUFkLEVBQXdCO0lBQ3RCLElBQUlHLElBQUksR0FBRyxNQUFNLElBQUFDLGdCQUFBLEdBQWpCOztJQUNBLElBQUksQ0FBQ0osUUFBTCxFQUFlO01BQ2JBLFFBQVEsR0FBR0csSUFBWDtJQUNEOztJQUNELE9BQU9BLElBQVA7RUFDRDs7RUFDRCxPQUFPSCxRQUFQO0FBQ0Q7O0FBU0QsTUFBTUssZUFBZSxHQUFHLElBQUFDLGFBQUEsRUFzQnRCLENBQUNDLE9BQUQsRUFBVUosSUFBVixFQUFnQkssT0FBaEIsRUFBeUJDLFFBQXpCLEtBQXNDO0VBQ3BDLElBQUksQ0FBQyxlQUFlQyxJQUFmLENBQW9CSCxPQUFwQixDQUFMLEVBQW1DO0lBQ2pDQSxPQUFPLEdBQUksVUFBU0EsT0FBUSxFQUE1QjtFQUNEOztFQUNELElBQUlJLElBQUksR0FBR0gsT0FBTyxHQUFJLFdBQVVBLE9BQVEsRUFBdEIsR0FBMEIsRUFBNUM7O0VBQ0EsSUFBSUMsUUFBSixFQUFjO0lBQ1pFLElBQUksR0FBSSxHQUFFQSxJQUFLLElBQUdGLFFBQVMsRUFBM0I7RUFDRDs7RUFDRCxPQUFPLElBQUlHLEdBQUosQ0FBUUQsSUFBUixFQUFlLEdBQUVKLE9BQVEsSUFBR0osSUFBSyxFQUFqQyxFQUFvQ1UsSUFBM0M7QUFDRCxDQS9CcUIsQ0FBeEIifQ==
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJURVNUX0hPU1QiLCJ0ZXN0UG9ydCIsImdldFRlc3RQb3J0IiwiZm9yY2UiLCJwb3J0IiwiZ2V0UG9ydCIsImNyZWF0ZUFwcGl1bVVSTCIsImN1cnJ5IiwiYWRkcmVzcyIsInNlc3Npb24iLCJwYXRobmFtZSIsInRlc3QiLCJwYXRoIiwiVVJMIiwiaHJlZiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0JztcbmltcG9ydCB7Y3Vycnl9IGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogRGVmYXVsdCB0ZXN0IGhvc3RcbiAqL1xuY29uc3QgVEVTVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5cbmxldCB0ZXN0UG9ydDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnJlZSBwb3J0OyBvbmUgcGVyIHByb2Nlc3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlXSAtIElmIHRydWUsIGRvIG5vdCByZXVzZSB0aGUgcG9ydCAoaWYgaXQgYWxyZWFkeSBleGlzdHMpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBhIGZyZWUgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUZXN0UG9ydChmb3JjZSA9IGZhbHNlKSB7XG4gIGlmIChmb3JjZSB8fCAhdGVzdFBvcnQpIHtcbiAgICBsZXQgcG9ydCA9IGF3YWl0IGdldFBvcnQoKTtcbiAgICBpZiAoIXRlc3RQb3J0KSB7XG4gICAgICB0ZXN0UG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHJldHVybiBwb3J0O1xuICB9XG4gIHJldHVybiB0ZXN0UG9ydDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBBcHBpdW0gVVJMIGZyb20gY29tcG9uZW50cy5cbiAqXG4gKiAqKkFsbCoqIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLiAgUHJvdmlkZSBhbiBlbXB0eSBzdHJpbmcgKGAnJ2ApIGlmIHlvdSBkb24ndCBuZWVkIG9uZS5cbiAqIFRvIHJlYXJyYW5nZSBhcmd1bWVudHMgKGlmIG5lZWRlZCksIHVzZSB0aGUgcGxhY2Vob2xkZXIgZnJvbSBMb2Rhc2ggKGBfYCkuXG4gKlxuICovXG5jb25zdCBjcmVhdGVBcHBpdW1VUkwgPSBjdXJyeShcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQmFzZSBhZGRyZXNzICh3LyBvcHRpb25hbCBwcm90b2NvbClcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwb3J0IC0gUG9ydCBudW1iZXJcbiAgICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uIC0gU2Vzc2lvbiBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aG5hbWUgLSBFeHRyYSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE5ldyBVUkxcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbiAgICpcbiAgICogLy8gaHR0cDovLzEyNy4wLjAuMTozMTMzNy9zZXNzaW9uXG4gICAqIGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICcnLCAnc2Vzc2lvbicpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbFxuICAgKiBjb25zdCBjcmVhdGVTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVVJMKCcxMjcuMC4wLjEnLCAzMTMzNywgXywgJ3Nlc3Npb24nKVxuICAgKiBjcmVhdGVTZXNzaW9uVVJMKCdhc2RmZ2prbCcpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbC9hcHBpdW0vZXhlY3V0ZVxuICAgKiBjb25zdCBjcmVhdGVVUkxXaXRoUGF0aCA9IGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICdhc2RmZ2prbCcpO1xuICAgKiBjcmVhdGVVUkxXaXRoUGF0aCgnYXBwaXVtL2V4ZWN1dGUnKVxuICAgKi9cbiAgKGFkZHJlc3MsIHBvcnQsIHNlc3Npb24sIHBhdGhuYW1lKSA9PiB7XG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8vLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgIGFkZHJlc3MgPSBgaHR0cDovLyR7YWRkcmVzc31gO1xuICAgIH1cbiAgICBsZXQgcGF0aCA9IHNlc3Npb24gPyBgc2Vzc2lvbi8ke3Nlc3Npb259YCA6ICcnO1xuICAgIGlmIChwYXRobmFtZSkge1xuICAgICAgcGF0aCA9IGAke3BhdGh9LyR7cGF0aG5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVUkwocGF0aCwgYCR7YWRkcmVzc306JHtwb3J0fWApLmhyZWY7XG4gIH1cbik7XG5cbmV4cG9ydCB7VEVTVF9IT1NULCBnZXRUZXN0UG9ydCwgY3JlYXRlQXBwaXVtVVJMfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7O0FBS0EsTUFBTUEsU0FBUyxHQUFHLFdBQWxCOztBQUVBLElBQUlDLFFBQUo7O0FBT0EsZUFBZUMsV0FBZixDQUEyQkMsS0FBSyxHQUFHLEtBQW5DLEVBQTBDO0VBQ3hDLElBQUlBLEtBQUssSUFBSSxDQUFDRixRQUFkLEVBQXdCO0lBQ3RCLElBQUlHLElBQUksR0FBRyxNQUFNLElBQUFDLGdCQUFBLEdBQWpCOztJQUNBLElBQUksQ0FBQ0osUUFBTCxFQUFlO01BQ2JBLFFBQVEsR0FBR0csSUFBWDtJQUNEOztJQUNELE9BQU9BLElBQVA7RUFDRDs7RUFDRCxPQUFPSCxRQUFQO0FBQ0Q7O0FBU0QsTUFBTUssZUFBZSxHQUFHLElBQUFDLGFBQUEsRUFzQnRCLENBQUNDLE9BQUQsRUFBVUosSUFBVixFQUFnQkssT0FBaEIsRUFBeUJDLFFBQXpCLEtBQXNDO0VBQ3BDLElBQUksQ0FBQyxlQUFlQyxJQUFmLENBQW9CSCxPQUFwQixDQUFMLEVBQW1DO0lBQ2pDQSxPQUFPLEdBQUksVUFBU0EsT0FBUSxFQUE1QjtFQUNEOztFQUNELElBQUlJLElBQUksR0FBR0gsT0FBTyxHQUFJLFdBQVVBLE9BQVEsRUFBdEIsR0FBMEIsRUFBNUM7O0VBQ0EsSUFBSUMsUUFBSixFQUFjO0lBQ1pFLElBQUksR0FBSSxHQUFFQSxJQUFLLElBQUdGLFFBQVMsRUFBM0I7RUFDRDs7RUFDRCxPQUFPLElBQUlHLEdBQUosQ0FBUUQsSUFBUixFQUFlLEdBQUVKLE9BQVEsSUFBR0osSUFBSyxFQUFqQyxFQUFvQ1UsSUFBM0M7QUFDRCxDQS9CcUIsQ0FBeEIifQ==