UNPKG

ngx-gem-spaas

Version:

This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.

91 lines 20.6 kB
import { Component, Input } from '@angular/core'; import { takeUntil } from "rxjs/operators"; import { OktaUserModel } from "../_models/okta.model"; import { BaseComponent } from "../base/base.component"; import { FormControl, FormGroup } from "@angular/forms"; import * as i0 from "@angular/core"; import * as i1 from "../_services/okta.service"; import * as i2 from "../_services/settings.service"; import * as i3 from "../_services/theme.service"; import * as i4 from "@angular/forms"; import * as i5 from "@angular/material/radio"; import * as i6 from "../bg/bg.component"; import * as i7 from "../toggle/toggle.component"; import * as i8 from "@angular/common"; class SettingsFormModel { constructor(settings) { this.dark = new FormControl(settings.dark, { nonNullable: true }); this.decimalSeparator = new FormControl(settings.decimalSeparator, { nonNullable: true }); this.exportExtension = new FormControl(settings.exportExtension, { nonNullable: true }); } } /** * Settings component that you can simply inject in an otherwise empty 'settings' screen. * To let the user choose some basic preferences like dark or light theme. * The component uses content projection to allow you to add any app-specific settings you want to persist. */ export class SettingsComponent extends BaseComponent { constructor(oktaService, settingsService, themeService) { super(); this.oktaService = oktaService; this.settingsService = settingsService; this.themeService = themeService; this.settingTitle = 'These are your settings'; this.darkModeButtonTitle = 'dark mode'; this.darkModeHintText = ' rest your eyes a bit, switch to dark mode'; this.exportDescriptionText = 'When downloading data, save as'; this.excelExportRadioText = 'Excel Workbook (.xlsx)'; this.csvExportRadioText = 'CSV file (.csv)'; this.decimalSeparatorText = 'Your decimal separator in Excel'; this.dotRadioText = 'dot'; this.commaRadioText = 'comma'; this.user = new OktaUserModel({}); this.onNewUser(); this.settings = this.settingsService.getSettings(); this.settingsForm = new FormGroup(new SettingsFormModel(this.settings)); } onNewUser() { this.oktaService.onNewUserInfo() .pipe(takeUntil(this.onDestroy$)) .subscribe((user) => { this.user = user; }); } onToggleTheme() { this.updateSettings(); this.themeService.toggleTheme(); } updateSettings() { // update settings with the form values. Leave extraData untouched, not handled by this component this.settings.dark = this.settingsForm.controls.dark.value; this.settings.decimalSeparator = this.settingsForm.controls.decimalSeparator.value; this.settings.exportExtension = this.settingsForm.controls.exportExtension.value; // broadcast the new settings this.settingsService.newSettings(this.settings); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SettingsComponent, deps: [{ token: i1.OktaService }, { token: i2.SettingsService }, { token: i3.ThemeService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SettingsComponent, selector: "spaas-settings", inputs: { settingTitle: "settingTitle", darkModeButtonTitle: "darkModeButtonTitle", darkModeHintText: "darkModeHintText", exportDescriptionText: "exportDescriptionText", excelExportRadioText: "excelExportRadioText", csvExportRadioText: "csvExportRadioText", decimalSeparatorText: "decimalSeparatorText", dotRadioText: "dotRadioText", commaRadioText: "commaRadioText" }, usesInheritance: true, ngImport: i0, template: "<div class=\"settings\">\r\n\r\n <div class=\"half-screen\"\r\n [formGroup]=\"settingsForm\">\r\n\r\n <h3>{{ settingTitle }} {{ user.firstName ? ', ' + (user.firstName | titlecase) : '' }}</h3>\r\n\r\n <!-- dark mode -->\r\n <div>\r\n <spaas-toggle id=\"dark\"\r\n [ctrl]=\"settingsForm.controls.dark\"\r\n [label]=\"darkModeButtonTitle\"\r\n [subText]=\"darkModeHintText\"\r\n (change)=\"onToggleTheme()\">\r\n </spaas-toggle>\r\n </div>\r\n\r\n <!-- export type -->\r\n <div>\r\n {{ exportDescriptionText }}\r\n <mat-radio-group aria-label=\"select an export type\"\r\n class=\"flex col\"\r\n [formControl]=\"settingsForm.controls.exportExtension\"\r\n (change)=\"updateSettings()\">\r\n <mat-radio-button value=\"xlsx\">{{ excelExportRadioText }}</mat-radio-button>\r\n <mat-radio-button value=\"csv\">{{ csvExportRadioText }}</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <!-- decimal separator -->\r\n <div>\r\n {{ decimalSeparatorText }}\r\n <mat-radio-group aria-label=\"select a decimal separator\"\r\n class=\"flex col\"\r\n [formControl]=\"settingsForm.controls.decimalSeparator\"\r\n (change)=\"updateSettings()\">\r\n <mat-radio-button value=\"dot\">{{ dotRadioText }}</mat-radio-button>\r\n <mat-radio-button value=\"comma\">{{ commaRadioText }}</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <!-- projected content -->\r\n <div>\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n </div>\r\n\r\n <spaas-bg bgImg=\"employee_solar\"></spaas-bg>\r\n\r\n</div>\r\n", styles: [".settings{animation:anim-fade-in 1s ease;position:relative}\n"], dependencies: [{ kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i5.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.BgComponent, selector: "spaas-bg", inputs: ["bgX", "bgY", "bgPortrait", "bgImg", "bgAnimate"] }, { kind: "component", type: i7.ToggleComponent, selector: "spaas-toggle", inputs: ["ctrl", "id", "label", "labelPosition", "subText"] }, { kind: "pipe", type: i8.TitleCasePipe, name: "titlecase" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SettingsComponent, decorators: [{ type: Component, args: [{ selector: 'spaas-settings', template: "<div class=\"settings\">\r\n\r\n <div class=\"half-screen\"\r\n [formGroup]=\"settingsForm\">\r\n\r\n <h3>{{ settingTitle }} {{ user.firstName ? ', ' + (user.firstName | titlecase) : '' }}</h3>\r\n\r\n <!-- dark mode -->\r\n <div>\r\n <spaas-toggle id=\"dark\"\r\n [ctrl]=\"settingsForm.controls.dark\"\r\n [label]=\"darkModeButtonTitle\"\r\n [subText]=\"darkModeHintText\"\r\n (change)=\"onToggleTheme()\">\r\n </spaas-toggle>\r\n </div>\r\n\r\n <!-- export type -->\r\n <div>\r\n {{ exportDescriptionText }}\r\n <mat-radio-group aria-label=\"select an export type\"\r\n class=\"flex col\"\r\n [formControl]=\"settingsForm.controls.exportExtension\"\r\n (change)=\"updateSettings()\">\r\n <mat-radio-button value=\"xlsx\">{{ excelExportRadioText }}</mat-radio-button>\r\n <mat-radio-button value=\"csv\">{{ csvExportRadioText }}</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <!-- decimal separator -->\r\n <div>\r\n {{ decimalSeparatorText }}\r\n <mat-radio-group aria-label=\"select a decimal separator\"\r\n class=\"flex col\"\r\n [formControl]=\"settingsForm.controls.decimalSeparator\"\r\n (change)=\"updateSettings()\">\r\n <mat-radio-button value=\"dot\">{{ dotRadioText }}</mat-radio-button>\r\n <mat-radio-button value=\"comma\">{{ commaRadioText }}</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <!-- projected content -->\r\n <div>\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n </div>\r\n\r\n <spaas-bg bgImg=\"employee_solar\"></spaas-bg>\r\n\r\n</div>\r\n", styles: [".settings{animation:anim-fade-in 1s ease;position:relative}\n"] }] }], ctorParameters: () => [{ type: i1.OktaService }, { type: i2.SettingsService }, { type: i3.ThemeService }], propDecorators: { settingTitle: [{ type: Input }], darkModeButtonTitle: [{ type: Input }], darkModeHintText: [{ type: Input }], exportDescriptionText: [{ type: Input }], excelExportRadioText: [{ type: Input }], csvExportRadioText: [{ type: Input }], decimalSeparatorText: [{ type: Input }], dotRadioText: [{ type: Input }], commaRadioText: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWdlbS1zcGFhcy9zcmMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWdlbS1zcGFhcy9zcmMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJL0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQUV0RCxNQUFNLGlCQUFpQjtJQUtyQixZQUFZLFFBQXVCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQVUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBdUIsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFdBQVcsQ0FBc0IsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBQzdHLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsYUFBYTtJQW1CbEQsWUFDVSxXQUF3QixFQUN4QixlQUFnQyxFQUNoQyxZQUEwQjtRQUVsQyxLQUFLLEVBQUUsQ0FBQztRQUpBLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXBCM0IsaUJBQVksR0FBRyx5QkFBeUIsQ0FBQztRQUV6Qyx3QkFBbUIsR0FBRyxXQUFXLENBQUM7UUFDbEMscUJBQWdCLEdBQUcsNENBQTRDLENBQUM7UUFFaEUsMEJBQXFCLEdBQUcsZ0NBQWdDLENBQUM7UUFDekQseUJBQW9CLEdBQUcsd0JBQXdCLENBQUM7UUFDaEQsdUJBQWtCLEdBQUcsaUJBQWlCLENBQUM7UUFFdkMseUJBQW9CLEdBQUcsaUNBQWlDLENBQUM7UUFDekQsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsbUJBQWMsR0FBRyxPQUFPLENBQUM7UUFFbEMsU0FBSSxHQUFHLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBVTNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBb0IsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO2FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hDLFNBQVMsQ0FDUixDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1AsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQyxDQUNGLENBQUM7SUFDTixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxjQUFjO1FBQ1osaUdBQWlHO1FBQ2pHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7UUFDbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUNqRiw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7K0dBcERVLGlCQUFpQjttR0FBakIsaUJBQWlCLCtiQ2pDOUIsdXlEQW1EQTs7NEZEbEJhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxnQkFBZ0I7eUlBTWpCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtEZWNpbWFsU2VwYXJhdG9yVHlwZSwgRXhwb3J0RXh0ZW5zaW9uVHlwZSwgU2V0dGluZ3NNb2RlbH0gZnJvbSBcIi4uL19tb2RlbHMvc2V0dGluZ3MubW9kZWxcIjtcclxuaW1wb3J0IHtTZXR0aW5nc1NlcnZpY2V9IGZyb20gXCIuLi9fc2VydmljZXMvc2V0dGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge09rdGFTZXJ2aWNlfSBmcm9tIFwiLi4vX3NlcnZpY2VzL29rdGEuc2VydmljZVwiO1xyXG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7T2t0YVVzZXJNb2RlbH0gZnJvbSBcIi4uL19tb2RlbHMvb2t0YS5tb2RlbFwiO1xyXG5pbXBvcnQge0Jhc2VDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlL2Jhc2UuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7VGhlbWVTZXJ2aWNlfSBmcm9tIFwiLi4vX3NlcnZpY2VzL3RoZW1lLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbmNsYXNzIFNldHRpbmdzRm9ybU1vZGVsIHtcclxuICBkYXJrOiBGb3JtQ29udHJvbDxib29sZWFuPjtcclxuICBkZWNpbWFsU2VwYXJhdG9yOiBGb3JtQ29udHJvbDxEZWNpbWFsU2VwYXJhdG9yVHlwZT47XHJcbiAgZXhwb3J0RXh0ZW5zaW9uOiBGb3JtQ29udHJvbDxFeHBvcnRFeHRlbnNpb25UeXBlPjtcclxuXHJcbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IFNldHRpbmdzTW9kZWwpIHtcclxuICAgIHRoaXMuZGFyayA9IG5ldyBGb3JtQ29udHJvbDxib29sZWFuPihzZXR0aW5ncy5kYXJrLCB7bm9uTnVsbGFibGU6IHRydWV9KTtcclxuICAgIHRoaXMuZGVjaW1hbFNlcGFyYXRvciA9IG5ldyBGb3JtQ29udHJvbDxEZWNpbWFsU2VwYXJhdG9yVHlwZT4oc2V0dGluZ3MuZGVjaW1hbFNlcGFyYXRvciwge25vbk51bGxhYmxlOiB0cnVlfSk7XHJcbiAgICB0aGlzLmV4cG9ydEV4dGVuc2lvbiA9IG5ldyBGb3JtQ29udHJvbDxFeHBvcnRFeHRlbnNpb25UeXBlPihzZXR0aW5ncy5leHBvcnRFeHRlbnNpb24sIHtub25OdWxsYWJsZTogdHJ1ZX0pO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFNldHRpbmdzIGNvbXBvbmVudCB0aGF0IHlvdSBjYW4gc2ltcGx5IGluamVjdCBpbiBhbiBvdGhlcndpc2UgZW1wdHkgJ3NldHRpbmdzJyBzY3JlZW4uXHJcbiAqIFRvIGxldCB0aGUgdXNlciBjaG9vc2Ugc29tZSBiYXNpYyBwcmVmZXJlbmNlcyBsaWtlIGRhcmsgb3IgbGlnaHQgdGhlbWUuXHJcbiAqIFRoZSBjb21wb25lbnQgdXNlcyBjb250ZW50IHByb2plY3Rpb24gdG8gYWxsb3cgeW91IHRvIGFkZCBhbnkgYXBwLXNwZWNpZmljIHNldHRpbmdzIHlvdSB3YW50IHRvIHBlcnNpc3QuXHJcbiAqL1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGFhcy1zZXR0aW5ncycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zZXR0aW5ncy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBzZXR0aW5nVGl0bGUgPSAnVGhlc2UgYXJlIHlvdXIgc2V0dGluZ3MnO1xyXG5cclxuICBASW5wdXQoKSBkYXJrTW9kZUJ1dHRvblRpdGxlID0gJ2RhcmsgbW9kZSc7XHJcbiAgQElucHV0KCkgZGFya01vZGVIaW50VGV4dCA9ICcgcmVzdCB5b3VyIGV5ZXMgYSBiaXQsIHN3aXRjaCB0byBkYXJrIG1vZGUnO1xyXG5cclxuICBASW5wdXQoKSBleHBvcnREZXNjcmlwdGlvblRleHQgPSAnV2hlbiBkb3dubG9hZGluZyBkYXRhLCBzYXZlIGFzJztcclxuICBASW5wdXQoKSBleGNlbEV4cG9ydFJhZGlvVGV4dCA9ICdFeGNlbCBXb3JrYm9vayAoLnhsc3gpJztcclxuICBASW5wdXQoKSBjc3ZFeHBvcnRSYWRpb1RleHQgPSAnQ1NWIGZpbGUgKC5jc3YpJztcclxuXHJcbiAgQElucHV0KCkgZGVjaW1hbFNlcGFyYXRvclRleHQgPSAnWW91ciBkZWNpbWFsIHNlcGFyYXRvciBpbiBFeGNlbCc7XHJcbiAgQElucHV0KCkgZG90UmFkaW9UZXh0ID0gJ2RvdCc7XHJcbiAgQElucHV0KCkgY29tbWFSYWRpb1RleHQgPSAnY29tbWEnO1xyXG5cclxuICB1c2VyID0gbmV3IE9rdGFVc2VyTW9kZWwoe30pO1xyXG4gIHNldHRpbmdzOiBTZXR0aW5nc01vZGVsO1xyXG4gIHNldHRpbmdzRm9ybTogRm9ybUdyb3VwPFNldHRpbmdzRm9ybU1vZGVsPjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG9rdGFTZXJ2aWNlOiBPa3RhU2VydmljZSxcclxuICAgIHByaXZhdGUgc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMub25OZXdVc2VyKCk7XHJcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5zZXR0aW5nc1NlcnZpY2UuZ2V0U2V0dGluZ3MoKTtcclxuICAgIHRoaXMuc2V0dGluZ3NGb3JtID0gbmV3IEZvcm1Hcm91cDxTZXR0aW5nc0Zvcm1Nb2RlbD4obmV3IFNldHRpbmdzRm9ybU1vZGVsKHRoaXMuc2V0dGluZ3MpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OZXdVc2VyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5va3RhU2VydmljZS5vbk5ld1VzZXJJbmZvKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHVzZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgb25Ub2dnbGVUaGVtZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoKTtcclxuICAgIHRoaXMudGhlbWVTZXJ2aWNlLnRvZ2dsZVRoZW1lKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIC8vIHVwZGF0ZSBzZXR0aW5ncyB3aXRoIHRoZSBmb3JtIHZhbHVlcy4gTGVhdmUgZXh0cmFEYXRhIHVudG91Y2hlZCwgbm90IGhhbmRsZWQgYnkgdGhpcyBjb21wb25lbnRcclxuICAgIHRoaXMuc2V0dGluZ3MuZGFyayA9IHRoaXMuc2V0dGluZ3NGb3JtLmNvbnRyb2xzLmRhcmsudmFsdWU7XHJcbiAgICB0aGlzLnNldHRpbmdzLmRlY2ltYWxTZXBhcmF0b3IgPSB0aGlzLnNldHRpbmdzRm9ybS5jb250cm9scy5kZWNpbWFsU2VwYXJhdG9yLnZhbHVlO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5leHBvcnRFeHRlbnNpb24gPSB0aGlzLnNldHRpbmdzRm9ybS5jb250cm9scy5leHBvcnRFeHRlbnNpb24udmFsdWU7XHJcbiAgICAvLyBicm9hZGNhc3QgdGhlIG5ldyBzZXR0aW5nc1xyXG4gICAgdGhpcy5zZXR0aW5nc1NlcnZpY2UubmV3U2V0dGluZ3ModGhpcy5zZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwic2V0dGluZ3NcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImhhbGYtc2NyZWVuXCJcclxuICAgICAgIFtmb3JtR3JvdXBdPVwic2V0dGluZ3NGb3JtXCI+XHJcblxyXG4gICAgPGgzPnt7IHNldHRpbmdUaXRsZSB9fSB7eyB1c2VyLmZpcnN0TmFtZSA/ICcsICcgKyAodXNlci5maXJzdE5hbWUgfCB0aXRsZWNhc2UpIDogJycgfX08L2gzPlxyXG5cclxuICAgIDwhLS0gZGFyayBtb2RlIC0tPlxyXG4gICAgPGRpdj5cclxuICAgICAgPHNwYWFzLXRvZ2dsZSBpZD1cImRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjdHJsXT1cInNldHRpbmdzRm9ybS5jb250cm9scy5kYXJrXCJcclxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZGFya01vZGVCdXR0b25UaXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N1YlRleHRdPVwiZGFya01vZGVIaW50VGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZVRoZW1lKClcIj5cclxuICAgICAgPC9zcGFhcy10b2dnbGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIGV4cG9ydCB0eXBlIC0tPlxyXG4gICAgPGRpdj5cclxuICAgICAge3sgZXhwb3J0RGVzY3JpcHRpb25UZXh0IH19XHJcbiAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cInNlbGVjdCBhbiBleHBvcnQgdHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGNvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNldHRpbmdzRm9ybS5jb250cm9scy5leHBvcnRFeHRlbnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlU2V0dGluZ3MoKVwiPlxyXG4gICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwieGxzeFwiPnt7IGV4Y2VsRXhwb3J0UmFkaW9UZXh0IH19PC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiY3N2XCI+e3sgY3N2RXhwb3J0UmFkaW9UZXh0IH19PC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gZGVjaW1hbCBzZXBhcmF0b3IgLS0+XHJcbiAgICA8ZGl2PlxyXG4gICAgICB7eyBkZWNpbWFsU2VwYXJhdG9yVGV4dCB9fVxyXG4gICAgICA8bWF0LXJhZGlvLWdyb3VwIGFyaWEtbGFiZWw9XCJzZWxlY3QgYSBkZWNpbWFsIHNlcGFyYXRvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGNvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNldHRpbmdzRm9ybS5jb250cm9scy5kZWNpbWFsU2VwYXJhdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNldHRpbmdzKClcIj5cclxuICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImRvdFwiPnt7IGRvdFJhZGlvVGV4dCB9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImNvbW1hXCI+e3sgY29tbWFSYWRpb1RleHQgfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBwcm9qZWN0ZWQgY29udGVudCAtLT5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgPHNwYWFzLWJnIGJnSW1nPVwiZW1wbG95ZWVfc29sYXJcIj48L3NwYWFzLWJnPlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==