fixa-admin 0.0.53 → 0.0.55

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.
@@ -1,19 +1,32 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import { FilterOperator } from '../../models/shared.model';
3
- import { ActionsCellRenderer } from '../index.api';
4
3
  import { JDatePipe } from '../../pipes/date.pipe';
5
- import { DateFilter } from './filter/index.api';
4
+ import { ActionsCellRenderer } from '../index.api';
5
+ import { DateFilter, TimeFilter } from './filter/index.api';
6
+ import { db } from '../../db';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "@ngx-translate/core";
8
- import * as i2 from "@angular/common";
9
- import * as i3 from "@ag-grid-community/angular";
10
- import * as i4 from "ng-zorro-antd/icon";
11
- import * as i5 from "ng-zorro-antd/button";
12
- import * as i6 from "ng-zorro-antd/core/transition-patch";
13
- import * as i7 from "ng-zorro-antd/core/wave";
9
+ import * as i2 from "../../services/index.api";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@ag-grid-community/angular";
12
+ import * as i5 from "ng-zorro-antd/icon";
13
+ import * as i6 from "ng-zorro-antd/button";
14
+ import * as i7 from "ng-zorro-antd/core/transition-patch";
15
+ import * as i8 from "ng-zorro-antd/core/wave";
16
+ import * as i9 from "ng-zorro-antd/modal";
17
+ import * as i10 from "@angular/forms";
18
+ import * as i11 from "ng-zorro-antd/input";
19
+ import * as i12 from "ng-zorro-antd/grid";
20
+ import * as i13 from "ng-zorro-antd/form";
21
+ import * as i14 from "ng-zorro-antd/select";
22
+ import * as i15 from "ng-zorro-antd/tree-select";
23
+ import * as i16 from "ng-zorro-antd/popover";
24
+ import * as i17 from "@qeydar/datepicker";
14
25
  export class GridComponent {
15
- constructor(_translate) {
26
+ constructor(_translate, _cdr, _toast) {
16
27
  this._translate = _translate;
28
+ this._cdr = _cdr;
29
+ this._toast = _toast;
17
30
  this.getServerSideGroupKey = null;
18
31
  this.groupDefaultExpanded = -1;
19
32
  this._treeGroupColumn = null;
@@ -23,7 +36,16 @@ export class GridComponent {
23
36
  };
24
37
  this.themeClass = "ag-theme-quartz";
25
38
  this.columnDefs = [];
39
+ this.visibleFilterBox = false;
26
40
  this._column = [];
41
+ this._filterBoxItems = [];
42
+ this.filterItemsValues = [];
43
+ this.filterTemplateItems = [];
44
+ this.visibleFilterTemplateBox = false;
45
+ this.isVisibleModal = false;
46
+ this.gridModel = null;
47
+ this.templateName = null;
48
+ this.gridId = null;
27
49
  this._autoColumnSize = { type: 'fitGridWidth' };
28
50
  this.autoGroupColumnDef = {
29
51
  headerName: "",
@@ -50,6 +72,7 @@ export class GridComponent {
50
72
  this.rowSelectionChange = new EventEmitter();
51
73
  this.actionWidth = 100;
52
74
  this.label = null;
75
+ this.id = null;
53
76
  this.rowModelType = 'serverSide';
54
77
  this.serverSideSort = true;
55
78
  this.serverSideFilter = true;
@@ -90,6 +113,12 @@ export class GridComponent {
90
113
  ];
91
114
  this.datasource = this.createServerSideDatasource();
92
115
  }
116
+ getRowClass(params) {
117
+ if (params.node.rowIndex % 2 !== 0) {
118
+ return 'row-odd';
119
+ }
120
+ return '';
121
+ }
93
122
  set isRowSelection(v) {
94
123
  if (v) {
95
124
  this._rowSelection = {
@@ -147,249 +176,424 @@ export class GridComponent {
147
176
  // this.autoGroupColumnDef.headerName = v;
148
177
  }
149
178
  }
150
- get column() {
151
- return this.column;
152
- }
153
- set column(v) {
154
- this.columnDefs = [];
155
- if (v != null) {
156
- this._column = v;
179
+ set filterItems(v) {
180
+ if (v != null && v.length > 0) {
157
181
  v.forEach((el) => {
158
- var filter = 'agTextColumnFilter';
159
- var sortable = true;
160
- var filterParams = {
161
- maxNumConditions: 1
162
- };
163
- switch (el.type) {
164
- case 'boolean':
165
- filter = 'agNumberColumnFilter';
166
- filterParams.filterOptions = [
167
- "empty",
168
- {
169
- displayKey: 'true',
170
- displayName: this._translate.instant('YES'),
171
- predicate: () => true,
172
- numberOfInputs: 0
173
- },
174
- {
175
- displayKey: 'false',
176
- displayName: this._translate.instant('NO'),
177
- predicate: () => true,
178
- numberOfInputs: 0
182
+ if (!this._filterBoxItems.find((item) => item.field == el.field)) {
183
+ let items = [];
184
+ if ((el.type == 'enum' || el.type == 'select' || el.type == 'tree-select') && el.items != null) {
185
+ el.items?.().then((res) => {
186
+ let nodes = [];
187
+ if (el.type == 'tree-select') {
188
+ const convertToNzTreeNodes = (items) => {
189
+ return items.map(item => ({
190
+ title: item.label,
191
+ key: String(item.value),
192
+ isLeaf: item.children && item.children.length > 0 ? false : true,
193
+ children: item.children ? convertToNzTreeNodes(item.children) : [],
194
+ }));
195
+ };
196
+ nodes = convertToNzTreeNodes(res);
179
197
  }
180
- ];
181
- break;
182
- case 'enum':
183
- filter = 'agNumberColumnFilter';
184
- const items = [];
185
- for (const property in el.filterItems) {
186
- items.push({
187
- displayKey: el.filterItems[property],
188
- displayName: this._translate.instant(el.filterItems[property]),
189
- predicate: true,
190
- numberOfInputs: 0
198
+ this._filterBoxItems.push({
199
+ field: el.field,
200
+ label: el.label,
201
+ value: null,
202
+ items: res,
203
+ type: el.type,
204
+ position: el.position ? el.position : 'filter',
205
+ nodes
191
206
  });
192
- }
193
- filterParams.filterOptions = [
194
- "empty",
195
- ...items
196
- ];
197
- break;
198
- case 'number':
199
- filter = 'agNumberColumnFilter';
200
- break;
201
- case 'select':
202
- filter = 'agSetColumnFilter';
203
- break;
204
- case 'string':
205
- filter = 'agTextColumnFilter';
206
- break;
207
- case 'date':
208
- filter = 'agDateColumnFilter';
209
- break;
210
- default:
211
- filter = 'agTextColumnFilter';
212
- break;
213
- }
214
- if (el.filter != undefined && !el.filter) {
215
- filter = false;
216
- }
217
- if (el.sortable != undefined && !el.sortable) {
218
- sortable = false;
219
- }
220
- if (el.field != this._treeGroupColumn) {
221
- if (el.type && el.type == 'boolean') {
222
- this.columnDefs.push({
223
- colId: el.id ? el.id : el.field,
224
- field: el.field,
225
- headerName: el.label,
226
- filter: filter,
227
- sortable,
228
- editable: el.editable,
229
- minWidth: el.minWidth ? el.minWidth : null,
230
- filterParams,
231
- pinned: el.pinned,
232
- cellClass: 'ag-boolean-cell',
233
- cellRenderer: params => {
234
- if (params.value != null) {
235
- return params.value ? '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" stroke="green" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check"><path d="M20 6L9 17L4 12"/></svg>' : '<svg xmlns="http://www.w3.org/2000/svg" stroke="red" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18" /><line x1="6" y1="6" x2="18" y2="18" /></svg>';
236
- }
237
- else {
238
- return '';
239
- }
240
- }
241
207
  });
242
208
  }
243
- else if (el.type && el.type == 'enum') {
244
- this.columnDefs.push({
245
- colId: el.id ? el.id : el.field,
209
+ else if (el.type == 'boolean') {
210
+ items.push({
211
+ label: this._translate.instant("true"),
212
+ value: true
213
+ }, {
214
+ label: this._translate.instant("false"),
215
+ value: false
216
+ });
217
+ this._filterBoxItems.push({
246
218
  field: el.field,
247
- headerName: el.label,
248
- filter: filter,
249
- sortable,
250
- editable: el.editable,
251
- pinned: el.pinned,
252
- minWidth: el.minWidth ? el.minWidth : null,
253
- filterParams,
254
- cellRenderer: params => {
255
- if (params.value) {
256
- return this._translate.instant(params.value);
257
- }
258
- else {
259
- return '';
260
- }
261
- }
219
+ label: el.label,
220
+ value: null,
221
+ items,
222
+ type: el.type,
223
+ position: el.position ? el.position : 'filter',
224
+ nodes: []
262
225
  });
263
226
  }
264
- else if (el.type && el.type == 'date') {
265
- this.columnDefs.push({
266
- colId: el.id ? el.id : el.field,
227
+ else {
228
+ this._filterBoxItems.push({
267
229
  field: el.field,
268
- headerName: el.label,
269
- filter: DateFilter,
270
- sortable,
271
- editable: el.editable,
272
- minWidth: el.minWidth ? el.minWidth : null,
273
- filterParams,
274
- pinned: el.pinned,
275
- cellRenderer: params => {
276
- if (params.value) {
277
- return new JDatePipe().transform(params.value);
278
- }
279
- else {
280
- return '';
281
- }
282
- }
230
+ label: el.label,
231
+ value: null,
232
+ items,
233
+ type: el.type,
234
+ position: el.position ? el.position : 'filter',
235
+ nodes: []
283
236
  });
284
237
  }
285
- else if (el.type && el.type == 'date-time') {
286
- this.columnDefs.push({
287
- colId: el.id ? el.id : el.field,
288
- field: el.field,
289
- headerName: el.label,
290
- filter: DateFilter,
291
- sortable,
292
- editable: el.editable,
293
- minWidth: el.minWidth ? el.minWidth : null,
294
- filterParams,
295
- pinned: el.pinned,
296
- cellRenderer: params => {
297
- if (params.value) {
298
- return new JDatePipe().transform(params.value, true);
299
- }
300
- else {
301
- return '';
238
+ }
239
+ });
240
+ }
241
+ }
242
+ get column() {
243
+ return this.column;
244
+ }
245
+ set column(v) {
246
+ setTimeout(() => {
247
+ this.columnDefs = [];
248
+ if (v != null) {
249
+ this._column = v;
250
+ v.forEach((el) => {
251
+ var filter = 'agTextColumnFilter';
252
+ var sortable = true;
253
+ var filterParams = {
254
+ maxNumConditions: 1
255
+ };
256
+ switch (el.type) {
257
+ case 'boolean':
258
+ filter = 'agNumberColumnFilter';
259
+ filterParams.filterOptions = [
260
+ "empty",
261
+ {
262
+ displayKey: 'true',
263
+ displayName: this._translate.instant('YES'),
264
+ predicate: () => true,
265
+ numberOfInputs: 0
266
+ },
267
+ {
268
+ displayKey: 'false',
269
+ displayName: this._translate.instant('NO'),
270
+ predicate: () => true,
271
+ numberOfInputs: 0
302
272
  }
273
+ ];
274
+ break;
275
+ case 'enum':
276
+ filter = 'agNumberColumnFilter';
277
+ const items = [];
278
+ for (const property in el.filterItems) {
279
+ items.push({
280
+ displayKey: el.filterItems[property],
281
+ displayName: this._translate.instant(el.filterItems[property]),
282
+ predicate: true,
283
+ numberOfInputs: 0
284
+ });
303
285
  }
304
- });
286
+ filterParams.filterOptions = [
287
+ "empty",
288
+ ...items
289
+ ];
290
+ break;
291
+ case 'number':
292
+ filter = 'agNumberColumnFilter';
293
+ break;
294
+ case 'select':
295
+ filter = 'agSetColumnFilter';
296
+ break;
297
+ case 'string':
298
+ filter = 'agTextColumnFilter';
299
+ break;
300
+ case 'date':
301
+ filter = 'agDateColumnFilter';
302
+ break;
303
+ default:
304
+ filter = 'agTextColumnFilter';
305
+ break;
305
306
  }
306
- else if (el.type && el.type == 'price') {
307
- this.columnDefs.push({
308
- colId: el.id ? el.id : el.field,
309
- field: el.field,
310
- headerName: el.label,
311
- filter: filter,
312
- sortable,
313
- editable: el.editable,
314
- minWidth: el.minWidth ? el.minWidth : null,
315
- filterParams,
316
- pinned: el.pinned,
317
- cellRenderer: params => {
318
- if (params.value) {
319
- return params.value.toLocaleString();
307
+ if (this._filterBoxItems.find((item) => item.field == el.field || item.field == el.searchField)) {
308
+ filter = false;
309
+ }
310
+ if (el.filter != undefined && (el.filter == 'filter-box' || el.filter == 'none')) {
311
+ filter = false;
312
+ }
313
+ if (el.sortable != undefined && !el.sortable) {
314
+ sortable = false;
315
+ }
316
+ if (el.field != this._treeGroupColumn) {
317
+ if (el.type && el.type == 'boolean') {
318
+ this.columnDefs.push({
319
+ colId: el.id ? el.id : el.field,
320
+ field: el.field,
321
+ headerName: el.label,
322
+ filter: filter,
323
+ sortable,
324
+ editable: el.editable,
325
+ minWidth: el.minWidth ? el.minWidth : null,
326
+ filterParams,
327
+ pinned: el.pinned,
328
+ cellClass: 'ag-boolean-cell',
329
+ cellRenderer: params => {
330
+ if (params.value != null) {
331
+ return params.value ? '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" stroke="green" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check"><path d="M20 6L9 17L4 12"/></svg>' : '<svg xmlns="http://www.w3.org/2000/svg" stroke="red" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18" /><line x1="6" y1="6" x2="18" y2="18" /></svg>';
332
+ }
333
+ else {
334
+ return '';
335
+ }
320
336
  }
321
- else {
322
- return '';
337
+ });
338
+ }
339
+ else if (el.type && el.type == 'enum') {
340
+ this.columnDefs.push({
341
+ colId: el.id ? el.id : el.field,
342
+ field: el.field,
343
+ headerName: el.label,
344
+ filter: filter,
345
+ sortable,
346
+ editable: el.editable,
347
+ pinned: el.pinned,
348
+ minWidth: el.minWidth ? el.minWidth : null,
349
+ filterParams,
350
+ cellRenderer: params => {
351
+ if (params.value) {
352
+ return this._translate.instant(params.value);
353
+ }
354
+ else {
355
+ return '';
356
+ }
323
357
  }
324
- }
325
- });
326
- }
327
- else if (el.type && el.type == 'image') {
328
- this.columnDefs.push({
329
- colId: el.id ? el.id : el.field,
330
- field: el.field,
331
- headerName: el.label,
332
- minWidth: 80,
333
- width: 80,
334
- filter: false,
335
- sortable: false,
336
- editable: false,
337
- filterParams,
338
- pinned: el.pinned,
339
- cellRenderer: params => {
340
- if (params.value) {
341
- return `<img class="rounded-full mt-1" width="32" height="32" src="${params.value}"/>`;
358
+ });
359
+ }
360
+ else if (el.type && el.type == 'date') {
361
+ this.columnDefs.push({
362
+ colId: el.id ? el.id : el.field,
363
+ field: el.field,
364
+ headerName: el.label,
365
+ filter: DateFilter,
366
+ sortable,
367
+ editable: el.editable,
368
+ minWidth: el.minWidth ? el.minWidth : null,
369
+ filterParams,
370
+ pinned: el.pinned,
371
+ cellRenderer: params => {
372
+ if (params.value) {
373
+ return new JDatePipe().transform(params.value);
374
+ }
375
+ else {
376
+ return '';
377
+ }
342
378
  }
343
- else {
344
- return '';
379
+ });
380
+ }
381
+ else if (el.type && el.type == 'time') {
382
+ this.columnDefs.push({
383
+ colId: el.id ? el.id : el.field,
384
+ field: el.field,
385
+ headerName: el.label,
386
+ filter: TimeFilter,
387
+ sortable,
388
+ editable: el.editable,
389
+ minWidth: el.minWidth ? el.minWidth : null,
390
+ filterParams,
391
+ pinned: el.pinned,
392
+ cellRenderer: params => {
393
+ if (params.value) {
394
+ return params.value;
395
+ }
396
+ else {
397
+ return '';
398
+ }
345
399
  }
346
- }
347
- });
400
+ });
401
+ }
402
+ else if (el.type && el.type == 'date-time') {
403
+ this.columnDefs.push({
404
+ colId: el.id ? el.id : el.field,
405
+ field: el.field,
406
+ headerName: el.label,
407
+ filter: DateFilter,
408
+ sortable,
409
+ editable: el.editable,
410
+ minWidth: el.minWidth ? el.minWidth : null,
411
+ filterParams,
412
+ pinned: el.pinned,
413
+ cellRenderer: params => {
414
+ if (params.value) {
415
+ return new JDatePipe().transform(params.value, true);
416
+ }
417
+ else {
418
+ return '';
419
+ }
420
+ }
421
+ });
422
+ }
423
+ else if (el.type && el.type == 'price') {
424
+ this.columnDefs.push({
425
+ colId: el.id ? el.id : el.field,
426
+ field: el.field,
427
+ headerName: el.label,
428
+ filter: filter,
429
+ sortable,
430
+ editable: el.editable,
431
+ minWidth: el.minWidth ? el.minWidth : null,
432
+ filterParams,
433
+ pinned: el.pinned,
434
+ cellRenderer: params => {
435
+ if (params.value) {
436
+ return params.value.toLocaleString();
437
+ }
438
+ else {
439
+ return '';
440
+ }
441
+ }
442
+ });
443
+ }
444
+ else if (el.type && el.type == 'image') {
445
+ this.columnDefs.push({
446
+ colId: el.id ? el.id : el.field,
447
+ field: el.field,
448
+ headerName: el.label,
449
+ minWidth: 80,
450
+ width: 80,
451
+ filter: 'none',
452
+ sortable: false,
453
+ editable: false,
454
+ filterParams,
455
+ pinned: el.pinned,
456
+ cellRenderer: params => {
457
+ if (params.value) {
458
+ return `<img class="rounded-full mt-1" width="32" height="32" src="${params.value}"/>`;
459
+ }
460
+ else {
461
+ return '';
462
+ }
463
+ }
464
+ });
465
+ }
466
+ else {
467
+ this.columnDefs.push({
468
+ colId: el.id ? el.id : el.field,
469
+ field: el.field,
470
+ headerName: el.label,
471
+ filter,
472
+ sortable,
473
+ editable: el.editable,
474
+ filterParams,
475
+ pinned: el.pinned,
476
+ minWidth: el.minWidth ? el.minWidth : null
477
+ });
478
+ }
348
479
  }
349
480
  else {
350
- this.columnDefs.push({
351
- colId: el.id ? el.id : el.field,
352
- field: el.field,
353
- headerName: el.label,
354
- filter,
355
- sortable,
356
- editable: el.editable,
357
- filterParams,
358
- pinned: el.pinned,
359
- minWidth: el.minWidth ? el.minWidth : null
360
- });
481
+ this.autoGroupColumnDef.field = el.field;
361
482
  }
362
- }
363
- else {
364
- this.autoGroupColumnDef.field = el.field;
365
- }
366
- });
367
- if (this.actionItems.length > 0) {
368
- this.columnDefs.push({
369
- filter: false,
370
- headerName: '',
371
- minWidth: this.actionWidth,
372
- resizable: true,
373
- pinned: true,
374
- sortable: false,
375
- field: 'actions',
376
- cellRenderer: ActionsCellRenderer,
377
- cellRendererParams: {
378
- onClick: (params) => {
379
- this.onAction.emit(params);
483
+ });
484
+ this._column.filter((el) => el.filter == 'filter-box').forEach((el) => {
485
+ let items = [];
486
+ if (el.filterItems != null) {
487
+ switch (el.type) {
488
+ case 'enum':
489
+ Object.keys(el.filterItems).forEach((item) => {
490
+ items.push({
491
+ label: this._translate.instant(el.filterItems[item]),
492
+ value: el.filterItems[item]
493
+ });
494
+ });
495
+ break;
496
+ case 'boolean':
497
+ Object.keys(el.filterItems).forEach((item) => {
498
+ items.push({
499
+ label: this._translate.instant("true"),
500
+ value: true
501
+ }, {
502
+ label: this._translate.instant("false"),
503
+ value: false
504
+ });
505
+ });
506
+ break;
380
507
  }
381
508
  }
509
+ this._filterBoxItems.push({
510
+ label: el.label,
511
+ value: null,
512
+ items,
513
+ type: el.type,
514
+ field: el.field,
515
+ position: 'filter',
516
+ nodes: []
517
+ });
382
518
  });
519
+ if (this.actionItems.length > 0) {
520
+ this.columnDefs.push({
521
+ filter: false,
522
+ headerName: '',
523
+ minWidth: this.actionWidth,
524
+ resizable: true,
525
+ pinned: true,
526
+ sortable: false,
527
+ field: 'actions',
528
+ cellRenderer: ActionsCellRenderer,
529
+ cellRendererParams: {
530
+ onClick: (params) => {
531
+ this.onAction.emit(params);
532
+ }
533
+ }
534
+ });
535
+ }
383
536
  }
537
+ }, 100);
538
+ }
539
+ changeDatePickerValue(e, item, index) {
540
+ if (item.value != null) {
541
+ item.value[index] = e;
542
+ }
543
+ else {
544
+ item.value = [null, null];
545
+ item.value[index] = e;
384
546
  }
385
547
  }
386
548
  cellDoubleClicked(e) {
387
- console.log(e);
388
549
  this.onClicked.emit({ ...e.data, colId: e.column.getColId() });
389
550
  }
390
551
  handleClick(item) {
391
552
  this.onToolbar.emit(item);
392
553
  }
554
+ saveFilterGrid() {
555
+ if (this.id == null) {
556
+ this._toast.show('شناسه ی جدول وارد نشده است', 'error');
557
+ return;
558
+ }
559
+ if (this.gridId == null) {
560
+ this.isVisibleModal = true;
561
+ this._cdr.detectChanges();
562
+ }
563
+ else {
564
+ db.gridFilterItems.get(this.gridId).then((res) => {
565
+ db.gridFilterItems.put({
566
+ ...res,
567
+ grid: this.gridModel,
568
+ });
569
+ this.fetchTemplate();
570
+ this._toast.show('قالب با موفقیت بروزرسانی شد', 'success');
571
+ });
572
+ }
573
+ }
574
+ handleCancelModal() {
575
+ this.isVisibleModal = false;
576
+ this._cdr.detectChanges();
577
+ }
578
+ handleOkModal() {
579
+ if (this.templateName == null) {
580
+ this._toast.show('عنوان قالب وارد نشده است', 'error');
581
+ return;
582
+ }
583
+ this.gridId = new Date().getTime().toString();
584
+ db.gridFilterItems.add({
585
+ id: this.gridId,
586
+ grid: this.gridModel,
587
+ tableId: this.id,
588
+ title: this.templateName,
589
+ userName: null
590
+ });
591
+ this._toast.show('قالب با موفقیت ذخیره شد', 'success');
592
+ this.templateName = null;
593
+ this.isVisibleModal = false;
594
+ this._cdr.detectChanges();
595
+ this.fetchTemplate();
596
+ }
393
597
  refresh(purge = false) {
394
598
  if (this.rowModelType == 'serverSide') {
395
599
  this.gridApi.refreshServerSide({ purge });
@@ -442,7 +646,13 @@ export class GridComponent {
442
646
  });
443
647
  }
444
648
  clearFilter() {
649
+ this.visibleFilterBox = false;
650
+ this._filterBoxItems.forEach((el) => {
651
+ el.value = null;
652
+ });
445
653
  this.gridApi.setFilterModel(null);
654
+ this.gridApi.onFilterChanged();
655
+ this.filterItemsValues = [];
446
656
  this.refresh();
447
657
  }
448
658
  refreshParentNode(id) {
@@ -453,89 +663,155 @@ export class GridComponent {
453
663
  route: route
454
664
  });
455
665
  }
666
+ filter() {
667
+ this.handleFilterLabelValue();
668
+ this.refresh();
669
+ this.visibleFilterBox = false;
670
+ }
671
+ setTemplateFilter(item) {
672
+ this.clearFilter();
673
+ setTimeout(() => {
674
+ item.grid.filter.filters.forEach((el) => {
675
+ const findEl = this._column.find((item) => item.field == el.field || item.searchField == el.field);
676
+ if (findEl && this.columnDefs.find((item) => item.field == findEl.field && item.filter)) {
677
+ this.gridApi.setColumnFilterModel(findEl.field, {
678
+ type: el.logic,
679
+ filter: el.value
680
+ });
681
+ }
682
+ else {
683
+ const index = this._filterBoxItems.findIndex((item) => item.field == el.field);
684
+ this._filterBoxItems[index].value = el.value;
685
+ this._cdr.detectChanges();
686
+ }
687
+ });
688
+ this.gridId = item.id;
689
+ this.visibleFilterTemplateBox = false;
690
+ this._cdr.detectChanges();
691
+ this.handleFilterLabelValue();
692
+ this.gridApi.onFilterChanged();
693
+ this.refresh();
694
+ }, 100);
695
+ }
696
+ handleFilterLabelValue() {
697
+ this._filterBoxItems.forEach((el) => {
698
+ const findEl = this.filterItemsValues.find((fi) => fi.field == el.field);
699
+ if (!findEl) {
700
+ if (el.value != null) {
701
+ this.filterItemsValues.push({
702
+ field: el.field,
703
+ label: el.label,
704
+ value: el.value
705
+ });
706
+ this._cdr.detectChanges();
707
+ }
708
+ }
709
+ else {
710
+ if (el.value == null || el.value == "") {
711
+ this.filterItemsValues = this.filterItemsValues.filter((fi) => fi.field != el.field);
712
+ }
713
+ else {
714
+ findEl.value = el.value;
715
+ }
716
+ this._cdr.detectChanges();
717
+ }
718
+ });
719
+ }
720
+ removeFilter(item) {
721
+ const index = this._filterBoxItems.findIndex((el) => el.field == item.field);
722
+ if (index >= 0) {
723
+ this._filterBoxItems[index].value = null;
724
+ }
725
+ else {
726
+ this.gridApi.setColumnFilterModel(item.field, null);
727
+ this.gridApi.onFilterChanged();
728
+ }
729
+ this.filterItemsValues = this.filterItemsValues.filter((el) => el.field != item.field);
730
+ this._cdr.detectChanges();
731
+ this.refresh();
732
+ }
456
733
  createServerSideDatasource() {
457
734
  return {
458
735
  getRows: (params) => {
459
736
  let filter = null;
737
+ filter = {
738
+ disable: false,
739
+ field: null,
740
+ logic: 'AND',
741
+ filters: [],
742
+ ignoreCase: null,
743
+ operator: null,
744
+ truncateDate: null,
745
+ value: null,
746
+ };
460
747
  if (Object.keys(params.request.filterModel).length > 0) {
461
- filter = {
462
- disable: false,
463
- field: null,
464
- logic: 'AND',
465
- filters: [],
466
- ignoreCase: null,
467
- operator: null,
468
- truncateDate: null,
469
- value: null,
470
- };
471
748
  for (const key in params.request.filterModel) {
749
+ let field = key == 'ag-Grid-AutoColumn' ? this._treeGroupColumn : key;
750
+ let value = null;
751
+ let operator = FilterOperator.equals;
752
+ let ignoreCase = false;
753
+ const findEl = this._column.find((el) => el.field == key);
754
+ if (key == 'ag-Grid-AutoColumn') {
755
+ field = this._treeGroupColumn;
756
+ }
757
+ else {
758
+ field = key;
759
+ if (findEl.searchField != null) {
760
+ field = findEl.searchField;
761
+ }
762
+ }
472
763
  if (params.request.filterModel[key].filterType == 'custom-date') {
473
764
  if (params.request.filterModel[key].dateFrom && params.request.filterModel[key].dateTo) {
474
- filter.filters.push({
475
- disable: false,
476
- field: key == 'ag-Grid-AutoColumn' ? this._treeGroupColumn : key,
477
- logic: 'AND',
478
- filters: null,
479
- ignoreCase: false,
480
- operator: FilterOperator.between,
481
- truncateDate: true,
482
- value: [params.request.filterModel[key].dateFrom, params.request.filterModel[key].dateTo]
483
- });
765
+ operator = FilterOperator.between;
766
+ value = [params.request.filterModel[key].dateFrom, params.request.filterModel[key].dateTo];
484
767
  }
485
768
  else if (params.request.filterModel[key].dateFrom) {
486
- filter.filters.push({
487
- disable: false,
488
- field: key == 'ag-Grid-AutoColumn' ? this._treeGroupColumn : key,
489
- logic: 'AND',
490
- filters: null,
491
- ignoreCase: false,
492
- operator: FilterOperator.truncGreaterThanEqual,
493
- truncateDate: true,
494
- value: params.request.filterModel[key].dateFrom,
495
- });
769
+ operator = FilterOperator.truncGreaterThanEqual;
770
+ value = params.request.filterModel[key].dateFrom;
496
771
  }
497
772
  else if (params.request.filterModel[key].dateTo && params.request.filterModel[key].dateTo != "") {
498
- filter.filters.push({
499
- disable: false,
500
- field: key == 'ag-Grid-AutoColumn' ? this._treeGroupColumn : key,
501
- logic: 'AND',
502
- filters: null,
503
- ignoreCase: false,
504
- operator: FilterOperator.truncLessThanOrEqual,
505
- truncateDate: true,
506
- value: params.request.filterModel[key].dateTo,
507
- });
773
+ operator = FilterOperator.truncLessThanOrEqual;
774
+ value = params.request.filterModel[key].dateTo;
508
775
  }
509
776
  }
777
+ else if (params.request.filterModel[key].filterType == 'custom-time' && params.request.filterModel[key].time != null) {
778
+ operator = FilterOperator.equals;
779
+ value = `${params.request.filterModel[key].time.substr(0, 2)}:${params.request.filterModel[key].time.substr(2, 2)}:${params.request.filterModel[key].time.substr(4, 2)}`;
780
+ }
510
781
  else {
511
- const operation = FilterOperator[params.request.filterModel[key].type];
512
- let ignoreCase = true;
513
- const findEl = this._column.find((el) => el.field == key);
514
- let field = null;
515
- if (key == 'ag-Grid-AutoColumn') {
516
- field = this._treeGroupColumn;
517
- }
518
- else {
519
- field = key;
520
- if (findEl.searchField != null) {
521
- field = findEl.searchField;
522
- }
782
+ if (FilterOperator[params.request.filterModel[key].type]) {
783
+ operator = FilterOperator[params.request.filterModel[key].type];
523
784
  }
785
+ ignoreCase = true;
786
+ value = params.request.filterModel[key].filter ? params.request.filterModel[key].filter : params.request.filterModel[key].type;
524
787
  if (findEl && findEl.type == 'enum') {
525
788
  ignoreCase = false;
526
789
  }
527
- filter.filters.push({
528
- disable: false,
529
- field,
530
- logic: 'AND',
531
- filters: null,
532
- ignoreCase,
533
- operator: operation ? operation : FilterOperator.equals,
534
- truncateDate: true,
535
- value: params.request.filterModel[key].filter ? params.request.filterModel[key].filter : params.request.filterModel[key].type
790
+ }
791
+ const findFilterItemsEl = this.filterItemsValues.find((fi) => fi.field == findEl.field);
792
+ if (!findFilterItemsEl) {
793
+ this.filterItemsValues.push({
794
+ field: findEl.field,
795
+ label: findEl.label,
796
+ value: value
536
797
  });
537
798
  }
799
+ else {
800
+ findFilterItemsEl.value = value;
801
+ }
802
+ filter.filters.push({
803
+ disable: false,
804
+ field,
805
+ logic: 'AND',
806
+ filters: null,
807
+ ignoreCase,
808
+ operator,
809
+ truncateDate: true,
810
+ value
811
+ });
538
812
  }
813
+ this._cdr.detectChanges();
814
+ // this.filterItemsValues = structuredClone(this.filterItemsValues);
539
815
  }
540
816
  let sorts = [];
541
817
  if (params.request.sortModel.length) {
@@ -555,7 +831,7 @@ export class GridComponent {
555
831
  }
556
832
  const gridFilter = {
557
833
  take: params.api.paginationGetPageSize(),
558
- data: null,
834
+ data: {},
559
835
  filter,
560
836
  skip: params.api.paginationGetCurrentPage() * params.api.paginationGetPageSize(),
561
837
  sorts
@@ -563,6 +839,45 @@ export class GridComponent {
563
839
  const requestParams = {
564
840
  parentNode: params.parentNode.data
565
841
  };
842
+ this._filterBoxItems.forEach((el) => {
843
+ if (el.value != null) {
844
+ if (el.position == 'filter') {
845
+ let operator = null;
846
+ switch (el.type) {
847
+ case 'string':
848
+ operator = FilterOperator.contains;
849
+ break;
850
+ case 'date':
851
+ case 'date-time':
852
+ operator = FilterOperator.between;
853
+ if (el.value[0] == null) {
854
+ el.value[0] = new Date('1997-01-01').toISOString();
855
+ }
856
+ else if (el.value[1] == null) {
857
+ el.value[1] = new Date().toISOString();
858
+ }
859
+ break;
860
+ default:
861
+ operator = FilterOperator.equals;
862
+ break;
863
+ }
864
+ gridFilter.filter.filters.push({
865
+ disable: false,
866
+ field: el.field,
867
+ filters: null,
868
+ ignoreCase: false,
869
+ logic: 'AND',
870
+ operator,
871
+ truncateDate: false,
872
+ value: el.value
873
+ });
874
+ }
875
+ else {
876
+ gridFilter.data[el.field] = el.value;
877
+ }
878
+ }
879
+ });
880
+ this.gridModel = gridFilter;
566
881
  this.fetchData(gridFilter, requestParams).then(data => {
567
882
  params.success({
568
883
  rowData: data.items,
@@ -577,14 +892,23 @@ export class GridComponent {
577
892
  }
578
893
  };
579
894
  }
580
- ngOnInit() { }
581
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GridComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
582
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GridComponent, selector: "app-grid", inputs: { actionWidth: "actionWidth", label: "label", isRowSelection: "isRowSelection", rowModelType: "rowModelType", serverSideSort: "serverSideSort", serverSideFilter: "serverSideFilter", isToolbar: "isToolbar", rtl: "rtl", paginationPageSize: "paginationPageSize", paginationPageSizeSelector: "paginationPageSizeSelector", enableAdvancedFilter: "enableAdvancedFilter", treeModel: "treeModel", isLeaf: "isLeaf", rowData: "rowData", autoColumnSize: "autoColumnSize", showAdvancedButton: "showAdvancedButton", actionItems: "actionItems", toolbarItems: "toolbarItems", treeGroupColumn: "treeGroupColumn", fetchData: "fetchData", column: "column" }, outputs: { onAction: "onAction", onToolbar: "onToolbar", onClicked: "onClicked", rowSelectionChange: "rowSelectionChange" }, ngImport: i0, template: "<!-- <button (click)=\"enableAdvancedFilter=!enableAdvancedFilter\">advanced</button> -->\n<div\n class=\"flex justify-between items-center mb-4 pb-4 border-b border-b-slate-200\"\n *ngIf=\"isToolbar\"\n>\n <div>\n <h4 class=\"font-semibold text-2xl\">{{ label }}</h4>\n </div>\n <div class=\"flex gap-3\">\n @for (item of toolbarItems; track $index) {\n <button\n nz-button\n [nzLoading]=\"item.loading ? item.loading : false\"\n (click)=\"handleClick(item)\"\n [nzType]=\"item.type\"\n >\n <span nz-icon [nzType]=\"item.icon\"></span>\n {{ item.text }}\n </button>\n }\n <button nz-button (click)=\"refresh()\" nzType=\"default\">\n <span nz-icon nzType=\"sync\"></span>\n \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC\n </button>\n <button nz-button (click)=\"clearFilter()\" nzType=\"default\">\n <span nz-icon nzType=\"clear\"></span>\n \u067E\u0627\u06A9\u0633\u0627\u0632\u06CC\n </button>\n\n <!-- <button nz-button (click)=\"advancedFilter()\" *ngIf=\"showAdvancedButton\" nzType=\"default\">\n <span nz-icon nzType=\"filter\"></span>\n \u062C\u0633\u062A\u062C\u0648\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\n </button> -->\n </div>\n</div>\n<div>\n <ng-content></ng-content>\n</div>\n<ag-grid-angular\n style=\"width: 100%\"\n [style]=\"isToolbar ? 'height: calc(100% - 1rem - 48px);' : 'height: 100%;'\"\n [columnDefs]=\"columnDefs\"\n [pagination]=\"true\"\n [paginationPageSize]=\"paginationPageSize\"\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\"\n [class]=\"themeClass\"\n [defaultColDef]=\"defaultColDef\"\n [enableAdvancedFilter]=\"enableAdvancedFilter\"\n [enableRtl]=\"rtl\"\n [treeData]=\"treeModel\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [isServerSideGroup]=\"isServerSideGroup\"\n [getServerSideGroupKey]=\"getServerSideGroupKey\"\n [rowModelType]=\"rowModelType\"\n [rowData]=\"rowData\"\n [serverSideDatasource]=\"datasource\"\n (gridReady)=\"onGridReady($event)\"\n [cacheBlockSize]=\"paginationPageSize\"\n [maxBlocksInCache]=\"2\"\n [context]=\"{ actionItems: actionItems }\"\n (cellDoubleClicked)=\"cellDoubleClicked($event)\"\n [autoSizeStrategy]=\"_autoColumnSize\"\n [rowSelection]=\"_rowSelection\"\n (selectionChanged)=\"selectionChanged($event)\"\n #grid\n/>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "enableStrictPivotColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressMoveWhenColumnDragging", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "suppressSetFilterByDefault", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "dragAndDropImageComponent", "dragAndDropImageComponentParams", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "loading", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDuration", "cellFlashDelay", "cellFadeDuration", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "suppressGroupMaintainValueType", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideInfiniteScroll", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "cellSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "selectionColumnDef", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "enableGroupEdit", "initialState", "theme", "loadThemeGoogleFonts", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "focusGridInnerElement", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "cellSelectionDeleteStart", "cellSelectionDeleteEnd", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "dragCancelled", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "rowDragCancel", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "headerFocused", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "cellSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged"] }, { kind: "directive", type: i4.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i5.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }] }); }
895
+ fetchTemplate() {
896
+ if (this.id != null) {
897
+ db.gridFilterItems.filter((el) => el.tableId == this.id).toArray().then((res) => {
898
+ this.filterTemplateItems = res;
899
+ });
900
+ }
901
+ }
902
+ ngOnInit() {
903
+ this.fetchTemplate();
904
+ }
905
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GridComponent, deps: [{ token: i1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }], target: i0.ɵɵFactoryTarget.Component }); }
906
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GridComponent, selector: "app-grid", inputs: { actionWidth: "actionWidth", label: "label", id: "id", isRowSelection: "isRowSelection", rowModelType: "rowModelType", serverSideSort: "serverSideSort", serverSideFilter: "serverSideFilter", isToolbar: "isToolbar", rtl: "rtl", paginationPageSize: "paginationPageSize", paginationPageSizeSelector: "paginationPageSizeSelector", enableAdvancedFilter: "enableAdvancedFilter", treeModel: "treeModel", isLeaf: "isLeaf", rowData: "rowData", autoColumnSize: "autoColumnSize", showAdvancedButton: "showAdvancedButton", actionItems: "actionItems", toolbarItems: "toolbarItems", treeGroupColumn: "treeGroupColumn", filterItems: "filterItems", fetchData: "fetchData", column: "column" }, outputs: { onAction: "onAction", onToolbar: "onToolbar", onClicked: "onClicked", rowSelectionChange: "rowSelectionChange" }, ngImport: i0, template: "<!-- <button (click)=\"enableAdvancedFilter=!enableAdvancedFilter\">advanced</button> -->\n<div class=\"flex justify-between items-center py-4 border-b border-b-slate-200 mx-4\" *ngIf=\"isToolbar\">\n <div>\n <h4 class=\"font-semibold text-2xl\">{{ label }}</h4>\n </div>\n <div class=\"flex gap-3\">\n @for (item of toolbarItems; track $index) {\n <button nz-button [nzLoading]=\"item.loading ? item.loading : false\" (click)=\"handleClick(item)\" [nzType]=\"item.type\">\n <span nz-icon [nzType]=\"item.icon\"></span>\n {{ item.text }}\n </button>\n }\n <button\n nz-button\n nzType=\"default\"\n nz-popover\n nzPopoverTitle=\"\"\n [(nzPopoverVisible)]=\"visibleFilterBox\"\n nzPopoverTrigger=\"click\"\n [nzPopoverContent]=\"contentTemplate\"\n nzPopoverOverlayClassName=\"filter-popover\"\n nzPopoverPlacement=\"bottom\"\n *ngIf=\"_filterBoxItems.length > 0\">\n <span nz-icon nzType=\"filter\"></span>\n \u0641\u06CC\u0644\u062A\u0631\n </button>\n <button\n nz-button\n nzType=\"default\"\n class=\"flex items-center\"\n nz-popover\n nzPopoverTitle=\"\"\n [(nzPopoverVisible)]=\"visibleFilterTemplateBox\"\n nzPopoverTrigger=\"click\"\n [nzPopoverContent]=\"contentFilterTemplate\"\n nzPopoverOverlayClassName=\"filter-popover-sm\"\n nzPopoverPlacement=\"bottom\"\n *ngIf=\"id != null\">\n <span nz-icon nzType=\"layout\"></span>\n \u0641\u06CC\u0644\u062A\u0631 \u0647\u0627\u06CC \u0630\u062E\u06CC\u0631\u0647 \u0634\u062F\u0647\n </button>\n <button nz-button (click)=\"refresh()\" nzType=\"default\">\n <span nz-icon nzType=\"sync\"></span>\n \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC\n </button>\n <!-- <button nz-button (click)=\"advancedFilter()\" *ngIf=\"showAdvancedButton\" nzType=\"default\">\n <span nz-icon nzType=\"filter\"></span>\n \u062C\u0633\u062A\u062C\u0648\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\n </button> -->\n </div>\n</div>\n<ng-template #contentTemplate class=\"w-full\">\n <div class=\"grid gap-x-4 pt-4\" [ngClass]=\"{ 'grid-cols-1': _filterBoxItems.length == 1, 'grid-cols-2': _filterBoxItems.length > 1 }\">\n <div *ngFor=\"let item of _filterBoxItems\" [ngClass]=\"{ 'col-span-2': item.type == 'date' || item.type == 'date-time' }\">\n <div *ngIf=\"item.type == 'date' || item.type == 'date-time'\" class=\"grid grid-cols-2 gap-x-4\">\n <nz-form-item>\n <nz-form-label>\u0627\u0632 \u062A\u0627\u0631\u06CC\u062E</nz-form-label>\n <nz-form-control>\n <qeydar-date-picker\n [ngModel]=\"item.value != null ? item.value[0] : null\"\n (onChangeValue)=\"changeDatePickerValue($event, item, 0)\"\n [showToday]=\"true\"\n [allowEmpty]=\"true\"\n [calendarType]=\"'jalali'\"\n format=\"yyyy-MM-dd\"\n [rtl]=\"true\"></qeydar-date-picker>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label>\u062A\u0627 \u062A\u0627\u0631\u06CC\u062E</nz-form-label>\n <nz-form-control>\n <qeydar-date-picker\n [ngModel]=\"item.value != null ? item.value[1] : null\"\n (onChangeValue)=\"changeDatePickerValue($event, item, 1)\"\n [showToday]=\"true\"\n [allowEmpty]=\"true\"\n [calendarType]=\"'jalali'\"\n format=\"yyyy-MM-dd\"\n [rtl]=\"true\"></qeydar-date-picker>\n </nz-form-control>\n </nz-form-item>\n </div>\n <div *ngIf=\"item.type == 'enum' || item.type == 'select' || item.type == 'boolean'\">\n <nz-form-item class=\"w-full\">\n <nz-form-label>{{ item.label }}</nz-form-label>\n <nz-select class=\"w-full\" [(ngModel)]=\"item.value\" nzShowSearch>\n <nz-option *ngFor=\"let item2 of item.items\" [nzValue]=\"item2.value\" [nzLabel]=\"item2.label\"></nz-option>\n </nz-select>\n </nz-form-item>\n </div>\n <div *ngIf=\"item.type == 'tree-select'\">\n <nz-form-item class=\"w-full\">\n <nz-form-label>{{ item.label }}</nz-form-label>\n <nz-tree-select class=\"w-full\" [nzNodes]=\"item.nodes\" nzShowSearch [(ngModel)]=\"item.value\"></nz-tree-select>\n </nz-form-item>\n </div>\n <div *ngIf=\"item.type == 'string' || item.type == null\">\n <nz-form-item class=\"w-full\">\n <nz-form-label>{{ item.label }}</nz-form-label>\n <input type=\"text\" nz-input [(ngModel)]=\"item.value\" />\n </nz-form-item>\n </div>\n </div>\n </div>\n <div class=\"flex gap-2 pt-4 mt-4 border-t border-t-slate-200\">\n <button nz-button nzType=\"primary\" (click)=\"filter()\">\u0627\u0639\u0645\u0627\u0644</button>\n <button nz-button nzType=\"default\" (click)=\"clearFilter()\">\u067E\u0627\u06A9\u0633\u0627\u0632\u06CC \u0648 \u0628\u0633\u062A\u0646</button>\n </div>\n</ng-template>\n<!-- template items box -->\n<ng-template #contentFilterTemplate class=\"w-full\">\n <ul class=\"flex flex-col gap-2 max-h-[300px]\">\n <li class=\"p-2 rounded-lg cursor-pointer border border-slate-200\" *ngFor=\"let item of filterTemplateItems\" (click)=\"setTemplateFilter(item)\">{{ item.title }}</li>\n </ul>\n</ng-template>\n<div class=\"flex items-center justify-between gap-2 px-4 py-2 h-14\" *ngIf=\"isToolbar\">\n <div class=\"flex items-center gap-2\">\n <span class=\"font-medium text-sm text-blue-500\">\u0641\u06CC\u0644\u062A\u0631\u0647\u0627\u06CC \u0627\u0639\u0645\u0627\u0644 \u0634\u062F\u0647:</span>\n <ul class=\"flex items-center gap-2\">\n <li class=\"bg-white border border-slate-200 rounded-md px-2 py-1 flex items-center gap-1 h-8\" *ngIf=\"filterItemsValues.length == 0\">\n <span class=\"text-slate-800 font-medium text-sm\">\u0628\u062F\u0648\u0646 \u0641\u06CC\u0644\u062A\u0631</span>\n </li>\n <li class=\"bg-white border border-slate-200 rounded-md px-2 py-1 flex items-center gap-1 h-8\" *ngFor=\"let item of filterItemsValues\">\n <label class=\"text-slate-500 text-sm\">{{ item.label }}:</label>\n <span class=\"text-slate-800 font-medium text-sm\">{{ item.value | translate }}</span>\n <i class=\"fa-regular fa-times cursor-pointer ps-2\" (click)=\"removeFilter(item)\"></i>\n </li>\n </ul>\n </div>\n <div class=\"flex items-center gap-2\" *ngIf=\"id != null\">\n <button nz-button nzType=\"default\" *ngIf=\"filterItemsValues.length > 0 || gridId != null\" (click)=\"saveFilterGrid()\">\n {{ gridId == null ? '\u0630\u062E\u06CC\u0631\u0647 \u0641\u06CC\u0644\u062A\u0631' : '\u0627\u0639\u0645\u0627\u0644 \u062A\u063A\u06CC\u06CC\u0631\u0627\u062A \u0641\u06CC\u0644\u062A\u0631' }}\n </button>\n <button nz-button nzType=\"default\" *ngIf=\"gridId != null\" (click)=\"clearFilter(); gridId = null\">\u0644\u063A\u0648</button>\n </div>\n</div>\n\n<nz-modal [(nzVisible)]=\"isVisibleModal\" nzTitle=\"\u0627\u0641\u0632\u0648\u062F\u0646 \u0642\u0627\u0644\u0628 \u062C\u062F\u06CC\u062F\" (nzOnCancel)=\"handleCancelModal()\" (nzOnOk)=\"handleOkModal()\">\n <ng-container *nzModalContent>\n <nz-form-item class=\"w-full\">\n <nz-form-label>\u0639\u0646\u0648\u0627\u0646 \u0642\u0627\u0644\u0628</nz-form-label>\n <input type=\"text\" nz-input [(ngModel)]=\"templateName\" />\n </nz-form-item>\n </ng-container>\n</nz-modal>\n\n<ag-grid-angular\n style=\"width: 100%\"\n [style]=\"isToolbar ? 'height: calc(100% - 1rem - 124px);' : 'height: 100%;'\"\n [columnDefs]=\"columnDefs\"\n [pagination]=\"true\"\n [paginationPageSize]=\"paginationPageSize\"\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\"\n [class]=\"themeClass\"\n [rowHeight]=\"48\"\n [defaultColDef]=\"defaultColDef\"\n [enableAdvancedFilter]=\"enableAdvancedFilter\"\n [enableRtl]=\"rtl\"\n [treeData]=\"treeModel\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [isServerSideGroup]=\"isServerSideGroup\"\n [getServerSideGroupKey]=\"getServerSideGroupKey\"\n [rowModelType]=\"rowModelType\"\n [rowData]=\"rowData\"\n [serverSideDatasource]=\"datasource\"\n (gridReady)=\"onGridReady($event)\"\n [cacheBlockSize]=\"paginationPageSize\"\n [maxBlocksInCache]=\"2\"\n [context]=\"{ actionItems: actionItems }\"\n (cellDoubleClicked)=\"cellDoubleClicked($event)\"\n [autoSizeStrategy]=\"_autoColumnSize\"\n [rowSelection]=\"_rowSelection\"\n (selectionChanged)=\"selectionChanged($event)\"\n [theme]=\"\"\n [getRowClass]=\"getRowClass\"\n #grid />\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "enableStrictPivotColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressMoveWhenColumnDragging", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "suppressSetFilterByDefault", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "dragAndDropImageComponent", "dragAndDropImageComponentParams", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "loading", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDuration", "cellFlashDelay", "cellFadeDuration", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "suppressGroupMaintainValueType", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideInfiniteScroll", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "cellSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "selectionColumnDef", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "enableGroupEdit", "initialState", "theme", "loadThemeGoogleFonts", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "focusGridInnerElement", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "cellSelectionDeleteStart", "cellSelectionDeleteEnd", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "dragCancelled", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "rowDragCancel", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "headerFocused", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "cellSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged"] }, { kind: "directive", type: i5.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i7.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i8.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i9.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i9.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "directive", type: i12.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i12.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i13.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i13.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i13.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "component", type: i14.NzOptionComponent, selector: "nz-option", inputs: ["nzTitle", "nzLabel", "nzValue", "nzKey", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i14.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i15.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckBoxChange"], exportAs: ["nzTreeSelect"] }, { kind: "directive", type: i16.NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle", "nzPopoverBackdrop"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { kind: "component", type: i17.DatePickerComponent, selector: "qeydar-date-picker", inputs: ["rtl", "mode", "isRange", "customLabels", "calendarType", "lang", "cssClass", "footerDescription", "rangeInputLabels", "inputLabel", "placement", "disabled", "isInline", "showSidebar", "showToday", "valueFormat", "disableInputMask", "disabledDates", "disabledDatesFilter", "disabledTimesFilter", "allowEmpty", "readOnly", "readOnlyInput", "minDate", "maxDate", "format"], outputs: ["onFocus", "onBlur", "onChangeValue", "onOpenChange"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
583
907
  }
584
908
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GridComponent, decorators: [{
585
909
  type: Component,
586
- args: [{ selector: 'app-grid', template: "<!-- <button (click)=\"enableAdvancedFilter=!enableAdvancedFilter\">advanced</button> -->\n<div\n class=\"flex justify-between items-center mb-4 pb-4 border-b border-b-slate-200\"\n *ngIf=\"isToolbar\"\n>\n <div>\n <h4 class=\"font-semibold text-2xl\">{{ label }}</h4>\n </div>\n <div class=\"flex gap-3\">\n @for (item of toolbarItems; track $index) {\n <button\n nz-button\n [nzLoading]=\"item.loading ? item.loading : false\"\n (click)=\"handleClick(item)\"\n [nzType]=\"item.type\"\n >\n <span nz-icon [nzType]=\"item.icon\"></span>\n {{ item.text }}\n </button>\n }\n <button nz-button (click)=\"refresh()\" nzType=\"default\">\n <span nz-icon nzType=\"sync\"></span>\n \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC\n </button>\n <button nz-button (click)=\"clearFilter()\" nzType=\"default\">\n <span nz-icon nzType=\"clear\"></span>\n \u067E\u0627\u06A9\u0633\u0627\u0632\u06CC\n </button>\n\n <!-- <button nz-button (click)=\"advancedFilter()\" *ngIf=\"showAdvancedButton\" nzType=\"default\">\n <span nz-icon nzType=\"filter\"></span>\n \u062C\u0633\u062A\u062C\u0648\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\n </button> -->\n </div>\n</div>\n<div>\n <ng-content></ng-content>\n</div>\n<ag-grid-angular\n style=\"width: 100%\"\n [style]=\"isToolbar ? 'height: calc(100% - 1rem - 48px);' : 'height: 100%;'\"\n [columnDefs]=\"columnDefs\"\n [pagination]=\"true\"\n [paginationPageSize]=\"paginationPageSize\"\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\"\n [class]=\"themeClass\"\n [defaultColDef]=\"defaultColDef\"\n [enableAdvancedFilter]=\"enableAdvancedFilter\"\n [enableRtl]=\"rtl\"\n [treeData]=\"treeModel\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [isServerSideGroup]=\"isServerSideGroup\"\n [getServerSideGroupKey]=\"getServerSideGroupKey\"\n [rowModelType]=\"rowModelType\"\n [rowData]=\"rowData\"\n [serverSideDatasource]=\"datasource\"\n (gridReady)=\"onGridReady($event)\"\n [cacheBlockSize]=\"paginationPageSize\"\n [maxBlocksInCache]=\"2\"\n [context]=\"{ actionItems: actionItems }\"\n (cellDoubleClicked)=\"cellDoubleClicked($event)\"\n [autoSizeStrategy]=\"_autoColumnSize\"\n [rowSelection]=\"_rowSelection\"\n (selectionChanged)=\"selectionChanged($event)\"\n #grid\n/>\n" }]
587
- }], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { onAction: [{
910
+ args: [{ selector: 'app-grid', template: "<!-- <button (click)=\"enableAdvancedFilter=!enableAdvancedFilter\">advanced</button> -->\n<div class=\"flex justify-between items-center py-4 border-b border-b-slate-200 mx-4\" *ngIf=\"isToolbar\">\n <div>\n <h4 class=\"font-semibold text-2xl\">{{ label }}</h4>\n </div>\n <div class=\"flex gap-3\">\n @for (item of toolbarItems; track $index) {\n <button nz-button [nzLoading]=\"item.loading ? item.loading : false\" (click)=\"handleClick(item)\" [nzType]=\"item.type\">\n <span nz-icon [nzType]=\"item.icon\"></span>\n {{ item.text }}\n </button>\n }\n <button\n nz-button\n nzType=\"default\"\n nz-popover\n nzPopoverTitle=\"\"\n [(nzPopoverVisible)]=\"visibleFilterBox\"\n nzPopoverTrigger=\"click\"\n [nzPopoverContent]=\"contentTemplate\"\n nzPopoverOverlayClassName=\"filter-popover\"\n nzPopoverPlacement=\"bottom\"\n *ngIf=\"_filterBoxItems.length > 0\">\n <span nz-icon nzType=\"filter\"></span>\n \u0641\u06CC\u0644\u062A\u0631\n </button>\n <button\n nz-button\n nzType=\"default\"\n class=\"flex items-center\"\n nz-popover\n nzPopoverTitle=\"\"\n [(nzPopoverVisible)]=\"visibleFilterTemplateBox\"\n nzPopoverTrigger=\"click\"\n [nzPopoverContent]=\"contentFilterTemplate\"\n nzPopoverOverlayClassName=\"filter-popover-sm\"\n nzPopoverPlacement=\"bottom\"\n *ngIf=\"id != null\">\n <span nz-icon nzType=\"layout\"></span>\n \u0641\u06CC\u0644\u062A\u0631 \u0647\u0627\u06CC \u0630\u062E\u06CC\u0631\u0647 \u0634\u062F\u0647\n </button>\n <button nz-button (click)=\"refresh()\" nzType=\"default\">\n <span nz-icon nzType=\"sync\"></span>\n \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC\n </button>\n <!-- <button nz-button (click)=\"advancedFilter()\" *ngIf=\"showAdvancedButton\" nzType=\"default\">\n <span nz-icon nzType=\"filter\"></span>\n \u062C\u0633\u062A\u062C\u0648\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\n </button> -->\n </div>\n</div>\n<ng-template #contentTemplate class=\"w-full\">\n <div class=\"grid gap-x-4 pt-4\" [ngClass]=\"{ 'grid-cols-1': _filterBoxItems.length == 1, 'grid-cols-2': _filterBoxItems.length > 1 }\">\n <div *ngFor=\"let item of _filterBoxItems\" [ngClass]=\"{ 'col-span-2': item.type == 'date' || item.type == 'date-time' }\">\n <div *ngIf=\"item.type == 'date' || item.type == 'date-time'\" class=\"grid grid-cols-2 gap-x-4\">\n <nz-form-item>\n <nz-form-label>\u0627\u0632 \u062A\u0627\u0631\u06CC\u062E</nz-form-label>\n <nz-form-control>\n <qeydar-date-picker\n [ngModel]=\"item.value != null ? item.value[0] : null\"\n (onChangeValue)=\"changeDatePickerValue($event, item, 0)\"\n [showToday]=\"true\"\n [allowEmpty]=\"true\"\n [calendarType]=\"'jalali'\"\n format=\"yyyy-MM-dd\"\n [rtl]=\"true\"></qeydar-date-picker>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label>\u062A\u0627 \u062A\u0627\u0631\u06CC\u062E</nz-form-label>\n <nz-form-control>\n <qeydar-date-picker\n [ngModel]=\"item.value != null ? item.value[1] : null\"\n (onChangeValue)=\"changeDatePickerValue($event, item, 1)\"\n [showToday]=\"true\"\n [allowEmpty]=\"true\"\n [calendarType]=\"'jalali'\"\n format=\"yyyy-MM-dd\"\n [rtl]=\"true\"></qeydar-date-picker>\n </nz-form-control>\n </nz-form-item>\n </div>\n <div *ngIf=\"item.type == 'enum' || item.type == 'select' || item.type == 'boolean'\">\n <nz-form-item class=\"w-full\">\n <nz-form-label>{{ item.label }}</nz-form-label>\n <nz-select class=\"w-full\" [(ngModel)]=\"item.value\" nzShowSearch>\n <nz-option *ngFor=\"let item2 of item.items\" [nzValue]=\"item2.value\" [nzLabel]=\"item2.label\"></nz-option>\n </nz-select>\n </nz-form-item>\n </div>\n <div *ngIf=\"item.type == 'tree-select'\">\n <nz-form-item class=\"w-full\">\n <nz-form-label>{{ item.label }}</nz-form-label>\n <nz-tree-select class=\"w-full\" [nzNodes]=\"item.nodes\" nzShowSearch [(ngModel)]=\"item.value\"></nz-tree-select>\n </nz-form-item>\n </div>\n <div *ngIf=\"item.type == 'string' || item.type == null\">\n <nz-form-item class=\"w-full\">\n <nz-form-label>{{ item.label }}</nz-form-label>\n <input type=\"text\" nz-input [(ngModel)]=\"item.value\" />\n </nz-form-item>\n </div>\n </div>\n </div>\n <div class=\"flex gap-2 pt-4 mt-4 border-t border-t-slate-200\">\n <button nz-button nzType=\"primary\" (click)=\"filter()\">\u0627\u0639\u0645\u0627\u0644</button>\n <button nz-button nzType=\"default\" (click)=\"clearFilter()\">\u067E\u0627\u06A9\u0633\u0627\u0632\u06CC \u0648 \u0628\u0633\u062A\u0646</button>\n </div>\n</ng-template>\n<!-- template items box -->\n<ng-template #contentFilterTemplate class=\"w-full\">\n <ul class=\"flex flex-col gap-2 max-h-[300px]\">\n <li class=\"p-2 rounded-lg cursor-pointer border border-slate-200\" *ngFor=\"let item of filterTemplateItems\" (click)=\"setTemplateFilter(item)\">{{ item.title }}</li>\n </ul>\n</ng-template>\n<div class=\"flex items-center justify-between gap-2 px-4 py-2 h-14\" *ngIf=\"isToolbar\">\n <div class=\"flex items-center gap-2\">\n <span class=\"font-medium text-sm text-blue-500\">\u0641\u06CC\u0644\u062A\u0631\u0647\u0627\u06CC \u0627\u0639\u0645\u0627\u0644 \u0634\u062F\u0647:</span>\n <ul class=\"flex items-center gap-2\">\n <li class=\"bg-white border border-slate-200 rounded-md px-2 py-1 flex items-center gap-1 h-8\" *ngIf=\"filterItemsValues.length == 0\">\n <span class=\"text-slate-800 font-medium text-sm\">\u0628\u062F\u0648\u0646 \u0641\u06CC\u0644\u062A\u0631</span>\n </li>\n <li class=\"bg-white border border-slate-200 rounded-md px-2 py-1 flex items-center gap-1 h-8\" *ngFor=\"let item of filterItemsValues\">\n <label class=\"text-slate-500 text-sm\">{{ item.label }}:</label>\n <span class=\"text-slate-800 font-medium text-sm\">{{ item.value | translate }}</span>\n <i class=\"fa-regular fa-times cursor-pointer ps-2\" (click)=\"removeFilter(item)\"></i>\n </li>\n </ul>\n </div>\n <div class=\"flex items-center gap-2\" *ngIf=\"id != null\">\n <button nz-button nzType=\"default\" *ngIf=\"filterItemsValues.length > 0 || gridId != null\" (click)=\"saveFilterGrid()\">\n {{ gridId == null ? '\u0630\u062E\u06CC\u0631\u0647 \u0641\u06CC\u0644\u062A\u0631' : '\u0627\u0639\u0645\u0627\u0644 \u062A\u063A\u06CC\u06CC\u0631\u0627\u062A \u0641\u06CC\u0644\u062A\u0631' }}\n </button>\n <button nz-button nzType=\"default\" *ngIf=\"gridId != null\" (click)=\"clearFilter(); gridId = null\">\u0644\u063A\u0648</button>\n </div>\n</div>\n\n<nz-modal [(nzVisible)]=\"isVisibleModal\" nzTitle=\"\u0627\u0641\u0632\u0648\u062F\u0646 \u0642\u0627\u0644\u0628 \u062C\u062F\u06CC\u062F\" (nzOnCancel)=\"handleCancelModal()\" (nzOnOk)=\"handleOkModal()\">\n <ng-container *nzModalContent>\n <nz-form-item class=\"w-full\">\n <nz-form-label>\u0639\u0646\u0648\u0627\u0646 \u0642\u0627\u0644\u0628</nz-form-label>\n <input type=\"text\" nz-input [(ngModel)]=\"templateName\" />\n </nz-form-item>\n </ng-container>\n</nz-modal>\n\n<ag-grid-angular\n style=\"width: 100%\"\n [style]=\"isToolbar ? 'height: calc(100% - 1rem - 124px);' : 'height: 100%;'\"\n [columnDefs]=\"columnDefs\"\n [pagination]=\"true\"\n [paginationPageSize]=\"paginationPageSize\"\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\"\n [class]=\"themeClass\"\n [rowHeight]=\"48\"\n [defaultColDef]=\"defaultColDef\"\n [enableAdvancedFilter]=\"enableAdvancedFilter\"\n [enableRtl]=\"rtl\"\n [treeData]=\"treeModel\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [isServerSideGroup]=\"isServerSideGroup\"\n [getServerSideGroupKey]=\"getServerSideGroupKey\"\n [rowModelType]=\"rowModelType\"\n [rowData]=\"rowData\"\n [serverSideDatasource]=\"datasource\"\n (gridReady)=\"onGridReady($event)\"\n [cacheBlockSize]=\"paginationPageSize\"\n [maxBlocksInCache]=\"2\"\n [context]=\"{ actionItems: actionItems }\"\n (cellDoubleClicked)=\"cellDoubleClicked($event)\"\n [autoSizeStrategy]=\"_autoColumnSize\"\n [rowSelection]=\"_rowSelection\"\n (selectionChanged)=\"selectionChanged($event)\"\n [theme]=\"\"\n [getRowClass]=\"getRowClass\"\n #grid />\n" }]
911
+ }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }], propDecorators: { onAction: [{
588
912
  type: Output
589
913
  }], onToolbar: [{
590
914
  type: Output
@@ -596,6 +920,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
596
920
  type: Input
597
921
  }], label: [{
598
922
  type: Input
923
+ }], id: [{
924
+ type: Input
599
925
  }], isRowSelection: [{
600
926
  type: Input
601
927
  }], rowModelType: [{
@@ -630,9 +956,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
630
956
  type: Input
631
957
  }], treeGroupColumn: [{
632
958
  type: Input
959
+ }], filterItems: [{
960
+ type: Input
633
961
  }], fetchData: [{
634
962
  type: Input
635
963
  }], column: [{
636
964
  type: Input
637
965
  }] } });
638
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBeUUsY0FBYyxFQUErRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9NLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7QUFpQmhELE1BQU0sT0FBTyxhQUFhO0lBQ3RCLFlBQ1ksVUFBNEI7UUFBNUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFNakMsMEJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLHlCQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLHFCQUFnQixHQUFXLElBQUksQ0FBQztRQUN4QyxrQkFBYSxHQUF3QjtZQUNqQyxJQUFJLEVBQUUsV0FBVztZQUNqQixVQUFVLEVBQUUsS0FBSztTQUNwQixDQUFDO1FBRUYsZUFBVSxHQUFXLGlCQUFpQixDQUFDO1FBQ3ZDLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFDNUIsb0JBQWUsR0FBd0csRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDaEosdUJBQWtCLEdBQVc7WUFDekIsVUFBVSxFQUFFLEVBQUU7WUFDZCxR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LElBQUksRUFBRSxDQUFDO2dCQUNsQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELFFBQVEsS0FBVyxDQUFDOytHQTFtQlgsYUFBYTttR0FBYixhQUFhLHF6QkN2QjFCLGkxRUFrRUE7OzRGRDNDYSxhQUFhO2tCQUp6QixTQUFTOytCQUNJLFVBQVU7cUZBOENwQixRQUFRO3NCQURQLE1BQU07Z0JBSVAsU0FBUztzQkFEUixNQUFNO2dCQUlQLFNBQVM7c0JBRFIsTUFBTTtnQkFJUCxrQkFBa0I7c0JBRGpCLE1BQU07Z0JBSVAsV0FBVztzQkFEVixLQUFLO2dCQUlOLEtBQUs7c0JBREosS0FBSztnQkFJSyxjQUFjO3NCQUR4QixLQUFLO2dCQTZCTixZQUFZO3NCQURYLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixHQUFHO3NCQURGLEtBQUs7Z0JBSU4sa0JBQWtCO3NCQURqQixLQUFLO2dCQUlOLDBCQUEwQjtzQkFEekIsS0FBSztnQkFJTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSUssY0FBYztzQkFEeEIsS0FBSztnQkFhTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQWVOLFlBQVk7c0JBRFgsS0FBSztnQkFpQkssZUFBZTtzQkFEekIsS0FBSztnQkF5Qk4sU0FBUztzQkFEUixLQUFLO2dCQUlLLE1BQU07c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZWxsRG91YmxlQ2xpY2tlZEV2ZW50LCBDb2xEZWYsIEdyaWRBcGksIEdyaWRPcHRpb25zLCBJRGF0ZUZpbHRlclBhcmFtcywgSVJvd05vZGUsIElTZXJ2ZXJTaWRlRGF0YXNvdXJjZSwgSVNlcnZlclNpZGVHZXRSb3dzUGFyYW1zLCBJU2VydmVyU2lkZUdyb3VwU2VsZWN0aW9uU3RhdGUsIFJvd01vZGVsVHlwZSwgUm93U2VsZWN0aW9uT3B0aW9ucywgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LCBTZXRGaWx0ZXJWYWx1ZXNGdW5jUGFyYW1zLCBTaXplQ29sdW1uc1RvQ29udGVudFN0cmF0ZWd5LCBTaXplQ29sdW1uc1RvRml0R3JpZFN0cmF0ZWd5LCBTaXplQ29sdW1uc1RvRml0UHJvdmlkZWRXaWR0aFN0cmF0ZWd5IH0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uSXRlbXMsIENvbHVtbkl0ZW1zLCBEYXRhc291cmNlT3V0cHV0TW9kZWwsIEZpbHRlckdyaWRJdGVtc01vZGVsLCBGaWx0ZXJPcGVyYXRvciwgR3JpZEFjdGlvbk91dHB1dCwgR3JpZElucHV0TW9kZWwsIEdyaWRSZXF1ZXN0UGFyYW0sIFNvcnRNb2RlbCwgVG9vbGJhckl0ZW1zIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NoYXJlZC5tb2RlbCc7XG5pbXBvcnQgeyBBY3Rpb25zQ2VsbFJlbmRlcmVyIH0gZnJvbSAnLi4vaW5kZXguYXBpJztcbmltcG9ydCB7IEpEYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2RhdGUucGlwZSc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyIH0gZnJvbSAnLi9maWx0ZXIvaW5kZXguYXBpJztcbmV4cG9ydCBpbnRlcmZhY2UgSU9seW1waWNEYXRhIHtcbiAgICBhdGhsZXRlOiBzdHJpbmcsXG4gICAgYWdlOiBudW1iZXIsXG4gICAgY291bnRyeTogc3RyaW5nLFxuICAgIHllYXI6IG51bWJlcixcbiAgICBkYXRlOiBzdHJpbmcsXG4gICAgc3BvcnQ6IHN0cmluZyxcbiAgICBnb2xkOiBudW1iZXIsXG4gICAgc2lsdmVyOiBudW1iZXIsXG4gICAgYnJvbnplOiBudW1iZXIsXG4gICAgdG90YWw6IG51bWJlclxufVxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZSA9IHRoaXMuY3JlYXRlU2VydmVyU2lkZURhdGFzb3VyY2UoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBncmlkQXBpITogR3JpZEFwaTtcbiAgICBwdWJsaWMgaXNTZXJ2ZXJTaWRlR3JvdXA7XG4gICAgcHVibGljIGdldFNlcnZlclNpZGVHcm91cEtleSA9IG51bGw7XG4gICAgcHVibGljIGdyb3VwRGVmYXVsdEV4cGFuZGVkID0gLTE7XG4gICAgcHJpdmF0ZSBfdHJlZUdyb3VwQ29sdW1uOiBzdHJpbmcgPSBudWxsO1xuICAgIF9yb3dTZWxlY3Rpb246IFJvd1NlbGVjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIG1vZGU6ICdzaW5nbGVSb3cnLFxuICAgICAgICBjaGVja2JveGVzOiBmYWxzZVxuICAgIH07XG4gICAgZGF0YXNvdXJjZTogSVNlcnZlclNpZGVEYXRhc291cmNlO1xuICAgIHRoZW1lQ2xhc3M6IHN0cmluZyA9IFwiYWctdGhlbWUtcXVhcnR6XCI7XG4gICAgY29sdW1uRGVmczogQ29sRGVmW10gPSBbXTtcbiAgICBfY29sdW1uOiBDb2x1bW5JdGVtc1tdID0gW107XG4gICAgX2F1dG9Db2x1bW5TaXplOiBTaXplQ29sdW1uc1RvRml0R3JpZFN0cmF0ZWd5IHwgU2l6ZUNvbHVtbnNUb0ZpdFByb3ZpZGVkV2lkdGhTdHJhdGVneSB8IFNpemVDb2x1bW5zVG9Db250ZW50U3RyYXRlZ3kgPSB7IHR5cGU6ICdmaXRHcmlkV2lkdGgnIH07XG4gICAgYXV0b0dyb3VwQ29sdW1uRGVmOiBDb2xEZWYgPSB7XG4gICAgICAgIGhlYWRlck5hbWU6IFwiXCIsXG4gICAgICAgIG1pbldpZHRoOiAyNTAsXG4gICAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgICAgY2VsbFJlbmRlcmVyUGFyYW1zOiB7XG4gICAgICAgICAgICBzdXBwcmVzc0NvdW50OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXJQYXJhbXM6IHtcbiAgICAgICAgICAgIG1heE51bUNvbmRpdGlvbnM6IDFcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XG4gICAgICAgIGZsZXg6IDEsXG4gICAgICAgIG1pbldpZHRoOiAxNTAsXG4gICAgICAgIGZpbHRlcjogJ2FnVGV4dENvbHVtbkZpbHRlcicsXG4gICAgICAgIHN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgc3VwcHJlc3NIZWFkZXJDb250ZXh0TWVudTogdHJ1ZSxcbiAgICAgICAgc3VwcHJlc3NTaXplVG9GaXQ6IHRydWVcbiAgICB9O1xuXG5cbiAgICBAT3V0cHV0KClcbiAgICBvbkFjdGlvbjogRXZlbnRFbWl0dGVyPEdyaWRBY3Rpb25PdXRwdXQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgb25Ub29sYmFyOiBFdmVudEVtaXR0ZXI8VG9vbGJhckl0ZW1zPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICByb3dTZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQElucHV0KClcbiAgICBhY3Rpb25XaWR0aDogbnVtYmVyID0gMTAwO1xuXG4gICAgQElucHV0KClcbiAgICBsYWJlbDogc3RyaW5nID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBpc1Jvd1NlbGVjdGlvbih2OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICB0aGlzLl9yb3dTZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ211bHRpUm93JyxcbiAgICAgICAgICAgICAgICBjaGVja2JveGVzOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3Rpb25DaGFuZ2VkKGU6IFNlbGVjdGlvbkNoYW5nZWRFdmVudCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICBlLmFwaS5mb3JFYWNoTm9kZSgoZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChlbC5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGVsLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dTZWxlY3Rpb25DaGFuZ2UuZW1pdChpdGVtcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgdGhpcy5ncmlkQXBpLnNlbGVjdEFsbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXNlbGVjdEFsbCgpIHtcbiAgICAgICAgdGhpcy5ncmlkQXBpLmRlc2VsZWN0QWxsKCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICByb3dNb2RlbFR5cGU6IFJvd01vZGVsVHlwZSA9ICdzZXJ2ZXJTaWRlJztcblxuICAgIEBJbnB1dCgpXG4gICAgc2VydmVyU2lkZVNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBzZXJ2ZXJTaWRlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgaXNUb29sYmFyOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcnRsOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcGFnaW5hdGlvblBhZ2VTaXplID0gMjU7XG5cbiAgICBASW5wdXQoKVxuICAgIHBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yOiBudW1iZXJbXSB8IGJvb2xlYW4gPSBbMjVdO1xuXG4gICAgQElucHV0KClcbiAgICBlbmFibGVBZHZhbmNlZEZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICB0cmVlTW9kZWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgaXNMZWFmOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHJvd0RhdGE6IGFueSA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYXV0b0NvbHVtblNpemUoKTogU2l6ZUNvbHVtbnNUb0ZpdEdyaWRTdHJhdGVneSB8IFNpemVDb2x1bW5zVG9GaXRQcm92aWRlZFdpZHRoU3RyYXRlZ3kgfCBTaXplQ29sdW1uc1RvQ29udGVudFN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9Db2x1bW5TaXplO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGF1dG9Db2x1bW5TaXplKHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9Db2x1bW5TaXplID0geyB0eXBlOiAnZml0Q2VsbENvbnRlbnRzJyB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYXV0b0NvbHVtblNpemUgPSB7IHR5cGU6ICdmaXRHcmlkV2lkdGgnIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHZhbmNlZEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGFjdGlvbkl0ZW1zOiBBY3Rpb25JdGVtc1tdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb2RlOiAnZWRpdCcsXG4gICAgICAgICAgICBpY29uOiAnZmEtbGlnaHQgZmEtcGVuJyxcbiAgICAgICAgICAgIGFsdDogJ9mI24zYsdin24zYtCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgY29kZTogJ2RlbGV0ZScsXG4gICAgICAgICAgICBpY29uOiAnZmEtbGlnaHQgZmEtdHJhc2gnLFxuICAgICAgICAgICAgYWx0OiAn2K3YsNmBJ1xuICAgICAgICB9XG4gICAgXTtcblxuICAgIEBJbnB1dCgpXG4gICAgdG9vbGJhckl0ZW1zOiBUb29sYmFySXRlbXNbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgY29kZTogJ2luc2VydCcsXG4gICAgICAgICAgICBpY29uOiAncGx1cycsXG4gICAgICAgICAgICB0ZXh0OiAn2KfbjNis2KfYryDYsdiv24zZgSDYrNiv24zYrycsXG4gICAgICAgICAgICB0eXBlOiAncHJpbWFyeSdcbiAgICAgICAgfSxcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY29kZTogJ3JlZnJlc2gnLFxuICAgICAgICAvLyAgICAgaWNvbjogJ3N5bmMnLFxuICAgICAgICAvLyAgICAgdGV4dDogJ9io2LHZiNiy2LHYs9in2YbbjCcsXG4gICAgICAgIC8vICAgICB0eXBlOiAnZGVmYXVsdCdcbiAgICAgICAgLy8gfVxuICAgIF07XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdHJlZUdyb3VwQ29sdW1uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlR3JvdXBDb2x1bW47XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdHJlZUdyb3VwQ29sdW1uKHY6IHN0cmluZykge1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgdGhpcy5fdHJlZUdyb3VwQ29sdW1uID0gdjtcbiAgICAgICAgICAgIHRoaXMuaXNTZXJ2ZXJTaWRlR3JvdXAgPSBkYXRhSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWFmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YUl0ZW0ubGFzdE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUl0ZW1bdl07XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhSXRlbVt2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXJTaWRlR3JvdXBLZXkgPSBkYXRhSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFJdGVtW3ZdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmLmhlYWRlck5hbWUgPSB2O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBmZXRjaERhdGE6IChmaWx0ZXJHcmlkOiBHcmlkSW5wdXRNb2RlbCwgcmVxdWVzdFBhcmFtczogR3JpZFJlcXVlc3RQYXJhbSkgPT4gUHJvbWlzZTxEYXRhc291cmNlT3V0cHV0TW9kZWw+O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtbih2OiBDb2x1bW5JdGVtc1tdKSB7XG4gICAgICAgIHRoaXMuY29sdW1uRGVmcyA9IFtdO1xuICAgICAgICBpZiAodiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSB2O1xuICAgICAgICAgICAgdi5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXI6IGFueSA9ICdhZ1RleHRDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgIHZhciBzb3J0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlclBhcmFtczogSURhdGVGaWx0ZXJQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1heE51bUNvbmRpdGlvbnM6IDFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZWwudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICdhZ051bWJlckNvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXMuZmlsdGVyT3B0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVtcHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnWUVTJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZTogKCkgPT4gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZJbnB1dHM6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUtleTogJ2ZhbHNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdOTycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mSW5wdXRzOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICdhZ051bWJlckNvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBlbC5maWx0ZXJJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiBlbC5maWx0ZXJJdGVtc1twcm9wZXJ0eV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChlbC5maWx0ZXJJdGVtc1twcm9wZXJ0eV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mSW5wdXRzOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcy5maWx0ZXJPcHRpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnTnVtYmVyQ29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnU2V0Q29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnVGV4dENvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdEYXRlQ29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnVGV4dENvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsLmZpbHRlciAhPSB1bmRlZmluZWQgJiYgIWVsLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsLnNvcnRhYmxlICE9IHVuZGVmaW5lZCAmJiAhZWwuc29ydGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsLmZpZWxkICE9IHRoaXMuX3RyZWVHcm91cENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwudHlwZSAmJiBlbC50eXBlID09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbElkOiBlbC5pZCA/IGVsLmlkIDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWU6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbm5lZDogZWwucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDbGFzczogJ2FnLWJvb2xlYW4tY2VsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXMudmFsdWUgPyAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgc3Ryb2tlPVwiZ3JlZW5cIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItY2hlY2tcIj48cGF0aCBkPVwiTTIwIDZMOSAxN0w0IDEyXCIvPjwvc3ZnPicgOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3Ryb2tlPVwicmVkXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwiZmVhdGhlciBmZWF0aGVyLXhcIj48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiIC8+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIiAvPjwvc3ZnPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgJiYgZWwudHlwZSA9PSAnZW51bScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJZDogZWwuaWQgPyBlbC5pZCA6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZWwuZWRpdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiBlbC5waW5uZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGVsLm1pbldpZHRoID8gZWwubWluV2lkdGggOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChwYXJhbXMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbC50eXBlICYmIGVsLnR5cGUgPT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSWQ6IGVsLmlkID8gZWwuaWQgOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBEYXRlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbm5lZDogZWwucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKRGF0ZVBpcGUoKS50cmFuc2Zvcm0ocGFyYW1zLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZWwudHlwZSAmJiBlbC50eXBlID09ICdkYXRlLXRpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSWQ6IGVsLmlkID8gZWwuaWQgOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBEYXRlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbm5lZDogZWwucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKRGF0ZVBpcGUoKS50cmFuc2Zvcm0ocGFyYW1zLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwudHlwZSAmJiBlbC50eXBlID09ICdwcmljZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJZDogZWwuaWQgPyBlbC5pZCA6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZWwuZWRpdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGVsLm1pbldpZHRoID8gZWwubWluV2lkdGggOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5uZWQ6IGVsLnBpbm5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXMudmFsdWUudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwudHlwZSAmJiBlbC50eXBlID09ICdpbWFnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJZDogZWwuaWQgPyBlbC5pZCA6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogODAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiBlbC5waW5uZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgY2xhc3M9XCJyb3VuZGVkLWZ1bGwgbXQtMVwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHNyYz1cIiR7cGFyYW1zLnZhbHVlfVwiLz5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJZDogZWwuaWQgPyBlbC5pZCA6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGVsLmVkaXRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5uZWQ6IGVsLnBpbm5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZi5maWVsZCA9IGVsLmZpZWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogJycsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiB0aGlzLmFjdGlvbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICByZXNpemFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHBpbm5lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2FjdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IEFjdGlvbnNDZWxsUmVuZGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlclBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogKHBhcmFtczogR3JpZEFjdGlvbk91dHB1dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25BY3Rpb24uZW1pdChwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNlbGxEb3VibGVDbGlja2VkKGU6IENlbGxEb3VibGVDbGlja2VkRXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIHRoaXMub25DbGlja2VkLmVtaXQoeyAuLi5lLmRhdGEsIGNvbElkOiBlLmNvbHVtbi5nZXRDb2xJZCgpIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrKGl0ZW06IFRvb2xiYXJJdGVtcykge1xuICAgICAgICB0aGlzLm9uVG9vbGJhci5lbWl0KGl0ZW0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoKHB1cmdlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMucm93TW9kZWxUeXBlID09ICdzZXJ2ZXJTaWRlJykge1xuICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnJlZnJlc2hTZXJ2ZXJTaWRlKHsgcHVyZ2UgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm93RGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnJlZnJlc2hDZWxscygpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnNldEdyaWRPcHRpb24oJ2NvbHVtbkRlZnMnLCB0aGlzLmNvbHVtbkRlZnMpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnNldEdyaWRPcHRpb24oJ2xvYWRpbmcnLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhKG51bGwsIG51bGwpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dEYXRhID0gZGF0YS5pdGVtcztcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBcGkuc2V0R3JpZE9wdGlvbignbG9hZGluZycsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25HcmlkUmVhZHkocGFyYW1zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQXBpID0gcGFyYW1zLmFwaTtcbiAgICAgICAgaWYgKHRoaXMucm93TW9kZWxUeXBlID09ICdjbGllbnRTaWRlJykge1xuICAgICAgICAgICAgdGhpcy5mZXRjaERhdGEobnVsbCwgbnVsbCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0RhdGEgPSBkYXRhLml0ZW1zO1xuICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5mYWlsKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkdmFuY2VkRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmVuYWJsZUFkdmFuY2VkRmlsdGVyID0gIXRoaXMuZW5hYmxlQWR2YW5jZWRGaWx0ZXI7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnNob3dBZHZhbmNlZEZpbHRlckJ1aWxkZXIoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhZy1pY29uLW1heGltaXplJylbMF0gYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9LCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSb3V0ZVRvTm9kZShyb3dOb2RlOiBJUm93Tm9kZSk6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKCFyb3dOb2RlLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi50aGlzLmdldFJvdXRlVG9Ob2RlKHJvd05vZGUucGFyZW50KSxcbiAgICAgICAgICAgIHJvd05vZGUua2V5ID8gcm93Tm9kZS5rZXkgOiByb3dOb2RlLmRhdGEuZW1wbG95ZWVOYW1lLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHJlZnJlc2hOb2RlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5ncmlkQXBpLmdldFJvd05vZGUoaWQpO1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuZ2V0Um91dGVUb05vZGUoc2VsZWN0ZWRSb3dzKTtcbiAgICAgICAgdGhpcy5ncmlkQXBpLnJlZnJlc2hTZXJ2ZXJTaWRlKHtcbiAgICAgICAgICAgIHB1cmdlOiB0cnVlLFxuICAgICAgICAgICAgcm91dGU6IHJvdXRlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNsZWFyRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmdyaWRBcGkuc2V0RmlsdGVyTW9kZWwobnVsbCk7XG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHJlZnJlc2hQYXJlbnROb2RlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5ncmlkQXBpLmdldFJvd05vZGUoaWQpO1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuZ2V0Um91dGVUb05vZGUoc2VsZWN0ZWRSb3dzLnBhcmVudCk7XG4gICAgICAgIHRoaXMuZ3JpZEFwaS5yZWZyZXNoU2VydmVyU2lkZSh7XG4gICAgICAgICAgICBwdXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIHJvdXRlOiByb3V0ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVTZXJ2ZXJTaWRlRGF0YXNvdXJjZSgpOiBJU2VydmVyU2lkZURhdGFzb3VyY2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0Um93czogKHBhcmFtczogSVNlcnZlclNpZGVHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlcjogRmlsdGVyR3JpZEl0ZW1zTW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZURhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmZpbHRlclR5cGUgPT0gJ2N1c3RvbS1kYXRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmRhdGVGcm9tICYmIHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZVRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5maWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDoga2V5ID09ICdhZy1HcmlkLUF1dG9Db2x1bW4nID8gdGhpcy5fdHJlZUdyb3VwQ29sdW1uIDoga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLmJldHdlZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZURhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW3BhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZUZyb20sIHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZVRvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZUZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBrZXkgPT0gJ2FnLUdyaWQtQXV0b0NvbHVtbicgPyB0aGlzLl90cmVlR3JvdXBDb2x1bW4gOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpYzogJ0FORCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IudHJ1bmNHcmVhdGVyVGhhbkVxdWFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVEYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZUZyb20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5kYXRlVG8gJiYgcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5kYXRlVG8gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZmlsdGVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGtleSA9PSAnYWctR3JpZC1BdXRvQ29sdW1uJyA/IHRoaXMuX3RyZWVHcm91cENvbHVtbiA6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljOiAnQU5EJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci50cnVuY0xlc3NUaGFuT3JFcXVhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlRGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmRhdGVUbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBGaWx0ZXJPcGVyYXRvcltwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLnR5cGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZ25vcmVDYXNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kRWwgPSB0aGlzLl9jb2x1bW4uZmluZCgoZWwpID0+IGVsLmZpZWxkID09IGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICdhZy1HcmlkLUF1dG9Db2x1bW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gdGhpcy5fdHJlZUdyb3VwQ29sdW1uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEVsLnNlYXJjaEZpZWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZmluZEVsLnNlYXJjaEZpZWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kRWwgJiYgZmluZEVsLnR5cGUgPT0gJ2VudW0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0aW9uID8gb3BlcmF0aW9uIDogRmlsdGVyT3BlcmF0b3IuZXF1YWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZURhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmZpbHRlciA/IHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZmlsdGVyIDogcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc29ydHM6IFNvcnRNb2RlbFtdID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5yZXF1ZXN0LnNvcnRNb2RlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZEVsID0gdGhpcy5fY29sdW1uLmZpbmQoKGVsKSA9PiBlbC5maWVsZCA9PSBwYXJhbXMucmVxdWVzdC5zb3J0TW9kZWxbMF0uY29sSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEVsLnNlYXJjaEZpZWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRzID0gW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI6IHBhcmFtcy5yZXF1ZXN0LnNvcnRNb2RlbFswXS5zb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBmaW5kRWwuc2VhcmNoRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydHMgPSBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogcGFyYW1zLnJlcXVlc3Quc29ydE1vZGVsWzBdLnNvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHBhcmFtcy5yZXF1ZXN0LnNvcnRNb2RlbFswXS5jb2xJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZEZpbHRlcjogR3JpZElucHV0TW9kZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2U6IHBhcmFtcy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2tpcDogcGFyYW1zLmFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSAqIHBhcmFtcy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIHNvcnRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0UGFyYW1zOiBHcmlkUmVxdWVzdFBhcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlOiBwYXJhbXMucGFyZW50Tm9kZS5kYXRhXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoRGF0YShncmlkRmlsdGVyLCByZXF1ZXN0UGFyYW1zKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc3VjY2Vzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiBkYXRhLml0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQ6IGRhdGEudG90YWxDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvd01vZGVsVHlwZSA9PSAnc2VydmVyU2lkZScgJiYgdGhpcy5ncmlkQXBpLmdldFNlcnZlclNpZGVTZWxlY3Rpb25TdGF0ZSgpWydzZWxlY3RBbGwnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZhaWwoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHsgfVxufSIsIjwhLS0gPGJ1dHRvbiAoY2xpY2spPVwiZW5hYmxlQWR2YW5jZWRGaWx0ZXI9IWVuYWJsZUFkdmFuY2VkRmlsdGVyXCI+YWR2YW5jZWQ8L2J1dHRvbj4gLS0+XG48ZGl2XG4gIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIG1iLTQgcGItNCBib3JkZXItYiBib3JkZXItYi1zbGF0ZS0yMDBcIlxuICAqbmdJZj1cImlzVG9vbGJhclwiXG4+XG4gIDxkaXY+XG4gICAgPGg0IGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LTJ4bFwiPnt7IGxhYmVsIH19PC9oND5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0zXCI+XG4gICAgQGZvciAoaXRlbSBvZiB0b29sYmFySXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgIDxidXR0b25cbiAgICAgIG56LWJ1dHRvblxuICAgICAgW256TG9hZGluZ109XCJpdGVtLmxvYWRpbmcgPyBpdGVtLmxvYWRpbmcgOiBmYWxzZVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soaXRlbSlcIlxuICAgICAgW256VHlwZV09XCJpdGVtLnR5cGVcIlxuICAgID5cbiAgICAgIDxzcGFuIG56LWljb24gW256VHlwZV09XCJpdGVtLmljb25cIj48L3NwYW4+XG4gICAgICB7eyBpdGVtLnRleHQgfX1cbiAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgPGJ1dHRvbiBuei1idXR0b24gKGNsaWNrKT1cInJlZnJlc2goKVwiIG56VHlwZT1cImRlZmF1bHRcIj5cbiAgICAgIDxzcGFuIG56LWljb24gbnpUeXBlPVwic3luY1wiPjwvc3Bhbj5cbiAgICAgINio2LHZiNiy2LHYs9in2YbbjFxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gbnotYnV0dG9uIChjbGljayk9XCJjbGVhckZpbHRlcigpXCIgbnpUeXBlPVwiZGVmYXVsdFwiPlxuICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJjbGVhclwiPjwvc3Bhbj5cbiAgICAgINm+2Kfaqdiz2KfYstuMXG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIDxidXR0b24gbnotYnV0dG9uIChjbGljayk9XCJhZHZhbmNlZEZpbHRlcigpXCIgKm5nSWY9XCJzaG93QWR2YW5jZWRCdXR0b25cIiBuelR5cGU9XCJkZWZhdWx0XCI+XG4gICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cImZpbHRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgINis2LPYqtis2YjbjCDZvtuM2LTYsdmB2KrZh1xuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2PlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbjxhZy1ncmlkLWFuZ3VsYXJcbiAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXG4gIFtzdHlsZV09XCJpc1Rvb2xiYXIgPyAnaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNDhweCk7JyA6ICdoZWlnaHQ6IDEwMCU7J1wiXG4gIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIlxuICBbcGFnaW5hdGlvbl09XCJ0cnVlXCJcbiAgW3BhZ2luYXRpb25QYWdlU2l6ZV09XCJwYWdpbmF0aW9uUGFnZVNpemVcIlxuICBbcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JcIlxuICBbY2xhc3NdPVwidGhlbWVDbGFzc1wiXG4gIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIlxuICBbZW5hYmxlQWR2YW5jZWRGaWx0ZXJdPVwiZW5hYmxlQWR2YW5jZWRGaWx0ZXJcIlxuICBbZW5hYmxlUnRsXT1cInJ0bFwiXG4gIFt0cmVlRGF0YV09XCJ0cmVlTW9kZWxcIlxuICBbYXV0b0dyb3VwQ29sdW1uRGVmXT1cImF1dG9Hcm91cENvbHVtbkRlZlwiXG4gIFtpc1NlcnZlclNpZGVHcm91cF09XCJpc1NlcnZlclNpZGVHcm91cFwiXG4gIFtnZXRTZXJ2ZXJTaWRlR3JvdXBLZXldPVwiZ2V0U2VydmVyU2lkZUdyb3VwS2V5XCJcbiAgW3Jvd01vZGVsVHlwZV09XCJyb3dNb2RlbFR5cGVcIlxuICBbcm93RGF0YV09XCJyb3dEYXRhXCJcbiAgW3NlcnZlclNpZGVEYXRhc291cmNlXT1cImRhdGFzb3VyY2VcIlxuICAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudClcIlxuICBbY2FjaGVCbG9ja1NpemVdPVwicGFnaW5hdGlvblBhZ2VTaXplXCJcbiAgW21heEJsb2Nrc0luQ2FjaGVdPVwiMlwiXG4gIFtjb250ZXh0XT1cInsgYWN0aW9uSXRlbXM6IGFjdGlvbkl0ZW1zIH1cIlxuICAoY2VsbERvdWJsZUNsaWNrZWQpPVwiY2VsbERvdWJsZUNsaWNrZWQoJGV2ZW50KVwiXG4gIFthdXRvU2l6ZVN0cmF0ZWd5XT1cIl9hdXRvQ29sdW1uU2l6ZVwiXG4gIFtyb3dTZWxlY3Rpb25dPVwiX3Jvd1NlbGVjdGlvblwiXG4gIChzZWxlY3Rpb25DaGFuZ2VkKT1cInNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICNncmlkXG4vPlxuIl19
966
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRyxPQUFPLEVBQXdKLGNBQWMsRUFBb0csTUFBTSwyQkFBMkIsQ0FBQztBQUNuVCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHNUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCOUIsTUFBTSxPQUFPLGFBQWE7SUFDdEIsWUFDWSxVQUE0QixFQUM1QixJQUF1QixFQUN2QixNQUFvQjtRQUZwQixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUM1QixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixXQUFNLEdBQU4sTUFBTSxDQUFjO1FBTXpCLDBCQUFxQixHQUFHLElBQUksQ0FBQztRQUM3Qix5QkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QixxQkFBZ0IsR0FBVyxJQUFJLENBQUM7UUFDeEMsa0JBQWEsR0FBd0I7WUFDakMsSUFBSSxFQUFFLFdBQVc7WUFDakIsVUFBVSxFQUFFLEtBQUs7U0FDcEIsQ0FBQztRQUVGLGVBQVUsR0FBVyxpQkFBaUIsQ0FBQztRQUN2QyxlQUFVLEdBQWEsRUFBRSxDQUFDO1FBQzFCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUM1QixvQkFBZSxHQUFxQixFQUFFLENBQUM7UUFDdkMsc0JBQWlCLEdBQTZCLEVBQUUsQ0FBQztRQUNqRCx3QkFBbUIsR0FBMEIsRUFBRSxDQUFDO1FBQ2hELDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUMxQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxjQUFTLEdBQW1CLElBQUksQ0FBQztRQUNqQyxpQkFBWSxHQUFXLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQVcsSUFBSSxDQUFDO1FBRXRCLG9CQUFlLEdBQXdHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ2hKLHVCQUFrQixHQUFXO1lBQ3pCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsUUFBUSxFQUFFLEdBQUc7WUFDYixRQUFRLEVBQUUsS0FBSztZQUNmLGtCQUFrQixFQUFFO2dCQUNoQixhQUFhLEVBQUUsSUFBSTthQUN0QjtZQUNELFlBQVksRUFBRTtnQkFDVixnQkFBZ0IsRUFBRSxDQUFDO2FBQ3RCO1NBQ0osQ0FBQztRQUVGLGtCQUFhLEdBQVc7WUFDcEIsSUFBSSxFQUFFLENBQUM7WUFDUCxRQUFRLEVBQUUsR0FBRztZQUNiLE1BQU0sRUFBRSxvQkFBb0I7WUFDNUIsd0JBQXdCLEVBQUUsSUFBSTtZQUM5Qix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLGlCQUFpQixFQUFFLElBQUk7U0FDMUIsQ0FBQztRQVdGLGFBQVEsR0FBbUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUc5RCxjQUFTLEdBQStCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHM0QsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2xELHVCQUFrQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzNELGdCQUFXLEdBQVcsR0FBRyxDQUFDO1FBRzFCLFVBQUssR0FBVyxJQUFJLENBQUM7UUFHckIsT0FBRSxHQUFXLElBQUksQ0FBQztRQStCbEIsaUJBQVksR0FBaUIsWUFBWSxDQUFDO1FBRzFDLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBRy9CLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUdqQyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRzFCLFFBQUcsR0FBWSxJQUFJLENBQUM7UUFHcEIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBR3hCLCtCQUEwQixHQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBR3RELHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUd0QyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRzNCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsWUFBTyxHQUFRLElBQUksQ0FBQztRQWVwQix1QkFBa0IsR0FBWSxJQUFJLENBQUM7UUFHbkMsZ0JBQVcsR0FBa0I7WUFDekI7Z0JBQ0ksSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsR0FBRyxFQUFFLFFBQVE7YUFDaEI7WUFDRDtnQkFDSSxJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixHQUFHLEVBQUUsS0FBSzthQUNiO1NBQ0osQ0FBQztRQUdGLGlCQUFZLEdBQW1CO1lBQzNCO2dCQUNJLElBQUksRUFBRSxRQUFRO2dCQUNkLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLElBQUksRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsSUFBSTtZQUNKLHVCQUF1QjtZQUN2QixvQkFBb0I7WUFDcEIseUJBQXlCO1lBQ3pCLHNCQUFzQjtZQUN0QixJQUFJO1NBQ1AsQ0FBQztRQXBMRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUE4Q0QsV0FBVyxDQUFDLE1BQU07UUFDZCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxPQUFPLFNBQVMsQ0FBQTtRQUNwQixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBd0JELElBQ1csY0FBYyxDQUFDLENBQVU7UUFDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUc7Z0JBQ2pCLElBQUksRUFBRSxVQUFVO2dCQUNoQixVQUFVLEVBQUUsSUFBSTthQUNuQixDQUFBO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxDQUF3QjtRQUNyQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNyQixJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxTQUFTO1FBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQW1DRCxJQUNXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFXLGNBQWMsQ0FBQyxDQUFVO1FBQ2hDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDSixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ3BELENBQUM7SUFDTCxDQUFDO0lBbUNELElBQ1csZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQVcsZUFBZSxDQUFDLENBQVM7UUFDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNKLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7d0JBQ2xCLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDOzt3QkFFbkIsT0FBTyxLQUFLLENBQUE7Z0JBQ3BCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztZQUNMLENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUMsRUFBRTtnQkFDcEMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDO1lBQ0YsMENBQTBDO1FBQzlDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFDVyxXQUFXLENBQUMsQ0FBcUI7UUFDeEMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQzdGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFOzRCQUN0QixJQUFJLEtBQUssR0FBd0IsRUFBRSxDQUFDOzRCQUNwQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7Z0NBQzNCLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUE0QixFQUF1QixFQUFFO29DQUMvRSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dDQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0NBQ2pCLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzt3Q0FDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7d0NBQ2hFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7cUNBQ3JFLENBQUMsQ0FBQyxDQUFDO2dDQUNSLENBQUMsQ0FBQTtnQ0FDRCxLQUFLLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RDLENBQUM7NEJBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0NBQ3RCLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDZixLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7Z0NBQ2YsS0FBSyxFQUFFLElBQUk7Z0NBQ1gsS0FBSyxFQUFFLEdBQUc7Z0NBQ1YsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO2dDQUNiLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRO2dDQUM5QyxLQUFLOzZCQUNSLENBQUMsQ0FBQzt3QkFDUCxDQUFDLENBQUMsQ0FBQztvQkFDUCxDQUFDO3lCQUFNLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQzs0QkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOzRCQUN0QyxLQUFLLEVBQUUsSUFBSTt5QkFDZCxFQUFFOzRCQUNDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7NEJBQ3ZDLEtBQUssRUFBRSxLQUFLO3lCQUNmLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQzs0QkFDdEIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLOzRCQUNmLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSzs0QkFDZixLQUFLLEVBQUUsSUFBSTs0QkFDWCxLQUFLOzRCQUNMLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTs0QkFDYixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUTs0QkFDOUMsS0FBSyxFQUFFLEVBQUU7eUJBQ1osQ0FBQyxDQUFDO29CQUNQLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQzs0QkFDdEIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLOzRCQUNmLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSzs0QkFDZixLQUFLLEVBQUUsSUFBSTs0QkFDWCxLQUFLOzRCQUNMLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTs0QkFDYixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUTs0QkFDOUMsS0FBSyxFQUFFLEVBQUU7eUJBQ1osQ0FBQyxDQUFDO29CQUNQLENBQUM7Z0JBRUwsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQztJQUNMLENBQUM7SUFLRCxJQUNXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLENBQWdCO1FBQzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO29CQUNiLElBQUksTUFBTSxHQUFRLG9CQUFvQixDQUFDO29CQUN2QyxJQUFJLFFBQVEsR0FBWSxJQUFJLENBQUM7b0JBQzdCLElBQUksWUFBWSxHQUFzQjt3QkFDbEMsZ0JBQWdCLEVBQUUsQ0FBQztxQkFDdEIsQ0FBQztvQkFDRixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDZCxLQUFLLFNBQVM7NEJBQ1YsTUFBTSxHQUFHLHNCQUFzQixDQUFDOzRCQUNoQyxZQUFZLENBQUMsYUFBYSxHQUFHO2dDQUN6QixPQUFPO2dDQUNQO29DQUNJLFVBQVUsRUFBRSxNQUFNO29DQUNsQixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29DQUMzQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtvQ0FDckIsY0FBYyxFQUFFLENBQUM7aUNBQ3BCO2dDQUNEO29DQUNJLFVBQVUsRUFBRSxPQUFPO29DQUNuQixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO29DQUMxQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtvQ0FDckIsY0FBYyxFQUFFLENBQUM7aUNBQ3BCOzZCQUNKLENBQUM7NEJBQ0YsTUFBTTt3QkFDVixLQUFLLE1BQU07NEJBQ1AsTUFBTSxHQUFHLHNCQUFzQixDQUFDOzRCQUNoQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQ2pCLEtBQUssTUFBTSxRQUFRLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dDQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDO29DQUNQLFVBQVUsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztvQ0FDcEMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7b0NBQzlELFNBQVMsRUFBRSxJQUFJO29DQUNmLGNBQWMsRUFBRSxDQUFDO2lDQUNwQixDQUFDLENBQUE7NEJBQ04sQ0FBQzs0QkFDRCxZQUFZLENBQUMsYUFBYSxHQUFHO2dDQUN6QixPQUFPO2dDQUNQLEdBQUcsS0FBSzs2QkFDWCxDQUFDOzRCQUNGLE1BQU07d0JBQ1YsS0FBSyxRQUFROzRCQUNULE1BQU0sR0FBRyxzQkFBc0IsQ0FBQzs0QkFDaEMsTUFBTTt3QkFDVixLQUFLLFFBQVE7NEJBQ1QsTUFBTSxHQUFHLG1CQUFtQixDQUFDOzRCQUM3QixNQUFNO3dCQUNWLEtBQUssUUFBUTs0QkFDVCxNQUFNLEdBQUcsb0JBQW9CLENBQUM7NEJBQzlCLE1BQU07d0JBQ1YsS0FBSyxNQUFNOzRCQUNQLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQzs0QkFDOUIsTUFBTTt3QkFDVjs0QkFDSSxNQUFNLEdBQUcsb0JBQW9CLENBQUM7NEJBQzlCLE1BQU07b0JBQ2QsQ0FBQztvQkFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDOUYsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDbkIsQ0FBQztvQkFDRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUMvRSxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNuQixDQUFDO29CQUNELElBQUksRUFBRSxDQUFDLFFBQVEsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzNDLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQ3JCLENBQUM7b0JBQ0QsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUNwQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQzs0QkFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztnQ0FDL0IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO2dDQUNmLFVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDcEIsTUFBTSxFQUFFLE1BQU07Z0NBQ2QsUUFBUTtnQ0FDUixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7Z0NBQ3JCLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJO2dDQUMxQyxZQUFZO2dDQUNaLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtnQ0FDakIsU0FBUyxFQUFFLGlCQUFpQjtnQ0FDNUIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29DQUNuQixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7d0NBQ3ZCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMscVFBQXFRLENBQUMsQ0FBQyxDQUFDLGdUQUFnVCxDQUFDO29DQUNubEIsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNKLE9BQU8sRUFBRSxDQUFDO29DQUNkLENBQUM7Z0NBQ0wsQ0FBQzs2QkFDSixDQUFDLENBQUE7d0JBQ04sQ0FBQzs2QkFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztnQ0FDL0IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO2dDQUNmLFVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDcEIsTUFBTSxFQUFFLE1BQU07Z0NBQ2QsUUFBUTtnQ0FDUixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7Z0NBQ3JCLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtnQ0FDakIsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0NBQzFDLFlBQVk7Z0NBQ1osWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29DQUNuQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3Q0FDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDakQsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNKLE9BQU8sRUFBRSxDQUFDO29DQUNkLENBQUM7Z0NBQ0wsQ0FBQzs2QkFDSixDQUFDLENBQUE7d0JBQ04sQ0FBQzs2QkFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztnQ0FDL0IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO2dDQUNmLFVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDcEIsTUFBTSxFQUFFLFVBQVU7Z0NBQ2xCLFFBQVE7Z0NBQ1IsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO2dDQUNyQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQ0FDMUMsWUFBWTtnQ0FDWixNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07Z0NBQ2pCLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRTtvQ0FDbkIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7d0NBQ2YsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0NBQ25ELENBQUM7eUNBQU0sQ0FBQzt3Q0FDSixPQUFPLEVBQUUsQ0FBQztvQ0FDZCxDQUFDO2dDQUNMLENBQUM7NkJBQ0osQ0FBQyxDQUFBO3dCQUNOLENBQUM7NkJBQ0ksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7NEJBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO2dDQUNqQixLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7Z0NBQy9CLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDZixVQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUs7Z0NBQ3BCLE1BQU0sRUFBRSxVQUFVO2dDQUNsQixRQUFRO2dDQUNSLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtnQ0FDckIsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0NBQzFDLFlBQVk7Z0NBQ1osTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO2dDQUNqQixZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0NBQ25CLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO3dDQUNmLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztvQ0FDeEIsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNKLE9BQU8sRUFBRSxDQUFDO29DQUNkLENBQUM7Z0NBQ0wsQ0FBQzs2QkFDSixDQUFDLENBQUE7d0JBQ04sQ0FBQzs2QkFDSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQzs0QkFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztnQ0FDL0IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO2dDQUNmLFVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDcEIsTUFBTSxFQUFFLFVBQVU7Z0NBQ2xCLFFBQVE7Z0NBQ1IsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO2dDQUNyQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQ0FDMUMsWUFBWTtnQ0FDWixNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07Z0NBQ2pCLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRTtvQ0FDbkIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7d0NBQ2YsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO29DQUN6RCxDQUFDO3lDQUFNLENBQUM7d0NBQ0osT0FBTyxFQUFFLENBQUM7b0NBQ2QsQ0FBQztnQ0FDTCxDQUFDOzZCQUNKLENBQUMsQ0FBQTt3QkFDTixDQUFDOzZCQUFNLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDOzRCQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQ0FDakIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLO2dDQUMvQixLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7Z0NBQ2YsVUFBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLO2dDQUNwQixNQUFNLEVBQUUsTUFBTTtnQ0FDZCxRQUFRO2dDQUNSLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtnQ0FDckIsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0NBQzFDLFlBQVk7Z0NBQ1osTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO2dDQUNqQixZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0NBQ25CLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO3dDQUNmLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQ0FDekMsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNKLE9BQU8sRUFBRSxDQUFDO29DQUNkLENBQUM7Z0NBQ0wsQ0FBQzs2QkFDSixDQUFDLENBQUE7d0JBQ04sQ0FBQzs2QkFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztnQ0FDL0IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO2dDQUNmLFVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDcEIsUUFBUSxFQUFFLEVBQUU7Z0NBQ1osS0FBSyxFQUFFLEVBQUU7Z0NBQ1QsTUFBTSxFQUFFLE1BQU07Z0NBQ2QsUUFBUSxFQUFFLEtBQUs7Z0NBQ2YsUUFBUSxFQUFFLEtBQUs7Z0NBQ2YsWUFBWTtnQ0FDWixNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07Z0NBQ2pCLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRTtvQ0FDbkIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7d0NBQ2YsT0FBTyw4REFBOEQsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDO29DQUMzRixDQUFDO3lDQUFNLENBQUM7d0NBQ0osT0FBTyxFQUFFLENBQUM7b0NBQ2QsQ0FBQztnQ0FDTCxDQUFDOzZCQUNKLENBQUMsQ0FBQTt3QkFDTixDQUFDOzZCQUNJLENBQUM7NEJBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztnQ0FDL0IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO2dDQUNmLFVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSztnQ0FDcEIsTUFBTTtnQ0FDTixRQUFRO2dDQUNSLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtnQ0FDckIsWUFBWTtnQ0FDWixNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07Z0NBQ2pCLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJOzZCQUM3QyxDQUFDLENBQUE7d0JBQ04sQ0FBQztvQkFDTCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUM3QyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO29CQUNsRSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ2YsSUFBSSxFQUFFLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUN6QixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDZCxLQUFLLE1BQU07Z0NBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0NBQ3pDLEtBQUssQ0FBQyxJQUFJLENBQUM7d0NBQ1AsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7d0NBQ3BELEtBQUssRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztxQ0FDOUIsQ0FBQyxDQUFBO2dDQUNOLENBQUMsQ0FBQyxDQUFDO2dDQUNILE1BQU07NEJBQ1YsS0FBSyxTQUFTO2dDQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29DQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDO3dDQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0NBQ3RDLEtBQUssRUFBRSxJQUFJO3FDQUNkLEVBQUU7d0NBQ0MsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzt3Q0FDdkMsS0FBSyxFQUFFLEtBQUs7cUNBQ2YsQ0FBQyxDQUFBO2dDQUNOLENBQUMsQ0FBQyxDQUFDO2dDQUNILE1BQU07d0JBQ2QsQ0FBQztvQkFDTCxDQUFDO29CQUNELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO3dCQUN0QixLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7d0JBQ2YsS0FBSyxFQUFFLElBQUk7d0JBQ1gsS0FBSzt3QkFDTCxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7d0JBQ2IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO3dCQUNmLFFBQVEsRUFBRSxRQUFRO3dCQUNsQixLQUFLLEVBQUUsRUFBRTtxQkFDWixDQUFDLENBQUE7Z0JBQ04sQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7d0JBQ2pCLE1BQU0sRUFBRSxLQUFLO3dCQUNiLFVBQVUsRUFBRSxFQUFFO3dCQUNkLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDMUIsU0FBUyxFQUFFLElBQUk7d0JBQ2YsTUFBTSxFQUFFLElBQUk7d0JBQ1osUUFBUSxFQUFFLEtBQUs7d0JBQ2YsS0FBSyxFQUFFLFNBQVM7d0JBQ2hCLFlBQVksRUFBRSxtQkFBbUI7d0JBQ2pDLGtCQUFrQixFQUFFOzRCQUNoQixPQUFPLEVBQUUsQ0FBQyxNQUF3QixFQUFFLEVBQUU7Z0NBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUMvQixDQUFDO3lCQUNKO3FCQUNKLENBQUMsQ0FBQTtnQkFDTixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsSUFBb0IsRUFBRSxLQUFLO1FBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxDQUF5QjtRQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFrQjtRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4RCxPQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ0osRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUM3QyxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztvQkFDbkIsR0FBRyxHQUFHO29CQUNOLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDdkIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0QsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDO0lBRUwsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsT0FBTTtRQUNWLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUM7WUFDbkIsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSztRQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFXO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDVixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN6QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNYLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwRixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxjQUFjLENBQUMsT0FBaUI7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPO1lBQ0gsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZO1NBQ3hELENBQUM7SUFDTixDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQVU7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQzNCLEtBQUssRUFBRSxJQUFJO1lBQ1gsS0FBSyxFQUFFLEtBQUs7U0FDZixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQVU7UUFDeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztZQUMzQixLQUFLLEVBQUUsSUFBSTtZQUNYLEtBQUssRUFBRSxLQUFLO1NBQ2YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUF5QjtRQUN2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkcsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDdEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO3dCQUM1QyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUs7d0JBQ2QsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLO3FCQUNuQixDQUFDLENBQUM7Z0JBQ1AsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDOUIsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQsc0JBQXNCO1FBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNWLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQzt3QkFDeEIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO3dCQUNmLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSzt3QkFDZixLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7cUJBQ2xCLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM5QixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6RixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUM1QixDQUFDO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUE0QjtRQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0UsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCwwQkFBMEI7UUFDdEIsT0FBTztZQUNILE9BQU8sRUFBRSxDQUFDLE1BQWdDLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxNQUFNLEdBQXlCLElBQUksQ0FBQztnQkFDeEMsTUFBTSxHQUFHO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLEtBQUssRUFBRSxJQUFJO29CQUNYLEtBQUssRUFBRSxLQUFLO29CQUNaLE9BQU8sRUFBRSxFQUFFO29CQUNYLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxZQUFZLEVBQUUsSUFBSTtvQkFDbEIsS0FBSyxFQUFFLElBQUk7aUJBQ2QsQ0FBQztnQkFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3JELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDM0MsSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzt3QkFDdEUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO3dCQUNqQixJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO3dCQUNyQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7d0JBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3dCQUMxRCxJQUFJLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDOzRCQUM5QixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3dCQUNsQyxDQUFDOzZCQUFNLENBQUM7NEJBQ0osS0FBSyxHQUFHLEdBQUcsQ0FBQzs0QkFDWixJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7Z0NBQzdCLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDOzRCQUMvQixDQUFDO3dCQUNMLENBQUM7d0JBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLElBQUksYUFBYSxFQUFFLENBQUM7NEJBQzlELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dDQUNyRixRQUFRLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQztnQ0FDbEMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUMvRixDQUFDO2lDQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ2xELFFBQVEsR0FBRyxjQUFjLENBQUMscUJBQXFCLENBQUM7Z0NBQ2hELEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7NEJBQ3JELENBQUM7aUNBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dDQUNoRyxRQUFRLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDO2dDQUMvQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDOzRCQUNuRCxDQUFDO3dCQUNMLENBQUM7NkJBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLElBQUksYUFBYSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDckgsUUFBUSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7NEJBQ2pDLEtBQUssR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQzdLLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUN2RCxRQUFRLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNwRSxDQUFDOzRCQUNELFVBQVUsR0FBRyxJQUFJLENBQUM7NEJBQ2xCLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMvSCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dDQUNsQyxVQUFVLEdBQUcsS0FBSyxDQUFDOzRCQUN2QixDQUFDO3dCQUNMLENBQUM7d0JBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDeEYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7NEJBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0NBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQ0FDbkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dDQUNuQixLQUFLLEVBQUUsS0FBSzs2QkFDZixDQUFDLENBQUM7d0JBQ1AsQ0FBQzs2QkFBTSxDQUFDOzRCQUNKLGlCQUFpQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7d0JBQ3BDLENBQUM7d0JBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7NEJBQ2hCLE9BQU8sRUFBRSxLQUFLOzRCQUNkLEtBQUs7NEJBQ0wsS0FBSyxFQUFFLEtBQUs7NEJBQ1osT0FBTyxFQUFFLElBQUk7NEJBQ2IsVUFBVTs0QkFDVixRQUFROzRCQUNSLFlBQVksRUFBRSxJQUFJOzRCQUNsQixLQUFLO3lCQUNSLENBQUMsQ0FBQztvQkFDUCxDQUFDO29CQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQzFCLG9FQUFvRTtnQkFDeEUsQ0FBQztnQkFDRCxJQUFJLEtBQUssR0FBZ0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEYsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUM3QixLQUFLLEdBQUcsQ0FBQztnQ0FDTCxHQUFHLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQ0FDckMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXOzZCQUM1QixDQUFDLENBQUM7b0JBQ1AsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLEtBQUssR0FBRyxDQUFDO2dDQUNMLEdBQUcsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dDQUNyQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSzs2QkFDM0MsQ0FBQyxDQUFDO29CQUNQLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNLFVBQVUsR0FBbUI7b0JBQy9CLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFO29CQUN4QyxJQUFJLEVBQUUsRUFBRTtvQkFDUixNQUFNO29CQUNOLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDaEYsS0FBSztpQkFDUixDQUFDO2dCQUNGLE1BQU0sYUFBYSxHQUFxQjtvQkFDcEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSTtpQkFDckMsQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO29CQUNoQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ25CLElBQUksRUFBRSxDQUFDLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQzs0QkFDMUIsSUFBSSxRQUFRLEdBQW1CLElBQUksQ0FBQzs0QkFDcEMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0NBQ2QsS0FBSyxRQUFRO29DQUNULFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO29DQUNuQyxNQUFNO2dDQUNWLEtBQUssTUFBTSxDQUFDO2dDQUFDLEtBQUssV0FBVztvQ0FDekIsUUFBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7b0NBQ2xDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3Q0FDdEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQ0FDdkQsQ0FBQzt5Q0FBTSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7d0NBQzdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQ0FDM0MsQ0FBQztvQ0FDRCxNQUFNO2dDQUNWO29DQUNJLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO29DQUNqQyxNQUFNOzRCQUNkLENBQUM7NEJBQ0QsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dDQUMzQixPQUFPLEVBQUUsS0FBSztnQ0FDZCxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7Z0NBQ2YsT0FBTyxFQUFFLElBQUk7Z0NBQ2IsVUFBVSxFQUFFLEtBQUs7Z0NBQ2pCLEtBQUssRUFBRSxLQUFLO2dDQUNaLFFBQVE7Z0NBQ1IsWUFBWSxFQUFFLEtBQUs7Z0NBQ25CLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSzs2QkFDbEIsQ0FBQyxDQUFDO3dCQUNQLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO3dCQUN6QyxDQUFDO29CQUNMLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbEQsTUFBTSxDQUFDLE9BQU8sQ0FBQzt3QkFDWCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVTtxQkFDNUIsQ0FBQyxDQUFDO29CQUNILElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7d0JBQy9GLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDckIsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO29CQUNWLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xCLEVBQUUsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDNUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDOytHQXQ2QlEsYUFBYTttR0FBYixhQUFhLDIxQkMxQjFCLHM2U0FnTEE7OzRGRHRKYSxhQUFhO2tCQUp6QixTQUFTOytCQUNJLFVBQVU7Z0pBaUVwQixRQUFRO3NCQURQLE1BQU07Z0JBSVAsU0FBUztzQkFEUixNQUFNO2dCQUlQLFNBQVM7c0JBRFIsTUFBTTtnQkFJUCxrQkFBa0I7c0JBRGpCLE1BQU07Z0JBSVAsV0FBVztzQkFEVixLQUFLO2dCQUlOLEtBQUs7c0JBREosS0FBSztnQkFJTixFQUFFO3NCQURELEtBQUs7Z0JBSUssY0FBYztzQkFEeEIsS0FBSztnQkE2Qk4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sR0FBRztzQkFERixLQUFLO2dCQUlOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFJTiwwQkFBMEI7c0JBRHpCLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlLLGNBQWM7c0JBRHhCLEtBQUs7Z0JBYU4sa0JBQWtCO3NCQURqQixLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFlTixZQUFZO3NCQURYLEtBQUs7Z0JBaUJLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBeUJLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBaUVOLFNBQVM7c0JBRFIsS0FBSztnQkFJSyxNQUFNO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2VsbERvdWJsZUNsaWNrZWRFdmVudCwgQ29sRGVmLCBHcmlkQXBpLCBJRGF0ZUZpbHRlclBhcmFtcywgSVJvd05vZGUsIElTZXJ2ZXJTaWRlRGF0YXNvdXJjZSwgSVNlcnZlclNpZGVHZXRSb3dzUGFyYW1zLCBSb3dNb2RlbFR5cGUsIFJvd1NlbGVjdGlvbk9wdGlvbnMsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCwgU2l6ZUNvbHVtbnNUb0NvbnRlbnRTdHJhdGVneSwgU2l6ZUNvbHVtbnNUb0ZpdEdyaWRTdHJhdGVneSwgU2l6ZUNvbHVtbnNUb0ZpdFByb3ZpZGVkV2lkdGhTdHJhdGVneSB9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS9jb3JlJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb25JdGVtcywgQ29sdW1uSXRlbXMsIERhdGFzb3VyY2VPdXRwdXRNb2RlbCwgRmlsdGVyQm94SXRlbXNNb2RlbCwgRmlsdGVyQm94TW9kZWwsIEZpbHRlckdyaWRJdGVtc01vZGVsLCBGaWx0ZXJJdGVtc01vZGVsLCBGaWx0ZXJJdGVtc1ZhbHVlc01vZGVsLCBGaWx0ZXJPcGVyYXRvciwgRmlsdGVyVGVtcGxhdGVNb2RlbCwgR3JpZEFjdGlvbk91dHB1dCwgR3JpZElucHV0TW9kZWwsIEdyaWRSZXF1ZXN0UGFyYW0sIFNvcnRNb2RlbCwgVG9vbGJhckl0ZW1zIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NoYXJlZC5tb2RlbCc7XG5pbXBvcnQgeyBKRGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9kYXRlLnBpcGUnO1xuaW1wb3J0IHsgQWN0aW9uc0NlbGxSZW5kZXJlciB9IGZyb20gJy4uL2luZGV4LmFwaSc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyLCBUaW1lRmlsdGVyIH0gZnJvbSAnLi9maWx0ZXIvaW5kZXguYXBpJztcbmltcG9ydCB7IE56VHJlZU5vZGVPcHRpb25zIH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2luZGV4LmFwaSc7XG5pbXBvcnQgeyBkYiB9IGZyb20gJy4uLy4uL2RiJztcbmV4cG9ydCBpbnRlcmZhY2UgSU9seW1waWNEYXRhIHtcbiAgICBhdGhsZXRlOiBzdHJpbmcsXG4gICAgYWdlOiBudW1iZXIsXG4gICAgY291bnRyeTogc3RyaW5nLFxuICAgIHllYXI6IG51bWJlcixcbiAgICBkYXRlOiBzdHJpbmcsXG4gICAgc3BvcnQ6IHN0cmluZyxcbiAgICBnb2xkOiBudW1iZXIsXG4gICAgc2lsdmVyOiBudW1iZXIsXG4gICAgYnJvbnplOiBudW1iZXIsXG4gICAgdG90YWw6IG51bWJlclxufVxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIF90b2FzdDogVG9hc3RTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZSA9IHRoaXMuY3JlYXRlU2VydmVyU2lkZURhdGFzb3VyY2UoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBncmlkQXBpITogR3JpZEFwaTtcbiAgICBwdWJsaWMgaXNTZXJ2ZXJTaWRlR3JvdXA7XG4gICAgcHVibGljIGdldFNlcnZlclNpZGVHcm91cEtleSA9IG51bGw7XG4gICAgcHVibGljIGdyb3VwRGVmYXVsdEV4cGFuZGVkID0gLTE7XG4gICAgcHJpdmF0ZSBfdHJlZUdyb3VwQ29sdW1uOiBzdHJpbmcgPSBudWxsO1xuICAgIF9yb3dTZWxlY3Rpb246IFJvd1NlbGVjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIG1vZGU6ICdzaW5nbGVSb3cnLFxuICAgICAgICBjaGVja2JveGVzOiBmYWxzZVxuICAgIH07XG4gICAgZGF0YXNvdXJjZTogSVNlcnZlclNpZGVEYXRhc291cmNlO1xuICAgIHRoZW1lQ2xhc3M6IHN0cmluZyA9IFwiYWctdGhlbWUtcXVhcnR6XCI7XG4gICAgY29sdW1uRGVmczogQ29sRGVmW10gPSBbXTtcbiAgICB2aXNpYmxlRmlsdGVyQm94OiBib29sZWFuID0gZmFsc2U7XG4gICAgX2NvbHVtbjogQ29sdW1uSXRlbXNbXSA9IFtdO1xuICAgIF9maWx0ZXJCb3hJdGVtczogRmlsdGVyQm94TW9kZWxbXSA9IFtdO1xuICAgIGZpbHRlckl0ZW1zVmFsdWVzOiBGaWx0ZXJJdGVtc1ZhbHVlc01vZGVsW10gPSBbXTtcbiAgICBmaWx0ZXJUZW1wbGF0ZUl0ZW1zOiBGaWx0ZXJUZW1wbGF0ZU1vZGVsW10gPSBbXTtcbiAgICB2aXNpYmxlRmlsdGVyVGVtcGxhdGVCb3g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpc1Zpc2libGVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGdyaWRNb2RlbDogR3JpZElucHV0TW9kZWwgPSBudWxsO1xuICAgIHRlbXBsYXRlTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICBncmlkSWQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICBfYXV0b0NvbHVtblNpemU6IFNpemVDb2x1bW5zVG9GaXRHcmlkU3RyYXRlZ3kgfCBTaXplQ29sdW1uc1RvRml0UHJvdmlkZWRXaWR0aFN0cmF0ZWd5IHwgU2l6ZUNvbHVtbnNUb0NvbnRlbnRTdHJhdGVneSA9IHsgdHlwZTogJ2ZpdEdyaWRXaWR0aCcgfTtcbiAgICBhdXRvR3JvdXBDb2x1bW5EZWY6IENvbERlZiA9IHtcbiAgICAgICAgaGVhZGVyTmFtZTogXCJcIixcbiAgICAgICAgbWluV2lkdGg6IDI1MCxcbiAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHtcbiAgICAgICAgICAgIHN1cHByZXNzQ291bnQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGZpbHRlclBhcmFtczoge1xuICAgICAgICAgICAgbWF4TnVtQ29uZGl0aW9uczogMVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRlZmF1bHRDb2xEZWY6IENvbERlZiA9IHtcbiAgICAgICAgZmxleDogMSxcbiAgICAgICAgbWluV2lkdGg6IDE1MCxcbiAgICAgICAgZmlsdGVyOiAnYWdUZXh0Q29sdW1uRmlsdGVyJyxcbiAgICAgICAgc3VwcHJlc3NIZWFkZXJNZW51QnV0dG9uOiB0cnVlLFxuICAgICAgICBzdXBwcmVzc0hlYWRlckNvbnRleHRNZW51OiB0cnVlLFxuICAgICAgICBzdXBwcmVzc1NpemVUb0ZpdDogdHJ1ZVxuICAgIH07XG5cbiAgICBnZXRSb3dDbGFzcyhwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtcy5ub2RlLnJvd0luZGV4ICUgMiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICdyb3ctb2RkJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cblxuICAgIEBPdXRwdXQoKVxuICAgIG9uQWN0aW9uOiBFdmVudEVtaXR0ZXI8R3JpZEFjdGlvbk91dHB1dD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBvblRvb2xiYXI6IEV2ZW50RW1pdHRlcjxUb29sYmFySXRlbXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHJvd1NlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBASW5wdXQoKVxuICAgIGFjdGlvbldpZHRoOiBudW1iZXIgPSAxMDA7XG5cbiAgICBASW5wdXQoKVxuICAgIGxhYmVsOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBpc1Jvd1NlbGVjdGlvbih2OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICB0aGlzLl9yb3dTZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ211bHRpUm93JyxcbiAgICAgICAgICAgICAgICBjaGVja2JveGVzOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3Rpb25DaGFuZ2VkKGU6IFNlbGVjdGlvbkNoYW5nZWRFdmVudCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICBlLmFwaS5mb3JFYWNoTm9kZSgoZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChlbC5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGVsLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dTZWxlY3Rpb25DaGFuZ2UuZW1pdChpdGVtcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgdGhpcy5ncmlkQXBpLnNlbGVjdEFsbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXNlbGVjdEFsbCgpIHtcbiAgICAgICAgdGhpcy5ncmlkQXBpLmRlc2VsZWN0QWxsKCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICByb3dNb2RlbFR5cGU6IFJvd01vZGVsVHlwZSA9ICdzZXJ2ZXJTaWRlJztcblxuICAgIEBJbnB1dCgpXG4gICAgc2VydmVyU2lkZVNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBzZXJ2ZXJTaWRlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgaXNUb29sYmFyOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcnRsOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcGFnaW5hdGlvblBhZ2VTaXplID0gMjU7XG5cbiAgICBASW5wdXQoKVxuICAgIHBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yOiBudW1iZXJbXSB8IGJvb2xlYW4gPSBbMjVdO1xuXG4gICAgQElucHV0KClcbiAgICBlbmFibGVBZHZhbmNlZEZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICB0cmVlTW9kZWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgaXNMZWFmOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHJvd0RhdGE6IGFueSA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYXV0b0NvbHVtblNpemUoKTogU2l6ZUNvbHVtbnNUb0ZpdEdyaWRTdHJhdGVneSB8IFNpemVDb2x1bW5zVG9GaXRQcm92aWRlZFdpZHRoU3RyYXRlZ3kgfCBTaXplQ29sdW1uc1RvQ29udGVudFN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9Db2x1bW5TaXplO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGF1dG9Db2x1bW5TaXplKHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9Db2x1bW5TaXplID0geyB0eXBlOiAnZml0Q2VsbENvbnRlbnRzJyB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYXV0b0NvbHVtblNpemUgPSB7IHR5cGU6ICdmaXRHcmlkV2lkdGgnIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dBZHZhbmNlZEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGFjdGlvbkl0ZW1zOiBBY3Rpb25JdGVtc1tdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb2RlOiAnZWRpdCcsXG4gICAgICAgICAgICBpY29uOiAnZmEtbGlnaHQgZmEtcGVuJyxcbiAgICAgICAgICAgIGFsdDogJ9mI24zYsdin24zYtCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgY29kZTogJ2RlbGV0ZScsXG4gICAgICAgICAgICBpY29uOiAnZmEtbGlnaHQgZmEtdHJhc2gnLFxuICAgICAgICAgICAgYWx0OiAn2K3YsNmBJ1xuICAgICAgICB9XG4gICAgXTtcblxuICAgIEBJbnB1dCgpXG4gICAgdG9vbGJhckl0ZW1zOiBUb29sYmFySXRlbXNbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgY29kZTogJ2luc2VydCcsXG4gICAgICAgICAgICBpY29uOiAncGx1cycsXG4gICAgICAgICAgICB0ZXh0OiAn2KfbjNis2KfYryDYsdiv24zZgSDYrNiv24zYrycsXG4gICAgICAgICAgICB0eXBlOiAncHJpbWFyeSdcbiAgICAgICAgfSxcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY29kZTogJ3JlZnJlc2gnLFxuICAgICAgICAvLyAgICAgaWNvbjogJ3N5bmMnLFxuICAgICAgICAvLyAgICAgdGV4dDogJ9io2LHZiNiy2LHYs9in2YbbjCcsXG4gICAgICAgIC8vICAgICB0eXBlOiAnZGVmYXVsdCdcbiAgICAgICAgLy8gfVxuICAgIF07XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdHJlZUdyb3VwQ29sdW1uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlR3JvdXBDb2x1bW47XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdHJlZUdyb3VwQ29sdW1uKHY6IHN0cmluZykge1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgdGhpcy5fdHJlZUdyb3VwQ29sdW1uID0gdjtcbiAgICAgICAgICAgIHRoaXMuaXNTZXJ2ZXJTaWRlR3JvdXAgPSBkYXRhSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWFmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YUl0ZW0ubGFzdE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUl0ZW1bdl07XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhSXRlbVt2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXJTaWRlR3JvdXBLZXkgPSBkYXRhSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFJdGVtW3ZdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmLmhlYWRlck5hbWUgPSB2O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGZpbHRlckl0ZW1zKHY6IEZpbHRlckl0ZW1zTW9kZWxbXSkge1xuICAgICAgICBpZiAodiAhPSBudWxsICYmIHYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdi5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZmlsdGVyQm94SXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5maWVsZCA9PSBlbC5maWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZWwudHlwZSA9PSAnZW51bScgfHwgZWwudHlwZSA9PSAnc2VsZWN0JyB8fCBlbC50eXBlID09ICd0cmVlLXNlbGVjdCcpICYmIGVsLml0ZW1zICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLml0ZW1zPy4oKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZXM6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwudHlwZSA9PSAndHJlZS1zZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRUb056VHJlZU5vZGVzID0gKGl0ZW1zOiBGaWx0ZXJCb3hJdGVtc01vZGVsW10pOiBOelRyZWVOb2RlT3B0aW9uc1tdID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogU3RyaW5nKGl0ZW0udmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVhZjogaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGl0ZW0uY2hpbGRyZW4gPyBjb252ZXJ0VG9OelRyZWVOb2RlcyhpdGVtLmNoaWxkcmVuKSA6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzID0gY29udmVydFRvTnpUcmVlTm9kZXMocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyQm94SXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IHJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGVsLnBvc2l0aW9uID8gZWwucG9zaXRpb24gOiAnZmlsdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoXCJ0cnVlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KFwiZmFsc2VcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlckJveEl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZWwucG9zaXRpb24gPyBlbC5wb3NpdGlvbiA6ICdmaWx0ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJCb3hJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGVsLnBvc2l0aW9uID8gZWwucG9zaXRpb24gOiAnZmlsdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBmZXRjaERhdGE6IChmaWx0ZXJHcmlkOiBHcmlkSW5wdXRNb2RlbCwgcmVxdWVzdFBhcmFtczogR3JpZFJlcXVlc3RQYXJhbSkgPT4gUHJvbWlzZTxEYXRhc291cmNlT3V0cHV0TW9kZWw+O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtbih2OiBDb2x1bW5JdGVtc1tdKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5EZWZzID0gW107XG4gICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uID0gdjtcbiAgICAgICAgICAgICAgICB2LmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXI6IGFueSA9ICdhZ1RleHRDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyUGFyYW1zOiBJRGF0ZUZpbHRlclBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bUNvbmRpdGlvbnM6IDFcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdOdW1iZXJDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcy5maWx0ZXJPcHRpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVtcHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlLZXk6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnWUVTJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZklucHV0czogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiAnZmFsc2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdOTycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiAoKSA9PiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZJbnB1dHM6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdOdW1iZXJDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBlbC5maWx0ZXJJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlLZXk6IGVsLmZpbHRlckl0ZW1zW3Byb3BlcnR5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChlbC5maWx0ZXJJdGVtc1twcm9wZXJ0eV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZJbnB1dHM6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLmZpbHRlck9wdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdOdW1iZXJDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdTZXRDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdUZXh0Q29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICdhZ0RhdGVDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdUZXh0Q29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmlsdGVyQm94SXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5maWVsZCA9PSBlbC5maWVsZCB8fCBpdGVtLmZpZWxkID09IGVsLnNlYXJjaEZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmZpbHRlciAhPSB1bmRlZmluZWQgJiYgKGVsLmZpbHRlciA9PSAnZmlsdGVyLWJveCcgfHwgZWwuZmlsdGVyID09ICdub25lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5zb3J0YWJsZSAhPSB1bmRlZmluZWQgJiYgIWVsLnNvcnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5maWVsZCAhPSB0aGlzLl90cmVlR3JvdXBDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC50eXBlICYmIGVsLnR5cGUgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJZDogZWwuaWQgPyBlbC5pZCA6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWU6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGVsLm1pbldpZHRoID8gZWwubWluV2lkdGggOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbm5lZDogZWwucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ2xhc3M6ICdhZy1ib29sZWFuLWNlbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLnZhbHVlID8gJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHN0cm9rZT1cImdyZWVuXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwiZmVhdGhlciBmZWF0aGVyLWNoZWNrXCI+PHBhdGggZD1cIk0yMCA2TDkgMTdMNCAxMlwiLz48L3N2Zz4nIDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHN0cm9rZT1cInJlZFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci14XCI+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIiAvPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCIgLz48L3N2Zz4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbC50eXBlICYmIGVsLnR5cGUgPT0gJ2VudW0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJZDogZWwuaWQgPyBlbC5pZCA6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWU6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiBlbC5waW5uZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBlbC5taW5XaWR0aCA/IGVsLm1pbldpZHRoIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KHBhcmFtcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgJiYgZWwudHlwZSA9PSAnZGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbElkOiBlbC5pZCA/IGVsLmlkIDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogRGF0ZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGVsLm1pbldpZHRoID8gZWwubWluV2lkdGggOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbm5lZDogZWwucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKRGF0ZVBpcGUoKS50cmFuc2Zvcm0ocGFyYW1zLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsLnR5cGUgJiYgZWwudHlwZSA9PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbElkOiBlbC5pZCA/IGVsLmlkIDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogVGltZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGVsLm1pbldpZHRoID8gZWwubWluV2lkdGggOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbm5lZDogZWwucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsLnR5cGUgJiYgZWwudHlwZSA9PSAnZGF0ZS10aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSWQ6IGVsLmlkID8gZWwuaWQgOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBEYXRlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGVsLmVkaXRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiBlbC5waW5uZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpEYXRlUGlwZSgpLnRyYW5zZm9ybShwYXJhbXMudmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbC50eXBlICYmIGVsLnR5cGUgPT0gJ3ByaWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSWQ6IGVsLmlkID8gZWwuaWQgOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZWwuZWRpdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBlbC5taW5XaWR0aCA/IGVsLm1pbldpZHRoIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5uZWQ6IGVsLnBpbm5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXMudmFsdWUudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwudHlwZSAmJiBlbC50eXBlID09ICdpbWFnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbElkOiBlbC5pZCA/IGVsLmlkIDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiBlbC5waW5uZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgY2xhc3M9XCJyb3VuZGVkLWZ1bGwgbXQtMVwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHNyYz1cIiR7cGFyYW1zLnZhbHVlfVwiLz5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJZDogZWwuaWQgPyBlbC5pZCA6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWU6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZWwuZWRpdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiBlbC5waW5uZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBlbC5taW5XaWR0aCA/IGVsLm1pbldpZHRoIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZi5maWVsZCA9IGVsLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uLmZpbHRlcigoZWwpID0+IGVsLmZpbHRlciA9PSAnZmlsdGVyLWJveCcpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwuZmlsdGVySXRlbXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGVsLmZpbHRlckl0ZW1zKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoZWwuZmlsdGVySXRlbXNbaXRlbV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbC5maWx0ZXJJdGVtc1tpdGVtXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlbC5maWx0ZXJJdGVtcykuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KFwidHJ1ZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChcImZhbHNlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlckJveEl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpbHRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlczogW11cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiB0aGlzLmFjdGlvbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdhY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogQWN0aW9uc0NlbGxSZW5kZXJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlclBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IChwYXJhbXM6IEdyaWRBY3Rpb25PdXRwdXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFjdGlvbi5lbWl0KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VEYXRlUGlja2VyVmFsdWUoZSwgaXRlbTogRmlsdGVyQm94TW9kZWwsIGluZGV4KSB7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWVbaW5kZXhdID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgICBpdGVtLnZhbHVlW2luZGV4XSA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjZWxsRG91YmxlQ2xpY2tlZChlOiBDZWxsRG91YmxlQ2xpY2tlZEV2ZW50KSB7XG4gICAgICAgIHRoaXMub25DbGlja2VkLmVtaXQoeyAuLi5lLmRhdGEsIGNvbElkOiBlLmNvbHVtbi5nZXRDb2xJZCgpIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrKGl0ZW06IFRvb2xiYXJJdGVtcykge1xuICAgICAgICB0aGlzLm9uVG9vbGJhci5lbWl0KGl0ZW0pO1xuICAgIH1cblxuICAgIHNhdmVGaWx0ZXJHcmlkKCkge1xuICAgICAgICBpZiAodGhpcy5pZCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl90b2FzdC5zaG93KCfYtNmG2KfYs9mHINuMINis2K/ZiNmEINmI2KfYsdivINmG2LTYr9mHINin2LPYqicsICdlcnJvcicpO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JpZElkID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRiLmdyaWRGaWx0ZXJJdGVtcy5nZXQodGhpcy5ncmlkSWQpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGRiLmdyaWRGaWx0ZXJJdGVtcy5wdXQoe1xuICAgICAgICAgICAgICAgICAgICAuLi5yZXMsXG4gICAgICAgICAgICAgICAgICAgIGdyaWQ6IHRoaXMuZ3JpZE1vZGVsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hUZW1wbGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RvYXN0LnNob3coJ9mC2KfZhNioINio2Kcg2YXZiNmB2YLbjNiqINio2LHZiNiy2LHYs9in2YbbjCDYtNivJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGhhbmRsZUNhbmNlbE1vZGFsKCkge1xuICAgICAgICB0aGlzLmlzVmlzaWJsZU1vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlT2tNb2RhbCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVOYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvYXN0LnNob3coJ9i52YbZiNin2YYg2YLYp9mE2Kgg2YjYp9ix2K8g2YbYtNiv2Ycg2KfYs9iqJywgJ2Vycm9yJyk7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRJZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XG4gICAgICAgIGRiLmdyaWRGaWx0ZXJJdGVtcy5hZGQoe1xuICAgICAgICAgICAgaWQ6IHRoaXMuZ3JpZElkLFxuICAgICAgICAgICAgZ3JpZDogdGhpcy5ncmlkTW9kZWwsXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGVtcGxhdGVOYW1lLFxuICAgICAgICAgICAgdXNlck5hbWU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3RvYXN0LnNob3coJ9mC2KfZhNioINio2Kcg2YXZiNmB2YLbjNiqINiw2K7bjNix2Ycg2LTYrycsICdzdWNjZXNzJyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGVOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc1Zpc2libGVNb2RhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLmZldGNoVGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaChwdXJnZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJvd01vZGVsVHlwZSA9PSAnc2VydmVyU2lkZScpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFwaS5yZWZyZXNoU2VydmVyU2lkZSh7IHB1cmdlIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvd0RhdGEgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFwaS5yZWZyZXNoQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFwaS5zZXRHcmlkT3B0aW9uKCdjb2x1bW5EZWZzJywgdGhpcy5jb2x1bW5EZWZzKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFwaS5zZXRHcmlkT3B0aW9uKCdsb2FkaW5nJywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmZldGNoRGF0YShudWxsLCBudWxsKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucm93RGF0YSA9IGRhdGEuaXRlbXM7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnNldEdyaWRPcHRpb24oJ2xvYWRpbmcnLCBmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFwaSA9IHBhcmFtcy5hcGk7XG4gICAgICAgIGlmICh0aGlzLnJvd01vZGVsVHlwZSA9PSAnY2xpZW50U2lkZScpIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhKG51bGwsIG51bGwpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dEYXRhID0gZGF0YS5pdGVtcztcbiAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJhbXMuZmFpbCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZHZhbmNlZEZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5lbmFibGVBZHZhbmNlZEZpbHRlciA9ICF0aGlzLmVuYWJsZUFkdmFuY2VkRmlsdGVyO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFwaS5zaG93QWR2YW5jZWRGaWx0ZXJCdWlsZGVyKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWctaWNvbi1tYXhpbWl6ZScpWzBdIGFzIEhUTUxFbGVtZW50KS5jbGljaygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSwgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um91dGVUb05vZGUocm93Tm9kZTogSVJvd05vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghcm93Tm9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5nZXRSb3V0ZVRvTm9kZShyb3dOb2RlLnBhcmVudCksXG4gICAgICAgICAgICByb3dOb2RlLmtleSA/IHJvd05vZGUua2V5IDogcm93Tm9kZS5kYXRhLmVtcGxveWVlTmFtZSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICByZWZyZXNoTm9kZShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZEFwaS5nZXRSb3dOb2RlKGlkKTtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmdldFJvdXRlVG9Ob2RlKHNlbGVjdGVkUm93cyk7XG4gICAgICAgIHRoaXMuZ3JpZEFwaS5yZWZyZXNoU2VydmVyU2lkZSh7XG4gICAgICAgICAgICBwdXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIHJvdXRlOiByb3V0ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbGVhckZpbHRlcigpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlRmlsdGVyQm94ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZpbHRlckJveEl0ZW1zLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBlbC52YWx1ZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyaWRBcGkuc2V0RmlsdGVyTW9kZWwobnVsbCk7XG4gICAgICAgIHRoaXMuZ3JpZEFwaS5vbkZpbHRlckNoYW5nZWQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJdGVtc1ZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICByZWZyZXNoUGFyZW50Tm9kZShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZEFwaS5nZXRSb3dOb2RlKGlkKTtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmdldFJvdXRlVG9Ob2RlKHNlbGVjdGVkUm93cy5wYXJlbnQpO1xuICAgICAgICB0aGlzLmdyaWRBcGkucmVmcmVzaFNlcnZlclNpZGUoe1xuICAgICAgICAgICAgcHVyZ2U6IHRydWUsXG4gICAgICAgICAgICByb3V0ZTogcm91dGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmlsdGVyKCkge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckxhYmVsVmFsdWUoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZUZpbHRlckJveCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNldFRlbXBsYXRlRmlsdGVyKGl0ZW06IEZpbHRlclRlbXBsYXRlTW9kZWwpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbHRlcigpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uZ3JpZC5maWx0ZXIuZmlsdGVycy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRFbCA9IHRoaXMuX2NvbHVtbi5maW5kKChpdGVtKSA9PiBpdGVtLmZpZWxkID09IGVsLmZpZWxkIHx8IGl0ZW0uc2VhcmNoRmllbGQgPT0gZWwuZmllbGQpO1xuICAgICAgICAgICAgICAgIGlmIChmaW5kRWwgJiYgdGhpcy5jb2x1bW5EZWZzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZmllbGQgPT0gZmluZEVsLmZpZWxkICYmIGl0ZW0uZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRBcGkuc2V0Q29sdW1uRmlsdGVyTW9kZWwoZmluZEVsLmZpZWxkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBlbC5sb2dpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZWwudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9maWx0ZXJCb3hJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uZmllbGQgPT0gZWwuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJCb3hJdGVtc1tpbmRleF0udmFsdWUgPSBlbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZElkID0gaXRlbS5pZDtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUZpbHRlclRlbXBsYXRlQm94ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJMYWJlbFZhbHVlKCk7XG4gICAgICAgICAgICB0aGlzLmdyaWRBcGkub25GaWx0ZXJDaGFuZ2VkKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBoYW5kbGVGaWx0ZXJMYWJlbFZhbHVlKCkge1xuICAgICAgICB0aGlzLl9maWx0ZXJCb3hJdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmluZEVsID0gdGhpcy5maWx0ZXJJdGVtc1ZhbHVlcy5maW5kKChmaSkgPT4gZmkuZmllbGQgPT0gZWwuZmllbGQpO1xuICAgICAgICAgICAgaWYgKCFmaW5kRWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWwudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zVmFsdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsLnZhbHVlID09IG51bGwgfHwgZWwudmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zVmFsdWVzID0gdGhpcy5maWx0ZXJJdGVtc1ZhbHVlcy5maWx0ZXIoKGZpKSA9PiBmaS5maWVsZCAhPSBlbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmluZEVsLnZhbHVlID0gZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZUZpbHRlcihpdGVtOiBGaWx0ZXJJdGVtc1ZhbHVlc01vZGVsKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZmlsdGVyQm94SXRlbXMuZmluZEluZGV4KChlbCkgPT4gZWwuZmllbGQgPT0gaXRlbS5maWVsZCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJCb3hJdGVtc1tpbmRleF0udmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnNldENvbHVtbkZpbHRlck1vZGVsKGl0ZW0uZmllbGQsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQXBpLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVySXRlbXNWYWx1ZXMgPSB0aGlzLmZpbHRlckl0ZW1zVmFsdWVzLmZpbHRlcigoZWwpID0+IGVsLmZpZWxkICE9IGl0ZW0uZmllbGQpO1xuICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICBjcmVhdGVTZXJ2ZXJTaWRlRGF0YXNvdXJjZSgpOiBJU2VydmVyU2lkZURhdGFzb3VyY2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0Um93czogKHBhcmFtczogSVNlcnZlclNpZGVHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlcjogRmlsdGVyR3JpZEl0ZW1zTW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZpbHRlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpYzogJ0FORCcsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVEYXRlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkID0ga2V5ID09ICdhZy1HcmlkLUF1dG9Db2x1bW4nID8gdGhpcy5fdHJlZUdyb3VwQ29sdW1uIDoga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVyYXRvciA9IEZpbHRlck9wZXJhdG9yLmVxdWFscztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZ25vcmVDYXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kRWwgPSB0aGlzLl9jb2x1bW4uZmluZCgoZWwpID0+IGVsLmZpZWxkID09IGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICdhZy1HcmlkLUF1dG9Db2x1bW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSB0aGlzLl90cmVlR3JvdXBDb2x1bW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kRWwuc2VhcmNoRmllbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGZpbmRFbC5zZWFyY2hGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5maWx0ZXJUeXBlID09ICdjdXN0b20tZGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5kYXRlRnJvbSAmJiBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmRhdGVUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IEZpbHRlck9wZXJhdG9yLmJldHdlZW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW3BhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZUZyb20sIHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZVRvXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZUZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBGaWx0ZXJPcGVyYXRvci50cnVuY0dyZWF0ZXJUaGFuRXF1YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5kYXRlRnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZVRvICYmIHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZVRvICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBGaWx0ZXJPcGVyYXRvci50cnVuY0xlc3NUaGFuT3JFcXVhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmRhdGVUbztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZmlsdGVyVHlwZSA9PSAnY3VzdG9tLXRpbWUnICYmIHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0udGltZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBGaWx0ZXJPcGVyYXRvci5lcXVhbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBgJHtwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLnRpbWUuc3Vic3RyKDAsIDIpfToke3BhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0udGltZS5zdWJzdHIoMiwgMil9OiR7cGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS50aW1lLnN1YnN0cig0LCAyKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmlsdGVyT3BlcmF0b3JbcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS50eXBlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IEZpbHRlck9wZXJhdG9yW3BhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0udHlwZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5maWx0ZXIgPyBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmZpbHRlciA6IHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEVsICYmIGZpbmRFbC50eXBlID09ICdlbnVtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZEZpbHRlckl0ZW1zRWwgPSB0aGlzLmZpbHRlckl0ZW1zVmFsdWVzLmZpbmQoKGZpKSA9PiBmaS5maWVsZCA9PSBmaW5kRWwuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kRmlsdGVySXRlbXNFbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySXRlbXNWYWx1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBmaW5kRWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaW5kRWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kRmlsdGVySXRlbXNFbC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZURhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZmlsdGVySXRlbXNWYWx1ZXMgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5maWx0ZXJJdGVtc1ZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzb3J0czogU29ydE1vZGVsW10gPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnJlcXVlc3Quc29ydE1vZGVsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kRWwgPSB0aGlzLl9jb2x1bW4uZmluZCgoZWwpID0+IGVsLmZpZWxkID09IHBhcmFtcy5yZXF1ZXN0LnNvcnRNb2RlbFswXS5jb2xJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kRWwuc2VhcmNoRmllbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydHMgPSBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogcGFyYW1zLnJlcXVlc3Quc29ydE1vZGVsWzBdLnNvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGZpbmRFbC5zZWFyY2hGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0cyA9IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiBwYXJhbXMucmVxdWVzdC5zb3J0TW9kZWxbMF0uc29ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcGFyYW1zLnJlcXVlc3Quc29ydE1vZGVsWzBdLmNvbElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBncmlkRmlsdGVyOiBHcmlkSW5wdXRNb2RlbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFrZTogcGFyYW1zLmFwaS5wYWdpbmF0aW9uR2V0UGFnZVNpemUoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2tpcDogcGFyYW1zLmFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSAqIHBhcmFtcy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIHNvcnRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0UGFyYW1zOiBHcmlkUmVxdWVzdFBhcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlOiBwYXJhbXMucGFyZW50Tm9kZS5kYXRhXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJCb3hJdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLnBvc2l0aW9uID09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IEZpbHRlck9wZXJhdG9yLmNvbnRhaW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOiBjYXNlICdkYXRlLXRpbWUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBGaWx0ZXJPcGVyYXRvci5iZXR3ZWVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLnZhbHVlWzBdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZVswXSA9IG5ldyBEYXRlKCcxOTk3LTAxLTAxJykudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwudmFsdWVbMV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlWzFdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IEZpbHRlck9wZXJhdG9yLmVxdWFscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkRmlsdGVyLmZpbHRlci5maWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVEYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRGaWx0ZXIuZGF0YVtlbC5maWVsZF0gPSBlbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZE1vZGVsID0gZ3JpZEZpbHRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoRGF0YShncmlkRmlsdGVyLCByZXF1ZXN0UGFyYW1zKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc3VjY2Vzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiBkYXRhLml0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQ6IGRhdGEudG90YWxDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvd01vZGVsVHlwZSA9PSAnc2VydmVyU2lkZScgJiYgdGhpcy5ncmlkQXBpLmdldFNlcnZlclNpZGVTZWxlY3Rpb25TdGF0ZSgpWydzZWxlY3RBbGwnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZhaWwoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmZXRjaFRlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5pZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkYi5ncmlkRmlsdGVySXRlbXMuZmlsdGVyKChlbCkgPT4gZWwudGFibGVJZCA9PSB0aGlzLmlkKS50b0FycmF5KCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJUZW1wbGF0ZUl0ZW1zID0gcmVzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mZXRjaFRlbXBsYXRlKCk7XG4gICAgfVxufSIsIjwhLS0gPGJ1dHRvbiAoY2xpY2spPVwiZW5hYmxlQWR2YW5jZWRGaWx0ZXI9IWVuYWJsZUFkdmFuY2VkRmlsdGVyXCI+YWR2YW5jZWQ8L2J1dHRvbj4gLS0+XG48ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIHB5LTQgYm9yZGVyLWIgYm9yZGVyLWItc2xhdGUtMjAwIG14LTRcIiAqbmdJZj1cImlzVG9vbGJhclwiPlxuICAgIDxkaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC0yeGxcIj57eyBsYWJlbCB9fTwvaDQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTNcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiB0b29sYmFySXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBbbnpMb2FkaW5nXT1cIml0ZW0ubG9hZGluZyA/IGl0ZW0ubG9hZGluZyA6IGZhbHNlXCIgKGNsaWNrKT1cImhhbmRsZUNsaWNrKGl0ZW0pXCIgW256VHlwZV09XCJpdGVtLnR5cGVcIj5cbiAgICAgICAgICAgIDxzcGFuIG56LWljb24gW256VHlwZV09XCJpdGVtLmljb25cIj48L3NwYW4+XG4gICAgICAgICAgICB7eyBpdGVtLnRleHQgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbnotYnV0dG9uXG4gICAgICAgICAgICBuelR5cGU9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgIG56LXBvcG92ZXJcbiAgICAgICAgICAgIG56UG9wb3ZlclRpdGxlPVwiXCJcbiAgICAgICAgICAgIFsobnpQb3BvdmVyVmlzaWJsZSldPVwidmlzaWJsZUZpbHRlckJveFwiXG4gICAgICAgICAgICBuelBvcG92ZXJUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgICAgW256UG9wb3ZlckNvbnRlbnRdPVwiY29udGVudFRlbXBsYXRlXCJcbiAgICAgICAgICAgIG56UG9wb3Zlck92ZXJsYXlDbGFzc05hbWU9XCJmaWx0ZXItcG9wb3ZlclwiXG4gICAgICAgICAgICBuelBvcG92ZXJQbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgICAgICAgKm5nSWY9XCJfZmlsdGVyQm94SXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJmaWx0ZXJcIj48L3NwYW4+XG4gICAgICAgICAgICDZgduM2YTYqtixXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBuei1idXR0b25cbiAgICAgICAgICAgIG56VHlwZT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICBuei1wb3BvdmVyXG4gICAgICAgICAgICBuelBvcG92ZXJUaXRsZT1cIlwiXG4gICAgICAgICAgICBbKG56UG9wb3ZlclZpc2libGUpXT1cInZpc2libGVGaWx0ZXJUZW1wbGF0ZUJveFwiXG4gICAgICAgICAgICBuelBvcG92ZXJUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgICAgW256UG9wb3ZlckNvbnRlbnRdPVwiY29udGVudEZpbHRlclRlbXBsYXRlXCJcbiAgICAgICAgICAgIG56UG9wb3Zlck92ZXJsYXlDbGFzc05hbWU9XCJmaWx0ZXItcG9wb3Zlci1zbVwiXG4gICAgICAgICAgICBuelBvcG92ZXJQbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgICAgICAgKm5nSWY9XCJpZCAhPSBudWxsXCI+XG4gICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cImxheW91dFwiPjwvc3Bhbj5cbiAgICAgICAgICAgINmB24zZhNiq2LEg2YfYp9uMINiw2K7bjNix2Ycg2LTYr9mHXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiAoY2xpY2spPVwicmVmcmVzaCgpXCIgbnpUeXBlPVwiZGVmYXVsdFwiPlxuICAgICAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJzeW5jXCI+PC9zcGFuPlxuICAgICAgICAgICAg2KjYsdmI2LLYsdiz2KfZhtuMXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8IS0tIDxidXR0b24gbnotYnV0dG9uIChjbGljayk9XCJhZHZhbmNlZEZpbHRlcigpXCIgKm5nSWY9XCJzaG93QWR2YW5jZWRCdXR0b25cIiBuelR5cGU9XCJkZWZhdWx0XCI+XG4gICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cImZpbHRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgINis2LPYqtis2YjbjCDZvtuM2LTYsdmB2KrZh1xuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImdyaWQgZ2FwLXgtNCBwdC00XCIgW25nQ2xhc3NdPVwieyAnZ3JpZC1jb2xzLTEnOiBfZmlsdGVyQm94SXRlbXMubGVuZ3RoID09IDEsICdncmlkLWNvbHMtMic6IF9maWx0ZXJCb3hJdGVtcy5sZW5ndGggPiAxIH1cIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBfZmlsdGVyQm94SXRlbXNcIiBbbmdDbGFzc109XCJ7ICdjb2wtc3Bhbi0yJzogaXRlbS50eXBlID09ICdkYXRlJyB8fCBpdGVtLnR5cGUgPT0gJ2RhdGUtdGltZScgfVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZGF0ZScgfHwgaXRlbS50eXBlID09ICdkYXRlLXRpbWUnXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy0yIGdhcC14LTRcIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbD7Yp9iyINiq2KfYsduM2K48L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cWV5ZGFyLWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaXRlbS52YWx1ZSAhPSBudWxsID8gaXRlbS52YWx1ZVswXSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZVZhbHVlKT1cImNoYW5nZURhdGVQaWNrZXJWYWx1ZSgkZXZlbnQsIGl0ZW0sIDApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZGF5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0VtcHR5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhclR5cGVdPVwiJ2phbGFsaSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD1cInl5eXktTU0tZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtydGxdPVwidHJ1ZVwiPjwvcWV5ZGFyLWRhdGUtcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbD7YqtinINiq2KfYsduM2K48L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cWV5ZGFyLWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaXRlbS52YWx1ZSAhPSBudWxsID8gaXRlbS52YWx1ZVsxXSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZVZhbHVlKT1cImNoYW5nZURhdGVQaWNrZXJWYWx1ZSgkZXZlbnQsIGl0ZW0sIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZGF5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0VtcHR5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhclR5cGVdPVwiJ2phbGFsaSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD1cInl5eXktTU0tZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtydGxdPVwidHJ1ZVwiPjwvcWV5ZGFyLWRhdGUtcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZW51bScgfHwgaXRlbS50eXBlID09ICdzZWxlY3QnIHx8IGl0ZW0udHlwZSA9PSAnYm9vbGVhbidcIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsPnt7IGl0ZW0ubGFiZWwgfX08L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxuei1zZWxlY3QgY2xhc3M9XCJ3LWZ1bGxcIiBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIiBuelNob3dTZWFyY2g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bnotb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtMiBvZiBpdGVtLml0ZW1zXCIgW256VmFsdWVdPVwiaXRlbTIudmFsdWVcIiBbbnpMYWJlbF09XCJpdGVtMi5sYWJlbFwiPjwvbnotb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L256LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PSAndHJlZS1zZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0taXRlbSBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbD57eyBpdGVtLmxhYmVsIH19PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8bnotdHJlZS1zZWxlY3QgY2xhc3M9XCJ3LWZ1bGxcIiBbbnpOb2Rlc109XCJpdGVtLm5vZGVzXCIgbnpTaG93U2VhcmNoIFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVwiPjwvbnotdHJlZS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3N0cmluZycgfHwgaXRlbS50eXBlID09IG51bGxcIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsPnt7IGl0ZW0ubGFiZWwgfX08L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG56LWlucHV0IFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIgcHQtNCBtdC00IGJvcmRlci10IGJvcmRlci10LXNsYXRlLTIwMFwiPlxuICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImZpbHRlcigpXCI+2KfYudmF2KfZhDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJkZWZhdWx0XCIgKGNsaWNrKT1cImNsZWFyRmlsdGVyKClcIj7Zvtin2qnYs9in2LLbjCDZiCDYqNiz2KrZhjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjwhLS0gdGVtcGxhdGUgaXRlbXMgYm94ICAtLT5cbjxuZy10ZW1wbGF0ZSAjY29udGVudEZpbHRlclRlbXBsYXRlIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgPHVsIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtYXgtaC1bMzAwcHhdXCI+XG4gICAgICAgIDxsaSBjbGFzcz1cInAtMiByb3VuZGVkLWxnIGN1cnNvci1wb2ludGVyIGJvcmRlciBib3JkZXItc2xhdGUtMjAwXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyVGVtcGxhdGVJdGVtc1wiIChjbGljayk9XCJzZXRUZW1wbGF0ZUZpbHRlcihpdGVtKVwiPnt7IGl0ZW0udGl0bGUgfX08L2xpPlxuICAgIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMiBweC00IHB5LTIgaC0xNFwiICpuZ0lmPVwiaXNUb29sYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1tZWRpdW0gdGV4dC1zbSB0ZXh0LWJsdWUtNTAwXCI+2YHbjNmE2KrYsdmH2KfbjCDYp9i52YXYp9mEINi02K/Zhzo8L3NwYW4+XG4gICAgICAgIDx1bCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJiZy13aGl0ZSBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCByb3VuZGVkLW1kIHB4LTIgcHktMSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSBoLThcIiAqbmdJZj1cImZpbHRlckl0ZW1zVmFsdWVzLmxlbmd0aCA9PSAwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNsYXRlLTgwMCBmb250LW1lZGl1bSB0ZXh0LXNtXCI+2KjYr9mI2YYg2YHbjNmE2KrYsTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJiZy13aGl0ZSBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCByb3VuZGVkLW1kIHB4LTIgcHktMSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSBoLThcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJJdGVtc1ZhbHVlc1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc2xhdGUtNTAwIHRleHQtc21cIj57eyBpdGVtLmxhYmVsIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNsYXRlLTgwMCBmb250LW1lZGl1bSB0ZXh0LXNtXCI+e3sgaXRlbS52YWx1ZSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXJlZ3VsYXIgZmEtdGltZXMgY3Vyc29yLXBvaW50ZXIgcHMtMlwiIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoaXRlbSlcIj48L2k+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiICpuZ0lmPVwiaWQgIT0gbnVsbFwiPlxuICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJkZWZhdWx0XCIgKm5nSWY9XCJmaWx0ZXJJdGVtc1ZhbHVlcy5sZW5ndGggPiAwIHx8IGdyaWRJZCAhPSBudWxsXCIgKGNsaWNrKT1cInNhdmVGaWx0ZXJHcmlkKClcIj5cbiAgICAgICAgICAgIHt7IGdyaWRJZCA9PSBudWxsID8gJ9iw2K7bjNix2Ycg2YHbjNmE2KrYsScgOiAn2KfYudmF2KfZhCDYqti624zbjNix2KfYqiDZgduM2YTYqtixJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwiZGVmYXVsdFwiICpuZ0lmPVwiZ3JpZElkICE9IG51bGxcIiAoY2xpY2spPVwiY2xlYXJGaWx0ZXIoKTsgZ3JpZElkID0gbnVsbFwiPtmE2LrZiDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuei1tb2RhbCBbKG56VmlzaWJsZSldPVwiaXNWaXNpYmxlTW9kYWxcIiBuelRpdGxlPVwi2KfZgdiy2YjYr9mGINmC2KfZhNioINis2K/bjNivXCIgKG56T25DYW5jZWwpPVwiaGFuZGxlQ2FuY2VsTW9kYWwoKVwiIChuek9uT2spPVwiaGFuZGxlT2tNb2RhbCgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbnpNb2RhbENvbnRlbnQ+XG4gICAgICAgIDxuei1mb3JtLWl0ZW0gY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsPti52YbZiNin2YYg2YLYp9mE2Kg8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuei1pbnB1dCBbKG5nTW9kZWwpXT1cInRlbXBsYXRlTmFtZVwiIC8+XG4gICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uei1tb2RhbD5cblxuPGFnLWdyaWQtYW5ndWxhclxuICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxuICAgIFtzdHlsZV09XCJpc1Rvb2xiYXIgPyAnaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gMTI0cHgpOycgOiAnaGVpZ2h0OiAxMDAlOydcIlxuICAgIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIlxuICAgIFtwYWdpbmF0aW9uXT1cInRydWVcIlxuICAgIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwicGFnaW5hdGlvblBhZ2VTaXplXCJcbiAgICBbcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JcIlxuICAgIFtjbGFzc109XCJ0aGVtZUNsYXNzXCJcbiAgICBbcm93SGVpZ2h0XT1cIjQ4XCJcbiAgICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcbiAgICBbZW5hYmxlQWR2YW5jZWRGaWx0ZXJdPVwiZW5hYmxlQWR2YW5jZWRGaWx0ZXJcIlxuICAgIFtlbmFibGVSdGxdPVwicnRsXCJcbiAgICBbdHJlZURhdGFdPVwidHJlZU1vZGVsXCJcbiAgICBbYXV0b0dyb3VwQ29sdW1uRGVmXT1cImF1dG9Hcm91cENvbHVtbkRlZlwiXG4gICAgW2lzU2VydmVyU2lkZUdyb3VwXT1cImlzU2VydmVyU2lkZUdyb3VwXCJcbiAgICBbZ2V0U2VydmVyU2lkZUdyb3VwS2V5XT1cImdldFNlcnZlclNpZGVHcm91cEtleVwiXG4gICAgW3Jvd01vZGVsVHlwZV09XCJyb3dNb2RlbFR5cGVcIlxuICAgIFtyb3dEYXRhXT1cInJvd0RhdGFcIlxuICAgIFtzZXJ2ZXJTaWRlRGF0YXNvdXJjZV09XCJkYXRhc291cmNlXCJcbiAgICAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudClcIlxuICAgIFtjYWNoZUJsb2NrU2l6ZV09XCJwYWdpbmF0aW9uUGFnZVNpemVcIlxuICAgIFttYXhCbG9ja3NJbkNhY2hlXT1cIjJcIlxuICAgIFtjb250ZXh0XT1cInsgYWN0aW9uSXRlbXM6IGFjdGlvbkl0ZW1zIH1cIlxuICAgIChjZWxsRG91YmxlQ2xpY2tlZCk9XCJjZWxsRG91YmxlQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICBbYXV0b1NpemVTdHJhdGVneV09XCJfYXV0b0NvbHVtblNpemVcIlxuICAgIFtyb3dTZWxlY3Rpb25dPVwiX3Jvd1NlbGVjdGlvblwiXG4gICAgKHNlbGVjdGlvbkNoYW5nZWQpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICBbdGhlbWVdPVwiXCJcbiAgICBbZ2V0Um93Q2xhc3NdPVwiZ2V0Um93Q2xhc3NcIlxuICAgICNncmlkIC8+XG4iXX0=