truly-ui
Version:
Web Components for Desktop Applications.
73 lines (71 loc) • 18.3 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Component, EventEmitter, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/cdk/overlay";
import * as i3 from "../icons/icons";
export class TlContextMenuComponent {
constructor(changes) {
this.changes = changes;
this.select = new EventEmitter();
this.isOpen = false;
this.positions = [
{
originX: 'end',
originY: 'top',
overlayX: 'start',
overlayY: 'top',
},
{
originX: 'end',
originY: 'bottom',
overlayX: 'start',
overlayY: 'bottom',
}
];
}
ngOnInit() { }
init(items, context) {
this.contextMenu = items;
this.currentContext = context;
this.changes.detectChanges();
}
onClickItem(callback) {
if (callback) {
this.select.emit();
return this.currentContext ? callback(this.currentContext) : callback();
}
}
onItemMouseOver(item) {
if (item?.children?.length > 0) {
this.isOpen = !this.isOpen;
}
}
}
/** @nocollapse */ TlContextMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlContextMenuComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlContextMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlContextMenuComponent, selector: "tl-context-menu", outputs: { select: "select" }, ngImport: i0, template: "<div class=\"ui-menu-context-wrapper\">\n <ul class=\"ui-menu-context\">\n <ng-template ngFor let-item [ngForOf]=\"contextMenu\">\n <ng-template\n [ngTemplateOutlet]=\"templateList\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\n </ng-template>\n </ng-template>\n </ul>\n</div>\n\n<ng-template #templateUL let-children >\n <ul class=\"ui-menu-context\">\n <ng-template ngFor let-item [ngForOf]=\"children\">\n <ng-template\n [ngTemplateOutlet]=\"templateList\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\n </ng-template>\n </ng-template>\n </ul>\n</ng-template>\n\n<ng-template #templateList let-item>\n <li class=\"ui-item-context\" (click)=\"onClickItem(item?.callback);\" (mouseenter)=\"onItemMouseOver(item)\"\n [class.hasChildren]=\"item?.children\"\n [class.no-icon]=\"!item?.icon || item?.template\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\">\n\n <ng-container *ngIf=\"item?.template; else listDefault\">\n <ng-container *ngTemplateOutlet=\"item?.template\"></ng-container>\n </ng-container>\n\n <ng-template #listDefault>\n <tl-icon [color]=\"item?.iconColor\" [size]=\"'15px'\" *ngIf=\"item?.icon\">{{ item?.icon }}</tl-icon>\n <span class=\"ui-item-label\">{{ item?.label }}</span>\n <tl-icon class=\"ui-item-arrow\" *ngIf=\"item?.children\" [lib]=\"'ion'\" [style]=\"'ios'\" [size]=\"'15px'\">arrow-forward</tl-icon>\n </ng-template>\n\n <ng-template cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayOpen]=\"isOpen\">\n <ng-container *ngIf=\"item?.children\" >\n <ng-container *ngTemplateOutlet=\"templateUL; context: { $implicit: item?.children }\"></ng-container>\n </ng-container>\n </ng-template>\n\n\n </li>\n</ng-template>\n\n\n", styles: [".ui-menu-context-wrapper{width:100%;height:100%}.ui-menu-context{list-style:none;margin:0;padding:0;font-size:10pt;z-index:1000;opacity:1;display:flex;align-items:center;flex-flow:column}.ui-item-context{list-style:none;margin:0;font-size:10pt;z-index:1000;padding:10px;opacity:1;display:inline-grid;grid-template-columns:20px 1fr;text-align:left;-webkit-user-select:none;user-select:none;width:100%;box-sizing:border-box}.ui-item-context:hover{cursor:pointer}.ui-item-context.no-icon{grid-template-columns:1fr!important}.ui-item-context.hasChildren{grid-template-columns:1fr 30px!important}.ui-item-context.hasChildren:not(.no-icon){grid-template-columns:20px 1fr 30px!important}.ui-item-label{white-space:nowrap}.ui-item-arrow{text-align:right}\n"], dependencies: [{ 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: i3.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlContextMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'tl-context-menu', template: "<div class=\"ui-menu-context-wrapper\">\n <ul class=\"ui-menu-context\">\n <ng-template ngFor let-item [ngForOf]=\"contextMenu\">\n <ng-template\n [ngTemplateOutlet]=\"templateList\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\n </ng-template>\n </ng-template>\n </ul>\n</div>\n\n<ng-template #templateUL let-children >\n <ul class=\"ui-menu-context\">\n <ng-template ngFor let-item [ngForOf]=\"children\">\n <ng-template\n [ngTemplateOutlet]=\"templateList\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\n </ng-template>\n </ng-template>\n </ul>\n</ng-template>\n\n<ng-template #templateList let-item>\n <li class=\"ui-item-context\" (click)=\"onClickItem(item?.callback);\" (mouseenter)=\"onItemMouseOver(item)\"\n [class.hasChildren]=\"item?.children\"\n [class.no-icon]=\"!item?.icon || item?.template\"\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\">\n\n <ng-container *ngIf=\"item?.template; else listDefault\">\n <ng-container *ngTemplateOutlet=\"item?.template\"></ng-container>\n </ng-container>\n\n <ng-template #listDefault>\n <tl-icon [color]=\"item?.iconColor\" [size]=\"'15px'\" *ngIf=\"item?.icon\">{{ item?.icon }}</tl-icon>\n <span class=\"ui-item-label\">{{ item?.label }}</span>\n <tl-icon class=\"ui-item-arrow\" *ngIf=\"item?.children\" [lib]=\"'ion'\" [style]=\"'ios'\" [size]=\"'15px'\">arrow-forward</tl-icon>\n </ng-template>\n\n <ng-template cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayOpen]=\"isOpen\">\n <ng-container *ngIf=\"item?.children\" >\n <ng-container *ngTemplateOutlet=\"templateUL; context: { $implicit: item?.children }\"></ng-container>\n </ng-container>\n </ng-template>\n\n\n </li>\n</ng-template>\n\n\n", styles: [".ui-menu-context-wrapper{width:100%;height:100%}.ui-menu-context{list-style:none;margin:0;padding:0;font-size:10pt;z-index:1000;opacity:1;display:flex;align-items:center;flex-flow:column}.ui-item-context{list-style:none;margin:0;font-size:10pt;z-index:1000;padding:10px;opacity:1;display:inline-grid;grid-template-columns:20px 1fr;text-align:left;-webkit-user-select:none;user-select:none;width:100%;box-sizing:border-box}.ui-item-context:hover{cursor:pointer}.ui-item-context.no-icon{grid-template-columns:1fr!important}.ui-item-context.hasChildren{grid-template-columns:1fr 30px!important}.ui-item-context.hasChildren:not(.no-icon){grid-template-columns:20px 1fr 30px!important}.ui-item-label{white-space:nowrap}.ui-item-arrow{text-align:right}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { select: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvY29udGV4dG1lbnUvY29udGV4dC1tZW51LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvY29udGV4dG1lbnUvY29udGV4dC1tZW51Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBb0JFO0FBRUYsT0FBTyxFQUFvQixTQUFTLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFXekYsTUFBTSxPQUFPLHNCQUFzQjtJQXlCakMsWUFBb0IsT0FBMEI7UUFBMUIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFuQnBDLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6RCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsY0FBUyxHQUFvQjtZQUMzQjtnQkFDRSxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsS0FBSztnQkFDZCxRQUFRLEVBQUUsT0FBTztnQkFDakIsUUFBUSxFQUFFLEtBQUs7YUFDaEI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsUUFBUTtnQkFDakIsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFFBQVEsRUFBRSxRQUFRO2FBQ25CO1NBQ0YsQ0FBQztJQUUrQyxDQUFDO0lBRWxELFFBQVEsS0FBSSxDQUFDO0lBRWIsSUFBSSxDQUFFLEtBQTZCLEVBQUUsT0FBTztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUUsUUFBUTtRQUNuQixJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN6RTtJQUNILENBQUM7SUFFRCxlQUFlLENBQUUsSUFBSTtRQUNuQixJQUFLLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRztZQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUM1QjtJQUNILENBQUM7O3VJQTlDVSxzQkFBc0I7MkhBQXRCLHNCQUFzQixzRkNqQ25DLHc1REFvREE7NEZEbkJhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxpQkFBaUI7d0dBVWpCLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgTUlUIExpY2Vuc2VcblxuICAgIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICAgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICAgIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICAgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gICAgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAgICBTT0ZUV0FSRS5cbiovXG5cbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRleHRNZW51SW50ZXJmYWNlfSBmcm9tICcuL2ludGVyZmFjZXMvY29udGV4dC1tZW51LmludGVyZmFjZSc7XG4vLyBpbXBvcnQge0Nvbm5lY3RlZFBvc2l0aW9ufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheS9wb3NpdGlvbi9mbGV4aWJsZS1jb25uZWN0ZWQtcG9zaXRpb24tc3RyYXRlZ3knO1xuaW1wb3J0IHtPdmVybGF5TW9kdWxlfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGwtY29udGV4dC1tZW51JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRleHQtbWVudS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGV4dC1tZW51LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGxDb250ZXh0TWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIGNvbnRleHRNZW51OiBDb250ZXh0TWVudUludGVyZmFjZVtdO1xuXG4gIHByaXZhdGUgY3VycmVudENvbnRleHQ7XG5cbiAgQE91dHB1dCgpIHNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgaXNPcGVuID0gZmFsc2U7XG5cbiAgcG9zaXRpb25zOiBPdmVybGF5TW9kdWxlW10gPSBbXG4gICAge1xuICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgIH0sXG4gICAge1xuICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgIH1cbiAgXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZXM6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge31cblxuICBpbml0KCBpdGVtczogQ29udGV4dE1lbnVJbnRlcmZhY2VbXSwgY29udGV4dCApIHtcbiAgICB0aGlzLmNvbnRleHRNZW51ID0gaXRlbXM7XG4gICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5jaGFuZ2VzLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uQ2xpY2tJdGVtKCBjYWxsYmFjayApIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuc2VsZWN0LmVtaXQoKTtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb250ZXh0ID8gY2FsbGJhY2sodGhpcy5jdXJyZW50Q29udGV4dCkgOiBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uSXRlbU1vdXNlT3ZlciggaXRlbSApIHtcbiAgICBpZiAoIGl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwICkge1xuICAgICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ1aS1tZW51LWNvbnRleHQtd3JhcHBlclwiPlxuICA8dWwgY2xhc3M9XCJ1aS1tZW51LWNvbnRleHRcIj5cbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwiY29udGV4dE1lbnVcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZUxpc3RcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3VsPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVVTCBsZXQtY2hpbGRyZW4gPlxuICA8dWwgY2xhc3M9XCJ1aS1tZW51LWNvbnRleHRcIj5cbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwiY2hpbGRyZW5cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZUxpc3RcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3VsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUxpc3QgbGV0LWl0ZW0+XG4gIDxsaSBjbGFzcz1cInVpLWl0ZW0tY29udGV4dFwiIChjbGljayk9XCJvbkNsaWNrSXRlbShpdGVtPy5jYWxsYmFjayk7XCIgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VPdmVyKGl0ZW0pXCJcbiAgICAgIFtjbGFzcy5oYXNDaGlsZHJlbl09XCJpdGVtPy5jaGlsZHJlblwiXG4gICAgICBbY2xhc3Mubm8taWNvbl09XCIhaXRlbT8uaWNvbiB8fCBpdGVtPy50ZW1wbGF0ZVwiXG4gICAgICBjZGtPdmVybGF5T3JpZ2luICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0/LnRlbXBsYXRlOyBlbHNlIGxpc3REZWZhdWx0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbT8udGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbGlzdERlZmF1bHQ+XG4gICAgICA8dGwtaWNvbiBbY29sb3JdPVwiaXRlbT8uaWNvbkNvbG9yXCIgW3NpemVdPVwiJzE1cHgnXCIgKm5nSWY9XCJpdGVtPy5pY29uXCI+e3sgaXRlbT8uaWNvbiB9fTwvdGwtaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidWktaXRlbS1sYWJlbFwiPnt7IGl0ZW0/LmxhYmVsIH19PC9zcGFuPlxuICAgICAgPHRsLWljb24gY2xhc3M9XCJ1aS1pdGVtLWFycm93XCIgKm5nSWY9XCJpdGVtPy5jaGlsZHJlblwiIFtsaWJdPVwiJ2lvbidcIiBbc3R5bGVdPVwiJ2lvcydcIiBbc2l6ZV09XCInMTVweCdcIj5hcnJvdy1mb3J3YXJkPC90bC1pY29uPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cInBvc2l0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0/LmNoaWxkcmVuXCIgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVVTDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0/LmNoaWxkcmVuIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cblxuICA8L2xpPlxuPC9uZy10ZW1wbGF0ZT5cblxuXG4iXX0=