@xui/components
Version:
xUI Components for Angular
80 lines • 16.1 kB
JavaScript
import { booleanAttribute, ChangeDetectionStrategy, Component, computed, ElementRef, Inject, input, Optional, signal, SkipSelf, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
import { TemplatePortal } from '@angular/cdk/portal';
import { PANEL_BAR_ACCESSOR } from './panelbar.types';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/cdk/portal";
import * as i3 from "../icon/icon";
export class XuiPanelBarItem {
get offset() {
return this.parentItem ? this.parentItem.offset + 1 : 0;
}
get _paddingLeft() {
return 8 + this.offset * 24;
}
constructor(panelBar, viewContainerRef, parentItem) {
this.panelBar = panelBar;
this.viewContainerRef = viewContainerRef;
this.parentItem = parentItem;
this._expanded = signal(false);
this.title = input();
this.content = input();
this.icon = input();
this.iconClass = input();
this.expanded = input(false, { transform: booleanAttribute });
this._children = input();
this._contentPortal = computed(() => {
const content = this._contentDirective ?? this.panelBar._itemTemplate ?? this.contentTemplate;
return new TemplatePortal(content, this.viewContainerRef, {
$implicit: {
title: this.title(),
content: this.content()
}
});
});
this._titlePortal = computed(() => {
const title = this._titleDirective ?? this.titleTemplate;
return new TemplatePortal(title, this.viewContainerRef, {
$implicit: {
title: this.title(),
content: this.content()
}
});
});
this._hasContent = computed(() => this.content() ?? this._children() ?? this._contentDirective ?? this.contentRef.nativeElement.children.length);
}
clickItem() {
if (this._hasContent()) {
this._expanded.set(!this._expanded());
// TODO; emit event
}
else {
// TODO: emit click event?
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiPanelBarItem, deps: [{ token: PANEL_BAR_ACCESSOR }, { token: i0.ViewContainerRef }, { token: XuiPanelBarItem, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: XuiPanelBarItem, selector: "xui-panelbar-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconClass: { classPropertyName: "iconClass", publicName: "iconClass", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, _children: { classPropertyName: "_children", publicName: "_children", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "x-panelbar-item" }, viewQueries: [{ propertyName: "contentTemplate", first: true, predicate: ["contentTemplate"], descendants: true, static: true }, { propertyName: "titleTemplate", first: true, predicate: ["titleTemplate"], descendants: true, static: true }, { propertyName: "contentRef", first: true, predicate: ["contentRef"], descendants: true, static: true }], ngImport: i0, template: "<div (click)=\"clickItem()\" class=\"x-panelbar-item-title\" [style.padding-left.px]=\"_paddingLeft\">\n <ng-template [cdkPortalOutlet]=\"_titlePortal()\" />\n <div class=\"x-panelbar-item-spacer\"></div>\n <xui-icon\n class=\"x-panelbar-item-chevron\"\n *ngIf=\"_hasContent()\"\n [icon]=\"_expanded() ? 'keyboard_arrow_down' : 'keyboard_arrow_up'\"\n ></xui-icon>\n</div>\n\n<div [style.display]=\"_expanded() ? 'block' : 'none'\" #contentRef>\n <ng-container *ngIf=\"_contentDirective || content()\">\n <ng-template [cdkPortalOutlet]=\"_contentPortal()\" />\n </ng-container>\n <ng-content select=\"xui-panelbar-item\"></ng-content>\n\n @for (child of _children(); track child.title) {\n <xui-panelbar-item [title]=\"child.title\" [_children]=\"child.children\" />\n }\n</div>\n\n<ng-template #contentTemplate>\n <div class=\"x-panelbar-item-content\" [style.padding-left.px]=\"_paddingLeft\">{{ content() }}</div>\n</ng-template>\n\n<ng-template #titleTemplate>\n <xui-icon [class]=\"iconClass()\" *ngIf=\"icon()\" [icon]=\"icon()\"></xui-icon>\n {{ title() }}\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: i3.XuiIcon, selector: "xui-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "icon"], exportAs: ["xuiIcon"] }, { kind: "component", type: XuiPanelBarItem, selector: "xui-panelbar-item", inputs: ["title", "content", "icon", "iconClass", "expanded", "_children"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiPanelBarItem, decorators: [{
type: Component,
args: [{ selector: 'xui-panelbar-item', changeDetection: ChangeDetectionStrategy.OnPush, host: {
class: 'x-panelbar-item'
}, template: "<div (click)=\"clickItem()\" class=\"x-panelbar-item-title\" [style.padding-left.px]=\"_paddingLeft\">\n <ng-template [cdkPortalOutlet]=\"_titlePortal()\" />\n <div class=\"x-panelbar-item-spacer\"></div>\n <xui-icon\n class=\"x-panelbar-item-chevron\"\n *ngIf=\"_hasContent()\"\n [icon]=\"_expanded() ? 'keyboard_arrow_down' : 'keyboard_arrow_up'\"\n ></xui-icon>\n</div>\n\n<div [style.display]=\"_expanded() ? 'block' : 'none'\" #contentRef>\n <ng-container *ngIf=\"_contentDirective || content()\">\n <ng-template [cdkPortalOutlet]=\"_contentPortal()\" />\n </ng-container>\n <ng-content select=\"xui-panelbar-item\"></ng-content>\n\n @for (child of _children(); track child.title) {\n <xui-panelbar-item [title]=\"child.title\" [_children]=\"child.children\" />\n }\n</div>\n\n<ng-template #contentTemplate>\n <div class=\"x-panelbar-item-content\" [style.padding-left.px]=\"_paddingLeft\">{{ content() }}</div>\n</ng-template>\n\n<ng-template #titleTemplate>\n <xui-icon [class]=\"iconClass()\" *ngIf=\"icon()\" [icon]=\"icon()\"></xui-icon>\n {{ title() }}\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [PANEL_BAR_ACCESSOR]
}] }, { type: i0.ViewContainerRef }, { type: XuiPanelBarItem, decorators: [{
type: Optional
}, {
type: SkipSelf
}] }], propDecorators: { contentTemplate: [{
type: ViewChild,
args: ['contentTemplate', { static: true }]
}], titleTemplate: [{
type: ViewChild,
args: ['titleTemplate', { static: true }]
}], contentRef: [{
type: ViewChild,
args: ['contentRef', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuZWxiYXItaXRlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy9wYW5lbGJhci9wYW5lbGJhci1pdGVtLnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy94dWkvc3JjL3BhbmVsYmFyL3BhbmVsYmFyLWl0ZW0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQWtDLE1BQU0sa0JBQWtCLENBQUM7Ozs7O0FBVXRGLE1BQU0sT0FBTyxlQUFlO0lBd0MxQixJQUFZLE1BQU07UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQ3NDLFFBQTBCLEVBQ3RELGdCQUFrQyxFQUNWLFVBQTJCO1FBRnZCLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBQ3RELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDVixlQUFVLEdBQVYsVUFBVSxDQUFpQjtRQWhEN0QsY0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQixVQUFLLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDeEIsWUFBTyxHQUFHLEtBQUssRUFBTyxDQUFDO1FBQ3ZCLFNBQUksR0FBRyxLQUFLLEVBQVUsQ0FBQztRQUN2QixjQUFTLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDNUIsYUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELGNBQVMsR0FBRyxLQUFLLEVBQWtCLENBQUM7UUFNcEMsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzlGLE9BQU8sSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDeEQsU0FBUyxFQUFnQjtvQkFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO2lCQUN4QjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsaUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN6RCxPQUFPLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3RELFNBQVMsRUFBZ0I7b0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtpQkFDeEI7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILGdCQUFXLEdBQUcsUUFBUSxDQUNwQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNwSCxDQUFDO0lBY0MsQ0FBQztJQUVKLFNBQVM7UUFDUCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDdEMsbUJBQW1CO1FBQ3JCLENBQUM7YUFBTSxDQUFDO1lBQ04sMEJBQTBCO1FBQzVCLENBQUM7SUFDSCxDQUFDOzhHQTdEVSxlQUFlLGtCQWlEaEIsa0JBQWtCO2tHQWpEakIsZUFBZSxnc0NDMUI1QixzbENBNkJBLG9jREhhLGVBQWU7OzJGQUFmLGVBQWU7a0JBUjNCLFNBQVM7K0JBQ0UsbUJBQW1CLG1CQUVaLHVCQUF1QixDQUFDLE1BQU0sUUFDekM7d0JBQ0osS0FBSyxFQUFFLGlCQUFpQjtxQkFDekI7OzBCQW1ERSxNQUFNOzJCQUFDLGtCQUFrQjs7MEJBRXpCLFFBQVE7OzBCQUFJLFFBQVE7eUNBdkNpQyxlQUFlO3NCQUF0RSxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDUSxhQUFhO3NCQUFsRSxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ08sVUFBVTtzQkFBNUQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgaW5wdXQsXG4gIE9wdGlvbmFsLFxuICBzaWduYWwsXG4gIFNraXBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IFBBTkVMX0JBUl9BQ0NFU1NPUiwgUGFuZWxCYXJBY2Nlc3NvciwgUGFuZWxCYXJJdGVtIH0gZnJvbSAnLi9wYW5lbGJhci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aS1wYW5lbGJhci1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICdwYW5lbGJhci1pdGVtLmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAneC1wYW5lbGJhci1pdGVtJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIFh1aVBhbmVsQmFySXRlbSB7XG4gIF9jb250ZW50RGlyZWN0aXZlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gIF90aXRsZURpcmVjdGl2ZT86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICBfZXhwYW5kZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHRpdGxlID0gaW5wdXQ8c3RyaW5nPigpO1xuICBjb250ZW50ID0gaW5wdXQ8YW55PigpO1xuICBpY29uID0gaW5wdXQ8c3RyaW5nPigpO1xuICBpY29uQ2xhc3MgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIGV4cGFuZGVkID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuICBfY2hpbGRyZW4gPSBpbnB1dDxQYW5lbEJhckl0ZW1bXT4oKTtcblxuICBAVmlld0NoaWxkKCdjb250ZW50VGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGNvbnRlbnRUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICBAVmlld0NoaWxkKCd0aXRsZVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSB0aXRsZVRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRSZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGNvbnRlbnRSZWYhOiBFbGVtZW50UmVmO1xuXG4gIF9jb250ZW50UG9ydGFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9jb250ZW50RGlyZWN0aXZlID8/IHRoaXMucGFuZWxCYXIuX2l0ZW1UZW1wbGF0ZSA/PyB0aGlzLmNvbnRlbnRUZW1wbGF0ZTtcbiAgICByZXR1cm4gbmV3IFRlbXBsYXRlUG9ydGFsKGNvbnRlbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZiwge1xuICAgICAgJGltcGxpY2l0OiA8UGFuZWxCYXJJdGVtPntcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUoKSxcbiAgICAgICAgY29udGVudDogdGhpcy5jb250ZW50KClcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgX3RpdGxlUG9ydGFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fdGl0bGVEaXJlY3RpdmUgPz8gdGhpcy50aXRsZVRlbXBsYXRlO1xuICAgIHJldHVybiBuZXcgVGVtcGxhdGVQb3J0YWwodGl0bGUsIHRoaXMudmlld0NvbnRhaW5lclJlZiwge1xuICAgICAgJGltcGxpY2l0OiA8UGFuZWxCYXJJdGVtPntcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUoKSxcbiAgICAgICAgY29udGVudDogdGhpcy5jb250ZW50KClcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgX2hhc0NvbnRlbnQgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmNvbnRlbnQoKSA/PyB0aGlzLl9jaGlsZHJlbigpID8/IHRoaXMuX2NvbnRlbnREaXJlY3RpdmUgPz8gdGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoXG4gICk7XG5cbiAgcHJpdmF0ZSBnZXQgb2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SXRlbSA/IHRoaXMucGFyZW50SXRlbS5vZmZzZXQgKyAxIDogMDtcbiAgfVxuXG4gIGdldCBfcGFkZGluZ0xlZnQoKSB7XG4gICAgcmV0dXJuIDggKyB0aGlzLm9mZnNldCAqIDI0O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChQQU5FTF9CQVJfQUNDRVNTT1IpIHByaXZhdGUgcGFuZWxCYXI6IFBhbmVsQmFyQWNjZXNzb3IsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHByaXZhdGUgcGFyZW50SXRlbTogWHVpUGFuZWxCYXJJdGVtXG4gICkge31cblxuICBjbGlja0l0ZW0oKSB7XG4gICAgaWYgKHRoaXMuX2hhc0NvbnRlbnQoKSkge1xuICAgICAgdGhpcy5fZXhwYW5kZWQuc2V0KCF0aGlzLl9leHBhbmRlZCgpKTtcbiAgICAgIC8vIFRPRE87IGVtaXQgZXZlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETzogZW1pdCBjbGljayBldmVudD9cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgKGNsaWNrKT1cImNsaWNrSXRlbSgpXCIgY2xhc3M9XCJ4LXBhbmVsYmFyLWl0ZW0tdGl0bGVcIiBbc3R5bGUucGFkZGluZy1sZWZ0LnB4XT1cIl9wYWRkaW5nTGVmdFwiPlxuICA8bmctdGVtcGxhdGUgW2Nka1BvcnRhbE91dGxldF09XCJfdGl0bGVQb3J0YWwoKVwiIC8+XG4gIDxkaXYgY2xhc3M9XCJ4LXBhbmVsYmFyLWl0ZW0tc3BhY2VyXCI+PC9kaXY+XG4gIDx4dWktaWNvblxuICAgIGNsYXNzPVwieC1wYW5lbGJhci1pdGVtLWNoZXZyb25cIlxuICAgICpuZ0lmPVwiX2hhc0NvbnRlbnQoKVwiXG4gICAgW2ljb25dPVwiX2V4cGFuZGVkKCkgPyAna2V5Ym9hcmRfYXJyb3dfZG93bicgOiAna2V5Ym9hcmRfYXJyb3dfdXAnXCJcbiAgPjwveHVpLWljb24+XG48L2Rpdj5cblxuPGRpdiBbc3R5bGUuZGlzcGxheV09XCJfZXhwYW5kZWQoKSA/ICdibG9jaycgOiAnbm9uZSdcIiAjY29udGVudFJlZj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9jb250ZW50RGlyZWN0aXZlIHx8IGNvbnRlbnQoKVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT1cIl9jb250ZW50UG9ydGFsKClcIiAvPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwieHVpLXBhbmVsYmFyLWl0ZW1cIj48L25nLWNvbnRlbnQ+XG5cbiAgQGZvciAoY2hpbGQgb2YgX2NoaWxkcmVuKCk7IHRyYWNrIGNoaWxkLnRpdGxlKSB7XG4gICAgPHh1aS1wYW5lbGJhci1pdGVtIFt0aXRsZV09XCJjaGlsZC50aXRsZVwiIFtfY2hpbGRyZW5dPVwiY2hpbGQuY2hpbGRyZW5cIiAvPlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNjb250ZW50VGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJ4LXBhbmVsYmFyLWl0ZW0tY29udGVudFwiIFtzdHlsZS5wYWRkaW5nLWxlZnQucHhdPVwiX3BhZGRpbmdMZWZ0XCI+e3sgY29udGVudCgpIH19PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RpdGxlVGVtcGxhdGU+XG4gIDx4dWktaWNvbiBbY2xhc3NdPVwiaWNvbkNsYXNzKClcIiAqbmdJZj1cImljb24oKVwiIFtpY29uXT1cImljb24oKVwiPjwveHVpLWljb24+XG4gIHt7IHRpdGxlKCkgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=