@alfresco/adf-content-services
Version:
Alfresco ADF content services
76 lines • 18.9 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 { FlatTreeControl } from '@angular/cdk/tree';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { TreeViewDataSource } from '../data/tree-view-datasource';
import { TreeViewService } from '../services/tree-view.service';
import { CommonModule } from '@angular/common';
import { MatTreeModule } from '@angular/material/tree';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "../services/tree-view.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/tree";
import * as i4 from "@angular/material/button";
import * as i5 from "@angular/material/icon";
import * as i6 from "@ngx-translate/core";
export class TreeViewComponent {
constructor(treeViewService) {
this.treeViewService = treeViewService;
/** Emitted when a node in the tree view is clicked. */
this.nodeClicked = new EventEmitter();
/** Emitted when an invalid node id is given. */
this.error = new EventEmitter();
this.getLevel = (node) => node.level;
this.isExpandable = (node) => node.expandable;
this.hasChild = (_, nodeData) => nodeData.expandable;
this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
this.dataSource = new TreeViewDataSource(this.treeControl, this.treeViewService);
}
ngOnChanges(changes) {
if (changes['nodeId']?.currentValue && changes['nodeId'].currentValue !== changes['nodeId'].previousValue) {
this.loadTreeNode();
}
else {
this.dataSource.data = [];
}
}
onNodeClicked(node) {
this.nodeClicked.emit(node);
}
loadTreeNode() {
this.treeViewService.getTreeNodes(this.nodeId).subscribe((treeNode) => {
this.dataSource.data = treeNode;
}, (error) => this.error.emit(error));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeViewComponent, deps: [{ token: i1.TreeViewService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: TreeViewComponent, isStandalone: true, selector: "adf-tree-view-list", inputs: { nodeId: "nodeId" }, outputs: { nodeClicked: "nodeClicked", error: "error" }, usesOnChanges: true, ngImport: i0, template: "<mat-tree class=\"adf-tree-view-main\" [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" *ngIf=\"nodeId; else missingNodeId\">\n <mat-tree-node\n class=\"adf-tree-view adf-tree-view-node\"\n *matTreeNodeDef=\"let treeNode\"\n id=\"{{ treeNode.name + '-tree-node' }}\"\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"15\"\n >\n {{ treeNode.name }}\n </mat-tree-node>\n <mat-tree-node\n class=\"adf-tree-view adf-tree-view-node\"\n id=\"{{ treeNode.name + '-tree-child-node' }}\"\n *matTreeNodeDef=\"let treeNode; when: hasChild\"\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"15\"\n >\n <button\n matTreeNodeToggle\n id=\"{{ 'button-' + treeNode.name }}\"\n (click)=\"onNodeClicked(treeNode.node)\"\n mat-icon-button\n [attr.aria-label]=\"\n 'ADF-TREE-VIEW.ACCESSIBILITY.ARIA_LABEL'\n | translate\n : {\n name: treeNode.name\n }\n \"\n >\n <mat-icon class=\"adf-tree-view-icon\">\n {{ treeControl.isExpanded(treeNode) ? 'folder_open' : 'folder' }}\n </mat-icon>\n </button>\n <span\n class=\"adf-tree-view-label\"\n matTreeNodeToggle\n role=\"button\"\n (click)=\"onNodeClicked(treeNode.node)\"\n tabindex=\"0\"\n (keyup.enter)=\"onNodeClicked(treeNode.node)\"\n >{{ treeNode.name }}</span\n >\n </mat-tree-node>\n</mat-tree>\n<ng-template #missingNodeId>\n <div id=\"adf-tree-view-missing-node\">\n {{ 'ADF-TREE-VIEW.MISSING-ID' | translate }}\n </div>\n</ng-template>\n", styles: [".adf-tree-view-icon{color:#d9e022}.adf-tree-view-node.adf-tree-view{min-height:40px;font-size:var(--theme-caption-font-size);align-items:baseline}.adf-tree-view-label{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i3.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i3.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i3.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i3.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i3.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeViewComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-tree-view-list', standalone: true, imports: [CommonModule, MatTreeModule, MatButtonModule, MatIconModule, TranslateModule], template: "<mat-tree class=\"adf-tree-view-main\" [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" *ngIf=\"nodeId; else missingNodeId\">\n <mat-tree-node\n class=\"adf-tree-view adf-tree-view-node\"\n *matTreeNodeDef=\"let treeNode\"\n id=\"{{ treeNode.name + '-tree-node' }}\"\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"15\"\n >\n {{ treeNode.name }}\n </mat-tree-node>\n <mat-tree-node\n class=\"adf-tree-view adf-tree-view-node\"\n id=\"{{ treeNode.name + '-tree-child-node' }}\"\n *matTreeNodeDef=\"let treeNode; when: hasChild\"\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"15\"\n >\n <button\n matTreeNodeToggle\n id=\"{{ 'button-' + treeNode.name }}\"\n (click)=\"onNodeClicked(treeNode.node)\"\n mat-icon-button\n [attr.aria-label]=\"\n 'ADF-TREE-VIEW.ACCESSIBILITY.ARIA_LABEL'\n | translate\n : {\n name: treeNode.name\n }\n \"\n >\n <mat-icon class=\"adf-tree-view-icon\">\n {{ treeControl.isExpanded(treeNode) ? 'folder_open' : 'folder' }}\n </mat-icon>\n </button>\n <span\n class=\"adf-tree-view-label\"\n matTreeNodeToggle\n role=\"button\"\n (click)=\"onNodeClicked(treeNode.node)\"\n tabindex=\"0\"\n (keyup.enter)=\"onNodeClicked(treeNode.node)\"\n >{{ treeNode.name }}</span\n >\n </mat-tree-node>\n</mat-tree>\n<ng-template #missingNodeId>\n <div id=\"adf-tree-view-missing-node\">\n {{ 'ADF-TREE-VIEW.MISSING-ID' | translate }}\n </div>\n</ng-template>\n", styles: [".adf-tree-view-icon{color:#d9e022}.adf-tree-view-node.adf-tree-view{min-height:40px;font-size:var(--theme-caption-font-size);align-items:baseline}.adf-tree-view-label{cursor:pointer}\n"] }]
}], ctorParameters: () => [{ type: i1.TreeViewService }], propDecorators: { nodeId: [{
type: Input,
args: [{ required: true }]
}], nodeClicked: [{
type: Output
}], error: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvdHJlZS12aWV3L2NvbXBvbmVudHMvdHJlZS12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvdHJlZS12aWV3L2NvbXBvbmVudHMvdHJlZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUVqRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7QUFTdEQsTUFBTSxPQUFPLGlCQUFpQjtJQWdCMUIsWUFBb0IsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBWHBELHVEQUF1RDtRQUV2RCxnQkFBVyxHQUE0QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTFELGdEQUFnRDtRQUVoRCxVQUFLLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFzQjlDLGFBQVEsR0FBRyxDQUFDLElBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFOUMsaUJBQVksR0FBRyxDQUFDLElBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFdkQsYUFBUSxHQUFHLENBQUMsQ0FBUyxFQUFFLFFBQXNCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFwQmxFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFlO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFRTyxZQUFZO1FBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQ3BELENBQUMsUUFBd0IsRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUNwQyxDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUNwQyxDQUFDO0lBQ04sQ0FBQzs4R0E5Q1EsaUJBQWlCO2tHQUFqQixpQkFBaUIsMExDcEM5QixneURBa0RBLGlQRGxCYyxZQUFZLGtJQUFFLGFBQWEsb29CQUFFLGVBQWUsMklBQUUsYUFBYSxtTEFBRSxlQUFlOzsyRkFJN0UsaUJBQWlCO2tCQVA3QixTQUFTOytCQUNJLG9CQUFvQixjQUNsQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDO29GQU92RixNQUFNO3NCQURMLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUt6QixXQUFXO3NCQURWLE1BQU07Z0JBS1AsS0FBSztzQkFESixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmVlQmFzZU5vZGUgfSBmcm9tICcuLi9tb2RlbHMvdHJlZS12aWV3Lm1vZGVsJztcbmltcG9ydCB7IFRyZWVWaWV3RGF0YVNvdXJjZSB9IGZyb20gJy4uL2RhdGEvdHJlZS12aWV3LWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgVHJlZVZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdHJlZS12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUVudHJ5IH0gZnJvbSAnQGFsZnJlc2NvL2pzLWFwaSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0VHJlZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi10cmVlLXZpZXctbGlzdCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRUcmVlTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdHJlZS12aWV3LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVHJlZVZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIC8qKiBJZGVudGlmaWVyIG9mIHRoZSBub2RlIHRvIGRpc3BsYXkuICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICBub2RlSWQ6IHN0cmluZztcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBub2RlIGluIHRoZSB0cmVlIHZpZXcgaXMgY2xpY2tlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBub2RlQ2xpY2tlZDogRXZlbnRFbWl0dGVyPE5vZGVFbnRyeT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGludmFsaWQgbm9kZSBpZCBpcyBnaXZlbi4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICB0cmVlQ29udHJvbDogRmxhdFRyZWVDb250cm9sPFRyZWVCYXNlTm9kZT47XG4gICAgZGF0YVNvdXJjZTogVHJlZVZpZXdEYXRhU291cmNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmVlVmlld1NlcnZpY2U6IFRyZWVWaWV3U2VydmljZSkge1xuICAgICAgICB0aGlzLnRyZWVDb250cm9sID0gbmV3IEZsYXRUcmVlQ29udHJvbDxUcmVlQmFzZU5vZGU+KHRoaXMuZ2V0TGV2ZWwsIHRoaXMuaXNFeHBhbmRhYmxlKTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IFRyZWVWaWV3RGF0YVNvdXJjZSh0aGlzLnRyZWVDb250cm9sLCB0aGlzLnRyZWVWaWV3U2VydmljZSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlc1snbm9kZUlkJ10/LmN1cnJlbnRWYWx1ZSAmJiBjaGFuZ2VzWydub2RlSWQnXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ25vZGVJZCddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFRyZWVOb2RlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ob2RlQ2xpY2tlZChub2RlOiBOb2RlRW50cnkpIHtcbiAgICAgICAgdGhpcy5ub2RlQ2xpY2tlZC5lbWl0KG5vZGUpO1xuICAgIH1cblxuICAgIGdldExldmVsID0gKG5vZGU6IFRyZWVCYXNlTm9kZSkgPT4gbm9kZS5sZXZlbDtcblxuICAgIGlzRXhwYW5kYWJsZSA9IChub2RlOiBUcmVlQmFzZU5vZGUpID0+IG5vZGUuZXhwYW5kYWJsZTtcblxuICAgIGhhc0NoaWxkID0gKF86IG51bWJlciwgbm9kZURhdGE6IFRyZWVCYXNlTm9kZSkgPT4gbm9kZURhdGEuZXhwYW5kYWJsZTtcblxuICAgIHByaXZhdGUgbG9hZFRyZWVOb2RlKCkge1xuICAgICAgICB0aGlzLnRyZWVWaWV3U2VydmljZS5nZXRUcmVlTm9kZXModGhpcy5ub2RlSWQpLnN1YnNjcmliZShcbiAgICAgICAgICAgICh0cmVlTm9kZTogVHJlZUJhc2VOb2RlW10pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRyZWVOb2RlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcikgPT4gdGhpcy5lcnJvci5lbWl0KGVycm9yKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxtYXQtdHJlZSBjbGFzcz1cImFkZi10cmVlLXZpZXctbWFpblwiIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIiAqbmdJZj1cIm5vZGVJZDsgZWxzZSBtaXNzaW5nTm9kZUlkXCI+XG4gICAgPG1hdC10cmVlLW5vZGVcbiAgICAgICAgY2xhc3M9XCJhZGYtdHJlZS12aWV3IGFkZi10cmVlLXZpZXctbm9kZVwiXG4gICAgICAgICptYXRUcmVlTm9kZURlZj1cImxldCB0cmVlTm9kZVwiXG4gICAgICAgIGlkPVwie3sgdHJlZU5vZGUubmFtZSArICctdHJlZS1ub2RlJyB9fVwiXG4gICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgICBbbWF0VHJlZU5vZGVQYWRkaW5nSW5kZW50XT1cIjE1XCJcbiAgICA+XG4gICAgICAgIHt7IHRyZWVOb2RlLm5hbWUgfX1cbiAgICA8L21hdC10cmVlLW5vZGU+XG4gICAgPG1hdC10cmVlLW5vZGVcbiAgICAgICAgY2xhc3M9XCJhZGYtdHJlZS12aWV3IGFkZi10cmVlLXZpZXctbm9kZVwiXG4gICAgICAgIGlkPVwie3sgdHJlZU5vZGUubmFtZSArICctdHJlZS1jaGlsZC1ub2RlJyB9fVwiXG4gICAgICAgICptYXRUcmVlTm9kZURlZj1cImxldCB0cmVlTm9kZTsgd2hlbjogaGFzQ2hpbGRcIlxuICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdcbiAgICAgICAgW21hdFRyZWVOb2RlUGFkZGluZ0luZGVudF09XCIxNVwiXG4gICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxuICAgICAgICAgICAgaWQ9XCJ7eyAnYnV0dG9uLScgKyB0cmVlTm9kZS5uYW1lIH19XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5vZGVDbGlja2VkKHRyZWVOb2RlLm5vZGUpXCJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAnQURGLVRSRUUtVklFVy5BQ0NFU1NJQklMSVRZLkFSSUFfTEFCRUwnXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRyZWVOb2RlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRmLXRyZWUtdmlldy1pY29uXCI+XG4gICAgICAgICAgICAgICAge3sgdHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlTm9kZSkgPyAnZm9sZGVyX29wZW4nIDogJ2ZvbGRlcicgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtdHJlZS12aWV3LWxhYmVsXCJcbiAgICAgICAgICAgIG1hdFRyZWVOb2RlVG9nZ2xlXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5vZGVDbGlja2VkKHRyZWVOb2RlLm5vZGUpXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25Ob2RlQ2xpY2tlZCh0cmVlTm9kZS5ub2RlKVwiXG4gICAgICAgICAgICA+e3sgdHJlZU5vZGUubmFtZSB9fTwvc3BhblxuICAgICAgICA+XG4gICAgPC9tYXQtdHJlZS1ub2RlPlxuPC9tYXQtdHJlZT5cbjxuZy10ZW1wbGF0ZSAjbWlzc2luZ05vZGVJZD5cbiAgICA8ZGl2IGlkPVwiYWRmLXRyZWUtdmlldy1taXNzaW5nLW5vZGVcIj5cbiAgICAgICAge3sgJ0FERi1UUkVFLVZJRVcuTUlTU0lORy1JRCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=