@dbg-riskit/angular-testing 12.3.0 → 9999.9999.9999-rc.12148

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 (78) hide show
  1. package/dbg-riskit-angular-testing.d.ts +1 -0
  2. package/docs/README.md +1 -11
  3. package/{esm2015/dbg-riskit-angular-testing.js → esm2020/dbg-riskit-angular-testing.mjs} +0 -0
  4. package/{esm2015/lib/by.util.js → esm2020/lib/by.util.mjs} +0 -0
  5. package/esm2020/lib/cached.resource.provider.mjs +17 -0
  6. package/esm2020/lib/definitions/data.table.definition.mjs +556 -0
  7. package/esm2020/lib/definitions/download.menu.page.mjs +90 -0
  8. package/esm2020/lib/definitions/highlighter.directive.page.mjs +36 -0
  9. package/esm2020/lib/definitions/layout.component.page.mjs +93 -0
  10. package/{esm2015/lib/definitions/link.definition.js → esm2020/lib/definitions/link.definition.mjs} +0 -0
  11. package/{esm2015/lib/definitions/link.only.page.js → esm2020/lib/definitions/link.only.page.mjs} +0 -0
  12. package/{esm2015/lib/definitions/login.menu.page.js → esm2020/lib/definitions/login.menu.page.mjs} +0 -0
  13. package/{esm2015/lib/definitions/login.page.js → esm2020/lib/definitions/login.page.mjs} +4 -4
  14. package/{esm2015/lib/definitions/message.def.js → esm2020/lib/definitions/message.def.mjs} +0 -0
  15. package/esm2020/lib/definitions/message.page.mjs +68 -0
  16. package/esm2020/lib/definitions/page.base.mjs +64 -0
  17. package/esm2020/lib/environment.mjs +23 -0
  18. package/esm2020/lib/events.mjs +60 -0
  19. package/esm2020/lib/stubs/auth/auth.routing.flow.service.stub.mjs +37 -0
  20. package/esm2020/lib/stubs/auth/auth.service.stub.mjs +40 -0
  21. package/esm2020/lib/stubs/auth/well.known.service.stub.mjs +22 -0
  22. package/esm2020/lib/stubs/http.service.stub.mjs +54 -0
  23. package/esm2020/lib/stubs/login.menu.stub.component.mjs +19 -0
  24. package/esm2020/lib/stubs/router/activated.route.stub.mjs +29 -0
  25. package/esm2020/lib/stubs/router/router.link.stub.mjs +46 -0
  26. package/{esm2015/lib/stubs/router/router.module.stub.js → esm2020/lib/stubs/router/router.module.stub.mjs} +4 -4
  27. package/esm2020/lib/stubs/router/router.outlet.stub.component.mjs +16 -0
  28. package/esm2020/lib/stubs/router/router.stub.mjs +79 -0
  29. package/esm2020/lib/testing.module.mjs +52 -0
  30. package/esm2020/lib/utils.mjs +48 -0
  31. package/{esm2015/public_api.js → esm2020/public_api.mjs} +4 -4
  32. package/fesm2015/{dbg-riskit-angular-testing.js → dbg-riskit-angular-testing.mjs} +263 -128
  33. package/fesm2015/dbg-riskit-angular-testing.mjs.map +1 -0
  34. package/fesm2020/dbg-riskit-angular-testing.mjs +1570 -0
  35. package/fesm2020/dbg-riskit-angular-testing.mjs.map +1 -0
  36. package/lib/definitions/data.table.definition.d.ts +3 -0
  37. package/lib/definitions/download.menu.page.d.ts +3 -0
  38. package/lib/definitions/highlighter.directive.page.d.ts +3 -0
  39. package/lib/definitions/layout.component.page.d.ts +5 -2
  40. package/lib/definitions/message.page.d.ts +3 -0
  41. package/lib/stubs/auth/auth.routing.flow.service.stub.d.ts +3 -0
  42. package/lib/stubs/auth/auth.service.stub.d.ts +3 -0
  43. package/lib/stubs/auth/well.known.service.stub.d.ts +3 -0
  44. package/lib/stubs/http.service.stub.d.ts +5 -0
  45. package/lib/stubs/login.menu.stub.component.d.ts +6 -0
  46. package/lib/stubs/router/activated.route.stub.d.ts +3 -0
  47. package/lib/stubs/router/router.link.stub.d.ts +5 -2
  48. package/lib/stubs/router/router.outlet.stub.component.d.ts +5 -0
  49. package/lib/stubs/router/router.stub.d.ts +3 -0
  50. package/lib/testing.module.d.ts +15 -0
  51. package/package.json +32 -20
  52. package/public_api.d.ts +3 -3
  53. package/bundles/dbg-riskit-angular-testing.umd.js +0 -2253
  54. package/bundles/dbg-riskit-angular-testing.umd.js.map +0 -1
  55. package/dbg-riskit-angular-testing.metadata.json +0 -1
  56. package/esm2015/lib/cached.resource.provider.js +0 -16
  57. package/esm2015/lib/definitions/data.table.definition.js +0 -508
  58. package/esm2015/lib/definitions/download.menu.page.js +0 -81
  59. package/esm2015/lib/definitions/highlighter.directive.page.js +0 -30
  60. package/esm2015/lib/definitions/layout.component.page.js +0 -73
  61. package/esm2015/lib/definitions/message.page.js +0 -54
  62. package/esm2015/lib/definitions/page.base.js +0 -64
  63. package/esm2015/lib/environment.js +0 -19
  64. package/esm2015/lib/events.js +0 -60
  65. package/esm2015/lib/stubs/auth/auth.routing.flow.service.stub.js +0 -31
  66. package/esm2015/lib/stubs/auth/auth.service.stub.js +0 -38
  67. package/esm2015/lib/stubs/auth/well.known.service.stub.js +0 -19
  68. package/esm2015/lib/stubs/http.service.stub.js +0 -49
  69. package/esm2015/lib/stubs/login.menu.component.stub.js +0 -16
  70. package/esm2015/lib/stubs/router/activated.route.stub.js +0 -26
  71. package/esm2015/lib/stubs/router/router.link.stub.js +0 -45
  72. package/esm2015/lib/stubs/router/router.outlet.stub.js +0 -12
  73. package/esm2015/lib/stubs/router/router.stub.js +0 -72
  74. package/esm2015/lib/testing.module.js +0 -34
  75. package/esm2015/lib/utils.js +0 -48
  76. package/fesm2015/dbg-riskit-angular-testing.js.map +0 -1
  77. package/lib/stubs/login.menu.component.stub.d.ts +0 -3
  78. package/lib/stubs/router/router.outlet.stub.d.ts +0 -2
@@ -1,508 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import { MatAnchor, MatButton } from '@angular/material/button';
3
- import { MatButtonToggle } from '@angular/material/button-toggle';
4
- import { MatIcon } from '@angular/material/icon';
5
- import { MatTooltip } from '@angular/material/tooltip';
6
- import { By } from '@angular/platform-browser';
7
- import { secureRandom } from '@dbg-riskit/common';
8
- import { DataTableComponent, DataTableRowDetailExpander, HIGHLIGHTER_CLASS, PagingComponent } from '@dbg-riskit/angular-datatable';
9
- import { click } from '../events';
10
- import { Page } from './page.base';
11
- export class DataTableDefinition {
12
- constructor(debugElement, page) {
13
- this.debugElement = debugElement;
14
- this.page = page;
15
- }
16
- get component() {
17
- return this.debugElement.componentInstance;
18
- }
19
- get data() {
20
- return this.component.plainData;
21
- }
22
- get element() {
23
- return this.debugElement.query(By.css('.risk-data-table-wrapper > table'));
24
- }
25
- get header() {
26
- return new TableHeader(this.debugElement.query((de) => de.references.mainHeader), this.page);
27
- }
28
- get sorting() {
29
- return new TableSorting(this, this.page);
30
- }
31
- get body() {
32
- return new TableBody(this.debugElement.query((de) => de.references.mainBody), this.page);
33
- }
34
- get footer() {
35
- return new TableFooter(this.debugElement.query((de) => de.references.mainFooter));
36
- }
37
- get recordsCount() {
38
- return new RecordsCount(this.debugElement.query(By.css('.risk-data-table-page-count')));
39
- }
40
- get pager() {
41
- return new Pager(this.debugElement.query(By.directive(PagingComponent)), this.page);
42
- }
43
- }
44
- // <editor-fold defaultstate="collapsed" desc="Table header">
45
- export class TableHeader {
46
- constructor(element, page) {
47
- this.element = element;
48
- this.page = page;
49
- }
50
- get rows() {
51
- return this.element.queryAll(By.css('tr')).map((element) => {
52
- return new TableHeaderRow(element, this.page);
53
- });
54
- }
55
- get cells() {
56
- return this.element.queryAll(By.css('th')).map((element) => {
57
- return new TableHeaderCell(element, this.page);
58
- });
59
- }
60
- }
61
- export class TableHeaderRow {
62
- constructor(element, page) {
63
- this.element = element;
64
- this.page = page;
65
- }
66
- get cells() {
67
- return this.element.queryAll(By.css('th')).map((element) => {
68
- return new TableHeaderCell(element, this.page);
69
- });
70
- }
71
- }
72
- export class TableHeaderCell {
73
- constructor(element, page) {
74
- this.element = element;
75
- this.page = page;
76
- }
77
- get sortingHandle() {
78
- const handle = this.element.query(By.directive(MatButton));
79
- if (handle) {
80
- return new SortingHandle(this.page, handle);
81
- }
82
- return null;
83
- }
84
- get tooltip() {
85
- const handle = this.element.query(By.directive(MatTooltip));
86
- if (handle) {
87
- return handle.injector.get(MatTooltip).message;
88
- }
89
- return null;
90
- }
91
- get title() {
92
- const textNode = this.element.childNodes.find((node) => node.nativeNode.nodeType === Node.TEXT_NODE);
93
- if (textNode != null) {
94
- return textNode
95
- .nativeNode.textContent.trim();
96
- }
97
- return '';
98
- }
99
- get colspan() {
100
- return this.element.nativeElement.colspan;
101
- }
102
- get rowspan() {
103
- return this.element.nativeElement.rowspan;
104
- }
105
- }
106
- // <editor-fold defaultstate="collapsed" desc="Sorting">
107
- export class TableSorting {
108
- constructor(table, page) {
109
- this.table = table;
110
- this.page = page;
111
- }
112
- get handles() {
113
- const handles = this.table.debugElement.query((de) => de.references.mainHeader)
114
- .queryAll(By.directive(MatButton));
115
- if (!handles) {
116
- return [];
117
- }
118
- return handles.map((handle) => {
119
- return new SortingHandle(this.page, handle);
120
- });
121
- }
122
- get detailRowHandles() {
123
- const handles = this.table.debugElement.query(By.css('.risk-data-table-detail')).query(By.css('thead'))
124
- .queryAll(By.directive(MatButton));
125
- if (!handles) {
126
- return null;
127
- }
128
- return handles.map((handle) => {
129
- return new SortingHandle(this.page, handle);
130
- });
131
- }
132
- get currentOrdering() {
133
- return this.table.component.ordering;
134
- }
135
- checkSorting(firstNRows = this.table.component.rows.length, criterium) {
136
- // WARN: call data once as it calls .map on all table rows
137
- const data = this.table.data;
138
- let ordering;
139
- if (criterium) {
140
- ordering = [criterium].concat(this.table.component._defaultOrdering);
141
- }
142
- else {
143
- ordering = this.currentOrdering;
144
- }
145
- for (let i = 1; i < Math.min(data.length, firstNRows); i++) {
146
- ordering.some((criteria) => {
147
- //noinspection EqualityComparisonWithCoercionJS
148
- const valueA = criteria.get(data[i - 1]);
149
- const valueB = criteria.get(data[i]);
150
- if (valueA == null && valueB == null) {
151
- return false;
152
- }
153
- expect(valueA).not.toBeNull();
154
- expect(valueA).not.toBeUndefined();
155
- if (valueB != null) {
156
- if (criteria.descending) {
157
- expect(valueA >= valueB)
158
- .toBeTruthy('Expect: ' + valueA + ' >= '
159
- + valueB);
160
- }
161
- else {
162
- expect(valueA <= valueB)
163
- .toBeTruthy('Expect: ' + valueA + ' <= '
164
- + valueB);
165
- }
166
- }
167
- return valueA !== valueB;
168
- });
169
- }
170
- }
171
- }
172
- export class SortingHandle {
173
- constructor(page, handle) {
174
- this.page = page;
175
- this.handle = handle;
176
- }
177
- click() {
178
- click(this.handle);
179
- this.page.detectChanges();
180
- }
181
- }
182
- // </editor-fold>
183
- // </editor-fold>
184
- // <editor-fold defaultstate="collapsed" desc="Table body">
185
- export class TableBody {
186
- constructor(element, page) {
187
- this.element = element;
188
- this.page = page;
189
- }
190
- get rows() {
191
- return this.element.queryAll((de) => de.references.masterRow).map((element) => {
192
- return new TableBodyRow(element, this.page);
193
- });
194
- }
195
- get cells() {
196
- let cells = [];
197
- this.element.queryAll((de) => de.references.masterRow).forEach((row) => {
198
- cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
199
- return new TableBodyCell(cell);
200
- }));
201
- });
202
- return cells;
203
- }
204
- }
205
- export class TableBodyRow {
206
- constructor(element, page) {
207
- this.element = element;
208
- this.page = page;
209
- }
210
- expandRow() {
211
- click(this.element);
212
- this.page.detectChanges();
213
- }
214
- get expander() {
215
- return new RowExpander(this.element.query(By.directive(DataTableRowDetailExpander)).query(By.directive(MatAnchor)));
216
- }
217
- get cells() {
218
- return this.element.queryAll(By.css('td')).map((element) => {
219
- return new TableBodyCell(element);
220
- });
221
- }
222
- get rowDetail() {
223
- const parent = this.element.parent;
224
- if (parent != null) {
225
- const next = parent.children[parent.children.indexOf(this.element) + 1];
226
- if (next && !next.references.masterRow) {
227
- return new TableBodyDetail(next, this.page);
228
- }
229
- }
230
- return null;
231
- }
232
- get highlighted() {
233
- return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
234
- }
235
- }
236
- export class RowExpander {
237
- constructor(element) {
238
- this.element = element;
239
- }
240
- get icon() {
241
- return this.element.query(By.directive(MatIcon)).nativeElement.textContent.trim();
242
- }
243
- get opened() {
244
- return this.icon === 'expand_less';
245
- }
246
- get closed() {
247
- return this.icon === 'expand_more';
248
- }
249
- }
250
- export class TableBodyCell {
251
- constructor(element) {
252
- this.element = element;
253
- }
254
- get colspan() {
255
- return this.element.nativeElement.colspan;
256
- }
257
- get rowspan() {
258
- return this.element.nativeElement.rowspan;
259
- }
260
- }
261
- // <editor-fold defaultstate="collapsed" desc="Row detail">
262
- export class TableBodyDetail {
263
- constructor(element, page) {
264
- this.element = element;
265
- this.page = page;
266
- }
267
- header() {
268
- return new TableHeader(this.element.query(By.css('thead')), this.page);
269
- }
270
- get body() {
271
- return new TableBodyDetailBody(this.element.query(By.css('tbody')));
272
- }
273
- get highlighted() {
274
- return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
275
- }
276
- get colspan() {
277
- return this.element.children[0].nativeElement.colspan;
278
- }
279
- }
280
- export class TableBodyDetailBody {
281
- constructor(element) {
282
- this.element = element;
283
- }
284
- get rows() {
285
- return this.element.queryAll(By.css('tr')).map((element) => {
286
- return new TableBodyDetailRow(element);
287
- });
288
- }
289
- get cells() {
290
- let cells = [];
291
- this.element.queryAll(By.css('tr')).forEach((row) => {
292
- cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
293
- return new TableBodyCell(cell);
294
- }));
295
- });
296
- return cells;
297
- }
298
- }
299
- export class TableBodyDetailRow {
300
- constructor(element) {
301
- this.element = element;
302
- }
303
- get cells() {
304
- return this.element.queryAll(By.css('td')).map((element) => {
305
- return new TableBodyCell(element);
306
- });
307
- }
308
- }
309
- // </editor-fold>
310
- // </editor-fold>
311
- // <editor-fold defaultstate="collapsed" desc="Table footer">
312
- export class TableFooter {
313
- constructor(element) {
314
- this.element = element;
315
- }
316
- get rows() {
317
- return this.element.queryAll(By.css('tr')).map((element) => {
318
- return new TableFooterRow(element);
319
- });
320
- }
321
- get cells() {
322
- let cells = [];
323
- this.element.queryAll(By.css('tr')).forEach((row) => {
324
- cells = cells.concat(row.queryAll(By.css('th')).map((cell) => {
325
- return new TableBodyCell(cell);
326
- }));
327
- });
328
- return cells;
329
- }
330
- }
331
- export class TableFooterRow {
332
- constructor(element) {
333
- this.element = element;
334
- }
335
- get cells() {
336
- return this.element.queryAll(By.css('th')).map((element) => {
337
- return new TableBodyCell(element);
338
- });
339
- }
340
- }
341
- // </editor-fold>
342
- export class RecordsCount {
343
- constructor(element) {
344
- this.element = element;
345
- }
346
- get message() {
347
- return this.element.nativeElement.textContent;
348
- }
349
- }
350
- export class Pager {
351
- constructor(element, page) {
352
- this.element = element;
353
- this.page = page;
354
- }
355
- get pageButtons() {
356
- return this.element.queryAll(By.directive(MatButtonToggle));
357
- }
358
- expectLeadingButtonsDisabled() {
359
- for (let i = 0; i < 2; i++) {
360
- expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
361
- .toBe(true, 'First two are disabled.');
362
- }
363
- }
364
- expectLeadingButtonsNotDisabled() {
365
- for (let i = 0; i < 2; i++) {
366
- expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
367
- .not.toBe(true, 'First two are not disabled.');
368
- }
369
- }
370
- expectTrailingButtonsDisabled() {
371
- for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
372
- expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
373
- .toBe(true, 'Last two are disabled.');
374
- }
375
- }
376
- expectTrailingButtonsNotDisabled() {
377
- for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
378
- expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
379
- .not.toBe(true, 'Last two are not disabled.');
380
- }
381
- }
382
- expectButtonNumbers(numbers) {
383
- for (let i = 0; i < numbers.length; i++) {
384
- expect(this.pageButtons[i + 2].query(By.css('.mat-button-toggle-label-content'))
385
- .nativeElement.textContent.trim())
386
- .toEqual(numbers[i] + '', 'Button numbers are correct');
387
- }
388
- }
389
- expectButtonActive(index) {
390
- expect(this.pageButtons[index].classes['mat-button-toggle-checked'])
391
- .toBe(true, 'Button is active.');
392
- }
393
- click(index) {
394
- click(this.pageButtons[index].query(By.css('.mat-button-toggle-label-content')).nativeElement);
395
- this.page.detectChanges();
396
- this.page.advanceAndDetectChanges();
397
- }
398
- }
399
- export function chceckSorting(page, criteria) {
400
- page.dataTable.sorting.checkSorting(150);
401
- page.dataTable.sorting.handles.forEach((handle, index) => {
402
- // Tigger sort based on a handle
403
- handle.click();
404
- page.detectChanges();
405
- // Check the sorting
406
- page.dataTable.sorting.checkSorting(150, {
407
- get: criteria[index]
408
- });
409
- // Tigger sort based on a handle
410
- handle.click();
411
- page.detectChanges();
412
- // Check the sorting
413
- page.dataTable.sorting.checkSorting(150, {
414
- get: criteria[index],
415
- descending: true
416
- });
417
- });
418
- }
419
- export class DataTableDefinitionHosted extends Page {
420
- constructor(fixture) {
421
- super(fixture);
422
- }
423
- get dataTable() {
424
- return new DataTableDefinition(this.debugElement.query(By.directive(DataTableComponent)), this);
425
- }
426
- }
427
- export class TestDataTableHostComponent {
428
- constructor() {
429
- this.data = [];
430
- for (let i = 0; i < 500; i++) {
431
- this.data.push({
432
- value1: Math.floor(secureRandom() * 20) + ' - value 1',
433
- value2: Math.floor(secureRandom() * 20) + ' - value 2',
434
- value3: Math.floor(secureRandom() * 20) + ' - value 3'
435
- });
436
- }
437
- this.footer = this.data[0];
438
- }
439
- get defaultOrdering() {
440
- return [
441
- {
442
- get: (record) => {
443
- return record.value3;
444
- },
445
- descending: true
446
- },
447
- (record) => {
448
- return record.value2;
449
- }
450
- ];
451
- }
452
- get valueGetter() {
453
- return (record) => {
454
- return record.value1;
455
- };
456
- }
457
- }
458
- TestDataTableHostComponent.decorators = [
459
- { type: Component, args: [{
460
- template: `
461
- <risk-data-table [data]="data"
462
- [footer]="footer"
463
- [pageSize]="20"
464
- [defaultOrdering]="defaultOrdering"
465
- [striped]="true">
466
- <risk-data-table-column title="Test Column 1"
467
- [sortingKey]="valueGetter">
468
- <ng-template let-record="row" risk-data-table-cell>
469
- {{record.value1}}
470
- </ng-template>
471
- </risk-data-table-column>
472
- <risk-data-table-column>
473
- <ng-template risk-data-table-cell let-record="row" let-expanded="expanded">
474
- <risk-data-table-detail-expander [expanded]="expanded"></risk-data-table-detail-expander>
475
- </ng-template>
476
- <ng-template risk-data-table-footer-cell let-footer="footer">
477
- {{footer.value1}}
478
- </ng-template>
479
- </risk-data-table-column>
480
- <!-- Sub detail -->
481
- <risk-data-table-detail-row>
482
- <risk-data-table-column-group>
483
- <risk-data-table-column title="Test Detail Column 1"
484
- [sortingKey]="valueGetter">
485
- <ng-template risk-data-table-cell let-record="row">
486
- {{record.value1}}
487
- </ng-template>
488
- </risk-data-table-column>
489
- </risk-data-table-column-group>
490
- <risk-data-table-column-group>
491
- <risk-data-table-column title="Test Detail Column 2">
492
- <ng-template risk-data-table-cell let-record="row">
493
- {{record.value2}}
494
- </ng-template>
495
- </risk-data-table-column>
496
- <risk-data-table-column title="Test Detail Column 3">
497
- <ng-template risk-data-table-cell let-record="row">
498
- {{record.value3}}
499
- </ng-template>
500
- </risk-data-table-column>
501
- </risk-data-table-column-group>
502
- <risk-data-table-column-group></risk-data-table-column-group>
503
- </risk-data-table-detail-row>
504
- </risk-data-table>`
505
- },] }
506
- ];
507
- TestDataTableHostComponent.ctorParameters = () => [];
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS50YWJsZS5kZWZpbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGtnL2RiZy1yaXNraXQvYW5ndWxhci10ZXN0aW5nL3NyYy9saWIvZGVmaW5pdGlvbnMvZGF0YS50YWJsZS5kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzdDLE9BQU8sRUFBYyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLDBCQUEwQixFQUMxQixpQkFBaUIsRUFFakIsZUFBZSxFQUNsQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVqQyxNQUFNLE9BQU8sbUJBQW1CO0lBRTVCLFlBQTBCLFlBQTBCLEVBQ3pCLElBQXdFO1FBRHpFLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ3pCLFNBQUksR0FBSixJQUFJLENBQW9FO0lBQ25HLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMs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QUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsWUFBWTtnQkFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsWUFBWTtnQkFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsWUFBWTthQUN6RCxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3RCLE9BQU87WUFDSDtnQkFDSSxHQUFHLEVBQVMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtvQkFDeEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUN6QixDQUFDO2dCQUNELFVBQVUsRUFBRSxJQUFJO2FBQ25CO1lBQ0QsQ0FBQyxNQUFXLEVBQUUsRUFBRTtnQkFDWixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDekIsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNuQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekIsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7O1lBbkZKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJCQTRDYTthQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBEZWJ1Z0VsZW1lbnQsIERlYnVnTm9kZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbXBvbmVudEZpeHR1cmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQge01hdEFuY2hvciwgTWF0QnV0dG9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtNYXRCdXR0b25Ub2dnbGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHtNYXRJY29ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0VG9vbHRpcH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQge0J5fSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7VmFsdWVHZXR0ZXIsIHNlY3VyZVJhbmRvbX0gZnJvbSAnQGRiZy1yaXNraXQvY29tbW9uJztcbmltcG9ydCB7XG4gICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIERhdGFUYWJsZVJvd0RldGFpbEV4cGFuZGVyLFxuICAgIEhJR0hMSUdIVEVSX0NMQVNTLFxuICAgIE9yZGVyaW5nQ3JpdGVyaWEsXG4gICAgUGFnaW5nQ29tcG9uZW50XG59IGZyb20gJ0BkYmctcmlza2l0L2FuZ3VsYXItZGF0YXRhYmxlJztcbmltcG9ydCB7Y2xpY2t9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQge1BhZ2V9IGZyb20gJy4vcGFnZS5iYXNlJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZURlZmluaXRpb24ge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkZWJ1Z0VsZW1lbnQ6IERlYnVnRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQsIGFkdmFuY2VBbmREZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbXBvbmVudCgpOiBEYXRhVGFibGVDb21wb25lbnQ8dW5rbm93biwgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0VsZW1lbnQuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnBsYWluRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogRGVidWdFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmNzcygnLnJpc2stZGF0YS10YWJsZS13cmFwcGVyID4gdGFibGUnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXIoKTogVGFibGVIZWFkZXIge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlSGVhZGVyKHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYWluSGVhZGVyKSwgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmcoKTogVGFibGVTb3J0aW5nIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVNvcnRpbmcodGhpcywgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJvZHkoKTogVGFibGVCb2R5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHkodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1haW5Cb2R5KSwgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZvb3RlcigpOiBUYWJsZUZvb3RlciB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGb290ZXIodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1haW5Gb290ZXIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlY29yZHNDb3VudCgpOiBSZWNvcmRzQ291bnQge1xuICAgICAgICByZXR1cm4gbmV3IFJlY29yZHNDb3VudCh0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5jc3MoJy5yaXNrLWRhdGEtdGFibGUtcGFnZS1jb3VudCcpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdlcigpOiBQYWdlciB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnZXIodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKFBhZ2luZ0NvbXBvbmVudCkpLCB0aGlzLnBhZ2UpO1xuICAgIH1cbn1cblxuLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiIGRlc2M9XCJUYWJsZSBoZWFkZXJcIj5cblxuZXhwb3J0IGNsYXNzIFRhYmxlSGVhZGVyIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCk6IFRhYmxlSGVhZGVyUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndHInKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVIZWFkZXJSb3coZWxlbWVudCwgdGhpcy5wYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUhlYWRlckNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0aCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUhlYWRlckNlbGwoZWxlbWVudCwgdGhpcy5wYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUhlYWRlclJvdyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlSGVhZGVyQ2VsbFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RoJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlSGVhZGVyQ2VsbChlbGVtZW50LCB0aGlzLnBhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUhlYWRlckNlbGwge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmdIYW5kbGUoKTogU29ydGluZ0hhbmRsZSB8IG51bGwge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmVsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKE1hdEJ1dHRvbikpO1xuICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNvcnRpbmdIYW5kbGUodGhpcy5wYWdlLCBoYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG9vbHRpcCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShNYXRUb29sdGlwKSk7XG4gICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUuaW5qZWN0b3IuZ2V0KE1hdFRvb2x0aXApLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMuZWxlbWVudC5jaGlsZE5vZGVzLmZpbmQoKG5vZGU6IERlYnVnTm9kZSkgPT4gbm9kZS5uYXRpdmVOb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSk7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dE5vZGVcbiAgICAgICAgICAgICAgICAubmF0aXZlTm9kZS50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sc3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29sc3BhbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3NwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnJvd3NwYW47XG4gICAgfVxuXG59XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiU29ydGluZ1wiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVTb3J0aW5nIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhYmxlOiBEYXRhVGFibGVEZWZpbml0aW9uLCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYW5kbGVzKCk6IFNvcnRpbmdIYW5kbGVbXSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXMgPSB0aGlzLnRhYmxlLmRlYnVnRWxlbWVudC5xdWVyeSgoZGUpID0+IGRlLnJlZmVyZW5jZXMubWFpbkhlYWRlcilcbiAgICAgICAgICAgIC5xdWVyeUFsbChCeS5kaXJlY3RpdmUoTWF0QnV0dG9uKSk7XG4gICAgICAgIGlmICghaGFuZGxlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVzLm1hcCgoaGFuZGxlOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGluZ0hhbmRsZSh0aGlzLnBhZ2UsIGhhbmRsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGV0YWlsUm93SGFuZGxlcygpOiBTb3J0aW5nSGFuZGxlW10gfCBudWxsIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMudGFibGUuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmNzcygnLnJpc2stZGF0YS10YWJsZS1kZXRhaWwnKSkucXVlcnkoQnkuY3NzKCd0aGVhZCcpKVxuICAgICAgICAgICAgLnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShNYXRCdXR0b24pKTtcbiAgICAgICAgaWYgKCFoYW5kbGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlcy5tYXAoKGhhbmRsZTogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNvcnRpbmdIYW5kbGUodGhpcy5wYWdlLCBoYW5kbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRPcmRlcmluZygpOiBBcnJheTxPcmRlcmluZ0NyaXRlcmlhPGFueT4+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnRhYmxlLmNvbXBvbmVudCBhcyBhbnkpLm9yZGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGVja1NvcnRpbmcoZmlyc3ROUm93czogbnVtYmVyID0gdGhpcy50YWJsZS5jb21wb25lbnQucm93cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpdW0/OiBPcmRlcmluZ0NyaXRlcmlhPGFueT4pOiB2b2lkIHtcbiAgICAgICAgLy8gV0FSTjogY2FsbCBkYXRhIG9uY2UgYXMgaXQgY2FsbHMgLm1hcCBvbiBhbGwgdGFibGUgcm93c1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy50YWJsZS5kYXRhO1xuXG4gICAgICAgIGxldCBvcmRlcmluZzogQXJyYXk8T3JkZXJpbmdDcml0ZXJpYTxhbnk+PjtcbiAgICAgICAgaWYgKGNyaXRlcml1bSkge1xuICAgICAgICAgICAgb3JkZXJpbmcgPSBbY3JpdGVyaXVtXS5jb25jYXQoKHRoaXMudGFibGUuY29tcG9uZW50IGFzIGFueSkuX2RlZmF1bHRPcmRlcmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcmRlcmluZyA9IHRoaXMuY3VycmVudE9yZGVyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgTWF0aC5taW4oZGF0YS5sZW5ndGgsIGZpcnN0TlJvd3MpOyBpKyspIHtcbiAgICAgICAgICAgIG9yZGVyaW5nLnNvbWUoKGNyaXRlcmlhOiBPcmRlcmluZ0NyaXRlcmlhPGFueT4pID0+IHtcbiAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBFcXVhbGl0eUNvbXBhcmlzb25XaXRoQ29lcmNpb25KU1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlQTogYW55ID0gY3JpdGVyaWEuZ2V0KGRhdGFbaSAtIDFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUI6IGFueSA9IGNyaXRlcmlhLmdldChkYXRhW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVBID09IG51bGwgJiYgdmFsdWVCID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleHBlY3QodmFsdWVBKS5ub3QudG9CZU51bGwoKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodmFsdWVBKS5ub3QudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGVyaWEuZGVzY2VuZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHZhbHVlQSA+PSB2YWx1ZUIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQmVUcnV0aHkoJ0V4cGVjdDogJyArIHZhbHVlQSArICcgPj0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWVCKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWx1ZUEgPD0gdmFsdWVCKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0JlVHJ1dGh5KCdFeHBlY3Q6ICcgKyB2YWx1ZUEgKyAnIDw9ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlQik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlQSAhPT0gdmFsdWVCO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTb3J0aW5nSGFuZGxlIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9LCBwcml2YXRlIGhhbmRsZTogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrKCkge1xuICAgICAgICBjbGljayh0aGlzLmhhbmRsZSk7XG4gICAgICAgIHRoaXMucGFnZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxufVxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPVwiY29sbGFwc2VkXCIgZGVzYz1cIlRhYmxlIGJvZHlcIj5cblxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keSB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCwgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpOiBUYWJsZUJvZHlSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1hc3RlclJvdykubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Um93KGVsZW1lbnQsIHRoaXMucGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2VsbHMoKTogVGFibGVCb2R5Q2VsbFtdIHtcbiAgICAgICAgbGV0IGNlbGxzOiBUYWJsZUJvZHlDZWxsW10gPSBbXTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYXN0ZXJSb3cpLmZvckVhY2goKHJvdzogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjZWxscyA9IGNlbGxzLmNvbmNhdChyb3cucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGNlbGw6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChjZWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlSb3cge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwYW5kUm93KCk6IHZvaWQge1xuICAgICAgICBjbGljayh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLnBhZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhwYW5kZXIoKTogUm93RXhwYW5kZXIge1xuICAgICAgICByZXR1cm4gbmV3IFJvd0V4cGFuZGVyKFxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShEYXRhVGFibGVSb3dEZXRhaWxFeHBhbmRlcikpLnF1ZXJ5KEJ5LmRpcmVjdGl2ZShNYXRBbmNob3IpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndGQnKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dEZXRhaWwoKTogVGFibGVCb2R5RGV0YWlsIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHBhcmVudC5jaGlsZHJlbltwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzLmVsZW1lbnQpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCAmJiAhbmV4dC5yZWZlcmVuY2VzLm1hc3RlclJvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5RGV0YWlsKG5leHQsIHRoaXMucGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoaWdobGlnaHRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhISUdITElHSFRFUl9DTEFTUyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm93RXhwYW5kZXIge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpY29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKE1hdEljb24pKS5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9wZW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvbiA9PT0gJ2V4cGFuZF9sZXNzJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvbiA9PT0gJ2V4cGFuZF9tb3JlJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlDZWxsIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb2xzcGFuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93c3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucm93c3BhbjtcbiAgICB9XG59XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiUm93IGRldGFpbFwiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5RGV0YWlsIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGhlYWRlcigpOiBUYWJsZUhlYWRlciB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVIZWFkZXIodGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmNzcygndGhlYWQnKSksIHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBib2R5KCk6IFRhYmxlQm9keURldGFpbEJvZHkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keURldGFpbEJvZHkodGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmNzcygndGJvZHknKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGlnaGxpZ2h0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoSElHSExJR0hURVJfQ0xBU1MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sc3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdLm5hdGl2ZUVsZW1lbnQuY29sc3BhbjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlEZXRhaWxCb2R5IHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCk6IFRhYmxlQm9keURldGFpbFJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keURldGFpbFJvdyhlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICBsZXQgY2VsbHM6IFRhYmxlQm9keUNlbGxbXSA9IFtdO1xuICAgICAgICB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0cicpKS5mb3JFYWNoKChyb3c6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY2VsbHMgPSBjZWxscy5jb25jYXQocm93LnF1ZXJ5QWxsKEJ5LmNzcygndGQnKSkubWFwKChjZWxsOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keUNlbGwoY2VsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5RGV0YWlsUm93IHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndGQnKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPVwiY29sbGFwc2VkXCIgZGVzYz1cIlRhYmxlIGZvb3RlclwiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVGb290ZXIge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3MoKTogVGFibGVGb290ZXJSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0cicpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZvb3RlclJvdyhlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICBsZXQgY2VsbHM6IFRhYmxlQm9keUNlbGxbXSA9IFtdO1xuICAgICAgICB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0cicpKS5mb3JFYWNoKChyb3c6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY2VsbHMgPSBjZWxscy5jb25jYXQocm93LnF1ZXJ5QWxsKEJ5LmNzcygndGgnKSkubWFwKChjZWxsOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keUNlbGwoY2VsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGb290ZXJSb3cge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0aCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlDZWxsKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbmV4cG9ydCBjbGFzcyBSZWNvcmRzQ291bnQge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhZ2VyIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCwgYWR2YW5jZUFuZERldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnZUJ1dHRvbnMoKTogRGVidWdFbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShNYXRCdXR0b25Ub2dnbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0TGVhZGluZ0J1dHRvbnNEaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2ldLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkJ10pXG4gICAgICAgICAgICAgICAgLnRvQmUodHJ1ZSwgJ0ZpcnN0IHR3byBhcmUgZGlzYWJsZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0TGVhZGluZ0J1dHRvbnNOb3REaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2ldLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkJ10pXG4gICAgICAgICAgICAgICAgLm5vdC50b0JlKHRydWUsICdGaXJzdCB0d28gYXJlIG5vdCBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RUcmFpbGluZ0J1dHRvbnNEaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMTsgaSA+IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMzsgaS0tKSB7XG4gICAgICAgICAgICBleHBlY3QodGhpcy5wYWdlQnV0dG9uc1tpXS5jbGFzc2VzWydtYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCddKVxuICAgICAgICAgICAgICAgIC50b0JlKHRydWUsICdMYXN0IHR3byBhcmUgZGlzYWJsZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0VHJhaWxpbmdCdXR0b25zTm90RGlzYWJsZWQoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnBhZ2VCdXR0b25zLmxlbmd0aCAtIDE7IGkgPiB0aGlzLnBhZ2VCdXR0b25zLmxlbmd0aCAtIDM7IGktLSkge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaV0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQnXSlcbiAgICAgICAgICAgICAgICAubm90LnRvQmUodHJ1ZSwgJ0xhc3QgdHdvIGFyZSBub3QgZGlzYWJsZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0QnV0dG9uTnVtYmVycyhudW1iZXJzOiBudW1iZXJbXSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2kgKyAyXS5xdWVyeShCeS5jc3MoJy5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50JykpXG4gICAgICAgICAgICAgICAgLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpKVxuICAgICAgICAgICAgICAgIC50b0VxdWFsKG51bWJlcnNbaV0gKyAnJywgJ0J1dHRvbiBudW1iZXJzIGFyZSBjb3JyZWN0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0QnV0dG9uQWN0aXZlKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaW5kZXhdLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQnXSlcbiAgICAgICAgICAgIC50b0JlKHRydWUsICdCdXR0b24gaXMgYWN0aXZlLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGljayhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNsaWNrKHRoaXMucGFnZUJ1dHRvbnNbaW5kZXhdLnF1ZXJ5KEJ5LmNzcygnLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQnKSkubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMucGFnZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucGFnZS5hZHZhbmNlQW5kRGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoY2Vja1NvcnRpbmcocGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkLCBkYXRhVGFibGU6IERhdGFUYWJsZURlZmluaXRpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhOiBBcnJheTxWYWx1ZUdldHRlcjxhbnk+Pikge1xuICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuY2hlY2tTb3J0aW5nKDE1MCk7XG5cbiAgICBwYWdlLmRhdGFUYWJsZS5zb3J0aW5nLmhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlOiBTb3J0aW5nSGFuZGxlLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vIFRpZ2dlciBzb3J0IGJhc2VkIG9uIGEgaGFuZGxlXG4gICAgICAgIGhhbmRsZS5jbGljaygpO1xuICAgICAgICBwYWdlLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAvLyBDaGVjayB0aGUgc29ydGluZ1xuICAgICAgICBwYWdlLmRhdGFUYWJsZS5zb3J0aW5nLmNoZWNrU29ydGluZygxNTAsIHtcbiAgICAgICAgICAgIGdldDogY3JpdGVyaWFbaW5kZXhdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRpZ2dlciBzb3J0IGJhc2VkIG9uIGEgaGFuZGxlXG4gICAgICAgIGhhbmRsZS5jbGljaygpO1xuICAgICAgICBwYWdlLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAvLyBDaGVjayB0aGUgc29ydGluZ1xuICAgICAgICBwYWdlLmRhdGFUYWJsZS5zb3J0aW5nLmNoZWNrU29ydGluZygxNTAsIHtcbiAgICAgICAgICAgIGdldCAgICAgICA6IGNyaXRlcmlhW2luZGV4XSxcbiAgICAgICAgICAgIGRlc2NlbmRpbmc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVEZWZpbml0aW9uSG9zdGVkIGV4dGVuZHMgUGFnZTxUZXN0RGF0YVRhYmxlSG9zdENvbXBvbmVudD4ge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZpeHR1cmU6IENvbXBvbmVudEZpeHR1cmU8VGVzdERhdGFUYWJsZUhvc3RDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKGZpeHR1cmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVRhYmxlKCk6IERhdGFUYWJsZURlZmluaXRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFUYWJsZURlZmluaXRpb24odGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKERhdGFUYWJsZUNvbXBvbmVudCkpLCB0aGlzKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxyaXNrLWRhdGEtdGFibGUgW2RhdGFdPVwiZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Zvb3Rlcl09XCJmb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRPcmRlcmluZ109XCJkZWZhdWx0T3JkZXJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJpcGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uIHRpdGxlPVwiVGVzdCBDb2x1bW4gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGluZ0tleV09XCJ2YWx1ZUdldHRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcmVjb3JkPVwicm93XCIgcmlzay1kYXRhLXRhYmxlLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIHt7cmVjb3JkLnZhbHVlMX19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1kZXRhaWwtZXhwYW5kZXIgW2V4cGFuZGVkXT1cImV4cGFuZGVkXCI+PC9yaXNrLWRhdGEtdGFibGUtZGV0YWlsLWV4cGFuZGVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHJpc2stZGF0YS10YWJsZS1mb290ZXItY2VsbCBsZXQtZm9vdGVyPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7Zm9vdGVyLnZhbHVlMX19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDwhLS0gU3ViIGRldGFpbCAtLT5cbiAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtZGV0YWlsLXJvdz5cbiAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbi1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4gdGl0bGU9XCJUZXN0IERldGFpbCBDb2x1bW4gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0aW5nS2V5XT1cInZhbHVlR2V0dGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcmlzay1kYXRhLXRhYmxlLWNlbGwgbGV0LXJlY29yZD1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cmVjb3JkLnZhbHVlMX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbiB0aXRsZT1cIlRlc3QgRGV0YWlsIENvbHVtbiAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcmlzay1kYXRhLXRhYmxlLWNlbGwgbGV0LXJlY29yZD1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cmVjb3JkLnZhbHVlMn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uIHRpdGxlPVwiVGVzdCBEZXRhaWwgQ29sdW1uIDNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUzfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+PC9yaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtZGV0YWlsLXJvdz5cbiAgICAgICAgPC9yaXNrLWRhdGEtdGFibGU+YFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0RGF0YVRhYmxlSG9zdENvbXBvbmVudCB7XG5cbiAgICBwdWJsaWMgZGF0YTogYW55W107XG5cbiAgICBwdWJsaWMgZm9vdGVyOiBhbnk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUwMDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgdmFsdWUxOiBNYXRoLmZsb29yKHNlY3VyZVJhbmRvbSgpICogMjApICsgJyAtIHZhbHVlIDEnLFxuICAgICAgICAgICAgICAgIHZhbHVlMjogTWF0aC5mbG9vcihzZWN1cmVSYW5kb20oKSAqIDIwKSArICcgLSB2YWx1ZSAyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTM6IE1hdGguZmxvb3Ioc2VjdXJlUmFuZG9tKCkgKiAyMCkgKyAnIC0gdmFsdWUgMydcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9vdGVyID0gdGhpcy5kYXRhWzBdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdE9yZGVyaW5nKCk6IEFycmF5PE9yZGVyaW5nQ3JpdGVyaWE8YW55PiB8IFZhbHVlR2V0dGVyPGFueT4+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnZXQgICAgICAgOiAocmVjb3JkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZC52YWx1ZTM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXNjZW5kaW5nOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKHJlY29yZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZC52YWx1ZTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWx1ZUdldHRlcigpOiAocmVjb3JkOiBhbnkpID0+IGFueSB7XG4gICAgICAgIHJldHVybiAocmVjb3JkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmQudmFsdWUxO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==