ng-prime-tools
Version:
An advanced PrimeNG table for Angular
90 lines • 15.3 kB
JavaScript
import { Component, Input, HostListener } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class PTMenuComponent {
constructor() {
this.config = {
icon: { code: 'pi pi-ellipsis-v', color: '#000', fontSize: '15px' },
menuDirection: 'right',
};
this.isOpen = false;
}
static { this.DEFAULT_TEXT_COLOR = '#000'; }
static { this.DEFAULT_TEXT_FONT_SIZE = '15px'; }
static { this.DEFAULT_ICON_COLOR = '#000'; }
static { this.DEFAULT_ICON_FONT_SIZE = '15px'; }
static { this.DEFAULT_ICON_CODE = 'pi pi-ellipsis-v'; }
static { this.openMenuInstance = null; }
toggleMenu() {
if (PTMenuComponent.openMenuInstance &&
PTMenuComponent.openMenuInstance !== this) {
PTMenuComponent.openMenuInstance.closeMenu();
}
this.isOpen = !this.isOpen;
if (this.isOpen) {
PTMenuComponent.openMenuInstance = this;
}
else {
PTMenuComponent.openMenuInstance = null;
}
}
closeMenu() {
this.isOpen = false;
if (PTMenuComponent.openMenuInstance === this) {
PTMenuComponent.openMenuInstance = null;
}
}
getMenuItemIconClass(item) {
// Assuming that icons starting with "fa" are FontAwesome icons
return typeof item.icon === 'string' ? item.icon : item.icon?.code || '';
}
getMenuItemIconStyles(item) {
if (typeof item.icon !== 'string') {
return {
color: item.icon?.color || PTMenuComponent.DEFAULT_ICON_COLOR,
fontSize: item.icon?.fontSize || PTMenuComponent.DEFAULT_ICON_FONT_SIZE,
};
}
return {
color: PTMenuComponent.DEFAULT_ICON_COLOR,
fontSize: PTMenuComponent.DEFAULT_ICON_FONT_SIZE,
};
}
getIconClass() {
return this.config.icon?.code || PTMenuComponent.DEFAULT_ICON_CODE;
}
getIconStyles() {
return {
color: this.config.color ||
this.config.icon?.color ||
PTMenuComponent.DEFAULT_ICON_COLOR,
fontSize: this.config.fontSize ||
this.config.icon?.fontSize ||
PTMenuComponent.DEFAULT_ICON_FONT_SIZE,
};
}
getTextStyles(item) {
return {
color: item.color || PTMenuComponent.DEFAULT_TEXT_COLOR,
fontSize: item.fontSize || PTMenuComponent.DEFAULT_TEXT_FONT_SIZE,
};
}
onDocumentClick(event) {
const clickedInside = event.target.closest('.pt-menu');
if (!clickedInside) {
this.closeMenu();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTMenuComponent, selector: "pt-menu", inputs: { config: "config" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div\n [ngClass]=\"{\n open: isOpen,\n 'menu-left': config.menuDirection === 'left',\n 'menu-right': config.menuDirection === 'right'\n }\"\n class=\"pt-menu\"\n>\n <i\n class=\"menu-icon\"\n (click)=\"toggleMenu()\"\n [ngClass]=\"getIconClass()\"\n [ngStyle]=\"getIconStyles()\"\n ></i>\n <div class=\"menu-dropdown\" *ngIf=\"isOpen\">\n <div\n class=\"menu-item\"\n *ngFor=\"let item of config.menuItems\"\n (click)=\"item.action()\"\n >\n <i\n [ngClass]=\"getMenuItemIconClass(item)\"\n [ngStyle]=\"getMenuItemIconStyles(item)\"\n ></i>\n <span [ngStyle]=\"getTextStyles(item)\">{{ item.text }}</span>\n </div>\n </div>\n</div>\n", styles: [".pt-menu{position:relative;display:inline-block}.pt-menu .menu-icon{font-style:normal;font-weight:400;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;padding:8px;transition:background-color .2s,box-shadow .2s}.pt-menu .menu-icon:hover{background-color:#5959591a;box-shadow:0 0 0 1px #5959591a}.pt-menu .menu-dropdown{display:none;position:absolute;background-color:#fff;box-shadow:0 8px 16px #0003;min-width:160px;z-index:1;border-radius:5px;overflow:hidden}.pt-menu .menu-item{padding:8px 16px;cursor:pointer;display:flex;align-items:center}.pt-menu .menu-item i{margin-right:10px}.pt-menu .menu-item:hover{background-color:#f1f1f1}.pt-menu.open .menu-dropdown{display:block}.pt-menu.menu-left .menu-dropdown{right:0;left:auto;z-index:2}.pt-menu.menu-right .menu-dropdown{left:0;right:auto;z-index:2}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'pt-menu', template: "<div\n [ngClass]=\"{\n open: isOpen,\n 'menu-left': config.menuDirection === 'left',\n 'menu-right': config.menuDirection === 'right'\n }\"\n class=\"pt-menu\"\n>\n <i\n class=\"menu-icon\"\n (click)=\"toggleMenu()\"\n [ngClass]=\"getIconClass()\"\n [ngStyle]=\"getIconStyles()\"\n ></i>\n <div class=\"menu-dropdown\" *ngIf=\"isOpen\">\n <div\n class=\"menu-item\"\n *ngFor=\"let item of config.menuItems\"\n (click)=\"item.action()\"\n >\n <i\n [ngClass]=\"getMenuItemIconClass(item)\"\n [ngStyle]=\"getMenuItemIconStyles(item)\"\n ></i>\n <span [ngStyle]=\"getTextStyles(item)\">{{ item.text }}</span>\n </div>\n </div>\n</div>\n", styles: [".pt-menu{position:relative;display:inline-block}.pt-menu .menu-icon{font-style:normal;font-weight:400;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;padding:8px;transition:background-color .2s,box-shadow .2s}.pt-menu .menu-icon:hover{background-color:#5959591a;box-shadow:0 0 0 1px #5959591a}.pt-menu .menu-dropdown{display:none;position:absolute;background-color:#fff;box-shadow:0 8px 16px #0003;min-width:160px;z-index:1;border-radius:5px;overflow:hidden}.pt-menu .menu-item{padding:8px 16px;cursor:pointer;display:flex;align-items:center}.pt-menu .menu-item i{margin-right:10px}.pt-menu .menu-item:hover{background-color:#f1f1f1}.pt-menu.open .menu-dropdown{display:block}.pt-menu.menu-left .menu-dropdown{right:0;left:auto;z-index:2}.pt-menu.menu-right .menu-dropdown{left:0;right:auto;z-index:2}\n"] }]
}], propDecorators: { config: [{
type: Input
}], onDocumentClick: [{
type: HostListener,
args: ['document:click', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LW1lbnUvcHQtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LW1lbnUvcHQtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVEvRCxNQUFNLE9BQU8sZUFBZTtJQUw1QjtRQU1XLFdBQU0sR0FBZTtZQUM1QixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO1lBQ25FLGFBQWEsRUFBRSxPQUFPO1NBQ3ZCLENBQUM7UUFVRixXQUFNLEdBQUcsS0FBSyxDQUFDO0tBMkVoQjthQW5GeUIsdUJBQWtCLEdBQUcsTUFBTSxBQUFULENBQVU7YUFDNUIsMkJBQXNCLEdBQUcsTUFBTSxBQUFULENBQVU7YUFDaEMsdUJBQWtCLEdBQUcsTUFBTSxBQUFULENBQVU7YUFDNUIsMkJBQXNCLEdBQUcsTUFBTSxBQUFULENBQVU7YUFDaEMsc0JBQWlCLEdBQUcsa0JBQWtCLEFBQXJCLENBQXNCO2FBRWhELHFCQUFnQixHQUEyQixJQUFJLEFBQS9CLENBQWdDO0lBSS9ELFVBQVU7UUFDUixJQUNFLGVBQWUsQ0FBQyxnQkFBZ0I7WUFDaEMsZUFBZSxDQUFDLGdCQUFnQixLQUFLLElBQUksRUFDekMsQ0FBQztZQUNELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLGVBQWUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDOUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQWM7UUFDakMsK0RBQStEO1FBQy9ELE9BQU8sT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFjO1FBQ2xDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLGVBQWUsQ0FBQyxrQkFBa0I7Z0JBQzdELFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxlQUFlLENBQUMsc0JBQXNCO2FBQ3hFLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztZQUNMLEtBQUssRUFBRSxlQUFlLENBQUMsa0JBQWtCO1lBQ3pDLFFBQVEsRUFBRSxlQUFlLENBQUMsc0JBQXNCO1NBQ2pELENBQUM7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQztJQUNyRSxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU87WUFDTCxLQUFLLEVBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLO2dCQUN2QixlQUFlLENBQUMsa0JBQWtCO1lBQ3BDLFFBQVEsRUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVE7Z0JBQzFCLGVBQWUsQ0FBQyxzQkFBc0I7U0FDekMsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBYztRQUMxQixPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksZUFBZSxDQUFDLGtCQUFrQjtZQUN2RCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxlQUFlLENBQUMsc0JBQXNCO1NBQ2xFLENBQUM7SUFDSixDQUFDO0lBR0QsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLE1BQU0sYUFBYSxHQUFJLEtBQUssQ0FBQyxNQUFzQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDOytHQXhGVSxlQUFlO21HQUFmLGVBQWUsbUpDUjVCLDJzQkE0QkE7OzRGRHBCYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLFNBQVM7OEJBS1YsTUFBTTtzQkFBZCxLQUFLO2dCQWtGTixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51Q29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHQtbWVudS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBUTWVudUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWVudUNvbmZpZyA9IHtcbiAgICBpY29uOiB7IGNvZGU6ICdwaSBwaS1lbGxpcHNpcy12JywgY29sb3I6ICcjMDAwJywgZm9udFNpemU6ICcxNXB4JyB9LFxuICAgIG1lbnVEaXJlY3Rpb246ICdyaWdodCcsXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9URVhUX0NPTE9SID0gJyMwMDAnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1RFWFRfRk9OVF9TSVpFID0gJzE1cHgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0lDT05fQ09MT1IgPSAnIzAwMCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSUNPTl9GT05UX1NJWkUgPSAnMTVweCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSUNPTl9DT0RFID0gJ3BpIHBpLWVsbGlwc2lzLXYnO1xuXG4gIHByaXZhdGUgc3RhdGljIG9wZW5NZW51SW5zdGFuY2U6IFBUTWVudUNvbXBvbmVudCB8IG51bGwgPSBudWxsO1xuXG4gIGlzT3BlbiA9IGZhbHNlO1xuXG4gIHRvZ2dsZU1lbnUoKSB7XG4gICAgaWYgKFxuICAgICAgUFRNZW51Q29tcG9uZW50Lm9wZW5NZW51SW5zdGFuY2UgJiZcbiAgICAgIFBUTWVudUNvbXBvbmVudC5vcGVuTWVudUluc3RhbmNlICE9PSB0aGlzXG4gICAgKSB7XG4gICAgICBQVE1lbnVDb21wb25lbnQub3Blbk1lbnVJbnN0YW5jZS5jbG9zZU1lbnUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcblxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgUFRNZW51Q29tcG9uZW50Lm9wZW5NZW51SW5zdGFuY2UgPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBQVE1lbnVDb21wb25lbnQub3Blbk1lbnVJbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VNZW51KCkge1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgaWYgKFBUTWVudUNvbXBvbmVudC5vcGVuTWVudUluc3RhbmNlID09PSB0aGlzKSB7XG4gICAgICBQVE1lbnVDb21wb25lbnQub3Blbk1lbnVJbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWVudUl0ZW1JY29uQ2xhc3MoaXRlbTogTWVudUl0ZW0pOiBzdHJpbmcge1xuICAgIC8vIEFzc3VtaW5nIHRoYXQgaWNvbnMgc3RhcnRpbmcgd2l0aCBcImZhXCIgYXJlIEZvbnRBd2Vzb21lIGljb25zXG4gICAgcmV0dXJuIHR5cGVvZiBpdGVtLmljb24gPT09ICdzdHJpbmcnID8gaXRlbS5pY29uIDogaXRlbS5pY29uPy5jb2RlIHx8ICcnO1xuICB9XG5cbiAgZ2V0TWVudUl0ZW1JY29uU3R5bGVzKGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmljb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogaXRlbS5pY29uPy5jb2xvciB8fCBQVE1lbnVDb21wb25lbnQuREVGQVVMVF9JQ09OX0NPTE9SLFxuICAgICAgICBmb250U2l6ZTogaXRlbS5pY29uPy5mb250U2l6ZSB8fCBQVE1lbnVDb21wb25lbnQuREVGQVVMVF9JQ09OX0ZPTlRfU0laRSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjogUFRNZW51Q29tcG9uZW50LkRFRkFVTFRfSUNPTl9DT0xPUixcbiAgICAgIGZvbnRTaXplOiBQVE1lbnVDb21wb25lbnQuREVGQVVMVF9JQ09OX0ZPTlRfU0laRSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0SWNvbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmljb24/LmNvZGUgfHwgUFRNZW51Q29tcG9uZW50LkRFRkFVTFRfSUNPTl9DT0RFO1xuICB9XG5cbiAgZ2V0SWNvblN0eWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6XG4gICAgICAgIHRoaXMuY29uZmlnLmNvbG9yIHx8XG4gICAgICAgIHRoaXMuY29uZmlnLmljb24/LmNvbG9yIHx8XG4gICAgICAgIFBUTWVudUNvbXBvbmVudC5ERUZBVUxUX0lDT05fQ09MT1IsXG4gICAgICBmb250U2l6ZTpcbiAgICAgICAgdGhpcy5jb25maWcuZm9udFNpemUgfHxcbiAgICAgICAgdGhpcy5jb25maWcuaWNvbj8uZm9udFNpemUgfHxcbiAgICAgICAgUFRNZW51Q29tcG9uZW50LkRFRkFVTFRfSUNPTl9GT05UX1NJWkUsXG4gICAgfTtcbiAgfVxuXG4gIGdldFRleHRTdHlsZXMoaXRlbTogTWVudUl0ZW0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgUFRNZW51Q29tcG9uZW50LkRFRkFVTFRfVEVYVF9DT0xPUixcbiAgICAgIGZvbnRTaXplOiBpdGVtLmZvbnRTaXplIHx8IFBUTWVudUNvbXBvbmVudC5ERUZBVUxUX1RFWFRfRk9OVF9TSVpFLFxuICAgIH07XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCcucHQtbWVudScpO1xuICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgW25nQ2xhc3NdPVwie1xuICAgIG9wZW46IGlzT3BlbixcbiAgICAnbWVudS1sZWZ0JzogY29uZmlnLm1lbnVEaXJlY3Rpb24gPT09ICdsZWZ0JyxcbiAgICAnbWVudS1yaWdodCc6IGNvbmZpZy5tZW51RGlyZWN0aW9uID09PSAncmlnaHQnXG4gIH1cIlxuICBjbGFzcz1cInB0LW1lbnVcIlxuPlxuICA8aVxuICAgIGNsYXNzPVwibWVudS1pY29uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCJcbiAgICBbbmdDbGFzc109XCJnZXRJY29uQ2xhc3MoKVwiXG4gICAgW25nU3R5bGVdPVwiZ2V0SWNvblN0eWxlcygpXCJcbiAgPjwvaT5cbiAgPGRpdiBjbGFzcz1cIm1lbnUtZHJvcGRvd25cIiAqbmdJZj1cImlzT3BlblwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibWVudS1pdGVtXCJcbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbmZpZy5tZW51SXRlbXNcIlxuICAgICAgKGNsaWNrKT1cIml0ZW0uYWN0aW9uKClcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE1lbnVJdGVtSWNvbkNsYXNzKGl0ZW0pXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0TWVudUl0ZW1JY29uU3R5bGVzKGl0ZW0pXCJcbiAgICAgID48L2k+XG4gICAgICA8c3BhbiBbbmdTdHlsZV09XCJnZXRUZXh0U3R5bGVzKGl0ZW0pXCI+e3sgaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19