@catchpower/device-config-interaction 0.0.13

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.
@@ -0,0 +1,524 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DatasetProcessingService {
4
+ //constructor() {}
5
+ /*
6
+ * For use with DataView
7
+ *
8
+ */
9
+ getValuefromBuffer(obj, buffer) {
10
+ let value = 0;
11
+ if (obj.signed) {
12
+ switch (obj.length) {
13
+ case 8:
14
+ value = buffer.getInt8(obj.position);
15
+ break;
16
+ case 16:
17
+ value = buffer.getInt16(obj.position, obj.little);
18
+ break;
19
+ case 32:
20
+ value = buffer.getInt32(obj.position, obj.little);
21
+ break;
22
+ }
23
+ }
24
+ else {
25
+ switch (obj.length) {
26
+ case 8:
27
+ value = buffer.getUint8(obj.position);
28
+ break;
29
+ case 16:
30
+ value = buffer.getUint16(obj.position, obj.little);
31
+ break;
32
+ case 32:
33
+ value = buffer.getUint32(obj.position, obj.little);
34
+ break;
35
+ }
36
+ }
37
+ return value;
38
+ }
39
+ /*
40
+ * For use with DataView
41
+ *
42
+ *
43
+ */
44
+ writeValueToBuffer(obj, value, buffer) {
45
+ if (obj.signed) {
46
+ switch (obj.length) {
47
+ case 8:
48
+ buffer.setInt8(obj.position, value);
49
+ break;
50
+ case 16:
51
+ buffer.setInt16(obj.position, value, obj.little);
52
+ break;
53
+ case 32:
54
+ buffer.setInt32(obj.position, value, obj.little);
55
+ break;
56
+ }
57
+ }
58
+ else {
59
+ switch (obj.length) {
60
+ case 8:
61
+ buffer.setUint8(obj.position, value);
62
+ break;
63
+ case 16:
64
+ buffer.setUint16(obj.position, value, obj.little);
65
+ break;
66
+ case 32:
67
+ buffer.setUint32(obj.position, value, obj.little);
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ runProcess(process, rawData, otherData) {
73
+ const values = this.getChunkValues(process.data, rawData, otherData);
74
+ //console.log('process values ', values);
75
+ let pVal = 0;
76
+ switch (process.type) {
77
+ case 'ass':
78
+ pVal = this.assembleProcess(values);
79
+ process.value = pVal;
80
+ return;
81
+ case 'com':
82
+ pVal = this.compareProcess(values, process);
83
+ process.value = pVal;
84
+ return;
85
+ case 'cal':
86
+ pVal = this.calculateProcess(values);
87
+ process.value = pVal;
88
+ return;
89
+ case 'tfm':
90
+ pVal = this.tfmProcess(values);
91
+ process.value = pVal;
92
+ return;
93
+ case 'cdt':
94
+ pVal = this.cdtProcess(values);
95
+ process.value = pVal;
96
+ return;
97
+ case 'itd':
98
+ pVal = this.itdProcess(values);
99
+ process.value = pVal;
100
+ return;
101
+ case 'its':
102
+ pVal = this.itsProcess(values);
103
+ process.value = pVal;
104
+ return;
105
+ case 'bsv':
106
+ pVal = this.bsvProcess(values);
107
+ process.value = pVal;
108
+ return;
109
+ case 'vfa':
110
+ pVal = this.vfaProcess(values, process);
111
+ process.value = pVal;
112
+ return;
113
+ case 'cts':
114
+ pVal = this.ctsProcess(values);
115
+ process.value = pVal;
116
+ return;
117
+ }
118
+ }
119
+ assembleProcess(values) {
120
+ let result = '';
121
+ values.forEach((v) => {
122
+ result += v;
123
+ });
124
+ return result;
125
+ }
126
+ disassembleProcess(string, values) {
127
+ const result = {};
128
+ let i = 0;
129
+ let length = 0;
130
+ values.forEach((val) => {
131
+ if (Object.prototype.hasOwnProperty.call(val, 'strLength')) {
132
+ length = val.strLength;
133
+ }
134
+ else {
135
+ const str = val.value;
136
+ length = str.length;
137
+ }
138
+ if (val.fromData == 'raw') {
139
+ result[val.value] = Number(string.substring(i, i + length));
140
+ }
141
+ i = i + length;
142
+ });
143
+ //console.log('Disassemble Result ', JSON.stringify(result));
144
+ return result;
145
+ }
146
+ compareProcess(values, process) {
147
+ const result = this.compareValues(values[0], values[1], values[2]);
148
+ let text = 'N/A';
149
+ if ('comTxt' in process) {
150
+ if (process.comTxt !== undefined) {
151
+ if (result) {
152
+ text = process.comTxt[0];
153
+ }
154
+ else {
155
+ return process.comTxt[1];
156
+ }
157
+ }
158
+ }
159
+ return text;
160
+ }
161
+ compareValues(v1, op, v2) {
162
+ switch (op) {
163
+ case '<':
164
+ return v1 < v2;
165
+ case '<=':
166
+ return v1 <= v2;
167
+ case '==':
168
+ return v1 == v2;
169
+ case '>=':
170
+ return v1 >= v2;
171
+ case '>':
172
+ return v1 > v2;
173
+ default:
174
+ return false;
175
+ }
176
+ }
177
+ calculateProcess(values) {
178
+ return this.calculateValues(values[0], values[1], values[2]);
179
+ }
180
+ calculateValues(v1, op, v2) {
181
+ switch (op) {
182
+ case '+':
183
+ return v1 + v2;
184
+ case '-':
185
+ return v1 - v2;
186
+ case '/':
187
+ return v1 / v2;
188
+ case '*':
189
+ return v1 * v2;
190
+ default:
191
+ return 0;
192
+ }
193
+ }
194
+ tfmProcess(values) {
195
+ const hours = Math.floor((values[0] * 60) / 3600);
196
+ const mins = Math.floor((values[0] * 60 - hours * 3600) / 60);
197
+ return this.displayTime(hours, mins);
198
+ }
199
+ cdtProcess(values) {
200
+ const hours = parseInt(values[0].substring(11, 13));
201
+ const mins = parseInt(values[0].substring(14, 16));
202
+ return this.displayTime(hours, mins);
203
+ }
204
+ //New process to pick value from array based on interger value
205
+ vfaProcess(values, process) {
206
+ const value = values[0];
207
+ if (process.valuesList !== undefined) {
208
+ if (value < process.valuesList.length) {
209
+ return process.valuesList[value];
210
+ }
211
+ else {
212
+ return 'nip';
213
+ }
214
+ }
215
+ else {
216
+ return 'n/a';
217
+ }
218
+ }
219
+ itdProcess(values) {
220
+ let hours = Math.floor((values[0] * 60) / 3600);
221
+ //console.log("hours ", hours);
222
+ const mins = Math.floor((values[0] * 60 - hours * 3600) / 60);
223
+ //console.log("mins ", mins);
224
+ let h;
225
+ let m;
226
+ if (hours > 23) {
227
+ hours = hours - 24;
228
+ }
229
+ if (hours < 10) {
230
+ h = '0' + hours;
231
+ }
232
+ else {
233
+ h = hours;
234
+ }
235
+ if (mins < 10) {
236
+ m = '0' + mins;
237
+ }
238
+ else {
239
+ m = mins;
240
+ }
241
+ const string = '0000-00-00T' + h + ':' + m;
242
+ //console.log("$%^&&^%%$$%^&&&^%%%%^^^&&&^^%^%%%^^^& dt string ", string);
243
+ return string;
244
+ }
245
+ dtiProcess(string, values) {
246
+ //console.log("dtiProcess inputs string: ", string, " Values: ", values);
247
+ const result = {};
248
+ let h;
249
+ let m;
250
+ values.forEach((val) => {
251
+ // h = Number(string.substr(11, 2));
252
+ // m = Number(string.substr(14, 2));
253
+ h = Number(string.substring(11, 13));
254
+ m = Number(string.substring(14, 16));
255
+ result[val.value] = h * 60 + m;
256
+ });
257
+ //console.log("date to integer Result ", JSON.stringify(result));
258
+ return result;
259
+ }
260
+ itsProcess(values) {
261
+ //console.log('itsProcess values', JSON.stringify(values));
262
+ const str = values[0].toString();
263
+ return str;
264
+ }
265
+ stiProcess(string, values) {
266
+ const result = {};
267
+ values.forEach((val) => {
268
+ result[val.value] = Number(string);
269
+ });
270
+ //console.log("string to integer Result ", JSON.stringify(result));
271
+ return result;
272
+ }
273
+ bsvProcess(values) {
274
+ const startValue = values[0];
275
+ const pos1 = values[1];
276
+ const pos2 = pos1 + 1;
277
+ const binaryStr = parseInt(startValue, 10)
278
+ .toString(2)
279
+ .padStart(4, '0');
280
+ return binaryStr.substring(pos1, pos2);
281
+ }
282
+ bsvRevert(string, values, bssObj) {
283
+ if (Object.prototype.hasOwnProperty.call(bssObj, values[0].value)) {
284
+ bssObj[values[0].value] = this.replaceCharAt(bssObj[values[0].value], values[1].value, string);
285
+ }
286
+ else {
287
+ bssObj[values[0].value] = '0000';
288
+ bssObj[values[0].value] = this.replaceCharAt(bssObj[values[0].value], values[1].value, string);
289
+ }
290
+ return bssObj;
291
+ }
292
+ stcProcess(value) {
293
+ const initArray = value.split('');
294
+ const resultArray = [];
295
+ initArray.forEach((v) => {
296
+ resultArray.push(v.charCodeAt(0));
297
+ });
298
+ return resultArray;
299
+ }
300
+ ctsProcess(values) {
301
+ // let result: string = "";
302
+ const ary = [];
303
+ values.forEach((v) => {
304
+ if (v >= 0) {
305
+ ary.push(v);
306
+ }
307
+ else {
308
+ ary.push(0);
309
+ }
310
+ });
311
+ //console.log("CTS PROCESS INPUT VALUES ", values);
312
+ let str = String.fromCharCode(...ary);
313
+ // eslint-disable-next-line no-control-regex
314
+ str = str.replace(/[\u0000]/g, '');
315
+ //str = str.replace(/[^\x20-\x7E]/g, "");
316
+ return str;
317
+ }
318
+ ctsRevert(otherObj, results) {
319
+ const valAry = this.stcProcess(otherObj.value);
320
+ //console.log("VAL ARRAY", valAry);
321
+ //console.log("PROCESS DATA", JSON.stringify(otherObj.processData));
322
+ let progress = 0;
323
+ otherObj.processData[0].data.forEach((process) => {
324
+ const res = {};
325
+ if (valAry.length >= progress) {
326
+ res[process.value] = valAry[progress];
327
+ }
328
+ else {
329
+ res[process.value] = 0;
330
+ }
331
+ results = Object.assign(results, res);
332
+ ++progress;
333
+ });
334
+ return results;
335
+ }
336
+ binaryStrToDecimal(str) {
337
+ return parseInt(str, 2);
338
+ }
339
+ replaceCharAt(string, index, char) {
340
+ return (string.substring(0, index) + char + string.substring(index + char.length));
341
+ //return string.substr(0, index) + char + string.substr(index + char.length);
342
+ }
343
+ writeFormValuesToRawObj(formValues, rawObj) {
344
+ // rawObj.forEach((raw) => {
345
+ // if (formValues.hasOwnProperty(raw.name)) {
346
+ // raw.value = Math.round(formValues[raw.name] / raw.multi);
347
+ // }
348
+ // });
349
+ for (let i = 0; i < rawObj.length; i++) {
350
+ if (Object.prototype.hasOwnProperty.call(formValues, rawObj[i].name)) {
351
+ rawObj[i].value = Math.round(formValues[rawObj[i].name] / rawObj[i].multi);
352
+ }
353
+ }
354
+ return rawObj;
355
+ }
356
+ getPwd(rawValues) {
357
+ const pwdArray = [];
358
+ let i;
359
+ let name;
360
+ for (i = 0; i < 16; i++) {
361
+ if (i < 10) {
362
+ name = 'pass_0' + i;
363
+ }
364
+ else {
365
+ name = 'pass_' + i;
366
+ }
367
+ rawValues.forEach((v) => {
368
+ if (v.name == name) {
369
+ pwdArray.push(v.value);
370
+ }
371
+ });
372
+ }
373
+ return pwdArray;
374
+ }
375
+ strToPwd(string) {
376
+ const pwdArray = [];
377
+ let i;
378
+ if (string == null) {
379
+ string = '';
380
+ }
381
+ for (i = 0; i < 16; i++) {
382
+ if (i < string.length) {
383
+ pwdArray.push(string.charCodeAt(i));
384
+ }
385
+ else {
386
+ pwdArray.push(0);
387
+ }
388
+ }
389
+ return pwdArray;
390
+ }
391
+ chkPwd(arr1, arr2) {
392
+ if (!Array.isArray(arr1) ||
393
+ !Array.isArray(arr2) ||
394
+ arr1.length !== arr2.length)
395
+ return false;
396
+ for (let i = 0; i < arr1.length; i++) {
397
+ if (arr1[i] !== arr2[i])
398
+ return false;
399
+ }
400
+ return true;
401
+ }
402
+ writePwdToConfig(passArray, rawObj) {
403
+ let i;
404
+ let name;
405
+ //console.log("Before write password ", JSON.stringify(rawObj));
406
+ for (i = 0; i < 16; i++) {
407
+ if (i < 10) {
408
+ name = 'pass_0' + i;
409
+ }
410
+ else {
411
+ name = 'pass_' + i;
412
+ }
413
+ rawObj.forEach((v) => {
414
+ if (v.name == name) {
415
+ v.value = passArray[i];
416
+ }
417
+ });
418
+ }
419
+ //console.log("After write password ", JSON.stringify(rawObj));
420
+ return rawObj;
421
+ }
422
+ displayTime(hours, mins) {
423
+ //console.log("hours = ", hours, " mins = ", mins);
424
+ let m = mins;
425
+ let p = 'am';
426
+ if (mins < 10) {
427
+ m = '0' + mins;
428
+ }
429
+ if (hours > 11) {
430
+ p = 'pm';
431
+ }
432
+ if (hours == 0) {
433
+ hours = 12;
434
+ }
435
+ if (hours > 12) {
436
+ hours -= 12;
437
+ }
438
+ return hours + ':' + m + ' ' + p;
439
+ }
440
+ getChunkValues(processData, rawData, otherData) {
441
+ // console.log(
442
+ // 'GET CHUNK VALUES ',
443
+ // JSON.stringify(rawData),
444
+ // ' ',
445
+ // JSON.stringify(otherData)
446
+ // );
447
+ let v;
448
+ const values = [];
449
+ processData.forEach((chunk) => {
450
+ //console.log('Process Raw chunk ', JSON.stringify(chunk));
451
+ switch (chunk.fromData) {
452
+ case 'raw':
453
+ rawData.forEach((rd) => {
454
+ if (rd.name == chunk.value) {
455
+ //console.log('RAW chunk name: ', rd.name);
456
+ v = rd.value;
457
+ }
458
+ });
459
+ break;
460
+ case 'other':
461
+ otherData.forEach((od) => {
462
+ if (od.name == chunk.value) {
463
+ v = od.value;
464
+ }
465
+ });
466
+ break;
467
+ case 'no':
468
+ v = chunk.value;
469
+ break;
470
+ }
471
+ if (typeof chunk.strLength === 'undefined') {
472
+ values.push(v);
473
+ }
474
+ else {
475
+ const pad = v.toString().padStart(chunk.strLength, '0');
476
+ values.push(pad);
477
+ }
478
+ });
479
+ return values;
480
+ }
481
+ uint8ArrayToArray(uint8) {
482
+ return Array.from(uint8);
483
+ }
484
+ arrayToUint8Array(array) {
485
+ return Uint8Array.from(array);
486
+ }
487
+ isUint8Array(v) {
488
+ const isStr = Object.prototype.toString;
489
+ return isStr.call(v) === '[object Uint8Array]';
490
+ }
491
+ processRaw(input, configObj) {
492
+ let buffer;
493
+ if (this.isUint8Array(input)) {
494
+ buffer = input;
495
+ }
496
+ else {
497
+ buffer = this.arrayToUint8Array(input);
498
+ }
499
+ const rawDataBuffer = new DataView(buffer.buffer, 0, 254);
500
+ //console.log('PROCESS RAW CONFIG ', rawDataBuffer);
501
+ configObj.rawData.forEach((datapoint) => {
502
+ datapoint.value =
503
+ this.getValuefromBuffer(datapoint.buffer, rawDataBuffer) *
504
+ datapoint.multi;
505
+ });
506
+ }
507
+ processOther(configObj) {
508
+ configObj.otherData.forEach((dataPoint) => {
509
+ dataPoint.processData.forEach((process) => {
510
+ this.runProcess(process, configObj.rawData, configObj.otherData);
511
+ dataPoint.value = process.value;
512
+ });
513
+ });
514
+ }
515
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatasetProcessingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
516
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatasetProcessingService, providedIn: 'root' }); }
517
+ }
518
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatasetProcessingService, decorators: [{
519
+ type: Injectable,
520
+ args: [{
521
+ providedIn: 'root',
522
+ }]
523
+ }] });
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC1wcm9jZXNzaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXZpY2UtY29uZmlnLWludGVyYWN0aW9uL3NyYy9saWIvZGF0YXNldC1wcm9jZXNzaW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFjM0MsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxrQkFBa0I7SUFDbEI7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsR0FBZSxFQUFFLE1BQWdCO1FBQ2xELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNkLFFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDbEIsS0FBSyxDQUFDO29CQUNKLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDckMsTUFBTTtnQkFDUixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2xELE1BQU07Z0JBQ1IsS0FBSyxFQUFFO29CQUNMLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNsRCxNQUFNO2FBQ1Q7U0FDRjthQUFNO1lBQ0wsUUFBUSxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUNsQixLQUFLLENBQUM7b0JBQ0osS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN0QyxNQUFNO2dCQUNSLEtBQUssRUFBRTtvQkFDTCxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxH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Q0wsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFpQixDQUFDLENBQUM7U0FDcEQ7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRCxvREFBb0Q7UUFDcEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUN0QyxTQUFTLENBQUMsS0FBSztnQkFDYixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7b0JBQ3hELFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQTZCO1FBQ3hDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDeEMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pFLFNBQVMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F6a0JVLHdCQUF3QjttSEFBeEIsd0JBQXdCLGNBRnZCLE1BQU07OzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBJQnVmZmVyT2JqLFxuICBJUHJvY2Vzc0RhdGFPYmosXG4gIElQcm9jZXNzRGF0YVN0ZXAsXG4gIElSYXdEYXRhT2JqLFxuICBJT3RoZXJEYXRhT2JqLFxuICBJQ29uZmlnLFxuICBJRGlzcGxheSxcbn0gZnJvbSAnLi4vbGliL2ludGVyZmFjZXMvZGV2aWNlcy1saXN0JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFzZXRQcm9jZXNzaW5nU2VydmljZSB7XG4gIC8vY29uc3RydWN0b3IoKSB7fVxuICAvKlxuICAgKiBGb3IgdXNlIHdpdGggRGF0YVZpZXdcbiAgICpcbiAgICovXG4gIGdldFZhbHVlZnJvbUJ1ZmZlcihvYmo6IElCdWZmZXJPYmosIGJ1ZmZlcjogRGF0YVZpZXcpIHtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGlmIChvYmouc2lnbmVkKSB7XG4gICAgICBzd2l0Y2ggKG9iai5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHZhbHVlID0gYnVmZmVyLmdldEludDgob2JqLnBvc2l0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlci5nZXRJbnQxNihvYmoucG9zaXRpb24sIG9iai5saXR0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgIHZhbHVlID0gYnVmZmVyLmdldEludDMyKG9iai5wb3NpdGlvbiwgb2JqLmxpdHRsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAob2JqLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgdmFsdWUgPSBidWZmZXIuZ2V0VWludDgob2JqLnBvc2l0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlci5nZXRVaW50MTYob2JqLnBvc2l0aW9uLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlci5nZXRVaW50MzIob2JqLnBvc2l0aW9uLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcbiAgICogRm9yIHVzZSB3aXRoIERhdGFWaWV3XG4gICAqXG4gICAqXG4gICAqL1xuICB3cml0ZVZhbHVlVG9CdWZmZXIob2JqOiBJQnVmZmVyT2JqLCB2YWx1ZTogbnVtYmVyLCBidWZmZXI6IERhdGFWaWV3KSB7XG4gICAgaWYgKG9iai5zaWduZWQpIHtcbiAgICAgIHN3aXRjaCAob2JqLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgYnVmZmVyLnNldEludDgob2JqLnBvc2l0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgYnVmZmVyLnNldEludDE2KG9iai5wb3NpdGlvbiwgdmFsdWUsIG9iai5saXR0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgIGJ1ZmZlci5zZXRJbnQzMihvYmoucG9zaXRpb24sIHZhbHVlLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChvYmoubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBidWZmZXIuc2V0VWludDgob2JqLnBvc2l0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgYnVmZmVyLnNldFVpbnQxNihvYmoucG9zaXRpb24sIHZhbHVlLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICBidWZmZXIuc2V0VWludDMyKG9iai5wb3NpdGlvbiwgdmFsdWUsIG9iai5saXR0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJ1blByb2Nlc3MoXG4gICAgcHJvY2VzczogSVByb2Nlc3NEYXRhT2JqLFxuICAgIHJhd0RhdGE6IElSYXdEYXRhT2JqW10sXG4gICAgb3RoZXJEYXRhOiBJT3RoZXJEYXRhT2JqW11cbiAgKSB7XG4gICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5nZXRDaHVua1ZhbHVlcyhcbiAgICAgIHByb2Nlc3MuZGF0YSxcbiAgICAgIHJhd0RhdGEsXG4gICAgICBvdGhlckRhdGFcbiAgICApO1xuICAgIC8vY29uc29sZS5sb2coJ3Byb2Nlc3MgdmFsdWVzICcsIHZhbHVlcyk7XG4gICAgbGV0IHBWYWw6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gPSAwO1xuICAgIHN3aXRjaCAocHJvY2Vzcy50eXBlKSB7XG4gICAgICBjYXNlICdhc3MnOlxuICAgICAgICBwVmFsID0gdGhpcy5hc3NlbWJsZVByb2Nlc3ModmFsdWVzKTtcbiAgICAgICAgcHJvY2Vzcy52YWx1ZSA9IHBWYWw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ2NvbSc6XG4gICAgICAgIHBWYWwgPSB0aGlzLmNvbXBhcmVQcm9jZXNzKFxuICAgICAgICAgIHZhbHVlcyBhcyBbbnVtYmVyLCAnPCcgfCAnPD0nIHwgJz09JyB8ICc+PScgfCAnPicsIG51bWJlcl0sXG4gICAgICAgICAgcHJvY2Vzc1xuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLnZhbHVlID0gcFZhbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnY2FsJzpcbiAgICAgICAgcFZhbCA9IHRoaXMuY2FsY3VsYXRlUHJvY2VzcyhcbiAgICAgICAgICB2YWx1ZXMgYXMgW251bWJlciwgJysnIHwgJy0nIHwgJy8nIHwgJyonLCBudW1iZXJdXG4gICAgICAgICk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICd0Zm0nOlxuICAgICAgICBwVmFsID0gdGhpcy50Zm1Qcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdjZHQnOlxuICAgICAgICBwVmFsID0gdGhpcy5jZHRQcm9jZXNzKHZhbHVlcyBhcyBzdHJpbmdbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdpdGQnOlxuICAgICAgICBwVmFsID0gdGhpcy5pdGRQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdpdHMnOlxuICAgICAgICBwVmFsID0gdGhpcy5pdHNQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdic3YnOlxuICAgICAgICBwVmFsID0gdGhpcy5ic3ZQcm9jZXNzKHZhbHVlcyk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICd2ZmEnOlxuICAgICAgICBwVmFsID0gdGhpcy52ZmFQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSwgcHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdjdHMnOlxuICAgICAgICBwVmFsID0gdGhpcy5jdHNQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgYXNzZW1ibGVQcm9jZXNzKHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICB2YWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgcmVzdWx0ICs9IHY7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGRpc2Fzc2VtYmxlUHJvY2VzcyhzdHJpbmc6IHN0cmluZywgdmFsdWVzOiBJUHJvY2Vzc0RhdGFTdGVwW10pIHtcbiAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgdmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsICdzdHJMZW5ndGgnKSkge1xuICAgICAgICBsZW5ndGggPSB2YWwuc3RyTGVuZ3RoIGFzIG51bWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHZhbC52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAodmFsLmZyb21EYXRhID09ICdyYXcnKSB7XG4gICAgICAgIHJlc3VsdFt2YWwudmFsdWVdID0gTnVtYmVyKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIGxlbmd0aCkpO1xuICAgICAgfVxuICAgICAgaSA9IGkgKyBsZW5ndGg7XG4gICAgfSk7XG4gICAgLy9jb25zb2xlLmxvZygnRGlzYXNzZW1ibGUgUmVzdWx0ICcsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjb21wYXJlUHJvY2VzcyhcbiAgICB2YWx1ZXM6IFtudW1iZXIsICc8JyB8ICc8PScgfCAnPT0nIHwgJz49JyB8ICc+JywgbnVtYmVyXSxcbiAgICBwcm9jZXNzOiBJUHJvY2Vzc0RhdGFPYmpcbiAgKSB7XG4gICAgY29uc3QgcmVzdWx0OiBib29sZWFuID0gdGhpcy5jb21wYXJlVmFsdWVzKHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2YWx1ZXNbMl0pO1xuICAgIGxldCB0ZXh0ID0gJ04vQSc7XG4gICAgaWYgKCdjb21UeHQnIGluIHByb2Nlc3MpIHtcbiAgICAgIGlmIChwcm9jZXNzLmNvbVR4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0ZXh0ID0gcHJvY2Vzcy5jb21UeHRbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3MuY29tVHh0WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29tcGFyZVZhbHVlcyh2MTogbnVtYmVyLCBvcDogJzwnIHwgJzw9JyB8ICc9PScgfCAnPj0nIHwgJz4nLCB2MjogbnVtYmVyKSB7XG4gICAgc3dpdGNoIChvcCkge1xuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIHJldHVybiB2MSA8IHYyO1xuICAgICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gdjEgPD0gdjI7XG4gICAgICBjYXNlICc9PSc6XG4gICAgICAgIHJldHVybiB2MSA9PSB2MjtcbiAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgcmV0dXJuIHYxID49IHYyO1xuICAgICAgY2FzZSAnPic6XG4gICAgICAgIHJldHVybiB2MSA+IHYyO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZVByb2Nlc3ModmFsdWVzOiBbbnVtYmVyLCAnKycgfCAnLScgfCAnLycgfCAnKicsIG51bWJlcl0pIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVWYWx1ZXModmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSk7XG4gIH1cblxuICBjYWxjdWxhdGVWYWx1ZXModjE6IG51bWJlciwgb3A6ICcrJyB8ICctJyB8ICcvJyB8ICcqJywgdjI6IG51bWJlcikge1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJysnOlxuICAgICAgICByZXR1cm4gdjEgKyB2MjtcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgICByZXR1cm4gdjEgLSB2MjtcbiAgICAgIGNhc2UgJy8nOlxuICAgICAgICByZXR1cm4gdjEgLyB2MjtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gdjEgKiB2MjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIHRmbVByb2Nlc3ModmFsdWVzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh2YWx1ZXNbMF0gKiA2MCkgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zOiBudW1iZXIgPSBNYXRoLmZsb29yKCh2YWx1ZXNbMF0gKiA2MCAtIGhvdXJzICogMzYwMCkgLyA2MCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheVRpbWUoaG91cnMsIG1pbnMpO1xuICB9XG5cbiAgY2R0UHJvY2Vzcyh2YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaG91cnM6IG51bWJlciA9IHBhcnNlSW50KHZhbHVlc1swXS5zdWJzdHJpbmcoMTEsIDEzKSk7XG4gICAgY29uc3QgbWluczogbnVtYmVyID0gcGFyc2VJbnQodmFsdWVzWzBdLnN1YnN0cmluZygxNCwgMTYpKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5VGltZShob3VycywgbWlucyk7XG4gIH1cblxuICAvL05ldyBwcm9jZXNzIHRvIHBpY2sgdmFsdWUgZnJvbSBhcnJheSBiYXNlZCBvbiBpbnRlcmdlciB2YWx1ZVxuICB2ZmFQcm9jZXNzKHZhbHVlczogbnVtYmVyW10sIHByb2Nlc3M6IElQcm9jZXNzRGF0YU9iaikge1xuICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzWzBdO1xuICAgIGlmIChwcm9jZXNzLnZhbHVlc0xpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHZhbHVlIDwgcHJvY2Vzcy52YWx1ZXNMaXN0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy52YWx1ZXNMaXN0W3ZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnbmlwJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICduL2EnO1xuICAgIH1cbiAgfVxuXG4gIGl0ZFByb2Nlc3ModmFsdWVzOiBudW1iZXJbXSkge1xuICAgIGxldCBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigodmFsdWVzWzBdICogNjApIC8gMzYwMCk7XG4gICAgLy9jb25zb2xlLmxvZyhcImhvdXJzIFwiLCBob3Vycyk7XG4gICAgY29uc3QgbWluczogbnVtYmVyID0gTWF0aC5mbG9vcigodmFsdWVzWzBdICogNjAgLSBob3VycyAqIDM2MDApIC8gNjApO1xuICAgIC8vY29uc29sZS5sb2coXCJtaW5zIFwiLCBtaW5zKTtcbiAgICBsZXQgaDogbnVtYmVyIHwgc3RyaW5nO1xuICAgIGxldCBtOiBudW1iZXIgfCBzdHJpbmc7XG4gICAgaWYgKGhvdXJzID4gMjMpIHtcbiAgICAgIGhvdXJzID0gaG91cnMgLSAyNDtcbiAgICB9XG4gICAgaWYgKGhvdXJzIDwgMTApIHtcbiAgICAgIGggPSAnMCcgKyBob3VycztcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGhvdXJzO1xuICAgIH1cbiAgICBpZiAobWlucyA8IDEwKSB7XG4gICAgICBtID0gJzAnICsgbWlucztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IG1pbnM7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZzogc3RyaW5nID0gJzAwMDAtMDAtMDBUJyArIGggKyAnOicgKyBtO1xuICAgIC8vY29uc29sZS5sb2coXCIkJV4mJl4lJSQkJV4mJiZeJSUlJV5eXiYmJl5eJV4lJSVeXl4mIGR0IHN0cmluZyBcIiwgc3RyaW5nKTtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgZHRpUHJvY2VzcyhzdHJpbmc6IHN0cmluZywgdmFsdWVzOiBJUHJvY2Vzc0RhdGFTdGVwW10pIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiZHRpUHJvY2VzcyBpbnB1dHMgc3RyaW5nOiBcIiwgc3RyaW5nLCBcIiBWYWx1ZXM6IFwiLCB2YWx1ZXMpO1xuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmcgfCBudW1iZXJdOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBoOiBudW1iZXI7XG4gICAgbGV0IG06IG51bWJlcjtcbiAgICB2YWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAvLyBoID0gTnVtYmVyKHN0cmluZy5zdWJzdHIoMTEsIDIpKTtcbiAgICAgIC8vIG0gPSBOdW1iZXIoc3RyaW5nLnN1YnN0cigxNCwgMikpO1xuICAgICAgaCA9IE51bWJlcihzdHJpbmcuc3Vic3RyaW5nKDExLCAxMykpO1xuICAgICAgbSA9IE51bWJlcihzdHJpbmcuc3Vic3RyaW5nKDE0LCAxNikpO1xuICAgICAgcmVzdWx0W3ZhbC52YWx1ZV0gPSBoICogNjAgKyBtO1xuICAgIH0pO1xuICAgIC8vY29uc29sZS5sb2coXCJkYXRlIHRvIGludGVnZXIgUmVzdWx0IFwiLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaXRzUHJvY2Vzcyh2YWx1ZXM6IG51bWJlcltdKSB7XG4gICAgLy9jb25zb2xlLmxvZygnaXRzUHJvY2VzcyB2YWx1ZXMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpKTtcbiAgICBjb25zdCBzdHI6IHN0cmluZyA9IHZhbHVlc1swXS50b1N0cmluZygpO1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBzdGlQcm9jZXNzKHN0cmluZzogc3RyaW5nLCB2YWx1ZXM6IElQcm9jZXNzRGF0YVN0ZXBbXSkge1xuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmcgfCBudW1iZXJdOiBudW1iZXIgfSA9IHt9O1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgIHJlc3VsdFt2YWwudmFsdWVdID0gTnVtYmVyKHN0cmluZyk7XG4gICAgfSk7XG4gICAgLy9jb25zb2xlLmxvZyhcInN0cmluZyB0byBpbnRlZ2VyIFJlc3VsdCBcIiwgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGJzdlByb2Nlc3ModmFsdWVzOiAobnVtYmVyIHwgc3RyaW5nKVtdKSB7XG4gICAgY29uc3Qgc3RhcnRWYWx1ZTogc3RyaW5nID0gdmFsdWVzWzBdIGFzIHN0cmluZztcbiAgICBjb25zdCBwb3MxOiBudW1iZXIgPSB2YWx1ZXNbMV0gYXMgbnVtYmVyO1xuICAgIGNvbnN0IHBvczI6IG51bWJlciA9IHBvczEgKyAxO1xuICAgIGNvbnN0IGJpbmFyeVN0cjogc3RyaW5nID0gcGFyc2VJbnQoc3RhcnRWYWx1ZSwgMTApXG4gICAgICAudG9TdHJpbmcoMilcbiAgICAgIC5wYWRTdGFydCg0LCAnMCcpO1xuICAgIHJldHVybiBiaW5hcnlTdHIuc3Vic3RyaW5nKHBvczEsIHBvczIpO1xuICB9XG5cbiAgYnN2UmV2ZXJ0KFxuICAgIHN0cmluZzogc3RyaW5nLFxuICAgIHZhbHVlczogSVByb2Nlc3NEYXRhU3RlcFtdLFxuICAgIGJzc09iajogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfVxuICApIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGJzc09iaiwgdmFsdWVzWzBdLnZhbHVlKSkge1xuICAgICAgYnNzT2JqW3ZhbHVlc1swXS52YWx1ZV0gPSB0aGlzLnJlcGxhY2VDaGFyQXQoXG4gICAgICAgIGJzc09ialt2YWx1ZXNbMF0udmFsdWVdIGFzIHN0cmluZyxcbiAgICAgICAgdmFsdWVzWzFdLnZhbHVlIGFzIG51bWJlcixcbiAgICAgICAgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBic3NPYmpbdmFsdWVzWzBdLnZhbHVlXSA9ICcwMDAwJztcbiAgICAgIGJzc09ialt2YWx1ZXNbMF0udmFsdWVdID0gdGhpcy5yZXBsYWNlQ2hhckF0KFxuICAgICAgICBic3NPYmpbdmFsdWVzWzBdLnZhbHVlXSBhcyBzdHJpbmcsXG4gICAgICAgIHZhbHVlc1sxXS52YWx1ZSBhcyBudW1iZXIsXG4gICAgICAgIHN0cmluZ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJzc09iajtcbiAgfVxuXG4gIHN0Y1Byb2Nlc3ModmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IGluaXRBcnJheSA9IHZhbHVlLnNwbGl0KCcnKTtcbiAgICBjb25zdCByZXN1bHRBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICBpbml0QXJyYXkuZm9yRWFjaCgodikgPT4ge1xuICAgICAgcmVzdWx0QXJyYXkucHVzaCh2LmNoYXJDb2RlQXQoMCkpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRBcnJheTtcbiAgfVxuXG4gIGN0c1Byb2Nlc3ModmFsdWVzOiBudW1iZXJbXSkge1xuICAgIC8vIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XG4gICAgY29uc3QgYXJ5OiBudW1iZXJbXSA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICBpZiAodiA+PSAwKSB7XG4gICAgICAgIGFyeS5wdXNoKHYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJ5LnB1c2goMCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy9jb25zb2xlLmxvZyhcIkNUUyBQUk9DRVNTIElOUFVUIFZBTFVFUyBcIiwgdmFsdWVzKTtcbiAgICBsZXQgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hcnkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL1tcXHUwMDAwXS9nLCAnJyk7XG4gICAgLy9zdHIgPSBzdHIucmVwbGFjZSgvW15cXHgyMC1cXHg3RV0vZywgXCJcIik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGN0c1JldmVydChcbiAgICBvdGhlck9iajogSU90aGVyRGF0YU9iaixcbiAgICByZXN1bHRzOiB7IFtrZXk6IHN0cmluZyB8IG51bWJlcl06IHN0cmluZyB8IG51bWJlciB9XG4gICkge1xuICAgIGNvbnN0IHZhbEFyeSA9IHRoaXMuc3RjUHJvY2Vzcyg8c3RyaW5nPm90aGVyT2JqLnZhbHVlKTtcbiAgICAvL2NvbnNvbGUubG9nKFwiVkFMIEFSUkFZXCIsIHZhbEFyeSk7XG4gICAgLy9jb25zb2xlLmxvZyhcIlBST0NFU1MgREFUQVwiLCBKU09OLnN0cmluZ2lmeShvdGhlck9iai5wcm9jZXNzRGF0YSkpO1xuICAgIGxldCBwcm9ncmVzcyA9IDA7XG4gICAgb3RoZXJPYmoucHJvY2Vzc0RhdGFbMF0uZGF0YS5mb3JFYWNoKChwcm9jZXNzKSA9PiB7XG4gICAgICBjb25zdCByZXM6IHsgW2tleTogc3RyaW5nIHwgbnVtYmVyXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fTtcblxuICAgICAgaWYgKHZhbEFyeS5sZW5ndGggPj0gcHJvZ3Jlc3MpIHtcbiAgICAgICAgcmVzW3Byb2Nlc3MudmFsdWVdID0gdmFsQXJ5W3Byb2dyZXNzXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1twcm9jZXNzLnZhbHVlXSA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHRzID0gT2JqZWN0LmFzc2lnbihyZXN1bHRzLCByZXMpO1xuICAgICAgKytwcm9ncmVzcztcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGJpbmFyeVN0clRvRGVjaW1hbChzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBwYXJzZUludChzdHIsIDIpO1xuICB9XG5cbiAgcmVwbGFjZUNoYXJBdChzdHJpbmc6IHN0cmluZywgaW5kZXg6IG51bWJlciwgY2hhcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgY2hhciArIHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyBjaGFyLmxlbmd0aClcbiAgICApO1xuICAgIC8vcmV0dXJuIHN0cmluZy5zdWJzdHIoMCwgaW5kZXgpICsgY2hhciArIHN0cmluZy5zdWJzdHIoaW5kZXggKyBjaGFyLmxlbmd0aCk7XG4gIH1cblxuICB3cml0ZUZvcm1WYWx1ZXNUb1Jhd09iaihcbiAgICBmb3JtVmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9LFxuICAgIHJhd09iajogSVJhd0RhdGFPYmpbXVxuICApIHtcbiAgICAvLyByYXdPYmouZm9yRWFjaCgocmF3KSA9PiB7XG4gICAgLy8gICBpZiAoZm9ybVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShyYXcubmFtZSkpIHtcbiAgICAvLyAgICAgcmF3LnZhbHVlID0gTWF0aC5yb3VuZChmb3JtVmFsdWVzW3Jhdy5uYW1lXSAvIHJhdy5tdWx0aSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdPYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9ybVZhbHVlcywgcmF3T2JqW2ldLm5hbWUpKSB7XG4gICAgICAgIHJhd09ialtpXS52YWx1ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgKGZvcm1WYWx1ZXNbcmF3T2JqW2ldLm5hbWVdIGFzIG51bWJlcikgLyByYXdPYmpbaV0ubXVsdGlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJhd09iajtcbiAgfVxuXG4gIGdldFB3ZChyYXdWYWx1ZXM6IElSYXdEYXRhT2JqW10pIHtcbiAgICBjb25zdCBwd2RBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgaTogbnVtYmVyO1xuICAgIGxldCBuYW1lOiBzdHJpbmc7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgaWYgKGkgPCAxMCkge1xuICAgICAgICBuYW1lID0gJ3Bhc3NfMCcgKyBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9ICdwYXNzXycgKyBpO1xuICAgICAgfVxuICAgICAgcmF3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgaWYgKHYubmFtZSA9PSBuYW1lKSB7XG4gICAgICAgICAgcHdkQXJyYXkucHVzaCh2LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHB3ZEFycmF5O1xuICB9XG5cbiAgc3RyVG9Qd2Qoc3RyaW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwd2RBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgaTogbnVtYmVyO1xuXG4gICAgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSAnJztcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgaWYgKGkgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIHB3ZEFycmF5LnB1c2goc3RyaW5nLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHdkQXJyYXkucHVzaCgwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHdkQXJyYXk7XG4gIH1cblxuICBjaGtQd2QoYXJyMTogbnVtYmVyW10sIGFycjI6IG51bWJlcltdKSB7XG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoYXJyMSkgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KGFycjIpIHx8XG4gICAgICBhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGhcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycjEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB3cml0ZVB3ZFRvQ29uZmlnKHBhc3NBcnJheTogbnVtYmVyW10sIHJhd09iajogSVJhd0RhdGFPYmpbXSkge1xuICAgIGxldCBpOiBudW1iZXI7XG4gICAgbGV0IG5hbWU6IHN0cmluZztcblxuICAgIC8vY29uc29sZS5sb2coXCJCZWZvcmUgd3JpdGUgcGFzc3dvcmQgXCIsIEpTT04uc3RyaW5naWZ5KHJhd09iaikpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGlmIChpIDwgMTApIHtcbiAgICAgICAgbmFtZSA9ICdwYXNzXzAnICsgaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSAncGFzc18nICsgaTtcbiAgICAgIH1cbiAgICAgIHJhd09iai5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgIGlmICh2Lm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgIHYudmFsdWUgPSBwYXNzQXJyYXlbaV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vY29uc29sZS5sb2coXCJBZnRlciB3cml0ZSBwYXNzd29yZCBcIiwgSlNPTi5zdHJpbmdpZnkocmF3T2JqKSk7XG5cbiAgICByZXR1cm4gcmF3T2JqO1xuICB9XG5cbiAgZGlzcGxheVRpbWUoaG91cnM6IG51bWJlciwgbWluczogbnVtYmVyKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcImhvdXJzID0gXCIsIGhvdXJzLCBcIiBtaW5zID0gXCIsIG1pbnMpO1xuICAgIGxldCBtOiBudW1iZXIgfCBzdHJpbmcgPSBtaW5zO1xuICAgIGxldCBwID0gJ2FtJztcbiAgICBpZiAobWlucyA8IDEwKSB7XG4gICAgICBtID0gJzAnICsgbWlucztcbiAgICB9XG4gICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgIHAgPSAncG0nO1xuICAgIH1cbiAgICBpZiAoaG91cnMgPT0gMCkge1xuICAgICAgaG91cnMgPSAxMjtcbiAgICB9XG4gICAgaWYgKGhvdXJzID4gMTIpIHtcbiAgICAgIGhvdXJzIC09IDEyO1xuICAgIH1cbiAgICByZXR1cm4gaG91cnMgKyAnOicgKyBtICsgJyAnICsgcDtcbiAgfVxuXG4gIGdldENodW5rVmFsdWVzKFxuICAgIHByb2Nlc3NEYXRhOiBJUHJvY2Vzc0RhdGFTdGVwW10sXG4gICAgcmF3RGF0YTogSVJhd0RhdGFPYmpbXSxcbiAgICBvdGhlckRhdGE6IElPdGhlckRhdGFPYmpbXVxuICApIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgICdHRVQgQ0hVTksgVkFMVUVTICcsXG4gICAgLy8gICBKU09OLnN0cmluZ2lmeShyYXdEYXRhKSxcbiAgICAvLyAgICcgJyxcbiAgICAvLyAgIEpTT04uc3RyaW5naWZ5KG90aGVyRGF0YSlcbiAgICAvLyApO1xuICAgIGxldCB2OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgcHJvY2Vzc0RhdGEuZm9yRWFjaCgoY2h1bmspID0+IHtcbiAgICAgIC8vY29uc29sZS5sb2coJ1Byb2Nlc3MgUmF3IGNodW5rICcsIEpTT04uc3RyaW5naWZ5KGNodW5rKSk7XG4gICAgICBzd2l0Y2ggKGNodW5rLmZyb21EYXRhKSB7XG4gICAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICAgICAgcmF3RGF0YS5mb3JFYWNoKChyZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJkLm5hbWUgPT0gY2h1bmsudmFsdWUpIHtcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnUkFXIGNodW5rIG5hbWU6ICcsIHJkLm5hbWUpO1xuICAgICAgICAgICAgICB2ID0gcmQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ290aGVyJzpcbiAgICAgICAgICBvdGhlckRhdGEuZm9yRWFjaCgob2QpID0+IHtcbiAgICAgICAgICAgIGlmIChvZC5uYW1lID09IGNodW5rLnZhbHVlKSB7XG4gICAgICAgICAgICAgIHYgPSBvZC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm8nOlxuICAgICAgICAgIHYgPSBjaHVuay52YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjaHVuay5zdHJMZW5ndGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFkID0gdi50b1N0cmluZygpLnBhZFN0YXJ0KGNodW5rLnN0ckxlbmd0aCwgJzAnKTtcbiAgICAgICAgdmFsdWVzLnB1c2gocGFkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgdWludDhBcnJheVRvQXJyYXkodWludDg6IFVpbnQ4QXJyYXkpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odWludDgpO1xuICB9XG5cbiAgYXJyYXlUb1VpbnQ4QXJyYXkoYXJyYXk6IG51bWJlcltdKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShhcnJheSk7XG4gIH1cblxuICBpc1VpbnQ4QXJyYXkodjogbnVtYmVyW10gfCBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgaXNTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHJldHVybiBpc1N0ci5jYWxsKHYpID09PSAnW29iamVjdCBVaW50OEFycmF5XSc7XG4gIH1cblxuICBwcm9jZXNzUmF3KGlucHV0OiBudW1iZXJbXSB8IFVpbnQ4QXJyYXksIGNvbmZpZ09iajogSUNvbmZpZyB8IElEaXNwbGF5KSB7XG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheTtcbiAgICBpZiAodGhpcy5pc1VpbnQ4QXJyYXkoaW5wdXQpKSB7XG4gICAgICBidWZmZXIgPSBpbnB1dCBhcyBVaW50OEFycmF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgPSB0aGlzLmFycmF5VG9VaW50OEFycmF5KGlucHV0IGFzIG51bWJlcltdKTtcbiAgICB9XG4gICAgY29uc3QgcmF3RGF0YUJ1ZmZlciA9IG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyLCAwLCAyNTQpO1xuICAgIC8vY29uc29sZS5sb2coJ1BST0NFU1MgUkFXIENPTkZJRyAnLCByYXdEYXRhQnVmZmVyKTtcbiAgICBjb25maWdPYmoucmF3RGF0YS5mb3JFYWNoKChkYXRhcG9pbnQpID0+IHtcbiAgICAgIGRhdGFwb2ludC52YWx1ZSA9XG4gICAgICAgIHRoaXMuZ2V0VmFsdWVmcm9tQnVmZmVyKGRhdGFwb2ludC5idWZmZXIsIHJhd0RhdGFCdWZmZXIpICpcbiAgICAgICAgZGF0YXBvaW50Lm11bHRpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvY2Vzc090aGVyKGNvbmZpZ09iajogSUNvbmZpZyB8IElEaXNwbGF5KSB7XG4gICAgY29uZmlnT2JqLm90aGVyRGF0YS5mb3JFYWNoKChkYXRhUG9pbnQpID0+IHtcbiAgICAgIGRhdGFQb2ludC5wcm9jZXNzRGF0YS5mb3JFYWNoKChwcm9jZXNzKSA9PiB7XG4gICAgICAgIHRoaXMucnVuUHJvY2Vzcyhwcm9jZXNzLCBjb25maWdPYmoucmF3RGF0YSwgY29uZmlnT2JqLm90aGVyRGF0YSk7XG4gICAgICAgIGRhdGFQb2ludC52YWx1ZSA9IHByb2Nlc3MudmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19