UNPKG

@rangertechnologies/ngnxt

Version:

This library was used for creating dymanic UI based on the input JSON/data

109 lines 26 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class NxtInfoCard { elementRef; title = ''; // title of the card value = ''; // value of the card description = ''; // description of the card content = ''; // content of the card imgSrc = 'https://img.icons8.com/material-sharp/24/permanent-job.png'; // image source of the card hoverImgSrc = ''; // hover image source of the card color = '#ffffff'; // color of the card hoverColor = '#f8f9fa'; // hover color of the card padding = '20px'; // padding of the card isImageRight = false; // whether the image is on the right side of the card isImageLeft = true; // whether the image is on the left side of the card iconColor = '#f8f9fa'; // color of the icon iconHoverColor = '#ffffff'; // hover color of the icon isEdit = false; // whether the card is editable editConfig = null; // edit config of the card buttonClick = new EventEmitter(); isHovered = false; isDropdownOpen = false; constructor(elementRef) { this.elementRef = elementRef; } onMouseEnter() { this.isHovered = true; } onMouseLeave() { this.isHovered = false; } getCurrentImgSrc() { return this.isHovered && this.hoverImgSrc ? this.hoverImgSrc : this.imgSrc; } getCurrentBgColor() { return this.isHovered ? this.hoverColor : this.color; } getCurrentIconBgColor() { return this.isHovered ? this.iconHoverColor : this.iconColor; } toggleDropdown() { this.isDropdownOpen = !this.isDropdownOpen; } closeDropdown() { this.isDropdownOpen = false; } onButtonClick(button) { const cardData = { title: this.title, value: this.value, description: this.description, content: this.content }; this.buttonClick.emit({ button, cardData }); this.closeDropdown(); } hasEditButtons() { return this.isEdit && this.editConfig && this.editConfig.buttons && this.editConfig.buttons.length > 0; } onClickOutside(event) { if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)) { this.isDropdownOpen = false; } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtInfoCard, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NxtInfoCard, isStandalone: true, selector: "nxt-info-card", inputs: { title: "title", value: "value", description: "description", content: "content", imgSrc: "imgSrc", hoverImgSrc: "hoverImgSrc", color: "color", hoverColor: "hoverColor", padding: "padding", isImageRight: "isImageRight", isImageLeft: "isImageLeft", iconColor: "iconColor", iconHoverColor: "iconHoverColor", isEdit: "isEdit", editConfig: "editConfig" }, outputs: { buttonClick: "buttonClick" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, ngImport: i0, template: "<div class=\"workforce-card\" [ngStyle]=\"{'background-color': getCurrentBgColor(), 'padding': padding}\"\n (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\n\n <div class=\"card-content\">\n <!-- Left image -->\n <div *ngIf=\"isImageLeft\" class=\"image-container left-image\"\n [ngStyle]=\"{'background-color': getCurrentIconBgColor()}\">\n <img [src]=\"getCurrentImgSrc()\" alt=\"icon\">\n </div>\n\n <!-- Card text content -->\n <div class=\"text-content\">\n <div class=\"title\">{{ title }}</div>\n <div class=\"value\">{{ value }}</div>\n <div *ngIf=\"description\" class=\"description\">{{ description }}</div>\n <div *ngIf=\"content\" class=\"additional-content\">{{ content }}</div>\n </div>\n\n <!-- Right image -->\n <div *ngIf=\"isImageRight\" class=\"image-container right-image\"\n [ngStyle]=\"{'background-color': getCurrentIconBgColor()}\">\n <img [src]=\"getCurrentImgSrc()\" alt=\"icon\">\n </div>\n\n <!-- Edit button -->\n <div *ngIf=\"isEdit\" class=\"edit-button\" (click)=\"toggleDropdown(); $event.stopPropagation()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#bababa\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5Z\"\n stroke=\"#d4d4d4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path\n d=\"M13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12Z\"\n stroke=\"#d4d4d4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path\n d=\"M13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19Z\"\n stroke=\"#d4d4d4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </g>\n </svg>\n </div>\n <!-- Dropdown menu -->\n <div *ngIf=\"isDropdownOpen\" class=\"edit-dropdown-menu show\">\n <div *ngFor=\"let button of editConfig.buttons\" class=\"edit-dropdown-item\" (click)=\"onButtonClick(button)\">\n <div class=\"dropdown-button-content\">\n <img *ngIf=\"button.isImageSvg && button.iconSrc\" [src]=\"button.iconSrc\" alt=\"icon\" class=\"button-icon\">\n <span class=\"button-name\">{{ button.name }}</span>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".workforce-card{border-radius:8px;box-shadow:0 2px 8px #0000001a;transition:all .3s ease;display:flex;align-items:center;position:relative;width:100%;max-width:300px;box-sizing:border-box}.card-content{display:flex;align-items:flex-start;width:100%;position:relative}.image-container{display:flex;align-items:center;justify-content:center;border-radius:50%;width:48px;height:48px;flex-shrink:0}.image-container img{width:24px;height:24px;object-fit:contain}.left-image{margin-right:16px;margin-top:4px}.right-image{margin-left:16px;margin-top:4px}.text-content{flex-grow:1;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.title{color:#6c757d;font-size:14px;margin-bottom:4px}.value{color:#192656;font-size:24px;font-weight:700;line-height:1.2}.description{color:#6c757d;font-size:12px;margin-top:4px}.additional-content{margin-top:8px;font-size:14px;line-height:1.4}.edit-button{position:absolute;top:-9px;right:-16px;cursor:pointer;color:#6c757d;display:flex;align-items:center;justify-content:center;width:24px;height:24px;background-color:#fff;border-radius:15px;padding:2px}.edit-button:hover{color:#000;background-color:#f4f4f4}.edit-dropdown-menu{position:absolute;top:18%;right:0;z-index:1000;min-width:80px;max-height:75px;background-color:#fff;overflow-y:auto;border:1px solid rgba(0,0,0,.15);border-radius:4px;box-shadow:0 6px 12px #0000002d}.edit-dropdown-item{display:block;width:100%;padding:8px 16px;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0;cursor:pointer}.edit-dropdown-item:is(:hover,:focus){color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-button-content{display:flex;align-items:center;gap:8px}.button-icon{width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center}.button-icon ::ng-deep svg{width:20px;height:20px}.button-name{font-size:14px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "18.2.13", ngImport: i0, type: NxtInfoCard, decorators: [{ type: Component, args: [{ selector: 'nxt-info-card', standalone: true, imports: [CommonModule], template: "<div class=\"workforce-card\" [ngStyle]=\"{'background-color': getCurrentBgColor(), 'padding': padding}\"\n (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\n\n <div class=\"card-content\">\n <!-- Left image -->\n <div *ngIf=\"isImageLeft\" class=\"image-container left-image\"\n [ngStyle]=\"{'background-color': getCurrentIconBgColor()}\">\n <img [src]=\"getCurrentImgSrc()\" alt=\"icon\">\n </div>\n\n <!-- Card text content -->\n <div class=\"text-content\">\n <div class=\"title\">{{ title }}</div>\n <div class=\"value\">{{ value }}</div>\n <div *ngIf=\"description\" class=\"description\">{{ description }}</div>\n <div *ngIf=\"content\" class=\"additional-content\">{{ content }}</div>\n </div>\n\n <!-- Right image -->\n <div *ngIf=\"isImageRight\" class=\"image-container right-image\"\n [ngStyle]=\"{'background-color': getCurrentIconBgColor()}\">\n <img [src]=\"getCurrentImgSrc()\" alt=\"icon\">\n </div>\n\n <!-- Edit button -->\n <div *ngIf=\"isEdit\" class=\"edit-button\" (click)=\"toggleDropdown(); $event.stopPropagation()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#bababa\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5Z\"\n stroke=\"#d4d4d4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path\n d=\"M13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12Z\"\n stroke=\"#d4d4d4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path\n d=\"M13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19Z\"\n stroke=\"#d4d4d4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </g>\n </svg>\n </div>\n <!-- Dropdown menu -->\n <div *ngIf=\"isDropdownOpen\" class=\"edit-dropdown-menu show\">\n <div *ngFor=\"let button of editConfig.buttons\" class=\"edit-dropdown-item\" (click)=\"onButtonClick(button)\">\n <div class=\"dropdown-button-content\">\n <img *ngIf=\"button.isImageSvg && button.iconSrc\" [src]=\"button.iconSrc\" alt=\"icon\" class=\"button-icon\">\n <span class=\"button-name\">{{ button.name }}</span>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".workforce-card{border-radius:8px;box-shadow:0 2px 8px #0000001a;transition:all .3s ease;display:flex;align-items:center;position:relative;width:100%;max-width:300px;box-sizing:border-box}.card-content{display:flex;align-items:flex-start;width:100%;position:relative}.image-container{display:flex;align-items:center;justify-content:center;border-radius:50%;width:48px;height:48px;flex-shrink:0}.image-container img{width:24px;height:24px;object-fit:contain}.left-image{margin-right:16px;margin-top:4px}.right-image{margin-left:16px;margin-top:4px}.text-content{flex-grow:1;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.title{color:#6c757d;font-size:14px;margin-bottom:4px}.value{color:#192656;font-size:24px;font-weight:700;line-height:1.2}.description{color:#6c757d;font-size:12px;margin-top:4px}.additional-content{margin-top:8px;font-size:14px;line-height:1.4}.edit-button{position:absolute;top:-9px;right:-16px;cursor:pointer;color:#6c757d;display:flex;align-items:center;justify-content:center;width:24px;height:24px;background-color:#fff;border-radius:15px;padding:2px}.edit-button:hover{color:#000;background-color:#f4f4f4}.edit-dropdown-menu{position:absolute;top:18%;right:0;z-index:1000;min-width:80px;max-height:75px;background-color:#fff;overflow-y:auto;border:1px solid rgba(0,0,0,.15);border-radius:4px;box-shadow:0 6px 12px #0000002d}.edit-dropdown-item{display:block;width:100%;padding:8px 16px;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0;cursor:pointer}.edit-dropdown-item:is(:hover,:focus){color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-button-content{display:flex;align-items:center;gap:8px}.button-icon{width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center}.button-icon ::ng-deep svg{width:20px;height:20px}.button-name{font-size:14px}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { title: [{ type: Input }], value: [{ type: Input }], description: [{ type: Input }], content: [{ type: Input }], imgSrc: [{ type: Input }], hoverImgSrc: [{ type: Input }], color: [{ type: Input }], hoverColor: [{ type: Input }], padding: [{ type: Input }], isImageRight: [{ type: Input }], isImageLeft: [{ type: Input }], iconColor: [{ type: Input }], iconHoverColor: [{ type: Input }], isEdit: [{ type: Input }], editConfig: [{ type: Input }], buttonClick: [{ type: Output }], onClickOutside: [{ type: HostListener, args: ['document:click', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2NhcmRzL2luZm8tY2FyZC9pbmZvLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY2FyZHMvaW5mby1jYXJkL2luZm8tY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVNqRyxNQUFNLE9BQU8sV0FBVztJQTJCRjtJQTFCWCxLQUFLLEdBQVcsRUFBRSxDQUFDLENBQUMsb0JBQW9CO0lBQ3hDLEtBQUssR0FBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CO0lBQ2pELFdBQVcsR0FBVyxFQUFFLENBQUMsQ0FBQywwQkFBMEI7SUFDcEQsT0FBTyxHQUFXLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtJQUU1QyxNQUFNLEdBQVcsNERBQTRELENBQUMsQ0FBRSwyQkFBMkI7SUFDM0csV0FBVyxHQUFXLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQztJQUUzRCxLQUFLLEdBQVcsU0FBUyxDQUFDLENBQUMsb0JBQW9CO0lBQy9DLFVBQVUsR0FBVyxTQUFTLENBQUMsQ0FBQywwQkFBMEI7SUFDMUQsT0FBTyxHQUFXLE1BQU0sQ0FBQyxDQUFDLHNCQUFzQjtJQUVoRCxZQUFZLEdBQVksS0FBSyxDQUFDLENBQUMscURBQXFEO0lBQ3BGLFdBQVcsR0FBWSxJQUFJLENBQUMsQ0FBQyxvREFBb0Q7SUFDakYsU0FBUyxHQUFXLFNBQVMsQ0FBQyxDQUFDLG9CQUFvQjtJQUNuRCxjQUFjLEdBQVcsU0FBUyxDQUFDLENBQUMsMEJBQTBCO0lBRzlELE1BQU0sR0FBWSxLQUFLLENBQUMsQ0FBQywrQkFBK0I7SUFDeEQsVUFBVSxHQUFRLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtJQUVqRCxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7SUFFM0UsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUMzQixjQUFjLEdBQVksS0FBSyxDQUFDO0lBRWhDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBSSxDQUFDO0lBQy9DLFlBQVk7UUFDVixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFHRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM3RSxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQy9ELENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0MsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQVc7UUFDdkIsTUFBTSxRQUFRLEdBQUc7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWlCO1FBQzlCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQzlFLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQzt3R0EzRVUsV0FBVzs0RkFBWCxXQUFXLCtoQkNWeEIsOHRGQW9ETSw4OEREOUNNLFlBQVk7OzRGQUlYLFdBQVc7a0JBUHZCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQzsrRUFLZCxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBZ0RQLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ254dC1pbmZvLWNhcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2luZm8tY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9pbmZvLWNhcmQuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTnh0SW5mb0NhcmQge1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJyc7IC8vIHRpdGxlIG9mIHRoZSBjYXJkXG4gIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgPSAnJzsgLy8gdmFsdWUgb2YgdGhlIGNhcmRcbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnOyAvLyBkZXNjcmlwdGlvbiBvZiB0aGUgY2FyZFxuICBASW5wdXQoKSBjb250ZW50OiBzdHJpbmcgPSAnJzsgLy8gY29udGVudCBvZiB0aGUgY2FyZFxuXG4gIEBJbnB1dCgpIGltZ1NyYzogc3RyaW5nID0gJ2h0dHBzOi8vaW1nLmljb25zOC5jb20vbWF0ZXJpYWwtc2hhcnAvMjQvcGVybWFuZW50LWpvYi5wbmcnOyAgLy8gaW1hZ2Ugc291cmNlIG9mIHRoZSBjYXJkXG4gIEBJbnB1dCgpIGhvdmVySW1nU3JjOiBzdHJpbmcgPSAnJzsgLy8gaG92ZXIgaW1hZ2Ugc291cmNlIG9mIHRoZSBjYXJkXG5cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZyA9ICcjZmZmZmZmJzsgLy8gY29sb3Igb2YgdGhlIGNhcmRcbiAgQElucHV0KCkgaG92ZXJDb2xvcjogc3RyaW5nID0gJyNmOGY5ZmEnOyAvLyBob3ZlciBjb2xvciBvZiB0aGUgY2FyZFxuICBASW5wdXQoKSBwYWRkaW5nOiBzdHJpbmcgPSAnMjBweCc7IC8vIHBhZGRpbmcgb2YgdGhlIGNhcmRcblxuICBASW5wdXQoKSBpc0ltYWdlUmlnaHQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gd2hldGhlciB0aGUgaW1hZ2UgaXMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNhcmRcbiAgQElucHV0KCkgaXNJbWFnZUxlZnQ6IGJvb2xlYW4gPSB0cnVlOyAvLyB3aGV0aGVyIHRoZSBpbWFnZSBpcyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjYXJkXG4gIEBJbnB1dCgpIGljb25Db2xvcjogc3RyaW5nID0gJyNmOGY5ZmEnOyAvLyBjb2xvciBvZiB0aGUgaWNvblxuICBASW5wdXQoKSBpY29uSG92ZXJDb2xvcjogc3RyaW5nID0gJyNmZmZmZmYnOyAvLyBob3ZlciBjb2xvciBvZiB0aGUgaWNvblxuXG5cbiAgQElucHV0KCkgaXNFZGl0OiBib29sZWFuID0gZmFsc2U7IC8vIHdoZXRoZXIgdGhlIGNhcmQgaXMgZWRpdGFibGVcbiAgQElucHV0KCkgZWRpdENvbmZpZzogYW55ID0gbnVsbDsgLy8gZWRpdCBjb25maWcgb2YgdGhlIGNhcmRcblxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnV0dG9uOiBhbnksIGNhcmREYXRhOiBhbnkgfT4oKTtcblxuICBpc0hvdmVyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHsgfVxuICBvbk1vdXNlRW50ZXIoKSB7XG4gICAgdGhpcy5pc0hvdmVyZWQgPSB0cnVlO1xuICB9XG5cbiAgb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuaXNIb3ZlcmVkID0gZmFsc2U7XG4gIH1cblxuXG4gIGdldEN1cnJlbnRJbWdTcmMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0hvdmVyZWQgJiYgdGhpcy5ob3ZlckltZ1NyYyA/IHRoaXMuaG92ZXJJbWdTcmMgOiB0aGlzLmltZ1NyYztcbiAgfVxuXG4gIGdldEN1cnJlbnRCZ0NvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNIb3ZlcmVkID8gdGhpcy5ob3ZlckNvbG9yIDogdGhpcy5jb2xvcjtcbiAgfVxuICBnZXRDdXJyZW50SWNvbkJnQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0hvdmVyZWQgPyB0aGlzLmljb25Ib3ZlckNvbG9yIDogdGhpcy5pY29uQ29sb3I7XG4gIH1cbiAgdG9nZ2xlRHJvcGRvd24oKSB7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzRHJvcGRvd25PcGVuO1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpIHtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogYW55KSB7XG4gICAgY29uc3QgY2FyZERhdGEgPSB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnRcbiAgICB9O1xuXG4gICAgdGhpcy5idXR0b25DbGljay5lbWl0KHsgYnV0dG9uLCBjYXJkRGF0YSB9KTtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgfVxuICBoYXNFZGl0QnV0dG9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkaXQgJiYgdGhpcy5lZGl0Q29uZmlnICYmIHRoaXMuZWRpdENvbmZpZy5idXR0b25zICYmIHRoaXMuZWRpdENvbmZpZy5idXR0b25zLmxlbmd0aCA+IDA7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrT3V0c2lkZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuICYmICF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG59IiwiPGRpdiBjbGFzcz1cIndvcmtmb3JjZS1jYXJkXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogZ2V0Q3VycmVudEJnQ29sb3IoKSwgJ3BhZGRpbmcnOiBwYWRkaW5nfVwiXG4gIChtb3VzZWVudGVyKT1cIm9uTW91c2VFbnRlcigpXCIgKG1vdXNlbGVhdmUpPVwib25Nb3VzZUxlYXZlKClcIj5cblxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgPCEtLSBMZWZ0IGltYWdlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0ltYWdlTGVmdFwiIGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyIGxlZnQtaW1hZ2VcIlxuICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogZ2V0Q3VycmVudEljb25CZ0NvbG9yKCl9XCI+XG4gICAgICA8aW1nIFtzcmNdPVwiZ2V0Q3VycmVudEltZ1NyYygpXCIgYWx0PVwiaWNvblwiPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDYXJkIHRleHQgY29udGVudCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57eyB0aXRsZSB9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInZhbHVlXCI+e3sgdmFsdWUgfX08L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZGVzY3JpcHRpb25cIj57eyBkZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnRcIiBjbGFzcz1cImFkZGl0aW9uYWwtY29udGVudFwiPnt7IGNvbnRlbnQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmlnaHQgaW1hZ2UgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzSW1hZ2VSaWdodFwiIGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyIHJpZ2h0LWltYWdlXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IGdldEN1cnJlbnRJY29uQmdDb2xvcigpfVwiPlxuICAgICAgPGltZyBbc3JjXT1cImdldEN1cnJlbnRJbWdTcmMoKVwiIGFsdD1cImljb25cIj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRWRpdCBidXR0b24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzRWRpdFwiIGNsYXNzPVwiZWRpdC1idXR0b25cIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHJva2U9XCIjYmFiYWJhXCI+XG4gICAgICAgIDxnIGlkPVwiU1ZHUmVwb19iZ0NhcnJpZXJcIiBzdHJva2Utd2lkdGg9XCIwXCI+PC9nPlxuICAgICAgICA8ZyBpZD1cIlNWR1JlcG9fdHJhY2VyQ2FycmllclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvZz5cbiAgICAgICAgPGcgaWQ9XCJTVkdSZXBvX2ljb25DYXJyaWVyXCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVDMTEgNS41NTIyOCAxMS40NDc3IDYgMTIgNkMxMi41NTIzIDYgMTMgNS41NTIyOCAxMyA1WlwiXG4gICAgICAgICAgICBzdHJva2U9XCIjZDRkNGQ0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xMyAxMkMxMyAxMS40NDc3IDEyLjU1MjMgMTEgMTIgMTFDMTEuNDQ3NyAxMSAxMSAxMS40NDc3IDExIDEyQzExIDEyLjU1MjMgMTEuNDQ3NyAxMyAxMiAxM0MxMi41NTIzIDEzIDEzIDEyLjU1MjMgMTMgMTJaXCJcbiAgICAgICAgICAgIHN0cm9rZT1cIiNkNGQ0ZDRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlDMTEgMTkuNTUyMyAxMS40NDc3IDIwIDEyIDIwQzEyLjU1MjMgMjAgMTMgMTkuNTUyMyAxMyAxOVpcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiI2Q0ZDRkNFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gRHJvcGRvd24gbWVudSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNEcm9wZG93bk9wZW5cIiBjbGFzcz1cImVkaXQtZHJvcGRvd24tbWVudSBzaG93XCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBidXR0b24gb2YgZWRpdENvbmZpZy5idXR0b25zXCIgY2xhc3M9XCJlZGl0LWRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwib25CdXR0b25DbGljayhidXR0b24pXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1idXR0b24tY29udGVudFwiPlxuICAgICAgICAgIDxpbWcgKm5nSWY9XCJidXR0b24uaXNJbWFnZVN2ZyAmJiBidXR0b24uaWNvblNyY1wiIFtzcmNdPVwiYnV0dG9uLmljb25TcmNcIiBhbHQ9XCJpY29uXCIgY2xhc3M9XCJidXR0b24taWNvblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLW5hbWVcIj57eyBidXR0b24ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=