UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

324 lines 41.4 kB
import { __decorate, __metadata, __param } from "tslib"; import { ChangeDetectorRef, Component, HostBinding, Input, Optional, ViewChild, Inject, TemplateRef } from '@angular/core'; import { DisplayDensityToken, DisplayDensityBase } from '../../core/displayDensity'; import { CsvFileTypes, IgxBaseExporter, IgxCsvExporterOptions, IgxCsvExporterService, IgxExcelExporterOptions, IgxExcelExporterService, AbsoluteScrollStrategy } from '../../services/index'; import { GridBaseAPIService } from '../api.service'; import { IgxButtonDirective } from '../../directives/button/button.directive'; import { IgxDropDownComponent } from '../../drop-down/drop-down.component'; import { IgxColumnHidingComponent } from '../hiding/column-hiding.component'; import { IgxColumnPinningComponent } from '../pinning/column-pinning.component'; import { HorizontalAlignment, VerticalAlignment } from '../../services/overlay/utilities'; import { ConnectedPositioningStrategy } from '../../services/overlay/position'; /** * This class encapsulates the Toolbar's logic and is internally used by * the `IgxGridComponent`, `IgxTreeGridComponent` and `IgxHierarchicalGridComponent`. */ let IgxGridToolbarComponent = class IgxGridToolbarComponent extends DisplayDensityBase { constructor(gridAPI, cdr, excelExporter, csvExporter, _displayDensityOptions) { super(_displayDensityOptions); this.gridAPI = gridAPI; this.cdr = cdr; this.excelExporter = excelExporter; this.csvExporter = csvExporter; this._displayDensityOptions = _displayDensityOptions; this._filterColumnsPrompt = 'Filter columns list ...'; this._positionSettings = { horizontalDirection: HorizontalAlignment.Left, horizontalStartPoint: HorizontalAlignment.Right, verticalDirection: VerticalAlignment.Bottom, verticalStartPoint: VerticalAlignment.Bottom }; this._overlaySettings = { positionStrategy: new ConnectedPositioningStrategy(this._positionSettings), scrollStrategy: new AbsoluteScrollStrategy(), modal: false, closeOnOutsideClick: true, excludePositionTarget: true }; } /** * Gets the default text shown in the filtering box. * ```typescript * const filterPrompt = this.grid.toolbar.filterColumnsPrompt; * ``` */ get filterColumnsPrompt() { return this._filterColumnsPrompt; } /** * Sets the default text shown in the filtering box. * ```typescript * this.grid.toolbar.filterColumnsPrompt('Filter columns ...'); * ``` */ set filterColumnsPrompt(value) { this._filterColumnsPrompt = value; } /** * Gets the height for the `IgxGridToolbarComponent`'s drop down panels. * ```typescript * const dropdownHeight = this.grid.toolbar.defaultDropDownsMaxHeight; * ``` */ get defaultDropDownsMaxHeight() { const gridHeight = this.grid.calcHeight; return (gridHeight) ? gridHeight * 0.7 + 'px' : '100%'; } /** * Returns a reference to the `IgxGridComponent` component, hosting the `IgxGridToolbarComponent`. * ```typescript * const grid = this.igxGrid1.toolbar.grid; * ``` */ get grid() { return this.gridAPI.grid; } /** * Returns whether the `IgxGridComponent` renders an export button. * ```typescript * const exportButton = this.igxGrid1.toolbar.shouldShowExportButton; * ``` */ get shouldShowExportButton() { return (this.grid != null && (this.grid.exportExcel || this.grid.exportCsv)); } /** * Returns whether the `IgxGridComponent` renders an Excel export button. * ```typescript * const exportExcelButton = this.igxGrid1.toolbar.shouldShowExportExcelButton; * ``` */ get shouldShowExportExcelButton() { return (this.grid != null && this.grid.exportExcel); } /** * Returns whether the `IgxGridComponent` renders an CSV export button. * ```typescript * const exportCSVButton = this.igxGrid1.toolbar.shouldShowExportCsvButton; * ``` */ get shouldShowExportCsvButton() { return (this.grid != null && this.grid.exportCsv); } /** * Returns how many columns are pinned. * ```typescript * const pinnedCount = this.igxGrid1.toolbar.pinnedColumnsCount; * ``` */ get pinnedColumnsCount() { return this.grid.pinnedColumns.filter(col => !col.columnLayout).length; } /** * Returns the theme of the `IgxGridToolbarComponent`. * ```typescript * const toolbarTheme = this.grid.toolbar.hostClass; * ``` */ get hostClass() { return this.getComponentDensityClass('igx-grid-toolbar'); } /** * Returns the title of `IgxGridToolbarComponent`. * ```typescript * const toolbarTitle = this.igxGrid1.toolbar.getTitle(); * ``` */ getTitle() { return this.grid != null ? this.grid.toolbarTitle : ''; } /** * Returns the text of the export button of the `IgxGridToolbarComponent`. * ```typescript * const toolbarExportText = this.igxGrid1.toolbar.getTitle(); * ``` */ getExportText() { return this.grid != null ? this.grid.exportText : ''; } /** * Returns the text of the Excel export button of the `IgxGridToolbarComponent`. * ```typescript * const toolbarExcelText = this.igxGrid1.toolbar.getExportExcelText(); * ``` */ getExportExcelText() { return this.grid != null ? this.grid.exportExcelText : ''; } /** * Returns the text of the CSV export button of the `IgxGridToolbarComponent`. * ```typescript * const toolbarCSVText = this.igxGrid1.toolbar.getExportCsvText(); * ``` */ getExportCsvText() { return this.grid != null ? this.grid.exportCsvText : ''; } /** * Toggles the export button's dropdown menu. * ```typescript * this.igxGrid1.toolbar.exportClicked(); * ``` */ exportClicked() { this._overlaySettings.positionStrategy.settings.target = this.exportButton.nativeElement; this._overlaySettings.outlet = this.grid.outletDirective; this.exportDropdown.toggle(this._overlaySettings); } /** * Exports the grid to excel. * ```typescript * this.igxGrid1.toolbar.exportToExcelClicked(); * ``` */ exportToExcelClicked() { this.performExport(this.excelExporter, 'excel'); } /** * Exports the grid to CSV. * ```typescript * this.igxGrid1.toolbar.exportToCsvClicked(); * ``` */ exportToCsvClicked() { this.performExport(this.csvExporter, 'csv'); } performExport(exp, exportType) { this.exportClicked(); const fileName = 'ExportedData'; const options = exportType === 'excel' ? new IgxExcelExporterOptions(fileName) : new IgxCsvExporterOptions(fileName, CsvFileTypes.CSV); const args = { grid: this.grid, exporter: exp, options: options, cancel: false }; this.grid.onToolbarExporting.emit(args); if (args.cancel) { return; } exp.export(this.grid, options); } /** * Toggles the Column Hiding UI. * ```typescript * this.grid1.toolbar.toggleColumnHidingUI(); * ``` */ toggleColumnHidingUI() { this._overlaySettings.positionStrategy.settings.target = this.columnHidingButton.nativeElement; this._overlaySettings.outlet = this.grid.outletDirective; this.columnHidingDropdown.toggle(this._overlaySettings); } /** * Toggles the Column Pinning UI. * ```typescript * this.grid1.toolbar.toggleColumnPinningUI(); * ``` */ toggleColumnPinningUI() { this._overlaySettings.positionStrategy.settings.target = this.columnPinningButton.nativeElement; this._overlaySettings.outlet = this.grid.outletDirective; this.columnPinningDropdown.toggle(this._overlaySettings); } /** * @hidden @internal */ showAdvancedFilteringUI() { this.grid.openAdvancedFilteringDialog(); } /** * Returns the `context` object which represents the `template context` binding into the * `toolbar custom container` by providing references to the parent IgxGird and the toolbar itself. * ```typescript * const context = this.igxGrid.toolbar.context; * ``` */ get context() { return { // $implicit: this grid: this.grid, toolbar: this }; } /** @hidden */ get customContentTemplate() { if (this.grid != null && this.grid.toolbarCustomContentTemplate != null) { return this.grid.toolbarCustomContentTemplate.template; } else { return null; } } }; IgxGridToolbarComponent.ctorParameters = () => [ { type: GridBaseAPIService }, { type: ChangeDetectorRef }, { type: IgxExcelExporterService, decorators: [{ type: Optional }] }, { type: IgxCsvExporterService, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] } ]; __decorate([ HostBinding('class.igx-grid-toolbar'), Input(), __metadata("design:type", String) ], IgxGridToolbarComponent.prototype, "gridID", void 0); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], IgxGridToolbarComponent.prototype, "filterColumnsPrompt", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxGridToolbarComponent.prototype, "defaultDropDownsMaxHeight", null); __decorate([ ViewChild('columnHidingDropdown', { read: IgxDropDownComponent }), __metadata("design:type", IgxDropDownComponent) ], IgxGridToolbarComponent.prototype, "columnHidingDropdown", void 0); __decorate([ ViewChild(IgxColumnHidingComponent), __metadata("design:type", IgxColumnHidingComponent) ], IgxGridToolbarComponent.prototype, "columnHidingUI", void 0); __decorate([ ViewChild('columnHidingButton', { read: IgxButtonDirective }), __metadata("design:type", IgxButtonDirective) ], IgxGridToolbarComponent.prototype, "columnHidingButton", void 0); __decorate([ ViewChild('exportDropdown', { read: IgxDropDownComponent }), __metadata("design:type", IgxDropDownComponent) ], IgxGridToolbarComponent.prototype, "exportDropdown", void 0); __decorate([ ViewChild('btnExport', { read: IgxButtonDirective }), __metadata("design:type", IgxButtonDirective) ], IgxGridToolbarComponent.prototype, "exportButton", void 0); __decorate([ ViewChild('columnPinningDropdown', { read: IgxDropDownComponent }), __metadata("design:type", IgxDropDownComponent) ], IgxGridToolbarComponent.prototype, "columnPinningDropdown", void 0); __decorate([ ViewChild(IgxColumnPinningComponent), __metadata("design:type", IgxColumnPinningComponent) ], IgxGridToolbarComponent.prototype, "columnPinningUI", void 0); __decorate([ ViewChild('columnPinningButton', { read: IgxButtonDirective }), __metadata("design:type", IgxButtonDirective) ], IgxGridToolbarComponent.prototype, "columnPinningButton", void 0); __decorate([ HostBinding('attr.class'), __metadata("design:type", String), __metadata("design:paramtypes", []) ], IgxGridToolbarComponent.prototype, "hostClass", null); IgxGridToolbarComponent = __decorate([ Component({ selector: 'igx-grid-toolbar', template: "<span class=\"igx-grid-toolbar__title\" *ngIf=\"getTitle()\">\n {{ getTitle() }}\n</span>\n\n<div class=\"igx-grid-toolbar__custom-content\" *ngIf=\"customContentTemplate != null\">\n <ng-container *ngTemplateOutlet=\"customContentTemplate; context: context\">\n </ng-container>\n</div>\n\n<div class=\"igx-grid-toolbar__actions\">\n <div *ngIf=\"grid.allowAdvancedFiltering\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" #advancedFilteringButton name=\"btnAdvancedFiltering\" igxRipple\n (click)=\"showAdvancedFilteringUI()\"\n [ngClass]=\"grid.advancedFilteringExpressionsTree ? 'igx-grid-toolbar__adv-filter--filtered' : 'igx-grid-toolbar__adv-filter'\">\n <div class=\"igx-grid-toolbar__button-space\">\n <igx-icon>\n filter_list\n </igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_title}}</span>\n </div>\n </button>\n </div>\n\n <div *ngIf=\"grid.columnHiding\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" #columnHidingButton name=\"btnColumnHiding\" igxRipple\n (click)=\"toggleColumnHidingUI()\">\n <div class=\"igx-grid-toolbar__button-space\">\n <igx-icon *ngIf=\"grid.hiddenColumnsCount > 0\">visibility_off</igx-icon>\n <igx-icon *ngIf=\"grid.hiddenColumnsCount === 0\">visibility</igx-icon>\n <span>{{ grid.hiddenColumnsCount }}</span>\n <span>{{ grid.hiddenColumnsText }}</span>\n </div>\n </button>\n <igx-drop-down #columnHidingDropdown>\n <igx-column-hiding\n [columns]=\"grid.columns\"\n [title]=\"grid.columnHidingTitle\"\n [filterColumnsPrompt]=\"filterColumnsPrompt\"\n [columnsAreaMaxHeight]=\"defaultDropDownsMaxHeight\"\n (onColumnVisibilityChanged)=\"grid.toggleColumnVisibility($event)\">\n </igx-column-hiding>\n </igx-drop-down>\n </div>\n <div *ngIf=\"grid.columnPinning\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" #columnPinningButton name=\"btnColumnPinning\" igxRipple\n (click)=\"toggleColumnPinningUI()\">\n <div class=\"igx-grid-toolbar__button-space\">\n <igx-icon *ngIf=\"pinnedColumnsCount > 0\">lock</igx-icon>\n <igx-icon *ngIf=\"pinnedColumnsCount === 0\">lock_open</igx-icon>\n <span>{{ pinnedColumnsCount }}</span>\n <span>{{ grid.pinnedColumnsText }}</span>\n <span></span>\n </div>\n </button>\n <igx-drop-down #columnPinningDropdown>\n <igx-column-pinning\n [columns]=\"grid.columns\"\n [title]=\"grid.columnPinningTitle\"\n [filterColumnsPrompt]=\"filterColumnsPrompt\"\n [columnsAreaMaxHeight]=\"defaultDropDownsMaxHeight\"></igx-column-pinning>\n </igx-drop-down>\n </div>\n\n <div class=\"igx-grid-toolbar__dropdown\" *ngIf=\"shouldShowExportButton\" id=\"btnExport\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" igxRipple #btnExport\n (click)=\"exportClicked()\">\n <span class=\"igx-grid-toolbar__button-space\">\n <igx-icon fontSet=\"material\">import_export</igx-icon>\n <span>{{ getExportText() }}</span>\n <igx-icon fontSet=\"material\">arrow_drop_down</igx-icon>\n </span>\n </button>\n\n <igx-drop-down #exportDropdown>\n <ul class=\"igx-grid-toolbar__dd-list\">\n <li class=\"igx-grid-toolbar__dd-list-items\" igxRipple *ngIf=\"shouldShowExportExcelButton\" id=\"btnExportExcel\"\n (click)=\"exportToExcelClicked()\">{{ getExportExcelText() }}</li>\n <li class=\"igx-grid-toolbar__dd-list-items\" igxRipple *ngIf=\"shouldShowExportCsvButton\" id=\"btnExportCsv\"\n (click)=\"exportToCsvClicked()\">{{ getExportCsvText() }}</li>\n </ul>\n </igx-drop-down>\n </div>\n</div>\n" }), __param(2, Optional()), __param(3, Optional()), __param(4, Optional()), __param(4, Inject(DisplayDensityToken)), __metadata("design:paramtypes", [GridBaseAPIService, ChangeDetectorRef, IgxExcelExporterService, IgxCsvExporterService, Object]) ], IgxGridToolbarComponent); export { IgxGridToolbarComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvdG9vbGJhci9ncmlkLXRvb2xiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsTUFBTSxFQUNOLFdBQVcsRUFDZCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQTBCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUcsT0FBTyxFQUNILFlBQVksRUFDWixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN6QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hGLE9BQU8sRUFBcUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3SCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRTs7O0dBR0c7QUFLSCxJQUFhLHVCQUF1QixHQUFwQyxNQUFhLHVCQUF3QixTQUFRLGtCQUFrQjtJQWlMM0QsWUFBbUIsT0FBNEQsRUFDcEUsR0FBc0IsRUFDVixhQUFzQyxFQUN0QyxXQUFrQyxF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QUF3QjsrREFBQztBQVNoRDtJQURDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzhCQUNuQyxrQkFBa0I7bUVBQUM7QUFTOUM7SUFEQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzs4QkFDckMsb0JBQW9COytEQUFDO0FBUzVDO0lBREMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzhCQUNoQyxrQkFBa0I7NkRBQUM7QUFTeEM7SUFEQyxTQUFTLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzs4QkFDckMsb0JBQW9CO3NFQUFDO0FBU25EO0lBREMsU0FBUyxDQUFDLHlCQUF5QixDQUFDOzhCQUNiLHlCQUF5QjtnRUFBQztBQVNsRDtJQURDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzhCQUNuQyxrQkFBa0I7b0VBQUM7QUE0RC9DO0lBREMsV0FBVyxDQUFDLFlBQVksQ0FBQzs7O3dEQUd6QjtBQS9LUSx1QkFBdUI7SUFKbkMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGtCQUFrQjtRQUM1Qix3cUlBQTRDO0tBQy9DLENBQUM7SUFvTE8sV0FBQSxRQUFRLEVBQUUsQ0FBQTtJQUNWLFdBQUEsUUFBUSxFQUFFLENBQUE7SUFDVixXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtxQ0FKaEIsa0JBQWtCO1FBQzlCLGlCQUFpQjtRQUNLLHVCQUF1QjtRQUN6QixxQkFBcUI7R0FwTGhELHVCQUF1QixDQXVWbkM7U0F2VlksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT3B0aW9uYWwsXG4gICAgVmlld0NoaWxkLFxuICAgIEluamVjdCxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSURpc3BsYXlEZW5zaXR5T3B0aW9ucywgRGlzcGxheURlbnNpdHlUb2tlbiwgRGlzcGxheURlbnNpdHlCYXNlIH0gZnJvbSAnLi4vLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQge1xuICAgIENzdkZpbGVUeXBlcyxcbiAgICBJZ3hCYXNlRXhwb3J0ZXIsXG4gICAgSWd4Q3N2RXhwb3J0ZXJPcHRpb25zLFxuICAgIElneENzdkV4cG9ydGVyU2VydmljZSxcbiAgICBJZ3hFeGNlbEV4cG9ydGVyT3B0aW9ucyxcbiAgICBJZ3hFeGNlbEV4cG9ydGVyU2VydmljZSxcbiAgICBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5XG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2luZGV4JztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneERyb3BEb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZHJvcC1kb3duL2Ryb3AtZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29sdW1uSGlkaW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vaGlkaW5nL2NvbHVtbi1oaWRpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtblBpbm5pbmdDb21wb25lbnQgfSBmcm9tICcuLi9waW5uaW5nL2NvbHVtbi1waW5uaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3MsIEhvcml6b250YWxBbGlnbm1lbnQsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24nO1xuaW1wb3J0IHsgR3JpZFR5cGUgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBUb29sYmFyJ3MgbG9naWMgYW5kIGlzIGludGVybmFsbHkgdXNlZCBieVxuICogdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCwgYElneFRyZWVHcmlkQ29tcG9uZW50YCBhbmQgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1ncmlkLXRvb2xiYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncmlkLXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneEdyaWRUb29sYmFyQ29tcG9uZW50IGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10b29sYmFyJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkSUQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdGV4dCBzaG93biBpbiB0aGUgZmlsdGVyaW5nIGJveC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlsdGVyUHJvbXB0ID0gdGhpcy5ncmlkLnRvb2xiYXIuZmlsdGVyQ29sdW1uc1Byb21wdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyQ29sdW1uc1Byb21wdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbHVtbnNQcm9tcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGVmYXVsdCB0ZXh0IHNob3duIGluIHRoZSBmaWx0ZXJpbmcgYm94LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudG9vbGJhci5maWx0ZXJDb2x1bW5zUHJvbXB0KCdGaWx0ZXIgY29sdW1ucyAuLi4nKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGZpbHRlckNvbHVtbnNQcm9tcHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zUHJvbXB0ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uc1Byb21wdCA9ICdGaWx0ZXIgY29sdW1ucyBsaXN0IC4uLic7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoZWlnaHQgZm9yIHRoZSBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgJ3MgZHJvcCBkb3duIHBhbmVscy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZHJvcGRvd25IZWlnaHQgPSB0aGlzLmdyaWQudG9vbGJhci5kZWZhdWx0RHJvcERvd25zTWF4SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRlZmF1bHREcm9wRG93bnNNYXhIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRIZWlnaHQgPSB0aGlzLmdyaWQuY2FsY0hlaWdodDtcbiAgICAgICAgcmV0dXJuIChncmlkSGVpZ2h0KSA/IGdyaWRIZWlnaHQgKiAwLjcgKyAncHgnIDogJzEwMCUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4RHJvcERvd25Db21wb25lbnRgIG9mIHRoZSBDb2x1bW4gSGlkaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBkcm9wZG93bkhpZGluZyA9IHRoaXMuZ3JpZC50b29sYmFyLmNvbHVtbkhpZGluZ0Ryb3Bkb3duO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkhpZGluZ0Ryb3Bkb3duJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBjb2x1bW5IaWRpbmdEcm9wZG93bjogSWd4RHJvcERvd25Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgYElneENvbHVtbkhpZGluZ0NvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGhpZGluZ1VJID0gdGhpcy5ncmlkLnRvb2xiYXIuY29sdW1uSGlkaW5nVUk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hDb2x1bW5IaWRpbmdDb21wb25lbnQpXG4gICAgcHVibGljIGNvbHVtbkhpZGluZ1VJOiBJZ3hDb2x1bW5IaWRpbmdDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgQ29sdW1uIEhpZGluZyBidXR0b24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGhpZGluZ0J1dHRvbiA9IHRoaXMuZ3JpZC50b29sYmFyLmNvbHVtbkhpZGluZ0J1dHRvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdjb2x1bW5IaWRpbmdCdXR0b24nLCB7IHJlYWQ6IElneEJ1dHRvbkRpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyBjb2x1bW5IaWRpbmdCdXR0b246IElneEJ1dHRvbkRpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4RHJvcERvd25Db21wb25lbnRgIG9mIHRoZSBFeHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnREcm9wZG93biA9IHRoaXMuZ3JpZC50b29sYmFyLmV4cG9ydERyb3Bkb3duO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2V4cG9ydERyb3Bkb3duJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBleHBvcnREcm9wZG93bjogSWd4RHJvcERvd25Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgRXhwb3J0IGJ1dHRvbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZXhwb3J0QnRuID0gdGhpcy5ncmlkLnRvb2xiYXIuZXhwb3J0QnV0dG9uO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2J0bkV4cG9ydCcsIHsgcmVhZDogSWd4QnV0dG9uRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIGV4cG9ydEJ1dHRvbjogSWd4QnV0dG9uRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIGBJZ3hEcm9wRG93bkNvbXBvbmVudGAgb2YgdGhlIENvbHVtbiBQaW5uaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBkcm9wZG93blBpbm5pbmcgPSB0aGlzLmdyaWQudG9vbGJhci5jb2x1bW5QaW5uaW5nRHJvcGRvd247XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY29sdW1uUGlubmluZ0Ryb3Bkb3duJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBjb2x1bW5QaW5uaW5nRHJvcGRvd246IElneERyb3BEb3duQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIGBJZ3hDb2x1bW5QaW5uaW5nQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmluZ1VJID0gdGhpcy5ncmlkLnRvb2xiYXIuY29sdW1uUGlubmluZ0Ryb3Bkb3duO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4Q29sdW1uUGlubmluZ0NvbXBvbmVudClcbiAgICBwdWJsaWMgY29sdW1uUGlubmluZ1VJOiBJZ3hDb2x1bW5QaW5uaW5nQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIENvbHVtbiBQaW5uaW5nIGJ1dHRvbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmluZ0J1dHRvbiA9IHRoaXMuZ3JpZC50b29sYmFyLmNvbHVtblBpbm5pbmdCdXR0b247XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY29sdW1uUGlubmluZ0J1dHRvbicsIHsgcmVhZDogSWd4QnV0dG9uRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIGNvbHVtblBpbm5pbmdCdXR0b246IElneEJ1dHRvbkRpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBjb21wb25lbnQsIGhvc3RpbmcgdGhlIGBJZ3hHcmlkVG9vbGJhckNvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyaWQgPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuZ3JpZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdyaWQoKTogSWd4R3JpZEJhc2VEaXJlY3RpdmUge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdyaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgcmVuZGVycyBhbiBleHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnRCdXR0b24gPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuc2hvdWxkU2hvd0V4cG9ydEJ1dHRvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFNob3dFeHBvcnRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5ncmlkICE9IG51bGwgJiYgKHRoaXMuZ3JpZC5leHBvcnRFeGNlbCB8fCB0aGlzLmdyaWQuZXhwb3J0Q3N2KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgcmVuZGVycyBhbiBFeGNlbCBleHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnRFeGNlbEJ1dHRvbiA9IHRoaXMuaWd4R3JpZDEudG9vbGJhci5zaG91bGRTaG93RXhwb3J0RXhjZWxCdXR0b247XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG91bGRTaG93RXhwb3J0RXhjZWxCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5ncmlkICE9IG51bGwgJiYgdGhpcy5ncmlkLmV4cG9ydEV4Y2VsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCByZW5kZXJzIGFuIENTViBleHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnRDU1ZCdXR0b24gPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuc2hvdWxkU2hvd0V4cG9ydENzdkJ1dHRvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFNob3dFeHBvcnRDc3ZCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5ncmlkICE9IG51bGwgJiYgdGhpcy5ncmlkLmV4cG9ydENzdik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBob3cgbWFueSBjb2x1bW5zIGFyZSBwaW5uZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZENvdW50ID0gdGhpcy5pZ3hHcmlkMS50b29sYmFyLnBpbm5lZENvbHVtbnNDb3VudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5MYXlvdXQpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0aGVtZSBvZiB0aGUgYElneEdyaWRUb29sYmFyQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG9vbGJhclRoZW1lID0gdGhpcy5ncmlkLnRvb2xiYXIuaG9zdENsYXNzO1xuICAgICAqIGBgYFxuICAgICAqL1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmNsYXNzJylcbiAgICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudERlbnNpdHlDbGFzcygnaWd4LWdyaWQtdG9vbGJhcicpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4sXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgZXhjZWxFeHBvcnRlcjogSWd4RXhjZWxFeHBvcnRlclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjc3ZFeHBvcnRlcjogSWd4Q3N2RXhwb3J0ZXJTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByb3RlY3RlZCBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9vdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIGV4Y2x1ZGVQb3NpdGlvblRhcmdldDogdHJ1ZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBvZiBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b29sYmFyVGl0bGUgPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuZ2V0VGl0bGUoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLnRvb2xiYXJUaXRsZSA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGV4cG9ydCBidXR0b24gb2YgdGhlIGBJZ3hHcmlkVG9vbGJhckNvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRvb2xiYXJFeHBvcnRUZXh0ID0gdGhpcy5pZ3hHcmlkMS50b29sYmFyLmdldFRpdGxlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cG9ydFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLmV4cG9ydFRleHQgOiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBFeGNlbCBleHBvcnQgYnV0dG9uIG9mIHRoZSBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b29sYmFyRXhjZWxUZXh0ID0gdGhpcy5pZ3hHcmlkMS50b29sYmFyLmdldEV4cG9ydEV4Y2VsVGV4dCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFeHBvcnRFeGNlbFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLmV4cG9ydEV4Y2VsVGV4dCA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIENTViBleHBvcnQgYnV0dG9uIG9mIHRoZSBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b29sYmFyQ1NWVGV4dCA9IHRoaXMuaWd4R3JpZDEudG9vbGJhci5nZXRFeHBvcnRDc3ZUZXh0KCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cG9ydENzdlRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLmV4cG9ydENzdlRleHQgOiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBleHBvcnQgYnV0dG9uJ3MgZHJvcGRvd24gbWVudS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hHcmlkMS50b29sYmFyLmV4cG9ydENsaWNrZWQoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwb3J0Q2xpY2tlZCgpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5leHBvcnRCdXR0b24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMuZ3JpZC5vdXRsZXREaXJlY3RpdmU7XG4gICAgICAgIHRoaXMuZXhwb3J0RHJvcGRvd24udG9nZ2xlKHRoaXMuX292ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3J0cyB0aGUgZ3JpZCB0byBleGNlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hHcmlkMS50b29sYmFyLmV4cG9ydFRvRXhjZWxDbGlja2VkKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cG9ydFRvRXhjZWxDbGlja2VkKCkge1xuICAgICAgICB0aGlzLnBlcmZvcm1FeHBvcnQodGhpcy5leGNlbEV4cG9ydGVyLCAnZXhjZWwnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBvcnRzIHRoZSBncmlkIHRvIENTVi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hHcmlkMS50b29sYmFyLmV4cG9ydFRvQ3N2Q2xpY2tlZCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBvcnRUb0NzdkNsaWNrZWQoKSB7XG4gICAgICAgIHRoaXMucGVyZm9ybUV4cG9ydCh0aGlzLmNzdkV4cG9ydGVyLCAnY3N2Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwZXJmb3JtRXhwb3J0KGV4cDogSWd4QmFzZUV4cG9ydGVyLCBleHBvcnRUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5leHBvcnRDbGlja2VkKCk7XG5cbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSAnRXhwb3J0ZWREYXRhJztcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV4cG9ydFR5cGUgPT09ICdleGNlbCcgP1xuICAgICAgICAgICAgbmV3IElneEV4Y2VsRXhwb3J0ZXJPcHRpb25zKGZpbGVOYW1lKSA6XG4gICAgICAgICAgICBuZXcgSWd4Q3N2RXhwb3J0ZXJPcHRpb25zKGZpbGVOYW1lLCBDc3ZGaWxlVHlwZXMuQ1NWKTtcblxuICAgICAgICBjb25zdCBhcmdzID0geyBncmlkOiB0aGlzLmdyaWQsIGV4cG9ydGVyOiBleHAsIG9wdGlvbnM6IG9wdGlvbnMsIGNhbmNlbDogZmFsc2UgfTtcblxuICAgICAgICB0aGlzLmdyaWQub25Ub29sYmFyRXhwb3J0aW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV4cC5leHBvcnQodGhpcy5ncmlkLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBDb2x1bW4gSGlkaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnRvb2xiYXIudG9nZ2xlQ29sdW1uSGlkaW5nVUkoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uSGlkaW5nVUkoKSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLnRhcmdldCA9IHRoaXMuY29sdW1uSGlkaW5nQnV0dG9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmdyaWQub3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLmNvbHVtbkhpZGluZ0Ryb3Bkb3duLnRvZ2dsZSh0aGlzLl9vdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIENvbHVtbiBQaW5uaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnRvb2xiYXIudG9nZ2xlQ29sdW1uUGlubmluZ1VJKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNvbHVtblBpbm5pbmdVSSgpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5jb2x1bW5QaW5uaW5nQnV0dG9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmdyaWQub3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLmNvbHVtblBpbm5pbmdEcm9wZG93bi50b2dnbGUodGhpcy5fb3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93QWR2YW5jZWRGaWx0ZXJpbmdVSSgpIHtcbiAgICAgICAgdGhpcy5ncmlkLm9wZW5BZHZhbmNlZEZpbHRlcmluZ0RpYWxvZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBjb250ZXh0YCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYHRlbXBsYXRlIGNvbnRleHRgIGJpbmRpbmcgaW50byB0aGVcbiAgICAgKiBgdG9vbGJhciBjdXN0b20gY29udGFpbmVyYCBieSBwcm92aWRpbmcgcmVmZXJlbmNlcyB0byB0aGUgcGFyZW50IElneEdpcmQgYW5kIHRoZSB0b29sYmFyIGl0c2VsZi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udGV4dCA9ICB0aGlzLmlneEdyaWQudG9vbGJhci5jb250ZXh0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLy8gJGltcGxpY2l0OiB0aGlzXG4gICAgICAgICAgICBncmlkOiB0aGlzLmdyaWQsXG4gICAgICAgICAgICB0b29sYmFyOiB0aGlzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGN1c3RvbUNvbnRlbnRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZCAhPSBudWxsICYmIHRoaXMuZ3JpZC50b29sYmFyQ3VzdG9tQ29udGVudFRlbXBsYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQudG9vbGJhckN1c3RvbUNvbnRlbnRUZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19