@coralogix/rum-cli 1.1.19 → 1.1.21

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 (51) hide show
  1. package/README.md +14 -7
  2. package/api/rum-api.ts +2 -1
  3. package/cli/commands/update-source-maps-command.ts +3 -2
  4. package/dist/api/rum-api.js +3 -2
  5. package/dist/cli/commands/update-source-maps-command.js +4 -3
  6. package/dist/models/commands.model.d.ts +1 -0
  7. package/dist/models/commands.model.js +1 -1
  8. package/dist/proto-models/com/coralogix/rum/v2/analytics.d.ts +131 -0
  9. package/dist/proto-models/com/coralogix/rum/v2/analytics.js +771 -0
  10. package/dist/proto-models/com/coralogix/rum/v2/audit_log.d.ts +1 -1
  11. package/dist/proto-models/com/coralogix/rum/v2/audit_log.js +3 -5
  12. package/dist/proto-models/com/coralogix/rum/v2/chunk.d.ts +1 -1
  13. package/dist/proto-models/com/coralogix/rum/v2/chunk.js +49 -54
  14. package/dist/proto-models/com/coralogix/rum/v2/file.d.ts +1 -1
  15. package/dist/proto-models/com/coralogix/rum/v2/file.js +34 -24
  16. package/dist/proto-models/com/coralogix/rum/v2/rum_service.d.ts +64 -1
  17. package/dist/proto-models/com/coralogix/rum/v2/rum_service.js +387 -92
  18. package/dist/proto-models/com/coralogix/rum/v2/rum_session_recording_service.d.ts +1 -1
  19. package/dist/proto-models/com/coralogix/rum/v2/rum_session_recording_service.js +32 -24
  20. package/dist/proto-models/com/coralogix/rum/v2/rum_source_map_service.d.ts +4 -1
  21. package/dist/proto-models/com/coralogix/rum/v2/rum_source_map_service.js +72 -59
  22. package/dist/proto-models/com/coralogix/rum/v2/source_code_file_mapping.d.ts +1 -1
  23. package/dist/proto-models/com/coralogix/rum/v2/source_code_file_mapping.js +24 -47
  24. package/dist/proto-models/com/coralogix/rum/v2/source_map_release.d.ts +1 -1
  25. package/dist/proto-models/com/coralogix/rum/v2/source_map_release.js +38 -43
  26. package/dist/proto-models/com/coralogix/rum/v2/template.d.ts +1 -1
  27. package/dist/proto-models/com/coralogix/rum/v2/template.js +53 -66
  28. package/dist/proto-models/google/protobuf/descriptor.d.ts +1 -1
  29. package/dist/proto-models/google/protobuf/descriptor.js +427 -537
  30. package/dist/services/source-maps.service.d.ts +1 -1
  31. package/dist/services/source-maps.service.js +3 -2
  32. package/models/commands.model.ts +1 -0
  33. package/package.json +1 -1
  34. package/proto-models/com/coralogix/rum/v2/analytics.ts +910 -0
  35. package/proto-models/com/coralogix/rum/v2/audit_log.ts +4 -6
  36. package/proto-models/com/coralogix/rum/v2/chunk.ts +56 -55
  37. package/proto-models/com/coralogix/rum/v2/file.ts +39 -25
  38. package/proto-models/com/coralogix/rum/v2/rum_service.ts +439 -90
  39. package/proto-models/com/coralogix/rum/v2/rum_session_recording_service.ts +40 -25
  40. package/proto-models/com/coralogix/rum/v2/rum_source_map_service.ts +81 -58
  41. package/proto-models/com/coralogix/rum/v2/source_code_file_mapping.ts +27 -48
  42. package/proto-models/com/coralogix/rum/v2/source_map_release.ts +44 -44
  43. package/proto-models/com/coralogix/rum/v2/template.ts +60 -67
  44. package/proto-models/google/protobuf/descriptor.ts +464 -551
  45. package/protofetch.lock +2 -2
  46. package/protofetch.toml +1 -1
  47. package/protos/com/coralogix/rum/v2/analytics.proto +57 -0
  48. package/protos/com/coralogix/rum/v2/rum_service.proto +21 -0
  49. package/protos/com/coralogix/rum/v2/rum_source_map_service.proto +2 -0
  50. package/protoset.bin +0 -0
  51. package/services/source-maps.service.ts +2 -0
@@ -0,0 +1,771 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Error = exports.UserAffectedResponse = exports.TopTenResponse = exports.ClientDetailsResponse = exports.UserAffected = exports.EnvironmentInfo = exports.Url = exports.ErrorMessage = exports.NetworkRequest = exports.protobufPackage = void 0;
7
+ /* eslint-disable */
8
+ const long_1 = __importDefault(require("long"));
9
+ const minimal_1 = __importDefault(require("protobufjs/minimal"));
10
+ exports.protobufPackage = "com.coralogix.rum.v2";
11
+ function createBaseNetworkRequest() {
12
+ return { networkRequest: undefined, method: undefined, statusCode: undefined, numberOfUsers: 0, numberOfErrors: 0 };
13
+ }
14
+ exports.NetworkRequest = {
15
+ encode(message, writer = minimal_1.default.Writer.create()) {
16
+ if (message.networkRequest !== undefined) {
17
+ writer.uint32(10).string(message.networkRequest);
18
+ }
19
+ if (message.method !== undefined) {
20
+ writer.uint32(18).string(message.method);
21
+ }
22
+ if (message.statusCode !== undefined) {
23
+ writer.uint32(24).int64(message.statusCode);
24
+ }
25
+ if (message.numberOfUsers !== 0) {
26
+ writer.uint32(32).int64(message.numberOfUsers);
27
+ }
28
+ if (message.numberOfErrors !== 0) {
29
+ writer.uint32(40).int64(message.numberOfErrors);
30
+ }
31
+ return writer;
32
+ },
33
+ decode(input, length) {
34
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
35
+ let end = length === undefined ? reader.len : reader.pos + length;
36
+ const message = createBaseNetworkRequest();
37
+ while (reader.pos < end) {
38
+ const tag = reader.uint32();
39
+ switch (tag >>> 3) {
40
+ case 1:
41
+ if (tag !== 10) {
42
+ break;
43
+ }
44
+ message.networkRequest = reader.string();
45
+ continue;
46
+ case 2:
47
+ if (tag !== 18) {
48
+ break;
49
+ }
50
+ message.method = reader.string();
51
+ continue;
52
+ case 3:
53
+ if (tag !== 24) {
54
+ break;
55
+ }
56
+ message.statusCode = longToNumber(reader.int64());
57
+ continue;
58
+ case 4:
59
+ if (tag !== 32) {
60
+ break;
61
+ }
62
+ message.numberOfUsers = longToNumber(reader.int64());
63
+ continue;
64
+ case 5:
65
+ if (tag !== 40) {
66
+ break;
67
+ }
68
+ message.numberOfErrors = longToNumber(reader.int64());
69
+ continue;
70
+ }
71
+ if ((tag & 7) === 4 || tag === 0) {
72
+ break;
73
+ }
74
+ reader.skipType(tag & 7);
75
+ }
76
+ return message;
77
+ },
78
+ fromJSON(object) {
79
+ return {
80
+ networkRequest: isSet(object.networkRequest) ? String(object.networkRequest) : undefined,
81
+ method: isSet(object.method) ? String(object.method) : undefined,
82
+ statusCode: isSet(object.statusCode) ? Number(object.statusCode) : undefined,
83
+ numberOfUsers: isSet(object.numberOfUsers) ? Number(object.numberOfUsers) : 0,
84
+ numberOfErrors: isSet(object.numberOfErrors) ? Number(object.numberOfErrors) : 0,
85
+ };
86
+ },
87
+ toJSON(message) {
88
+ const obj = {};
89
+ message.networkRequest !== undefined && (obj.networkRequest = message.networkRequest);
90
+ message.method !== undefined && (obj.method = message.method);
91
+ message.statusCode !== undefined && (obj.statusCode = Math.round(message.statusCode));
92
+ message.numberOfUsers !== undefined && (obj.numberOfUsers = Math.round(message.numberOfUsers));
93
+ message.numberOfErrors !== undefined && (obj.numberOfErrors = Math.round(message.numberOfErrors));
94
+ return obj;
95
+ },
96
+ create(base) {
97
+ return exports.NetworkRequest.fromPartial(base !== null && base !== void 0 ? base : {});
98
+ },
99
+ fromPartial(object) {
100
+ var _a, _b, _c, _d, _e;
101
+ const message = createBaseNetworkRequest();
102
+ message.networkRequest = (_a = object.networkRequest) !== null && _a !== void 0 ? _a : undefined;
103
+ message.method = (_b = object.method) !== null && _b !== void 0 ? _b : undefined;
104
+ message.statusCode = (_c = object.statusCode) !== null && _c !== void 0 ? _c : undefined;
105
+ message.numberOfUsers = (_d = object.numberOfUsers) !== null && _d !== void 0 ? _d : 0;
106
+ message.numberOfErrors = (_e = object.numberOfErrors) !== null && _e !== void 0 ? _e : 0;
107
+ return message;
108
+ },
109
+ };
110
+ function createBaseErrorMessage() {
111
+ return { message: "", numberOfUsers: 0, numberOfErrors: 0 };
112
+ }
113
+ exports.ErrorMessage = {
114
+ encode(message, writer = minimal_1.default.Writer.create()) {
115
+ if (message.message !== "") {
116
+ writer.uint32(10).string(message.message);
117
+ }
118
+ if (message.numberOfUsers !== 0) {
119
+ writer.uint32(16).int64(message.numberOfUsers);
120
+ }
121
+ if (message.numberOfErrors !== 0) {
122
+ writer.uint32(24).int64(message.numberOfErrors);
123
+ }
124
+ return writer;
125
+ },
126
+ decode(input, length) {
127
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
128
+ let end = length === undefined ? reader.len : reader.pos + length;
129
+ const message = createBaseErrorMessage();
130
+ while (reader.pos < end) {
131
+ const tag = reader.uint32();
132
+ switch (tag >>> 3) {
133
+ case 1:
134
+ if (tag !== 10) {
135
+ break;
136
+ }
137
+ message.message = reader.string();
138
+ continue;
139
+ case 2:
140
+ if (tag !== 16) {
141
+ break;
142
+ }
143
+ message.numberOfUsers = longToNumber(reader.int64());
144
+ continue;
145
+ case 3:
146
+ if (tag !== 24) {
147
+ break;
148
+ }
149
+ message.numberOfErrors = longToNumber(reader.int64());
150
+ continue;
151
+ }
152
+ if ((tag & 7) === 4 || tag === 0) {
153
+ break;
154
+ }
155
+ reader.skipType(tag & 7);
156
+ }
157
+ return message;
158
+ },
159
+ fromJSON(object) {
160
+ return {
161
+ message: isSet(object.message) ? String(object.message) : "",
162
+ numberOfUsers: isSet(object.numberOfUsers) ? Number(object.numberOfUsers) : 0,
163
+ numberOfErrors: isSet(object.numberOfErrors) ? Number(object.numberOfErrors) : 0,
164
+ };
165
+ },
166
+ toJSON(message) {
167
+ const obj = {};
168
+ message.message !== undefined && (obj.message = message.message);
169
+ message.numberOfUsers !== undefined && (obj.numberOfUsers = Math.round(message.numberOfUsers));
170
+ message.numberOfErrors !== undefined && (obj.numberOfErrors = Math.round(message.numberOfErrors));
171
+ return obj;
172
+ },
173
+ create(base) {
174
+ return exports.ErrorMessage.fromPartial(base !== null && base !== void 0 ? base : {});
175
+ },
176
+ fromPartial(object) {
177
+ var _a, _b, _c;
178
+ const message = createBaseErrorMessage();
179
+ message.message = (_a = object.message) !== null && _a !== void 0 ? _a : "";
180
+ message.numberOfUsers = (_b = object.numberOfUsers) !== null && _b !== void 0 ? _b : 0;
181
+ message.numberOfErrors = (_c = object.numberOfErrors) !== null && _c !== void 0 ? _c : 0;
182
+ return message;
183
+ },
184
+ };
185
+ function createBaseUrl() {
186
+ return { urlName: "", errorType: undefined, numberOfUsers: 0, numberOfErrors: 0 };
187
+ }
188
+ exports.Url = {
189
+ encode(message, writer = minimal_1.default.Writer.create()) {
190
+ if (message.urlName !== "") {
191
+ writer.uint32(10).string(message.urlName);
192
+ }
193
+ if (message.errorType !== undefined) {
194
+ writer.uint32(18).string(message.errorType);
195
+ }
196
+ if (message.numberOfUsers !== 0) {
197
+ writer.uint32(24).int64(message.numberOfUsers);
198
+ }
199
+ if (message.numberOfErrors !== 0) {
200
+ writer.uint32(32).int64(message.numberOfErrors);
201
+ }
202
+ return writer;
203
+ },
204
+ decode(input, length) {
205
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
206
+ let end = length === undefined ? reader.len : reader.pos + length;
207
+ const message = createBaseUrl();
208
+ while (reader.pos < end) {
209
+ const tag = reader.uint32();
210
+ switch (tag >>> 3) {
211
+ case 1:
212
+ if (tag !== 10) {
213
+ break;
214
+ }
215
+ message.urlName = reader.string();
216
+ continue;
217
+ case 2:
218
+ if (tag !== 18) {
219
+ break;
220
+ }
221
+ message.errorType = reader.string();
222
+ continue;
223
+ case 3:
224
+ if (tag !== 24) {
225
+ break;
226
+ }
227
+ message.numberOfUsers = longToNumber(reader.int64());
228
+ continue;
229
+ case 4:
230
+ if (tag !== 32) {
231
+ break;
232
+ }
233
+ message.numberOfErrors = longToNumber(reader.int64());
234
+ continue;
235
+ }
236
+ if ((tag & 7) === 4 || tag === 0) {
237
+ break;
238
+ }
239
+ reader.skipType(tag & 7);
240
+ }
241
+ return message;
242
+ },
243
+ fromJSON(object) {
244
+ return {
245
+ urlName: isSet(object.urlName) ? String(object.urlName) : "",
246
+ errorType: isSet(object.errorType) ? String(object.errorType) : undefined,
247
+ numberOfUsers: isSet(object.numberOfUsers) ? Number(object.numberOfUsers) : 0,
248
+ numberOfErrors: isSet(object.numberOfErrors) ? Number(object.numberOfErrors) : 0,
249
+ };
250
+ },
251
+ toJSON(message) {
252
+ const obj = {};
253
+ message.urlName !== undefined && (obj.urlName = message.urlName);
254
+ message.errorType !== undefined && (obj.errorType = message.errorType);
255
+ message.numberOfUsers !== undefined && (obj.numberOfUsers = Math.round(message.numberOfUsers));
256
+ message.numberOfErrors !== undefined && (obj.numberOfErrors = Math.round(message.numberOfErrors));
257
+ return obj;
258
+ },
259
+ create(base) {
260
+ return exports.Url.fromPartial(base !== null && base !== void 0 ? base : {});
261
+ },
262
+ fromPartial(object) {
263
+ var _a, _b, _c, _d;
264
+ const message = createBaseUrl();
265
+ message.urlName = (_a = object.urlName) !== null && _a !== void 0 ? _a : "";
266
+ message.errorType = (_b = object.errorType) !== null && _b !== void 0 ? _b : undefined;
267
+ message.numberOfUsers = (_c = object.numberOfUsers) !== null && _c !== void 0 ? _c : 0;
268
+ message.numberOfErrors = (_d = object.numberOfErrors) !== null && _d !== void 0 ? _d : 0;
269
+ return message;
270
+ },
271
+ };
272
+ function createBaseEnvironmentInfo() {
273
+ return { name: "", numberOfErrors: 0, version: undefined };
274
+ }
275
+ exports.EnvironmentInfo = {
276
+ encode(message, writer = minimal_1.default.Writer.create()) {
277
+ if (message.name !== "") {
278
+ writer.uint32(10).string(message.name);
279
+ }
280
+ if (message.numberOfErrors !== 0) {
281
+ writer.uint32(16).int64(message.numberOfErrors);
282
+ }
283
+ if (message.version !== undefined) {
284
+ writer.uint32(26).string(message.version);
285
+ }
286
+ return writer;
287
+ },
288
+ decode(input, length) {
289
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
290
+ let end = length === undefined ? reader.len : reader.pos + length;
291
+ const message = createBaseEnvironmentInfo();
292
+ while (reader.pos < end) {
293
+ const tag = reader.uint32();
294
+ switch (tag >>> 3) {
295
+ case 1:
296
+ if (tag !== 10) {
297
+ break;
298
+ }
299
+ message.name = reader.string();
300
+ continue;
301
+ case 2:
302
+ if (tag !== 16) {
303
+ break;
304
+ }
305
+ message.numberOfErrors = longToNumber(reader.int64());
306
+ continue;
307
+ case 3:
308
+ if (tag !== 26) {
309
+ break;
310
+ }
311
+ message.version = reader.string();
312
+ continue;
313
+ }
314
+ if ((tag & 7) === 4 || tag === 0) {
315
+ break;
316
+ }
317
+ reader.skipType(tag & 7);
318
+ }
319
+ return message;
320
+ },
321
+ fromJSON(object) {
322
+ return {
323
+ name: isSet(object.name) ? String(object.name) : "",
324
+ numberOfErrors: isSet(object.numberOfErrors) ? Number(object.numberOfErrors) : 0,
325
+ version: isSet(object.version) ? String(object.version) : undefined,
326
+ };
327
+ },
328
+ toJSON(message) {
329
+ const obj = {};
330
+ message.name !== undefined && (obj.name = message.name);
331
+ message.numberOfErrors !== undefined && (obj.numberOfErrors = Math.round(message.numberOfErrors));
332
+ message.version !== undefined && (obj.version = message.version);
333
+ return obj;
334
+ },
335
+ create(base) {
336
+ return exports.EnvironmentInfo.fromPartial(base !== null && base !== void 0 ? base : {});
337
+ },
338
+ fromPartial(object) {
339
+ var _a, _b, _c;
340
+ const message = createBaseEnvironmentInfo();
341
+ message.name = (_a = object.name) !== null && _a !== void 0 ? _a : "";
342
+ message.numberOfErrors = (_b = object.numberOfErrors) !== null && _b !== void 0 ? _b : 0;
343
+ message.version = (_c = object.version) !== null && _c !== void 0 ? _c : undefined;
344
+ return message;
345
+ },
346
+ };
347
+ function createBaseUserAffected() {
348
+ return {
349
+ userId: undefined,
350
+ userEmail: undefined,
351
+ userName: undefined,
352
+ lastError: undefined,
353
+ numberOfErrors: undefined,
354
+ };
355
+ }
356
+ exports.UserAffected = {
357
+ encode(message, writer = minimal_1.default.Writer.create()) {
358
+ if (message.userId !== undefined) {
359
+ writer.uint32(10).string(message.userId);
360
+ }
361
+ if (message.userEmail !== undefined) {
362
+ writer.uint32(18).string(message.userEmail);
363
+ }
364
+ if (message.userName !== undefined) {
365
+ writer.uint32(26).string(message.userName);
366
+ }
367
+ if (message.lastError !== undefined) {
368
+ writer.uint32(32).int64(message.lastError);
369
+ }
370
+ if (message.numberOfErrors !== undefined) {
371
+ writer.uint32(40).int64(message.numberOfErrors);
372
+ }
373
+ return writer;
374
+ },
375
+ decode(input, length) {
376
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
377
+ let end = length === undefined ? reader.len : reader.pos + length;
378
+ const message = createBaseUserAffected();
379
+ while (reader.pos < end) {
380
+ const tag = reader.uint32();
381
+ switch (tag >>> 3) {
382
+ case 1:
383
+ if (tag !== 10) {
384
+ break;
385
+ }
386
+ message.userId = reader.string();
387
+ continue;
388
+ case 2:
389
+ if (tag !== 18) {
390
+ break;
391
+ }
392
+ message.userEmail = reader.string();
393
+ continue;
394
+ case 3:
395
+ if (tag !== 26) {
396
+ break;
397
+ }
398
+ message.userName = reader.string();
399
+ continue;
400
+ case 4:
401
+ if (tag !== 32) {
402
+ break;
403
+ }
404
+ message.lastError = longToNumber(reader.int64());
405
+ continue;
406
+ case 5:
407
+ if (tag !== 40) {
408
+ break;
409
+ }
410
+ message.numberOfErrors = longToNumber(reader.int64());
411
+ continue;
412
+ }
413
+ if ((tag & 7) === 4 || tag === 0) {
414
+ break;
415
+ }
416
+ reader.skipType(tag & 7);
417
+ }
418
+ return message;
419
+ },
420
+ fromJSON(object) {
421
+ return {
422
+ userId: isSet(object.userId) ? String(object.userId) : undefined,
423
+ userEmail: isSet(object.userEmail) ? String(object.userEmail) : undefined,
424
+ userName: isSet(object.userName) ? String(object.userName) : undefined,
425
+ lastError: isSet(object.lastError) ? Number(object.lastError) : undefined,
426
+ numberOfErrors: isSet(object.numberOfErrors) ? Number(object.numberOfErrors) : undefined,
427
+ };
428
+ },
429
+ toJSON(message) {
430
+ const obj = {};
431
+ message.userId !== undefined && (obj.userId = message.userId);
432
+ message.userEmail !== undefined && (obj.userEmail = message.userEmail);
433
+ message.userName !== undefined && (obj.userName = message.userName);
434
+ message.lastError !== undefined && (obj.lastError = Math.round(message.lastError));
435
+ message.numberOfErrors !== undefined && (obj.numberOfErrors = Math.round(message.numberOfErrors));
436
+ return obj;
437
+ },
438
+ create(base) {
439
+ return exports.UserAffected.fromPartial(base !== null && base !== void 0 ? base : {});
440
+ },
441
+ fromPartial(object) {
442
+ var _a, _b, _c, _d, _e;
443
+ const message = createBaseUserAffected();
444
+ message.userId = (_a = object.userId) !== null && _a !== void 0 ? _a : undefined;
445
+ message.userEmail = (_b = object.userEmail) !== null && _b !== void 0 ? _b : undefined;
446
+ message.userName = (_c = object.userName) !== null && _c !== void 0 ? _c : undefined;
447
+ message.lastError = (_d = object.lastError) !== null && _d !== void 0 ? _d : undefined;
448
+ message.numberOfErrors = (_e = object.numberOfErrors) !== null && _e !== void 0 ? _e : undefined;
449
+ return message;
450
+ },
451
+ };
452
+ function createBaseClientDetailsResponse() {
453
+ return { device: [], os: [], browser: [] };
454
+ }
455
+ exports.ClientDetailsResponse = {
456
+ encode(message, writer = minimal_1.default.Writer.create()) {
457
+ for (const v of message.device) {
458
+ exports.EnvironmentInfo.encode(v, writer.uint32(10).fork()).ldelim();
459
+ }
460
+ for (const v of message.os) {
461
+ exports.EnvironmentInfo.encode(v, writer.uint32(18).fork()).ldelim();
462
+ }
463
+ for (const v of message.browser) {
464
+ exports.EnvironmentInfo.encode(v, writer.uint32(26).fork()).ldelim();
465
+ }
466
+ return writer;
467
+ },
468
+ decode(input, length) {
469
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
470
+ let end = length === undefined ? reader.len : reader.pos + length;
471
+ const message = createBaseClientDetailsResponse();
472
+ while (reader.pos < end) {
473
+ const tag = reader.uint32();
474
+ switch (tag >>> 3) {
475
+ case 1:
476
+ if (tag !== 10) {
477
+ break;
478
+ }
479
+ message.device.push(exports.EnvironmentInfo.decode(reader, reader.uint32()));
480
+ continue;
481
+ case 2:
482
+ if (tag !== 18) {
483
+ break;
484
+ }
485
+ message.os.push(exports.EnvironmentInfo.decode(reader, reader.uint32()));
486
+ continue;
487
+ case 3:
488
+ if (tag !== 26) {
489
+ break;
490
+ }
491
+ message.browser.push(exports.EnvironmentInfo.decode(reader, reader.uint32()));
492
+ continue;
493
+ }
494
+ if ((tag & 7) === 4 || tag === 0) {
495
+ break;
496
+ }
497
+ reader.skipType(tag & 7);
498
+ }
499
+ return message;
500
+ },
501
+ fromJSON(object) {
502
+ return {
503
+ device: Array.isArray(object === null || object === void 0 ? void 0 : object.device) ? object.device.map((e) => exports.EnvironmentInfo.fromJSON(e)) : [],
504
+ os: Array.isArray(object === null || object === void 0 ? void 0 : object.os) ? object.os.map((e) => exports.EnvironmentInfo.fromJSON(e)) : [],
505
+ browser: Array.isArray(object === null || object === void 0 ? void 0 : object.browser) ? object.browser.map((e) => exports.EnvironmentInfo.fromJSON(e)) : [],
506
+ };
507
+ },
508
+ toJSON(message) {
509
+ const obj = {};
510
+ if (message.device) {
511
+ obj.device = message.device.map((e) => e ? exports.EnvironmentInfo.toJSON(e) : undefined);
512
+ }
513
+ else {
514
+ obj.device = [];
515
+ }
516
+ if (message.os) {
517
+ obj.os = message.os.map((e) => e ? exports.EnvironmentInfo.toJSON(e) : undefined);
518
+ }
519
+ else {
520
+ obj.os = [];
521
+ }
522
+ if (message.browser) {
523
+ obj.browser = message.browser.map((e) => e ? exports.EnvironmentInfo.toJSON(e) : undefined);
524
+ }
525
+ else {
526
+ obj.browser = [];
527
+ }
528
+ return obj;
529
+ },
530
+ create(base) {
531
+ return exports.ClientDetailsResponse.fromPartial(base !== null && base !== void 0 ? base : {});
532
+ },
533
+ fromPartial(object) {
534
+ var _a, _b, _c;
535
+ const message = createBaseClientDetailsResponse();
536
+ message.device = ((_a = object.device) === null || _a === void 0 ? void 0 : _a.map((e) => exports.EnvironmentInfo.fromPartial(e))) || [];
537
+ message.os = ((_b = object.os) === null || _b === void 0 ? void 0 : _b.map((e) => exports.EnvironmentInfo.fromPartial(e))) || [];
538
+ message.browser = ((_c = object.browser) === null || _c === void 0 ? void 0 : _c.map((e) => exports.EnvironmentInfo.fromPartial(e))) || [];
539
+ return message;
540
+ },
541
+ };
542
+ function createBaseTopTenResponse() {
543
+ return { networkRequest: [], errorMessage: [], url: [] };
544
+ }
545
+ exports.TopTenResponse = {
546
+ encode(message, writer = minimal_1.default.Writer.create()) {
547
+ for (const v of message.networkRequest) {
548
+ exports.NetworkRequest.encode(v, writer.uint32(10).fork()).ldelim();
549
+ }
550
+ for (const v of message.errorMessage) {
551
+ exports.ErrorMessage.encode(v, writer.uint32(18).fork()).ldelim();
552
+ }
553
+ for (const v of message.url) {
554
+ exports.Url.encode(v, writer.uint32(26).fork()).ldelim();
555
+ }
556
+ return writer;
557
+ },
558
+ decode(input, length) {
559
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
560
+ let end = length === undefined ? reader.len : reader.pos + length;
561
+ const message = createBaseTopTenResponse();
562
+ while (reader.pos < end) {
563
+ const tag = reader.uint32();
564
+ switch (tag >>> 3) {
565
+ case 1:
566
+ if (tag !== 10) {
567
+ break;
568
+ }
569
+ message.networkRequest.push(exports.NetworkRequest.decode(reader, reader.uint32()));
570
+ continue;
571
+ case 2:
572
+ if (tag !== 18) {
573
+ break;
574
+ }
575
+ message.errorMessage.push(exports.ErrorMessage.decode(reader, reader.uint32()));
576
+ continue;
577
+ case 3:
578
+ if (tag !== 26) {
579
+ break;
580
+ }
581
+ message.url.push(exports.Url.decode(reader, reader.uint32()));
582
+ continue;
583
+ }
584
+ if ((tag & 7) === 4 || tag === 0) {
585
+ break;
586
+ }
587
+ reader.skipType(tag & 7);
588
+ }
589
+ return message;
590
+ },
591
+ fromJSON(object) {
592
+ return {
593
+ networkRequest: Array.isArray(object === null || object === void 0 ? void 0 : object.networkRequest)
594
+ ? object.networkRequest.map((e) => exports.NetworkRequest.fromJSON(e))
595
+ : [],
596
+ errorMessage: Array.isArray(object === null || object === void 0 ? void 0 : object.errorMessage)
597
+ ? object.errorMessage.map((e) => exports.ErrorMessage.fromJSON(e))
598
+ : [],
599
+ url: Array.isArray(object === null || object === void 0 ? void 0 : object.url) ? object.url.map((e) => exports.Url.fromJSON(e)) : [],
600
+ };
601
+ },
602
+ toJSON(message) {
603
+ const obj = {};
604
+ if (message.networkRequest) {
605
+ obj.networkRequest = message.networkRequest.map((e) => e ? exports.NetworkRequest.toJSON(e) : undefined);
606
+ }
607
+ else {
608
+ obj.networkRequest = [];
609
+ }
610
+ if (message.errorMessage) {
611
+ obj.errorMessage = message.errorMessage.map((e) => e ? exports.ErrorMessage.toJSON(e) : undefined);
612
+ }
613
+ else {
614
+ obj.errorMessage = [];
615
+ }
616
+ if (message.url) {
617
+ obj.url = message.url.map((e) => e ? exports.Url.toJSON(e) : undefined);
618
+ }
619
+ else {
620
+ obj.url = [];
621
+ }
622
+ return obj;
623
+ },
624
+ create(base) {
625
+ return exports.TopTenResponse.fromPartial(base !== null && base !== void 0 ? base : {});
626
+ },
627
+ fromPartial(object) {
628
+ var _a, _b, _c;
629
+ const message = createBaseTopTenResponse();
630
+ message.networkRequest = ((_a = object.networkRequest) === null || _a === void 0 ? void 0 : _a.map((e) => exports.NetworkRequest.fromPartial(e))) || [];
631
+ message.errorMessage = ((_b = object.errorMessage) === null || _b === void 0 ? void 0 : _b.map((e) => exports.ErrorMessage.fromPartial(e))) || [];
632
+ message.url = ((_c = object.url) === null || _c === void 0 ? void 0 : _c.map((e) => exports.Url.fromPartial(e))) || [];
633
+ return message;
634
+ },
635
+ };
636
+ function createBaseUserAffectedResponse() {
637
+ return { userAffected: [] };
638
+ }
639
+ exports.UserAffectedResponse = {
640
+ encode(message, writer = minimal_1.default.Writer.create()) {
641
+ for (const v of message.userAffected) {
642
+ exports.UserAffected.encode(v, writer.uint32(10).fork()).ldelim();
643
+ }
644
+ return writer;
645
+ },
646
+ decode(input, length) {
647
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
648
+ let end = length === undefined ? reader.len : reader.pos + length;
649
+ const message = createBaseUserAffectedResponse();
650
+ while (reader.pos < end) {
651
+ const tag = reader.uint32();
652
+ switch (tag >>> 3) {
653
+ case 1:
654
+ if (tag !== 10) {
655
+ break;
656
+ }
657
+ message.userAffected.push(exports.UserAffected.decode(reader, reader.uint32()));
658
+ continue;
659
+ }
660
+ if ((tag & 7) === 4 || tag === 0) {
661
+ break;
662
+ }
663
+ reader.skipType(tag & 7);
664
+ }
665
+ return message;
666
+ },
667
+ fromJSON(object) {
668
+ return {
669
+ userAffected: Array.isArray(object === null || object === void 0 ? void 0 : object.userAffected)
670
+ ? object.userAffected.map((e) => exports.UserAffected.fromJSON(e))
671
+ : [],
672
+ };
673
+ },
674
+ toJSON(message) {
675
+ const obj = {};
676
+ if (message.userAffected) {
677
+ obj.userAffected = message.userAffected.map((e) => e ? exports.UserAffected.toJSON(e) : undefined);
678
+ }
679
+ else {
680
+ obj.userAffected = [];
681
+ }
682
+ return obj;
683
+ },
684
+ create(base) {
685
+ return exports.UserAffectedResponse.fromPartial(base !== null && base !== void 0 ? base : {});
686
+ },
687
+ fromPartial(object) {
688
+ var _a;
689
+ const message = createBaseUserAffectedResponse();
690
+ message.userAffected = ((_a = object.userAffected) === null || _a === void 0 ? void 0 : _a.map((e) => exports.UserAffected.fromPartial(e))) || [];
691
+ return message;
692
+ },
693
+ };
694
+ function createBaseError() {
695
+ return { error: "" };
696
+ }
697
+ exports.Error = {
698
+ encode(message, writer = minimal_1.default.Writer.create()) {
699
+ if (message.error !== "") {
700
+ writer.uint32(10).string(message.error);
701
+ }
702
+ return writer;
703
+ },
704
+ decode(input, length) {
705
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
706
+ let end = length === undefined ? reader.len : reader.pos + length;
707
+ const message = createBaseError();
708
+ while (reader.pos < end) {
709
+ const tag = reader.uint32();
710
+ switch (tag >>> 3) {
711
+ case 1:
712
+ if (tag !== 10) {
713
+ break;
714
+ }
715
+ message.error = reader.string();
716
+ continue;
717
+ }
718
+ if ((tag & 7) === 4 || tag === 0) {
719
+ break;
720
+ }
721
+ reader.skipType(tag & 7);
722
+ }
723
+ return message;
724
+ },
725
+ fromJSON(object) {
726
+ return { error: isSet(object.error) ? String(object.error) : "" };
727
+ },
728
+ toJSON(message) {
729
+ const obj = {};
730
+ message.error !== undefined && (obj.error = message.error);
731
+ return obj;
732
+ },
733
+ create(base) {
734
+ return exports.Error.fromPartial(base !== null && base !== void 0 ? base : {});
735
+ },
736
+ fromPartial(object) {
737
+ var _a;
738
+ const message = createBaseError();
739
+ message.error = (_a = object.error) !== null && _a !== void 0 ? _a : "";
740
+ return message;
741
+ },
742
+ };
743
+ var tsProtoGlobalThis = (() => {
744
+ if (typeof globalThis !== "undefined") {
745
+ return globalThis;
746
+ }
747
+ if (typeof self !== "undefined") {
748
+ return self;
749
+ }
750
+ if (typeof window !== "undefined") {
751
+ return window;
752
+ }
753
+ if (typeof global !== "undefined") {
754
+ return global;
755
+ }
756
+ throw "Unable to locate global object";
757
+ })();
758
+ function longToNumber(long) {
759
+ if (long.gt(Number.MAX_SAFE_INTEGER)) {
760
+ throw new tsProtoGlobalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
761
+ }
762
+ return long.toNumber();
763
+ }
764
+ if (minimal_1.default.util.Long !== long_1.default) {
765
+ minimal_1.default.util.Long = long_1.default;
766
+ minimal_1.default.configure();
767
+ }
768
+ function isSet(value) {
769
+ return value !== null && value !== undefined;
770
+ }
771
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvdG8tbW9kZWxzL2NvbS9jb3JhbG9naXgvcnVtL3YyL2FuYWx5dGljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvQkFBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlFQUFxQztBQUV4QixRQUFBLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQztBQXlEdEQsU0FBUyx3QkFBd0I7SUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3RILENBQUM7QUFFWSxRQUFBLGNBQWMsR0FBRztJQUM1QixNQUFNLENBQUMsT0FBdUIsRUFBRSxTQUFxQixpQkFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDdEUsSUFBSSxPQUFPLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUN4QyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDcEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLEVB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QU0sSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztLQUNuRjtJQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxJQUFJLGlCQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxjQUFJLEVBQUU7SUFDMUIsaUJBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQVcsQ0FBQztJQUM1QixpQkFBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ2pCO0FBRUQsU0FBUyxLQUFLLENBQUMsS0FBVTtJQUN2QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBMb25nIGZyb20gXCJsb25nXCI7XG5pbXBvcnQgX20wIGZyb20gXCJwcm90b2J1ZmpzL21pbmltYWxcIjtcblxuZXhwb3J0IGNvbnN0IHByb3RvYnVmUGFja2FnZSA9IFwiY29tLmNvcmFsb2dpeC5ydW0udjJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrUmVxdWVzdCB7XG4gIG5ldHdvcmtSZXF1ZXN0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBtZXRob2Q/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG51bWJlck9mVXNlcnM6IG51bWJlcjtcbiAgbnVtYmVyT2ZFcnJvcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1lc3NhZ2Uge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIG51bWJlck9mVXNlcnM6IG51bWJlcjtcbiAgbnVtYmVyT2ZFcnJvcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcmwge1xuICB1cmxOYW1lOiBzdHJpbmc7XG4gIGVycm9yVHlwZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbnVtYmVyT2ZVc2VyczogbnVtYmVyO1xuICBudW1iZXJPZkVycm9yczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgbnVtYmVyT2ZFcnJvcnM6IG51bWJlcjtcbiAgdmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWZmZWN0ZWQge1xuICB1c2VySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHVzZXJFbWFpbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdXNlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxhc3RFcnJvcj86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbnVtYmVyT2ZFcnJvcnM/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50RGV0YWlsc1Jlc3BvbnNlIHtcbiAgZGV2aWNlOiBFbnZpcm9ubWVudEluZm9bXTtcbiAgb3M6IEVudmlyb25tZW50SW5mb1tdO1xuICBicm93c2VyOiBFbnZpcm9ubWVudEluZm9bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb3BUZW5SZXNwb25zZSB7XG4gIG5ldHdvcmtSZXF1ZXN0OiBOZXR3b3JrUmVxdWVzdFtdO1xuICBlcnJvck1lc3NhZ2U6IEVycm9yTWVzc2FnZVtdO1xuICB1cmw6IFVybFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZmZlY3RlZFJlc3BvbnNlIHtcbiAgdXNlckFmZmVjdGVkOiBVc2VyQWZmZWN0ZWRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvciB7XG4gIGVycm9yOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VOZXR3b3JrUmVxdWVzdCgpOiBOZXR3b3JrUmVxdWVzdCB7XG4gIHJldHVybiB7IG5ldHdvcmtSZXF1ZXN0OiB1bmRlZmluZWQsIG1ldGhvZDogdW5kZWZpbmVkLCBzdGF0dXNDb2RlOiB1bmRlZmluZWQsIG51bWJlck9mVXNlcnM6IDAsIG51bWJlck9mRXJyb3JzOiAwIH07XG59XG5cbmV4cG9ydCBjb25zdCBOZXR3b3JrUmVxdWVzdCA9IHtcbiAgZW5jb2RlKG1lc3NhZ2U6IE5ldHdvcmtSZXF1ZXN0LCB3cml0ZXI6IF9tMC5Xcml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKTogX20wLldyaXRlciB7XG4gICAgaWYgKG1lc3NhZ2UubmV0d29ya1JlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd3JpdGVyLnVpbnQzMigxMCkuc3RyaW5nKG1lc3NhZ2UubmV0d29ya1JlcXVlc3QpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UubWV0aG9kKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2Uuc3RhdHVzQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQ2NChtZXNzYWdlLnN0YXR1c0NvZGUpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5udW1iZXJPZlVzZXJzICE9PSAwKSB7XG4gICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQ2NChtZXNzYWdlLm51bWJlck9mVXNlcnMpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5udW1iZXJPZkVycm9ycyAhPT0gMCkge1xuICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50NjQobWVzc2FnZS5udW1iZXJPZkVycm9ycyk7XG4gICAgfVxuICAgIHJldHVybiB3cml0ZXI7XG4gIH0sXG5cbiAgZGVjb2RlKGlucHV0OiBfbTAuUmVhZGVyIHwgVWludDhBcnJheSwgbGVuZ3RoPzogbnVtYmVyKTogTmV0d29ya1JlcXVlc3Qge1xuICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlTmV0d29ya1JlcXVlc3QoKTtcbiAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLm5ldHdvcmtSZXF1ZXN0ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UubWV0aG9kID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMjQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2Uuc3RhdHVzQ29kZSA9IGxvbmdUb051bWJlcihyZWFkZXIuaW50NjQoKSBhcyBMb25nKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLm51bWJlck9mVXNlcnMgPSBsb25nVG9OdW1iZXIocmVhZGVyLmludDY0KCkgYXMgTG9uZyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBpZiAodGFnICE9PSA0MCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyA9IGxvbmdUb051bWJlcihyZWFkZXIuaW50NjQoKSBhcyBMb25nKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfSxcblxuICBmcm9tSlNPTihvYmplY3Q6IGFueSk6IE5ldHdvcmtSZXF1ZXN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmV0d29ya1JlcXVlc3Q6IGlzU2V0KG9iamVjdC5uZXR3b3JrUmVxdWVzdCkgPyBTdHJpbmcob2JqZWN0Lm5ldHdvcmtSZXF1ZXN0KSA6IHVuZGVmaW5lZCxcbiAgICAgIG1ldGhvZDogaXNTZXQob2JqZWN0Lm1ldGhvZCkgPyBTdHJpbmcob2JqZWN0Lm1ldGhvZCkgOiB1bmRlZmluZWQsXG4gICAgICBzdGF0dXNDb2RlOiBpc1NldChvYmplY3Quc3RhdHVzQ29kZSkgPyBOdW1iZXIob2JqZWN0LnN0YXR1c0NvZGUpIDogdW5kZWZpbmVkLFxuICAgICAgbnVtYmVyT2ZVc2VyczogaXNTZXQob2JqZWN0Lm51bWJlck9mVXNlcnMpID8gTnVtYmVyKG9iamVjdC5udW1iZXJPZlVzZXJzKSA6IDAsXG4gICAgICBudW1iZXJPZkVycm9yczogaXNTZXQob2JqZWN0Lm51bWJlck9mRXJyb3JzKSA/IE51bWJlcihvYmplY3QubnVtYmVyT2ZFcnJvcnMpIDogMCxcbiAgICB9O1xuICB9LFxuXG4gIHRvSlNPTihtZXNzYWdlOiBOZXR3b3JrUmVxdWVzdCk6IHVua25vd24ge1xuICAgIGNvbnN0IG9iajogYW55ID0ge307XG4gICAgbWVzc2FnZS5uZXR3b3JrUmVxdWVzdCAhPT0gdW5kZWZpbmVkICYmIChvYmoubmV0d29ya1JlcXVlc3QgPSBtZXNzYWdlLm5ldHdvcmtSZXF1ZXN0KTtcbiAgICBtZXNzYWdlLm1ldGhvZCAhPT0gdW5kZWZpbmVkICYmIChvYmoubWV0aG9kID0gbWVzc2FnZS5tZXRob2QpO1xuICAgIG1lc3NhZ2Uuc3RhdHVzQ29kZSAhPT0gdW5kZWZpbmVkICYmIChvYmouc3RhdHVzQ29kZSA9IE1hdGgucm91bmQobWVzc2FnZS5zdGF0dXNDb2RlKSk7XG4gICAgbWVzc2FnZS5udW1iZXJPZlVzZXJzICE9PSB1bmRlZmluZWQgJiYgKG9iai5udW1iZXJPZlVzZXJzID0gTWF0aC5yb3VuZChtZXNzYWdlLm51bWJlck9mVXNlcnMpKTtcbiAgICBtZXNzYWdlLm51bWJlck9mRXJyb3JzICE9PSB1bmRlZmluZWQgJiYgKG9iai5udW1iZXJPZkVycm9ycyA9IE1hdGgucm91bmQobWVzc2FnZS5udW1iZXJPZkVycm9ycykpO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG5cbiAgY3JlYXRlKGJhc2U/OiBEZWVwUGFydGlhbDxOZXR3b3JrUmVxdWVzdD4pOiBOZXR3b3JrUmVxdWVzdCB7XG4gICAgcmV0dXJuIE5ldHdvcmtSZXF1ZXN0LmZyb21QYXJ0aWFsKGJhc2UgPz8ge30pO1xuICB9LFxuXG4gIGZyb21QYXJ0aWFsKG9iamVjdDogRGVlcFBhcnRpYWw8TmV0d29ya1JlcXVlc3Q+KTogTmV0d29ya1JlcXVlc3Qge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlTmV0d29ya1JlcXVlc3QoKTtcbiAgICBtZXNzYWdlLm5ldHdvcmtSZXF1ZXN0ID0gb2JqZWN0Lm5ldHdvcmtSZXF1ZXN0ID8/IHVuZGVmaW5lZDtcbiAgICBtZXNzYWdlLm1ldGhvZCA9IG9iamVjdC5tZXRob2QgPz8gdW5kZWZpbmVkO1xuICAgIG1lc3NhZ2Uuc3RhdHVzQ29kZSA9IG9iamVjdC5zdGF0dXNDb2RlID8/IHVuZGVmaW5lZDtcbiAgICBtZXNzYWdlLm51bWJlck9mVXNlcnMgPSBvYmplY3QubnVtYmVyT2ZVc2VycyA/PyAwO1xuICAgIG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMgPSBvYmplY3QubnVtYmVyT2ZFcnJvcnMgPz8gMDtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VFcnJvck1lc3NhZ2UoKTogRXJyb3JNZXNzYWdlIHtcbiAgcmV0dXJuIHsgbWVzc2FnZTogXCJcIiwgbnVtYmVyT2ZVc2VyczogMCwgbnVtYmVyT2ZFcnJvcnM6IDAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEVycm9yTWVzc2FnZSA9IHtcbiAgZW5jb2RlKG1lc3NhZ2U6IEVycm9yTWVzc2FnZSwgd3JpdGVyOiBfbTAuV3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSk6IF9tMC5Xcml0ZXIge1xuICAgIGlmIChtZXNzYWdlLm1lc3NhZ2UgIT09IFwiXCIpIHtcbiAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5udW1iZXJPZlVzZXJzICE9PSAwKSB7XG4gICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQ2NChtZXNzYWdlLm51bWJlck9mVXNlcnMpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5udW1iZXJPZkVycm9ycyAhPT0gMCkge1xuICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50NjQobWVzc2FnZS5udW1iZXJPZkVycm9ycyk7XG4gICAgfVxuICAgIHJldHVybiB3cml0ZXI7XG4gIH0sXG5cbiAgZGVjb2RlKGlucHV0OiBfbTAuUmVhZGVyIHwgVWludDhBcnJheSwgbGVuZ3RoPzogbnVtYmVyKTogRXJyb3JNZXNzYWdlIHtcbiAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUVycm9yTWVzc2FnZSgpO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UubWVzc2FnZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGlmICh0YWcgIT09IDE2KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLm51bWJlck9mVXNlcnMgPSBsb25nVG9OdW1iZXIocmVhZGVyLmludDY0KCkgYXMgTG9uZyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAodGFnICE9PSAyNCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyA9IGxvbmdUb051bWJlcihyZWFkZXIuaW50NjQoKSBhcyBMb25nKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfSxcblxuICBmcm9tSlNPTihvYmplY3Q6IGFueSk6IEVycm9yTWVzc2FnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGlzU2V0KG9iamVjdC5tZXNzYWdlKSA/IFN0cmluZyhvYmplY3QubWVzc2FnZSkgOiBcIlwiLFxuICAgICAgbnVtYmVyT2ZVc2VyczogaXNTZXQob2JqZWN0Lm51bWJlck9mVXNlcnMpID8gTnVtYmVyKG9iamVjdC5udW1iZXJPZlVzZXJzKSA6IDAsXG4gICAgICBudW1iZXJPZkVycm9yczogaXNTZXQob2JqZWN0Lm51bWJlck9mRXJyb3JzKSA/IE51bWJlcihvYmplY3QubnVtYmVyT2ZFcnJvcnMpIDogMCxcbiAgICB9O1xuICB9LFxuXG4gIHRvSlNPTihtZXNzYWdlOiBFcnJvck1lc3NhZ2UpOiB1bmtub3duIHtcbiAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xuICAgIG1lc3NhZ2UubWVzc2FnZSAhPT0gdW5kZWZpbmVkICYmIChvYmoubWVzc2FnZSA9IG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgbWVzc2FnZS5udW1iZXJPZlVzZXJzICE9PSB1bmRlZmluZWQgJiYgKG9iai5udW1iZXJPZlVzZXJzID0gTWF0aC5yb3VuZChtZXNzYWdlLm51bWJlck9mVXNlcnMpKTtcbiAgICBtZXNzYWdlLm51bWJlck9mRXJyb3JzICE9PSB1bmRlZmluZWQgJiYgKG9iai5udW1iZXJPZkVycm9ycyA9IE1hdGgucm91bmQobWVzc2FnZS5udW1iZXJPZkVycm9ycykpO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG5cbiAgY3JlYXRlKGJhc2U/OiBEZWVwUGFydGlhbDxFcnJvck1lc3NhZ2U+KTogRXJyb3JNZXNzYWdlIHtcbiAgICByZXR1cm4gRXJyb3JNZXNzYWdlLmZyb21QYXJ0aWFsKGJhc2UgPz8ge30pO1xuICB9LFxuXG4gIGZyb21QYXJ0aWFsKG9iamVjdDogRGVlcFBhcnRpYWw8RXJyb3JNZXNzYWdlPik6IEVycm9yTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VFcnJvck1lc3NhZ2UoKTtcbiAgICBtZXNzYWdlLm1lc3NhZ2UgPSBvYmplY3QubWVzc2FnZSA/PyBcIlwiO1xuICAgIG1lc3NhZ2UubnVtYmVyT2ZVc2VycyA9IG9iamVjdC5udW1iZXJPZlVzZXJzID8/IDA7XG4gICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyA9IG9iamVjdC5udW1iZXJPZkVycm9ycyA/PyAwO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlQmFzZVVybCgpOiBVcmwge1xuICByZXR1cm4geyB1cmxOYW1lOiBcIlwiLCBlcnJvclR5cGU6IHVuZGVmaW5lZCwgbnVtYmVyT2ZVc2VyczogMCwgbnVtYmVyT2ZFcnJvcnM6IDAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFVybCA9IHtcbiAgZW5jb2RlKG1lc3NhZ2U6IFVybCwgd3JpdGVyOiBfbTAuV3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSk6IF9tMC5Xcml0ZXIge1xuICAgIGlmIChtZXNzYWdlLnVybE5hbWUgIT09IFwiXCIpIHtcbiAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLnVybE5hbWUpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5lcnJvclR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UuZXJyb3JUeXBlKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UubnVtYmVyT2ZVc2VycyAhPT0gMCkge1xuICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50NjQobWVzc2FnZS5udW1iZXJPZlVzZXJzKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMgIT09IDApIHtcbiAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDY0KG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdGVyO1xuICB9LFxuXG4gIGRlY29kZShpbnB1dDogX20wLlJlYWRlciB8IFVpbnQ4QXJyYXksIGxlbmd0aD86IG51bWJlcik6IFVybCB7XG4gICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VVcmwoKTtcbiAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLnVybE5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5lcnJvclR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAodGFnICE9PSAyNCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5udW1iZXJPZlVzZXJzID0gbG9uZ1RvTnVtYmVyKHJlYWRlci5pbnQ2NCgpIGFzIExvbmcpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMzIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMgPSBsb25nVG9OdW1iZXIocmVhZGVyLmludDY0KCkgYXMgTG9uZyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG5cbiAgZnJvbUpTT04ob2JqZWN0OiBhbnkpOiBVcmwge1xuICAgIHJldHVybiB7XG4gICAgICB1cmxOYW1lOiBpc1NldChvYmplY3QudXJsTmFtZSkgPyBTdHJpbmcob2JqZWN0LnVybE5hbWUpIDogXCJcIixcbiAgICAgIGVycm9yVHlwZTogaXNTZXQob2JqZWN0LmVycm9yVHlwZSkgPyBTdHJpbmcob2JqZWN0LmVycm9yVHlwZSkgOiB1bmRlZmluZWQsXG4gICAgICBudW1iZXJPZlVzZXJzOiBpc1NldChvYmplY3QubnVtYmVyT2ZVc2VycykgPyBOdW1iZXIob2JqZWN0Lm51bWJlck9mVXNlcnMpIDogMCxcbiAgICAgIG51bWJlck9mRXJyb3JzOiBpc1NldChvYmplY3QubnVtYmVyT2ZFcnJvcnMpID8gTnVtYmVyKG9iamVjdC5udW1iZXJPZkVycm9ycykgOiAwLFxuICAgIH07XG4gIH0sXG5cbiAgdG9KU09OKG1lc3NhZ2U6IFVybCk6IHVua25vd24ge1xuICAgIGNvbnN0IG9iajogYW55ID0ge307XG4gICAgbWVzc2FnZS51cmxOYW1lICE9PSB1bmRlZmluZWQgJiYgKG9iai51cmxOYW1lID0gbWVzc2FnZS51cmxOYW1lKTtcbiAgICBtZXNzYWdlLmVycm9yVHlwZSAhPT0gdW5kZWZpbmVkICYmIChvYmouZXJyb3JUeXBlID0gbWVzc2FnZS5lcnJvclR5cGUpO1xuICAgIG1lc3NhZ2UubnVtYmVyT2ZVc2VycyAhPT0gdW5kZWZpbmVkICYmIChvYmoubnVtYmVyT2ZVc2VycyA9IE1hdGgucm91bmQobWVzc2FnZS5udW1iZXJPZlVzZXJzKSk7XG4gICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyAhPT0gdW5kZWZpbmVkICYmIChvYmoubnVtYmVyT2ZFcnJvcnMgPSBNYXRoLnJvdW5kKG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMpKTtcbiAgICByZXR1cm4gb2JqO1xuICB9LFxuXG4gIGNyZWF0ZShiYXNlPzogRGVlcFBhcnRpYWw8VXJsPik6IFVybCB7XG4gICAgcmV0dXJuIFVybC5mcm9tUGFydGlhbChiYXNlID8/IHt9KTtcbiAgfSxcblxuICBmcm9tUGFydGlhbChvYmplY3Q6IERlZXBQYXJ0aWFsPFVybD4pOiBVcmwge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlVXJsKCk7XG4gICAgbWVzc2FnZS51cmxOYW1lID0gb2JqZWN0LnVybE5hbWUgPz8gXCJcIjtcbiAgICBtZXNzYWdlLmVycm9yVHlwZSA9IG9iamVjdC5lcnJvclR5cGUgPz8gdW5kZWZpbmVkO1xuICAgIG1lc3NhZ2UubnVtYmVyT2ZVc2VycyA9IG9iamVjdC5udW1iZXJPZlVzZXJzID8/IDA7XG4gICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyA9IG9iamVjdC5udW1iZXJPZkVycm9ycyA/PyAwO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlQmFzZUVudmlyb25tZW50SW5mbygpOiBFbnZpcm9ubWVudEluZm8ge1xuICByZXR1cm4geyBuYW1lOiBcIlwiLCBudW1iZXJPZkVycm9yczogMCwgdmVyc2lvbjogdW5kZWZpbmVkIH07XG59XG5cbmV4cG9ydCBjb25zdCBFbnZpcm9ubWVudEluZm8gPSB7XG4gIGVuY29kZShtZXNzYWdlOiBFbnZpcm9ubWVudEluZm8sIHdyaXRlcjogX20wLldyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpOiBfbTAuV3JpdGVyIHtcbiAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMgIT09IDApIHtcbiAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDY0KG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLnZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdGVyO1xuICB9LFxuXG4gIGRlY29kZShpbnB1dDogX20wLlJlYWRlciB8IFVpbnQ4QXJyYXksIGxlbmd0aD86IG51bWJlcik6IEVudmlyb25tZW50SW5mbyB7XG4gICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VFbnZpcm9ubWVudEluZm8oKTtcbiAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBpZiAodGFnICE9PSAxNikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyA9IGxvbmdUb051bWJlcihyZWFkZXIuaW50NjQoKSBhcyBMb25nKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGlmICh0YWcgIT09IDI2KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLnZlcnNpb24gPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG5cbiAgZnJvbUpTT04ob2JqZWN0OiBhbnkpOiBFbnZpcm9ubWVudEluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpc1NldChvYmplY3QubmFtZSkgPyBTdHJpbmcob2JqZWN0Lm5hbWUpIDogXCJcIixcbiAgICAgIG51bWJlck9mRXJyb3JzOiBpc1NldChvYmplY3QubnVtYmVyT2ZFcnJvcnMpID8gTnVtYmVyKG9iamVjdC5udW1iZXJPZkVycm9ycykgOiAwLFxuICAgICAgdmVyc2lvbjogaXNTZXQob2JqZWN0LnZlcnNpb24pID8gU3RyaW5nKG9iamVjdC52ZXJzaW9uKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9LFxuXG4gIHRvSlNPTihtZXNzYWdlOiBFbnZpcm9ubWVudEluZm8pOiB1bmtub3duIHtcbiAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xuICAgIG1lc3NhZ2UubmFtZSAhPT0gdW5kZWZpbmVkICYmIChvYmoubmFtZSA9IG1lc3NhZ2UubmFtZSk7XG4gICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyAhPT0gdW5kZWZpbmVkICYmIChvYmoubnVtYmVyT2ZFcnJvcnMgPSBNYXRoLnJvdW5kKG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMpKTtcbiAgICBtZXNzYWdlLnZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAob2JqLnZlcnNpb24gPSBtZXNzYWdlLnZlcnNpb24pO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG5cbiAgY3JlYXRlKGJhc2U/OiBEZWVwUGFydGlhbDxFbnZpcm9ubWVudEluZm8+KTogRW52aXJvbm1lbnRJbmZvIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnRJbmZvLmZyb21QYXJ0aWFsKGJhc2UgPz8ge30pO1xuICB9LFxuXG4gIGZyb21QYXJ0aWFsKG9iamVjdDogRGVlcFBhcnRpYWw8RW52aXJvbm1lbnRJbmZvPik6IEVudmlyb25tZW50SW5mbyB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VFbnZpcm9ubWVudEluZm8oKTtcbiAgICBtZXNzYWdlLm5hbWUgPSBvYmplY3QubmFtZSA/PyBcIlwiO1xuICAgIG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMgPSBvYmplY3QubnVtYmVyT2ZFcnJvcnMgPz8gMDtcbiAgICBtZXNzYWdlLnZlcnNpb24gPSBvYmplY3QudmVyc2lvbiA/PyB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVCYXNlVXNlckFmZmVjdGVkKCk6IFVzZXJBZmZlY3RlZCB7XG4gIHJldHVybiB7XG4gICAgdXNlcklkOiB1bmRlZmluZWQsXG4gICAgdXNlckVtYWlsOiB1bmRlZmluZWQsXG4gICAgdXNlck5hbWU6IHVuZGVmaW5lZCxcbiAgICBsYXN0RXJyb3I6IHVuZGVmaW5lZCxcbiAgICBudW1iZXJPZkVycm9yczogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgVXNlckFmZmVjdGVkID0ge1xuICBlbmNvZGUobWVzc2FnZTogVXNlckFmZmVjdGVkLCB3cml0ZXI6IF9tMC5Xcml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKTogX20wLldyaXRlciB7XG4gICAgaWYgKG1lc3NhZ2UudXNlcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLnVzZXJJZCk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLnVzZXJFbWFpbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS51c2VyRW1haWwpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS51c2VyTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS51c2VyTmFtZSk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLmxhc3RFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQ2NChtZXNzYWdlLmxhc3RFcnJvcik7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLm51bWJlck9mRXJyb3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdyaXRlci51aW50MzIoNDApLmludDY0KG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdGVyO1xuICB9LFxuXG4gIGRlY29kZShpbnB1dDogX20wLlJlYWRlciB8IFVpbnQ4QXJyYXksIGxlbmd0aD86IG51bWJlcik6IFVzZXJBZmZlY3RlZCB7XG4gICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VVc2VyQWZmZWN0ZWQoKTtcbiAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLnVzZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGlmICh0YWcgIT09IDE4KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLnVzZXJFbWFpbCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGlmICh0YWcgIT09IDI2KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLnVzZXJOYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMzIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UubGFzdEVycm9yID0gbG9uZ1RvTnVtYmVyKHJlYWRlci5pbnQ2NCgpIGFzIExvbmcpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gNDApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMgPSBsb25nVG9OdW1iZXIocmVhZGVyLmludDY0KCkgYXMgTG9uZyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG5cbiAgZnJvbUpTT04ob2JqZWN0OiBhbnkpOiBVc2VyQWZmZWN0ZWQge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VySWQ6IGlzU2V0KG9iamVjdC51c2VySWQpID8gU3RyaW5nKG9iamVjdC51c2VySWQpIDogdW5kZWZpbmVkLFxuICAgICAgdXNlckVtYWlsOiBpc1NldChvYmplY3QudXNlckVtYWlsKSA/IFN0cmluZyhvYmplY3QudXNlckVtYWlsKSA6IHVuZGVmaW5lZCxcbiAgICAgIHVzZXJOYW1lOiBpc1NldChvYmplY3QudXNlck5hbWUpID8gU3RyaW5nKG9iamVjdC51c2VyTmFtZSkgOiB1bmRlZmluZWQsXG4gICAgICBsYXN0RXJyb3I6IGlzU2V0KG9iamVjdC5sYXN0RXJyb3IpID8gTnVtYmVyKG9iamVjdC5sYXN0RXJyb3IpIDogdW5kZWZpbmVkLFxuICAgICAgbnVtYmVyT2ZFcnJvcnM6IGlzU2V0KG9iamVjdC5udW1iZXJPZkVycm9ycykgPyBOdW1iZXIob2JqZWN0Lm51bWJlck9mRXJyb3JzKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9LFxuXG4gIHRvSlNPTihtZXNzYWdlOiBVc2VyQWZmZWN0ZWQpOiB1bmtub3duIHtcbiAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xuICAgIG1lc3NhZ2UudXNlcklkICE9PSB1bmRlZmluZWQgJiYgKG9iai51c2VySWQgPSBtZXNzYWdlLnVzZXJJZCk7XG4gICAgbWVzc2FnZS51c2VyRW1haWwgIT09IHVuZGVmaW5lZCAmJiAob2JqLnVzZXJFbWFpbCA9IG1lc3NhZ2UudXNlckVtYWlsKTtcbiAgICBtZXNzYWdlLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgKG9iai51c2VyTmFtZSA9IG1lc3NhZ2UudXNlck5hbWUpO1xuICAgIG1lc3NhZ2UubGFzdEVycm9yICE9PSB1bmRlZmluZWQgJiYgKG9iai5sYXN0RXJyb3IgPSBNYXRoLnJvdW5kKG1lc3NhZ2UubGFzdEVycm9yKSk7XG4gICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyAhPT0gdW5kZWZpbmVkICYmIChvYmoubnVtYmVyT2ZFcnJvcnMgPSBNYXRoLnJvdW5kKG1lc3NhZ2UubnVtYmVyT2ZFcnJvcnMpKTtcbiAgICByZXR1cm4gb2JqO1xuICB9LFxuXG4gIGNyZWF0ZShiYXNlPzogRGVlcFBhcnRpYWw8VXNlckFmZmVjdGVkPik6IFVzZXJBZmZlY3RlZCB7XG4gICAgcmV0dXJuIFVzZXJBZmZlY3RlZC5mcm9tUGFydGlhbChiYXNlID8/IHt9KTtcbiAgfSxcblxuICBmcm9tUGFydGlhbChvYmplY3Q6IERlZXBQYXJ0aWFsPFVzZXJBZmZlY3RlZD4pOiBVc2VyQWZmZWN0ZWQge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlVXNlckFmZmVjdGVkKCk7XG4gICAgbWVzc2FnZS51c2VySWQgPSBvYmplY3QudXNlcklkID8/IHVuZGVmaW5lZDtcbiAgICBtZXNzYWdlLnVzZXJFbWFpbCA9IG9iamVjdC51c2VyRW1haWwgPz8gdW5kZWZpbmVkO1xuICAgIG1lc3NhZ2UudXNlck5hbWUgPSBvYmplY3QudXNlck5hbWUgPz8gdW5kZWZpbmVkO1xuICAgIG1lc3NhZ2UubGFzdEVycm9yID0gb2JqZWN0Lmxhc3RFcnJvciA/PyB1bmRlZmluZWQ7XG4gICAgbWVzc2FnZS5udW1iZXJPZkVycm9ycyA9IG9iamVjdC5udW1iZXJPZkVycm9ycyA/PyB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVCYXNlQ2xpZW50RGV0YWlsc1Jlc3BvbnNlKCk6IENsaWVudERldGFpbHNSZXNwb25zZSB7XG4gIHJldHVybiB7IGRldmljZTogW10sIG9zOiBbXSwgYnJvd3NlcjogW10gfTtcbn1cblxuZXhwb3J0IGNvbnN0IENsaWVudERldGFpbHNSZXNwb25zZSA9IHtcbiAgZW5jb2RlKG1lc3NhZ2U6IENsaWVudERldGFpbHNSZXNwb25zZSwgd3JpdGVyOiBfbTAuV3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSk6IF9tMC5Xcml0ZXIge1xuICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmRldmljZSkge1xuICAgICAgRW52aXJvbm1lbnRJbmZvLmVuY29kZSh2ISwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uub3MpIHtcbiAgICAgIEVudmlyb25tZW50SW5mby5lbmNvZGUodiEsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmJyb3dzZXIpIHtcbiAgICAgIEVudmlyb25tZW50SW5mby5lbmNvZGUodiEsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgfVxuICAgIHJldHVybiB3cml0ZXI7XG4gIH0sXG5cbiAgZGVjb2RlKGlucHV0OiBfbTAuUmVhZGVyIHwgVWludDhBcnJheSwgbGVuZ3RoPzogbnVtYmVyKTogQ2xpZW50RGV0YWlsc1Jlc3BvbnNlIHtcbiAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNsaWVudERldGFpbHNSZXNwb25zZSgpO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UuZGV2aWNlLnB1c2goRW52aXJvbm1lbnRJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2Uub3MucHVzaChFbnZpcm9ubWVudEluZm8uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAodGFnICE9PSAyNikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5icm93c2VyLnB1c2goRW52aXJvbm1lbnRJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxuXG4gIGZyb21KU09OKG9iamVjdDogYW55KTogQ2xpZW50RGV0YWlsc1Jlc3BvbnNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlOiBBcnJheS5pc0FycmF5KG9iamVjdD8uZGV2aWNlKSA/IG9iamVjdC5kZXZpY2UubWFwKChlOiBhbnkpID0+IEVudmlyb25tZW50SW5mby5mcm9tSlNPTihlKSkgOiBbXSxcbiAgICAgIG9zOiBBcnJheS5pc0FycmF5KG9iamVjdD8ub3MpID8gb2JqZWN0Lm9zLm1hcCgoZTogYW55KSA9PiBFbnZpcm9ubWVudEluZm8uZnJvbUpTT04oZSkpIDogW10sXG4gICAgICBicm93c2VyOiBBcnJheS5pc0FycmF5KG9iamVjdD8uYnJvd3NlcikgPyBvYmplY3QuYnJvd3Nlci5tYXAoKGU6IGFueSkgPT4gRW52aXJvbm1lbnRJbmZvLmZyb21KU09OKGUpKSA6IFtdLFxuICAgIH07XG4gIH0sXG5cbiAgdG9KU09OKG1lc3NhZ2U6IENsaWVudERldGFpbHNSZXNwb25zZSk6IHVua25vd24ge1xuICAgIGNvbnN0IG9iajogYW55ID0ge307XG4gICAgaWYgKG1lc3NhZ2UuZGV2aWNlKSB7XG4gICAgICBvYmouZGV2aWNlID0gbWVzc2FnZS5kZXZpY2UubWFwKChlKSA9PiBlID8gRW52aXJvbm1lbnRJbmZvLnRvSlNPTihlKSA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iai5kZXZpY2UgPSBbXTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2Uub3MpIHtcbiAgICAgIG9iai5vcyA9IG1lc3NhZ2Uub3MubWFwKChlKSA9PiBlID8gRW52aXJvbm1lbnRJbmZvLnRvSlNPTihlKSA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iai5vcyA9IFtdO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5icm93c2VyKSB7XG4gICAgICBvYmouYnJvd3NlciA9IG1lc3NhZ2UuYnJvd3Nlci5tYXAoKGUpID0+IGUgPyBFbnZpcm9ubWVudEluZm8udG9KU09OKGUpIDogdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqLmJyb3dzZXIgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcblxuICBjcmVhdGUoYmFzZT86IERlZXBQYXJ0aWFsPENsaWVudERldGFpbHNSZXNwb25zZT4pOiBDbGllbnREZXRhaWxzUmVzcG9uc2Uge1xuICAgIHJldHVybiBDbGllbnREZXRhaWxzUmVzcG9uc2UuZnJvbVBhcnRpYWwoYmFzZSA/PyB7fSk7XG4gIH0sXG5cbiAgZnJvbVBhcnRpYWwob2JqZWN0OiBEZWVwUGFydGlhbDxDbGllbnREZXRhaWxzUmVzcG9uc2U+KTogQ2xpZW50RGV0YWlsc1Jlc3BvbnNlIHtcbiAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNsaWVudERldGFpbHNSZXNwb25zZSgpO1xuICAgIG1lc3NhZ2UuZGV2aWNlID0gb2JqZWN0LmRldmljZT8ubWFwKChlKSA9PiBFbnZpcm9ubWVudEluZm8uZnJvbVBhcnRpYWwoZSkpIHx8IFtdO1xuICAgIG1lc3NhZ2Uub3MgPSBvYmplY3Qub3M/Lm1hcCgoZSkgPT4gRW52aXJvbm1lbnRJbmZvLmZyb21QYXJ0aWFsKGUpKSB8fCBbXTtcbiAgICBtZXNzYWdlLmJyb3dzZXIgPSBvYmplY3QuYnJvd3Nlcj8ubWFwKChlKSA9PiBFbnZpcm9ubWVudEluZm8uZnJvbVBhcnRpYWwoZSkpIHx8IFtdO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlQmFzZVRvcFRlblJlc3BvbnNlKCk6IFRvcFRlblJlc3BvbnNlIHtcbiAgcmV0dXJuIHsgbmV0d29ya1JlcXVlc3Q6IFtdLCBlcnJvck1lc3NhZ2U6IFtdLCB1cmw6IFtdIH07XG59XG5cbmV4cG9ydCBjb25zdCBUb3BUZW5SZXNwb25zZSA9IHtcbiAgZW5jb2RlKG1lc3NhZ2U6IFRvcFRlblJlc3BvbnNlLCB3cml0ZXI6IF9tMC5Xcml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKTogX20wLldyaXRlciB7XG4gICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UubmV0d29ya1JlcXVlc3QpIHtcbiAgICAgIE5ldHdvcmtSZXF1ZXN0LmVuY29kZSh2ISwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZXJyb3JNZXNzYWdlKSB7XG4gICAgICBFcnJvck1lc3NhZ2UuZW5jb2RlKHYhLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS51cmwpIHtcbiAgICAgIFVybC5lbmNvZGUodiEsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgfVxuICAgIHJldHVybiB3cml0ZXI7XG4gIH0sXG5cbiAgZGVjb2RlKGlucHV0OiBfbTAuUmVhZGVyIHwgVWludDhBcnJheSwgbGVuZ3RoPzogbnVtYmVyKTogVG9wVGVuUmVzcG9uc2Uge1xuICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlVG9wVGVuUmVzcG9uc2UoKTtcbiAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLm5ldHdvcmtSZXF1ZXN0LnB1c2goTmV0d29ya1JlcXVlc3QuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBpZiAodGFnICE9PSAxOCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5lcnJvck1lc3NhZ2UucHVzaChFcnJvck1lc3NhZ2UuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAodGFnICE9PSAyNikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS51cmwucHVzaChVcmwuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG5cbiAgZnJvbUpTT04ob2JqZWN0OiBhbnkpOiBUb3BUZW5SZXNwb25zZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldHdvcmtSZXF1ZXN0OiBBcnJheS5pc0FycmF5KG9iamVjdD8ubmV0d29ya1JlcXVlc3QpXG4gICAgICAgID8gb2JqZWN0Lm5ldHdvcmtSZXF1ZXN0Lm1hcCgoZTogYW55KSA9PiBOZXR3b3JrUmVxdWVzdC5mcm9tSlNPTihlKSlcbiAgICAgICAgOiBbXSxcbiAgICAgIGVycm9yTWVzc2FnZTogQXJyYXkuaXNBcnJheShvYmplY3Q/LmVycm9yTWVzc2FnZSlcbiAgICAgICAgPyBvYmplY3QuZXJyb3JNZXNzYWdlLm1hcCgoZTogYW55KSA9PiBFcnJvck1lc3NhZ2UuZnJvbUpTT04oZSkpXG4gICAgICAgIDogW10sXG4gICAgICB1cmw6IEFycmF5LmlzQXJyYXkob2JqZWN0Py51cmwpID8gb2JqZWN0LnVybC5tYXAoKGU6IGFueSkgPT4gVXJsLmZyb21KU09OKGUpKSA6IFtdLFxuICAgIH07XG4gIH0sXG5cbiAgdG9KU09OKG1lc3NhZ2U6IFRvcFRlblJlc3BvbnNlKTogdW5rbm93biB7XG4gICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcbiAgICBpZiAobWVzc2FnZS5uZXR3b3JrUmVxdWVzdCkge1xuICAgICAgb2JqLm5ldHdvcmtSZXF1ZXN0ID0gbWVzc2FnZS5uZXR3b3JrUmVxdWVzdC5tYXAoKGUpID0+IGUgPyBOZXR3b3JrUmVxdWVzdC50b0pTT04oZSkgOiB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmoubmV0d29ya1JlcXVlc3QgPSBbXTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuZXJyb3JNZXNzYWdlKSB7XG4gICAgICBvYmouZXJyb3JNZXNzYWdlID0gbWVzc2FnZS5lcnJvck1lc3NhZ2UubWFwKChlKSA9PiBlID8gRXJyb3JNZXNzYWdlLnRvSlNPTihlKSA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iai5lcnJvck1lc3NhZ2UgPSBbXTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UudXJsKSB7XG4gICAgICBvYmoudXJsID0gbWVzc2FnZS51cmwubWFwKChlKSA9PiBlID8gVXJsLnRvSlNPTihlKSA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iai51cmwgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcblxuICBjcmVhdGUoYmFzZT86IERlZXBQYXJ0aWFsPFRvcFRlblJlc3BvbnNlPik6IFRvcFRlblJlc3BvbnNlIHtcbiAgICByZXR1cm4gVG9wVGVuUmVzcG9uc2UuZnJvbVBhcnRpYWwoYmFzZSA/PyB7fSk7XG4gIH0sXG5cbiAgZnJvbVBhcnRpYWwob2JqZWN0OiBEZWVwUGFydGlhbDxUb3BUZW5SZXNwb25zZT4pOiBUb3BUZW5SZXNwb25zZSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VUb3BUZW5SZXNwb25zZSgpO1xuICAgIG1lc3NhZ2UubmV0d29ya1JlcXVlc3QgPSBvYmplY3QubmV0d29ya1JlcXVlc3Q/Lm1hcCgoZSkgPT4gTmV0d29ya1JlcXVlc3QuZnJvbVBhcnRpYWwoZSkpIHx8IFtdO1xuICAgIG1lc3NhZ2UuZXJyb3JNZXNzYWdlID0gb2JqZWN0LmVycm9yTWVzc2FnZT8ubWFwKChlKSA9PiBFcnJvck1lc3NhZ2UuZnJvbVBhcnRpYWwoZSkpIHx8IFtdO1xuICAgIG1lc3NhZ2UudXJsID0gb2JqZWN0LnVybD8ubWFwKChlKSA9PiBVcmwuZnJvbVBhcnRpYWwoZSkpIHx8IFtdO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlQmFzZVVzZXJBZmZlY3RlZFJlc3BvbnNlKCk6IFVzZXJBZmZlY3RlZFJlc3BvbnNlIHtcbiAgcmV0dXJuIHsgdXNlckFmZmVjdGVkOiBbXSB9O1xufVxuXG5leHBvcnQgY29uc3QgVXNlckFmZmVjdGVkUmVzcG9uc2UgPSB7XG4gIGVuY29kZShtZXNzYWdlOiBVc2VyQWZmZWN0ZWRSZXNwb25zZSwgd3JpdGVyOiBfbTAuV3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSk6IF9tMC5Xcml0ZXIge1xuICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnVzZXJBZmZlY3RlZCkge1xuICAgICAgVXNlckFmZmVjdGVkLmVuY29kZSh2ISwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyaXRlcjtcbiAgfSxcblxuICBkZWNvZGUoaW5wdXQ6IF9tMC5SZWFkZXIgfCBVaW50OEFycmF5LCBsZW5ndGg/OiBudW1iZXIpOiBVc2VyQWZmZWN0ZWRSZXNwb25zZSB7XG4gICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VVc2VyQWZmZWN0ZWRSZXNwb25zZSgpO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UudXNlckFmZmVjdGVkLnB1c2goVXNlckFmZmVjdGVkLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxuXG4gIGZyb21KU09OKG9iamVjdDogYW55KTogVXNlckFmZmVjdGVkUmVzcG9uc2Uge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyQWZmZWN0ZWQ6IEFycmF5LmlzQXJyYXkob2JqZWN0Py51c2VyQWZmZWN0ZWQpXG4gICAgICAgID8gb2JqZWN0LnVzZXJBZmZlY3RlZC5tYXAoKGU6IGFueSkgPT4gVXNlckFmZmVjdGVkLmZyb21KU09OKGUpKVxuICAgICAgICA6IFtdLFxuICAgIH07XG4gIH0sXG5cbiAgdG9KU09OKG1lc3NhZ2U6IFVzZXJBZmZlY3RlZFJlc3BvbnNlKTogdW5rbm93biB7XG4gICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcbiAgICBpZiAobWVzc2FnZS51c2VyQWZmZWN0ZWQpIHtcbiAgICAgIG9iai51c2VyQWZmZWN0ZWQgPSBtZXNzYWdlLnVzZXJBZmZlY3RlZC5tYXAoKGUpID0+IGUgPyBVc2VyQWZmZWN0ZWQudG9KU09OKGUpIDogdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqLnVzZXJBZmZlY3RlZCA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9LFxuXG4gIGNyZWF0ZShiYXNlPzogRGVlcFBhcnRpYWw8VXNlckFmZmVjdGVkUmVzcG9uc2U+KTogVXNlckFmZmVjdGVkUmVzcG9uc2Uge1xuICAgIHJldHVybiBVc2VyQWZmZWN0ZWRSZXNwb25zZS5mcm9tUGFydGlhbChiYXNlID8/IHt9KTtcbiAgfSxcblxuICBmcm9tUGFydGlhbChvYmplY3Q6IERlZXBQYXJ0aWFsPFVzZXJBZmZlY3RlZFJlc3BvbnNlPik6IFVzZXJBZmZlY3RlZFJlc3BvbnNlIHtcbiAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVVzZXJBZmZlY3RlZFJlc3BvbnNlKCk7XG4gICAgbWVzc2FnZS51c2VyQWZmZWN0ZWQgPSBvYmplY3QudXNlckFmZmVjdGVkPy5tYXAoKGUpID0+IFVzZXJBZmZlY3RlZC5mcm9tUGFydGlhbChlKSkgfHwgW107XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVCYXNlRXJyb3IoKTogRXJyb3Ige1xuICByZXR1cm4geyBlcnJvcjogXCJcIiB9O1xufVxuXG5leHBvcnQgY29uc3QgRXJyb3IgPSB7XG4gIGVuY29kZShtZXNzYWdlOiBFcnJvciwgd3JpdGVyOiBfbTAuV3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSk6IF9tMC5Xcml0ZXIge1xuICAgIGlmIChtZXNzYWdlLmVycm9yICE9PSBcIlwiKSB7XG4gICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5lcnJvcik7XG4gICAgfVxuICAgIHJldHVybiB3cml0ZXI7XG4gIH0sXG5cbiAgZGVjb2RlKGlucHV0OiBfbTAuUmVhZGVyIHwgVWludDhBcnJheSwgbGVuZ3RoPzogbnVtYmVyKTogRXJyb3Ige1xuICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlRXJyb3IoKTtcbiAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh0YWcgIT09IDEwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxuXG4gIGZyb21KU09OKG9iamVjdDogYW55KTogRXJyb3Ige1xuICAgIHJldHVybiB7IGVycm9yOiBpc1NldChvYmplY3QuZXJyb3IpID8gU3RyaW5nKG9iamVjdC5lcnJvcikgOiBcIlwiIH07XG4gIH0sXG5cbiAgdG9KU09OKG1lc3NhZ2U6IEVycm9yKTogdW5rbm93biB7XG4gICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcbiAgICBtZXNzYWdlLmVycm9yICE9PSB1bmRlZmluZWQgJiYgKG9iai5lcnJvciA9IG1lc3NhZ2UuZXJyb3IpO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG5cbiAgY3JlYXRlKGJhc2U/OiBEZWVwUGFydGlhbDxFcnJvcj4pOiBFcnJvciB7XG4gICAgcmV0dXJuIEVycm9yLmZyb21QYXJ0aWFsKGJhc2UgPz8ge30pO1xuICB9LFxuXG4gIGZyb21QYXJ0aWFsKG9iamVjdDogRGVlcFBhcnRpYWw8RXJyb3I+KTogRXJyb3Ige1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlRXJyb3IoKTtcbiAgICBtZXNzYWdlLmVycm9yID0gb2JqZWN0LmVycm9yID8/IFwiXCI7XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG59O1xuXG5kZWNsYXJlIHZhciBzZWxmOiBhbnkgfCB1bmRlZmluZWQ7XG5kZWNsYXJlIHZhciB3aW5kb3c6IGFueSB8IHVuZGVmaW5lZDtcbmRlY2xhcmUgdmFyIGdsb2JhbDogYW55IHwgdW5kZWZpbmVkO1xudmFyIHRzUHJvdG9HbG9iYWxUaGlzOiBhbnkgPSAoKCkgPT4ge1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgfVxuICBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gZ2xvYmFsO1xuICB9XG4gIHRocm93IFwiVW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0XCI7XG59KSgpO1xuXG50eXBlIEJ1aWx0aW4gPSBEYXRlIHwgRnVuY3Rpb24gfCBVaW50OEFycmF5IHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgRGVlcFBhcnRpYWw8VD4gPSBUIGV4dGVuZHMgQnVpbHRpbiA/IFRcbiAgOiBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBBcnJheTxEZWVwUGFydGlhbDxVPj4gOiBUIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxpbmZlciBVPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFBhcnRpYWw8VT4+XG4gIDogVCBleHRlbmRzIHsgJGNhc2U6IHN0cmluZyB9ID8geyBbSyBpbiBrZXlvZiBPbWl0PFQsIFwiJGNhc2VcIj5dPzogRGVlcFBhcnRpYWw8VFtLXT4gfSAmIHsgJGNhc2U6IFRbXCIkY2FzZVwiXSB9XG4gIDogVCBleHRlbmRzIHt9ID8geyBbSyBpbiBrZXlvZiBUXT86IERlZXBQYXJ0aWFsPFRbS10+IH1cbiAgOiBQYXJ0aWFsPFQ+O1xuXG5mdW5jdGlvbiBsb25nVG9OdW1iZXIobG9uZzogTG9uZyk6IG51bWJlciB7XG4gIGlmIChsb25nLmd0KE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSkge1xuICAgIHRocm93IG5ldyB0c1Byb3RvR2xvYmFsVGhpcy5FcnJvcihcIlZhbHVlIGlzIGxhcmdlciB0aGFuIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXCIpO1xuICB9XG4gIHJldHVybiBsb25nLnRvTnVtYmVyKCk7XG59XG5cbmlmIChfbTAudXRpbC5Mb25nICE9PSBMb25nKSB7XG4gIF9tMC51dGlsLkxvbmcgPSBMb25nIGFzIGFueTtcbiAgX20wLmNvbmZpZ3VyZSgpO1xufVxuXG5mdW5jdGlvbiBpc1NldCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xufVxuIl19