@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
358 lines • 35.7 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectorRef, DoCheck, ElementRef, forwardRef, HostBinding, HostListener, Input, QueryList, ViewChild, ViewChildren, Directive } from '@angular/core';
import { IgxCheckboxComponent } from '../checkbox/checkbox.component';
import { IgxGridForOfDirective } from '../directives/for-of/for_of.directive';
import { GridBaseAPIService } from './api.service';
import { IgxGridCellComponent } from './cell.component';
import { TransactionType } from '../services';
import { IgxGridSelectionService, IgxGridCRUDService, IgxRow } from './selection/selection.service';
import { DeprecateProperty } from '../core/deprecateDecorators';
let IgxRowDirective = class IgxRowDirective {
constructor(gridAPI, crudService, selectionService, element, cdr) {
this.gridAPI = gridAPI;
this.crudService = crudService;
this.selectionService = selectionService;
this.element = element;
this.cdr = cdr;
/**
* @hidden
*/
this.role = 'row';
/**
* @hidden
*/
this.dragging = false;
/**
* @hidden
*/
this.focused = false;
/**
* @hidden
* @internal
*/
this.defaultCssClass = 'igx-grid__tr';
}
/**
* The data passed to the row component.
*
* ```typescript
* // get the row data for the first selected row
* let selectedRowData = this.grid.selectedRows[0].rowData;
* ```
*/
get rowData() {
if (this.inEditMode) {
return Object.assign({}, this._rowData, this.grid.transactions.getAggregatedValue(this.rowID, false));
}
return this._rowData;
}
set rowData(v) {
this._rowData = v;
}
get dataRowIndex() {
return this.index;
}
/**
* @hidden
*/
get styleClasses() {
return this.resolveClasses();
}
/**
* @hidden
*/
get selected() {
return this.selectionService.isRowSelected(this.rowID);
}
set selected(value) {
value ? this.selectionService.selectRowsWithNoEvent([this.rowID]) :
this.selectionService.deselectRowsWithNoEvent([this.rowID]);
this.grid.cdr.markForCheck();
}
/**
* @hidden
*/
get columns() {
return this.grid.visibleColumns;
}
/**
* @hidden
* @internal
*/
get viewIndex() {
if (this.grid.groupingExpressions.length) {
return this.grid.filteredSortedData.indexOf(this.rowData);
}
return this.index + this.grid.page * this.grid.perPage;
}
/**
* @hidden
*/
get pinnedColumns() {
return this.grid.pinnedColumns;
}
/**
* @hidden
*/
get unpinnedColumns() {
return this.grid.unpinnedColumns;
}
/**
* @hidden
*/
get showRowSelectors() {
return this.grid.showRowSelectors;
}
/** @hidden */
get dirty() {
const row = this.grid.transactions.getState(this.rowID);
if (row) {
return row.type === TransactionType.ADD || row.type === TransactionType.UPDATE;
}
return false;
}
get isSelected() {
return this.selectionService.isRowSelected(this.rowID);
}
/**
* @hidden
*/
get rowDraggable() {
return this.grid.rowDraggable;
}
/** @hidden */
get added() {
const row = this.grid.transactions.getState(this.rowID);
if (row) {
return row.type === TransactionType.ADD;
}
return false;
}
/** @hidden */
get deleted() {
return this.gridAPI.row_deleted_transaction(this.rowID);
}
// TODO: Refactor
get inEditMode() {
if (this.grid.rowEditable) {
const editRowState = this.crudService.row;
return (editRowState && editRowState.id === this.rowID) || false;
}
else {
return false;
}
}
/**
* Get a reference to the grid that contains the selected row.
*
* ```typescript
* handleRowSelection(event) {
* // the grid on which the onRowSelectionChange event was triggered
* const grid = event.row.grid;
* }
* ```
*
* ```html
* <igx-grid
* [data]="data"
* (onRowSelectionChange)="handleRowSelection($event)">
* </igx-grid>
* ```
*/
get grid() {
return this.gridAPI.grid;
}
/**
* Gets the ID of the row.
* A row in the grid is identified either by:
* - primaryKey data value,
* - the whole rowData, if the primaryKey is omitted.
*
* ```typescript
* let rowID = this.grid.selectedRows[2].rowID;
* ```
*/
get rowID() {
const primaryKey = this.grid.primaryKey;
return primaryKey ? this._rowData[primaryKey] : this._rowData;
}
/**
* The native DOM element representing the row. Could be null in certain environments.
*
* ```typescript
* // get the nativeElement of the second selected row
* let selectedRowNativeElement = this.grid.selectedRows[1].nativeElement;
* ```
*/
get nativeElement() {
return this.element.nativeElement;
}
/**
* @hidden
* @internal
*/
onClick(event) {
if (this.grid.rowSelection === 'none' || this.deleted) {
return;
}
if (event.shiftKey && this.grid.rowSelection === 'multiple') {
this.selectionService.selectMultipleRows(this.rowID, this.rowData, event);
return;
}
this.selectionService.selectRowById(this.rowID, !event.ctrlKey, event);
}
/**
* @hidden
*/
onRowSelectorClick(event) {
event.stopPropagation();
if (event.shiftKey && this.grid.rowSelection === 'multiple') {
this.selectionService.selectMultipleRows(this.rowID, this.rowData, event);
return;
}
this.selected ? this.selectionService.deselectRow(this.rowID, event) :
this.selectionService.selectRowById(this.rowID, false, event);
}
/**
* Updates the specified row object and the data source record with the passed value.
* This method emits `onEditDone` event.
*
* ```typescript
* // update the second selected row's value
* let newValue = "Apple";
* this.grid.selectedRows[1].update(newValue);
* ```
*/
update(value) {
const crudService = this.crudService;
if (crudService.inEditMode && crudService.cell.id.rowID === this.rowID) {
this.grid.endEdit(false);
}
const row = new IgxRow(this.rowID, this.index, this.rowData);
this.gridAPI.update_row(row, value);
this.cdr.markForCheck();
}
/**
* Removes the specified row from the grid's data source.
* This method emits `onRowDeleted` event.
*
* ```typescript
* // delete the third selected row from the grid
* this.grid.selectedRows[2].delete();
* ```
*/
delete() {
this.grid.deleteRowById(this.rowID);
}
/**
* @hidden
*/
get rowCheckboxAriaLabel() {
return this.grid.primaryKey ?
this.selected ? 'Deselect row with key ' + this.rowID : 'Select row with key ' + this.rowID :
this.selected ? 'Deselect row' : 'Select row';
}
/**
* @hidden
*/
ngDoCheck() {
this.cdr.markForCheck();
}
/**
* @hidden
*/
resolveClasses() {
const indexClass = this.index % 2 ? this.grid.evenRowCSS : this.grid.oddRowCSS;
const selectedClass = this.selected ? 'igx-grid__tr--selected' : '';
const editClass = this.inEditMode ? 'igx-grid__tr--edit' : '';
const dirtyClass = this.dirty ? 'igx-grid__tr--edited' : '';
const deletedClass = this.deleted ? 'igx-grid__tr--deleted' : '';
const mrlClass = this.grid.hasColumnLayouts ? 'igx-grid__tr--mrl' : '';
const dragClass = this.dragging ? 'igx-grid__tr--drag' : '';
return `${this.defaultCssClass} ${indexClass} ${selectedClass} ${editClass} ${dirtyClass}
${deletedClass} ${mrlClass} ${dragClass}`.trim();
}
/**
* @hidden
*/
get resolveDragIndicatorClasses() {
const defaultDragIndicatorCssClass = 'igx-grid__drag-indicator';
const dragIndicatorOff = this.grid.rowDragging && !this.dragging ? 'igx-grid__drag-indicator--off' : '';
return `${defaultDragIndicatorCssClass} ${dragIndicatorOff}`;
}
};
IgxRowDirective.ctorParameters = () => [
{ type: GridBaseAPIService },
{ type: IgxGridCRUDService },
{ type: IgxGridSelectionService },
{ type: ElementRef },
{ type: ChangeDetectorRef }
];
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxRowDirective.prototype, "rowData", null);
__decorate([
Input(),
__metadata("design:type", Number)
], IgxRowDirective.prototype, "index", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxRowDirective.prototype, "gridID", void 0);
__decorate([
ViewChild('igxDirRef', { read: IgxGridForOfDirective }),
__metadata("design:type", IgxGridForOfDirective)
], IgxRowDirective.prototype, "virtDirRow", void 0);
__decorate([
ViewChild(forwardRef(() => IgxCheckboxComponent), { read: IgxCheckboxComponent }),
__metadata("design:type", IgxCheckboxComponent)
], IgxRowDirective.prototype, "checkboxElement", void 0);
__decorate([
ViewChildren(forwardRef(() => IgxGridCellComponent)),
__metadata("design:type", QueryList)
], IgxRowDirective.prototype, "cells", void 0);
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxRowDirective.prototype, "role", void 0);
__decorate([
HostBinding('attr.data-rowIndex'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxRowDirective.prototype, "dataRowIndex", null);
__decorate([
HostBinding('class'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxRowDirective.prototype, "styleClasses", null);
__decorate([
Input(),
HostBinding('attr.aria-selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxRowDirective.prototype, "selected", null);
__decorate([
DeprecateProperty('isSelected property is deprecated. Use selected property instead.'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxRowDirective.prototype, "isSelected", null);
__decorate([
HostListener('click', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [MouseEvent]),
__metadata("design:returntype", void 0)
], IgxRowDirective.prototype, "onClick", null);
IgxRowDirective = __decorate([
Directive({
selector: '[igxRowBaseComponent]'
}),
__metadata("design:paramtypes", [GridBaseAPIService,
IgxGridCRUDService,
IgxGridSelectionService,
ElementRef,
ChangeDetectorRef])
], IgxRowDirective);
export { IgxRowDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvcm93LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBTWhFLElBQWEsZUFBZSxHQUE1QixNQUFhLGVBQWU7SUF1UHhCLFlBQ1csT0FBOEIsRUFDOUIsV0FBK0IsRUFDL0IsZ0JBQXlDLEVBQ3pDLE9BQWdDLEVBQ2hDLEdBQXNCO1FBSnRCLFlBQU8sR0FBUCxPQUFPLENBQXVCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBQ2hDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUxqQzs7V0FFRztRQUVJLFNBQUksR0FBRyxLQUFLLENBQUM7UUEwR3BCOztXQUVHO1FBQ0ksYUFBUSxHQUFHLEtBQUssQ0FBQztRQTREeEI7O1dBRUc7UUFDSSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXZCOzs7V0FHRztRQUNJLG9CQUFlLEdBQUcsY0FBYyxDQUFDO0lBUUosQ0FBQztJQXpQckM7Ozs7Ozs7T0FPRztJQUVILElBQVcsT0FBTztRQUNkLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3pHO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLE9BQU8sQ0FBQyxDQUFNO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFnREQsSUFBSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUVILElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUdILElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQWM7UUFDdkIsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksU0FBUztRQUNULElBQUssSUFBSSxDQUFDLElBQVksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7WUFDL0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDN0Q7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGVBQWU7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0QyxDQUFDO0lBRUQsY0FBYztJQUNkLElBQVcsS0FBSztRQUNaLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxHQUFHLEVBQUU7WUFDTCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLENBQUM7U0FDbEY7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBR0QsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDbEMsQ0FBQztJQUVELGNBQWM7SUFDZCxJQUFXLEtBQUs7UUFDWixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksR0FBRyxFQUFFO1lBQ0wsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxHQUFHLENBQUM7U0FDM0M7UUFFQSxPQUFPLEtBQUssQ0FBQztJQUNsQixDQUFDO0lBRUQsY0FBYztJQUNkLElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQU9ELGlCQUFpQjtJQUNqQixJQUFXLFVBQVU7UUFDakIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN2QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxPQUFPLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQztTQUNwRTthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxJQUFXLEtBQUs7UUFDWixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN4QyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDdEMsQ0FBQztJQXFCRDs7O09BR0c7SUFFSSxPQUFPLENBQUMsS0FBaUI7UUFDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNsRSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssVUFBVSxFQUFFO1lBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUUsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxLQUFLO1FBQzNCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssVUFBVSxFQUFFO1lBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUUsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLEtBQVU7UUFDcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLFdBQVcsQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUI7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLE1BQU07UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDTyxjQUFjO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDL0UsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksVUFBVSxJQUFJLGFBQWEsSUFBSSxTQUFTLElBQUksVUFBVTtXQUNyRixZQUFZLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsMkJBQTJCO1FBQ2xDLE1BQU0sNEJBQTRCLEdBQUcsMEJBQTBCLENBQUM7UUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEcsT0FBTyxHQUFHLDRCQUE0QixJQUFJLGdCQUFnQixFQUFFLENBQUM7SUFDakUsQ0FBQztDQUNKLENBQUE7O1lBekd1QixrQkFBa0I7WUFDZCxrQkFBa0I7WUFDYix1QkFBdUI7WUFDaEMsVUFBVTtZQUNkLGlCQUFpQjs7QUFoUGpDO0lBREMsS0FBSyxFQUFFOzs7OENBTVA7QUFjRDtJQURDLEtBQUssRUFBRTs7OENBQ2E7QUFNckI7SUFEQyxLQUFLLEVBQUU7OytDQUNjO0FBTXRCO0lBREMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxDQUFDOzhCQUNyQyxxQkFBcUI7bURBQU07QUFNOUM7SUFEQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzs4QkFDMUQsb0JBQW9CO3dEQUFDO0FBVzdDO0lBREMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDOzhCQUN2QyxTQUFTOzhDQUF1QjtBQU05QztJQURDLFdBQVcsQ0FBQyxXQUFXLENBQUM7OzZDQUNMO0FBR3BCO0lBREMsV0FBVyxDQUFDLG9CQUFvQixDQUFDOzs7bURBR2pDO0FBTUQ7SUFEQyxXQUFXLENBQUMsT0FBTyxDQUFDOzs7bURBR3BCO0FBT0Q7SUFGQyxLQUFLLEVBQUU7SUFDUCxXQUFXLENBQUMsb0JBQW9CLENBQUM7OzsrQ0FHakM7QUEwREQ7SUFEQyxpQkFBaUIsQ0FBQyxtRUFBbUUsQ0FBQzs7O2lEQUd0RjtBQStHRDtJQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7cUNBQ1osVUFBVTs7OENBTy9CO0FBMVFRLGVBQWU7SUFIM0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLHVCQUF1QjtLQUNwQyxDQUFDO3FDQXlQc0Isa0JBQWtCO1FBQ2Qsa0JBQWtCO1FBQ2IsdUJBQXVCO1FBQ2hDLFVBQVU7UUFDZCxpQkFBaUI7R0E1UHhCLGVBQWUsQ0FpVzNCO1NBaldZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBEaXJlY3RpdmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZENlbGxDb21wb25lbnQgfSBmcm9tICcuL2NlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IElneEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLCBJZ3hHcmlkQ1JVRFNlcnZpY2UsIElneFJvdyB9IGZyb20gJy4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IERlcHJlY2F0ZVByb3BlcnR5IH0gZnJvbSAnLi4vY29yZS9kZXByZWNhdGVEZWNvcmF0b3JzJztcbmltcG9ydCB7IEdyaWRUeXBlIH0gZnJvbSAnLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hSb3dCYXNlQ29tcG9uZW50XSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4Um93RGlyZWN0aXZlPFQgZXh0ZW5kcyBJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPiBpbXBsZW1lbnRzIERvQ2hlY2sge1xuXG4gICAgcHJpdmF0ZSBfcm93RGF0YTogYW55O1xuICAgIC8qKlxuICAgICAqICBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIHJvdyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0IHRoZSByb3cgZGF0YSBmb3IgdGhlIGZpcnN0IHNlbGVjdGVkIHJvd1xuICAgICAqIGxldCBzZWxlY3RlZFJvd0RhdGEgPSB0aGlzLmdyaWQuc2VsZWN0ZWRSb3dzWzBdLnJvd0RhdGE7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0RhdGEoKTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMuaW5FZGl0TW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Jvd0RhdGEsIHRoaXMuZ3JpZC50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHRoaXMucm93SUQsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0RhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dEYXRhKHY6IGFueSkge1xuICAgICAgICB0aGlzLl9yb3dEYXRhID0gdjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSByb3cuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgc2Vjb25kIHNlbGVjdGVkIHJvd1xuICAgICAqIGxldCBzZWxlY3RlZFJvd0luZGV4ID0gdGhpcy5ncmlkLnNlbGVjdGVkUm93c1sxXS5pbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpbmRleDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdyaWRJRDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneERpclJlZicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIHZpcnREaXJSb3c6IElneEdyaWRGb3JPZkRpcmVjdGl2ZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoZm9yd2FyZFJlZigoKSA9PiBJZ3hDaGVja2JveENvbXBvbmVudCksIHsgcmVhZDogSWd4Q2hlY2tib3hDb21wb25lbnQgfSlcbiAgICBwdWJsaWMgY2hlY2tib3hFbGVtZW50OiBJZ3hDaGVja2JveENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZW5kZXJlZCBjZWxscyBpbiB0aGUgcm93IGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIGNlbGxzIG9mIHRoZSB0aGlyZCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dDZWxscyA9IHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3NbMl0uY2VsbHM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IElneEdyaWRDZWxsQ29tcG9uZW50KSlcbiAgICBwdWJsaWMgY2VsbHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkQ2VsbENvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ3Jvdyc7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1yb3dJbmRleCcpXG4gICAgZ2V0IGRhdGFSb3dJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICAgIGdldCBzdHlsZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNsYXNzZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zZWxlY3RlZCcpXG4gICAgZ2V0IHNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzUm93U2VsZWN0ZWQodGhpcy5yb3dJRCk7XG4gICAgfVxuXG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHZhbHVlID8gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdFJvd3NXaXRoTm9FdmVudChbdGhpcy5yb3dJRF0pIDpcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KFt0aGlzLnJvd0lEXSk7XG4gICAgICAgIHRoaXMuZ3JpZC5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBjb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC52aXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IHZpZXdJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoKHRoaXMuZ3JpZCBhcyBhbnkpLmdyb3VwaW5nRXhwcmVzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmZpbHRlcmVkU29ydGVkRGF0YS5pbmRleE9mKHRoaXMucm93RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggKyB0aGlzLmdyaWQucGFnZSAqIHRoaXMuZ3JpZC5wZXJQYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgcGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQucGlubmVkQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHVucGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQudW5waW5uZWRDb2x1bW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dSb3dTZWxlY3RvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuc2hvd1Jvd1NlbGVjdG9ycztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBnZXQgZGlydHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ3JpZC50cmFuc2FjdGlvbnMuZ2V0U3RhdGUodGhpcy5yb3dJRCk7XG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgIHJldHVybiByb3cudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFERCB8fCByb3cudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlVQREFURTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2lzU2VsZWN0ZWQgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gVXNlIHNlbGVjdGVkIHByb3BlcnR5IGluc3RlYWQuJylcbiAgICBwdWJsaWMgZ2V0IGlzU2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNSb3dTZWxlY3RlZCh0aGlzLnJvd0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dEcmFnZ2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQucm93RHJhZ2dhYmxlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGdldCBhZGRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5ncmlkLnRyYW5zYWN0aW9ucy5nZXRTdGF0ZSh0aGlzLnJvd0lEKTtcbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgcmV0dXJuIHJvdy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREO1xuICAgICAgICB9XG5cbiAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBnZXQgZGVsZXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbih0aGlzLnJvd0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGRyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAvLyBUT0RPOiBSZWZhY3RvclxuICAgIHB1YmxpYyBnZXQgaW5FZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgY29uc3QgZWRpdFJvd1N0YXRlID0gdGhpcy5jcnVkU2VydmljZS5yb3c7XG4gICAgICAgICAgICByZXR1cm4gKGVkaXRSb3dTdGF0ZSAmJiBlZGl0Um93U3RhdGUuaWQgPT09IHRoaXMucm93SUQpIHx8IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBncmlkIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHJvdy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBoYW5kbGVSb3dTZWxlY3Rpb24oZXZlbnQpIHtcbiAgICAgKiAgLy8gdGhlIGdyaWQgb24gd2hpY2ggdGhlIG9uUm93U2VsZWN0aW9uQ2hhbmdlIGV2ZW50IHdhcyB0cmlnZ2VyZWRcbiAgICAgKiAgY29uc3QgZ3JpZCA9IGV2ZW50LnJvdy5ncmlkO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkXG4gICAgICogICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgICogICAgKG9uUm93U2VsZWN0aW9uQ2hhbmdlKT1cImhhbmRsZVJvd1NlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICogIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGdyaWQoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ3JpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBJRCBvZiB0aGUgcm93LlxuICAgICAqIEEgcm93IGluIHRoZSBncmlkIGlzIGlkZW50aWZpZWQgZWl0aGVyIGJ5OlxuICAgICAqIC0gcHJpbWFyeUtleSBkYXRhIHZhbHVlLFxuICAgICAqIC0gdGhlIHdob2xlIHJvd0RhdGEsIGlmIHRoZSBwcmltYXJ5S2V5IGlzIG9taXR0ZWQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHJvd0lEID0gdGhpcy5ncmlkLnNlbGVjdGVkUm93c1syXS5yb3dJRDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0lEKCkge1xuICAgICAgICBjb25zdCBwcmltYXJ5S2V5ID0gdGhpcy5ncmlkLnByaW1hcnlLZXk7XG4gICAgICAgIHJldHVybiBwcmltYXJ5S2V5ID8gdGhpcy5fcm93RGF0YVtwcmltYXJ5S2V5XSA6IHRoaXMuX3Jvd0RhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG5hdGl2ZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHJvdy4gQ291bGQgYmUgbnVsbCBpbiBjZXJ0YWluIGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIG5hdGl2ZUVsZW1lbnQgb2YgdGhlIHNlY29uZCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dOYXRpdmVFbGVtZW50ID0gdGhpcy5ncmlkLnNlbGVjdGVkUm93c1sxXS5uYXRpdmVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c2VkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlZmF1bHRDc3NDbGFzcyA9ICdpZ3gtZ3JpZF9fdHInO1xuXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxUPixcbiAgICAgICAgcHVibGljIGNydWRTZXJ2aWNlOiBJZ3hHcmlkQ1JVRFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5yb3dTZWxlY3Rpb24gPT09ICdub25lJyB8fCB0aGlzLmRlbGV0ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB0aGlzLmdyaWQucm93U2VsZWN0aW9uID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0TXVsdGlwbGVSb3dzKHRoaXMucm93SUQsIHRoaXMucm93RGF0YSwgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSb3dCeUlkKHRoaXMucm93SUQsICFldmVudC5jdHJsS2V5LCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvblJvd1NlbGVjdG9yQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB0aGlzLmdyaWQucm93U2VsZWN0aW9uID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0TXVsdGlwbGVSb3dzKHRoaXMucm93SUQsIHRoaXMucm93RGF0YSwgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPyB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RSb3codGhpcy5yb3dJRCwgZXZlbnQpIDpcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdFJvd0J5SWQodGhpcy5yb3dJRCwgZmFsc2UsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzcGVjaWZpZWQgcm93IG9iamVjdCBhbmQgdGhlIGRhdGEgc291cmNlIHJlY29yZCB3aXRoIHRoZSBwYXNzZWQgdmFsdWUuXG4gICAgICogVGhpcyBtZXRob2QgZW1pdHMgYG9uRWRpdERvbmVgIGV2ZW50LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHVwZGF0ZSB0aGUgc2Vjb25kIHNlbGVjdGVkIHJvdydzIHZhbHVlXG4gICAgICogbGV0IG5ld1ZhbHVlID0gXCJBcHBsZVwiO1xuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3NbMV0udXBkYXRlKG5ld1ZhbHVlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY3J1ZFNlcnZpY2UgPSB0aGlzLmNydWRTZXJ2aWNlO1xuICAgICAgICBpZiAoY3J1ZFNlcnZpY2UuaW5FZGl0TW9kZSAmJiBjcnVkU2VydmljZS5jZWxsLmlkLnJvd0lEID09PSB0aGlzLnJvd0lEKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93ID0gbmV3IElneFJvdyh0aGlzLnJvd0lELCB0aGlzLmluZGV4LCB0aGlzLnJvd0RhdGEpO1xuICAgICAgICB0aGlzLmdyaWRBUEkudXBkYXRlX3Jvdyhyb3csIHZhbHVlKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHJvdyBmcm9tIHRoZSBncmlkJ3MgZGF0YSBzb3VyY2UuXG4gICAgICogVGhpcyBtZXRob2QgZW1pdHMgYG9uUm93RGVsZXRlZGAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZGVsZXRlIHRoZSB0aGlyZCBzZWxlY3RlZCByb3cgZnJvbSB0aGUgZ3JpZFxuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3NbMl0uZGVsZXRlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICAgICAgdGhpcy5ncmlkLmRlbGV0ZVJvd0J5SWQodGhpcy5yb3dJRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCByb3dDaGVja2JveEFyaWFMYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5wcmltYXJ5S2V5ID9cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPyAnRGVzZWxlY3Qgcm93IHdpdGgga2V5ICcgKyB0aGlzLnJvd0lEIDogJ1NlbGVjdCByb3cgd2l0aCBrZXkgJyArIHRoaXMucm93SUQgOlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA/ICdEZXNlbGVjdCByb3cnIDogJ1NlbGVjdCByb3cnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlc29sdmVDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGluZGV4Q2xhc3MgPSB0aGlzLmluZGV4ICUgMiA/IHRoaXMuZ3JpZC5ldmVuUm93Q1NTIDogdGhpcy5ncmlkLm9kZFJvd0NTUztcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDbGFzcyA9IHRoaXMuc2VsZWN0ZWQgPyAnaWd4LWdyaWRfX3RyLS1zZWxlY3RlZCcgOiAnJztcbiAgICAgICAgY29uc3QgZWRpdENsYXNzID0gdGhpcy5pbkVkaXRNb2RlID8gJ2lneC1ncmlkX190ci0tZWRpdCcgOiAnJztcbiAgICAgICAgY29uc3QgZGlydHlDbGFzcyA9IHRoaXMuZGlydHkgPyAnaWd4LWdyaWRfX3RyLS1lZGl0ZWQnIDogJyc7XG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDbGFzcyA9IHRoaXMuZGVsZXRlZCA/ICdpZ3gtZ3JpZF9fdHItLWRlbGV0ZWQnIDogJyc7XG4gICAgICAgIGNvbnN0IG1ybENsYXNzID0gdGhpcy5ncmlkLmhhc0NvbHVtbkxheW91dHMgPyAnaWd4LWdyaWRfX3RyLS1tcmwnIDogJyc7XG4gICAgICAgIGNvbnN0IGRyYWdDbGFzcyA9IHRoaXMuZHJhZ2dpbmcgPyAnaWd4LWdyaWRfX3RyLS1kcmFnJyA6ICcnO1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5kZWZhdWx0Q3NzQ2xhc3N9ICR7aW5kZXhDbGFzc30gJHtzZWxlY3RlZENsYXNzfSAke2VkaXRDbGFzc30gJHtkaXJ0eUNsYXNzfVxuICAgICAgICAgJHtkZWxldGVkQ2xhc3N9ICR7bXJsQ2xhc3N9ICR7ZHJhZ0NsYXNzfWAudHJpbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc29sdmVEcmFnSW5kaWNhdG9yQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkZWZhdWx0RHJhZ0luZGljYXRvckNzc0NsYXNzID0gJ2lneC1ncmlkX19kcmFnLWluZGljYXRvcic7XG4gICAgICAgIGNvbnN0IGRyYWdJbmRpY2F0b3JPZmYgPSB0aGlzLmdyaWQucm93RHJhZ2dpbmcgJiYgIXRoaXMuZHJhZ2dpbmcgPyAnaWd4LWdyaWRfX2RyYWctaW5kaWNhdG9yLS1vZmYnIDogJyc7XG4gICAgICAgIHJldHVybiBgJHtkZWZhdWx0RHJhZ0luZGljYXRvckNzc0NsYXNzfSAke2RyYWdJbmRpY2F0b3JPZmZ9YDtcbiAgICB9XG59XG4iXX0=