@nova-ui/dashboards
Version:
Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and
91 lines • 27.4 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// 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 { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
import { LoggerService } from "@nova-ui/bits";
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@nova-ui/bits";
import * as i3 from "../../../widget-editor-accordion/widget-editor-accordion.component";
import * as i4 from "../../../widget-editor-accordion/widget-editor-accordion-header/widget-editor-accordion-header.component";
import * as i5 from "@angular/common";
import * as i6 from "../../../../pipe/widget-editor-accordion-form-state.pipe";
import * as i7 from "../../../../pipe/widget-editor-accordion-header-icon.pipe";
export class TitleAndDescriptionConfigurationComponent {
static { this.lateLoadKey = "TitleAndDescriptionConfigurationComponent"; }
constructor(changeDetector, formBuilder, logger) {
this.changeDetector = changeDetector;
this.formBuilder = formBuilder;
this.logger = logger;
this.formReady = new EventEmitter();
this.form = this.formBuilder.group({
title: ["", Validators.required],
subtitle: [""],
url: [""],
description: [""],
collapsible: [false],
collapsed: [true], // setting 'collapsed' to true to demonstrate the collapsed appearance in the preview
});
}
ngOnInit() {
this.formReady.emit(this.form);
}
ngOnChanges(changes) {
if (changes.title) {
this.form.get("title")?.setValue(this.title);
}
if (changes.url) {
this.form.get("url")?.setValue(this.url);
}
if (changes.subtitle) {
this.form.get("subtitle")?.setValue(this.subtitle);
}
if (changes.description) {
this.form.get("description")?.setValue(this.description);
}
if (changes.collapsible) {
this.form.get("collapsible")?.setValue(this.collapsible);
}
}
getSecondaryText() {
const forTitle = this.form.controls["title"].value || $localize `No title`;
const forSubtitle = this.form.controls["subtitle"].value || $localize `no subtitle`;
return `${forTitle}, ${forSubtitle}`;
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TitleAndDescriptionConfigurationComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FormBuilder }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TitleAndDescriptionConfigurationComponent, selector: "nui-title-and-description-configuration", inputs: { title: "title", url: "url", subtitle: "subtitle", description: "description", collapsible: "collapsible" }, outputs: { formReady: "formReady" }, usesOnChanges: true, ngImport: i0, template: "<nui-widget-editor-accordion\n [formGroup]=\"form\"\n [state]=\"form | nuiWidgetEditorAccordionFormState | async\"\n>\n <nui-widget-editor-accordion-header\n [headerIcon]=\"form | nuiFormHeaderIconPipe : 'widget_list' | async\"\n [subtitle]=\"getSecondaryText()\"\n headerTitle=\"Title and Description\"\n />\n <div class=\"title-and-description-configuration__accordion-content\">\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget title\"\n i18n-caption\n [control]=\"form.get('title')\"\n >\n <!-- TODO: remove \"kpi\" prefix in v11 - NUI-5833-->\n <nui-textbox\n id=\"kpi-widget-title\"\n formControlName=\"title\"\n placeholder=\"Set widget title\"\n i18n-placeholder\n ></nui-textbox>\n <nui-validation-message for=\"required\" i18n>\n This field is required\n </nui-validation-message>\n </nui-form-field>\n </div>\n\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget subtitle\"\n i18n-caption\n [control]=\"form.get('subtitle')\"\n >\n <!-- TODO: remove \"kpi\" prefix in v11 - NUI-5833 -->\n <nui-textbox\n id=\"kpi-widget-subtitle\"\n formControlName=\"subtitle\"\n placeholder=\"Do not show a subtitle\"\n i18n-placeholder\n ></nui-textbox>\n </nui-form-field>\n </div>\n\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget link URL\"\n i18n-caption\n [control]=\"form.get('url')\"\n >\n <!-- TODO: remove \"kpi\" prefix in v11 - NUI-5833-->\n <nui-textbox\n id=\"kpi-widget-url\"\n formControlName=\"url\"\n placeholder=\"Do not link to another page\"\n i18n-placeholder\n ></nui-textbox>\n </nui-form-field>\n </div>\n\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget description\"\n i18n-caption\n [control]=\"form.get('description')\"\n hint=\"This won't be shown on the widget, but can be helpful for\n other users who want to re-use this widget on their own dashboards\"\n i18n-hint\n >\n <nui-textbox\n formControlName=\"description\"\n placeholder=\"No description\"\n i18n-placeholder\n ></nui-textbox>\n </nui-form-field>\n </div>\n <div>\n <nui-form-field\n caption=\"Hide widget header\"\n [showOptionalText]=\"false\"\n i18n-caption\n [control]=\"form.get('collapsible')\"\n >\n <nui-checkbox formControlName=\"collapsible\" i18n\n >Collapsible</nui-checkbox\n >\n </nui-form-field>\n </div>\n </div>\n</nui-widget-editor-accordion>\n", styles: [".title-and-description-configuration__accordion-content{padding:15px 15px 15px 46px}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.TextboxComponent, selector: "nui-textbox", inputs: ["caption", "autocomplete", "info", "customBoxWidth", "disabled", "hint", "name", "placeholder", "readonly", "rows", "type", "value", "isInErrorState", "ariaLabel", "isBusy"], outputs: ["textChange", "blurred"] }, { kind: "component", type: i2.FormFieldComponent, selector: "nui-form-field", inputs: ["control", "caption", "info", "infoTemplate", "hint", "hintTemplate", "customBoxWidth", "showOptionalText"] }, { kind: "component", type: i2.CheckboxComponent, selector: "nui-checkbox", inputs: ["ariaLabel", "ariaLabelledby", "ariaDescribedby", "name", "title", "value", "hovered", "checked", "required", "hint", "disabled", "indeterminate"], outputs: ["valueChange"] }, { kind: "component", type: i2.ValidationMessageComponent, selector: "nui-validation-message", inputs: ["show", "for"] }, { kind: "component", type: i3.WidgetEditorAccordionComponent, selector: "nui-widget-editor-accordion", inputs: ["showOpenStateIcon", "state"], outputs: ["openToggle"] }, { kind: "component", type: i4.WidgetEditorAccordionHeaderComponent, selector: "nui-widget-editor-accordion-header", inputs: ["headerIcon", "iconColor", "subtitle", "headerTitle"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.WidgetEditorAccordionFormStatePipe, name: "nuiWidgetEditorAccordionFormState" }, { kind: "pipe", type: i7.FormHeaderIconPipePipe, name: "nuiFormHeaderIconPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TitleAndDescriptionConfigurationComponent, decorators: [{
type: Component,
args: [{ selector: "nui-title-and-description-configuration", changeDetection: ChangeDetectionStrategy.OnPush, template: "<nui-widget-editor-accordion\n [formGroup]=\"form\"\n [state]=\"form | nuiWidgetEditorAccordionFormState | async\"\n>\n <nui-widget-editor-accordion-header\n [headerIcon]=\"form | nuiFormHeaderIconPipe : 'widget_list' | async\"\n [subtitle]=\"getSecondaryText()\"\n headerTitle=\"Title and Description\"\n />\n <div class=\"title-and-description-configuration__accordion-content\">\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget title\"\n i18n-caption\n [control]=\"form.get('title')\"\n >\n <!-- TODO: remove \"kpi\" prefix in v11 - NUI-5833-->\n <nui-textbox\n id=\"kpi-widget-title\"\n formControlName=\"title\"\n placeholder=\"Set widget title\"\n i18n-placeholder\n ></nui-textbox>\n <nui-validation-message for=\"required\" i18n>\n This field is required\n </nui-validation-message>\n </nui-form-field>\n </div>\n\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget subtitle\"\n i18n-caption\n [control]=\"form.get('subtitle')\"\n >\n <!-- TODO: remove \"kpi\" prefix in v11 - NUI-5833 -->\n <nui-textbox\n id=\"kpi-widget-subtitle\"\n formControlName=\"subtitle\"\n placeholder=\"Do not show a subtitle\"\n i18n-placeholder\n ></nui-textbox>\n </nui-form-field>\n </div>\n\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget link URL\"\n i18n-caption\n [control]=\"form.get('url')\"\n >\n <!-- TODO: remove \"kpi\" prefix in v11 - NUI-5833-->\n <nui-textbox\n id=\"kpi-widget-url\"\n formControlName=\"url\"\n placeholder=\"Do not link to another page\"\n i18n-placeholder\n ></nui-textbox>\n </nui-form-field>\n </div>\n\n <div class=\"mb-4\">\n <nui-form-field\n caption=\"Widget description\"\n i18n-caption\n [control]=\"form.get('description')\"\n hint=\"This won't be shown on the widget, but can be helpful for\n other users who want to re-use this widget on their own dashboards\"\n i18n-hint\n >\n <nui-textbox\n formControlName=\"description\"\n placeholder=\"No description\"\n i18n-placeholder\n ></nui-textbox>\n </nui-form-field>\n </div>\n <div>\n <nui-form-field\n caption=\"Hide widget header\"\n [showOptionalText]=\"false\"\n i18n-caption\n [control]=\"form.get('collapsible')\"\n >\n <nui-checkbox formControlName=\"collapsible\" i18n\n >Collapsible</nui-checkbox\n >\n </nui-form-field>\n </div>\n </div>\n</nui-widget-editor-accordion>\n", styles: [".title-and-description-configuration__accordion-content{padding:15px 15px 15px 46px}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FormBuilder }, { type: i2.LoggerService }], propDecorators: { title: [{
type: Input
}], url: [{
type: Input
}], subtitle: [{
type: Input
}], description: [{
type: Input
}], collapsible: [{
type: Input
}], formReady: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGl0bGUtYW5kLWRlc2NyaXB0aW9uLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWd1cmF0b3IvY29tcG9uZW50cy93aWRnZXRzL2NvbmZpZ3VyYXRvci1pdGVtcy90aXRsZS1hbmQtZGVzY3JpcHRpb24tY29uZmlndXJhdGlvbi90aXRsZS1hbmQtZGVzY3JpcHRpb24tY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZ3VyYXRvci9jb21wb25lbnRzL3dpZGdldHMvY29uZmlndXJhdG9yLWl0ZW1zL3RpdGxlLWFuZC1kZXNjcmlwdGlvbi1jb25maWd1cmF0aW9uL3RpdGxlLWFuZC1kZXNjcmlwdGlvbi1jb25maWd1cmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7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aWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tIFwiQG5vdmEtdWkvYml0c1wiO1xuXG5pbXBvcnQgeyBJSGFzQ2hhbmdlRGV0ZWN0b3IsIElIYXNGb3JtIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3R5cGVzXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS10aXRsZS1hbmQtZGVzY3JpcHRpb24tY29uZmlndXJhdGlvblwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vdGl0bGUtYW5kLWRlc2NyaXB0aW9uLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcInRpdGxlLWFuZC1kZXNjcmlwdGlvbi1jb25maWd1cmF0aW9uLmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUaXRsZUFuZERlc2NyaXB0aW9uQ29uZmlndXJhdGlvbkNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgSUhhc0NoYW5nZURldGVjdG9yLCBJSGFzRm9ybSwgT25Jbml0LCBPbkNoYW5nZXNcbntcbiAgICBwdWJsaWMgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJUaXRsZUFuZERlc2NyaXB0aW9uQ29uZmlndXJhdGlvbkNvbXBvbmVudFwiO1xuXG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmw6IHN0cmluZztcbiAgICBASW5wdXQoKSBzdWJ0aXRsZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY29sbGFwc2libGU6IGJvb2xlYW47XG5cbiAgICBAT3V0cHV0KCkgZm9ybVJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG5cbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIHRpdGxlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBzdWJ0aXRsZTogW1wiXCJdLFxuICAgICAgICAgICAgdXJsOiBbXCJcIl0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogW1wiXCJdLFxuICAgICAgICAgICAgY29sbGFwc2libGU6IFtmYWxzZV0sXG4gICAgICAgICAgICBjb2xsYXBzZWQ6IFt0cnVlXSwgLy8gc2V0dGluZyAnY29sbGFwc2VkJyB0byB0cnVlIHRvIGRlbW9uc3RyYXRlIHRoZSBjb2xsYXBzZWQgYXBwZWFyYW5jZSBpbiB0aGUgcHJldmlld1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybVJlYWR5LmVtaXQodGhpcy5mb3JtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy50aXRsZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldChcInRpdGxlXCIpPy5zZXRWYWx1ZSh0aGlzLnRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoXCJ1cmxcIik/LnNldFZhbHVlKHRoaXMudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5zdWJ0aXRsZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldChcInN1YnRpdGxlXCIpPy5zZXRWYWx1ZSh0aGlzLnN1YnRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldChcImRlc2NyaXB0aW9uXCIpPy5zZXRWYWx1ZSh0aGlzLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldChcImNvbGxhcHNpYmxlXCIpPy5zZXRWYWx1ZSh0aGlzLmNvbGxhcHNpYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWNvbmRhcnlUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZvclRpdGxlID1cbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tcInRpdGxlXCJdLnZhbHVlIHx8ICRsb2NhbGl6ZWBObyB0aXRsZWA7XG4gICAgICAgIGNvbnN0IGZvclN1YnRpdGxlID1cbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tcInN1YnRpdGxlXCJdLnZhbHVlIHx8ICRsb2NhbGl6ZWBubyBzdWJ0aXRsZWA7XG4gICAgICAgIHJldHVybiBgJHtmb3JUaXRsZX0sICR7Zm9yU3VidGl0bGV9YDtcbiAgICB9XG59XG4iLCI8bnVpLXdpZGdldC1lZGl0b3ItYWNjb3JkaW9uXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICBbc3RhdGVdPVwiZm9ybSB8IG51aVdpZGdldEVkaXRvckFjY29yZGlvbkZvcm1TdGF0ZSB8IGFzeW5jXCJcbj5cbiAgICA8bnVpLXdpZGdldC1lZGl0b3ItYWNjb3JkaW9uLWhlYWRlclxuICAgICAgICBbaGVhZGVySWNvbl09XCJmb3JtIHwgbnVpRm9ybUhlYWRlckljb25QaXBlIDogJ3dpZGdldF9saXN0JyB8IGFzeW5jXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cImdldFNlY29uZGFyeVRleHQoKVwiXG4gICAgICAgIGhlYWRlclRpdGxlPVwiVGl0bGUgYW5kIERlc2NyaXB0aW9uXCJcbiAgICAvPlxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1hbmQtZGVzY3JpcHRpb24tY29uZmlndXJhdGlvbl9fYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgIDxudWktZm9ybS1maWVsZFxuICAgICAgICAgICAgICAgIGNhcHRpb249XCJXaWRnZXQgdGl0bGVcIlxuICAgICAgICAgICAgICAgIGkxOG4tY2FwdGlvblxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImZvcm0uZ2V0KCd0aXRsZScpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlbW92ZSBcImtwaVwiIHByZWZpeCBpbiB2MTEgIC0gTlVJLTU4MzMtLT5cbiAgICAgICAgICAgICAgICA8bnVpLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJrcGktd2lkZ2V0LXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNldCB3aWRnZXQgdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgPjwvbnVpLXRleHRib3g+XG4gICAgICAgICAgICAgICAgPG51aS12YWxpZGF0aW9uLW1lc3NhZ2UgZm9yPVwicmVxdWlyZWRcIiBpMThuPlxuICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgPC9udWktdmFsaWRhdGlvbi1tZXNzYWdlPlxuICAgICAgICAgICAgPC9udWktZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgIDxudWktZm9ybS1maWVsZFxuICAgICAgICAgICAgICAgIGNhcHRpb249XCJXaWRnZXQgc3VidGl0bGVcIlxuICAgICAgICAgICAgICAgIGkxOG4tY2FwdGlvblxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImZvcm0uZ2V0KCdzdWJ0aXRsZScpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlbW92ZSBcImtwaVwiIHByZWZpeCBpbiB2MTEgLSBOVUktNTgzMyAtLT5cbiAgICAgICAgICAgICAgICA8bnVpLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJrcGktd2lkZ2V0LXN1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRvIG5vdCBzaG93IGEgc3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgPjwvbnVpLXRleHRib3g+XG4gICAgICAgICAgICA8L251aS1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxuICAgICAgICAgICAgPG51aS1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgY2FwdGlvbj1cIldpZGdldCBsaW5rIFVSTFwiXG4gICAgICAgICAgICAgICAgaTE4bi1jYXB0aW9uXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZm9ybS5nZXQoJ3VybCcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlbW92ZSBcImtwaVwiIHByZWZpeCBpbiB2MTEgIC0gTlVJLTU4MzMtLT5cbiAgICAgICAgICAgICAgICA8bnVpLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJrcGktd2lkZ2V0LXVybFwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInVybFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRG8gbm90IGxpbmsgdG8gYW5vdGhlciBwYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgID48L251aS10ZXh0Ym94PlxuICAgICAgICAgICAgPC9udWktZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgIDxudWktZm9ybS1maWVsZFxuICAgICAgICAgICAgICAgIGNhcHRpb249XCJXaWRnZXQgZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIGkxOG4tY2FwdGlvblxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpXCJcbiAgICAgICAgICAgICAgICBoaW50PVwiVGhpcyB3b24ndCBiZSBzaG93biBvbiB0aGUgd2lkZ2V0LCBidXQgY2FuIGJlIGhlbHBmdWwgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHVzZXJzIHdobyB3YW50IHRvIHJlLXVzZSB0aGlzIHdpZGdldCBvbiB0aGVpciBvd24gZGFzaGJvYXJkc1wiXG4gICAgICAgICAgICAgICAgaTE4bi1oaW50XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG51aS10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJObyBkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICA+PC9udWktdGV4dGJveD5cbiAgICAgICAgICAgIDwvbnVpLWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPG51aS1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgY2FwdGlvbj1cIkhpZGUgd2lkZ2V0IGhlYWRlclwiXG4gICAgICAgICAgICAgICAgW3Nob3dPcHRpb25hbFRleHRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIGkxOG4tY2FwdGlvblxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImZvcm0uZ2V0KCdjb2xsYXBzaWJsZScpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bnVpLWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cImNvbGxhcHNpYmxlXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICA+Q29sbGFwc2libGU8L251aS1jaGVja2JveFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbnVpLWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9udWktd2lkZ2V0LWVkaXRvci1hY2NvcmRpb24+XG4iXX0=