UNPKG

igniteui-angular

Version:

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

217 lines • 19.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, HostBinding, Input, ViewChild, QueryList, ViewChildren, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, HostListener } from '@angular/core'; import { IgxColumnComponent } from './column.component'; import { IgxFilteringService } from './filtering/grid-filtering.service'; import { GridBaseAPIService } from './api.service'; import { IgxColumnResizingService } from './grid-column-resizing.service'; import { IgxGridHeaderComponent } from './grid-header.component'; import { IgxGridFilteringCellComponent } from './filtering/grid-filtering-cell.component'; /** @type {?} */ const Z_INDEX = 9999; /** * @hidden */ export class IgxGridHeaderGroupComponent { /** * @param {?} cdr * @param {?} gridAPI * @param {?} element * @param {?} colResizingService * @param {?} filteringService */ constructor(cdr, gridAPI, element, colResizingService, filteringService) { this.cdr = cdr; this.gridAPI = gridAPI; this.element = element; this.colResizingService = colResizingService; this.filteringService = filteringService; } /** * Gets the width of the header group. * \@memberof IgxGridHeaderGroupComponent * @return {?} */ get width() { return this.grid.getHeaderGroupWidth(this.column); } /** * Gets the style classes of the header group. * \@memberof IgxGridHeaderGroupComponent * @return {?} */ get styleClasses() { /** @type {?} */ const defaultClasses = [ 'igx-grid__thead-item', this.column.headerGroupClasses ]; /** @type {?} */ const classList = { 'igx-grid__th--pinned': this.isPinned, 'igx-grid__th--pinned-last': this.isLastPinned, 'igx-grid__drag-col-header': this.isHeaderDragged, 'igx-grid__th--filtering': this.isFiltered }; Object.entries(classList).forEach(([className, value]) => { if (value) { defaultClasses.push(className); } }); return defaultClasses.join(' '); } /** * @hidden * @return {?} */ get zIndex() { if (!this.column.pinned) { return null; } return Z_INDEX - this.grid.pinnedColumns.indexOf(this.column); } /** * Gets the grid of the header group. * \@memberof IgxGridHeaderGroupComponent * @return {?} */ get grid() { return this.gridAPI.grid; } /** * Gets whether the header group belongs to a column that is filtered. * \@memberof IgxGridHeaderGroupComponent * @return {?} */ get isFiltered() { return this.filteringService.filteredColumn === this.column; } /** * Gets whether the header group is stored in the last column in the pinned area. * \@memberof IgxGridHeaderGroupComponent * @return {?} */ get isLastPinned() { return this.column.isLastPinned; } /** * Gets whether the header group is stored in a pinned column. * \@memberof IgxGridHeaderGroupComponent * @return {?} */ get isPinned() { return this.column.pinned; } /** * Gets whether the header group belongs to a column that is moved. * \@memberof IgxGridHeaderGroupComponent * @return {?} */ get isHeaderDragged() { return this.grid.draggedColumn === this.column; } /** * @hidden * @return {?} */ get hasLastPinnedChildColumn() { return this.column.allChildren.some(child => child.isLastPinned); } /** * @hidden * @return {?} */ get height() { return this.element.nativeElement.getBoundingClientRect().height; } /** * @hidden * @param {?} event * @return {?} */ onMouseDown(event) { // hack for preventing text selection in IE and Edge while dragging the resizer event.preventDefault(); } /** * @return {?} */ ngDoCheck() { this.cdr.markForCheck(); } } IgxGridHeaderGroupComponent.decorators = [ { type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-grid-header-group', template: "<ng-container *ngIf=\"column.columnGroup\">\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-left\"></span>\n <div class=\"igx-grid__thead-title\"\n [ngClass]=\"{'igx-grid__th--pinned-last': hasLastPinnedChildColumn}\"\n [igxColumnMovingDrag]=\"column\"\n [dragGhostHost]=\"grid.outletDirective.nativeElement\"\n [attr.droppable]=\"true\"\n [igxColumnMovingDrop]=\"column\">{{ column.header }}</div>\n <div class=\"igx-grid__thead-group\">\n <ng-container *ngFor=\"let child of column.children\">\n <igx-grid-header-group *ngIf=\"!child.hidden\" class=\"igx-grid__thead-subgroup\"\n [column]=\"child\"\n [gridID]=\"child.grid.id\"\n [style.min-width.px]=\"grid.getHeaderGroupWidth(child)\"\n [style.flex-basis.px]=\"grid.getHeaderGroupWidth(child)\">\n </igx-grid-header-group>\n </ng-container>\n </div>\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-right\"></span>\n</ng-container>\n\n<ng-container *ngIf=\"!column.columnGroup\">\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-left\"></span>\n <igx-grid-header [igxColumnMovingDrag]=\"column\" [dragGhostHost]=\"grid.igxFilteringOverlayOutlet\" [attr.droppable]=\"true\" [igxColumnMovingDrop]=\"column\" [gridID]=\"column.grid.id\" [column]=\"column\"></igx-grid-header>\n <igx-grid-filtering-cell *ngIf=\"grid.allowFiltering && grid.filterMode == 'quickFilter'\" [column]=\"column\" [attr.draggable]=\"false\"></igx-grid-filtering-cell>\n <span *ngIf=\"!column.columnGroup && column.resizable\" class=\"igx-grid__th-resize-handle\"\n [igxResizeHandle]=\"column\"\n [attr.draggable]=\"false\"\n [style.cursor]=\"colResizingService.resizeCursor\">\n </span>\n <span *ngIf=\"grid.hasMovableColumns\" class=\"igx-grid__th-drop-indicator-right\"></span>\n</ng-container>\n" }] } ]; /** @nocollapse */ IgxGridHeaderGroupComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: GridBaseAPIService }, { type: ElementRef }, { type: IgxColumnResizingService }, { type: IgxFilteringService } ]; IgxGridHeaderGroupComponent.propDecorators = { column: [{ type: Input }], gridID: [{ type: Input }], headerCell: [{ type: ViewChild, args: [IgxGridHeaderComponent,] }], filterCell: [{ type: ViewChild, args: [IgxGridFilteringCellComponent,] }], children: [{ type: ViewChildren, args: [forwardRef(() => IgxGridHeaderGroupComponent), { read: IgxGridHeaderGroupComponent },] }], width: [{ type: HostBinding, args: ['style.min-width',] }, { type: HostBinding, args: ['style.flex-basis',] }], styleClasses: [{ type: HostBinding, args: ['class',] }], zIndex: [{ type: HostBinding, args: ['style.z-index',] }], onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }] }; if (false) { /** * Gets the column of the header group. * \@memberof IgxGridHeaderGroupComponent * @type {?} */ IgxGridHeaderGroupComponent.prototype.column; /** * Gets the `id` of the grid in which the header group is stored. * \@memberof IgxGridHeaderGroupComponent * @type {?} */ IgxGridHeaderGroupComponent.prototype.gridID; /** * @hidden * @type {?} */ IgxGridHeaderGroupComponent.prototype.headerCell; /** * @hidden * @type {?} */ IgxGridHeaderGroupComponent.prototype.filterCell; /** * @hidden * @type {?} */ IgxGridHeaderGroupComponent.prototype.children; /** * @type {?} * @private */ IgxGridHeaderGroupComponent.prototype.cdr; /** @type {?} */ IgxGridHeaderGroupComponent.prototype.gridAPI; /** * @type {?} * @private */ IgxGridHeaderGroupComponent.prototype.element; /** @type {?} */ IgxGridHeaderGroupComponent.prototype.colResizingService; /** @type {?} */ IgxGridHeaderGroupComponent.prototype.filteringService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkLWhlYWRlci1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUVqQixVQUFVLEVBQ1YsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7TUFFcEYsT0FBTyxHQUFHLElBQUk7Ozs7QUFXcEIsTUFBTSxPQUFPLDJCQUEyQjs7Ozs7Ozs7SUFvSnBDLFlBQW9CLEdBQXNCLEVBQ3ZCLE9BQXFFLEVBQ3BFLE9BQW1CLEVBQ3BCLGtCQUE0QyxFQUM1QyxnQkFBcUM7UUFKcEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBOEQ7UUFDcEUsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNwQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTBCO1FBQzVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBcUI7SUFBSSxDQUFDOzs7Ozs7SUFsSDdELElBRUksS0FBSztRQUNMLE9BQU8sSUFB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QUMsRUFBRSxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRTtvQkFPakcsV0FBVyxTQUFDLGlCQUFpQixjQUM3QixXQUFXLFNBQUMsa0JBQWtCOzJCQVM5QixXQUFXLFNBQUMsT0FBTztxQkF5Qm5CLFdBQVcsU0FBQyxlQUFlOzBCQWlFM0IsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7SUFwSXJDLDZDQUNrQzs7Ozs7O0lBTWxDLDZDQUNzQjs7Ozs7SUFLdEIsaURBQzBDOzs7OztJQUsxQyxpREFDaUQ7Ozs7O0lBS2pELCtDQUN3RDs7Ozs7SUFvSDVDLDBDQUE4Qjs7SUFDOUIsOENBQTRFOzs7OztJQUM1RSw4Q0FBMkI7O0lBQzNCLHlEQUFtRDs7SUFDbkQsdURBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgZm9yd2FyZFJlZixcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VDb21wb25lbnQsIElHcmlkRGF0YUJpbmRhYmxlIH0gZnJvbSAnLi9ncmlkLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4vZ3JpZC1jb2x1bW4tcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy1jZWxsLmNvbXBvbmVudCc7XG5cbmNvbnN0IFpfSU5ERVggPSA5OTk5O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1oZWFkZXItZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncmlkLWhlYWRlci1ncm91cC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjayB7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2x1bW4gb2YgdGhlIGhlYWRlciBncm91cC5cbiAgICAgKiBAbWVtYmVyb2YgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgaWRgIG9mIHRoZSBncmlkIGluIHdoaWNoIHRoZSBoZWFkZXIgZ3JvdXAgaXMgc3RvcmVkLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkSUQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneEdyaWRIZWFkZXJDb21wb25lbnQpXG4gICAgcHVibGljIGhlYWRlckNlbGw6IElneEdyaWRIZWFkZXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudClcbiAgICBwdWJsaWMgZmlsdGVyQ2VsbDogSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCksIHsgcmVhZDogSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0pXG4gICAgcHVibGljIGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBoZWFkZXIgZ3JvdXAuXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUubWluLXdpZHRoJylcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmZsZXgtYmFzaXMnKVxuICAgIGdldCB3aWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5nZXRIZWFkZXJHcm91cFdpZHRoKHRoaXMuY29sdW1uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdHlsZSBjbGFzc2VzIG9mIHRoZSBoZWFkZXIgZ3JvdXAuXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICAgIGdldCBzdHlsZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdENsYXNzZXMgPSBbXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoZWFkLWl0ZW0nLFxuICAgICAgICAgICAgdGhpcy5jb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0ge1xuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tcGlubmVkJzogdGhpcy5pc1Bpbm5lZCxcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLXBpbm5lZC1sYXN0JzogdGhpcy5pc0xhc3RQaW5uZWQsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX2RyYWctY29sLWhlYWRlcic6IHRoaXMuaXNIZWFkZXJEcmFnZ2VkLFxuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tZmlsdGVyaW5nJzogdGhpcy5pc0ZpbHRlcmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2xhc3NMaXN0KS5mb3JFYWNoKChbY2xhc3NOYW1lLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRDbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkZWZhdWx0Q2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuei1pbmRleCcpXG4gICAgZ2V0IHpJbmRleCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbi5waW5uZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBaX0lOREVYIC0gdGhpcy5ncmlkLnBpbm5lZENvbHVtbnMuaW5kZXhPZih0aGlzLmNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZ3JpZCBvZiB0aGUgaGVhZGVyIGdyb3VwLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgZ3JpZCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdyaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBoZWFkZXIgZ3JvdXAgYmVsb25ncyB0byBhIGNvbHVtbiB0aGF0IGlzIGZpbHRlcmVkLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgaXNGaWx0ZXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9PT0gdGhpcy5jb2x1bW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBoZWFkZXIgZ3JvdXAgaXMgc3RvcmVkIGluIHRoZSBsYXN0IGNvbHVtbiBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIGdldCBpc0xhc3RQaW5uZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5pc0xhc3RQaW5uZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBoZWFkZXIgZ3JvdXAgaXMgc3RvcmVkIGluIGEgcGlubmVkIGNvbHVtbi5cbiAgICAgKiBAbWVtYmVyb2YgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGlzUGlubmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4ucGlubmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaGVhZGVyIGdyb3VwIGJlbG9uZ3MgdG8gYSBjb2x1bW4gdGhhdCBpcyBtb3ZlZC5cbiAgICAgKiBAbWVtYmVyb2YgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGlzSGVhZGVyRHJhZ2dlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5kcmFnZ2VkQ29sdW1uID09PSAgdGhpcy5jb2x1bW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBoYXNMYXN0UGlubmVkQ2hpbGRDb2x1bW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5hbGxDaGlsZHJlbi5zb21lKGNoaWxkID0+IGNoaWxkLmlzTGFzdFBpbm5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uTW91c2VEb3duKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIGhhY2sgZm9yIHByZXZlbnRpbmcgdGV4dCBzZWxlY3Rpb24gaW4gSUUgYW5kIEVkZ2Ugd2hpbGUgZHJhZ2dpbmcgdGhlIHJlc2l6ZXJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZUNvbXBvbmVudCAmIElHcmlkRGF0YUJpbmRhYmxlPixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBmaWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlKSB7IH1cbn1cbiJdfQ==