@colijnit/corecomponents_v12 260.1.10 → 260.1.11

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 (24) hide show
  1. package/README.md +24 -24
  2. package/bundles/colijnit-corecomponents_v12.umd.js +8 -2
  3. package/bundles/colijnit-corecomponents_v12.umd.js.map +1 -1
  4. package/colijnit-corecomponents_v12-260.1.11.tgz +0 -0
  5. package/colijnit-corecomponents_v12.metadata.json +1 -1
  6. package/esm2015/lib/components/base/base-input.component.js +3 -1
  7. package/esm2015/lib/components/co-dialog/co-dialog.component.js +22 -22
  8. package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.component.js +16 -16
  9. package/esm2015/lib/components/filter-item/filter-item.component.js +162 -162
  10. package/esm2015/lib/components/input-number-picker/input-number-picker.component.js +33 -33
  11. package/esm2015/lib/components/input-number-picker/input-number-picker.module.js +1 -1
  12. package/esm2015/lib/components/list-of-values/list-of-values-popup.component.js +6 -2
  13. package/esm2015/lib/components/list-of-values/list-of-values.component.js +2 -2
  14. package/esm2015/lib/components/simple-grid/simple-grid-cell.component.js +31 -31
  15. package/esm2015/lib/components/simple-grid/simple-grid.component.js +180 -180
  16. package/esm2015/lib/core/enum/core-components-icon.enum.js +1 -1
  17. package/esm2015/lib/core/model/core-components-icon-svg.js +1 -1
  18. package/esm2015/lib/directives/screen-configuration/screen-configuration.module.js +1 -1
  19. package/esm2015/public-api.js +1 -1
  20. package/fesm2015/colijnit-corecomponents_v12.js +446 -440
  21. package/fesm2015/colijnit-corecomponents_v12.js.map +1 -1
  22. package/lib/components/base/base-input.component.d.ts +1 -0
  23. package/lib/components/calendar/style/_material-definition.scss +46 -46
  24. package/package.json +1 -1
@@ -557,185 +557,185 @@ export class SimpleGridComponent extends BaseSimpleGridComponent {
557
557
  SimpleGridComponent.decorators = [
558
558
  { type: Component, args: [{
559
559
  selector: 'co-simple-grid',
560
- template: `
561
- <co-grid-toolbar
562
- *ngIf="showToolbar" [class.right]="rightToolbar"
563
- [showEdit]="showEdit"
564
- [showAdd]="showAdd"
565
- [showDelete]="showDelete"
566
- [deleteEnabled]="selectedRowIndex > -1"
567
- (addClick)="addNewRow()"
568
- (editClick)="editRow($event)"
569
- (saveClick)="validateAndSave()"
570
- (cancelClick)="cancelEditRow()"
571
- (deleteClick)="removeRow()">
572
- </co-grid-toolbar>
573
-
574
- <table
575
- id="simple-grid-table"
576
- class="simple-grid-table"
577
- [clickOutside]="editing"
578
- (clickOutside)="handleClickOutsideRow()">
579
- <colgroup>
580
- <col
581
- *ngFor="let column of headerColumnsCopy; let index = index"
582
- [class.simple-grid-column-auto-fit]="column.autoFit"
583
- [style.width.px]="column.width"
584
- [style.min-width.px]="MIN_COLUMN_WIDTH">
585
- <col
586
- *ngIf="((inlineEdit && showRowButtons) || (showDelete && !showRowButtons)) && (hoveredRowIndex >= 0 || selectedRowIndex >= 0 || isNewRow)"
587
- [class.icons-col]="true"
588
- [class.col-width-row-buttons]="inlineEdit && showRowButtons"
589
- [class.col-width-delete]="!showRowButtons && showDelete">
590
- </colgroup>
591
- <thead>
592
- <tr>
593
- <th
594
- scope="col"
595
- #headerCell
596
- class="simple-grid-column-header"
597
- *ngFor="let column of headerColumnsCopy; let index = index">
598
- <div
599
- class="simple-grid-column-header-wrapper"
600
- [class.resizable]="resizable"
601
- [class.selected]="column.isSelected"
602
- [ngClass]="column.textAlign ? column.textAlign : defaultTextAlign">
603
- <ng-container *ngIf="column.headerTemplate; else noHeaderTemplate">
604
- <ng-container [ngTemplateOutlet]="column.headerTemplate"></ng-container>
605
- </ng-container>
606
- <ng-template #noHeaderTemplate>
607
- <div
608
- class="simple-grid-column-header-label"
609
- [ngClass]="column.textAlign ? column.textAlign : defaultTextAlign"
610
- [class.with-menu]="showGridSettings"
611
- [class.with-sort]="showColumnSort"
612
- [textContent]="column.headerText || '&nbsp;'" [title]="column.headerText"
613
- (click)="showColumnSort ? sortColumn(column, column.field) : toggleColumnMenu(column)">
614
- </div>
615
-
616
- <div class="sort-column" *ngIf="showColumnSort">
617
- <co-button
618
- (click)="sortColumn(column, column?.field)"
619
- [iconData]="icons.getIcon(Icons.ArrowUpArrowDown)">
620
- </co-button>
621
- </div>
622
-
623
- <div class="column-menu" *ngIf="column.isSelected">
624
- <h3 [textContent]="'COLUMN_OPTIONS' | coreLocalize"></h3>
625
- <ul>
626
- <li (click)="hideColumn(column)">Hide Column</li>
627
- <li (click)="sortColumn(column, column.field)">Sort Column</li>
628
- </ul>
629
- </div>
630
- </ng-template>
631
- <div
632
- *ngIf="resizable && column.resizable"
633
- class="simple-grid-column-sizer"
634
- (mousedown)="handleSizerMouseDown($event, column)">
635
- </div>
636
- </div>
637
- </th>
638
- </tr>
639
-
640
- <div *ngIf="showGridSettings" class="grid-settings">
641
- <co-button
642
- [class.selected]="isSettingsMenuOpen"
643
- [iconData]="icons.getIcon(Icons.CogWheels)"
644
- (click)="toggleSettingsMenu()">
645
- </co-button>
646
-
647
- <div class="settings-menu" *ngIf="isSettingsMenuOpen">
648
- <h3 [textContent]="'GRID_OPTIONS' | coreLocalize"></h3>
649
- <ul>
650
- <li (click)="exportToExcel()">Export to Excel</li>
651
- <li *ngIf="headerColumnsCopy.length !== headerColumns.length" (click)="showAllColumns()">
652
- Show All Columns
653
- </li>
654
- </ul>
655
- </div>
656
- </div>
657
- </thead>
658
- <tbody
659
- #dropList cdkDropList cdkDropListOrientation="vertical"
660
- class="simple-grid-drag-drop-list"
661
- [cdkDropListDisabled]="!dragDropEnabled || editing"
662
- [cdkDropListData]="data"
663
- [cdkDropListEnterPredicate]="handleCanDragDrop"
664
- (cdkDropListDropped)="handleDrop($event)">
665
- <co-form class="simple-grid-row-form">
666
- <tr
667
- #rowElement
668
- class="simple-grid-row"
669
- [class.selected]="rowIndex === selectedRowIndex && !editing" observeVisibility
670
- [class.disabled]="getIsRowDisabled(rowIndex)"
671
- [class.editing]="rowIndex === editRowIndex"
672
- *ngFor="let row of (!!rowsPerPage ? (data | paginate: {itemsPerPage: rowsPerPage, currentPage: currentPage}) : data); last as last; let rowIndex = index"
673
- cdkDrag
674
- (click)="handleClickRow($event, rowIndex)" (dblclick)="handleDblClickRow($event, rowIndex, row)"
675
- (visibilityChange)="rowVisible.next(row)"
676
- (mouseenter)="hoveredRowIndex = rowIndex"
677
- (mouseleave)="hoveredRowIndex = -1"
678
- >
679
- <ng-container *ngIf="isSingleColumnRow(row)">
680
- <td class="simple-grid-single-column-cell" [attr.colspan]="headerColumnsCopy.length">
681
- <co-simple-grid-cell
682
- [column]="columns[singleColumnIndex(row)]"
683
- [row]="row"
684
- [editMode]="false">
685
- </co-simple-grid-cell>
686
- </td>
687
- </ng-container>
688
- <ng-container *ngIf="!isSingleColumnRow(row)">
689
- <ng-container *ngFor="let column of headerColumnsCopy; let columnIndex = index">
690
- <td class="simple-grid-column-cell" *ngIf="columnIndex !== singleColumnIndex(row)">
691
- <co-simple-grid-cell
692
- [column]="column"
693
- [row]="row"
694
- [editMode]="inlineEdit && editing && rowIndex === editRowIndex"
695
- [fieldEditMode]="editCellIndex === columnIndex && rowIndex === editRowIndex"
696
- (cellClick)="handleCellClick($event, row, rowIndex, columnIndex)">
697
- </co-simple-grid-cell>
698
- <div *ngIf="column.resizable" class="simple-grid-column-sizer-placeholder"></div>
699
- </td>
700
- </ng-container>
701
- <ng-container *ngIf="(inlineEdit && showRowButtons) || (showDelete && !showRowButtons)">
702
- <td class="icons-container"
703
- *ngIf="(editRowIndex <= -1 && selectedRowIndex === -1 && hoveredRowIndex === rowIndex) || selectedRowIndex === rowIndex || (isNewRow && rowIndex === editRowIndex)">
704
- <ng-container>
705
- <co-icon class="icon-item icon-edit"
706
- *ngIf="!editing && (inlineEdit && showRowButtons)"
707
- [iconData]="icons.getIcon(Icons.PenToSquareSolid)"
708
- (click)="editRow($event, true, rowIndex); $event.stopPropagation()"></co-icon>
709
- <co-icon class="icon-item icon-delete"
710
- [iconData]="icons.getIcon(Icons.TrashBin)"
711
- *ngIf="(!editing && (inlineEdit || !inlineEdit) && showRowButtons) || (!showRowButtons && showDelete)"
712
- (click)="selectTheRow(rowIndex); removeRow();"></co-icon>
713
- </ng-container>
714
- <ng-container *ngIf="editing && inlineEdit && showRowButtons && (selectedRowIndex === rowIndex || isNewRow)">
715
- <co-button class="save-button"
716
- [iconData]="icons.getIcon(Icons.CheckDuotone)"
717
- (click)="validateAndSave(); $event.stopPropagation()"></co-button>
718
- <co-button class="close-button"
719
- [iconData]="icons.getIcon(Icons.CrossSkinny)"
720
- (click)="cancelEditRow(); $event.stopPropagation() "></co-button>
721
- </ng-container>
722
- </td>
723
- </ng-container>
724
- </ng-container>
725
- </tr>
726
- </co-form>
727
- </tbody>
728
- </table>
729
- <co-pagination-bar
730
- *ngIf="data?.length > rowsPerPage" class="pagination-bar"
731
- [itemsPerPage]="rowsPerPage"
732
- [currentPage]="currentPage"
733
- [totalItems]="data.length"
734
- [autoHide]="true"
735
- (previousClick)="goToPreviousPage()"
736
- (nextClick)="goToNextPage()"
737
- (pageClick)="setCurrentPage($event)">
738
- </co-pagination-bar>
560
+ template: `
561
+ <co-grid-toolbar
562
+ *ngIf="showToolbar" [class.right]="rightToolbar"
563
+ [showEdit]="showEdit"
564
+ [showAdd]="showAdd"
565
+ [showDelete]="showDelete"
566
+ [deleteEnabled]="selectedRowIndex > -1"
567
+ (addClick)="addNewRow()"
568
+ (editClick)="editRow($event)"
569
+ (saveClick)="validateAndSave()"
570
+ (cancelClick)="cancelEditRow()"
571
+ (deleteClick)="removeRow()">
572
+ </co-grid-toolbar>
573
+
574
+ <table
575
+ id="simple-grid-table"
576
+ class="simple-grid-table"
577
+ [clickOutside]="editing"
578
+ (clickOutside)="handleClickOutsideRow()">
579
+ <colgroup>
580
+ <col
581
+ *ngFor="let column of headerColumnsCopy; let index = index"
582
+ [class.simple-grid-column-auto-fit]="column.autoFit"
583
+ [style.width.px]="column.width"
584
+ [style.min-width.px]="MIN_COLUMN_WIDTH">
585
+ <col
586
+ *ngIf="((inlineEdit && showRowButtons) || (showDelete && !showRowButtons)) && (hoveredRowIndex >= 0 || selectedRowIndex >= 0 || isNewRow)"
587
+ [class.icons-col]="true"
588
+ [class.col-width-row-buttons]="inlineEdit && showRowButtons"
589
+ [class.col-width-delete]="!showRowButtons && showDelete">
590
+ </colgroup>
591
+ <thead>
592
+ <tr>
593
+ <th
594
+ scope="col"
595
+ #headerCell
596
+ class="simple-grid-column-header"
597
+ *ngFor="let column of headerColumnsCopy; let index = index">
598
+ <div
599
+ class="simple-grid-column-header-wrapper"
600
+ [class.resizable]="resizable"
601
+ [class.selected]="column.isSelected"
602
+ [ngClass]="column.textAlign ? column.textAlign : defaultTextAlign">
603
+ <ng-container *ngIf="column.headerTemplate; else noHeaderTemplate">
604
+ <ng-container [ngTemplateOutlet]="column.headerTemplate"></ng-container>
605
+ </ng-container>
606
+ <ng-template #noHeaderTemplate>
607
+ <div
608
+ class="simple-grid-column-header-label"
609
+ [ngClass]="column.textAlign ? column.textAlign : defaultTextAlign"
610
+ [class.with-menu]="showGridSettings"
611
+ [class.with-sort]="showColumnSort"
612
+ [textContent]="column.headerText || '&nbsp;'" [title]="column.headerText"
613
+ (click)="showColumnSort ? sortColumn(column, column.field) : toggleColumnMenu(column)">
614
+ </div>
615
+
616
+ <div class="sort-column" *ngIf="showColumnSort">
617
+ <co-button
618
+ (click)="sortColumn(column, column?.field)"
619
+ [iconData]="icons.getIcon(Icons.ArrowUpArrowDown)">
620
+ </co-button>
621
+ </div>
622
+
623
+ <div class="column-menu" *ngIf="column.isSelected">
624
+ <h3 [textContent]="'COLUMN_OPTIONS' | coreLocalize"></h3>
625
+ <ul>
626
+ <li (click)="hideColumn(column)">Hide Column</li>
627
+ <li (click)="sortColumn(column, column.field)">Sort Column</li>
628
+ </ul>
629
+ </div>
630
+ </ng-template>
631
+ <div
632
+ *ngIf="resizable && column.resizable"
633
+ class="simple-grid-column-sizer"
634
+ (mousedown)="handleSizerMouseDown($event, column)">
635
+ </div>
636
+ </div>
637
+ </th>
638
+ </tr>
639
+
640
+ <div *ngIf="showGridSettings" class="grid-settings">
641
+ <co-button
642
+ [class.selected]="isSettingsMenuOpen"
643
+ [iconData]="icons.getIcon(Icons.CogWheels)"
644
+ (click)="toggleSettingsMenu()">
645
+ </co-button>
646
+
647
+ <div class="settings-menu" *ngIf="isSettingsMenuOpen">
648
+ <h3 [textContent]="'GRID_OPTIONS' | coreLocalize"></h3>
649
+ <ul>
650
+ <li (click)="exportToExcel()">Export to Excel</li>
651
+ <li *ngIf="headerColumnsCopy.length !== headerColumns.length" (click)="showAllColumns()">
652
+ Show All Columns
653
+ </li>
654
+ </ul>
655
+ </div>
656
+ </div>
657
+ </thead>
658
+ <tbody
659
+ #dropList cdkDropList cdkDropListOrientation="vertical"
660
+ class="simple-grid-drag-drop-list"
661
+ [cdkDropListDisabled]="!dragDropEnabled || editing"
662
+ [cdkDropListData]="data"
663
+ [cdkDropListEnterPredicate]="handleCanDragDrop"
664
+ (cdkDropListDropped)="handleDrop($event)">
665
+ <co-form class="simple-grid-row-form">
666
+ <tr
667
+ #rowElement
668
+ class="simple-grid-row"
669
+ [class.selected]="rowIndex === selectedRowIndex && !editing" observeVisibility
670
+ [class.disabled]="getIsRowDisabled(rowIndex)"
671
+ [class.editing]="rowIndex === editRowIndex"
672
+ *ngFor="let row of (!!rowsPerPage ? (data | paginate: {itemsPerPage: rowsPerPage, currentPage: currentPage}) : data); last as last; let rowIndex = index"
673
+ cdkDrag
674
+ (click)="handleClickRow($event, rowIndex)" (dblclick)="handleDblClickRow($event, rowIndex, row)"
675
+ (visibilityChange)="rowVisible.next(row)"
676
+ (mouseenter)="hoveredRowIndex = rowIndex"
677
+ (mouseleave)="hoveredRowIndex = -1"
678
+ >
679
+ <ng-container *ngIf="isSingleColumnRow(row)">
680
+ <td class="simple-grid-single-column-cell" [attr.colspan]="headerColumnsCopy.length">
681
+ <co-simple-grid-cell
682
+ [column]="columns[singleColumnIndex(row)]"
683
+ [row]="row"
684
+ [editMode]="false">
685
+ </co-simple-grid-cell>
686
+ </td>
687
+ </ng-container>
688
+ <ng-container *ngIf="!isSingleColumnRow(row)">
689
+ <ng-container *ngFor="let column of headerColumnsCopy; let columnIndex = index">
690
+ <td class="simple-grid-column-cell" *ngIf="columnIndex !== singleColumnIndex(row)">
691
+ <co-simple-grid-cell
692
+ [column]="column"
693
+ [row]="row"
694
+ [editMode]="inlineEdit && editing && rowIndex === editRowIndex"
695
+ [fieldEditMode]="editCellIndex === columnIndex && rowIndex === editRowIndex"
696
+ (cellClick)="handleCellClick($event, row, rowIndex, columnIndex)">
697
+ </co-simple-grid-cell>
698
+ <div *ngIf="column.resizable" class="simple-grid-column-sizer-placeholder"></div>
699
+ </td>
700
+ </ng-container>
701
+ <ng-container *ngIf="(inlineEdit && showRowButtons) || (showDelete && !showRowButtons)">
702
+ <td class="icons-container"
703
+ *ngIf="(editRowIndex <= -1 && selectedRowIndex === -1 && hoveredRowIndex === rowIndex) || selectedRowIndex === rowIndex || (isNewRow && rowIndex === editRowIndex)">
704
+ <ng-container>
705
+ <co-icon class="icon-item icon-edit"
706
+ *ngIf="!editing && (inlineEdit && showRowButtons)"
707
+ [iconData]="icons.getIcon(Icons.PenToSquareSolid)"
708
+ (click)="editRow($event, true, rowIndex); $event.stopPropagation()"></co-icon>
709
+ <co-icon class="icon-item icon-delete"
710
+ [iconData]="icons.getIcon(Icons.TrashBin)"
711
+ *ngIf="(!editing && (inlineEdit || !inlineEdit) && showRowButtons) || (!showRowButtons && showDelete)"
712
+ (click)="selectTheRow(rowIndex); removeRow();"></co-icon>
713
+ </ng-container>
714
+ <ng-container *ngIf="editing && inlineEdit && showRowButtons && (selectedRowIndex === rowIndex || isNewRow)">
715
+ <co-button class="save-button"
716
+ [iconData]="icons.getIcon(Icons.CheckDuotone)"
717
+ (click)="validateAndSave(); $event.stopPropagation()"></co-button>
718
+ <co-button class="close-button"
719
+ [iconData]="icons.getIcon(Icons.CrossSkinny)"
720
+ (click)="cancelEditRow(); $event.stopPropagation() "></co-button>
721
+ </ng-container>
722
+ </td>
723
+ </ng-container>
724
+ </ng-container>
725
+ </tr>
726
+ </co-form>
727
+ </tbody>
728
+ </table>
729
+ <co-pagination-bar
730
+ *ngIf="data?.length > rowsPerPage" class="pagination-bar"
731
+ [itemsPerPage]="rowsPerPage"
732
+ [currentPage]="currentPage"
733
+ [totalItems]="data.length"
734
+ [autoHide]="true"
735
+ (previousClick)="goToPreviousPage()"
736
+ (nextClick)="goToNextPage()"
737
+ (pageClick)="setCurrentPage($event)">
738
+ </co-pagination-bar>
739
739
  `,
740
740
  providers: [FormMasterService],
741
741
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -764,4 +764,4 @@ SimpleGridComponent.propDecorators = {
764
764
  showClass: [{ type: HostBinding, args: ['class.co-simple-grid',] }],
765
765
  handleKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }]
766
766
  };
767
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NpbXBsZS1ncmlkL3NpbXBsZS1ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDekUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBNkw1RCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsdUJBQXVCO0lBaUc5RCxZQUNTLEtBQXVCLEVBQ3BCLGVBQWtDLEVBQ3BDLFdBQThCO1FBRXRDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUpoQixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBbUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBbkd4QixxQkFBZ0IsR0FBZ0IsV0FBVyxDQUFDLElBQUksQ0FBQztRQVkxRCxZQUFPLEdBQVksS0FBSyxDQUFDO1FBR3pCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFHNUIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFHakMsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFHaEMsaUJBQVksR0FBWSxLQUFL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QVksU0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCwgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybU1hc3RlclNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZS9mb3JtLW1hc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7QmFzZVNpbXBsZUdyaWRDb21wb25lbnR9IGZyb20gJy4vYmFzZS1zaW1wbGUtZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHtDb2x1bW5BbGlnbn0gZnJvbSAnLi9zaW1wbGUtZ3JpZC1jb2x1bW4uZGlyZWN0aXZlJztcbmltcG9ydCB7Q29yZUNvbXBvbmVudHNJY29ufSBmcm9tICcuLi8uLi9jb3JlL2VudW0vY29yZS1jb21wb25lbnRzLWljb24uZW51bSc7XG5pbXBvcnQge0ljb25DYWNoZVNlcnZpY2V9IGZyb20gJy4uL2ljb24vaWNvbi1jYWNoZS5zZXJ2aWNlJztcbmltcG9ydCB7RXhwb3J0Q29sdW1ufSBmcm9tICcuLi8uLi9zZXJ2aWNlL2V4Y2VsLWV4cG9ydC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY28tc2ltcGxlLWdyaWQnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxjby1ncmlkLXRvb2xiYXJcbiAgICAgICpuZ0lmPVwic2hvd1Rvb2xiYXJcIiBbY2xhc3MucmlnaHRdPVwicmlnaHRUb29sYmFyXCJcbiAgICAgIFtzaG93RWRpdF09XCJzaG93RWRpdFwiXG4gICAgICBbc2hvd0FkZF09XCJzaG93QWRkXCJcbiAgICAgIFtzaG93RGVsZXRlXT1cInNob3dEZWxldGVcIlxuICAgICAgW2RlbGV0ZUVuYWJsZWRdPVwic2VsZWN0ZWRSb3dJbmRleCA+IC0xXCJcbiAgICAgIChhZGRDbGljayk9XCJhZGROZXdSb3coKVwiXG4gICAgICAoZWRpdENsaWNrKT1cImVkaXRSb3coJGV2ZW50KVwiXG4gICAgICAoc2F2ZUNsaWNrKT1cInZhbGlkYXRlQW5kU2F2ZSgpXCJcbiAgICAgIChjYW5jZWxDbGljayk9XCJjYW5jZWxFZGl0Um93KClcIlxuICAgICAgKGRlbGV0ZUNsaWNrKT1cInJlbW92ZVJvdygpXCI+XG4gICAgPC9jby1ncmlkLXRvb2xiYXI+XG5cbiAgICA8dGFibGVcbiAgICAgIGlkPVwic2ltcGxlLWdyaWQtdGFibGVcIlxuICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC10YWJsZVwiXG4gICAgICBbY2xpY2tPdXRzaWRlXT1cImVkaXRpbmdcIlxuICAgICAgKGNsaWNrT3V0c2lkZSk9XCJoYW5kbGVDbGlja091dHNpZGVSb3coKVwiPlxuICAgICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBoZWFkZXJDb2x1bW5zQ29weTsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgIFtjbGFzcy5zaW1wbGUtZ3JpZC1jb2x1bW4tYXV0by1maXRdPVwiY29sdW1uLmF1dG9GaXRcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiTUlOX0NPTFVNTl9XSURUSFwiPlxuICAgICAgICA8Y29sXG4gICAgICAgICAgKm5nSWY9XCIoKGlubGluZUVkaXQgJiYgc2hvd1Jvd0J1dHRvbnMpIHx8IChzaG93RGVsZXRlICYmICFzaG93Um93QnV0dG9ucykpICYmIChob3ZlcmVkUm93SW5kZXggPj0gMCB8fCBzZWxlY3RlZFJvd0luZGV4ID49IDAgfHwgaXNOZXdSb3cpXCJcbiAgICAgICAgICBbY2xhc3MuaWNvbnMtY29sXT1cInRydWVcIlxuICAgICAgICAgIFtjbGFzcy5jb2wtd2lkdGgtcm93LWJ1dHRvbnNdPVwiaW5saW5lRWRpdCAmJiBzaG93Um93QnV0dG9uc1wiXG4gICAgICAgICAgW2NsYXNzLmNvbC13aWR0aC1kZWxldGVdPVwiIXNob3dSb3dCdXR0b25zICYmIHNob3dEZWxldGVcIj5cbiAgICAgIDwvY29sZ3JvdXA+XG4gICAgICA8dGhlYWQ+XG4gICAgICA8dHI+XG4gICAgICAgIDx0aFxuICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAjaGVhZGVyQ2VsbFxuICAgICAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtY29sdW1uLWhlYWRlclwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBoZWFkZXJDb2x1bW5zQ29weTsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNpbXBsZS1ncmlkLWNvbHVtbi1oZWFkZXItd3JhcHBlclwiXG4gICAgICAgICAgICBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiY29sdW1uLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLnRleHRBbGlnbiA/IGNvbHVtbi50ZXh0QWxpZ24gOiBkZWZhdWx0VGV4dEFsaWduXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlOyBlbHNlIG5vSGVhZGVyVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0hlYWRlclRlbXBsYXRlPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4taGVhZGVyLWxhYmVsXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4udGV4dEFsaWduID8gY29sdW1uLnRleHRBbGlnbiA6IGRlZmF1bHRUZXh0QWxpZ25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy53aXRoLW1lbnVdPVwic2hvd0dyaWRTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLndpdGgtc29ydF09XCJzaG93Q29sdW1uU29ydFwiXG4gICAgICAgICAgICAgICAgW3RleHRDb250ZW50XT1cImNvbHVtbi5oZWFkZXJUZXh0IHx8ICcmbmJzcDsnXCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJUZXh0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0NvbHVtblNvcnQgPyBzb3J0Q29sdW1uKGNvbHVtbiwgY29sdW1uLmZpZWxkKSA6IHRvZ2dsZUNvbHVtbk1lbnUoY29sdW1uKVwiPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydC1jb2x1bW5cIiAqbmdJZj1cInNob3dDb2x1bW5Tb3J0XCI+XG4gICAgICAgICAgICAgICAgPGNvLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRDb2x1bW4oY29sdW1uLCBjb2x1bW4/LmZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbnMuZ2V0SWNvbihJY29ucy5BcnJvd1VwQXJyb3dEb3duKVwiPlxuICAgICAgICAgICAgICAgIDwvY28tYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLW1lbnVcIiAqbmdJZj1cImNvbHVtbi5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgPGgzIFt0ZXh0Q29udGVudF09XCInQ09MVU1OX09QVElPTlMnIHwgY29yZUxvY2FsaXplXCI+PC9oMz5cbiAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cImhpZGVDb2x1bW4oY29sdW1uKVwiPkhpZGUgQ29sdW1uPC9saT5cbiAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwic29ydENvbHVtbihjb2x1bW4sIGNvbHVtbi5maWVsZClcIj5Tb3J0IENvbHVtbjwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cInJlc2l6YWJsZSAmJiBjb2x1bW4ucmVzaXphYmxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4tc2l6ZXJcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImhhbmRsZVNpemVyTW91c2VEb3duKCRldmVudCwgY29sdW1uKVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICA8L3RyPlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0dyaWRTZXR0aW5nc1wiIGNsYXNzPVwiZ3JpZC1zZXR0aW5nc1wiPlxuICAgICAgICA8Y28tYnV0dG9uXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2V0dGluZ3NNZW51T3BlblwiXG4gICAgICAgICAgW2ljb25EYXRhXT1cImljb25zLmdldEljb24oSWNvbnMuQ29nV2hlZWxzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNldHRpbmdzTWVudSgpXCI+XG4gICAgICAgIDwvY28tYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXR0aW5ncy1tZW51XCIgKm5nSWY9XCJpc1NldHRpbmdzTWVudU9wZW5cIj5cbiAgICAgICAgICA8aDMgW3RleHRDb250ZW50XT1cIidHUklEX09QVElPTlMnIHwgY29yZUxvY2FsaXplXCI+PC9oMz5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICA8bGkgKGNsaWNrKT1cImV4cG9ydFRvRXhjZWwoKVwiPkV4cG9ydCB0byBFeGNlbDwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJoZWFkZXJDb2x1bW5zQ29weS5sZW5ndGggIT09IGhlYWRlckNvbHVtbnMubGVuZ3RoXCIgKGNsaWNrKT1cInNob3dBbGxDb2x1bW5zKClcIj5cbiAgICAgICAgICAgICAgU2hvdyBBbGwgQ29sdW1uc1xuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keVxuICAgICAgICAjZHJvcExpc3QgY2RrRHJvcExpc3QgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cInZlcnRpY2FsXCJcbiAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1kcmFnLWRyb3AtbGlzdFwiXG4gICAgICAgIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cIiFkcmFnRHJvcEVuYWJsZWQgfHwgZWRpdGluZ1wiXG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwiZGF0YVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImhhbmRsZUNhbkRyYWdEcm9wXCJcbiAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJoYW5kbGVEcm9wKCRldmVudClcIj5cbiAgICAgIDxjby1mb3JtIGNsYXNzPVwic2ltcGxlLWdyaWQtcm93LWZvcm1cIj5cbiAgICAgICAgPHRyXG4gICAgICAgICAgI3Jvd0VsZW1lbnRcbiAgICAgICAgICBjbGFzcz1cInNpbXBsZS1ncmlkLXJvd1wiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJvd0luZGV4ID09PSBzZWxlY3RlZFJvd0luZGV4ICYmICFlZGl0aW5nXCIgb2JzZXJ2ZVZpc2liaWxpdHlcbiAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZ2V0SXNSb3dEaXNhYmxlZChyb3dJbmRleClcIlxuICAgICAgICAgIFtjbGFzcy5lZGl0aW5nXT1cInJvd0luZGV4ID09PSBlZGl0Um93SW5kZXhcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgKCEhcm93c1BlclBhZ2UgPyAoZGF0YSB8IHBhZ2luYXRlOiB7aXRlbXNQZXJQYWdlOiByb3dzUGVyUGFnZSwgY3VycmVudFBhZ2U6IGN1cnJlbnRQYWdlfSkgOiBkYXRhKTsgbGFzdCBhcyBsYXN0OyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGlja1JvdygkZXZlbnQsIHJvd0luZGV4KVwiIChkYmxjbGljayk9XCJoYW5kbGVEYmxDbGlja1JvdygkZXZlbnQsIHJvd0luZGV4LCByb3cpXCJcbiAgICAgICAgICAodmlzaWJpbGl0eUNoYW5nZSk9XCJyb3dWaXNpYmxlLm5leHQocm93KVwiXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZFJvd0luZGV4ID0gcm93SW5kZXhcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRSb3dJbmRleCA9IC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1NpbmdsZUNvbHVtblJvdyhyb3cpXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJzaW1wbGUtZ3JpZC1zaW5nbGUtY29sdW1uLWNlbGxcIiBbYXR0ci5jb2xzcGFuXT1cImhlYWRlckNvbHVtbnNDb3B5Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8Y28tc2ltcGxlLWdyaWQtY2VsbFxuICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uc1tzaW5nbGVDb2x1bW5JbmRleChyb3cpXVwiXG4gICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgIFtlZGl0TW9kZV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8L2NvLXNpbXBsZS1ncmlkLWNlbGw+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNTaW5nbGVDb2x1bW5Sb3cocm93KVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGhlYWRlckNvbHVtbnNDb3B5OyBsZXQgY29sdW1uSW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4tY2VsbFwiICpuZ0lmPVwiY29sdW1uSW5kZXggIT09IHNpbmdsZUNvbHVtbkluZGV4KHJvdylcIj5cbiAgICAgICAgICAgICAgICA8Y28tc2ltcGxlLWdyaWQtY2VsbFxuICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgW2VkaXRNb2RlXT1cImlubGluZUVkaXQgJiYgZWRpdGluZyAmJiByb3dJbmRleCA9PT0gZWRpdFJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgIFtmaWVsZEVkaXRNb2RlXT1cImVkaXRDZWxsSW5kZXggPT09IGNvbHVtbkluZGV4ICYmIHJvd0luZGV4ID09PSBlZGl0Um93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgKGNlbGxDbGljayk9XCJoYW5kbGVDZWxsQ2xpY2soJGV2ZW50LCByb3csIHJvd0luZGV4LCBjb2x1bW5JbmRleClcIj5cbiAgICAgICAgICAgICAgICA8L2NvLXNpbXBsZS1ncmlkLWNlbGw+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5yZXNpemFibGVcIiBjbGFzcz1cInNpbXBsZS1ncmlkLWNvbHVtbi1zaXplci1wbGFjZWhvbGRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGlubGluZUVkaXQgJiYgc2hvd1Jvd0J1dHRvbnMpIHx8IChzaG93RGVsZXRlICYmICFzaG93Um93QnV0dG9ucylcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaWNvbnMtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGVkaXRSb3dJbmRleCA8PSAtMSAmJiBzZWxlY3RlZFJvd0luZGV4ID09PSAtMSAmJiBob3ZlcmVkUm93SW5kZXggPT09IHJvd0luZGV4KSB8fCBzZWxlY3RlZFJvd0luZGV4ID09PSByb3dJbmRleCB8fCAoaXNOZXdSb3cgJiYgcm93SW5kZXggPT09IGVkaXRSb3dJbmRleClcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPGNvLWljb24gY2xhc3M9XCJpY29uLWl0ZW0gaWNvbi1lZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWVkaXRpbmcgJiYgKGlubGluZUVkaXQgJiYgc2hvd1Jvd0J1dHRvbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uRGF0YV09XCJpY29ucy5nZXRJY29uKEljb25zLlBlblRvU3F1YXJlU29saWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Um93KCRldmVudCwgdHJ1ZSwgcm93SW5kZXgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj48L2NvLWljb24+XG4gICAgICAgICAgICAgICAgICA8Y28taWNvbiBjbGFzcz1cImljb24taXRlbSBpY29uLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbnMuZ2V0SWNvbihJY29ucy5UcmFzaEJpbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoIWVkaXRpbmcgJiYgKGlubGluZUVkaXQgfHwgIWlubGluZUVkaXQpICYmIHNob3dSb3dCdXR0b25zKSB8fCAoIXNob3dSb3dCdXR0b25zICYmIHNob3dEZWxldGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUaGVSb3cocm93SW5kZXgpOyByZW1vdmVSb3coKTtcIj48L2NvLWljb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRpbmcgJiYgaW5saW5lRWRpdCAmJiBzaG93Um93QnV0dG9ucyAmJiAoc2VsZWN0ZWRSb3dJbmRleCA9PT0gcm93SW5kZXggfHwgaXNOZXdSb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8Y28tYnV0dG9uIGNsYXNzPVwic2F2ZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbnMuZ2V0SWNvbihJY29ucy5DaGVja0R1b3RvbmUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZhbGlkYXRlQW5kU2F2ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj48L2NvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxjby1idXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbnMuZ2V0SWNvbihJY29ucy5Dcm9zc1NraW5ueSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsRWRpdFJvdygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgXCI+PC9jby1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvY28tZm9ybT5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgICA8Y28tcGFnaW5hdGlvbi1iYXJcbiAgICAgICpuZ0lmPVwiZGF0YT8ubGVuZ3RoID4gcm93c1BlclBhZ2VcIiBjbGFzcz1cInBhZ2luYXRpb24tYmFyXCJcbiAgICAgIFtpdGVtc1BlclBhZ2VdPVwicm93c1BlclBhZ2VcIlxuICAgICAgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcbiAgICAgIFt0b3RhbEl0ZW1zXT1cImRhdGEubGVuZ3RoXCJcbiAgICAgIFthdXRvSGlkZV09XCJ0cnVlXCJcbiAgICAgIChwcmV2aW91c0NsaWNrKT1cImdvVG9QcmV2aW91c1BhZ2UoKVwiXG4gICAgICAobmV4dENsaWNrKT1cImdvVG9OZXh0UGFnZSgpXCJcbiAgICAgIChwYWdlQ2xpY2spPVwic2V0Q3VycmVudFBhZ2UoJGV2ZW50KVwiPlxuICAgIDwvY28tcGFnaW5hdGlvbi1iYXI+XG4gIGAsXG4gIHByb3ZpZGVyczogW0Zvcm1NYXN0ZXJTZXJ2aWNlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNpbXBsZUdyaWRDb21wb25lbnQgZXh0ZW5kcyBCYXNlU2ltcGxlR3JpZENvbXBvbmVudCB7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VGV4dEFsaWduOiBDb2x1bW5BbGlnbiA9IENvbHVtbkFsaWduLkxlZnQ7XG5cbiAgQFZpZXdDaGlsZHJlbignaGVhZGVyQ2VsbCcpIHNldCBoZWFkZXJDZWxscyhjZWxscykge1xuICAgIGNvbnN0IGhlYWRlckVsZW1lbnRzID0gY2VsbHMudG9BcnJheSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY29sdW1uc1tpXS5lbGVtZW50UmVmID0gaGVhZGVyRWxlbWVudHNbaV07XG4gICAgfVxuICB9XG5cbiAgQFZpZXdDaGlsZHJlbigncm93RWxlbWVudCcpIHJvd0VsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dBZGQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0RlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkZXNlbGVjdEFsbG93ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZWRpdE9uQ2VsbENsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgcmlnaHRUb29sYmFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dHcmlkU2V0dGluZ3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgcm93c1BlclBhZ2U6IG51bWJlciA9IDUwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dEaXNhYmxlZEZuOiBGdW5jdGlvbjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0NvbHVtblNvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1Jvd0J1dHRvbnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUHJvbWlzZSBmdW5jdGlvbiwgaWYgcHJvdmlkZWQgc2hvdWxkIHJldHVybiBib29sZWFuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2FuUm93QmVFZGl0dGVkRm46IEZ1bmN0aW9uO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY28tc2ltcGxlLWdyaWQnKVxuICBwdWJsaWMgc2hvd0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlubGluZUVkaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1RhYicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLl9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdCghZXZlbnQuc2hpZnRLZXksIHRoaXMuZWRpdENlbGxJbmRleClcbiAgICAgICAgLnRoZW4oKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSBpbmRleDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLmNhbmNlbEVkaXRSb3coKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgdGhpcy52YWxpZGF0ZUFuZFNhdmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNTZXR0aW5nc01lbnVPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0Um93SW5kZXg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgZWRpdENlbGxJbmRleDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBzZWxlY3RlZFJvd0luZGV4OiBudW1iZXIgPSAtMTtcbiAgcHVibGljIHJvd1RvRWRpdDogYW55O1xuICBwdWJsaWMgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XG4gIHB1YmxpYyBzb3J0Q29sdW1uVmFsdWU6IHN0cmluZztcbiAgcHVibGljIHNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYyc7XG4gIHB1YmxpYyBob3ZlcmVkUm93SW5kZXg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgcmVhZG9ubHkgSWNvbnMgPSBDb3JlQ29tcG9uZW50c0ljb247XG5cbiAgcHJpdmF0ZSBfZG91YmxlQ2xpY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9uZXdSb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbmV3Um93UmVmZXJlbmNlOiBhbnk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEljb25DYWNoZVNlcnZpY2UgPSBJY29uQ2FjaGVTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQ29yZUNvbXBvbmVudHNJY29uID0gQ29yZUNvbXBvbmVudHNJY29uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpY29uczogSWNvbkNhY2hlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9mb3JtTWFzdGVyOiBGb3JtTWFzdGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcihjaGFuZ2VEZXRlY3Rpb24pO1xuICAgIHRoaXMuZGF0YUNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNsaWNrT3V0c2lkZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlQW5kU2F2ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldElzUm93RGlzYWJsZWQoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFJvd3MuaW5kZXhPZihpZHgpID4gLTE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNSb3dEaXNhYmxlZChyb3c6IGFueSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLnJvd0Rpc2FibGVkRm4gJiYgKHR5cGVvZiB0aGlzLnJvd0Rpc2FibGVkRm4gPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBjb25zdCBkaXNhYmxlZCA9IGF3YWl0IHRoaXMucm93RGlzYWJsZWRGbi5jYWxsKHRoaXMsIHJvdyk7XG4gICAgICBjb25zdCBpZHhSb3c6IG51bWJlciA9IHRoaXMuZGlzYWJsZWRSb3dzLmluZGV4T2YoaW5kZXgpO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIGlmIChpZHhSb3cgPCAwKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlZFJvd3MucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpZHhSb3cgPiAtMSkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZWRSb3dzLnNwbGljZShpZHhSb3csIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlzYWJsZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkTmV3Um93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlubGluZUVkaXQpIHtcbiAgICAgIGNvbnN0IHZhbGlkOiBib29sZWFuID0gdGhpcy52YWxpZGF0ZUFuZFNhdmUoKTtcbiAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICB0aGlzLl9uZXdSb3dSZWZlcmVuY2UgPSB7fTtcbiAgICAgICAgdGhpcy5kYXRhLnB1c2godGhpcy5fbmV3Um93UmVmZXJlbmNlKTtcbiAgICAgICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLl9uZXdSb3cgPSB0cnVlO1xuICAgICAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnJvd3NQZXJQYWdlICYmIHRoaXMuZGF0YS5sZW5ndGggPiB0aGlzLnJvd3NQZXJQYWdlKSB7XG4gICAgICAgICAgLy8gbmF2aWdhdGUgdG8gbGFzdCBwYWdlXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IE1hdGguY2VpbCh0aGlzLmRhdGEubGVuZ3RoIC8gdGhpcy5yb3dzUGVyUGFnZSk7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVJbmRleDogbnVtYmVyID0gKHRoaXMuZGF0YS5sZW5ndGggLSAxKSAlIHRoaXMucm93c1BlclBhZ2U7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd0luZGV4ID0gcmVsYXRpdmVJbmRleDtcbiAgICAgICAgICB0aGlzLmVkaXRSb3dJbmRleCA9IHJlbGF0aXZlSW5kZXg7XG5cbiAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2VcbiAgICAgICAgICB0aGlzLnJvd1RvRWRpdCA9IHRoaXMuX25ld1Jvd1JlZmVyZW5jZTtcbiAgICAgICAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSBhd2FpdCB0aGlzLl9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdCh0cnVlKTtcblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLnJvd0VsZW1lbnRzPy5sYXN0Py5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDIwMCk7XG5cbiAgICAgICAgICAvLyByZXNldCByZWZlcmVuY2UgdG8gdGhlIG5ldyByb3cgYWZ0ZXIgZWRpdENlbGxJbmRleFxuICAgICAgICAgIHRoaXMucm93VG9FZGl0ID0gdGhpcy5fbmV3Um93UmVmZXJlbmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7XG4gICAgICAgICAgdGhpcy5yb3dUb0VkaXQgPSB0aGlzLl9uZXdSb3dSZWZlcmVuY2U7XG4gICAgICAgICAgdGhpcy5lZGl0Q2VsbEluZGV4ID0gYXdhaXQgdGhpcy5fbmV4dEF2YWlsYWJsZUNlbGxUb0VkaXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRSb3cubmV4dCgpO1xuICAgICAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkUm93Lm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGVBbmRTYXZlKHN0b3BlZGl0aW5nOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5lZGl0aW5nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsaWQ6IGJvb2xlYW4gPSB0aGlzLl9mb3JtTWFzdGVyLnN1Ym1pdFNsYXZlcygpO1xuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcbiAgICBpZiAodmFsaWQpIHtcbiAgICAgIHRoaXMuX3NhdmVSb3coc3RvcGVkaXRpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxFZGl0Um93KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9uZXdSb3cpIHtcbiAgICAgIHRoaXMuZGF0YS5zcGxpY2UodGhpcy5kYXRhLmxlbmd0aCAtIDEsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGFbdGhpcy5lZGl0Um93SW5kZXhdID0gdGhpcy5yb3dUb0VkaXQ7XG4gICAgfVxuICAgIHRoaXMuX3Jlc2V0RWRpdCgpO1xuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVSb3coKTogdm9pZCB7XG4gICAgbGV0IGFic29sdXRlSW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWRSb3dJbmRleDtcbiAgICBpZiAodGhpcy5yb3dzUGVyUGFnZSkge1xuICAgICAgYWJzb2x1dGVJbmRleCA9ICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJvd3NQZXJQYWdlICsgdGhpcy5zZWxlY3RlZFJvd0luZGV4O1xuICAgIH1cbiAgICB0aGlzLmRlbGV0ZVJvdy5uZXh0KHRoaXMuZGF0YVthYnNvbHV0ZUluZGV4XSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd0luZGV4ID0gLTE7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnfSk7XG4gICAgfVxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDbGlja1JvdyhldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlubGluZUVkaXQgJiYgdGhpcy5zaG93Um93QnV0dG9ucyAmJiAhdGhpcy5lZGl0aW5nKSB7XG4gICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kb3VibGVDbGlja2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0VGhlUm93KGluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuaW5saW5lRWRpdCAmJiAhdGhpcy5zaG93Um93QnV0dG9ucykge1xuICAgICAgICAgIHRoaXMuZWRpdFJvdyhldmVudCwgdHJ1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUaGVSb3coaW5kZXg6IG51bWJlciwgZW1pdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd0luZGV4ID09PSAtMSB8fCAodGhpcy5zZWxlY3RlZFJvd0luZGV4ICE9PSBpbmRleCAmJiAoKHRoaXMuZWRpdGluZyAmJiB0aGlzLnZhbGlkYXRlQW5kU2F2ZSgpKSB8fCAhdGhpcy5lZGl0aW5nKSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IGluZGV4O1xuICAgICAgY29uc3QgYWJzb2x1dGVJbmRleDogbnVtYmVyID0gdGhpcy5yb3dzUGVyUGFnZSA/ICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJvd3NQZXJQYWdlICsgaW5kZXggOiBpbmRleDtcbiAgICAgIGlmIChlbWl0KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Um93Lm5leHQodGhpcy5kYXRhW2Fic29sdXRlSW5kZXhdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9PT0gaW5kZXggJiYgdGhpcy5kZXNlbGVjdEFsbG93ZWQgJiYgKCh0aGlzLmVkaXRpbmcgJiYgdGhpcy52YWxpZGF0ZUFuZFNhdmUoKSkgfHwgIXRoaXMuZWRpdGluZykpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xuICAgICAgaWYgKGVtaXQpIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdFJvdy5uZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGVEYmxDbGlja1JvdyhldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdywgaW5kZXgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGNhbkVkaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGlmICh0aGlzLmNhblJvd0JlRWRpdHRlZEZuICYmIHR5cGVvZiB0aGlzLmNhblJvd0JlRWRpdHRlZEZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYW5FZGl0ID0gYXdhaXQgdGhpcy5jYW5Sb3dCZUVkaXR0ZWRGbi5jYWxsKHRoaXMsIHJvdyk7XG4gICAgfVxuICAgIGlmIChjYW5FZGl0KSB7XG4gICAgICB0aGlzLl9kb3VibGVDbGlja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGJsQ2xpY2tSb3cubmV4dCh0aGlzLmRhdGFbaW5kZXhdKTtcbiAgICAgIHRoaXMuc2VsZWN0VGhlUm93KGluZGV4LCBmYWxzZSk7XG4gICAgICBpZiAodGhpcy5pbmxpbmVFZGl0ICYmICF0aGlzLnNob3dSb3dCdXR0b25zKSB7XG4gICAgICAgIHRoaXMuZWRpdFJvdyhldmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3Jlc2V0RGJsQ2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlZGl0Um93KGV2ZW50OiBNb3VzZUV2ZW50LCBzZWxlY3RDZWxsOiBib29sZWFuID0gdHJ1ZSwgcm93SW5kZXg/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocm93SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZWxlY3RUaGVSb3cocm93SW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gdGhpcy5zZWxlY3RlZFJvd0luZGV4O1xuICAgIHRoaXMucm93VG9FZGl0ID0gdGhpcy5kYXRhW3RoaXMuZWRpdFJvd0luZGV4XTtcblxuICAgIGlmICh0aGlzLnNob3dSb3dCdXR0b25zICYmIHRoaXMuaW5saW5lRWRpdCAmJiBzZWxlY3RDZWxsKSB7XG4gICAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSBhd2FpdCB0aGlzLl9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZUNlbGxDbGljayhldmVudDogTW91c2VFdmVudCwgcm93OiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZWRpdE9uQ2VsbENsaWNrKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdywgcm93SW5kZXgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pbmxpbmVFZGl0KSB7XG4gICAgICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gcm93SW5kZXg7XG4gICAgICAgIHRoaXMuZWRpdENlbGxJbmRleCA9IGNlbGxJbmRleDtcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0Q2VsbEluZGV4ID0gY2VsbEluZGV4O1xuICAgIH1cbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2V0dGluZ3NNZW51KCk6IHZvaWQge1xuICAgIHRoaXMuaGVhZGVyQ29sdW1uc0NvcHkuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICB0aGlzLmlzU2V0dGluZ3NNZW51T3BlbiA9ICF0aGlzLmlzU2V0dGluZ3NNZW51T3BlbjtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVDb2x1bW5NZW51KGNvbDogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dHcmlkU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzU2V0dGluZ3NNZW51T3BlbiA9IGZhbHNlO1xuICAgIGlmIChjb2wuaXNTZWxlY3RlZCkge1xuICAgICAgY29sLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJDb2x1bW5zQ29weS5mb3JFYWNoKGkgPT4gaS5pc1NlbGVjdGVkID0gZmFsc2UpO1xuICAgICAgY29sLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlQ29sdW1uKGNvbDogYW55KTogdm9pZCB7XG4gICAgY29sLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhlYWRlckNvbHVtbnNDb3B5ID0gdGhpcy5oZWFkZXJDb2x1bW5zQ29weS5maWx0ZXIoKG9iaikgPT4ge1xuICAgICAgcmV0dXJuIG9iaiAhPT0gY29sO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNvcnRDb2x1bW4oY29sOiBhbnksIGNvbHVtblZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb2wuaXNTZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuc29ydENvbHVtblZhbHVlID09PSBjb2x1bW5WYWx1ZSkge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRDb2x1bW5WYWx1ZSA9IGNvbHVtblZhbHVlO1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcblxuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRhdGFdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGxldCB2YWxBID0gYVtjb2x1bW5WYWx1ZV07XG4gICAgICBsZXQgdmFsQiA9IGJbY29sdW1uVmFsdWVdO1xuXG4gICAgICBpZiAodmFsQSA9PSBudWxsICYmIHZhbEIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxBID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIC0xICogZGlyZWN0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHZhbEIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMSAqIGRpcmVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIElTTyBkYXRlIHN0cmluZ1xuICAgICAgY29uc3QgaXNEYXRlQSA9IHR5cGVvZiB2YWxBID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VC8udGVzdCh2YWxBKTtcbiAgICAgIGNvbnN0IGlzRGF0ZUIgPSB0eXBlb2YgdmFsQiA9PT0gJ3N0cmluZycgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVQvLnRlc3QodmFsQik7XG5cbiAgICAgIGlmIChpc0RhdGVBICYmIGlzRGF0ZUIpIHtcbiAgICAgICAgY29uc3QgdGltZUEgPSBuZXcgRGF0ZSh2YWxBKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IHRpbWVCID0gbmV3IERhdGUodmFsQikuZ2V0VGltZSgpO1xuICAgICAgICByZXR1cm4gKHRpbWVBIC0gdGltZUIpICogZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayBmb3IgbnVtYmVycy9zdHJpbmdzXG4gICAgICBpZiAodHlwZW9mIHZhbEEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsQS5sb2NhbGVDb21wYXJlKHZhbEIpICogZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKHZhbEEgPiB2YWxCID8gMSA6IHZhbEEgPCB2YWxCID8gLTEgOiAwKSAqIGRpcmVjdGlvbjtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YSA9IHNvcnRlZDtcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0FsbENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5pc1NldHRpbmdzTWVudU9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmhlYWRlckNvbHVtbnNDb3B5ID0gdGhpcy5oZWFkZXJDb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydFRvRXhjZWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1NldHRpbmdzTWVudU9wZW4gPSBmYWxzZTtcbiAgICBjb25zdCBleHBvcnREYXRhOiBPYmplY3RbXSA9IHRoaXMuZXhwb3J0RGF0YS5sZW5ndGggPiAwID8gdGhpcy5fZmlsdGVyU2VsZWN0ZWRPclJldHVybkFsbCh0aGlzLmV4cG9ydERhdGEpIDogdGhpcy5fZmlsdGVyU2VsZWN0ZWRPclJldHVybkFsbCh0aGlzLmRhdGEpO1xuICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbltdID0gdGhpcy5oZWFkZXJDb2x1bW5zQ29weS5tYXAoY29sdW1uID0+IHtcbiAgICAgIHJldHVybiAoe1xuICAgICAgICBrZXk6IGNvbHVtbi5maWVsZCxcbiAgICAgICAgaGVhZGVyOiBjb2x1bW4uaGVhZGVyVGV4dFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gY29sdW1ucy5tYXAoY29sID0+IGNvbC5oZWFkZXIpO1xuICAgIGNvbnN0IHJvd3MgPSBleHBvcnREYXRhLm1hcChyb3cgPT5cbiAgICAgIGNvbHVtbnMubWFwKGNvbCA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbC5rZXldO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgICAgICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBmb3JtYXR0ZWREYXRlLnNwbGl0KCctJyk7XG4gICAgICAgICAgcmV0dXJuIGAke2RheX0tJHttb250aH0tJHt5ZWFyfWA7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGNvbnN0IGhhc0RlY2ltYWwgPSAobnVtKSA9PiAhTnVtYmVyLmlzSW50ZWdlcihudW0pO1xuICAgICAgICAgIHJldHVybiBoYXNEZWNpbWFsKHZhbHVlKSA/IHZhbHVlLnRvRml4ZWQoMikgOiB2YWx1ZS50b0ZpeGVkKDApO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmpvaW4oJywgJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5jbHVkZXMoJ1QwMDowMDowMCcpKSB7XG4gICAgICAgICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSB2YWx1ZS5yZXBsYWNlKCdUMDA6MDA6MDAnLCAnJykuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIHJldHVybiBgJHtkYXl9LSR7bW9udGh9LSR7eWVhcn1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gY29uc3QgY3N2Q29udGVudCA9IFtoZWFkZXJzLCAuLi5yb3dzXS5tYXAocm93ID0+XG4gICAgLy8gICByb3cubWFwKGNlbGwgPT4gYFwiJHtjZWxsLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgKS5qb2luKCcsJylcbiAgICAvLyApLmpvaW4oJ1xcclxcbicpO1xuXG4gICAgY29uc3QgY3N2Q29udGVudDogc3RyaW5nID0gW2hlYWRlcnMsIC4uLnJvd3NdLm1hcChyb3cgPT5cbiAgICAgIHJvdy5tYXAoKGNlbGw6IHN0cmluZykgPT4gYFwiJHtTdHJpbmcoY2VsbCkucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImApLmpvaW4oJywnKVxuICAgICkuam9pbignXFxyXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7dHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7J30pO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCAnRXhjZWxTaGVldCcpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgbGluay5jbGljaygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG5cbiAgICAvLyB0aGlzLmV4Y2VsRXhwb3J0U2VydmljZS5leHBvcnRUb0V4Y2VsKFxuICAgIC8vICAgdGhpcy5kYXRhLFxuICAgIC8vICAgY29sdW1ucyxcbiAgICAvLyAgICdFeGNlbFNoZWV0JyxcbiAgICAvLyAgICdTaGVldDEnXG4gICAgLy8gKTtcbiAgfVxuXG4gIHB1YmxpYyBnb1RvUHJldmlvdXNQYWdlKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgLT0gMTtcbiAgfVxuXG4gIHB1YmxpYyBnb1RvTmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSArPSAxO1xuICB9XG5cbiAgcHVibGljIHNldEN1cnJlbnRQYWdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc05ld1JvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbmV3Um93O1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyU2VsZWN0ZWRPclJldHVybkFsbChpdGVtczogYW55KSB7XG4gICAgY29uc3QgaGFzU2VsZWN0ZWRUcnVlOiBib29sZWFuID0gaXRlbXMuc29tZShpdGVtID0+IGl0ZW0uc2VsZWN0ZWQgPT09IHRydWUpO1xuICAgIHJldHVybiBoYXNTZWxlY3RlZFRydWUgPyBpdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnNlbGVjdGVkID09PSB0cnVlKSA6IGl0ZW1zO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVEYXRhUm93KHJvdzogYW55LCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdywgaW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXREYmxDbGljaygpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2RvdWJsZUNsaWNrZWQgPSBmYWxzZTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBuZXh0OyBNb3ZlIHRvIG5leHQgb3IgcHJldmlvdXMgY2VsbFxuICAgKiBAcGFyYW0gc3RhcnQ7IFN0YXJ0IGZyb20gY2VsbGluZGV4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdChuZXh0OiBib29sZWFuLCBzdGFydDogbnVtYmVyID0gLTEpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IG51bUVkaXRhYmxlQ29sdW1uczogbnVtYmVyID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+ICFjLnJlYWRvbmx5KS5sZW5ndGg7XG4gICAgICBjb25zdCB3YW50ZWRJbmRleCA9IHN0YXJ0ICsgKG5leHQgPyAxIDogLTEpO1xuICAgICAgaWYgKHdhbnRlZEluZGV4ID49IG51bUVkaXRhYmxlQ29sdW1ucykge1xuICAgICAgICB0aGlzLl9nZXROZXh0RWRpdFJvd0luZGV4KClcbiAgICAgICAgICAudGhlbigoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5lZGl0Um93SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5fZ2V0TmV4dEVkaXRDZWxsSW5kZXgoMCkpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAod2FudGVkSW5kZXggPCAwKSB7XG4gICAgICAgIHRoaXMuX2dldFByZXZpb3VzRWRpdFJvd0luZGV4KClcbiAgICAgICAgICAudGhlbigoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5lZGl0Um93SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5fZ2V0UHJldmlvdXNFZGl0Q2VsbEluZGV4KHRoaXMuY29sdW1ucy5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShuZXh0ID8gdGhpcy5fZ2V0TmV4dEVkaXRDZWxsSW5kZXgoc3RhcnQgKyAxKSA6IHRoaXMuX2dldFByZXZpb3VzRWRpdENlbGxJbmRleChzdGFydCAtIDEpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE5leHRFZGl0Q2VsbEluZGV4KHN0YXJ0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHN0YXJ0OyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuY29sdW1uc1tpXS5yZWFkb25seSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRQcmV2aW91c0VkaXRDZWxsSW5kZXgoc3RhcnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXRoaXMuY29sdW1uc1tpXS5yZWFkb25seSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXROZXh0RWRpdFJvd0luZGV4KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgbGV0IG5ld1Jvd0luZGV4OiBudW1iZXIgPSAwO1xuICAgICAgaWYgKHRoaXMuZWRpdFJvd0luZGV4ICsgMSA+PSB0aGlzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9BZGRSb3cpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld1JvdygpO1xuICAgICAgICAgIG5ld1Jvd0luZGV4ID0gdGhpcy5lZGl0Um93SW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Um93SW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdSb3dJbmRleCA9IHRoaXMuZWRpdFJvd0luZGV4ICsgMTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdSb3dJbmRleCAhPT0gdGhpcy5lZGl0Um93SW5kZXgpIHsgLy8gZ28gdG8gZGlmZmVyZW50IHJvdyB2YWxpZGF0ZSBjdXJyZW50IG9uZSBmaXJzdFxuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUFuZFNhdmUoZmFsc2UpKSB7XG4gICAgICAgICAgdGhpcy5yb3dUb0VkaXQgPSB0aGlzLmRhdGFbbmV3Um93SW5kZXhdO1xuICAgICAgICAgIHJlc29sdmUobmV3Um93SW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKG5ld1Jvd0luZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFByZXZpb3VzRWRpdFJvd0luZGV4KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgbGV0IG5ld1Jvd0luZGV4OiBudW1iZXIgPSAwO1xuICAgICAgaWYgKHRoaXMuZWRpdFJvd0luZGV4IC0gMSA8IDApIHtcbiAgICAgICAgbmV3Um93SW5kZXggPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1Jvd0luZGV4ID0gdGhpcy5lZGl0Um93SW5kZXggLSAxO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1Jvd0luZGV4ICE9PSB0aGlzLmVkaXRSb3dJbmRleCkgeyAvLyBnbyB0byBkaWZmZXJlbnQgcm93IHZhbGlkYXRlIGN1cnJlbnQgb25lIGZpcnN0XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlQW5kU2F2ZShmYWxzZSkpIHtcbiAgICAgICAgICB0aGlzLnJvd1RvRWRpdCA9IHRoaXMuZGF0YVtuZXdSb3dJbmRleF07XG4gICAgICAgICAgcmVzb2x2ZShuZXdSb3dJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUobmV3Um93SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2F2ZVJvdyhzdG9wZWRpdGluZzogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbmV3Um93KSB7XG4gICAgICB0aGlzLnNhdmVSb3cubmV4dCh0aGlzLl9uZXdSb3dSZWZlcmVuY2UpO1xuICAgICAgdGhpcy5fbmV3Um93UmVmZXJlbmNlID0gbnVsbDsgLy8gY2xlYXJcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSAtMTsgLy8gZXhpc3Rpbmcgcm93XG5cbiAgICAgIGlmICh0aGlzLnJvd3NQZXJQYWdlKSB7XG4gICAgICAgIGluZGV4ID0gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucm93c1BlclBhZ2UgKyB0aGlzLmVkaXRSb3dJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4ID0gdGhpcy5lZGl0Um93SW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5kYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNhdmVSb3cubmV4dCh0aGlzLmRhdGFbaW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd0luZGV4ID0gLTE7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnfSk7XG4gICAgfVxuICAgIHRoaXMuX25ld1JvdyA9IGZhbHNlO1xuICAgIGlmIChzdG9wZWRpdGluZykge1xuICAgICAgdGhpcy5fcmVzZXRFZGl0KCk7XG4gICAgfVxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24uZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRFZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuX25ld1JvdyA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xuICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gLTE7XG4gICAgdGhpcy5lZGl0Q2VsbEluZGV4ID0gLTE7XG4gICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5yb3dUb0VkaXQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
767
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NpbXBsZS1ncmlkL3NpbXBsZS1ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDekUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBNkw1RCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsdUJBQXVCO0lBaUc5RCxZQUNTLEtBQXVCLEVBQ3BCLGVBQWtDLEVBQ3BDLFdBQThCO1FBRXRDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUpoQixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBbUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBbkd4QixxQkFBZ0IsR0FBZ0IsV0FBVyxDQUFDLElBQUksQ0FBQztRQVkxRCxZQUFPLEdBQVksS0FBSyxDQUFDO1FBR3pCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFHNUIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFHakMsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFHaEMsaUJBQVksR0FBWSxLQUFL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QVksU0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCwgRWxlbWVudFJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsIFF1ZXJ5TGlzdCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtGb3JtTWFzdGVyU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlL2Zvcm0tbWFzdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Jhc2VTaW1wbGVHcmlkQ29tcG9uZW50fSBmcm9tICcuL2Jhc2Utc2ltcGxlLWdyaWQuY29tcG9uZW50JztcclxuaW1wb3J0IHtDb2x1bW5BbGlnbn0gZnJvbSAnLi9zaW1wbGUtZ3JpZC1jb2x1bW4uZGlyZWN0aXZlJztcclxuaW1wb3J0IHtDb3JlQ29tcG9uZW50c0ljb259IGZyb20gJy4uLy4uL2NvcmUvZW51bS9jb3JlLWNvbXBvbmVudHMtaWNvbi5lbnVtJztcclxuaW1wb3J0IHtJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tICcuLi9pY29uL2ljb24tY2FjaGUuc2VydmljZSc7XHJcbmltcG9ydCB7RXhwb3J0Q29sdW1ufSBmcm9tICcuLi8uLi9zZXJ2aWNlL2V4Y2VsLWV4cG9ydC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY28tc2ltcGxlLWdyaWQnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8Y28tZ3JpZC10b29sYmFyXHJcbiAgICAgICpuZ0lmPVwic2hvd1Rvb2xiYXJcIiBbY2xhc3MucmlnaHRdPVwicmlnaHRUb29sYmFyXCJcclxuICAgICAgW3Nob3dFZGl0XT1cInNob3dFZGl0XCJcclxuICAgICAgW3Nob3dBZGRdPVwic2hvd0FkZFwiXHJcbiAgICAgIFtzaG93RGVsZXRlXT1cInNob3dEZWxldGVcIlxyXG4gICAgICBbZGVsZXRlRW5hYmxlZF09XCJzZWxlY3RlZFJvd0luZGV4ID4gLTFcIlxyXG4gICAgICAoYWRkQ2xpY2spPVwiYWRkTmV3Um93KClcIlxyXG4gICAgICAoZWRpdENsaWNrKT1cImVkaXRSb3coJGV2ZW50KVwiXHJcbiAgICAgIChzYXZlQ2xpY2spPVwidmFsaWRhdGVBbmRTYXZlKClcIlxyXG4gICAgICAoY2FuY2VsQ2xpY2spPVwiY2FuY2VsRWRpdFJvdygpXCJcclxuICAgICAgKGRlbGV0ZUNsaWNrKT1cInJlbW92ZVJvdygpXCI+XHJcbiAgICA8L2NvLWdyaWQtdG9vbGJhcj5cclxuXHJcbiAgICA8dGFibGVcclxuICAgICAgaWQ9XCJzaW1wbGUtZ3JpZC10YWJsZVwiXHJcbiAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtdGFibGVcIlxyXG4gICAgICBbY2xpY2tPdXRzaWRlXT1cImVkaXRpbmdcIlxyXG4gICAgICAoY2xpY2tPdXRzaWRlKT1cImhhbmRsZUNsaWNrT3V0c2lkZVJvdygpXCI+XHJcbiAgICAgIDxjb2xncm91cD5cclxuICAgICAgICA8Y29sXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGhlYWRlckNvbHVtbnNDb3B5OyBsZXQgaW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICBbY2xhc3Muc2ltcGxlLWdyaWQtY29sdW1uLWF1dG8tZml0XT1cImNvbHVtbi5hdXRvRml0XCJcclxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxyXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJNSU5fQ09MVU1OX1dJRFRIXCI+XHJcbiAgICAgICAgPGNvbFxyXG4gICAgICAgICAgKm5nSWY9XCIoKGlubGluZUVkaXQgJiYgc2hvd1Jvd0J1dHRvbnMpIHx8IChzaG93RGVsZXRlICYmICFzaG93Um93QnV0dG9ucykpICYmIChob3ZlcmVkUm93SW5kZXggPj0gMCB8fCBzZWxlY3RlZFJvd0luZGV4ID49IDAgfHwgaXNOZXdSb3cpXCJcclxuICAgICAgICAgIFtjbGFzcy5pY29ucy1jb2xdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbY2xhc3MuY29sLXdpZHRoLXJvdy1idXR0b25zXT1cImlubGluZUVkaXQgJiYgc2hvd1Jvd0J1dHRvbnNcIlxyXG4gICAgICAgICAgW2NsYXNzLmNvbC13aWR0aC1kZWxldGVdPVwiIXNob3dSb3dCdXR0b25zICYmIHNob3dEZWxldGVcIj5cclxuICAgICAgPC9jb2xncm91cD5cclxuICAgICAgPHRoZWFkPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICAjaGVhZGVyQ2VsbFxyXG4gICAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4taGVhZGVyXCJcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgaGVhZGVyQ29sdW1uc0NvcHk7IGxldCBpbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtY29sdW1uLWhlYWRlci13cmFwcGVyXCJcclxuICAgICAgICAgICAgW2NsYXNzLnJlc2l6YWJsZV09XCJyZXNpemFibGVcIlxyXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiY29sdW1uLmlzU2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4udGV4dEFsaWduID8gY29sdW1uLnRleHRBbGlnbiA6IGRlZmF1bHRUZXh0QWxpZ25cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJUZW1wbGF0ZTsgZWxzZSBub0hlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9IZWFkZXJUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNpbXBsZS1ncmlkLWNvbHVtbi1oZWFkZXItbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLnRleHRBbGlnbiA/IGNvbHVtbi50ZXh0QWxpZ24gOiBkZWZhdWx0VGV4dEFsaWduXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy53aXRoLW1lbnVdPVwic2hvd0dyaWRTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3Mud2l0aC1zb3J0XT1cInNob3dDb2x1bW5Tb3J0XCJcclxuICAgICAgICAgICAgICAgIFt0ZXh0Q29udGVudF09XCJjb2x1bW4uaGVhZGVyVGV4dCB8fCAnJm5ic3A7J1wiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0NvbHVtblNvcnQgPyBzb3J0Q29sdW1uKGNvbHVtbiwgY29sdW1uLmZpZWxkKSA6IHRvZ2dsZUNvbHVtbk1lbnUoY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydC1jb2x1bW5cIiAqbmdJZj1cInNob3dDb2x1bW5Tb3J0XCI+XHJcbiAgICAgICAgICAgICAgICA8Y28tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0Q29sdW1uKGNvbHVtbiwgY29sdW1uPy5maWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbnMuZ2V0SWNvbihJY29ucy5BcnJvd1VwQXJyb3dEb3duKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9jby1idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tbWVudVwiICpuZ0lmPVwiY29sdW1uLmlzU2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBbdGV4dENvbnRlbnRdPVwiJ0NPTFVNTl9PUFRJT05TJyB8IGNvcmVMb2NhbGl6ZVwiPjwvaDM+XHJcbiAgICAgICAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiaGlkZUNvbHVtbihjb2x1bW4pXCI+SGlkZSBDb2x1bW48L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cInNvcnRDb2x1bW4oY29sdW1uLCBjb2x1bW4uZmllbGQpXCI+U29ydCBDb2x1bW48L2xpPlxyXG4gICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwicmVzaXphYmxlICYmIGNvbHVtbi5yZXNpemFibGVcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtY29sdW1uLXNpemVyXCJcclxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImhhbmRsZVNpemVyTW91c2VEb3duKCRldmVudCwgY29sdW1uKVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgIDwvdHI+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0dyaWRTZXR0aW5nc1wiIGNsYXNzPVwiZ3JpZC1zZXR0aW5nc1wiPlxyXG4gICAgICAgIDxjby1idXR0b25cclxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NldHRpbmdzTWVudU9wZW5cIlxyXG4gICAgICAgICAgW2ljb25EYXRhXT1cImljb25zLmdldEljb24oSWNvbnMuQ29nV2hlZWxzKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2V0dGluZ3NNZW51KClcIj5cclxuICAgICAgICA8L2NvLWJ1dHRvbj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNldHRpbmdzLW1lbnVcIiAqbmdJZj1cImlzU2V0dGluZ3NNZW51T3BlblwiPlxyXG4gICAgICAgICAgPGgzIFt0ZXh0Q29udGVudF09XCInR1JJRF9PUFRJT05TJyB8IGNvcmVMb2NhbGl6ZVwiPjwvaDM+XHJcbiAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZXhwb3J0VG9FeGNlbCgpXCI+RXhwb3J0IHRvIEV4Y2VsPC9saT5cclxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGVhZGVyQ29sdW1uc0NvcHkubGVuZ3RoICE9PSBoZWFkZXJDb2x1bW5zLmxlbmd0aFwiIChjbGljayk9XCJzaG93QWxsQ29sdW1ucygpXCI+XHJcbiAgICAgICAgICAgICAgU2hvdyBBbGwgQ29sdW1uc1xyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGhlYWQ+XHJcbiAgICAgIDx0Ym9keVxyXG4gICAgICAgICNkcm9wTGlzdCBjZGtEcm9wTGlzdCBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwidmVydGljYWxcIlxyXG4gICAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtZHJhZy1kcm9wLWxpc3RcIlxyXG4gICAgICAgIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cIiFkcmFnRHJvcEVuYWJsZWQgfHwgZWRpdGluZ1wiXHJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJkYXRhXCJcclxuICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJoYW5kbGVDYW5EcmFnRHJvcFwiXHJcbiAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJoYW5kbGVEcm9wKCRldmVudClcIj5cclxuICAgICAgPGNvLWZvcm0gY2xhc3M9XCJzaW1wbGUtZ3JpZC1yb3ctZm9ybVwiPlxyXG4gICAgICAgIDx0clxyXG4gICAgICAgICAgI3Jvd0VsZW1lbnRcclxuICAgICAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtcm93XCJcclxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyb3dJbmRleCA9PT0gc2VsZWN0ZWRSb3dJbmRleCAmJiAhZWRpdGluZ1wiIG9ic2VydmVWaXNpYmlsaXR5XHJcbiAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZ2V0SXNSb3dEaXNhYmxlZChyb3dJbmRleClcIlxyXG4gICAgICAgICAgW2NsYXNzLmVkaXRpbmddPVwicm93SW5kZXggPT09IGVkaXRSb3dJbmRleFwiXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mICghIXJvd3NQZXJQYWdlID8gKGRhdGEgfCBwYWdpbmF0ZToge2l0ZW1zUGVyUGFnZTogcm93c1BlclBhZ2UsIGN1cnJlbnRQYWdlOiBjdXJyZW50UGFnZX0pIDogZGF0YSk7IGxhc3QgYXMgbGFzdDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgY2RrRHJhZ1xyXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrUm93KCRldmVudCwgcm93SW5kZXgpXCIgKGRibGNsaWNrKT1cImhhbmRsZURibENsaWNrUm93KCRldmVudCwgcm93SW5kZXgsIHJvdylcIlxyXG4gICAgICAgICAgKHZpc2liaWxpdHlDaGFuZ2UpPVwicm93VmlzaWJsZS5uZXh0KHJvdylcIlxyXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZFJvd0luZGV4ID0gcm93SW5kZXhcIlxyXG4gICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZFJvd0luZGV4ID0gLTFcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1NpbmdsZUNvbHVtblJvdyhyb3cpXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNpbXBsZS1ncmlkLXNpbmdsZS1jb2x1bW4tY2VsbFwiIFthdHRyLmNvbHNwYW5dPVwiaGVhZGVyQ29sdW1uc0NvcHkubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgPGNvLXNpbXBsZS1ncmlkLWNlbGxcclxuICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uc1tzaW5nbGVDb2x1bW5JbmRleChyb3cpXVwiXHJcbiAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXHJcbiAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8L2NvLXNpbXBsZS1ncmlkLWNlbGw+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNTaW5nbGVDb2x1bW5Sb3cocm93KVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgaGVhZGVyQ29sdW1uc0NvcHk7IGxldCBjb2x1bW5JbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2ltcGxlLWdyaWQtY29sdW1uLWNlbGxcIiAqbmdJZj1cImNvbHVtbkluZGV4ICE9PSBzaW5nbGVDb2x1bW5JbmRleChyb3cpXCI+XHJcbiAgICAgICAgICAgICAgICA8Y28tc2ltcGxlLWdyaWQtY2VsbFxyXG4gICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcclxuICAgICAgICAgICAgICAgICAgW2VkaXRNb2RlXT1cImlubGluZUVkaXQgJiYgZWRpdGluZyAmJiByb3dJbmRleCA9PT0gZWRpdFJvd0luZGV4XCJcclxuICAgICAgICAgICAgICAgICAgW2ZpZWxkRWRpdE1vZGVdPVwiZWRpdENlbGxJbmRleCA9PT0gY29sdW1uSW5kZXggJiYgcm93SW5kZXggPT09IGVkaXRSb3dJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgIChjZWxsQ2xpY2spPVwiaGFuZGxlQ2VsbENsaWNrKCRldmVudCwgcm93LCByb3dJbmRleCwgY29sdW1uSW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2NvLXNpbXBsZS1ncmlkLWNlbGw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnJlc2l6YWJsZVwiIGNsYXNzPVwic2ltcGxlLWdyaWQtY29sdW1uLXNpemVyLXBsYWNlaG9sZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaW5saW5lRWRpdCAmJiBzaG93Um93QnV0dG9ucykgfHwgKHNob3dEZWxldGUgJiYgIXNob3dSb3dCdXR0b25zKVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImljb25zLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGVkaXRSb3dJbmRleCA8PSAtMSAmJiBzZWxlY3RlZFJvd0luZGV4ID09PSAtMSAmJiBob3ZlcmVkUm93SW5kZXggPT09IHJvd0luZGV4KSB8fCBzZWxlY3RlZFJvd0luZGV4ID09PSByb3dJbmRleCB8fCAoaXNOZXdSb3cgJiYgcm93SW5kZXggPT09IGVkaXRSb3dJbmRleClcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDxjby1pY29uIGNsYXNzPVwiaWNvbi1pdGVtIGljb24tZWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWVkaXRpbmcgJiYgKGlubGluZUVkaXQgJiYgc2hvd1Jvd0J1dHRvbnMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25EYXRhXT1cImljb25zLmdldEljb24oSWNvbnMuUGVuVG9TcXVhcmVTb2xpZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdFJvdygkZXZlbnQsIHRydWUsIHJvd0luZGV4KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+PC9jby1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8Y28taWNvbiBjbGFzcz1cImljb24taXRlbSBpY29uLWRlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uRGF0YV09XCJpY29ucy5nZXRJY29uKEljb25zLlRyYXNoQmluKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKCFlZGl0aW5nICYmIChpbmxpbmVFZGl0IHx8ICFpbmxpbmVFZGl0KSAmJiBzaG93Um93QnV0dG9ucykgfHwgKCFzaG93Um93QnV0dG9ucyAmJiBzaG93RGVsZXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUaGVSb3cocm93SW5kZXgpOyByZW1vdmVSb3coKTtcIj48L2NvLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0aW5nICYmIGlubGluZUVkaXQgJiYgc2hvd1Jvd0J1dHRvbnMgJiYgKHNlbGVjdGVkUm93SW5kZXggPT09IHJvd0luZGV4IHx8IGlzTmV3Um93KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8Y28tYnV0dG9uIGNsYXNzPVwic2F2ZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uRGF0YV09XCJpY29ucy5nZXRJY29uKEljb25zLkNoZWNrRHVvdG9uZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2YWxpZGF0ZUFuZFNhdmUoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+PC9jby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxjby1idXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uRGF0YV09XCJpY29ucy5nZXRJY29uKEljb25zLkNyb3NzU2tpbm55KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEVkaXRSb3coKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIFwiPjwvY28tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L2NvLWZvcm0+XHJcbiAgICAgIDwvdGJvZHk+XHJcbiAgICA8L3RhYmxlPlxyXG4gICAgPGNvLXBhZ2luYXRpb24tYmFyXHJcbiAgICAgICpuZ0lmPVwiZGF0YT8ubGVuZ3RoID4gcm93c1BlclBhZ2VcIiBjbGFzcz1cInBhZ2luYXRpb24tYmFyXCJcclxuICAgICAgW2l0ZW1zUGVyUGFnZV09XCJyb3dzUGVyUGFnZVwiXHJcbiAgICAgIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXHJcbiAgICAgIFt0b3RhbEl0ZW1zXT1cImRhdGEubGVuZ3RoXCJcclxuICAgICAgW2F1dG9IaWRlXT1cInRydWVcIlxyXG4gICAgICAocHJldmlvdXNDbGljayk9XCJnb1RvUHJldmlvdXNQYWdlKClcIlxyXG4gICAgICAobmV4dENsaWNrKT1cImdvVG9OZXh0UGFnZSgpXCJcclxuICAgICAgKHBhZ2VDbGljayk9XCJzZXRDdXJyZW50UGFnZSgkZXZlbnQpXCI+XHJcbiAgICA8L2NvLXBhZ2luYXRpb24tYmFyPlxyXG4gIGAsXHJcbiAgcHJvdmlkZXJzOiBbRm9ybU1hc3RlclNlcnZpY2VdLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW1wbGVHcmlkQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNpbXBsZUdyaWRDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VGV4dEFsaWduOiBDb2x1bW5BbGlnbiA9IENvbHVtbkFsaWduLkxlZnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2hlYWRlckNlbGwnKSBzZXQgaGVhZGVyQ2VsbHMoY2VsbHMpIHtcclxuICAgIGNvbnN0IGhlYWRlckVsZW1lbnRzID0gY2VsbHMudG9BcnJheSgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLmNvbHVtbnNbaV0uZWxlbWVudFJlZiA9IGhlYWRlckVsZW1lbnRzW2ldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZHJlbigncm93RWxlbWVudCcpIHJvd0VsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3dBZGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0RlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZXNlbGVjdEFsbG93ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZWRpdE9uQ2VsbENsaWNrOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcmlnaHRUb29sYmFyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3dHcmlkU2V0dGluZ3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcm93c1BlclBhZ2U6IG51bWJlciA9IDUwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByb3dEaXNhYmxlZEZuOiBGdW5jdGlvbjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0NvbHVtblNvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd1Jvd0J1dHRvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJvbWlzZSBmdW5jdGlvbiwgaWYgcHJvdmlkZWQgc2hvdWxkIHJldHVybiBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY2FuUm93QmVFZGl0dGVkRm46IEZ1bmN0aW9uO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNvLXNpbXBsZS1ncmlkJylcclxuICBwdWJsaWMgc2hvd0NsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBwdWJsaWMgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlubGluZUVkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC5jb2RlID09PSAnVGFiJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLl9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdCghZXZlbnQuc2hpZnRLZXksIHRoaXMuZWRpdENlbGxJbmRleClcclxuICAgICAgICAudGhlbigoaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5lZGl0Q2VsbEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9KTtcclxuICAgICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC5jb2RlID09PSAnRXNjYXBlJykge1xyXG4gICAgICB0aGlzLmNhbmNlbEVkaXRSb3coKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xyXG4gICAgICB0aGlzLnZhbGlkYXRlQW5kU2F2ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaXNTZXR0aW5nc01lbnVPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGVkaXRSb3dJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgcHVibGljIGVkaXRDZWxsSW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIHB1YmxpYyBzZWxlY3RlZFJvd0luZGV4OiBudW1iZXIgPSAtMTtcclxuICBwdWJsaWMgcm93VG9FZGl0OiBhbnk7XHJcbiAgcHVibGljIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAxO1xyXG4gIHB1YmxpYyBzb3J0Q29sdW1uVmFsdWU6IHN0cmluZztcclxuICBwdWJsaWMgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcclxuICBwdWJsaWMgaG92ZXJlZFJvd0luZGV4OiBudW1iZXIgPSAtMTtcclxuICBwdWJsaWMgcmVhZG9ubHkgSWNvbnMgPSBDb3JlQ29tcG9uZW50c0ljb247XHJcblxyXG4gIHByaXZhdGUgX2RvdWJsZUNsaWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9uZXdSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9uZXdSb3dSZWZlcmVuY2U6IGFueTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEljb25DYWNoZVNlcnZpY2UgPSBJY29uQ2FjaGVTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBDb3JlQ29tcG9uZW50c0ljb24gPSBDb3JlQ29tcG9uZW50c0ljb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGljb25zOiBJY29uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9mb3JtTWFzdGVyOiBGb3JtTWFzdGVyU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoY2hhbmdlRGV0ZWN0aW9uKTtcclxuICAgIHRoaXMuZGF0YUNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVDbGlja091dHNpZGVSb3coKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbGlkYXRlQW5kU2F2ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldElzUm93RGlzYWJsZWQoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVkUm93cy5pbmRleE9mKGlkeCkgPiAtMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpc1Jvd0Rpc2FibGVkKHJvdzogYW55LCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5yb3dEaXNhYmxlZEZuICYmICh0eXBlb2YgdGhpcy5yb3dEaXNhYmxlZEZuID09PSAnZnVuY3Rpb24nKSkge1xyXG4gICAgICBjb25zdCBkaXNhYmxlZCA9IGF3YWl0IHRoaXMucm93RGlzYWJsZWRGbi5jYWxsKHRoaXMsIHJvdyk7XHJcbiAgICAgIGNvbnN0IGlkeFJvdzogbnVtYmVyID0gdGhpcy5kaXNhYmxlZFJvd3MuaW5kZXhPZihpbmRleCk7XHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgIGlmIChpZHhSb3cgPCAwKSB7XHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVkUm93cy5wdXNoKGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGlkeFJvdyA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVkUm93cy5zcGxpY2UoaWR4Um93LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGRpc2FibGVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFkZE5ld1JvdygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlubGluZUVkaXQpIHtcclxuICAgICAgY29uc3QgdmFsaWQ6IGJvb2xlYW4gPSB0aGlzLnZhbGlkYXRlQW5kU2F2ZSgpO1xyXG4gICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICB0aGlzLl9uZXdSb3dSZWZlcmVuY2UgPSB7fTtcclxuICAgICAgICB0aGlzLmRhdGEucHVzaCh0aGlzLl9uZXdSb3dSZWZlcmVuY2UpO1xyXG4gICAgICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLl9uZXdSb3cgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZWRpdGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJvd3NQZXJQYWdlICYmIHRoaXMuZGF0YS5sZW5ndGggPiB0aGlzLnJvd3NQZXJQYWdlKSB7XHJcbiAgICAgICAgICAvLyBuYXZpZ2F0ZSB0byBsYXN0IHBhZ2VcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBNYXRoLmNlaWwodGhpcy5kYXRhLmxlbmd0aCAvIHRoaXMucm93c1BlclBhZ2UpO1xyXG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVJbmRleDogbnVtYmVyID0gKHRoaXMuZGF0YS5sZW5ndGggLSAxKSAlIHRoaXMucm93c1BlclBhZ2U7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSByZWxhdGl2ZUluZGV4O1xyXG4gICAgICAgICAgdGhpcy5lZGl0Um93SW5kZXggPSByZWxhdGl2ZUluZGV4O1xyXG5cclxuICAgICAgICAgIC8vIHN0b3JlIHJlZmVyZW5jZVxyXG4gICAgICAgICAgdGhpcy5yb3dUb0VkaXQgPSB0aGlzLl9uZXdSb3dSZWZlcmVuY2U7XHJcbiAgICAgICAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSBhd2FpdCB0aGlzLl9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdCh0cnVlKTtcclxuXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLnJvd0VsZW1lbnRzPy5sYXN0Py5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcid9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgMjAwKTtcclxuXHJcbiAgICAgICAgICAvLyByZXNldCByZWZlcmVuY2UgdG8gdGhlIG5ldyByb3cgYWZ0ZXIgZWRpdENlbGxJbmRleFxyXG4gICAgICAgICAgdGhpcy5yb3dUb0VkaXQgPSB0aGlzLl9uZXdSb3dSZWZlcmVuY2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICB0aGlzLnJvd1RvRWRpdCA9IHRoaXMuX25ld1Jvd1JlZmVyZW5jZTtcclxuICAgICAgICAgIHRoaXMuZWRpdENlbGxJbmRleCA9IGF3YWl0IHRoaXMuX25leHRBdmFpbGFibGVDZWxsVG9FZGl0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZFJvdy5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZFJvdy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdmFsaWRhdGVBbmRTYXZlKHN0b3BlZGl0aW5nOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRpbmcpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCB2YWxpZDogYm9vbGVhbiA9IHRoaXMuX2Zvcm1NYXN0ZXIuc3VibWl0U2xhdmVzKCk7XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBpZiAodmFsaWQpIHtcclxuICAgICAgdGhpcy5fc2F2ZVJvdyhzdG9wZWRpdGluZyk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbEVkaXRSb3coKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWRpdGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fbmV3Um93KSB7XHJcbiAgICAgIHRoaXMuZGF0YS5zcGxpY2UodGhpcy5kYXRhLmxlbmd0aCAtIDEsIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRhW3RoaXMuZWRpdFJvd0luZGV4XSA9IHRoaXMucm93VG9FZGl0O1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVzZXRFZGl0KCk7XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlUm93KCk6IHZvaWQge1xyXG4gICAgbGV0IGFic29sdXRlSW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWRSb3dJbmRleDtcclxuICAgIGlmICh0aGlzLnJvd3NQZXJQYWdlKSB7XHJcbiAgICAgIGFic29sdXRlSW5kZXggPSAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5yb3dzUGVyUGFnZSArIHRoaXMuc2VsZWN0ZWRSb3dJbmRleDtcclxuICAgIH1cclxuICAgIHRoaXMuZGVsZXRlUm93Lm5leHQodGhpcy5kYXRhW2Fic29sdXRlSW5kZXhdKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSAxKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSAtMTtcclxuICAgICAgd2luZG93LnNjcm9sbFRvKHt0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJ30pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUNsaWNrUm93KGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbmxpbmVFZGl0ICYmIHRoaXMuc2hvd1Jvd0J1dHRvbnMgJiYgIXRoaXMuZWRpdGluZykge1xyXG4gICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9kb3VibGVDbGlja2VkKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0VGhlUm93KGluZGV4KTtcclxuICAgICAgICBpZiAodGhpcy5pbmxpbmVFZGl0ICYmICF0aGlzLnNob3dSb3dCdXR0b25zKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRSb3coZXZlbnQsIHRydWUsIGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDIwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0VGhlUm93KGluZGV4OiBudW1iZXIsIGVtaXQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd0luZGV4ID09PSAtMSB8fCAodGhpcy5zZWxlY3RlZFJvd0luZGV4ICE9PSBpbmRleCAmJiAoKHRoaXMuZWRpdGluZyAmJiB0aGlzLnZhbGlkYXRlQW5kU2F2ZSgpKSB8fCAhdGhpcy5lZGl0aW5nKSkpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvd0luZGV4ID0gaW5kZXg7XHJcbiAgICAgIGNvbnN0IGFic29sdXRlSW5kZXg6IG51bWJlciA9IHRoaXMucm93c1BlclBhZ2UgPyAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5yb3dzUGVyUGFnZSArIGluZGV4IDogaW5kZXg7XHJcbiAgICAgIGlmIChlbWl0KSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RSb3cubmV4dCh0aGlzLmRhdGFbYWJzb2x1dGVJbmRleF0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9PT0gaW5kZXggJiYgdGhpcy5kZXNlbGVjdEFsbG93ZWQgJiYgKCh0aGlzLmVkaXRpbmcgJiYgdGhpcy52YWxpZGF0ZUFuZFNhdmUoKSkgfHwgIXRoaXMuZWRpdGluZykpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvd0luZGV4ID0gLTE7XHJcbiAgICAgIGlmIChlbWl0KSB7XHJcbiAgICAgICAgdGhpcy5kZXNlbGVjdFJvdy5uZXh0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBoYW5kbGVEYmxDbGlja1JvdyhldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChhd2FpdCB0aGlzLmlzUm93RGlzYWJsZWQocm93LCBpbmRleCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvd0luZGV4ID0gLTE7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBjYW5FZGl0OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmNhblJvd0JlRWRpdHRlZEZuICYmIHR5cGVvZiB0aGlzLmNhblJvd0JlRWRpdHRlZEZuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNhbkVkaXQgPSBhd2FpdCB0aGlzLmNhblJvd0JlRWRpdHRlZEZuLmNhbGwodGhpcywgcm93KTtcclxuICAgIH1cclxuICAgIGlmIChjYW5FZGl0KSB7XHJcbiAgICAgIHRoaXMuX2RvdWJsZUNsaWNrZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmRibENsaWNrUm93Lm5leHQodGhpcy5kYXRhW2luZGV4XSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0VGhlUm93KGluZGV4LCBmYWxzZSk7XHJcbiAgICAgIGlmICh0aGlzLmlubGluZUVkaXQgJiYgIXRoaXMuc2hvd1Jvd0J1dHRvbnMpIHtcclxuICAgICAgICB0aGlzLmVkaXRSb3coZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZXNldERibENsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZWRpdFJvdyhldmVudDogTW91c2VFdmVudCwgc2VsZWN0Q2VsbDogYm9vbGVhbiA9IHRydWUsIHJvd0luZGV4PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAocm93SW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdFRoZVJvdyhyb3dJbmRleCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5lZGl0Um93SW5kZXggPSB0aGlzLnNlbGVjdGVkUm93SW5kZXg7XHJcbiAgICB0aGlzLnJvd1RvRWRpdCA9IHRoaXMuZGF0YVt0aGlzLmVkaXRSb3dJbmRleF07XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvd1Jvd0J1dHRvbnMgJiYgdGhpcy5pbmxpbmVFZGl0ICYmIHNlbGVjdENlbGwpIHtcclxuICAgICAgdGhpcy5lZGl0Q2VsbEluZGV4ID0gYXdhaXQgdGhpcy5fbmV4dEF2YWlsYWJsZUNlbGxUb0VkaXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaGFuZGxlQ2VsbENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmVkaXRPbkNlbGxDbGljaykge1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdywgcm93SW5kZXgpKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd0luZGV4ID0gLTE7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmlubGluZUVkaXQpIHtcclxuICAgICAgICB0aGlzLmVkaXRSb3dJbmRleCA9IHJvd0luZGV4O1xyXG4gICAgICAgIHRoaXMuZWRpdENlbGxJbmRleCA9IGNlbGxJbmRleDtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSBjZWxsSW5kZXg7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlU2V0dGluZ3NNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oZWFkZXJDb2x1bW5zQ29weS5mb3JFYWNoKGkgPT4gaS5pc1NlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy5pc1NldHRpbmdzTWVudU9wZW4gPSAhdGhpcy5pc1NldHRpbmdzTWVudU9wZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlQ29sdW1uTWVudShjb2w6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNob3dHcmlkU2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNTZXR0aW5nc01lbnVPcGVuID0gZmFsc2U7XHJcbiAgICBpZiAoY29sLmlzU2VsZWN0ZWQpIHtcclxuICAgICAgY29sLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaGVhZGVyQ29sdW1uc0NvcHkuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgICAgY29sLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZGVDb2x1bW4oY29sOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbC5pc1NlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmhlYWRlckNvbHVtbnNDb3B5ID0gdGhpcy5oZWFkZXJDb2x1bW5zQ29weS5maWx0ZXIoKG9iaikgPT4ge1xyXG4gICAgICByZXR1cm4gb2JqICE9PSBjb2w7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzb3J0Q29sdW1uKGNvbDogYW55LCBjb2x1bW5WYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb2wuaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLnNvcnRDb2x1bW5WYWx1ZSA9PT0gY29sdW1uVmFsdWUpIHtcclxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zb3J0Q29sdW1uVmFsdWUgPSBjb2x1bW5WYWx1ZTtcclxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcclxuXHJcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4udGhpcy5kYXRhXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGxldCB2YWxBID0gYVtjb2x1bW5WYWx1ZV07XHJcbiAgICAgIGxldCB2YWxCID0gYltjb2x1bW5WYWx1ZV07XHJcblxyXG4gICAgICBpZiAodmFsQSA9PSBudWxsICYmIHZhbEIgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWxBID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gLTEgKiBkaXJlY3Rpb247XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbEIgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAxICogZGlyZWN0aW9uO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBIYW5kbGUgSVNPIGRhdGUgc3RyaW5nXHJcbiAgICAgIGNvbnN0IGlzRGF0ZUEgPSB0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVQvLnRlc3QodmFsQSk7XHJcbiAgICAgIGNvbnN0IGlzRGF0ZUIgPSB0eXBlb2YgdmFsQiA9PT0gJ3N0cmluZycgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVQvLnRlc3QodmFsQik7XHJcblxyXG4gICAgICBpZiAoaXNEYXRlQSAmJiBpc0RhdGVCKSB7XHJcbiAgICAgICAgY29uc3QgdGltZUEgPSBuZXcgRGF0ZSh2YWxBKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgY29uc3QgdGltZUIgPSBuZXcgRGF0ZSh2YWxCKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgcmV0dXJuICh0aW1lQSAtIHRpbWVCKSAqIGRpcmVjdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRmFsbGJhY2sgZm9yIG51bWJlcnMvc3RyaW5nc1xyXG4gICAgICBpZiAodHlwZW9mIHZhbEEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiB2YWxBLmxvY2FsZUNvbXBhcmUodmFsQikgKiBkaXJlY3Rpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAodmFsQSA+IHZhbEIgPyAxIDogdmFsQSA8IHZhbEIgPyAtMSA6IDApICogZGlyZWN0aW9uO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXRhID0gc29ydGVkO1xyXG4gICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dBbGxDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1NldHRpbmdzTWVudU9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaGVhZGVyQ29sdW1uc0NvcHkgPSB0aGlzLmhlYWRlckNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwb3J0VG9FeGNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNTZXR0aW5nc01lbnVPcGVuID0gZmFsc2U7XHJcbiAgICBjb25zdCBleHBvcnREYXRhOiBPYmplY3RbXSA9IHRoaXMuZXhwb3J0RGF0YS5sZW5ndGggPiAwID8gdGhpcy5fZmlsdGVyU2VsZWN0ZWRPclJldHVybkFsbCh0aGlzLmV4cG9ydERhdGEpIDogdGhpcy5fZmlsdGVyU2VsZWN0ZWRPclJldHVybkFsbCh0aGlzLmRhdGEpO1xyXG4gICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uW10gPSB0aGlzLmhlYWRlckNvbHVtbnNDb3B5Lm1hcChjb2x1bW4gPT4ge1xyXG4gICAgICByZXR1cm4gKHtcclxuICAgICAgICBrZXk6IGNvbHVtbi5maWVsZCxcclxuICAgICAgICBoZWFkZXI6IGNvbHVtbi5oZWFkZXJUZXh0XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbHVtbnMubWFwKGNvbCA9PiBjb2wuaGVhZGVyKTtcclxuICAgIGNvbnN0IHJvd3MgPSBleHBvcnREYXRhLm1hcChyb3cgPT5cclxuICAgICAgY29sdW1ucy5tYXAoY29sID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2wua2V5XTtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgICAgICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gZm9ybWF0dGVkRGF0ZS5zcGxpdCgnLScpO1xyXG4gICAgICAgICAgcmV0dXJuIGAke2RheX0tJHttb250aH0tJHt5ZWFyfWA7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICBjb25zdCBoYXNEZWNpbWFsID0gKG51bSkgPT4gIU51bWJlci5pc0ludGVnZXIobnVtKTtcclxuICAgICAgICAgIHJldHVybiBoYXNEZWNpbWFsKHZhbHVlKSA/IHZhbHVlLnRvRml4ZWQoMikgOiB2YWx1ZS50b0ZpeGVkKDApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgIHJldHVybiB2YWx1ZS5qb2luKCcsICcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5jbHVkZXMoJ1QwMDowMDowMCcpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHZhbHVlLnJlcGxhY2UoJ1QwMDowMDowMCcsICcnKS5zcGxpdCgnLScpO1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7ZGF5fS0ke21vbnRofS0ke3llYXJ9YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gY29uc3QgY3N2Q29udGVudCA9IFtoZWFkZXJzLCAuLi5yb3dzXS5tYXAocm93ID0+XHJcbiAgICAvLyAgIHJvdy5tYXAoY2VsbCA9PiBgXCIke2NlbGwucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImApLmpvaW4oJywnKVxyXG4gICAgLy8gKS5qb2luKCdcXHJcXG4nKTtcclxuXHJcbiAgICBjb25zdCBjc3ZDb250ZW50OiBzdHJpbmcgPSBbaGVhZGVycywgLi4ucm93c10ubWFwKHJvdyA9PlxyXG4gICAgICByb3cubWFwKChjZWxsOiBzdHJpbmcpID0+IGBcIiR7U3RyaW5nKGNlbGwpLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgKS5qb2luKCcsJylcclxuICAgICkuam9pbignXFxyXFxuJyk7XHJcblxyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZDb250ZW50XSwge3R5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04Oyd9KTtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgIGxpbmsuaHJlZiA9IHVybDtcclxuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsICdFeGNlbFNoZWV0Jyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuXHJcbiAgICAvLyB0aGlzLmV4Y2VsRXhwb3J0U2VydmljZS5leHBvcnRUb0V4Y2VsKFxyXG4gICAgLy8gICB0aGlzLmRhdGEsXHJcbiAgICAvLyAgIGNvbHVtbnMsXHJcbiAgICAvLyAgICdFeGNlbFNoZWV0JyxcclxuICAgIC8vICAgJ1NoZWV0MSdcclxuICAgIC8vICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ29Ub1ByZXZpb3VzUGFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgLT0gMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnb1RvTmV4dFBhZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlICs9IDE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q3VycmVudFBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNOZXdSb3coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbmV3Um93O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyU2VsZWN0ZWRPclJldHVybkFsbChpdGVtczogYW55KSB7XHJcbiAgICBjb25zdCBoYXNTZWxlY3RlZFRydWU6IGJvb2xlYW4gPSBpdGVtcy5zb21lKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCA9PT0gdHJ1ZSk7XHJcbiAgICByZXR1cm4gaGFzU2VsZWN0ZWRUcnVlID8gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCA9PT0gdHJ1ZSkgOiBpdGVtcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlRGF0YVJvdyhyb3c6IGFueSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdywgaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzZXREYmxDbGljaygpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9kb3VibGVDbGlja2VkID0gZmFsc2U7XHJcbiAgICB9LCA1MDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gbmV4dDsgTW92ZSB0byBuZXh0IG9yIHByZXZpb3VzIGNlbGxcclxuICAgKiBAcGFyYW0gc3RhcnQ7IFN0YXJ0IGZyb20gY2VsbGluZGV4XHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdChuZXh0OiBib29sZWFuLCBzdGFydDogbnVtYmVyID0gLTEpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBudW1FZGl0YWJsZUNvbHVtbnM6IG51bWJlciA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiAhYy5yZWFkb25seSkubGVuZ3RoO1xyXG4gICAgICBjb25zdCB3YW50ZWRJbmRleCA9IHN0YXJ0ICsgKG5leHQgPyAxIDogLTEpO1xyXG4gICAgICBpZiAod2FudGVkSW5kZXggPj0gbnVtRWRpdGFibGVDb2x1bW5zKSB7XHJcbiAgICAgICAgdGhpcy5fZ2V0TmV4dEVkaXRSb3dJbmRleCgpXHJcbiAgICAgICAgICAudGhlbigoaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSb3dJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMuX2dldE5leHRFZGl0Q2VsbEluZGV4KDApKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmICh3YW50ZWRJbmRleCA8IDApIHtcclxuICAgICAgICB0aGlzLl9nZXRQcmV2aW91c0VkaXRSb3dJbmRleCgpXHJcbiAgICAgICAgICAudGhlbigoaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSb3dJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMuX2dldFByZXZpb3VzRWRpdENlbGxJbmRleCh0aGlzLmNvbHVtbnMubGVuZ3RoIC0gMSkpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUobmV4dCA/IHRoaXMuX2dldE5leHRFZGl0Q2VsbEluZGV4KHN0YXJ0ICsgMSkgOiB0aGlzLl9nZXRQcmV2aW91c0VkaXRDZWxsSW5kZXgoc3RhcnQgLSAxKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0TmV4dEVkaXRDZWxsSW5kZXgoc3RhcnQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBzdGFydDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIXRoaXMuY29sdW1uc1tpXS5yZWFkb25seSkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQcmV2aW91c0VkaXRDZWxsSW5kZXgoc3RhcnQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgaWYgKCF0aGlzLmNvbHVtbnNbaV0ucmVhZG9ubHkpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0TmV4dEVkaXRSb3dJbmRleCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBsZXQgbmV3Um93SW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICAgIGlmICh0aGlzLmVkaXRSb3dJbmRleCArIDEgPj0gdGhpcy5kYXRhLmxlbmd0aCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9BZGRSb3cpIHtcclxuICAgICAgICAgIHRoaXMuYWRkTmV3Um93KCk7XHJcbiAgICAgICAgICBuZXdSb3dJbmRleCA9IHRoaXMuZWRpdFJvd0luZGV4O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdSb3dJbmRleCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld1Jvd0luZGV4ID0gdGhpcy5lZGl0Um93SW5kZXggKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdSb3dJbmRleCAhPT0gdGhpcy5lZGl0Um93SW5kZXgpIHsgLy8gZ28gdG8gZGlmZmVyZW50IHJvdyB2YWxpZGF0ZSBjdXJyZW50IG9uZSBmaXJzdFxyXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlQW5kU2F2ZShmYWxzZSkpIHtcclxuICAgICAgICAgIHRoaXMucm93VG9FZGl0ID0gdGhpcy5kYXRhW25ld1Jvd0luZGV4XTtcclxuICAgICAgICAgIHJlc29sdmUobmV3Um93SW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShuZXdSb3dJbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNFZGl0Um93SW5kZXgoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcclxuICAgICAgbGV0IG5ld1Jvd0luZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAodGhpcy5lZGl0Um93SW5kZXggLSAxIDwgMCkge1xyXG4gICAgICAgIG5ld1Jvd0luZGV4ID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV3Um93SW5kZXggPSB0aGlzLmVkaXRSb3dJbmRleCAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1Jvd0luZGV4ICE9PSB0aGlzLmVkaXRSb3dJbmRleCkgeyAvLyBnbyB0byBkaWZmZXJlbnQgcm93IHZhbGlkYXRlIGN1cnJlbnQgb25lIGZpcnN0XHJcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVBbmRTYXZlKGZhbHNlKSkge1xyXG4gICAgICAgICAgdGhpcy5yb3dUb0VkaXQgPSB0aGlzLmRhdGFbbmV3Um93SW5kZXhdO1xyXG4gICAgICAgICAgcmVzb2x2ZShuZXdSb3dJbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKG5ld1Jvd0luZGV4KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zYXZlUm93KHN0b3BlZGl0aW5nOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX25ld1Jvdykge1xyXG4gICAgICB0aGlzLnNhdmVSb3cubmV4dCh0aGlzLl9uZXdSb3dSZWZlcmVuY2UpO1xyXG4gICAgICB0aGlzLl9uZXdSb3dSZWZlcmVuY2UgPSBudWxsOyAvLyBjbGVhclxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSAtMTsgLy8gZXhpc3Rpbmcgcm93XHJcblxyXG4gICAgICBpZiAodGhpcy5yb3dzUGVyUGFnZSkge1xyXG4gICAgICAgIGluZGV4ID0gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucm93c1BlclBhZ2UgKyB0aGlzLmVkaXRSb3dJbmRleDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbmRleCA9IHRoaXMuZWRpdFJvd0luZGV4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnNhdmVSb3cubmV4dCh0aGlzLmRhdGFbaW5kZXhdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xyXG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9uZXdSb3cgPSBmYWxzZTtcclxuICAgIGlmIChzdG9wZWRpdGluZykge1xyXG4gICAgICB0aGlzLl9yZXNldEVkaXQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RldGVjdENoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXNldEVkaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXdSb3cgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xyXG4gICAgdGhpcy5lZGl0Um93SW5kZXggPSAtMTtcclxuICAgIHRoaXMuZWRpdENlbGxJbmRleCA9IC0xO1xyXG4gICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnJvd1RvRWRpdCA9IHVuZGVmaW5lZDtcclxuICB9XHJcbn1cclxuIl19