igniteui-angular 16.1.5 → 16.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/esm2022/lib/calendar/calendar.mjs +2 -2
  2. package/esm2022/lib/core/i18n/grid-resources.mjs +2 -1
  3. package/esm2022/lib/grids/filtering/excel-style/common.mjs +6 -1
  4. package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +2 -2
  5. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +155 -6
  6. package/esm2022/lib/grids/grid-base.directive.mjs +7 -4
  7. package/esm2022/lib/grids/pivot-grid/pivot-data-selector.component.mjs +2 -2
  8. package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +2 -2
  9. package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +2 -2
  10. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-content.component.mjs +2 -2
  11. package/esm2022/lib/list/list-item.component.mjs +9 -4
  12. package/esm2022/lib/list/list.component.mjs +10 -4
  13. package/fesm2022/igniteui-angular.mjs +231 -63
  14. package/fesm2022/igniteui-angular.mjs.map +1 -1
  15. package/lib/core/i18n/grid-resources.d.ts +1 -0
  16. package/lib/core/styles/components/grid/_excel-filtering-component.scss +4 -0
  17. package/lib/core/styles/components/grid/_excel-filtering-theme.scss +7 -0
  18. package/lib/core/styles/components/list/_list-component.scss +5 -0
  19. package/lib/core/styles/components/list/_list-theme.scss +10 -0
  20. package/lib/grids/filtering/excel-style/common.d.ts +8 -0
  21. package/lib/grids/filtering/excel-style/excel-style-search.component.d.ts +29 -3
  22. package/lib/list/list-item.component.d.ts +5 -3
  23. package/lib/list/list.component.d.ts +4 -2
  24. package/package.json +1 -1
  25. package/styles/igniteui-angular-dark.css +1 -1
  26. package/styles/igniteui-angular.css +1 -1
  27. package/styles/igniteui-bootstrap-dark.css +1 -1
  28. package/styles/igniteui-bootstrap-light.css +1 -1
  29. package/styles/igniteui-dark-green.css +1 -1
  30. package/styles/igniteui-fluent-dark-excel.css +1 -1
  31. package/styles/igniteui-fluent-dark-word.css +1 -1
  32. package/styles/igniteui-fluent-dark.css +1 -1
  33. package/styles/igniteui-fluent-light-excel.css +1 -1
  34. package/styles/igniteui-fluent-light-word.css +1 -1
  35. package/styles/igniteui-fluent-light.css +1 -1
  36. package/styles/igniteui-indigo-dark.css +1 -1
  37. package/styles/igniteui-indigo-light.css +1 -1
  38. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  39. package/styles/maps/igniteui-angular.css.map +1 -1
  40. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  41. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  42. package/styles/maps/igniteui-dark-green.css.map +1 -1
  43. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  44. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  45. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  46. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  47. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  48. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  49. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  50. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -1,4 +1,4 @@
1
- import { Component, ViewChild, TemplateRef, Directive, HostBinding } from '@angular/core';
1
+ import { Component, ViewChild, TemplateRef, Directive, HostBinding, Input, ViewChildren } from '@angular/core';
2
2
  import { IgxInputDirective } from '../../../directives/input/input.directive';
3
3
  import { DisplayDensity } from '../../../core/density';
4
4
  import { IgxForOfDirective } from '../../../directives/for-of/for_of.directive';
@@ -23,6 +23,7 @@ import { FormsModule } from '@angular/forms';
23
23
  import { IgxPrefixDirective } from '../../../directives/prefix/prefix.directive';
24
24
  import { IgxIconComponent } from '../../../icon/icon.component';
25
25
  import { IgxInputGroupComponent } from '../../../input-group/input-group.component';
26
+ import { Navigate } from '../../../drop-down/drop-down.common';
26
27
  import * as i0 from "@angular/core";
27
28
  import * as i1 from "./base-filtering.component";
28
29
  import * as i2 from "../../../core/utils";
@@ -44,6 +45,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
44
45
  standalone: true
45
46
  }]
46
47
  }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
48
+ let NEXT_ID = 0;
47
49
  /**
48
50
  * A component used for presenting Excel style search UI.
49
51
  */
@@ -123,6 +125,9 @@ export class IgxExcelStyleSearchComponent {
123
125
  * @hidden @internal
124
126
  */
125
127
  this.displayedListData = [];
128
+ this.activeDescendant = '';
129
+ this._id = `igx-excel-style-search-${NEXT_ID++}`;
130
+ this._focusedItem = null;
126
131
  this.destroy$ = new Subject();
127
132
  /**
128
133
  * @hidden @internal
@@ -215,7 +220,6 @@ export class IgxExcelStyleSearchComponent {
215
220
  selectAllBtn.indeterminate = true;
216
221
  }
217
222
  }
218
- eventArgs.checkbox.nativeCheckbox.nativeElement.blur();
219
223
  }
220
224
  /**
221
225
  * @hidden @internal
@@ -279,6 +283,24 @@ export class IgxExcelStyleSearchComponent {
279
283
  // an igxForContainerSize = undefined, thus assigns the chunkSize to the igxForOf.length which leads to performance issues.
280
284
  return 0;
281
285
  }
286
+ get id() {
287
+ return this._id;
288
+ }
289
+ set id(value) {
290
+ this._id = value;
291
+ }
292
+ getItemId(index) {
293
+ return `${this.id}-item-${index}`;
294
+ }
295
+ setActiveDescendant() {
296
+ this.activeDescendant = this.focusedItem?.id || '';
297
+ }
298
+ get focusedItem() {
299
+ return this._focusedItem;
300
+ }
301
+ set focusedItem(val) {
302
+ this._focusedItem = val;
303
+ }
282
304
  /**
283
305
  * @hidden @internal
284
306
  */
@@ -345,6 +367,7 @@ export class IgxExcelStyleSearchComponent {
345
367
  }
346
368
  }
347
369
  selectAllBtn.label = this.esf.grid.resourceStrings.igx_grid_excel_select_all;
370
+ this.matchesCount = this.displayedListData.length - 1;
348
371
  this.cdr.detectChanges();
349
372
  return;
350
373
  }
@@ -374,6 +397,12 @@ export class IgxExcelStyleSearchComponent {
374
397
  this.displayedListData = [];
375
398
  }
376
399
  }
400
+ if (this.displayedListData.length > 2) {
401
+ this.matchesCount = this.displayedListData.length - 2;
402
+ }
403
+ else {
404
+ this.matchesCount = 0;
405
+ }
377
406
  selectAllBtn.indeterminate = false;
378
407
  selectAllBtn.isSelected = true;
379
408
  selectAllBtn.label = this.esf.grid.resourceStrings.igx_grid_excel_select_all_search_results;
@@ -466,6 +495,54 @@ export class IgxExcelStyleSearchComponent {
466
495
  }
467
496
  this.esf.closeDropdown();
468
497
  }
498
+ handleKeyDown(event) {
499
+ if (event) {
500
+ const key = event.key.toLowerCase();
501
+ const navKeys = ['space', 'spacebar', ' ',
502
+ 'arrowup', 'up', 'arrowdown', 'down', 'home', 'end'];
503
+ if (navKeys.indexOf(key) === -1) { // If key has appropriate function in DD
504
+ return;
505
+ }
506
+ event.preventDefault();
507
+ event.stopPropagation();
508
+ switch (key) {
509
+ case 'arrowup':
510
+ case 'up':
511
+ this.onArrowUpKeyDown();
512
+ break;
513
+ case 'arrowdown':
514
+ case 'down':
515
+ this.onArrowDownKeyDown();
516
+ break;
517
+ case 'home':
518
+ this.onHomeKeyDown();
519
+ break;
520
+ case 'end':
521
+ this.onEndKeyDown();
522
+ break;
523
+ case 'space':
524
+ case 'spacebar':
525
+ case ' ':
526
+ this.onActionKeyDown();
527
+ break;
528
+ default:
529
+ return;
530
+ }
531
+ }
532
+ }
533
+ onFocus() {
534
+ const firstIndexInView = this.virtDir.state.startIndex;
535
+ this.focusedItem = {
536
+ id: this.getItemId(firstIndexInView),
537
+ index: firstIndexInView,
538
+ checked: this.virtDir.igxForOf[firstIndexInView].isSelected
539
+ };
540
+ this.setActiveDescendant();
541
+ }
542
+ onFocusOut() {
543
+ this.focusedItem = null;
544
+ this.setActiveDescendant();
545
+ }
469
546
  /**
470
547
  * @hidden @internal
471
548
  */
@@ -557,18 +634,82 @@ export class IgxExcelStyleSearchComponent {
557
634
  this.searchValue = this.searchInput.value;
558
635
  }
559
636
  }
637
+ onArrowUpKeyDown() {
638
+ if (this.focusedItem && this.focusedItem.index === 0 && this.virtDir.state.startIndex === 0) {
639
+ this.searchInput.focus();
640
+ this.onFocusOut();
641
+ }
642
+ else {
643
+ this.navigateItem(this.focusedItem ? this.focusedItem.index - 1 : 0);
644
+ }
645
+ this.setActiveDescendant();
646
+ }
647
+ onArrowDownKeyDown() {
648
+ const lastIndex = this.virtDir.igxForOf.length - 1;
649
+ if (this.focusedItem && this.focusedItem.index === lastIndex) {
650
+ this.cancelButton.nativeElement.focus();
651
+ this.onFocusOut();
652
+ }
653
+ else {
654
+ this.navigateItem(this.focusedItem ? this.focusedItem.index + 1 : 0);
655
+ }
656
+ this.setActiveDescendant();
657
+ }
658
+ onHomeKeyDown() {
659
+ this.navigateItem(0);
660
+ this.setActiveDescendant();
661
+ }
662
+ onEndKeyDown() {
663
+ this.navigateItem(this.virtDir.igxForOf.length - 1);
664
+ this.setActiveDescendant();
665
+ }
666
+ onActionKeyDown() {
667
+ const dataItem = this.displayedListData[this.focusedItem.index];
668
+ const args = {
669
+ checked: !dataItem.isSelected,
670
+ checkbox: this.checkboxes.find(x => x.value === dataItem)
671
+ };
672
+ this.onCheckboxChange(args);
673
+ }
674
+ navigateItem(index) {
675
+ if (index === -1 || index >= this.virtDir.igxForOf.length) {
676
+ return;
677
+ }
678
+ const direction = index > (this.focusedItem ? this.focusedItem.index : -1) ? Navigate.Down : Navigate.Up;
679
+ const scrollRequired = this.isIndexOutOfBounds(index, direction);
680
+ this.focusedItem = {
681
+ id: this.getItemId(index),
682
+ index: index,
683
+ checked: this.virtDir.igxForOf[index].isSelected
684
+ };
685
+ if (scrollRequired) {
686
+ this.virtDir.scrollTo(index);
687
+ }
688
+ }
689
+ isIndexOutOfBounds(index, direction) {
690
+ const virtState = this.virtDir.state;
691
+ const currentPosition = this.virtDir.getScroll().scrollTop;
692
+ const itemPosition = this.virtDir.getScrollForIndex(index, direction === Navigate.Down);
693
+ const indexOutOfChunk = index < virtState.startIndex || index > virtState.chunkSize + virtState.startIndex;
694
+ const scrollNeeded = direction === Navigate.Down ? currentPosition < itemPosition : currentPosition > itemPosition;
695
+ const subRequired = indexOutOfChunk || scrollNeeded;
696
+ return subRequired;
697
+ }
560
698
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxExcelStyleSearchComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.BaseFilteringComponent }, { token: i2.PlatformUtil }], target: i0.ɵɵFactoryTarget.Component }); }
561
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxExcelStyleSearchComponent, isStandalone: true, selector: "igx-excel-style-search", host: { properties: { "class.igx-excel-filter__menu-main": "this.defaultClass" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective, static: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true, read: IgxListComponent }, { propertyName: "selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "addToCurrentFilterCheckbox", first: true, predicate: ["addToCurrentFilterCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "tree", first: true, predicate: ["tree"], descendants: true, read: IgxTreeComponent }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true, static: true }, { propertyName: "defaultExcelStyleLoadingValuesTemplate", first: true, predicate: ["defaultExcelStyleLoadingValuesTemplate"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item\n *igxFor=\"let item of displayedListData scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n", dependencies: [{ kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxListComponent, selector: "igx-list", inputs: ["panEndTriggeringThreshold", "id", "allowLeftPanning", "allowRightPanning", "isLoading", "resourceStrings"], outputs: ["leftPan", "rightPan", "startPan", "endPan", "resetPan", "panStateChange", "itemClicked"] }, { kind: "directive", type: IgxForOfDirective, selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { kind: "component", type: IgxListItemComponent, selector: "igx-list-item", inputs: ["isHeader", "hidden", "index"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "directive", type: IgxDataLoadingTemplateDirective, selector: "[igxDataLoading]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IgxEmptyListTemplateDirective, selector: "[igxEmptyList]" }, { kind: "component", type: IgxTreeComponent, selector: "igx-tree", inputs: ["selection", "singleBranchExpand", "animationSettings"], outputs: ["nodeSelection", "nodeExpanding", "nodeExpanded", "nodeCollapsing", "nodeCollapsed", "activeNodeChanged"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxTreeNodeComponent, selector: "igx-tree-node", inputs: ["data", "loading", "resourceStrings", "active", "disabled", "selected", "expanded"], outputs: ["selectedChange", "expandedChange"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }] }); }
699
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxExcelStyleSearchComponent, isStandalone: true, selector: "igx-excel-style-search", inputs: { id: "id" }, host: { properties: { "class.igx-excel-filter__menu-main": "this.defaultClass", "attr.id": "this.id" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective, static: true }, { propertyName: "cancelButton", first: true, predicate: ["cancelButton"], descendants: true, read: IgxButtonDirective, static: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true, read: IgxListComponent }, { propertyName: "selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "addToCurrentFilterCheckbox", first: true, predicate: ["addToCurrentFilterCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "tree", first: true, predicate: ["tree"], descendants: true, read: IgxTreeComponent }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true }, { propertyName: "defaultExcelStyleLoadingValuesTemplate", first: true, predicate: ["defaultExcelStyleLoadingValuesTemplate"], descendants: true, read: TemplateRef }, { propertyName: "checkboxes", predicate: IgxCheckboxComponent, descendants: true }], ngImport: i0, template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list role=\"listbox\" [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\" (keydown)=\"handleKeyDown($event)\" tabindex=\"0\"\n[attr.aria-activedescendant]=\"this.activeDescendant\" (focus)=\"onFocus()\" (focusout)=\"onFocusOut()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item [class.igx-list__item-base--active]=\"focusedItem?.id === this.getItemId(i)\" [attr.id]=\"getItemId(i)\" role=\"option\" \n *igxFor=\"let item of displayedListData;index as i; scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n\n <div class=\"igx-excel-filter__filter-results\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_matches_count.replace('{0}', matchesCount) }}\n </div>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\" #cancelButton\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n", dependencies: [{ kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxListComponent, selector: "igx-list", inputs: ["panEndTriggeringThreshold", "id", "allowLeftPanning", "allowRightPanning", "isLoading", "resourceStrings", "role"], outputs: ["leftPan", "rightPan", "startPan", "endPan", "resetPan", "panStateChange", "itemClicked"] }, { kind: "directive", type: IgxForOfDirective, selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { kind: "component", type: IgxListItemComponent, selector: "igx-list-item", inputs: ["isHeader", "hidden", "index", "role"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "directive", type: IgxDataLoadingTemplateDirective, selector: "[igxDataLoading]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IgxEmptyListTemplateDirective, selector: "[igxEmptyList]" }, { kind: "component", type: IgxTreeComponent, selector: "igx-tree", inputs: ["selection", "singleBranchExpand", "animationSettings"], outputs: ["nodeSelection", "nodeExpanding", "nodeExpanded", "nodeCollapsing", "nodeCollapsed", "activeNodeChanged"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxTreeNodeComponent, selector: "igx-tree-node", inputs: ["data", "loading", "resourceStrings", "active", "disabled", "selected", "expanded"], outputs: ["selectedChange", "expandedChange"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }] }); }
562
700
  }
563
701
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxExcelStyleSearchComponent, decorators: [{
564
702
  type: Component,
565
- args: [{ selector: 'igx-excel-style-search', standalone: true, imports: [IgxInputGroupComponent, IgxIconComponent, IgxPrefixDirective, FormsModule, IgxInputDirective, NgIf, IgxSuffixDirective, IgxListComponent, IgxForOfDirective, IgxListItemComponent, IgxCheckboxComponent, IgxDataLoadingTemplateDirective, NgTemplateOutlet, IgxEmptyListTemplateDirective, IgxTreeComponent, NgFor, IgxTreeNodeComponent, IgxCircularProgressBarComponent, IgxButtonDirective], template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item\n *igxFor=\"let item of displayedListData scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n" }]
703
+ args: [{ selector: 'igx-excel-style-search', standalone: true, imports: [IgxInputGroupComponent, IgxIconComponent, IgxPrefixDirective, FormsModule, IgxInputDirective, NgIf, IgxSuffixDirective, IgxListComponent, IgxForOfDirective, IgxListItemComponent, IgxCheckboxComponent, IgxDataLoadingTemplateDirective, NgTemplateOutlet, IgxEmptyListTemplateDirective, IgxTreeComponent, NgFor, IgxTreeNodeComponent, IgxCircularProgressBarComponent, IgxButtonDirective], template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list role=\"listbox\" [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\" (keydown)=\"handleKeyDown($event)\" tabindex=\"0\"\n[attr.aria-activedescendant]=\"this.activeDescendant\" (focus)=\"onFocus()\" (focusout)=\"onFocusOut()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item [class.igx-list__item-base--active]=\"focusedItem?.id === this.getItemId(i)\" [attr.id]=\"getItemId(i)\" role=\"option\" \n *igxFor=\"let item of displayedListData;index as i; scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n\n <div class=\"igx-excel-filter__filter-results\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_matches_count.replace('{0}', matchesCount) }}\n </div>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\" #cancelButton\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n" }]
566
704
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.BaseFilteringComponent }, { type: i2.PlatformUtil }]; }, propDecorators: { defaultClass: [{
567
705
  type: HostBinding,
568
706
  args: ['class.igx-excel-filter__menu-main']
569
707
  }], searchInput: [{
570
708
  type: ViewChild,
571
709
  args: ['input', { read: IgxInputDirective, static: true }]
710
+ }], cancelButton: [{
711
+ type: ViewChild,
712
+ args: ['cancelButton', { read: IgxButtonDirective, static: true }]
572
713
  }], list: [{
573
714
  type: ViewChild,
574
715
  args: ['list', { read: IgxListComponent, static: false }]
@@ -583,9 +724,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
583
724
  args: ['tree', { read: IgxTreeComponent, static: false }]
584
725
  }], virtDir: [{
585
726
  type: ViewChild,
586
- args: [IgxForOfDirective, { static: true }]
727
+ args: [IgxForOfDirective]
587
728
  }], defaultExcelStyleLoadingValuesTemplate: [{
588
729
  type: ViewChild,
589
730
  args: ['defaultExcelStyleLoadingValuesTemplate', { read: TemplateRef }]
731
+ }], checkboxes: [{
732
+ type: ViewChildren,
733
+ args: [IgxCheckboxComponent]
734
+ }], id: [{
735
+ type: HostBinding,
736
+ args: ['attr.id']
737
+ }, {
738
+ type: Input
590
739
  }] } });
591
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBRVQsV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seURBQXlELENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUNILDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUM5RSx5QkFBeUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFDbEYsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBNEIsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsU0FB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QW9CLEVBQUUsK0JBQStCLEVBQUUsZ0JBQWdCLEVBQUUsNkJBQTZCLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLCtCQUErQixFQUFFLGtCQUFrQixDQUFDO3dLQVNqWSxZQUFZO3NCQURsQixXQUFXO3VCQUFDLG1DQUFtQztnQkFPekMsV0FBVztzQkFEakIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPdEQsSUFBSTtzQkFEVixTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU9yRCxpQkFBaUI7c0JBRHZCLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPdEUsMEJBQTBCO3NCQURoQyxTQUFTO3VCQUFDLDRCQUE0QixFQUFFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBTy9FLElBQUk7c0JBRFYsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPbEQsT0FBTztzQkFEaEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT3BDLHNDQUFzQztzQkFEL0MsU0FBUzt1QkFBQyx3Q0FBd0MsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIFZpZXdDaGlsZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgT25EZXN0cm95LFxuICAgIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4SW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZGVuc2l0eSc7XG5pbXBvcnQgeyBJZ3hGb3JPZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7XG4gICAgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLFxuICAgIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZCwgSWd4VGltZUZpbHRlcmluZ09wZXJhbmRcbn0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUNoYW5nZUNoZWNrYm94RXZlbnRBcmdzLCBJZ3hDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjbG9uZUhpZXJhcmNoaWNhbEFycmF5LCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEJhc2VGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFeHByZXNzaW9uVUksIEZpbHRlckxpc3RJdGVtIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hDaXJjdWxhclByb2dyZXNzQmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneFRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdHJlZS90cmVlLW5vZGUvdHJlZS1ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hUcmVlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdHJlZS90cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hEYXRhTG9hZGluZ1RlbXBsYXRlRGlyZWN0aXZlLCBJZ3hFbXB0eUxpc3RUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2xpc3QvbGlzdC5jb21tb24nO1xuaW1wb3J0IHsgSWd4TGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9saXN0L2xpc3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4TGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2xpc3QvbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9zdWZmaXgvc3VmZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0ZvciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElneFByZWZpeERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvcHJlZml4L3ByZWZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SW5wdXRHcm91cENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2lucHV0LWdyb3VwL2lucHV0LWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJVHJlZU5vZGVTZWxlY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uLy4uL3RyZWUvY29tbW9uJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4RXhjZWxTdHlsZUxvYWRpbmddJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIHB1YmxpYyBzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChfZGlyOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICBjdHg6IHVua25vd24pOiBjdHggaXMgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmRlZmluZWQ+KSB7IH1cbn1cblxuLyoqXG4gKiBBIGNvbXBvbmVudCB1c2VkIGZvciBwcmVzZW50aW5nIEV4Y2VsIHN0eWxlIHNlYXJjaCBVSS5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtZXhjZWwtc3R5bGUtc2VhcmNoJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCBJZ3hJY29uQ29tcG9uZW50LCBJZ3hQcmVmaXhEaXJlY3RpdmUsIEZvcm1zTW9kdWxlLCBJZ3hJbnB1dERpcmVjdGl2ZSwgTmdJZiwgSWd4U3VmZml4RGlyZWN0aXZlLCBJZ3hMaXN0Q29tcG9uZW50LCBJZ3hGb3JPZkRpcmVjdGl2ZSwgSWd4TGlzdEl0ZW1Db21wb25lbnQsIElneENoZWNrYm94Q29tcG9uZW50LCBJZ3hEYXRhTG9hZGluZ1RlbXBsYXRlRGlyZWN0aXZlLCBOZ1RlbXBsYXRlT3V0bGV0LCBJZ3hFbXB0eUxpc3RUZW1wbGF0ZURpcmVjdGl2ZSwgSWd4VHJlZUNvbXBvbmVudCwgTmdGb3IsIElneFRyZWVOb2RlQ29tcG9uZW50LCBJZ3hDaXJjdWxhclByb2dyZXNzQmFyQ29tcG9uZW50LCBJZ3hCdXR0b25EaXJlY3RpdmVdXG59KVxuZXhwb3J0IGNsYXNzIElneEV4Y2VsU3R5bGVTZWFyY2hDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGZpbHRlck9wdGltaXphdGlvblRocmVzaG9sZCA9IDI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWV4Y2VsLWZpbHRlcl9fbWVudS1tYWluJylcbiAgICBwdWJsaWMgZGVmYXVsdENsYXNzID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHJlYWQ6IElneElucHV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgc2VhcmNoSW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsaXN0JywgeyByZWFkOiBJZ3hMaXN0Q29tcG9uZW50LCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIGxpc3Q6IElneExpc3RDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdEFsbENoZWNrYm94JywgeyByZWFkOiBJZ3hDaGVja2JveENvbXBvbmVudCwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBzZWxlY3RBbGxDaGVja2JveDogSWd4Q2hlY2tib3hDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2FkZFRvQ3VycmVudEZpbHRlckNoZWNrYm94JywgeyByZWFkOiBJZ3hDaGVja2JveENvbXBvbmVudCwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBhZGRUb0N1cnJlbnRGaWx0ZXJDaGVja2JveDogSWd4Q2hlY2tib3hDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3RyZWUnLCB7IHJlYWQ6IElneFRyZWVDb21wb25lbnQsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgdHJlZTogSWd4VHJlZUNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hGb3JPZkRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgdmlydERpcjogSWd4Rm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdEFsbEl0ZW0oKTogRmlsdGVyTGlzdEl0ZW0ge1xuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdEFsbEl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdEFsbEl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNGaWx0ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNTcGVjaWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzQmxhbmtzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbCxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0QWxsSXRlbSA9IHNlbGVjdEFsbEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0QWxsSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWRkVG9DdXJyZW50RmlsdGVySXRlbSgpOiBGaWx0ZXJMaXN0SXRlbSB7XG4gICAgICAgIGlmICghdGhpcy5fYWRkVG9DdXJyZW50RmlsdGVySXRlbSkge1xuICAgICAgICAgICAgY29uc3QgYWRkVG9DdXJyZW50RmlsdGVySXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0ZpbHRlcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1NwZWNpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNCbGFua3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hZGRfdG9fZmlsdGVyLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hZGRfdG9fZmlsdGVyXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLl9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtID0gYWRkVG9DdXJyZW50RmlsdGVySXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvYWRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGlzTG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCEodGhpcy5jZHIgYXMgYW55KS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNwbGF5ZWRMaXN0RGF0YTogRmlsdGVyTGlzdEl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbHVlc0xvYWRpbmdUZW1wbGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXNmLmdyaWQ/LmV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVzZi5ncmlkLmV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUudGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2lzTG9hZGluZztcbiAgICBwcml2YXRlIF9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtOiBGaWx0ZXJMaXN0SXRlbTtcbiAgICBwcml2YXRlIF9zZWxlY3RBbGxJdGVtOiBGaWx0ZXJMaXN0SXRlbTtcbiAgICBwcml2YXRlIF9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zOiBGaWx0ZXJMaXN0SXRlbVtdO1xuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyBlc2Y6IEJhc2VGaWx0ZXJpbmdDb21wb25lbnQsIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsKSB7XG4gICAgICAgIGVzZi5sb2FkaW5nU3RhcnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhID0gW107XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBlc2YubG9hZGluZ0VuZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNpemUoKTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBlc2YuaW5pdGlhbGl6ZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZXNmLmNvbHVtbkNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlydERpcj8ucmVzZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBlc2YubGlzdERhdGFMb2FkZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RBbGxJdGVtID0gdGhpcy5lc2YubGlzdERhdGFbMF07XG4gICAgICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpICYmIHRoaXMuZXNmLmxpc3REYXRhWzBdLmlzU3BlY2lhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXNmLmxpc3REYXRhLnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJMaXN0RGF0YSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZWZyZXNoU2l6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoU2l6ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmlydERpcikge1xuICAgICAgICAgICAgdGhpcy52aXJ0RGlyLmlneEZvckNvbnRhaW5lclNpemUgPSB0aGlzLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgICB0aGlzLnZpcnREaXIuaWd4Rm9ySXRlbVNpemUgPSB0aGlzLml0ZW1TaXplO1xuICAgICAgICAgICAgdGhpcy52aXJ0RGlyLnJlY2FsY1VwZGF0ZVNpemVzKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcklucHV0KCkge1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJMaXN0RGF0YSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnRBcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IHRoaXMuZGlzcGxheWVkTGlzdERhdGEuaW5kZXhPZihldmVudEFyZ3MuY2hlY2tib3gudmFsdWUpO1xuICAgICAgICBjb25zdCBzZWxlY3RBbGxCdG4gPSB0aGlzLmRpc3BsYXllZExpc3REYXRhWzBdO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMuYWRkVG9DdXJyZW50RmlsdGVySXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudEFyZ3MuY2hlY2tib3gudmFsdWUuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb1N0YXJ0U2xpY2luZyA9IHRoaXMuZGlzcGxheWVkTGlzdERhdGEuaW5kZXhPZih0aGlzLmFkZFRvQ3VycmVudEZpbHRlckl0ZW0pID4gLTEgPyAyIDogMTtcblxuICAgICAgICAgICAgY29uc3Qgc2xpY2VkQXJyYXkgPVxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEuc2xpY2UoaW5kZXhUb1N0YXJ0U2xpY2luZywgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAoIXNsaWNlZEFycmF5LmZpbmQoZWwgPT4gZWwuaXNTZWxlY3RlZCA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzbGljZWRBcnJheS5maW5kKGVsID0+IGVsLmlzU2VsZWN0ZWQgPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnRBcmdzLmNoZWNrYm94Lm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uU2VsZWN0QWxsQ2hlY2tib3hDaGFuZ2UoZXZlbnRBcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0QWxsSXRlbS5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdEFsbEl0ZW0uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLnRyZWUubm9kZXM7XG4gICAgICAgIHRyZWVOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gKG5vZGUuZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbSkuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoZXZlbnRBcmdzOiBJVHJlZU5vZGVTZWxlY3Rpb25FdmVudCkge1xuICAgICAgICBldmVudEFyZ3MuYWRkZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnRBcmdzLnJlbW92ZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcyA9IGV2ZW50QXJncy5uZXdTZWxlY3Rpb24ubWFwKGl0ZW0gPT4gaXRlbS5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0QWxsQnRuID0gdGhpcy5zZWxlY3RBbGxJdGVtO1xuICAgICAgICBpZiAodGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSB0aGlzLnRyZWUubm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtU2l6ZSgpIHtcbiAgICAgICAgbGV0IGl0ZW1TaXplID0gJzQwcHgnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZXNmLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6IGl0ZW1TaXplID0gJzMycHgnOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDogaXRlbVNpemUgPSAnMjRweCc7IGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1TaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250YWluZXJTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0Py5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR0UgTm92IDFzdCwgMjAyMSAjMTAzNTUgUmV0dXJuIGEgbnVtZXJpYyB2YWx1ZSwgc28gdGhlIGNodW5rIHNpemUgaXMgY2FsY3VsYXRlZCBwcm9wZXJseS5cbiAgICAgICAgLy8gSWYgd2Ugc2tpcCB0aGlzIGJyYW5jaCwgb24gYXBwbHlpbmcgdGhlIGZpbHRlciB0aGUgX2NhbGN1bGF0ZUNodW5rU2l6ZSgpIG1ldGhvZCBvZmYgdGhlIEZvck9mRGlyZWN0aXZlIHJlY2VpdmVzXG4gICAgICAgIC8vIGFuIGlneEZvckNvbnRhaW5lclNpemUgPSB1bmRlZmluZWQsIHRodXMgYXNzaWducyB0aGUgY2h1bmtTaXplIHRvIHRoZSBpZ3hGb3JPZi5sZW5ndGggd2hpY2ggbGVhZHMgdG8gcGVyZm9ybWFuY2UgaXNzdWVzLlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXBwbHlCdXR0b25EaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9zZWxlY3RBbGxJdGVtICYmICF0aGlzLl9zZWxlY3RBbGxJdGVtLmlzU2VsZWN0ZWQgJiYgIXRoaXMuX3NlbGVjdEFsbEl0ZW0uaW5kZXRlcm1pbmF0ZSkgfHxcbiAgICAgICAgICAgICh0aGlzLmRpc3BsYXllZExpc3REYXRhICYmIHRoaXMuZGlzcGxheWVkTGlzdERhdGEubGVuZ3RoID09PSAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FTlRFUjpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybS5LRVlNQVAuRVNDQVBFOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJMaXN0RGF0YSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZXNmLmNvbHVtbj8uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXIgfHxcbiAgICAgICAgICAgIHRoaXMuZXNmLmNvbHVtbj8uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5DdXJyZW5jeSB8fFxuICAgICAgICAgICAgdGhpcy5lc2YuY29sdW1uPy5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLlBlcmNlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0Tm9uTnVtZXJpY2FsRW50cmllcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmVzZi5saXN0RGF0YSB8fCAhdGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhID0gW107XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxlY3RBbGxCdG47XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RBbGxJdGVtKSB7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4gPSB0aGlzLl9zZWxlY3RBbGxJdGVtO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuID0gdGhpcy5lc2YubGlzdERhdGFbMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBhbnlGaWx0ZXJlZCA9IHRoaXMuZXNmLmxpc3REYXRhLnNvbWUoaSA9PiBpLmlzRmlsdGVyZWQpO1xuICAgICAgICAgICAgbGV0IGFueVVuZmlsdGVyZWQgPSB0aGlzLmVzZi5saXN0RGF0YS5zb21lKGkgPT4gIWkuaXNGaWx0ZXJlZCk7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGFueUZpbHRlcmVkICYmIGFueVVuZmlsdGVyZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpICYmIHRoaXMudHJlZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMgPSB0aGlzLnRyZWUubm9kZXMubWFwKG4gPT4gbi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKS5maWx0ZXIoaXRlbSA9PiBpdGVtLmlzRmlsdGVyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmVzZi5saXN0RGF0YS5mb3JFYWNoKGkgPT4gaS5pc1NlbGVjdGVkID0gaS5pc0ZpbHRlcmVkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZExpc3REYXRhICE9PSB0aGlzLmVzZi5saXN0RGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSB0aGlzLmVzZi5saXN0RGF0YTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlLm5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgbi5zZWxlY3RlZCA9IGl0ZW0uaXNTZWxlY3RlZCB8fCBpdGVtLmlzRmlsdGVyZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnlGaWx0ZXJlZCA9IGFueUZpbHRlcmVkIHx8IG4uc2VsZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnlVbmZpbHRlcmVkID0gYW55VW5maWx0ZXJlZCB8fCAhbi5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gYW55RmlsdGVyZWQgJiYgYW55VW5maWx0ZXJlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4ubGFiZWwgPSB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9zZWxlY3RfYWxsO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWFyY2hWYWwgPSB0aGlzLnNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZXNmLmxpc3REYXRhLmZvckVhY2goaSA9PiBpLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkRGF0YSA9IGNsb25lSGllcmFyY2hpY2FsQXJyYXkodGhpcy5lc2YubGlzdERhdGEsICdjaGlsZHJlbicpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSA9IHRoaXMuaGllcmFyY2hpY2FsU2VsZWN0TWF0Y2hlcyhtYXRjaGVkRGF0YSwgc2VhcmNoVmFsKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMudHJlZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgICAgIG4uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgobi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKS5sYWJlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWwpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRBbGxQYXJlbnROb2RlcyhuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSB0aGlzLmVzZi5saXN0RGF0YS5maWx0ZXIoKGl0LCBpKSA9PiAoaSA9PT0gMCAmJiBpdC5pc1NwZWNpYWwpIHx8XG4gICAgICAgICAgICAgICAgKGl0LmxhYmVsICE9PSBudWxsICYmIGl0LmxhYmVsICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWl0LmlzQmxhbmtzICYmXG4gICAgICAgICAgICAgICAgaXQubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVmFsKSA+IC0xKTtcblxuICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IHRydWUpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5zcGxpY2UoMSwgMCwgdGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgIHNlbGVjdEFsbEJ0bi5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZWN0QWxsQnRuLmxhYmVsID0gdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbF9zZWFyY2hfcmVzdWx0cztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFwcGx5RmlsdGVyKCkge1xuICAgICAgICBjb25zdCBmaWx0ZXJUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5PciwgdGhpcy5lc2YuY29sdW1uLmZpZWxkKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJDaGVja2JveCAmJiB0aGlzLmFkZFRvQ3VycmVudEZpbHRlckNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbHRlcmVkVG9TZWxlY3RlZEl0ZW1zKHRoaXMuZXNmLmxpc3REYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YVsxXTtcbiAgICAgICAgICAgIGNvbnN0IGFkZFRvQ3VycmVudEZpbHRlck9wdGlvblZpc2libGUgPSBpdGVtID09PSB0aGlzLmFkZFRvQ3VycmVudEZpbHRlckl0ZW07XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zID0gYWRkVG9DdXJyZW50RmlsdGVyT3B0aW9uVmlzaWJsZSAmJiBpdGVtLmlzU2VsZWN0ZWQgP1xuICAgICAgICAgICAgICAgIHRoaXMuZXNmLmxpc3REYXRhLnNsaWNlKDEsIHRoaXMuZXNmLmxpc3REYXRhLmxlbmd0aCkuZmlsdGVyKGVsID0+IGVsLmlzU2VsZWN0ZWQgfHwgZWwuaXNGaWx0ZXJlZCkgOlxuICAgICAgICAgICAgICAgIHRoaXMuZXNmLmxpc3REYXRhLnNsaWNlKDEsIHRoaXMuZXNmLmxpc3REYXRhLmxlbmd0aCkuZmlsdGVyKGVsID0+IGVsLmlzU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVuc2VsZWN0ZWRJdGVtO1xuICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpKSB7XG4gICAgICAgICAgICB1bnNlbGVjdGVkSXRlbSA9IHRoaXMuZXNmLmxpc3REYXRhLmZpbmQoZWwgPT4gZWwuaXNTZWxlY3RlZCA9PT0gZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5zZWxlY3RlZEl0ZW0gPSB0aGlzLmVzZi5saXN0RGF0YS5zbGljZSgxLCB0aGlzLmVzZi5saXN0RGF0YS5sZW5ndGgpLmZpbmQoZWwgPT4gZWwuaXNTZWxlY3RlZCA9PT0gZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPD0gSWd4RXhjZWxTdHlsZVNlYXJjaENvbXBvbmVudC5maWx0ZXJPcHRpbWl6YXRpb25UaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZSAhPT0gbnVsbCAmJiBlbGVtZW50LnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gdGhpcy5jcmVhdGVDb25kaXRpb24oZWxlbWVudC52YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyQ29uZGl0aW9uID0gdGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZSA/ICdhdCcgOiAnZXF1YWxzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNyZWF0ZUNvbmRpdGlvbihmaWx0ZXJDb25kaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gdGhpcy5jcmVhdGVDb25kaXRpb24oJ2VtcHR5Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5lc2YuY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogdGhpcy5lc2YuY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWw6IGVsZW1lbnQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsYW5rc0l0ZW1JbmRleCA9IHNlbGVjdGVkSXRlbXMuZmluZEluZGV4KGUgPT4gZS52YWx1ZSA9PT0gbnVsbCB8fCBlLnZhbHVlID09PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGxldCBibGFua3NJdGVtOiBhbnk7XG4gICAgICAgICAgICAgICAgaWYgKGJsYW5rc0l0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsYW5rc0l0ZW0gPSBzZWxlY3RlZEl0ZW1zW2JsYW5rc0l0ZW1JbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuc3BsaWNlKGJsYW5rc0l0ZW1JbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbHRlclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5jcmVhdGVDb25kaXRpb24oJ2luJyksXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5lc2YuY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmVzZi5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsOiBuZXcgU2V0KHRoaXMuZXNmLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXNmLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGVUaW1lID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMubWFwKGQgPT4gZC52YWx1ZS50b0lTT1N0cmluZygpKSA6IHRoaXMuZXNmLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLlRpbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMubWFwKGUgPT4gZS52YWx1ZS50b0xvY2FsZVRpbWVTdHJpbmcoKSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMubWFwKGUgPT4gZS52YWx1ZSkpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmxhbmtzSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNyZWF0ZUNvbmRpdGlvbignZW1wdHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5lc2YuY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogdGhpcy5lc2YuY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWw6IGJsYW5rc0l0ZW0udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZXNmLmdyaWQ7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmVzZi5jb2x1bW47XG4gICAgICAgICAgICBncmlkLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVySW50ZXJuYWwoY29sLmZpZWxkLCBmaWx0ZXJUcmVlKTtcbiAgICAgICAgICAgIHRoaXMuZXNmLmV4cHJlc3Npb25zTGlzdCA9IG5ldyBBcnJheTxFeHByZXNzaW9uVUk+KCk7XG4gICAgICAgICAgICBncmlkLmZpbHRlcmluZ1NlcnZpY2UuZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3QoY29sLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgICAgICAgICBncmlkLmZpbHRlcmluZ0xvZ2ljLCB0aGlzLmVzZi5leHByZXNzaW9uc0xpc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lc2YuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKHRoaXMuZXNmLmNvbHVtbi5maWVsZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVzZi5jbG9zZURyb3Bkb3duKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNIaWVyYXJjaGljYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVzZi5pc0hpZXJhcmNoaWNhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1RyZWVFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNmLmlzSGllcmFyY2hpY2FsICYmIHRoaXMuZGlzcGxheWVkTGlzdERhdGEubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGllcmFyY2hpY2FsU2VsZWN0TWF0Y2hlcyhkYXRhOiBGaWx0ZXJMaXN0SXRlbVtdLCBzZWFyY2hWYWw6IHN0cmluZykge1xuICAgICAgICBkYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGVsZW1lbnQuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMudHJlZS5ub2Rlcy5maWx0ZXIobiA9PiAobi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKS5sYWJlbCA9PT0gZWxlbWVudC5sYWJlbClbMF07XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVmFsKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoaWNhbFNlbGVjdEFsbENoaWxkcmVuKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jaGlsZHJlbiA9IHRoaXMuaGllcmFyY2hpY2FsU2VsZWN0TWF0Y2hlcyhlbGVtZW50LmNoaWxkcmVuLCBzZWFyY2hWYWwpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50LmlzU2VsZWN0ZWQgPT09IHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGllcmFyY2hpY2FsU2VsZWN0QWxsQ2hpbGRyZW4oZWxlbWVudDogRmlsdGVyTGlzdEl0ZW0pIHtcbiAgICAgICAgZWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGNoaWxkLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY2FsU2VsZWN0QWxsQ2hpbGRyZW4oY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgZXhwYW5kQWxsUGFyZW50Tm9kZXMobm9kZTogYW55KSB7XG4gICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZEFsbFBhcmVudE5vZGVzKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEZpbHRlcmVkVG9TZWxlY3RlZEl0ZW1zKHJlY29yZHM6IEZpbHRlckxpc3RJdGVtW10pIHtcbiAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKHJlY29yZCA9PiB7XG4gICAgICAgICAgICBpZiAocmVjb3JkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWx0ZXJlZFRvU2VsZWN0ZWRJdGVtcyhyZWNvcmQuY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVjb3JkLmlzRmlsdGVyZWQgJiYgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5pbmRleE9mKHJlY29yZCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb25kaXRpb24oY29uZGl0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLk51bWJlcjpcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkN1cnJlbmN5OlxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuUGVyY2VudDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkRhdGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWd4VGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWplY3ROb25OdW1lcmljYWxFbnRyaWVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWdFeHAgPSAvW14wLTlcXC4sZUVcXC1dL2c7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlICYmIHJlZ0V4cC50ZXN0KHRoaXMuc2VhcmNoVmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlID0gdGhpcy5zZWFyY2hWYWx1ZS5yZXBsYWNlKHJlZ0V4cCwgJycpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoSW5wdXQudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8aWd4LWlucHV0LWdyb3VwXG4gICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJlc2YuZGlzcGxheURlbnNpdHlcIj5cbiAgICA8aWd4LWljb24gaWd4UHJlZml4PnNlYXJjaDwvaWd4LWljb24+XG4gICAgPGlucHV0XG4gICAgICAgICNpbnB1dFxuICAgICAgICBpZ3hJbnB1dFxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyTGlzdERhdGEoKVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZXNmLmNvbHVtbj8uZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VhcmNoX3BsYWNlaG9sZGVyXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIvPlxuICAgIDxpZ3gtaWNvblxuICAgICAgICBpZ3hTdWZmaXhcbiAgICAgICAgKm5nSWY9XCJzZWFyY2hWYWx1ZSB8fCBzZWFyY2hWYWx1ZSA9PT0gMFwiXG4gICAgICAgIChjbGljayk9XCJjbGVhcklucHV0KClcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgY2xlYXJcbiAgICA8L2lneC1pY29uPlxuPC9pZ3gtaW5wdXQtZ3JvdXA+XG5cbjxpZ3gtbGlzdCAjbGlzdCBbZGlzcGxheURlbnNpdHldPVwiZXNmLmRpc3BsYXlEZW5zaXR5XCIgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIiAqbmdJZj1cIiFpc0hpZXJhcmNoaWNhbCgpXCI+XG4gICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cbiAgICAgICAgPGlneC1saXN0LWl0ZW1cbiAgICAgICAgKmlneEZvcj1cImxldCBpdGVtIG9mIGRpc3BsYXllZExpc3REYXRhIHNjcm9sbE9yaWVudGF0aW9uIDogJ3ZlcnRpY2FsJzsgY29udGFpbmVyU2l6ZTogY29udGFpbmVyU2l6ZTsgaXRlbVNpemU6IGl0ZW1TaXplXCI+XG4gICAgICAgICAgICA8aWd4LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXRlbT8uaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaXRlbT8uaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVUcmFuc2l0aW9uc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgICAgICA8L2lneC1saXN0LWl0ZW0+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgaWd4RGF0YUxvYWRpbmc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19sb2FkaW5nXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmFsdWVzTG9hZGluZ1RlbXBsYXRlXCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSBpZ3hFbXB0eUxpc3Q+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVNlYXJjaFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L2lneC1saXN0PlxuXG48ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZVwiICpuZ0lmPVwiaXNIaWVyYXJjaGljYWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX190cmVlLWFsaWtlXCIgKm5nSWY9XCIhaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCI+XG4gICAgICAgICAgICA8aWd4LWNoZWNrYm94ICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0QWxsSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdEFsbEl0ZW0/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0QWxsSXRlbT8uaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlVHJhbnNpdGlvbnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxDaGVja2JveENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAge3sgc2VsZWN0QWxsSXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9pZ3gtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCIgKm5nSWY9XCJzZWFyY2hWYWx1ZVwiPlxuICAgICAgICAgICAgPGlneC1jaGVja2JveCAjYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFkZFRvQ3VycmVudEZpbHRlckl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVUcmFuc2l0aW9uc109XCJ0cnVlXCI+XG5cbiAgICAgICAgICAgICAgICB7eyBhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L2lneC1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8aWd4LXRyZWUgI3RyZWUgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiIHNlbGVjdGlvbj1cIkNhc2NhZGluZ1wiICAobm9kZVNlbGVjdGlvbik9XCJvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJpdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGlzcGxheWVkTGlzdERhdGE7XCIgW3NlbGVjdGVkXT1cIml0ZW0uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgICAgPGRpdj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxuICAgICAgICAgICAgPGlneC10cmVlLW5vZGUgW2RhdGFdPVwiY2hpbGRMZXZlbDFcIiAqbmdGb3I9XCJsZXQgY2hpbGRMZXZlbDEgb2YgaXRlbS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWwxLmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsMlwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsMiBvZiBjaGlsZExldmVsMS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMi5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWwzXCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWwzIG9mIGNoaWxkTGV2ZWwyLmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWwzLmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMy5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNCBvZiBjaGlsZExldmVsMy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw0LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNVwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNSBvZiBjaGlsZExldmVsNC5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw2XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw2IG9mIGNoaWxkTGV2ZWw1LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw2LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsN1wiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNyBvZiBjaGlsZExldmVsNi5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNy5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw3LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsOFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsOCBvZiBjaGlsZExldmVsNy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsOC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOC5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw5XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw5IG9mIGNoaWxkTGV2ZWw4LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw5LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICA8L2lneC10cmVlPlxuXG4gICAgPG5nLXRlbXBsYXRlIGlneERhdGFMb2FkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlc0xvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlTZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTZWFyY2g+XG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2VtcHR5XCI+XG4gICAgICAgIHt7ZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9ub19tYXRjaGVzfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGU+XG4gICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiPlxuICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxmb290ZXIgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19tZW51LWZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19jYW5jZWxcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEJ1dHRvbj1cImZsYXRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZXNmLmNhbmNlbCgpXCI+XG4gICAgICAgICAgICAgICAge3sgZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9jYW5jZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2FwcGx5XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJyYWlzZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXBwbHlCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgIHt7IGVzZi5ncmlkPy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfYXBwbHkgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Zvb3Rlcj5cbiJdfQ==
740
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFDTCxZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUN6RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQ0gsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQzlFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixFQUNsRixNQUFNLDhDQUE4QyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUE0QixvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFD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dCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIFZpZXdDaGlsZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgT25EZXN0cm95LFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9kZW5zaXR5JztcbmltcG9ydCB7IElneEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHtcbiAgICBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZCwgSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZFxufSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MsIElneENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lSGllcmFyY2hpY2FsQXJyYXksIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4vYmFzZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnQsIEV4cHJlc3Npb25VSSwgRmlsdGVyTGlzdEl0ZW0gfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBJZ3hCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENpcmN1bGFyUHJvZ3Jlc3NCYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VHJlZU5vZGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi90cmVlL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IElneFRyZWVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi90cmVlL3RyZWUuY29tcG9uZW50JztcbmltcG9ydCB7IElneERhdGFMb2FkaW5nVGVtcGxhdGVEaXJlY3RpdmUsIElneEVtcHR5TGlzdFRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vbGlzdC9saXN0LmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2xpc3QvbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbGlzdC9saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hTdWZmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL3N1ZmZpeC9zdWZmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIE5nRm9yIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaW5wdXQtZ3JvdXAvaW5wdXQtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElUcmVlTm9kZVNlbGVjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vdHJlZS9jb21tb24nO1xuaW1wb3J0IHsgTmF2aWdhdGUgfSBmcm9tICcuLi8uLi8uLi9kcm9wLWRvd24vZHJvcC1kb3duLmNvbW1vbic7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneEV4Y2VsU3R5bGVMb2FkaW5nXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBwdWJsaWMgc3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoX2RpcjogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgY3R4OiB1bmtub3duKTogY3R4IGlzIHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5kZWZpbmVkPikgeyB9XG59XG5cbmxldCBORVhUX0lEID0gMDtcbi8qKlxuICogQSBjb21wb25lbnQgdXNlZCBmb3IgcHJlc2VudGluZyBFeGNlbCBzdHlsZSBzZWFyY2ggVUkuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWV4Y2VsLXN0eWxlLXNlYXJjaCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2V4Y2VsLXN0eWxlLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SWNvbkNvbXBvbmVudCwgSWd4UHJlZml4RGlyZWN0aXZlLCBGb3Jtc01vZHVsZSwgSWd4SW5wdXREaXJlY3RpdmUsIE5nSWYsIElneFN1ZmZpeERpcmVjdGl2ZSwgSWd4TGlzdENvbXBvbmVudCwgSWd4Rm9yT2ZEaXJlY3RpdmUsIElneExpc3RJdGVtQ29tcG9uZW50LCBJZ3hDaGVja2JveENvbXBvbmVudCwgSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSwgTmdUZW1wbGF0ZU91dGxldCwgSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUsIElneFRyZWVDb21wb25lbnQsIE5nRm9yLCBJZ3hUcmVlTm9kZUNvbXBvbmVudCwgSWd4Q2lyY3VsYXJQcm9ncmVzc0JhckNvbXBvbmVudCwgSWd4QnV0dG9uRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hFeGNlbFN0eWxlU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBmaWx0ZXJPcHRpbWl6YXRpb25UaHJlc2hvbGQgPSAyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1leGNlbC1maWx0ZXJfX21lbnUtbWFpbicpXG4gICAgcHVibGljIGRlZmF1bHRDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyByZWFkOiBJZ3hJbnB1dERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHNlYXJjaElucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NhbmNlbEJ1dHRvbicsIHtyZWFkOiBJZ3hCdXR0b25EaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjYW5jZWxCdXR0b246IElneEJ1dHRvbkRpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbGlzdCcsIHsgcmVhZDogSWd4TGlzdENvbXBvbmVudCwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBsaXN0OiBJZ3hMaXN0Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzZWxlY3RBbGxDaGVja2JveCcsIHsgcmVhZDogSWd4Q2hlY2tib3hDb21wb25lbnQsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgc2VsZWN0QWxsQ2hlY2tib3g6IElneENoZWNrYm94Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdhZGRUb0N1cnJlbnRGaWx0ZXJDaGVja2JveCcsIHsgcmVhZDogSWd4Q2hlY2tib3hDb21wb25lbnQsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3g6IElneENoZWNrYm94Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0cmVlJywgeyByZWFkOiBJZ3hUcmVlQ29tcG9uZW50LCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIHRyZWU6IElneFRyZWVDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4Rm9yT2ZEaXJlY3RpdmUpXG4gICAgcHJvdGVjdGVkIHZpcnREaXI6IElneEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Q2hlY2tib3hDb21wb25lbnQpXG4gICAgcHJvdGVjdGVkIGNoZWNrYm94ZXM6IFF1ZXJ5TGlzdDxJZ3hDaGVja2JveENvbXBvbmVudD47XG4gICAgXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdEFsbEl0ZW0oKTogRmlsdGVyTGlzdEl0ZW0ge1xuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdEFsbEl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdEFsbEl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNGaWx0ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNTcGVjaWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzQmxhbmtzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbCxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0QWxsSXRlbSA9IHNlbGVjdEFsbEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0QWxsSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWRkVG9DdXJyZW50RmlsdGVySXRlbSgpOiBGaWx0ZXJMaXN0SXRlbSB7XG4gICAgICAgIGlmICghdGhpcy5fYWRkVG9DdXJyZW50RmlsdGVySXRlbSkge1xuICAgICAgICAgICAgY29uc3QgYWRkVG9DdXJyZW50RmlsdGVySXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0ZpbHRlcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1NwZWNpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNCbGFua3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hZGRfdG9fZmlsdGVyLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hZGRfdG9fZmlsdGVyXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLl9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtID0gYWRkVG9DdXJyZW50RmlsdGVySXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvYWRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGlzTG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCEodGhpcy5jZHIgYXMgYW55KS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNwbGF5ZWRMaXN0RGF0YTogRmlsdGVyTGlzdEl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hlc0NvdW50OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWVzTG9hZGluZ1RlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5lc2YuZ3JpZD8uZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXNmLmdyaWQuZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZS50ZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFjdGl2ZURlc2NlbmRhbnQgPSAnJztcblxuICAgIHByaXZhdGUgX2lkID0gYGlneC1leGNlbC1zdHlsZS1zZWFyY2gtJHtORVhUX0lEKyt9YDtcbiAgICBwcml2YXRlIF9pc0xvYWRpbmc7XG4gICAgcHJpdmF0ZSBfYWRkVG9DdXJyZW50RmlsdGVySXRlbTogRmlsdGVyTGlzdEl0ZW07XG4gICAgcHJpdmF0ZSBfc2VsZWN0QWxsSXRlbTogRmlsdGVyTGlzdEl0ZW07XG4gICAgcHJpdmF0ZSBfaGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtczogRmlsdGVyTGlzdEl0ZW1bXTtcbiAgICBwcml2YXRlIF9mb2N1c2VkSXRlbTogQWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIGVzZjogQmFzZUZpbHRlcmluZ0NvbXBvbmVudCwgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwpIHtcbiAgICAgICAgZXNmLmxvYWRpbmdTdGFydC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVzZi5sb2FkaW5nRW5kLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2l6ZSgpO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVzZi5pbml0aWFsaXplZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlc2YuY29sdW1uQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aXJ0RGlyPy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVzZi5saXN0RGF0YUxvYWRlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdEFsbEl0ZW0gPSB0aGlzLmVzZi5saXN0RGF0YVswXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkgJiYgdGhpcy5lc2YubGlzdERhdGFbMF0uaXNTcGVjaWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuc3BsaWNlKDAsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckxpc3REYXRhKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlZnJlc2hTaXplKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hTaXplID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy52aXJ0RGlyKSB7XG4gICAgICAgICAgICB0aGlzLnZpcnREaXIuaWd4Rm9yQ29udGFpbmVyU2l6ZSA9IHRoaXMuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgICAgIHRoaXMudmlydERpci5pZ3hGb3JJdGVtU2l6ZSA9IHRoaXMuaXRlbVNpemU7XG4gICAgICAgICAgICB0aGlzLnZpcnREaXIucmVjYWxjVXBkYXRlU2l6ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsZWFySW5wdXQoKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlckxpc3REYXRhKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGVja2JveENoYW5nZShldmVudEFyZ3M6IElDaGFuZ2VDaGVja2JveEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5pbmRleE9mKGV2ZW50QXJncy5jaGVja2JveC52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdEFsbEJ0biA9IHRoaXMuZGlzcGxheWVkTGlzdERhdGFbMF07XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gdGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50QXJncy5jaGVja2JveC52YWx1ZS5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvU3RhcnRTbGljaW5nID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5pbmRleE9mKHRoaXMuYWRkVG9DdXJyZW50RmlsdGVySXRlbSkgPiAtMSA/IDIgOiAxO1xuXG4gICAgICAgICAgICBjb25zdCBzbGljZWRBcnJheSA9XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5zbGljZShpbmRleFRvU3RhcnRTbGljaW5nLCB0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICghc2xpY2VkQXJyYXkuZmluZChlbCA9PiBlbC5pc1NlbGVjdGVkID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNsaWNlZEFycmF5LmZpbmQoZWwgPT4gZWwuaXNTZWxlY3RlZCA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uU2VsZWN0QWxsQ2hlY2tib3hDaGFuZ2UoZXZlbnRBcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0QWxsSXRlbS5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdEFsbEl0ZW0uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLnRyZWUubm9kZXM7XG4gICAgICAgIHRyZWVOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gKG5vZGUuZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbSkuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoZXZlbnRBcmdzOiBJVHJlZU5vZGVTZWxlY3Rpb25FdmVudCkge1xuICAgICAgICBldmVudEFyZ3MuYWRkZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnRBcmdzLnJlbW92ZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcyA9IGV2ZW50QXJncy5uZXdTZWxlY3Rpb24ubWFwKGl0ZW0gPT4gaXRlbS5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0QWxsQnRuID0gdGhpcy5zZWxlY3RBbGxJdGVtO1xuICAgICAgICBpZiAodGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSB0aGlzLnRyZWUubm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtU2l6ZSgpIHtcbiAgICAgICAgbGV0IGl0ZW1TaXplID0gJzQwcHgnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZXNmLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6IGl0ZW1TaXplID0gJzMycHgnOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDogaXRlbVNpemUgPSAnMjRweCc7IGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1TaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250YWluZXJTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0Py5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR0UgTm92IDFzdCwgMjAyMSAjMTAzNTUgUmV0dXJuIGEgbnVtZXJpYyB2YWx1ZSwgc28gdGhlIGNodW5rIHNpemUgaXMgY2FsY3VsYXRlZCBwcm9wZXJseS5cbiAgICAgICAgLy8gSWYgd2Ugc2tpcCB0aGlzIGJyYW5jaCwgb24gYXBwbHlpbmcgdGhlIGZpbHRlciB0aGUgX2NhbGN1bGF0ZUNodW5rU2l6ZSgpIG1ldGhvZCBvZmYgdGhlIEZvck9mRGlyZWN0aXZlIHJlY2VpdmVzXG4gICAgICAgIC8vIGFuIGlneEZvckNvbnRhaW5lclNpemUgPSB1bmRlZmluZWQsIHRodXMgYXNzaWducyB0aGUgY2h1bmtTaXplIHRvIHRoZSBpZ3hGb3JPZi5sZW5ndGggd2hpY2ggbGVhZHMgdG8gcGVyZm9ybWFuY2UgaXNzdWVzLlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHJvdGVjdGVkIGdldCBpZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtSWQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmlkfS1pdGVtLSR7aW5kZXh9YDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0QWN0aXZlRGVzY2VuZGFudCgpIDogdm9pZCAge1xuICAgICAgICB0aGlzLmFjdGl2ZURlc2NlbmRhbnQgPSB0aGlzLmZvY3VzZWRJdGVtPy5pZCB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGZvY3VzZWRJdGVtKCk6IEFjdGl2ZUVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNlZEl0ZW07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldCBmb2N1c2VkSXRlbSh2YWw6IEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZEl0ZW0gPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFwcGx5QnV0dG9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fc2VsZWN0QWxsSXRlbSAmJiAhdGhpcy5fc2VsZWN0QWxsSXRlbS5pc1NlbGVjdGVkICYmICF0aGlzLl9zZWxlY3RBbGxJdGVtLmluZGV0ZXJtaW5hdGUpIHx8XG4gICAgICAgICAgICAodGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSAmJiB0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybS5LRVlNQVAuRU5URVI6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIHRoaXMucGxhdGZvcm0uS0VZTUFQLkVTQ0FQRTpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyTGlzdERhdGEoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVzZi5jb2x1bW4/LmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyIHx8XG4gICAgICAgICAgICB0aGlzLmVzZi5jb2x1bW4/LmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3kgfHxcbiAgICAgICAgICAgIHRoaXMuZXNmLmNvbHVtbj8uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5QZXJjZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdE5vbk51bWVyaWNhbEVudHJpZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5lc2YubGlzdERhdGEgfHwgIXRoaXMuZXNmLmxpc3REYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSA9IFtdO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0QWxsQnRuO1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0QWxsSXRlbSkge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuID0gdGhpcy5fc2VsZWN0QWxsSXRlbTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0biA9IHRoaXMuZXNmLmxpc3REYXRhWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgYW55RmlsdGVyZWQgPSB0aGlzLmVzZi5saXN0RGF0YS5zb21lKGkgPT4gaS5pc0ZpbHRlcmVkKTtcbiAgICAgICAgICAgIGxldCBhbnlVbmZpbHRlcmVkID0gdGhpcy5lc2YubGlzdERhdGEuc29tZShpID0+ICFpLmlzRmlsdGVyZWQpO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBhbnlGaWx0ZXJlZCAmJiBhbnlVbmZpbHRlcmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWwoKSAmJiB0aGlzLnRyZWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zID0gdGhpcy50cmVlLm5vZGVzLm1hcChuID0+IG4uZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbSkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc0ZpbHRlcmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGkuaXNGaWx0ZXJlZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSAhPT0gdGhpcy5lc2YubGlzdERhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhID0gdGhpcy5lc2YubGlzdERhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG4uZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4uc2VsZWN0ZWQgPSBpdGVtLmlzU2VsZWN0ZWQgfHwgaXRlbS5pc0ZpbHRlcmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW55RmlsdGVyZWQgPSBhbnlGaWx0ZXJlZCB8fCBuLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW55VW5maWx0ZXJlZCA9IGFueVVuZmlsdGVyZWQgfHwgIW4uc2VsZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGFueUZpbHRlcmVkICYmIGFueVVuZmlsdGVyZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmxhYmVsID0gdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbDtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlc0NvdW50ID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWFyY2hWYWwgPSB0aGlzLnNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZXNmLmxpc3REYXRhLmZvckVhY2goaSA9PiBpLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkRGF0YSA9IGNsb25lSGllcmFyY2hpY2FsQXJyYXkodGhpcy5lc2YubGlzdERhdGEsICdjaGlsZHJlbicpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSA9IHRoaXMuaGllcmFyY2hpY2FsU2VsZWN0TWF0Y2hlcyhtYXRjaGVkRGF0YSwgc2VhcmNoVmFsKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMudHJlZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgICAgIG4uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgobi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKS5sYWJlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWwpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRBbGxQYXJlbnROb2RlcyhuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSB0aGlzLmVzZi5saXN0RGF0YS5maWx0ZXIoKGl0LCBpKSA9PiAoaSA9PT0gMCAmJiBpdC5pc1NwZWNpYWwpIHx8XG4gICAgICAgICAgICAgICAgKGl0LmxhYmVsICE9PSBudWxsICYmIGl0LmxhYmVsICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWl0LmlzQmxhbmtzICYmXG4gICAgICAgICAgICAgICAgaXQubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVmFsKSA+IC0xKTtcblxuICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IHRydWUpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5zcGxpY2UoMSwgMCwgdGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlc0NvdW50ID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGggLSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzQ291bnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxlY3RBbGxCdG4ubGFiZWwgPSB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9zZWxlY3RfYWxsX3NlYXJjaF9yZXN1bHRzO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwbHlGaWx0ZXIoKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlclRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLk9yLCB0aGlzLmVzZi5jb2x1bW4uZmllbGQpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZFRvQ3VycmVudEZpbHRlckNoZWNrYm94ICYmIHRoaXMuYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyZWRUb1NlbGVjdGVkSXRlbXModGhpcy5lc2YubGlzdERhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zID0gdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmRpc3BsYXllZExpc3REYXRhWzFdO1xuICAgICAgICAgICAgY29uc3QgYWRkVG9DdXJyZW50RmlsdGVyT3B0aW9uVmlzaWJsZSA9IGl0ZW0gPT09IHRoaXMuYWRkVG9DdXJyZW50RmlsdGVySXRlbTtcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMgPSBhZGRUb0N1cnJlbnRGaWx0ZXJPcHRpb25WaXNpYmxlICYmIGl0ZW0uaXNTZWxlY3RlZCA/XG4gICAgICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuc2xpY2UoMSwgdGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKS5maWx0ZXIoZWwgPT4gZWwuaXNTZWxlY3RlZCB8fCBlbC5pc0ZpbHRlcmVkKSA6XG4gICAgICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuc2xpY2UoMSwgdGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKS5maWx0ZXIoZWwgPT4gZWwuaXNTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdW5zZWxlY3RlZEl0ZW07XG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkpIHtcbiAgICAgICAgICAgIHVuc2VsZWN0ZWRJdGVtID0gdGhpcy5lc2YubGlzdERhdGEuZmluZChlbCA9PiBlbC5pc1NlbGVjdGVkID09PSBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bnNlbGVjdGVkSXRlbSA9IHRoaXMuZXNmLmxpc3REYXRhLnNsaWNlKDEsIHRoaXMuZXNmLmxpc3REYXRhLmxlbmd0aCkuZmluZChlbCA9PiBlbC5pc1NlbGVjdGVkID09PSBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA8PSBJZ3hFeGNlbFN0eWxlU2VhcmNoQ29tcG9uZW50LmZpbHRlck9wdGltaXphdGlvblRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbHVlICE9PSBudWxsICYmIGVsZW1lbnQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXNmLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNyZWF0ZUNvbmRpdGlvbihlbGVtZW50LnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJDb25kaXRpb24gPSB0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lID8gJ2F0JyA6ICdlcXVhbHMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRoaXMuY3JlYXRlQ29uZGl0aW9uKGZpbHRlckNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNyZWF0ZUNvbmRpdGlvbignZW1wdHknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmVzZi5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmVzZi5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogZWxlbWVudC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxhbmtzSXRlbUluZGV4ID0gc2VsZWN0ZWRJdGVtcy5maW5kSW5kZXgoZSA9PiBlLnZhbHVlID09PSBudWxsIHx8IGUudmFsdWUgPT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgbGV0IGJsYW5rc0l0ZW06IGFueTtcbiAgICAgICAgICAgICAgICBpZiAoYmxhbmtzSXRlbUluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYmxhbmtzSXRlbSA9IHNlbGVjdGVkSXRlbXNbYmxhbmtzSXRlbUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5zcGxpY2UoYmxhbmtzSXRlbUluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmlsdGVyVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNyZWF0ZUNvbmRpdGlvbignaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmVzZi5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRoaXMuZXNmLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWw6IG5ldyBTZXQodGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5tYXAoZCA9PiBkLnZhbHVlLnRvSVNPU3RyaW5nKCkpIDogdGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5tYXAoZSA9PiBlLnZhbHVlLnRvTG9jYWxlVGltZVN0cmluZygpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5tYXAoZSA9PiBlLnZhbHVlKSlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChibGFua3NJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IHRoaXMuY3JlYXRlQ29uZGl0aW9uKCdlbXB0eScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmVzZi5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmVzZi5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogYmxhbmtzSXRlbS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBncmlkID0gdGhpcy5lc2YuZ3JpZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuZXNmLmNvbHVtbjtcbiAgICAgICAgICAgIGdyaWQuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJJbnRlcm5hbChjb2wuZmllbGQsIGZpbHRlclRyZWUpO1xuICAgICAgICAgICAgdGhpcy5lc2YuZXhwcmVzc2lvbnNMaXN0ID0gbmV3IEFycmF5PEV4cHJlc3Npb25VST4oKTtcbiAgICAgICAgICAgIGdyaWQuZmlsdGVyaW5nU2VydmljZS5nZW5lcmF0ZUV4cHJlc3Npb25zTGlzdChjb2wuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICAgICAgICAgIGdyaWQuZmlsdGVyaW5nTG9naWMsIHRoaXMuZXNmLmV4cHJlc3Npb25zTGlzdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVzZi5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJGaWx0ZXIodGhpcy5lc2YuY29sdW1uLmZpZWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXNmLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgbmF2S2V5cyA9IFsnc3BhY2UnLCAnc3BhY2ViYXInLCAnICcsXG4gICAgICAgICAgICAnYXJyb3d1cCcsICd1cCcsICdhcnJvd2Rvd24nLCAnZG93bicsICdob21lJywgJ2VuZCddO1xuICAgICAgICAgICAgICAgIGlmIChuYXZLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHsgLy8gSWYga2V5IGhhcyBhcHByb3ByaWF0ZSBmdW5jdGlvbiBpbiBERFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFycm93VXBLZXlEb3duKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BcnJvd0Rvd25LZXlEb3duKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvbWUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uSG9tZUtleURvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVuZEtleURvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlYmFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFjdGlvbktleURvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9jdXMoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXhJblZpZXcgPSB0aGlzLnZpcnREaXIuc3RhdGUuc3RhcnRJbmRleDtcbiAgICAgICAgdGhpcy5mb2N1c2VkSXRlbSA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmdldEl0ZW1JZChmaXJzdEluZGV4SW5WaWV3KSxcbiAgICAgICAgICAgIGluZGV4OiBmaXJzdEluZGV4SW5WaWV3LFxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy52aXJ0RGlyLmlneEZvck9mW2ZpcnN0SW5kZXhJblZpZXddLmlzU2VsZWN0ZWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9jdXNPdXQoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZEl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0hpZXJhcmNoaWNhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNmLmlzSGllcmFyY2hpY2FsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzVHJlZUVtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lc2YuaXNIaWVyYXJjaGljYWwgJiYgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWVyYXJjaGljYWxTZWxlY3RNYXRjaGVzKGRhdGE6IEZpbHRlckxpc3RJdGVtW10sIHNlYXJjaFZhbDogc3RyaW5nKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy50cmVlLm5vZGVzLmZpbHRlcihuID0+IChuLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmxhYmVsID09PSBlbGVtZW50LmxhYmVsKVswXTtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5sYWJlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWwpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY2FsU2VsZWN0QWxsQ2hpbGRyZW4oZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuID0gdGhpcy5oaWVyYXJjaGljYWxTZWxlY3RNYXRjaGVzKGVsZW1lbnQuY2hpbGRyZW4sIHNlYXJjaFZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuaXNTZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWVyYXJjaGljYWxTZWxlY3RBbGxDaGlsZHJlbihlbGVtZW50OiBGaWx0ZXJMaXN0SXRlbSkge1xuICAgICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgICAgY2hpbGQuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgY2hpbGQuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWVyYXJjaGljYWxTZWxlY3RBbGxDaGlsZHJlbihjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHBhbmRBbGxQYXJlbnROb2Rlcyhub2RlOiBhbnkpIHtcbiAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kQWxsUGFyZW50Tm9kZXMobm9kZS5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRmlsdGVyZWRUb1NlbGVjdGVkSXRlbXMocmVjb3JkczogRmlsdGVyTGlzdEl0ZW1bXSkge1xuICAgICAgICByZWNvcmRzLmZvckVhY2gocmVjb3JkID0+IHtcbiAgICAgICAgICAgIGlmIChyZWNvcmQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbHRlcmVkVG9TZWxlY3RlZEl0ZW1zKHJlY29yZC5jaGlsZHJlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZWNvcmQuaXNGaWx0ZXJlZCAmJiB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zLmluZGV4T2YocmVjb3JkKSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zLnB1c2gocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNvbmRpdGlvbihjb25kaXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5QZXJjZW50OlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlamVjdE5vbk51bWVyaWNhbEVudHJpZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlZ0V4cCA9IC9bXjAtOVxcLixlRVxcLV0vZztcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWUgJiYgcmVnRXhwLnRlc3QodGhpcy5zZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQudmFsdWUgPSB0aGlzLnNlYXJjaFZhbHVlLnJlcGxhY2UocmVnRXhwLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hJbnB1dC52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25BcnJvd1VwS2V5RG93bigpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEl0ZW0gJiYgdGhpcy5mb2N1c2VkSXRlbS5pbmRleCA9PT0gMCAmJiB0aGlzLnZpcnREaXIuc3RhdGUuc3RhcnRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzT3V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlSXRlbSh0aGlzLmZvY3VzZWRJdGVtID8gdGhpcy5mb2N1c2VkSXRlbS5pbmRleCAtIDEgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQXJyb3dEb3duS2V5RG93bigpIHtcbiAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gdGhpcy52aXJ0RGlyLmlneEZvck9mLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWRJdGVtICYmIHRoaXMuZm9jdXNlZEl0ZW0uaW5kZXggPT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzT3V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlSXRlbSh0aGlzLmZvY3VzZWRJdGVtID8gdGhpcy5mb2N1c2VkSXRlbS5pbmRleCArIDEgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uSG9tZUtleURvd24oKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVJdGVtKDApO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRW5kS2V5RG93bigpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUl0ZW0odGhpcy52aXJ0RGlyLmlneEZvck9mLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWN0aW9uS2V5RG93bigpIHtcbiAgICAgICAgY29uc3QgZGF0YUl0ZW0gPSB0aGlzLmRpc3BsYXllZExpc3REYXRhW3RoaXMuZm9jdXNlZEl0ZW0uaW5kZXhdO1xuICAgICAgICBjb25zdCBhcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBjaGVja2VkOiAhZGF0YUl0ZW0uaXNTZWxlY3RlZCxcbiAgICAgICAgICAgIGNoZWNrYm94OiB0aGlzLmNoZWNrYm94ZXMuZmluZCh4ID0+IHgudmFsdWUgPT09IGRhdGFJdGVtKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGVja2JveENoYW5nZShhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5hdmlnYXRlSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPj0gdGhpcy52aXJ0RGlyLmlneEZvck9mLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGluZGV4ID4gKHRoaXMuZm9jdXNlZEl0ZW0gPyB0aGlzLmZvY3VzZWRJdGVtLmluZGV4IDogLTEpID8gTmF2aWdhdGUuRG93biA6IE5hdmlnYXRlLlVwO1xuICAgICAgICBjb25zdCBzY3JvbGxSZXF1aXJlZCA9IHRoaXMuaXNJbmRleE91dE9mQm91bmRzKGluZGV4LCBkaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmZvY3VzZWRJdGVtID0ge1xuICAgICAgICAgICBpZDogdGhpcy5nZXRJdGVtSWQoaW5kZXgpLFxuICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudmlydERpci5pZ3hGb3JPZltpbmRleF0uaXNTZWxlY3RlZFxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2Nyb2xsUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlydERpci5zY3JvbGxUbyhpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5kZXhPdXRPZkJvdW5kcyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246IE5hdmlnYXRlKSB7XG4gICAgICAgIGNvbnN0IHZpcnRTdGF0ZSA9IHRoaXMudmlydERpci5zdGF0ZTtcbiAgICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gdGhpcy52aXJ0RGlyLmdldFNjcm9sbCgpLnNjcm9sbFRvcDtcbiAgICAgICAgY29uc3QgaXRlbVBvc2l0aW9uID0gdGhpcy52aXJ0RGlyLmdldFNjcm9sbEZvckluZGV4KGluZGV4LCBkaXJlY3Rpb24gPT09IE5hdmlnYXRlLkRvd24pO1xuICAgICAgICBjb25zdCBpbmRleE91dE9mQ2h1bmsgPSBpbmRleCA8IHZpcnRTdGF0ZS5zdGFydEluZGV4IHx8IGluZGV4ID4gdmlydFN0YXRlLmNodW5rU2l6ZSArIHZpcnRTdGF0ZS5zdGFydEluZGV4O1xuICAgICAgICBjb25zdCBzY3JvbGxOZWVkZWQgPSBkaXJlY3Rpb24gPT09IE5hdmlnYXRlLkRvd24gPyBjdXJyZW50UG9zaXRpb24gPCBpdGVtUG9zaXRpb24gOiBjdXJyZW50UG9zaXRpb24gPiBpdGVtUG9zaXRpb247XG4gICAgICAgIGNvbnN0IHN1YlJlcXVpcmVkID0gaW5kZXhPdXRPZkNodW5rIHx8IHNjcm9sbE5lZWRlZDtcbiAgICAgICAgcmV0dXJuIHN1YlJlcXVpcmVkO1xuICAgIH1cbn1cbiIsIjxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiPlxuICAgIDxpZ3gtaWNvbiBpZ3hQcmVmaXg+c2VhcmNoPC9pZ3gtaWNvbj5cbiAgICA8aW5wdXRcbiAgICAgICAgI2lucHV0XG4gICAgICAgIGlneElucHV0XG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJMaXN0RGF0YSgpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJlc2YuY29sdW1uPy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9zZWFyY2hfcGxhY2Vob2xkZXJcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIi8+XG4gICAgPGlneC1pY29uXG4gICAgICAgIGlneFN1ZmZpeFxuICAgICAgICAqbmdJZj1cInNlYXJjaFZhbHVlIHx8IHNlYXJjaFZhbHVlID09PSAwXCJcbiAgICAgICAgKGNsaWNrKT1cImNsZWFySW5wdXQoKVwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICBjbGVhclxuICAgIDwvaWd4LWljb24+XG48L2lneC1pbnB1dC1ncm91cD5cblxuPGlneC1saXN0ICNsaXN0IHJvbGU9XCJsaXN0Ym94XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCIgKm5nSWY9XCIhaXNIaWVyYXJjaGljYWwoKVwiIChrZXlkb3duKT1cImhhbmRsZUtleURvd24oJGV2ZW50KVwiIHRhYmluZGV4PVwiMFwiXG5bYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwidGhpcy5hY3RpdmVEZXNjZW5kYW50XCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIj5cbiAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlO1wiPlxuICAgICAgICA8aWd4LWxpc3QtaXRlbSBbY2xhc3MuaWd4LWxpc3RfX2l0ZW0tYmFzZS0tYWN0aXZlXT1cImZvY3VzZWRJdGVtPy5pZCA9PT0gdGhpcy5nZXRJdGVtSWQoaSlcIiBbYXR0ci5pZF09XCJnZXRJdGVtSWQoaSlcIiByb2xlPVwib3B0aW9uXCIgXG4gICAgICAgICppZ3hGb3I9XCJsZXQgaXRlbSBvZiBkaXNwbGF5ZWRMaXN0RGF0YTtpbmRleCBhcyBpOyBzY3JvbGxPcmllbnRhdGlvbiA6ICd2ZXJ0aWNhbCc7IGNvbnRhaW5lclNpemU6IGNvbnRhaW5lclNpemU7IGl0ZW1TaXplOiBpdGVtU2l6ZVwiPlxuICAgICAgICAgICAgPGlneC1jaGVja2JveFxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIml0ZW0/LmluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlVHJhbnNpdGlvbnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L2lneC1jaGVja2JveD5cbiAgICAgICAgPC9pZ3gtbGlzdC1pdGVtPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlIGlneERhdGFMb2FkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlc0xvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgaWd4RW1wdHlMaXN0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlTZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2ZpbHRlci1yZXN1bHRzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCI+XG4gICAgICAgIHt7IGVzZi5ncmlkPy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfbWF0Y2hlc19jb3VudC5yZXBsYWNlKCd7MH0nLCBtYXRjaGVzQ291bnQpIH19XG4gICAgPC9kaXY+XG48L2lneC1saXN0PlxuXG48ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZVwiICpuZ0lmPVwiaXNIaWVyYXJjaGljYWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX190cmVlLWFsaWtlXCIgKm5nSWY9XCIhaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCI+XG4gICAgICAgICAgICA8aWd4LWNoZWNrYm94ICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0QWxsSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdEFsbEl0ZW0/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0QWxsSXRlbT8uaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlVHJhbnNpdGlvbnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxDaGVja2JveENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAge3sgc2VsZWN0QWxsSXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9pZ3gtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCIgKm5nSWY9XCJzZWFyY2hWYWx1ZVwiPlxuICAgICAgICAgICAgPGlneC1jaGVja2JveCAjYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFkZFRvQ3VycmVudEZpbHRlckl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVUcmFuc2l0aW9uc109XCJ0cnVlXCI+XG5cbiAgICAgICAgICAgICAgICB7eyBhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L2lneC1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8aWd4LXRyZWUgI3RyZWUgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiIHNlbGVjdGlvbj1cIkNhc2NhZGluZ1wiICAobm9kZVNlbGVjdGlvbik9XCJvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJpdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGlzcGxheWVkTGlzdERhdGE7XCIgW3NlbGVjdGVkXT1cIml0ZW0uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgICAgPGRpdj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxuICAgICAgICAgICAgPGlneC10cmVlLW5vZGUgW2RhdGFdPVwiY2hpbGRMZXZlbDFcIiAqbmdGb3I9XCJsZXQgY2hpbGRMZXZlbDEgb2YgaXRlbS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWwxLmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsMlwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsMiBvZiBjaGlsZExldmVsMS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMi5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWwzXCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWwzIG9mIGNoaWxkTGV2ZWwyLmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWwzLmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMy5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNCBvZiBjaGlsZExldmVsMy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw0LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNVwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNSBvZiBjaGlsZExldmVsNC5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw2XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw2IG9mIGNoaWxkTGV2ZWw1LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw2LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsN1wiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNyBvZiBjaGlsZExldmVsNi5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNy5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw3LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsOFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsOCBvZiBjaGlsZExldmVsNy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsOC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOC5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw5XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw5IG9mIGNoaWxkTGV2ZWw4LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw5LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICA8L2lneC10cmVlPlxuXG4gICAgPG5nLXRlbXBsYXRlIGlneERhdGFMb2FkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlc0xvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlTZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTZWFyY2g+XG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2VtcHR5XCI+XG4gICAgICAgIHt7ZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9ub19tYXRjaGVzfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGU+XG4gICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiPlxuICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxmb290ZXIgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19tZW51LWZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19jYW5jZWxcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI2NhbmNlbEJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZXNmLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJlc2YuY2FuY2VsKClcIj5cbiAgICAgICAgICAgICAgICB7eyBlc2YuZ3JpZD8ucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2V4Y2VsX2NhbmNlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fYXBwbHlcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEJ1dHRvbj1cInJhaXNlZFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZXNmLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhcHBseUJ1dHRvbkRpc2FibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAge3sgZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hcHBseSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZm9vdGVyPlxuIl19