UNPKG

@catull/igniteui-angular

Version:

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

372 lines 32.6 kB
import { __decorate, __extends, __metadata, __values } from "tslib"; import { ChangeDetectorRef, HostBinding, Input, OnDestroy, Directive } from '@angular/core'; import { IgxStringFilteringOperand } from '../data-operations/filtering-condition'; import { FilteringExpressionsTree } from '../data-operations/filtering-expressions-tree'; import { FilteringLogic } from '../data-operations/filtering-expression.interface'; import { FilteringStrategy } from '../data-operations/filtering-strategy'; import { ColumnDisplayOrder } from './common/enums'; var CustomFilteringStrategy = /** @class */ (function (_super) { __extends(CustomFilteringStrategy, _super); function CustomFilteringStrategy() { return _super !== null && _super.apply(this, arguments) || this; } CustomFilteringStrategy.prototype.filter = function (data, expressionsTree) { var _this = this; var res = []; data.forEach(function (item) { if (_this.matchRecord(item, expressionsTree.filteringOperands[0])) { res.push(item); } else if (item.column.columnGroup) { if (item.column.allChildren.findIndex(function (child) { return _this.matchRecord(child, expressionsTree.filteringOperands[1]) || _this.matchRecord(child, expressionsTree.filteringOperands[2]); }) > -1) { res.push(item); } } }); return res; }; return CustomFilteringStrategy; }(FilteringStrategy)); /** @hidden */ var ColumnChooserBaseDirective = /** @class */ (function () { function ColumnChooserBaseDirective(cdr) { this.cdr = cdr; /** * Hides/ shows the filtering columns input from the UI. */ this.disableFilter = false; /** * Access to the columnHidingUI: * ```typescript * @ViewChild('column-hiding-component') * public columnHidingUI: IgxColumnHidingComponent; * ``` * Sets/gets the max height of the column area. * ```typescript * let columnsAreaMaxHeight = this.columnHidingUI.columnsAreaMaxHeight; * ``` * * ```html * <igx-column-hiding [columnsAreaMaxHeight]="200px"></igx-column-hiding> * ``` */ this.columnsAreaMaxHeight = '100%'; /** * Sets/Gets the css class selector. * By default the value of the `class` attribute is `"igx-column-hiding"`. * ```typescript * let cssCLass = this.columnHidingUI.cssClass; * ``` * ```typescript * this.columnHidingUI.cssClass = 'column-chooser'; * ``` */ this.cssClass = 'igx-column-hiding'; /** *@hidden */ this._currentColumns = []; /** *@hidden */ this._gridColumns = []; /** *@hidden */ this._rawColumns = []; /** *@hidden */ this._columnDisplayOrder = ColumnDisplayOrder.DisplayOrder; /** *@hidden */ this._filterCriteria = ''; /** *@hidden */ this._filterColumnsPrompt = ''; /** *@hidden */ this._title = ''; } Object.defineProperty(ColumnChooserBaseDirective.prototype, "columns", { /** * Gets the grid columns that are going to be manipulated. * ```typescript * let gridColumns = this.columnHidingUI.columns; * ``` */ get: function () { return this._gridColumns; }, /** * Sets the the grid columns that are going to be manipulated. * ```html * <igx-column-hiding [columns]="grid.columns"></igx-column-hiding> * ``` */ set: function (value) { if (value) { this._gridColumns = value; this.createColumnItems(); if (this.filterCriteria) { this.filter(); } } }, enumerable: true, configurable: true }); Object.defineProperty(ColumnChooserBaseDirective.prototype, "title", { /** * Sets/gets the title of the column chooser. * ```typescript * let title = this.columnHidingUI.title; * ``` */ get: function () { return this._title; }, /** * ```html * <igx-column-hiding [title]="'IgxColumnHidingComponent Title'"></igx-column-hiding> * ``` */ set: function (value) { this._title = (value) ? value : ''; }, enumerable: true, configurable: true }); Object.defineProperty(ColumnChooserBaseDirective.prototype, "filterColumnsPrompt", { /** * Gets the prompt that is displayed in the filter input. * ```typescript * let filterColumnsPrompt = this.columnHidingUI.filterColumnsPrompt; * ``` */ get: function () { return this._filterColumnsPrompt; }, /** * Sets the prompt that is going to be displayed in the filter input. * ```html * <igx-column-hiding [filterColumnsPrompt]="'Type here to search'"></igx-column-hiding> * ``` */ set: function (value) { this._filterColumnsPrompt = (value) ? value : ''; }, enumerable: true, configurable: true }); Object.defineProperty(ColumnChooserBaseDirective.prototype, "columnItems", { /** * Gets the items of the selected columns. * ```typescript * let columnItems = this.columnHidingUI.columnItems; * ``` */ get: function () { return this._currentColumns; }, enumerable: true, configurable: true }); Object.defineProperty(ColumnChooserBaseDirective.prototype, "filterCriteria", { /** * Gets the value which filters the columns list. * ```typescript * let filterCriteria = this.columnHidingUI.filterCriteria; * ``` */ get: function () { return this._filterCriteria; }, /** * Sets the value which filters the columns list. * ```html * <igx-column-hiding [filterCriteria]="'ID'"></igx-column-hiding> * ``` */ set: function (value) { if (!value || value.length === 0) { this.clearFiltering(); this._filterCriteria = ''; this.cdr.detectChanges(); return; } else if (this._filterCriteria && this._filterCriteria.length > value.length) { this.clearFiltering(); } this._filterCriteria = value; this.filter(); this.cdr.detectChanges(); }, enumerable: true, configurable: true }); Object.defineProperty(ColumnChooserBaseDirective.prototype, "columnDisplayOrder", { /** * Gets the display order of the columns. * ```typescript * let columnDisplayOrder = this.columnHidingUI.columnDisplayOrder; * ``` */ get: function () { return this._columnDisplayOrder; }, /** * Sets the display order of the columns. * ```typescript * this.columnHidingUI.columnDisplayOrder = ColumnDisplayOrder.Alphabetical; * ``` */ set: function (value) { if (value !== undefined) { this.orderColumns(value); if (this._filterCriteria.length > 0) { this.filter(); } } }, enumerable: true, configurable: true }); /** *@hidden */ ColumnChooserBaseDirective.prototype.ngOnDestroy = function () { var e_1, _a; try { for (var _b = __values(this._currentColumns), _c = _b.next(); !_c.done; _c = _b.next()) { var item = _c.value; item.valueChanged.unsubscribe(); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; /** *@hidden */ ColumnChooserBaseDirective.prototype.createColumnItems = function () { var _this = this; if (this._gridColumns.length > 0) { this._rawColumns = []; this._gridColumns.forEach(function (column) { var item = _this.createColumnItem(_this, column); if (item) { _this._rawColumns.push(item); } }); this._currentColumns = this._rawColumns.slice(0); this.orderColumns(this._columnDisplayOrder); } }; /** *@hidden */ ColumnChooserBaseDirective.prototype.orderColumns = function (value) { this._columnDisplayOrder = value; if (value === ColumnDisplayOrder[ColumnDisplayOrder.Alphabetical] || value === ColumnDisplayOrder.Alphabetical) { this._currentColumns = this._rawColumns.slice(0).sort(function (current, next) { return current.name.toLowerCase().localeCompare(next.name.toLowerCase()); }); } else { this._currentColumns = this._rawColumns; } }; /** *@hidden */ ColumnChooserBaseDirective.prototype.filter = function () { var filteringExpressionsTree = new FilteringExpressionsTree(FilteringLogic.Or); filteringExpressionsTree.filteringOperands.push(this.createFilteringExpression('name')); filteringExpressionsTree.filteringOperands.push(this.createFilteringExpression('field')); filteringExpressionsTree.filteringOperands.push(this.createFilteringExpression('header')); var strategy = new CustomFilteringStrategy(); this._currentColumns = strategy.filter(this._currentColumns, filteringExpressionsTree); }; /** *@hidden */ ColumnChooserBaseDirective.prototype.createFilteringExpression = function (fieldName) { return { condition: IgxStringFilteringOperand.instance().condition('contains'), fieldName: fieldName, ignoreCase: true, searchVal: this._filterCriteria }; }; /** *@hidden */ ColumnChooserBaseDirective.prototype.clearFiltering = function () { this.createColumnItems(); }; ColumnChooserBaseDirective.ctorParameters = function () { return [ { type: ChangeDetectorRef } ]; }; __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], ColumnChooserBaseDirective.prototype, "columns", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], ColumnChooserBaseDirective.prototype, "title", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], ColumnChooserBaseDirective.prototype, "filterColumnsPrompt", null); __decorate([ Input(), __metadata("design:type", Object) ], ColumnChooserBaseDirective.prototype, "disableFilter", void 0); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], ColumnChooserBaseDirective.prototype, "columnItems", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], ColumnChooserBaseDirective.prototype, "filterCriteria", null); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], ColumnChooserBaseDirective.prototype, "columnDisplayOrder", null); __decorate([ Input(), __metadata("design:type", Object) ], ColumnChooserBaseDirective.prototype, "columnsAreaMaxHeight", void 0); __decorate([ HostBinding('attr.class'), __metadata("design:type", Object) ], ColumnChooserBaseDirective.prototype, "cssClass", void 0); ColumnChooserBaseDirective = __decorate([ Directive(), __metadata("design:paramtypes", [ChangeDetectorRef]) ], ColumnChooserBaseDirective); return ColumnChooserBaseDirective; }()); export { ColumnChooserBaseDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWNob29zZXItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvY29sdW1uLWNob29zZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQTZCLE1BQU0sK0NBQStDLENBQUM7QUFDcEgsT0FBTyxFQUFFLGNBQWMsRUFBd0IsTUFBTSxtREFBbUQsQ0FBQztBQUN6RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRDtJQUFzQywyQ0FBaUI7SUFBdkQ7O0lBaUJBLENBQUM7SUFoQlUsd0NBQU0sR0FBYixVQUFjLElBQVcsRUFBRSxlQUEwQztRQUFyRSxpQkFlQztRQWRHLElBQU0sR0FBRyxHQUFxQyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLElBQW9DO1lBQzlDLElBQUksS0FBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBeUIsQ0FBQyxFQUFFO2dCQUN0RixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xCO2lCQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQUMsS0FBSztvQkFDeEMsT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUF5QixDQUFDO3dCQUNyRixLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUF5QixDQUFDO2dCQURyRixDQUNxRixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQzdGLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2xCO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNMLDhCQUFDO0FBQUQsQ0FBQyxBQWpCRCxDQUFzQyxpQkFBaUIsR0FpQnREO0FBRUQsY0FBYztBQUVkO0lBZ01JLG9DQUFtQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWhJekM7O1dBRUc7UUFFSSxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQWtFN0I7Ozs7Ozs7Ozs7Ozs7O1dBY0c7UUFFSSx5QkFBb0IsR0FBRyxNQUFNLENBQUM7UUFDckM7Ozs7Ozs7OztXQVNHO1FBRUksYUFBUSxHQUFHLG1CQUFtQixDQUFDO1FBQ3RDOztXQUVHO1FBQ0ssb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDN0I7O1dBRUc7UUFDSyxpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUMxQjs7V0FFRztRQUNLLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3pCOztXQUVHO1FBQ0ssd0JBQW1CLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDO1FBQzlEOztXQUVHO1FBQ0ssb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDN0I7O1dBRUc7UUFDSyx5QkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDbEM7O1dBRUc7UUFDSyxXQUFNLEdBQUcsRUFBRSxDQUFDO0lBR3BCLENBQUM7SUF4TEQsc0JBQUksK0NBQU87UUFSWDs7Ozs7V0FLRzthQUdIO1lBQ0ksT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzdCLENBQUM7UUFDRDs7Ozs7V0FLRzthQUNILFVBQVksS0FBSztZQUNiLElBQUksS0FBSyxFQUFFO2dCQUNQLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUNyQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQ2pCO2FBQ0o7UUFDTCxDQUFDOzs7T0FmQTtJQXVCRCxzQkFBSSw2Q0FBSztRQVBUOzs7OztXQUtHO2FBRUg7WUFDSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQztRQUNEOzs7O1dBSUc7YUFDSCxVQUFVLEtBQUs7WUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7OztPQVJBO0lBZ0JELHNCQUFJLDJEQUFtQjtRQVB2Qjs7Ozs7V0FLRzthQUVIO1lBQ0ksT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckMsQ0FBQztRQUNEOzs7OztXQUtHO2FBQ0gsVUFBd0IsS0FBSztZQUN6QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckQsQ0FBQzs7O09BVEE7SUFzQkQsc0JBQUksbURBQVc7UUFQZjs7Ozs7V0FLRzthQUVIO1lBQ0ksT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2hDLENBQUM7OztPQUFBO0lBUUQsc0JBQUksc0RBQWM7UUFQbEI7Ozs7O1dBS0c7YUFFSDtZQUNJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNoQyxDQUFDO1FBRUQ7Ozs7O1dBS0c7YUFDSCxVQUFtQixLQUFLO1lBQ3BCLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLE9BQU87YUFDVjtpQkFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDM0UsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO1lBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDOzs7T0FyQkE7SUE2QkQsc0JBQUksMERBQWtCO1FBUHRCOzs7OztXQUtHO2FBRUg7WUFDSSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNwQyxDQUFDO1FBQ0Q7Ozs7O1dBS0c7YUFDSCxVQUF1QixLQUF5QjtZQUM1QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNqQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQ2pCO2FBQ0o7UUFDTCxDQUFDOzs7T0FkQTtJQTJFRDs7T0FFRztJQUNILGdEQUFXLEdBQVg7OztZQUNJLEtBQW1CLElBQUEsS0FBQSxTQUFBLElBQUksQ0FBQyxlQUFlLENBQUEsZ0JBQUEsNEJBQUU7Z0JBQXBDLElBQU0sSUFBSSxXQUFBO2dCQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDbkM7Ozs7Ozs7OztJQUNMLENBQUM7SUFDRDs7T0FFRztJQUNLLHNEQUFpQixHQUF6QjtRQUFBLGlCQVlDO1FBWEcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBQyxNQUFNO2dCQUM3QixJQUFNLElBQUksR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLElBQUksRUFBRTtvQkFDTixLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0I7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFLRDs7T0FFRztJQUNLLGlEQUFZLEdBQXBCLFVBQXFCLEtBQUs7UUFDdEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLEtBQUssS0FBSyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7WUFDN0QsS0FBSyxLQUFLLGtCQUFrQixDQUFDLFlBQVksRUFBRTtZQUMzQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLE9BQU8sRUFBRSxJQUFJO2dCQUNoRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM3RSxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDM0M7SUFDTCxDQUFDO0lBQ0Q7O09BRUc7SUFDTywyQ0FBTSxHQUFoQjtRQUNJLElBQU0sd0JBQXdCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakYsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN6Rix3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFMUYsSUFBTSxRQUFRLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNEOztPQUVHO0lBQ08sOERBQXlCLEdBQW5DLFVBQW9DLFNBQWlCO1FBQ2pELE9BQU87WUFDSCxTQUFTLEVBQUUseUJBQXlCLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNyRSxTQUFTLEVBQUUsU0FBUztZQUNwQixVQUFVLEVBQUUsSUFBSTtZQUNoQixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWU7U0FDbEMsQ0FBQztJQUNOLENBQUM7SUFDRDs7T0FFRztJQUNPLG1EQUFjLEdBQXhCO1FBQ0ksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0IsQ0FBQzs7Z0JBeEV1QixpQkFBaUI7O0lBdkx6QztRQURDLEtBQUssRUFBRTs7OzZEQUdQO0lBdUJEO1FBREMsS0FBSyxFQUFFOzs7MkRBR1A7SUFnQkQ7UUFEQyxLQUFLLEVBQUU7Ozt5RUFHUDtJQWNEO1FBREMsS0FBSyxFQUFFOztxRUFDcUI7SUFRN0I7UUFEQyxLQUFLLEVBQUU7OztpRUFHUDtJQVFEO1FBREMsS0FBSyxFQUFFOzs7b0VBR1A7SUE2QkQ7UUFEQyxLQUFLLEVBQUU7Ozt3RUFHUDtJQStCRDtRQURDLEtBQUssRUFBRTs7NEVBQzZCO0lBWXJDO1FBREMsV0FBVyxDQUFDLFlBQVksQ0FBQzs7Z0VBQ1k7SUFsS3BCLDBCQUEwQjtRQUQvQyxTQUFTLEVBQUU7eUNBaU1nQixpQkFBaUI7T0FoTXZCLDBCQUEwQixDQXlRL0M7SUFBRCxpQ0FBQztDQUFBLEFBelFELElBeVFDO1NBelFxQiwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdMb2dpYywgSUZpbHRlcmluZ0V4cHJlc3Npb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbHRlcmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBDb2x1bW5DaG9vc2VySXRlbUJhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2NvbHVtbi1jaG9vc2VyLWl0ZW0tYmFzZSc7XG5pbXBvcnQgeyBDb2x1bW5EaXNwbGF5T3JkZXIgfSBmcm9tICcuL2NvbW1vbi9lbnVtcyc7XG5cbmNsYXNzIEN1c3RvbUZpbHRlcmluZ1N0cmF0ZWd5IGV4dGVuZHMgRmlsdGVyaW5nU3RyYXRlZ3kge1xuICAgIHB1YmxpYyBmaWx0ZXIoZGF0YTogYW55W10sIGV4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk6IGFueVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiBDb2x1bW5DaG9vc2VySXRlbUJhc2VEaXJlY3RpdmVbXSA9IFtdO1xuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW06IENvbHVtbkNob29zZXJJdGVtQmFzZURpcmVjdGl2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hSZWNvcmQoaXRlbSwgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzWzBdIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbHVtbi5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbHVtbi5hbGxDaGlsZHJlbi5maW5kSW5kZXgoKGNoaWxkKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoUmVjb3JkKGNoaWxkLCBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHNbMV0gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb24pIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hSZWNvcmQoY2hpbGQsIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kc1syXSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbikpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cblxuLyoqIEBoaWRkZW4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbHVtbkNob29zZXJCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBncmlkIGNvbHVtbnMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgbWFuaXB1bGF0ZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBncmlkQ29sdW1ucyA9IHRoaXMuY29sdW1uSGlkaW5nVUkuY29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncmlkQ29sdW1ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGhlIGdyaWQgY29sdW1ucyB0aGF0IGFyZSBnb2luZyB0byBiZSBtYW5pcHVsYXRlZC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4taGlkaW5nIFtjb2x1bW5zXT1cImdyaWQuY29sdW1uc1wiPjwvaWd4LWNvbHVtbi1oaWRpbmc+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IGNvbHVtbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9ncmlkQ29sdW1ucyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDb2x1bW5JdGVtcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdGl0bGUgb2YgdGhlIGNvbHVtbiBjaG9vc2VyLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGl0bGUgPSAgdGhpcy5jb2x1bW5IaWRpbmdVSS50aXRsZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4taGlkaW5nIFt0aXRsZV09XCInSWd4Q29sdW1uSGlkaW5nQ29tcG9uZW50IFRpdGxlJ1wiPjwvaWd4LWNvbHVtbi1oaWRpbmc+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IHRpdGxlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gKHZhbHVlKSA/IHZhbHVlIDogJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb21wdCB0aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgZmlsdGVyIGlucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZmlsdGVyQ29sdW1uc1Byb21wdCA9ICB0aGlzLmNvbHVtbkhpZGluZ1VJLmZpbHRlckNvbHVtbnNQcm9tcHQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZmlsdGVyQ29sdW1uc1Byb21wdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbHVtbnNQcm9tcHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb21wdCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZmlsdGVyIGlucHV0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbi1oaWRpbmcgW2ZpbHRlckNvbHVtbnNQcm9tcHRdPVwiJ1R5cGUgaGVyZSB0byBzZWFyY2gnXCI+PC9pZ3gtY29sdW1uLWhpZGluZz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZXQgZmlsdGVyQ29sdW1uc1Byb21wdCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zUHJvbXB0ID0gKHZhbHVlKSA/IHZhbHVlIDogJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhpZGVzLyBzaG93cyB0aGUgZmlsdGVyaW5nIGNvbHVtbnMgaW5wdXQgZnJvbSB0aGUgVUkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZUZpbHRlciA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGl0ZW1zIG9mIHRoZSBzZWxlY3RlZCBjb2x1bW5zLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uSXRlbXMgPSAgdGhpcy5jb2x1bW5IaWRpbmdVSS5jb2x1bW5JdGVtcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBjb2x1bW5JdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDb2x1bW5zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSB3aGljaCBmaWx0ZXJzIHRoZSBjb2x1bW5zIGxpc3QuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBmaWx0ZXJDcml0ZXJpYSA9ICB0aGlzLmNvbHVtbkhpZGluZ1VJLmZpbHRlckNyaXRlcmlhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGZpbHRlckNyaXRlcmlhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ3JpdGVyaWE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgd2hpY2ggZmlsdGVycyB0aGUgY29sdW1ucyBsaXN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1jb2x1bW4taGlkaW5nIFtmaWx0ZXJDcml0ZXJpYV09XCInSUQnXCI+PC9pZ3gtY29sdW1uLWhpZGluZz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZXQgZmlsdGVyQ3JpdGVyaWEodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGaWx0ZXJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlckNyaXRlcmlhID0gJyc7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZmlsdGVyQ3JpdGVyaWEgJiYgdGhpcy5fZmlsdGVyQ3JpdGVyaWEubGVuZ3RoID4gdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyRmlsdGVyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maWx0ZXJDcml0ZXJpYSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGNvbHVtbnMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5EaXNwbGF5T3JkZXIgID0gIHRoaXMuY29sdW1uSGlkaW5nVUkuY29sdW1uRGlzcGxheU9yZGVyO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGNvbHVtbkRpc3BsYXlPcmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkRpc3BsYXlPcmRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgY29sdW1ucy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW5IaWRpbmdVSS5jb2x1bW5EaXNwbGF5T3JkZXIgPSBDb2x1bW5EaXNwbGF5T3JkZXIuQWxwaGFiZXRpY2FsO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHNldCBjb2x1bW5EaXNwbGF5T3JkZXIodmFsdWU6IENvbHVtbkRpc3BsYXlPcmRlcikge1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5vcmRlckNvbHVtbnModmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbHRlckNyaXRlcmlhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VzcyB0byB0aGUgY29sdW1uSGlkaW5nVUk6XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ2NvbHVtbi1oaWRpbmctY29tcG9uZW50JylcbiAgICAgKiAgcHVibGljIGNvbHVtbkhpZGluZ1VJOiBJZ3hDb2x1bW5IaWRpbmdDb21wb25lbnQ7XG4gICAgICogYGBgXG4gICAgICogU2V0cy9nZXRzIHRoZSBtYXggaGVpZ2h0IG9mIHRoZSBjb2x1bW4gYXJlYS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbnNBcmVhTWF4SGVpZ2h0ID0gIHRoaXMuY29sdW1uSGlkaW5nVUkuY29sdW1uc0FyZWFNYXhIZWlnaHQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4taGlkaW5nIFtjb2x1bW5zQXJlYU1heEhlaWdodF09XCIyMDBweFwiPjwvaWd4LWNvbHVtbi1oaWRpbmc+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sdW1uc0FyZWFNYXhIZWlnaHQgPSAnMTAwJSc7XG4gICAgLyoqXG4gICAgICogU2V0cy9HZXRzIHRoZSBjc3MgY2xhc3Mgc2VsZWN0b3IuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgdmFsdWUgb2YgdGhlIGBjbGFzc2AgYXR0cmlidXRlIGlzIGBcImlneC1jb2x1bW4taGlkaW5nXCJgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY3NzQ0xhc3MgPSAgdGhpcy5jb2x1bW5IaWRpbmdVSS5jc3NDbGFzcztcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW5IaWRpbmdVSS5jc3NDbGFzcyA9ICdjb2x1bW4tY2hvb3Nlcic7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmNsYXNzJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNvbHVtbi1oaWRpbmcnO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2N1cnJlbnRDb2x1bW5zID0gW107XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ3JpZENvbHVtbnMgPSBbXTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9yYXdDb2x1bW5zID0gW107XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY29sdW1uRGlzcGxheU9yZGVyID0gQ29sdW1uRGlzcGxheU9yZGVyLkRpc3BsYXlPcmRlcjtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9maWx0ZXJDcml0ZXJpYSA9ICcnO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbHRlckNvbHVtbnNQcm9tcHQgPSAnJztcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF90aXRsZSA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9jdXJyZW50Q29sdW1ucykge1xuICAgICAgICAgICAgaXRlbS52YWx1ZUNoYW5nZWQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNvbHVtbkl0ZW1zKCkge1xuICAgICAgICBpZiAodGhpcy5fZ3JpZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fcmF3Q29sdW1ucyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZ3JpZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY3JlYXRlQ29sdW1uSXRlbSh0aGlzLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jhd0NvbHVtbnMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRDb2x1bW5zID0gdGhpcy5fcmF3Q29sdW1ucy5zbGljZSgwKTtcbiAgICAgICAgICAgIHRoaXMub3JkZXJDb2x1bW5zKHRoaXMuX2NvbHVtbkRpc3BsYXlPcmRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUNvbHVtbkl0ZW0oY29udGFpbmVyOiBhbnksIGNvbHVtbjogYW55KTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIG9yZGVyQ29sdW1ucyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jb2x1bW5EaXNwbGF5T3JkZXIgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBDb2x1bW5EaXNwbGF5T3JkZXJbQ29sdW1uRGlzcGxheU9yZGVyLkFscGhhYmV0aWNhbF0gfHxcbiAgICAgICAgICAgIHZhbHVlID09PSBDb2x1bW5EaXNwbGF5T3JkZXIuQWxwaGFiZXRpY2FsKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50Q29sdW1ucyA9IHRoaXMuX3Jhd0NvbHVtbnMuc2xpY2UoMCkuc29ydCgoY3VycmVudCwgbmV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50Lm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKG5leHQubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudENvbHVtbnMgPSB0aGlzLl9yYXdDb2x1bW5zO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmaWx0ZXIoKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaCh0aGlzLmNyZWF0ZUZpbHRlcmluZ0V4cHJlc3Npb24oJ25hbWUnKSk7XG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHRoaXMuY3JlYXRlRmlsdGVyaW5nRXhwcmVzc2lvbignZmllbGQnKSk7XG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHRoaXMuY3JlYXRlRmlsdGVyaW5nRXhwcmVzc2lvbignaGVhZGVyJykpO1xuXG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gbmV3IEN1c3RvbUZpbHRlcmluZ1N0cmF0ZWd5KCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRDb2x1bW5zID0gc3RyYXRlZ3kuZmlsdGVyKHRoaXMuX2N1cnJlbnRDb2x1bW5zLCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlRmlsdGVyaW5nRXhwcmVzc2lvbihmaWVsZE5hbWU6IHN0cmluZyk6IElGaWx0ZXJpbmdFeHByZXNzaW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbignY29udGFpbnMnKSxcbiAgICAgICAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgaWdub3JlQ2FzZTogdHJ1ZSxcbiAgICAgICAgICAgIHNlYXJjaFZhbDogdGhpcy5fZmlsdGVyQ3JpdGVyaWFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNsZWFyRmlsdGVyaW5nKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbkl0ZW1zKCk7XG4gICAgfVxufVxuXG5cbiJdfQ==