UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

75 lines 23.8 kB
import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/flex-layout/extended"; export class MenuComponent { menuItems = []; closeOnOutsideClick = false; itemSelected = new EventEmitter(); menuToggle = new EventEmitter(); showMenuItems = false; navigatedHistory = []; toggleMenu() { this.showMenuItems = !this.showMenuItems; if (!this.showMenuItems) { this.menuItems.forEach((item) => (item.toggle = false)); this.navigatedHistory = []; } } resetMenuState() { this.menuItems.forEach((item) => (item.toggle = false)); this.navigatedHistory = []; this.showMenuItems = false; } onDocumentClick(event) { if (this.closeOnOutsideClick && this.showMenuItems) { const clickedElement = event.target; const menuElement = document.querySelector('.menu-container'); // Adicionar verificação explícita para null if (menuElement && !menuElement.contains(clickedElement)) { this.showMenuItems = false; this.menuToggle.emit(this.showMenuItems); // Emite o estado atualizado this.resetMenuState(); } } } expandItem(item) { item.toggle = !item.toggle; } navigateToSubMenu(subItem) { this.navigatedHistory.push(subItem); } goBack() { if (this.navigatedHistory.length > 1) { this.navigatedHistory.pop(); } else { this.navigatedHistory = []; } } selectSubItem(item) { this.itemSelected.emit(item); console.log(`Subitem selected: ${item.name}`); } get currentNavigatedItem() { return this.navigatedHistory[this.navigatedHistory.length - 1] || null; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MenuComponent, selector: "cfc-menu", inputs: { menuItems: "menuItems", closeOnOutsideClick: "closeOnOutsideClick" }, outputs: { itemSelected: "itemSelected", menuToggle: "menuToggle" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"menu-container\">\r\n <!-- Modo Principal (Expans\u00E3o) -->\r\n <div *ngIf=\"navigatedHistory.length === 0\">\r\n <!-- Cabe\u00E7alho do Menu -->\r\n <div class=\"menu-header\">\r\n <button class=\"menu-toggle\" (click)=\"toggleMenu()\">\r\n <i class=\"fas fa-bars\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Lista Principal de Itens -->\r\n <ul class=\"menu-list\" *ngIf=\"showMenuItems\">\r\n <li *ngFor=\"let item of menuItems\" class=\"menu-item\">\r\n <div class=\"menu-item-header\" (click)=\"expandItem(item)\">\r\n <i *ngIf=\"item.iconName\" class=\"fas\" [ngClass]=\"item.iconName\"></i>\r\n <span>{{ item.name }}</span>\r\n <i *ngIf=\"item.subItems\" class=\"fas fa-chevron-down\" [ngClass]=\"{'rotated': item.toggle}\"></i>\r\n </div>\r\n\r\n <!-- Submenu (Expans\u00E3o) -->\r\n <ul *ngIf=\"item.toggle && item.subItems\" class=\"sub-menu\">\r\n <li *ngFor=\"let subItem of item.subItems\" class=\"submenu-item\">\r\n <div class=\"submenu-item-header\" (click)=\"navigateToSubMenu(subItem)\">\r\n <i *ngIf=\"subItem.iconName\" class=\"fas\" [ngClass]=\"subItem.iconName\"></i>\r\n <span>{{ subItem.name }}</span>\r\n <i *ngIf=\"subItem.subItems\" class=\"fas fa-chevron-right\"></i>\r\n </div>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Modo de Navega\u00E7\u00E3o -->\r\n <div *ngIf=\"currentNavigatedItem\" class=\"navigation-mode\">\r\n <!-- Cabe\u00E7alho da Navega\u00E7\u00E3o -->\r\n <div class=\"navigation-header\">\r\n <button class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"fas fa-chevron-left\"></i>\r\n </button>\r\n <span class=\"navigation-title\">{{ currentNavigatedItem.name }}</span>\r\n <i *ngIf=\"currentNavigatedItem.iconName\" class=\"navigation-icon fas\" [ngClass]=\"currentNavigatedItem.iconName\"></i>\r\n </div>\r\n\r\n <!-- Lista de SubItens Navegados -->\r\n <ul class=\"navigation-list\">\r\n <li *ngFor=\"let subSubItem of currentNavigatedItem.subItems\" class=\"navigation-item\">\r\n <div class=\"navigation-item-inner\" (click)=\"navigateToSubMenu(subSubItem)\">\r\n <i *ngIf=\"subSubItem.iconName\" class=\"fas\" [ngClass]=\"subSubItem.iconName\"></i>\r\n <span>{{ subSubItem.name }}</span>\r\n <i *ngIf=\"subSubItem.subItems\" class=\"fas fa-chevron-right\"></i>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.menu-container{border-radius:8px;min-width:316px;font-family:Arial,sans-serif;transition:all .3s ease-in-out;color:#1351b4;font-weight:300}.menu-header{display:flex;padding:8px}.menu-toggle{background:none;border:none;cursor:pointer;color:#0056b3;font-size:24px}.menu-toggle:hover{background-color:#d0e4ff;border-radius:50%}.menu-list{list-style:none;padding:0;margin:0}.menu-item{width:100%;cursor:pointer;display:flex;align-items:center;flex-direction:column;transition:background-color .3s;border-bottom:1px solid #ccc}.menu-item-header{display:flex;align-items:center;gap:8px;width:100%;padding:20px 10px}.menu-item-header:hover{background-color:#d0e4ff70}.menu-item-header i:first-child{color:#0056b3;font-size:18px}.menu-item-header span{flex-grow:1}.menu-item-header i:last-child{color:#0056b3;font-size:16px;margin-left:auto}.sub-menu{list-style:none;width:100%;padding:0;background-color:#f8f8f8}.sub-menu .submenu-item{cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;padding-left:20px}.sub-menu .submenu-item:hover{background-color:#d0e4ff70}.submenu-item-header{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;padding:20px 10px}.submenu-item-header span{flex-grow:1}.navigation-mode{background-color:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;min-width:316px}.navigation-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e0e0e0;padding:20px 10px}.back-button{background:none;border:none;cursor:pointer;color:#0056b3;font-size:18px;padding:0}.back-button:hover{text-decoration:underline}.navigation-title{flex-grow:1;font-size:16px;font-weight:300;color:#0056b3;text-align:center}.navigation-icon{color:#0056b3;font-size:18px}.navigation-list{list-style:none;padding:0;margin:0;background-color:#f8f8f8}.navigation-item{display:flex;align-items:center;gap:8px;width:100%;padding:20px 15px}.navigation-item:hover{background-color:#d0e4ff;color:#0056b3}.navigation-item-inner{display:flex;align-items:center;width:100%}.navigation-item-inner span{flex-grow:1}.navigation-item-inner i:last-child{margin-left:auto;color:#0056b3;font-size:16px}\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: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-menu', template: "<div class=\"menu-container\">\r\n <!-- Modo Principal (Expans\u00E3o) -->\r\n <div *ngIf=\"navigatedHistory.length === 0\">\r\n <!-- Cabe\u00E7alho do Menu -->\r\n <div class=\"menu-header\">\r\n <button class=\"menu-toggle\" (click)=\"toggleMenu()\">\r\n <i class=\"fas fa-bars\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Lista Principal de Itens -->\r\n <ul class=\"menu-list\" *ngIf=\"showMenuItems\">\r\n <li *ngFor=\"let item of menuItems\" class=\"menu-item\">\r\n <div class=\"menu-item-header\" (click)=\"expandItem(item)\">\r\n <i *ngIf=\"item.iconName\" class=\"fas\" [ngClass]=\"item.iconName\"></i>\r\n <span>{{ item.name }}</span>\r\n <i *ngIf=\"item.subItems\" class=\"fas fa-chevron-down\" [ngClass]=\"{'rotated': item.toggle}\"></i>\r\n </div>\r\n\r\n <!-- Submenu (Expans\u00E3o) -->\r\n <ul *ngIf=\"item.toggle && item.subItems\" class=\"sub-menu\">\r\n <li *ngFor=\"let subItem of item.subItems\" class=\"submenu-item\">\r\n <div class=\"submenu-item-header\" (click)=\"navigateToSubMenu(subItem)\">\r\n <i *ngIf=\"subItem.iconName\" class=\"fas\" [ngClass]=\"subItem.iconName\"></i>\r\n <span>{{ subItem.name }}</span>\r\n <i *ngIf=\"subItem.subItems\" class=\"fas fa-chevron-right\"></i>\r\n </div>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Modo de Navega\u00E7\u00E3o -->\r\n <div *ngIf=\"currentNavigatedItem\" class=\"navigation-mode\">\r\n <!-- Cabe\u00E7alho da Navega\u00E7\u00E3o -->\r\n <div class=\"navigation-header\">\r\n <button class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"fas fa-chevron-left\"></i>\r\n </button>\r\n <span class=\"navigation-title\">{{ currentNavigatedItem.name }}</span>\r\n <i *ngIf=\"currentNavigatedItem.iconName\" class=\"navigation-icon fas\" [ngClass]=\"currentNavigatedItem.iconName\"></i>\r\n </div>\r\n\r\n <!-- Lista de SubItens Navegados -->\r\n <ul class=\"navigation-list\">\r\n <li *ngFor=\"let subSubItem of currentNavigatedItem.subItems\" class=\"navigation-item\">\r\n <div class=\"navigation-item-inner\" (click)=\"navigateToSubMenu(subSubItem)\">\r\n <i *ngIf=\"subSubItem.iconName\" class=\"fas\" [ngClass]=\"subSubItem.iconName\"></i>\r\n <span>{{ subSubItem.name }}</span>\r\n <i *ngIf=\"subSubItem.subItems\" class=\"fas fa-chevron-right\"></i>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.menu-container{border-radius:8px;min-width:316px;font-family:Arial,sans-serif;transition:all .3s ease-in-out;color:#1351b4;font-weight:300}.menu-header{display:flex;padding:8px}.menu-toggle{background:none;border:none;cursor:pointer;color:#0056b3;font-size:24px}.menu-toggle:hover{background-color:#d0e4ff;border-radius:50%}.menu-list{list-style:none;padding:0;margin:0}.menu-item{width:100%;cursor:pointer;display:flex;align-items:center;flex-direction:column;transition:background-color .3s;border-bottom:1px solid #ccc}.menu-item-header{display:flex;align-items:center;gap:8px;width:100%;padding:20px 10px}.menu-item-header:hover{background-color:#d0e4ff70}.menu-item-header i:first-child{color:#0056b3;font-size:18px}.menu-item-header span{flex-grow:1}.menu-item-header i:last-child{color:#0056b3;font-size:16px;margin-left:auto}.sub-menu{list-style:none;width:100%;padding:0;background-color:#f8f8f8}.sub-menu .submenu-item{cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;padding-left:20px}.sub-menu .submenu-item:hover{background-color:#d0e4ff70}.submenu-item-header{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;padding:20px 10px}.submenu-item-header span{flex-grow:1}.navigation-mode{background-color:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;min-width:316px}.navigation-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e0e0e0;padding:20px 10px}.back-button{background:none;border:none;cursor:pointer;color:#0056b3;font-size:18px;padding:0}.back-button:hover{text-decoration:underline}.navigation-title{flex-grow:1;font-size:16px;font-weight:300;color:#0056b3;text-align:center}.navigation-icon{color:#0056b3;font-size:18px}.navigation-list{list-style:none;padding:0;margin:0;background-color:#f8f8f8}.navigation-item{display:flex;align-items:center;gap:8px;width:100%;padding:20px 15px}.navigation-item:hover{background-color:#d0e4ff;color:#0056b3}.navigation-item-inner{display:flex;align-items:center;width:100%}.navigation-item-inner span{flex-grow:1}.navigation-item-inner i:last-child{margin-left:auto;color:#0056b3;font-size:16px}\n"] }] }], propDecorators: { menuItems: [{ type: Input }], closeOnOutsideClick: [{ type: Input }], itemSelected: [{ type: Output }], menuToggle: [{ type: Output }], onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL21lbnUvbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL21lbnUvbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQXlCckYsTUFBTSxPQUFPLGFBQWE7SUFDZixTQUFTLEdBQWUsRUFBRSxDQUFDO0lBQzNCLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUNwQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztJQUMvQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUVuRCxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLGdCQUFnQixHQUFrQixFQUFFLENBQUM7SUFFckMsVUFBVTtRQUNSLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUdELGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7WUFDbkQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBRTlELDRDQUE0QztZQUM1QyxJQUFJLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtnQkFDdEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFjO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxPQUFvQjtRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsSUFBaUI7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3pFLENBQUM7d0dBN0RVLGFBQWE7NEZBQWIsYUFBYSwyUUN6QjFCLHdpRkF1RE07OzRGRDlCTyxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFVBQVU7OEJBS1gsU0FBUztzQkFBakIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQW9CUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBJbnRlcmZhY2UgcGFyYSBvcyBzdWJpdGVuc1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1Yk1lbnVJdGVtIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0b2dnbGU/OiBib29sZWFuOyAvLyBDb250cm9sYSBhIGV4aWJpw6fDo28gZG8gc3VibWVudVxyXG4gIGljb25OYW1lPzogc3RyaW5nOyAvLyDDjWNvbmUgb3BjaW9uYWxcclxuICBzdWJJdGVtcz86IFN1Yk1lbnVJdGVtW107IC8vIExpc3RhIGRlIHN1Yml0ZW5zXHJcbn1cclxuXHJcbi8vIEludGVyZmFjZSBwYXJhIG9zIGl0ZW5zIHByaW5jaXBhaXNcclxuZXhwb3J0IGludGVyZmFjZSBNZW51SXRlbSB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdG9nZ2xlPzogYm9vbGVhbjsgLy8gQ29udHJvbGEgYSBleGliacOnw6NvIGRvIHN1Ym1lbnVcclxuICBpY29uTmFtZT86IHN0cmluZzsgLy8gw41jb25lIG9wY2lvbmFsXHJcbiAgc3ViSXRlbXM/OiBTdWJNZW51SXRlbVtdOyAvLyBMaXN0YSBkZSBzdWJpdGVuc1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy1tZW51JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWVudS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWVudUNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcbiAgQElucHV0KCkgY2xvc2VPbk91dHNpZGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBpdGVtU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN1Yk1lbnVJdGVtPigpO1xyXG4gIEBPdXRwdXQoKSBtZW51VG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBzaG93TWVudUl0ZW1zID0gZmFsc2U7XHJcbiAgbmF2aWdhdGVkSGlzdG9yeTogU3ViTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICB0b2dnbGVNZW51KCkge1xyXG4gICAgdGhpcy5zaG93TWVudUl0ZW1zID0gIXRoaXMuc2hvd01lbnVJdGVtcztcclxuICAgIGlmICghdGhpcy5zaG93TWVudUl0ZW1zKSB7XHJcbiAgICAgIHRoaXMubWVudUl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLnRvZ2dsZSA9IGZhbHNlKSk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVkSGlzdG9yeSA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRNZW51U3RhdGUoKSB7XHJcbiAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS50b2dnbGUgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZWRIaXN0b3J5ID0gW107XHJcbiAgICB0aGlzLnNob3dNZW51SXRlbXMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmNsb3NlT25PdXRzaWRlQ2xpY2sgJiYgdGhpcy5zaG93TWVudUl0ZW1zKSB7XHJcbiAgICAgIGNvbnN0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBjb25zdCBtZW51RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWNvbnRhaW5lcicpO1xyXG4gIFxyXG4gICAgICAvLyBBZGljaW9uYXIgdmVyaWZpY2HDp8OjbyBleHBsw61jaXRhIHBhcmEgbnVsbFxyXG4gICAgICBpZiAobWVudUVsZW1lbnQgJiYgIW1lbnVFbGVtZW50LmNvbnRhaW5zKGNsaWNrZWRFbGVtZW50KSkge1xyXG4gICAgICAgIHRoaXMuc2hvd01lbnVJdGVtcyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWVudVRvZ2dsZS5lbWl0KHRoaXMuc2hvd01lbnVJdGVtcyk7IC8vIEVtaXRlIG8gZXN0YWRvIGF0dWFsaXphZG9cclxuICAgICAgICB0aGlzLnJlc2V0TWVudVN0YXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cGFuZEl0ZW0oaXRlbTogTWVudUl0ZW0pIHtcclxuICAgIGl0ZW0udG9nZ2xlID0gIWl0ZW0udG9nZ2xlO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb1N1Yk1lbnUoc3ViSXRlbTogU3ViTWVudUl0ZW0pIHtcclxuICAgIHRoaXMubmF2aWdhdGVkSGlzdG9yeS5wdXNoKHN1Ykl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgZ29CYWNrKCkge1xyXG4gICAgaWYgKHRoaXMubmF2aWdhdGVkSGlzdG9yeS5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVkSGlzdG9yeS5wb3AoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVkSGlzdG9yeSA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3ViSXRlbShpdGVtOiBTdWJNZW51SXRlbSkge1xyXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgIGNvbnNvbGUubG9nKGBTdWJpdGVtIHNlbGVjdGVkOiAke2l0ZW0ubmFtZX1gKTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50TmF2aWdhdGVkSXRlbSgpOiBTdWJNZW51SXRlbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGVkSGlzdG9yeVt0aGlzLm5hdmlnYXRlZEhpc3RvcnkubGVuZ3RoIC0gMV0gfHwgbnVsbDtcclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwibWVudS1jb250YWluZXJcIj5cclxuICA8IS0tIE1vZG8gUHJpbmNpcGFsIChFeHBhbnPDo28pIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJuYXZpZ2F0ZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgPCEtLSBDYWJlw6dhbGhvIGRvIE1lbnUgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWVudS1oZWFkZXJcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1lbnUtdG9nZ2xlXCIgKGNsaWNrKT1cInRvZ2dsZU1lbnUoKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWJhcnNcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBMaXN0YSBQcmluY2lwYWwgZGUgSXRlbnMgLS0+XHJcbiAgICA8dWwgY2xhc3M9XCJtZW51LWxpc3RcIiAqbmdJZj1cInNob3dNZW51SXRlbXNcIj5cclxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1lbnVJdGVtc1wiIGNsYXNzPVwibWVudS1pdGVtXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbS1oZWFkZXJcIiAoY2xpY2spPVwiZXhwYW5kSXRlbShpdGVtKVwiPlxyXG4gICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLmljb25OYW1lXCIgY2xhc3M9XCJmYXNcIiBbbmdDbGFzc109XCJpdGVtLmljb25OYW1lXCI+PC9pPlxyXG4gICAgICAgICAgPHNwYW4+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN1Ykl0ZW1zXCIgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCIgW25nQ2xhc3NdPVwieydyb3RhdGVkJzogaXRlbS50b2dnbGV9XCI+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFN1Ym1lbnUgKEV4cGFuc8OjbykgLS0+XHJcbiAgICAgICAgPHVsICpuZ0lmPVwiaXRlbS50b2dnbGUgJiYgaXRlbS5zdWJJdGVtc1wiIGNsYXNzPVwic3ViLW1lbnVcIj5cclxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLnN1Ykl0ZW1zXCIgY2xhc3M9XCJzdWJtZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Ym1lbnUtaXRlbS1oZWFkZXJcIiAoY2xpY2spPVwibmF2aWdhdGVUb1N1Yk1lbnUoc3ViSXRlbSlcIj5cclxuICAgICAgICAgICAgICA8aSAqbmdJZj1cInN1Ykl0ZW0uaWNvbk5hbWVcIiBjbGFzcz1cImZhc1wiIFtuZ0NsYXNzXT1cInN1Ykl0ZW0uaWNvbk5hbWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgc3ViSXRlbS5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwic3ViSXRlbS5zdWJJdGVtc1wiIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBNb2RvIGRlIE5hdmVnYcOnw6NvIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJjdXJyZW50TmF2aWdhdGVkSXRlbVwiIGNsYXNzPVwibmF2aWdhdGlvbi1tb2RlXCI+XHJcbiAgICA8IS0tIENhYmXDp2FsaG8gZGEgTmF2ZWdhw6fDo28gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibmF2aWdhdGlvbi1oZWFkZXJcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2stYnV0dG9uXCIgKGNsaWNrKT1cImdvQmFjaygpXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0XCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJuYXZpZ2F0aW9uLXRpdGxlXCI+e3sgY3VycmVudE5hdmlnYXRlZEl0ZW0ubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPGkgKm5nSWY9XCJjdXJyZW50TmF2aWdhdGVkSXRlbS5pY29uTmFtZVwiIGNsYXNzPVwibmF2aWdhdGlvbi1pY29uIGZhc1wiIFtuZ0NsYXNzXT1cImN1cnJlbnROYXZpZ2F0ZWRJdGVtLmljb25OYW1lXCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBMaXN0YSBkZSBTdWJJdGVucyBOYXZlZ2Fkb3MgLS0+XHJcbiAgICA8dWwgY2xhc3M9XCJuYXZpZ2F0aW9uLWxpc3RcIj5cclxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBzdWJTdWJJdGVtIG9mIGN1cnJlbnROYXZpZ2F0ZWRJdGVtLnN1Ykl0ZW1zXCIgY2xhc3M9XCJuYXZpZ2F0aW9uLWl0ZW1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibmF2aWdhdGlvbi1pdGVtLWlubmVyXCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9TdWJNZW51KHN1YlN1Ykl0ZW0pXCI+XHJcbiAgICAgICAgICA8aSAqbmdJZj1cInN1YlN1Ykl0ZW0uaWNvbk5hbWVcIiBjbGFzcz1cImZhc1wiIFtuZ0NsYXNzXT1cInN1YlN1Ykl0ZW0uaWNvbk5hbWVcIj48L2k+XHJcbiAgICAgICAgICA8c3Bhbj57eyBzdWJTdWJJdGVtLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8aSAqbmdJZj1cInN1YlN1Ykl0ZW0uc3ViSXRlbXNcIiBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19