@alfresco/adf-content-services
Version:
Alfresco ADF content services
159 lines • 31.1 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, DestroyRef, inject, ViewEncapsulation } from '@angular/core';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { SearchFilterList } from '../../models/search-filter-list.model';
import { TranslationService } from '@alfresco/adf-core';
import { ReplaySubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import * as i0 from "@angular/core";
import * as i1 from "@alfresco/adf-core";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/checkbox";
import * as i4 from "@ngx-translate/core";
import * as i5 from "@angular/material/button";
import * as i6 from "@angular/material/icon";
export class SearchCheckListComponent {
constructor(translationService) {
this.translationService = translationService;
this.operator = 'OR';
this.pageSize = 5;
this.isActive = false;
this.enableChangeUpdate = true;
this.displayValue$ = new ReplaySubject(1);
this.destroyRef = inject(DestroyRef);
this.options = new SearchFilterList();
}
ngOnInit() {
if (this.settings) {
this.operator = this.settings.operator || 'OR';
this.pageSize = this.settings.pageSize || 5;
if (this.settings.options && this.settings.options.length > 0) {
this.options = new SearchFilterList(this.settings.options, this.pageSize);
}
this.enableChangeUpdate = this.settings.allowUpdateOnChange ?? true;
}
if (this.startValue) {
this.setValue(this.startValue);
}
else {
if (this.id && this.context) {
this.context.queryFragments[this.id] = '';
}
}
this.context.populateFilters
.asObservable()
.pipe(map((filtersQueries) => filtersQueries[this.id]), takeUntilDestroyed(this.destroyRef))
.subscribe((filterQuery) => {
if (filterQuery) {
filterQuery.forEach((value) => {
const option = this.options.items.find((searchListOption) => searchListOption.value === value);
if (option) {
option.checked = true;
}
});
this.submitValues(false);
}
else {
this.reset(false);
}
this.context.filterLoaded.next();
});
}
clear() {
this.isActive = false;
this.clearOptions();
if (this.id && this.context && this.enableChangeUpdate) {
this.updateDisplayValue();
this.context.update();
}
}
clearOptions() {
this.options.items.forEach((opt) => {
opt.checked = false;
});
if (this.id && this.context) {
this.context.queryFragments[this.id] = '';
this.context.filterRawParams[this.id] = undefined;
}
}
reset(updateContext = true) {
this.isActive = false;
this.clearOptions();
if (this.id && this.context) {
this.updateDisplayValue();
if (updateContext) {
this.context.update();
}
}
}
updateDisplayValue() {
const displayValue = this.options.items
.filter((option) => option.checked)
.map(({ name }) => this.translationService.instant(name))
.join(', ');
this.displayValue$.next(displayValue);
}
changeHandler(event, option) {
option.checked = event.checked;
const checkedValues = this.getCheckedValues();
this.isActive = !!checkedValues.length;
if (this.enableChangeUpdate) {
this.submitValues();
}
}
hasValidValue() {
const checkedValues = this.getCheckedValues();
return !!checkedValues.length;
}
getCurrentValue() {
return this.getCheckedValues();
}
setValue(value) {
this.options.items.filter((item) => value.includes(item.value)).map((item) => (item.checked = true));
this.submitValues();
}
getCheckedValues() {
return this.options.items.filter((option) => option.checked).map((option) => option.value);
}
submitValues(updateContext = true) {
const checkedValues = this.getCheckedValues();
if (checkedValues.length !== 0) {
this.context.filterRawParams[this.id] = checkedValues;
}
const query = checkedValues.join(` ${this.operator} `);
if (this.id && this.context) {
this.context.queryFragments[this.id] = query;
this.updateDisplayValue();
if (updateContext) {
this.context.update();
}
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchCheckListComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: SearchCheckListComponent, isStandalone: true, selector: "adf-search-check-list", host: { classAttribute: "adf-search-check-list" }, ngImport: i0, template: "<div class=\"checklist\">\n <mat-checkbox\n *ngFor=\"let option of options\"\n [checked]=\"option.checked\"\n labelPosition=\"before\"\n (keydown.enter)=\"option.checked = !option.checked\"\n [attr.data-automation-id]=\"'checkbox-' + (option.name)\"\n [attr.aria-label]=\"option.name | translate\"\n (change)=\"changeHandler($event, option)\"\n class=\"adf-facet-filter\">\n <div title=\"{{ option.name | translate }}\" class=\"adf-search-check-list-label\">\n {{ option.name | translate }}\n </div>\n\n </mat-checkbox>\n</div>\n\n<div class=\"adf-facet-buttons\" *ngIf=\"options.fitsPage && !settings?.hideDefaultAction\">\n <button mat-button color=\"primary\" (click)=\"clear()\">\n {{ 'SEARCH.FILTER.ACTIONS.CLEAR-ALL' | translate }}\n </button>\n</div>\n\n<div class=\"adf-facet-buttons\" *ngIf=\"!options.fitsPage\">\n <button mat-icon-button\n title=\"{{ 'SEARCH.FILTER.ACTIONS.CLEAR-ALL' | translate }}\"\n (click)=\"clear()\">\n <mat-icon>clear</mat-icon>\n </button>\n <button mat-icon-button\n *ngIf=\"options.canShowLessItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-LESS' | translate }}\"\n (click)=\"options.showLessItems()\">\n <mat-icon>keyboard_arrow_up</mat-icon>\n </button>\n <button mat-icon-button\n *ngIf=\"options.canShowMoreItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-MORE' | translate }}\"\n (click)=\"options.showMoreItems()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n</div>\n", styles: [".adf-search-check-list>div{display:flex;flex-direction:column}.adf-search-check-list>div .adf-facet-filter{display:block}.adf-search-check-list>div .adf-facet-filter .adf-search-check-list-label{text-overflow:ellipsis;overflow:hidden;width:100%;-webkit-font-smoothing:subpixel-antialiased;margin-top:1px}.adf-search-check-list>div .adf-facet-filter .adf-facet-name{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.adf-search-check-list>div .adf-facet-filter .mdc-checkbox{margin-left:4px;margin-top:5px;margin-bottom:4px}.adf-search-check-list>div .adf-facet-filter label{padding-left:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchCheckListComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-search-check-list', standalone: true, imports: [CommonModule, MatCheckboxModule, TranslateModule, MatButtonModule, MatIconModule], encapsulation: ViewEncapsulation.None, host: { class: 'adf-search-check-list' }, template: "<div class=\"checklist\">\n <mat-checkbox\n *ngFor=\"let option of options\"\n [checked]=\"option.checked\"\n labelPosition=\"before\"\n (keydown.enter)=\"option.checked = !option.checked\"\n [attr.data-automation-id]=\"'checkbox-' + (option.name)\"\n [attr.aria-label]=\"option.name | translate\"\n (change)=\"changeHandler($event, option)\"\n class=\"adf-facet-filter\">\n <div title=\"{{ option.name | translate }}\" class=\"adf-search-check-list-label\">\n {{ option.name | translate }}\n </div>\n\n </mat-checkbox>\n</div>\n\n<div class=\"adf-facet-buttons\" *ngIf=\"options.fitsPage && !settings?.hideDefaultAction\">\n <button mat-button color=\"primary\" (click)=\"clear()\">\n {{ 'SEARCH.FILTER.ACTIONS.CLEAR-ALL' | translate }}\n </button>\n</div>\n\n<div class=\"adf-facet-buttons\" *ngIf=\"!options.fitsPage\">\n <button mat-icon-button\n title=\"{{ 'SEARCH.FILTER.ACTIONS.CLEAR-ALL' | translate }}\"\n (click)=\"clear()\">\n <mat-icon>clear</mat-icon>\n </button>\n <button mat-icon-button\n *ngIf=\"options.canShowLessItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-LESS' | translate }}\"\n (click)=\"options.showLessItems()\">\n <mat-icon>keyboard_arrow_up</mat-icon>\n </button>\n <button mat-icon-button\n *ngIf=\"options.canShowMoreItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-MORE' | translate }}\"\n (click)=\"options.showMoreItems()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n</div>\n", styles: [".adf-search-check-list>div{display:flex;flex-direction:column}.adf-search-check-list>div .adf-facet-filter{display:block}.adf-search-check-list>div .adf-facet-filter .adf-search-check-list-label{text-overflow:ellipsis;overflow:hidden;width:100%;-webkit-font-smoothing:subpixel-antialiased;margin-top:1px}.adf-search-check-list>div .adf-facet-filter .adf-facet-name{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.adf-search-check-list>div .adf-facet-filter .mdc-checkbox{margin-left:4px;margin-top:5px;margin-bottom:4px}.adf-search-check-list>div .adf-facet-filter label{padding-left:0}\n"] }]
}], ctorParameters: () => [{ type: i1.TranslationService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWNoZWNrLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9zZWFyY2gvY29tcG9uZW50cy9zZWFyY2gtY2hlY2stbGlzdC9zZWFyY2gtY2hlY2stbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3NlYXJjaC9jb21wb25lbnRzL3NlYXJjaC1jaGVjay1saXN0L3NlYXJjaC1jaGVjay1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBVSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQXFCLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFJbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQWlCaEUsTUFB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LElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxpQkFHNUUsaUJBQWlCLENBQUMsSUFBSSxRQUMvQixFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBpbmplY3QsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlLCBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IFNlYXJjaFdpZGdldCB9IGZyb20gJy4uLy4uL21vZGVscy9zZWFyY2gtd2lkZ2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWFyY2hXaWRnZXRTZXR0aW5ncyB9IGZyb20gJy4uLy4uL21vZGVscy9zZWFyY2gtd2lkZ2V0LXNldHRpbmdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VhcmNoLXF1ZXJ5LWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hGaWx0ZXJMaXN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NlYXJjaC1maWx0ZXItbGlzdC5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hMaXN0T3B0aW9uIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBjaGVja2VkOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1zZWFyY2gtY2hlY2stbGlzdCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRDaGVja2JveE1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtY2hlY2stbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VhcmNoLWNoZWNrLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHsgY2xhc3M6ICdhZGYtc2VhcmNoLWNoZWNrLWxpc3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQ2hlY2tMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgU2VhcmNoV2lkZ2V0LCBPbkluaXQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc2V0dGluZ3M/OiBTZWFyY2hXaWRnZXRTZXR0aW5ncztcbiAgICBjb250ZXh0PzogU2VhcmNoUXVlcnlCdWlsZGVyU2VydmljZTtcbiAgICBvcHRpb25zOiBTZWFyY2hGaWx0ZXJMaXN0PFNlYXJjaExpc3RPcHRpb24+O1xuICAgIG9wZXJhdG9yOiBzdHJpbmcgPSAnT1InO1xuICAgIHN0YXJ0VmFsdWU6IHN0cmluZztcbiAgICBwYWdlU2l6ZSA9IDU7XG4gICAgaXNBY3RpdmUgPSBmYWxzZTtcbiAgICBlbmFibGVDaGFuZ2VVcGRhdGUgPSB0cnVlO1xuICAgIGRpc3BsYXlWYWx1ZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBuZXcgU2VhcmNoRmlsdGVyTGlzdDxTZWFyY2hMaXN0T3B0aW9uPigpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncykge1xuICAgICAgICAgICAgdGhpcy5vcGVyYXRvciA9IHRoaXMuc2V0dGluZ3Mub3BlcmF0b3IgfHwgJ09SJztcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnNldHRpbmdzLnBhZ2VTaXplIHx8IDU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm9wdGlvbnMgJiYgdGhpcy5zZXR0aW5ncy5vcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBuZXcgU2VhcmNoRmlsdGVyTGlzdCh0aGlzLnNldHRpbmdzLm9wdGlvbnMsIHRoaXMucGFnZVNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbmFibGVDaGFuZ2VVcGRhdGUgPSB0aGlzLnNldHRpbmdzLmFsbG93VXBkYXRlT25DaGFuZ2UgPz8gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXJ0VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5zdGFydFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkICYmIHRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5xdWVyeUZyYWdtZW50c1t0aGlzLmlkXSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dC5wb3B1bGF0ZUZpbHRlcnNcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChmaWx0ZXJzUXVlcmllcykgPT4gZmlsdGVyc1F1ZXJpZXNbdGhpcy5pZF0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChmaWx0ZXJRdWVyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJRdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRdWVyeS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zLml0ZW1zLmZpbmQoKHNlYXJjaExpc3RPcHRpb24pID0+IHNlYXJjaExpc3RPcHRpb24udmFsdWUgPT09IHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdFZhbHVlcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maWx0ZXJMb2FkZWQubmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbGVhck9wdGlvbnMoKTtcbiAgICAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5jb250ZXh0ICYmIHRoaXMuZW5hYmxlQ2hhbmdlVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJPcHRpb25zKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMuZm9yRWFjaCgob3B0KSA9PiB7XG4gICAgICAgICAgICBvcHQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5pZCAmJiB0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5xdWVyeUZyYWdtZW50c1t0aGlzLmlkXSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbHRlclJhd1BhcmFtc1t0aGlzLmlkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0KHVwZGF0ZUNvbnRleHQgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbGVhck9wdGlvbnMoKTtcbiAgICAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5jb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQudXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVEaXNwbGF5VmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMub3B0aW9ucy5pdGVtc1xuICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uY2hlY2tlZClcbiAgICAgICAgICAgIC5tYXAoKHsgbmFtZSB9KSA9PiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5pbnN0YW50KG5hbWUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlJC5uZXh0KGRpc3BsYXlWYWx1ZSk7XG4gICAgfVxuXG4gICAgY2hhbmdlSGFuZGxlcihldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UsIG9wdGlvbjogYW55KSB7XG4gICAgICAgIG9wdGlvbi5jaGVja2VkID0gZXZlbnQuY2hlY2tlZDtcbiAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IHRoaXMuZ2V0Q2hlY2tlZFZhbHVlcygpO1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gISFjaGVja2VkVmFsdWVzLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlQ2hhbmdlVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzVmFsaWRWYWx1ZSgpIHtcbiAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IHRoaXMuZ2V0Q2hlY2tlZFZhbHVlcygpO1xuICAgICAgICByZXR1cm4gISFjaGVja2VkVmFsdWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENoZWNrZWRWYWx1ZXMoKTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHZhbHVlLmluY2x1ZGVzKGl0ZW0udmFsdWUpKS5tYXAoKGl0ZW0pID0+IChpdGVtLmNoZWNrZWQgPSB0cnVlKSk7XG4gICAgICAgIHRoaXMuc3VibWl0VmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGVja2VkVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLml0ZW1zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uY2hlY2tlZCkubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgc3VibWl0VmFsdWVzKHVwZGF0ZUNvbnRleHQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrZWRWYWx1ZXMgPSB0aGlzLmdldENoZWNrZWRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKGNoZWNrZWRWYWx1ZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlsdGVyUmF3UGFyYW1zW3RoaXMuaWRdID0gY2hlY2tlZFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeSA9IGNoZWNrZWRWYWx1ZXMuam9pbihgICR7dGhpcy5vcGVyYXRvcn0gYCk7XG4gICAgICAgIGlmICh0aGlzLmlkICYmIHRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnF1ZXJ5RnJhZ21lbnRzW3RoaXMuaWRdID0gcXVlcnk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQudXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2hlY2tsaXN0XCI+XG4gICAgPG1hdC1jaGVja2JveFxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIlxuICAgICAgICBbY2hlY2tlZF09XCJvcHRpb24uY2hlY2tlZFwiXG4gICAgICAgIGxhYmVsUG9zaXRpb249XCJiZWZvcmVcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvcHRpb24uY2hlY2tlZCA9ICFvcHRpb24uY2hlY2tlZFwiXG4gICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInY2hlY2tib3gtJyArIChvcHRpb24ubmFtZSlcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm9wdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VIYW5kbGVyKCRldmVudCwgb3B0aW9uKVwiXG4gICAgICAgIGNsYXNzPVwiYWRmLWZhY2V0LWZpbHRlclwiPlxuICAgICAgICA8ZGl2IHRpdGxlPVwie3sgb3B0aW9uLm5hbWUgfCB0cmFuc2xhdGUgfX1cIiBjbGFzcz1cImFkZi1zZWFyY2gtY2hlY2stbGlzdC1sYWJlbFwiPlxuICAgICAgICAgICAge3sgb3B0aW9uLm5hbWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L21hdC1jaGVja2JveD5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWRmLWZhY2V0LWJ1dHRvbnNcIiAqbmdJZj1cIm9wdGlvbnMuZml0c1BhZ2UgJiYgIXNldHRpbmdzPy5oaWRlRGVmYXVsdEFjdGlvblwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xlYXIoKVwiPlxuICAgICAgICB7eyAnU0VBUkNILkZJTFRFUi5BQ1RJT05TLkNMRUFSLUFMTCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWRmLWZhY2V0LWJ1dHRvbnNcIiAqbmdJZj1cIiFvcHRpb25zLmZpdHNQYWdlXCI+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgdGl0bGU9XCJ7eyAnU0VBUkNILkZJTFRFUi5BQ1RJT05TLkNMRUFSLUFMTCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICpuZ0lmPVwib3B0aW9ucy5jYW5TaG93TGVzc0l0ZW1zXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnU0VBUkNILkZJTFRFUi5BQ1RJT05TLlNIT1ctTEVTUycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAoY2xpY2spPVwib3B0aW9ucy5zaG93TGVzc0l0ZW1zKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X3VwPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAqbmdJZj1cIm9wdGlvbnMuY2FuU2hvd01vcmVJdGVtc1wiXG4gICAgICAgIHRpdGxlPVwie3sgJ1NFQVJDSC5GSUxURVIuQUNUSU9OUy5TSE9XLU1PUkUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGNsaWNrKT1cIm9wdGlvbnMuc2hvd01vcmVJdGVtcygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19