UNPKG

carbon-components-angular

Version:
236 lines 21.5 kB
import { Component, Input, EventEmitter, Output } from "@angular/core"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/i18n"; import * as i2 from "@angular/common"; import * as i3 from "../expanded-row-hover.directive"; import * as i4 from "./table-row.component"; import * as i5 from "./table-expanded-row.component"; export class TableBody { constructor(i18n) { this.i18n = i18n; /** * Controls whether to enable multiple or single row selection. */ this.enableSingleSelect = false; /** * Controls whether to show the selection checkboxes column or not. */ this.showSelectionColumn = true; /** * Size of the table rows. */ this.size = "md"; this.skeleton = false; /** * Enables Carbon styles when the first column is an AI decorator column (`TableItem.hasAILabelDecorator`). */ this.withRowAILabels = false; /** * Emits if a single row is selected. * * @param ({model: this.model, selectedRowIndex: index}) */ this.selectRow = new EventEmitter(); /** * Emits if a single row is deselected. * * @param ({model: this.model, deselectedRowIndex: index}) */ this.deselectRow = new EventEmitter(); /** * Emits if a row item excluding expandButtons, checkboxes, or radios is clicked. */ this.rowClick = new EventEmitter(); this._checkboxRowLabel = this.i18n.getOverridable("TABLE.CHECKBOX_ROW"); this._expandButtonAriaLabel = this.i18n.getOverridable("TABLE.EXPAND_BUTTON"); } set expandButtonAriaLabel(value) { this._expandButtonAriaLabel.override(value); } get expandButtonAriaLabel() { return this._expandButtonAriaLabel.value; } set checkboxRowLabel(value) { this._checkboxRowLabel.override(value); } get checkboxRowLabel() { return this._checkboxRowLabel.value; } /** * Triggered when a single row is clicked. * Updates the header checkbox state. * Emits the `selectRow` or `deselectRow` event. */ onRowCheckboxChange(index) { if (this.model.isRowSelected(index)) { this.deselectRow.emit({ model: this.model, deselectedRowIndex: index }); } else { this.selectRow.emit({ model: this.model, selectedRowIndex: index }); } } onRowClick(index) { this.rowClick.emit(index); } getCheckboxRowLabel() { return this._checkboxRowLabel.subject; } getExpandButtonAriaLabel() { return this._expandButtonAriaLabel.subject; } firstExpandedDataInRow(row) { const found = row.find(d => d.expandedData); if (found) { return found.expandedData; } return found; } shouldExpandAsTable(row) { return row.some(d => d.expandAsTable); } } TableBody.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableBody, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component }); TableBody.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: { model: "model", enableSingleSelect: "enableSingleSelect", expandButtonAriaLabel: "expandButtonAriaLabel", checkboxRowLabel: "checkboxRowLabel", showSelectionColumn: "showSelectionColumn", size: "size", selectionLabelColumn: "selectionLabelColumn", skeleton: "skeleton", withRowAILabels: "withRowAILabels" }, outputs: { selectRow: "selectRow", deselectRow: "deselectRow", rowClick: "rowClick" }, ngImport: i0, template: ` <ng-container *ngIf="model"> <ng-container *ngFor="let row of model.data; let i = index"> <tr cdsTableRow [model]="model" [row]="row" [size]="size" [selected]="model.isRowSelected(i)" [expandable]="model.isRowExpandable(i)" [expanded]="model.isRowExpanded(i)" [checkboxLabel]="getCheckboxRowLabel()" [expandButtonAriaLabel]="getExpandButtonAriaLabel()" [showSelectionColumn]="showSelectionColumn" [enableSingleSelect]="enableSingleSelect" [skeleton]="skeleton" [withRowAILabels]="withRowAILabels" (selectRow)="onRowCheckboxChange(i)" (deselectRow)="onRowCheckboxChange(i)" (expandRow)="model.expandRow(i, !model.isRowExpanded(i))" (rowClick)="onRowClick(i)" *ngIf="!model.isRowFiltered(i)" [class]="(model.rowsClass[i] ? model.rowsClass[i] : null)" [ngClass]="{ 'tbody_row--success': !model.isRowSelected(i) && model.getRowContext(i) === 'success', 'tbody_row--warning': !model.isRowSelected(i) && model.getRowContext(i) === 'warning', 'tbody_row--info': !model.isRowSelected(i) && model.getRowContext(i) === 'info', 'tbody_row--error': !model.isRowSelected(i) && model.getRowContext(i) === 'error' }"> </tr> <tr *ngIf="model.isRowExpandable(i) && !shouldExpandAsTable(row) && !model.isRowFiltered(i)" cdsTableExpandedRow cdsExpandedRowHover [row]="row" [expanded]="model.isRowExpanded(i)" [skeleton]="skeleton"> </tr> <ng-container *ngIf="model.isRowExpandable(i) && shouldExpandAsTable(row) && model.isRowExpanded(i) && !model.isRowFiltered(i)"> <tr *ngFor="let expandedDataRow of firstExpandedDataInRow(row)" cdsTableRow [model]="model" [showSelectionColumnCheckbox]="false" [showSelectionColumn]="showSelectionColumn" [row]="expandedDataRow" [size]="size" [skeleton]="skeleton" [withRowAILabels]="withRowAILabels"> </tr> </ng-container> </ng-container> </ng-container> <ng-content></ng-content> `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ExpandedRowHover, selector: "[cdsExpandedRowHover], [ibmExpandedRowHover]" }, { kind: "component", type: i4.TableRowComponent, selector: "[cdsTableRow], [ibmTableRow]", inputs: ["model", "row", "expanded", "expandable", "selected", "size", "enableSingleSelect", "expandButtonAriaLabel", "checkboxLabel", "showSelectionColumn", "showSelectionColumnCheckbox", "selectionLabelColumn", "skeleton", "withRowAILabels"], outputs: ["selectRow", "deselectRow", "expandRow", "rowClick"] }, { kind: "component", type: i5.TableExpandedRow, selector: "[cdsTableExpandedRow], [ibmTableExpandedRow]", inputs: ["row", "skeleton", "expanded"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableBody, decorators: [{ type: Component, args: [{ // tslint:disable-next-line: component-selector selector: "[cdsTableBody], [ibmTableBody]", template: ` <ng-container *ngIf="model"> <ng-container *ngFor="let row of model.data; let i = index"> <tr cdsTableRow [model]="model" [row]="row" [size]="size" [selected]="model.isRowSelected(i)" [expandable]="model.isRowExpandable(i)" [expanded]="model.isRowExpanded(i)" [checkboxLabel]="getCheckboxRowLabel()" [expandButtonAriaLabel]="getExpandButtonAriaLabel()" [showSelectionColumn]="showSelectionColumn" [enableSingleSelect]="enableSingleSelect" [skeleton]="skeleton" [withRowAILabels]="withRowAILabels" (selectRow)="onRowCheckboxChange(i)" (deselectRow)="onRowCheckboxChange(i)" (expandRow)="model.expandRow(i, !model.isRowExpanded(i))" (rowClick)="onRowClick(i)" *ngIf="!model.isRowFiltered(i)" [class]="(model.rowsClass[i] ? model.rowsClass[i] : null)" [ngClass]="{ 'tbody_row--success': !model.isRowSelected(i) && model.getRowContext(i) === 'success', 'tbody_row--warning': !model.isRowSelected(i) && model.getRowContext(i) === 'warning', 'tbody_row--info': !model.isRowSelected(i) && model.getRowContext(i) === 'info', 'tbody_row--error': !model.isRowSelected(i) && model.getRowContext(i) === 'error' }"> </tr> <tr *ngIf="model.isRowExpandable(i) && !shouldExpandAsTable(row) && !model.isRowFiltered(i)" cdsTableExpandedRow cdsExpandedRowHover [row]="row" [expanded]="model.isRowExpanded(i)" [skeleton]="skeleton"> </tr> <ng-container *ngIf="model.isRowExpandable(i) && shouldExpandAsTable(row) && model.isRowExpanded(i) && !model.isRowFiltered(i)"> <tr *ngFor="let expandedDataRow of firstExpandedDataInRow(row)" cdsTableRow [model]="model" [showSelectionColumnCheckbox]="false" [showSelectionColumn]="showSelectionColumn" [row]="expandedDataRow" [size]="size" [skeleton]="skeleton" [withRowAILabels]="withRowAILabels"> </tr> </ng-container> </ng-container> </ng-container> <ng-content></ng-content> ` }] }], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { model: [{ type: Input }], enableSingleSelect: [{ type: Input }], expandButtonAriaLabel: [{ type: Input }], checkboxRowLabel: [{ type: Input }], showSelectionColumn: [{ type: Input }], size: [{ type: Input }], selectionLabelColumn: [{ type: Input }], skeleton: [{ type: Input }], withRowAILabels: [{ type: Input }], selectRow: [{ type: Output }], deselectRow: [{ type: Output }], rowClick: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGFibGUvYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBa0V2QixNQUFNLE9BQU8sU0FBUztJQTZFckIsWUFBc0IsSUFBVTtRQUFWLFNBQUksR0FBSixJQUFJLENBQU07UUExRWhDOztXQUVHO1FBQ00sdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBb0JwQzs7V0FFRztRQUNNLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUVwQzs7V0FFRztRQUNNLFNBQUksR0FBaUIsSUFBSSxDQUFDO1FBYzFCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7O1dBRUc7UUFDTSxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUVqQzs7OztXQUlHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFakQ7Ozs7V0FJRztRQUNPLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVuRDs7V0FFRztRQUNPLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXRDLHNCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkUsMkJBQXNCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUUvQyxDQUFDO0lBckVyQyxJQUNJLHFCQUFxQixDQUFDLEtBQWtDO1FBQzNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFDSSxnQkFBZ0IsQ0FBQyxLQUFrQztRQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNuQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQXVERDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsS0FBYTtRQUNoQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN4RTthQUFNO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3BFO0lBQ0YsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxtQkFBbUI7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx3QkFBd0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDO0lBQzVDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxHQUFHO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsSUFBSSxLQUFLLEVBQUU7WUFDVixPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDMUI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxHQUFHO1FBQ3RCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2QyxDQUFDOztzR0FsSFcsU0FBUzswRkFBVCxTQUFTLDJkQXpEWDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVEVDsyRkFFVyxTQUFTO2tCQTVEckIsU0FBUzttQkFBQztvQkFDViwrQ0FBK0M7b0JBQy9DLFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVEVDtpQkFDRDsyRkFFUyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUdGLHFCQUFxQjtzQkFEeEIsS0FBSztnQkFVRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBWUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFZRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxlQUFlO3NCQUF2QixLQUFLO2dCQU9JLFNBQVM7c0JBQWxCLE1BQU07Z0JBT0csV0FBVztzQkFBcEIsTUFBTTtnQkFLRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0RXZlbnRFbWl0dGVyLFxuXHRPdXRwdXRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFRhYmxlTW9kZWwgfSBmcm9tIFwiLi4vdGFibGUtbW9kZWwuY2xhc3NcIjtcbmltcG9ydCB7IEkxOG4sIE92ZXJyaWRhYmxlIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvaTE4blwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBUYWJsZVJvd1NpemUgfSBmcm9tIFwiLi4vdGFibGUudHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIltjZHNUYWJsZUJvZHldLCBbaWJtVGFibGVCb2R5XVwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbFwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIG1vZGVsLmRhdGE7IGxldCBpID0gaW5kZXhcIj5cblx0XHRcdFx0PHRyXG5cdFx0XHRcdFx0Y2RzVGFibGVSb3dcblx0XHRcdFx0XHRbbW9kZWxdPVwibW9kZWxcIlxuXHRcdFx0XHRcdFtyb3ddPVwicm93XCJcblx0XHRcdFx0XHRbc2l6ZV09XCJzaXplXCJcblx0XHRcdFx0XHRbc2VsZWN0ZWRdPVwibW9kZWwuaXNSb3dTZWxlY3RlZChpKVwiXG5cdFx0XHRcdFx0W2V4cGFuZGFibGVdPVwibW9kZWwuaXNSb3dFeHBhbmRhYmxlKGkpXCJcblx0XHRcdFx0XHRbZXhwYW5kZWRdPVwibW9kZWwuaXNSb3dFeHBhbmRlZChpKVwiXG5cdFx0XHRcdFx0W2NoZWNrYm94TGFiZWxdPVwiZ2V0Q2hlY2tib3hSb3dMYWJlbCgpXCJcblx0XHRcdFx0XHRbZXhwYW5kQnV0dG9uQXJpYUxhYmVsXT1cImdldEV4cGFuZEJ1dHRvbkFyaWFMYWJlbCgpXCJcblx0XHRcdFx0XHRbc2hvd1NlbGVjdGlvbkNvbHVtbl09XCJzaG93U2VsZWN0aW9uQ29sdW1uXCJcblx0XHRcdFx0XHRbZW5hYmxlU2luZ2xlU2VsZWN0XT1cImVuYWJsZVNpbmdsZVNlbGVjdFwiXG5cdFx0XHRcdFx0W3NrZWxldG9uXT1cInNrZWxldG9uXCJcblx0XHRcdFx0XHRbd2l0aFJvd0FJTGFiZWxzXT1cIndpdGhSb3dBSUxhYmVsc1wiXG5cdFx0XHRcdFx0KHNlbGVjdFJvdyk9XCJvblJvd0NoZWNrYm94Q2hhbmdlKGkpXCJcblx0XHRcdFx0XHQoZGVzZWxlY3RSb3cpPVwib25Sb3dDaGVja2JveENoYW5nZShpKVwiXG5cdFx0XHRcdFx0KGV4cGFuZFJvdyk9XCJtb2RlbC5leHBhbmRSb3coaSwgIW1vZGVsLmlzUm93RXhwYW5kZWQoaSkpXCJcblx0XHRcdFx0XHQocm93Q2xpY2spPVwib25Sb3dDbGljayhpKVwiXG5cdFx0XHRcdFx0Km5nSWY9XCIhbW9kZWwuaXNSb3dGaWx0ZXJlZChpKVwiXG5cdFx0XHRcdFx0W2NsYXNzXT1cIihtb2RlbC5yb3dzQ2xhc3NbaV0gPyBtb2RlbC5yb3dzQ2xhc3NbaV0gOiBudWxsKVwiXG5cdFx0XHRcdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0XHRcdFx0J3Rib2R5X3Jvdy0tc3VjY2Vzcyc6ICFtb2RlbC5pc1Jvd1NlbGVjdGVkKGkpICYmIG1vZGVsLmdldFJvd0NvbnRleHQoaSkgPT09ICdzdWNjZXNzJyxcblx0XHRcdFx0XHRcdCd0Ym9keV9yb3ctLXdhcm5pbmcnOiAhbW9kZWwuaXNSb3dTZWxlY3RlZChpKSAmJiBtb2RlbC5nZXRSb3dDb250ZXh0KGkpID09PSAnd2FybmluZycsXG5cdFx0XHRcdFx0XHQndGJvZHlfcm93LS1pbmZvJzogIW1vZGVsLmlzUm93U2VsZWN0ZWQoaSkgJiYgbW9kZWwuZ2V0Um93Q29udGV4dChpKSA9PT0gJ2luZm8nLFxuXHRcdFx0XHRcdFx0J3Rib2R5X3Jvdy0tZXJyb3InOiAhbW9kZWwuaXNSb3dTZWxlY3RlZChpKSAmJiBtb2RlbC5nZXRSb3dDb250ZXh0KGkpID09PSAnZXJyb3InXG5cdFx0XHRcdFx0fVwiPlxuXHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8dHJcblx0XHRcdFx0XHQqbmdJZj1cIm1vZGVsLmlzUm93RXhwYW5kYWJsZShpKSAmJiAhc2hvdWxkRXhwYW5kQXNUYWJsZShyb3cpICYmICFtb2RlbC5pc1Jvd0ZpbHRlcmVkKGkpXCJcblx0XHRcdFx0XHRjZHNUYWJsZUV4cGFuZGVkUm93XG5cdFx0XHRcdFx0Y2RzRXhwYW5kZWRSb3dIb3ZlclxuXHRcdFx0XHRcdFtyb3ddPVwicm93XCJcblx0XHRcdFx0XHRbZXhwYW5kZWRdPVwibW9kZWwuaXNSb3dFeHBhbmRlZChpKVwiXG5cdFx0XHRcdFx0W3NrZWxldG9uXT1cInNrZWxldG9uXCI+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHRcdDxuZy1jb250YWluZXJcblx0XHRcdFx0XHQqbmdJZj1cIm1vZGVsLmlzUm93RXhwYW5kYWJsZShpKSAmJiBzaG91bGRFeHBhbmRBc1RhYmxlKHJvdykgJiYgbW9kZWwuaXNSb3dFeHBhbmRlZChpKSAmJiAhbW9kZWwuaXNSb3dGaWx0ZXJlZChpKVwiPlxuXHRcdFx0XHRcdDx0clxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IGV4cGFuZGVkRGF0YVJvdyBvZiBmaXJzdEV4cGFuZGVkRGF0YUluUm93KHJvdylcIlxuXHRcdFx0XHRcdFx0Y2RzVGFibGVSb3dcblx0XHRcdFx0XHRcdFttb2RlbF09XCJtb2RlbFwiXG5cdFx0XHRcdFx0XHRbc2hvd1NlbGVjdGlvbkNvbHVtbkNoZWNrYm94XT1cImZhbHNlXCJcblx0XHRcdFx0XHRcdFtzaG93U2VsZWN0aW9uQ29sdW1uXT1cInNob3dTZWxlY3Rpb25Db2x1bW5cIlxuXHRcdFx0XHRcdFx0W3Jvd109XCJleHBhbmRlZERhdGFSb3dcIlxuXHRcdFx0XHRcdFx0W3NpemVdPVwic2l6ZVwiXG5cdFx0XHRcdFx0XHRbc2tlbGV0b25dPVwic2tlbGV0b25cIlxuXHRcdFx0XHRcdFx0W3dpdGhSb3dBSUxhYmVsc109XCJ3aXRoUm93QUlMYWJlbHNcIj5cblx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHkge1xuXHRASW5wdXQoKSBtb2RlbDogVGFibGVNb2RlbDtcblxuXHQvKipcblx0ICogQ29udHJvbHMgd2hldGhlciB0byBlbmFibGUgbXVsdGlwbGUgb3Igc2luZ2xlIHJvdyBzZWxlY3Rpb24uXG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVTaW5nbGVTZWxlY3QgPSBmYWxzZTtcblxuXHRASW5wdXQoKVxuXHRzZXQgZXhwYW5kQnV0dG9uQXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcgfCBPYnNlcnZhYmxlPHN0cmluZz4pIHtcblx0XHR0aGlzLl9leHBhbmRCdXR0b25BcmlhTGFiZWwub3ZlcnJpZGUodmFsdWUpO1xuXHR9XG5cblx0Z2V0IGV4cGFuZEJ1dHRvbkFyaWFMYWJlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kQnV0dG9uQXJpYUxhYmVsLnZhbHVlO1xuXHR9XG5cblx0QElucHV0KClcblx0c2V0IGNoZWNrYm94Um93TGFiZWwodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX2NoZWNrYm94Um93TGFiZWwub3ZlcnJpZGUodmFsdWUpO1xuXHR9XG5cblx0Z2V0IGNoZWNrYm94Um93TGFiZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2NoZWNrYm94Um93TGFiZWwudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ29udHJvbHMgd2hldGhlciB0byBzaG93IHRoZSBzZWxlY3Rpb24gY2hlY2tib3hlcyBjb2x1bW4gb3Igbm90LlxuXHQgKi9cblx0QElucHV0KCkgc2hvd1NlbGVjdGlvbkNvbHVtbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFNpemUgb2YgdGhlIHRhYmxlIHJvd3MuXG5cdCAqL1xuXHRASW5wdXQoKSBzaXplOiBUYWJsZVJvd1NpemUgPSBcIm1kXCI7XG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gcG9wdWxhdGUgdGhlIHJvdyBzZWxlY3Rpb24gY2hlY2tib3ggbGFiZWwgd2l0aCBhIHVzZWZ1bCB2YWx1ZSBpZiBzZXQuXG5cdCAqXG5cdCAqIEV4YW1wbGU6XG5cdCAqIGBgYFxuXHQgKiA8Y2RzLXRhYmxlIFtzZWxlY3Rpb25MYWJlbENvbHVtbl09XCIwXCI+PC9jZHMtdGFibGU+XG5cdCAqIDwhLS0gcmVzdWx0cyBpbiBhcmlhLWxhYmVsPVwiU2VsZWN0IGZpcnN0IGNvbHVtbiB2YWx1ZVwiXG5cdCAqICh3aGVyZSBcImZpcnN0IGNvbHVtbiB2YWx1ZVwiIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY29sdW1uIGluIHRoZSByb3cgLS0+XG5cdCAqIGBgYFxuXHQgKi9cblx0QElucHV0KCkgc2VsZWN0aW9uTGFiZWxDb2x1bW46IG51bWJlcjtcblxuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBFbmFibGVzIENhcmJvbiBzdHlsZXMgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGlzIGFuIEFJIGRlY29yYXRvciBjb2x1bW4gKGBUYWJsZUl0ZW0uaGFzQUlMYWJlbERlY29yYXRvcmApLlxuXHQgKi9cblx0QElucHV0KCkgd2l0aFJvd0FJTGFiZWxzID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEVtaXRzIGlmIGEgc2luZ2xlIHJvdyBpcyBzZWxlY3RlZC5cblx0ICpcblx0ICogQHBhcmFtICh7bW9kZWw6IHRoaXMubW9kZWwsIHNlbGVjdGVkUm93SW5kZXg6IGluZGV4fSlcblx0ICovXG5cdEBPdXRwdXQoKSBzZWxlY3RSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPE9iamVjdD4oKTtcblxuXHQvKipcblx0ICogRW1pdHMgaWYgYSBzaW5nbGUgcm93IGlzIGRlc2VsZWN0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSAoe21vZGVsOiB0aGlzLm1vZGVsLCBkZXNlbGVjdGVkUm93SW5kZXg6IGluZGV4fSlcblx0ICovXG5cdEBPdXRwdXQoKSBkZXNlbGVjdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8T2JqZWN0PigpO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyBpZiBhIHJvdyBpdGVtIGV4Y2x1ZGluZyBleHBhbmRCdXR0b25zLCBjaGVja2JveGVzLCBvciByYWRpb3MgaXMgY2xpY2tlZC5cblx0ICovXG5cdEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG5cdHByb3RlY3RlZCBfY2hlY2tib3hSb3dMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLkNIRUNLQk9YX1JPV1wiKTtcblx0cHJvdGVjdGVkIF9leHBhbmRCdXR0b25BcmlhTGFiZWwgPSB0aGlzLmkxOG4uZ2V0T3ZlcnJpZGFibGUoXCJUQUJMRS5FWFBBTkRfQlVUVE9OXCIpO1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuOiBJMThuKSB7IH1cblxuXHQvKipcblx0ICogVHJpZ2dlcmVkIHdoZW4gYSBzaW5nbGUgcm93IGlzIGNsaWNrZWQuXG5cdCAqIFVwZGF0ZXMgdGhlIGhlYWRlciBjaGVja2JveCBzdGF0ZS5cblx0ICogRW1pdHMgdGhlIGBzZWxlY3RSb3dgIG9yIGBkZXNlbGVjdFJvd2AgZXZlbnQuXG5cdCAqL1xuXHRvblJvd0NoZWNrYm94Q2hhbmdlKGluZGV4OiBudW1iZXIpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5pc1Jvd1NlbGVjdGVkKGluZGV4KSkge1xuXHRcdFx0dGhpcy5kZXNlbGVjdFJvdy5lbWl0KHsgbW9kZWw6IHRoaXMubW9kZWwsIGRlc2VsZWN0ZWRSb3dJbmRleDogaW5kZXggfSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2VsZWN0Um93LmVtaXQoeyBtb2RlbDogdGhpcy5tb2RlbCwgc2VsZWN0ZWRSb3dJbmRleDogaW5kZXggfSk7XG5cdFx0fVxuXHR9XG5cblx0b25Sb3dDbGljayhpbmRleDogbnVtYmVyKSB7XG5cdFx0dGhpcy5yb3dDbGljay5lbWl0KGluZGV4KTtcblx0fVxuXG5cdGdldENoZWNrYm94Um93TGFiZWwoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5fY2hlY2tib3hSb3dMYWJlbC5zdWJqZWN0O1xuXHR9XG5cblx0Z2V0RXhwYW5kQnV0dG9uQXJpYUxhYmVsKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuX2V4cGFuZEJ1dHRvbkFyaWFMYWJlbC5zdWJqZWN0O1xuXHR9XG5cblx0Zmlyc3RFeHBhbmRlZERhdGFJblJvdyhyb3cpIHtcblx0XHRjb25zdCBmb3VuZCA9IHJvdy5maW5kKGQgPT4gZC5leHBhbmRlZERhdGEpO1xuXHRcdGlmIChmb3VuZCkge1xuXHRcdFx0cmV0dXJuIGZvdW5kLmV4cGFuZGVkRGF0YTtcblx0XHR9XG5cdFx0cmV0dXJuIGZvdW5kO1xuXHR9XG5cblx0c2hvdWxkRXhwYW5kQXNUYWJsZShyb3cpIHtcblx0XHRyZXR1cm4gcm93LnNvbWUoZCA9PiBkLmV4cGFuZEFzVGFibGUpO1xuXHR9XG59XG4iXX0=