keevo-components 2.0.198 → 2.0.200

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,18 +6,20 @@ import { KvInstrucoesReportComponent } from './components/kv-instrucoes-report/k
6
6
  import { KvEditorQuillService, KvEditorRelatorioService, KvEditorMentionService, KvEditorPdfService } from './kv-editor';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "../../../api/services/component.service";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "@angular/forms";
11
- import * as i4 from "../../kv-error/kv-error.component";
12
- import * as i5 from "primeng/tooltip";
13
- import * as i6 from "primeng/divider";
14
- import * as i7 from "primeng/progressbar";
15
- import * as i8 from "primeng/overlaypanel";
16
- import * as i9 from "primeng/skeleton";
17
- import * as i10 from "../../kv-tags/kv-tags.component";
9
+ import * as i2 from "@angular/platform-browser";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@angular/forms";
12
+ import * as i5 from "../../kv-error/kv-error.component";
13
+ import * as i6 from "primeng/tooltip";
14
+ import * as i7 from "primeng/divider";
15
+ import * as i8 from "primeng/progressbar";
16
+ import * as i9 from "primeng/overlaypanel";
17
+ import * as i10 from "primeng/skeleton";
18
+ import * as i11 from "../../kv-tags/kv-tags.component";
18
19
  export class KvEditorComponent extends BaseComponentInput {
19
- constructor(componentService) {
20
+ constructor(componentService, sanitizer) {
20
21
  super(componentService);
22
+ this.sanitizer = sanitizer;
21
23
  // Injeção de serviços
22
24
  this.quillService = inject(KvEditorQuillService);
23
25
  this.relatorioService = inject(KvEditorRelatorioService);
@@ -43,6 +45,9 @@ export class KvEditorComponent extends BaseComponentInput {
43
45
  this.editorReadyResolver = resolve;
44
46
  });
45
47
  this.htmlDoEditor = '';
48
+ // Signal para espelhamento do conteúdo do editor
49
+ this.htmlEspelho = signal('');
50
+ this.previewContent = signal('');
46
51
  // Signals para controle de estado
47
52
  this.initLoadComplete = signal(false);
48
53
  this.isLoading = signal(true);
@@ -50,6 +55,8 @@ export class KvEditorComponent extends BaseComponentInput {
50
55
  // tipoVisualizacao = signal<'valor' | 'descricao'>('descricao');
51
56
  this.filteredVariables = signal([]);
52
57
  this.clearedTemplate = signal(false);
58
+ //Input para habilitar preview
59
+ this.enablePreviewMode = input(false);
53
60
  // Inputs para relatórios
54
61
  this.relatorios = input([]);
55
62
  this.idRelatorioInitial = model(0);
@@ -69,6 +76,11 @@ export class KvEditorComponent extends BaseComponentInput {
69
76
  this.quill.enable(!readonly);
70
77
  }
71
78
  });
79
+ effect(() => {
80
+ if (this.enablePreviewMode()) {
81
+ this.atualizarPreview();
82
+ }
83
+ });
72
84
  }
73
85
  // Métodos para gerenciar relatórios
74
86
  setRelatorioPorId(id) {
@@ -102,6 +114,11 @@ export class KvEditorComponent extends BaseComponentInput {
102
114
  }
103
115
  else
104
116
  this.clearedTemplate.set(true);
117
+ setTimeout(() => {
118
+ if (this.enablePreviewMode()) {
119
+ this.atualizarPreview();
120
+ }
121
+ }, 1500);
105
122
  }
106
123
  async handleInit() {
107
124
  await this.quillService.loadCss();
@@ -141,6 +158,9 @@ export class KvEditorComponent extends BaseComponentInput {
141
158
  });
142
159
  });
143
160
  this.quill.on('text-change', (delta, oldContents, source) => {
161
+ if (source === 'user' && delta.ops) {
162
+ this.configurarHtmlAutoCompleteTag(delta);
163
+ }
144
164
  if (this.relatorios().length > 0) {
145
165
  this.handleMention();
146
166
  }
@@ -154,6 +174,9 @@ export class KvEditorComponent extends BaseComponentInput {
154
174
  });
155
175
  this.outputRaw.emit(this.quill.getText());
156
176
  this.outputHtml.emit(this.quill.getSemanticHTML());
177
+ if (this.enablePreviewMode()) {
178
+ this.atualizarPreview();
179
+ }
157
180
  }
158
181
  });
159
182
  }
@@ -174,6 +197,9 @@ export class KvEditorComponent extends BaseComponentInput {
174
197
  if (rawvalue == "\n" || this.value == "\n") {
175
198
  this.value = '';
176
199
  }
200
+ if (this.enablePreviewMode()) {
201
+ setTimeout(() => this.atualizarPreview(), 100);
202
+ }
177
203
  }
178
204
  else {
179
205
  this.updatingEditor = false;
@@ -241,13 +267,142 @@ export class KvEditorComponent extends BaseComponentInput {
241
267
  this.setRelatorioPorId(0);
242
268
  this.writeValue('');
243
269
  }
244
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvEditorComponent, deps: [{ token: i1.ComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
245
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvEditorComponent, selector: "kv-editor", inputs: { canvaHeigth: { classPropertyName: "canvaHeigth", publicName: "canvaHeigth", isSignal: false, isRequired: false, transformFunction: null }, contentType: { classPropertyName: "contentType", publicName: "contentType", isSignal: false, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: false, isRequired: false, transformFunction: null }, relatorios: { classPropertyName: "relatorios", publicName: "relatorios", isSignal: true, isRequired: false, transformFunction: null }, idRelatorioInitial: { classPropertyName: "idRelatorioInitial", publicName: "idRelatorioInitial", isSignal: true, isRequired: false, transformFunction: null }, printButton: { classPropertyName: "printButton", publicName: "printButton", isSignal: true, isRequired: false, transformFunction: null }, labelEmptyDropdown: { classPropertyName: "labelEmptyDropdown", publicName: "labelEmptyDropdown", isSignal: true, isRequired: false, transformFunction: null }, instrucoesTemplate: { classPropertyName: "instrucoesTemplate", publicName: "instrucoesTemplate", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onTextChange: "onTextChange", onSelectionChange: "onSelectionChange", outputRaw: "outputRaw", outputHtml: "outputHtml", idRelatorioInitial: "idRelatorioInitialChange" }, providers: ComponentProviders(KvEditorComponent), viewQueries: [{ propertyName: "opVariables", first: true, predicate: ["opVariables"], descendants: true }, { propertyName: "mentionAnchor", first: true, predicate: ["mentionAnchor"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n class=\"kv-editor-container h-full w-full max-h-full flex flex-column overflow-hidden\"\r\n>\r\n <div\r\n #editor\r\n id=\"kv-editor-toolbar\"\r\n [ngClass]=\"{ 'error-border-toolbar': hasControlError() }\"\r\n class=\"{{ showHeader() ? 'flex' : 'hidden' }} flex-column flex-initial\"\r\n >\r\n @if(relatorios().length > 0) {\r\n <div class=\"flex flex-row justify-content-between\">\r\n <div class=\"flex flex-row gap-2\">\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-green-600 font-medium\"\r\n >\r\n contract\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">{{\r\n !clearedTemplate()\r\n ? relatorio()?.label || labelEmptyDropdown()\r\n : labelEmptyDropdown()\r\n }}</span>\r\n <span class=\"material-symbols-outlined text-lg\">\r\n keyboard_arrow_down\r\n </span>\r\n </div>\r\n\r\n @if(!clearedTemplate()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"clearTemplate()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-orange-600 font-medium\"\r\n [pTooltip]=\"'Limpar Template'\"\r\n >\r\n layers_clear\r\n </span>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"showInstrucoes()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-blue-600 font-medium\"\r\n >\r\n info\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Instru\u00E7\u00F5es</span>\r\n </div>\r\n </div>\r\n\r\n @if(printButton()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"openRelatorio()\"\r\n >\r\n <span class=\"material-symbols-outlined text-lg font-medium\">\r\n print\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Imprimir</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p-divider class=\"w-full\"></p-divider>\r\n\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-between w-full flex-initial\"\r\n >\r\n @if(isLoading()) {\r\n\r\n <div class=\"flex flex-row align-items-center gap-3 w-full\">\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex-row align-items-center flex-wrap gap-2 {{\r\n isLoading() ? 'hidden' : 'flex'\r\n }} w-full\"\r\n >\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-font\">\r\n <option value=\"roboto\">Roboto</option>\r\n <option value=\"arial\">Arial</option>\r\n <option value=\"times-new-roman\">Times New Roman</option>\r\n <option value=\"monospace\">Monospace</option>\r\n <option value=\"inter\">Inter</option>\r\n <option selected>Sans Serif</option>\r\n <option value=\"serif\">Serif</option>\r\n </select>\r\n\r\n <select class=\"ql-header\">\r\n <option value=\"1\">Titulo</option>\r\n <option value=\"2\">Subtitulo</option>\r\n <option selected>Normal</option>\r\n </select>\r\n\r\n <span class=\"ql-format-group\">\r\n <select title=\"Size\" class=\"ql-size\">\r\n <option value=\"15px\">15px</option>\r\n <option value=\"20px\">20px</option>\r\n <option value=\"30px\">30px</option>\r\n <option value=\"40px\">40px</option>\r\n <option value=\"50px\">50px</option>\r\n <option value=\"70px\">70px</option>\r\n <option value=\"90px\">90px</option>\r\n </select>\r\n </span>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-bold\"></button>\r\n <button class=\"ql-italic\"></button>\r\n <button class=\"ql-underline\"></button>\r\n <button class=\"ql-strike\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-color\"></select>\r\n <select class=\"ql-background\"></select>\r\n </span>\r\n\r\n @if(true) {\r\n <!-- <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-header\" value=\"1\"></button>\r\n <button class=\"ql-header\" value=\"2\"></button>\r\n </span> -->\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-link\"></button>\r\n <button class=\"ql-image\"></button>\r\n <button class=\"ql-video\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-list\" value=\"ordered\"></button>\r\n <button class=\"ql-list\" value=\"bullet\"></button>\r\n <select class=\"ql-align\"></select>\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n style=\"height: 3px; border-top: none; border-bottom: none\"\r\n [style.borderRight]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n [style.borderLeft]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n >\r\n @if(isLoadingPdf()) {\r\n <p-progressBar mode=\"indeterminate\" [style]=\"{ height: '3px' }\" />\r\n }\r\n </div>\r\n\r\n <div\r\n id=\"kv-editor\"\r\n class=\"overflow-auto w-full flex-1 scrollstyle w-full\"\r\n [ngClass]=\"{\r\n 'error-border': hasControlError(),\r\n 'pointer-events-none opacity-60': isLoadingPdf()\r\n }\"\r\n [style.borderTop]=\"showHeader() ? 'none' : '1px solid #e5e7eb'\"\r\n ></div>\r\n</div>\r\n<kv-error [hasError]=\"hasControlError()\">{{ erroMessage() }}</kv-error>\r\n\r\n<!-- <link href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.snow.css\" rel=\"stylesheet\" /> -->\r\n<link href=\"https://fonts.googleapis.com/css?family=Roboto\" rel=\"stylesheet\" />\r\n<script src=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js\"></script>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.bubble.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css\"\r\n/>\r\n\r\n<p-overlayPanel #op styleClass=\"overflow-hidden\">\r\n <div\r\n class=\"grid m-0 gap-2 p-2 max-w-20rem overflow-y-auto scrollstyle\"\r\n style=\"max-height: 16rem\"\r\n >\r\n @for(item of relatorios(); track $index) {\r\n <div\r\n class=\"col-12 cursor-pointer hover:bg-gray-100 transition-colors transition-duration-200 border-round-lg shadow-2 flex flex-column gap-2\"\r\n (click)=\"setRelatorio(item)\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 justify-content-between\"\r\n >\r\n <span class=\"text-sm font-medium w-full\">{{ item.label }}</span>\r\n\r\n <kv-tags\r\n class=\"transition-opacity transition-duration-300 {{\r\n item?.id == idRelatorioSelected() ? 'opacity-100' : 'opacity-0'\r\n }}\"\r\n [tags]=\"[{ label: 'Selecionado', severity: 'primary' }]\"\r\n ></kv-tags>\r\n </div>\r\n <span class=\"text-xs text-gray-500\">{{ item.descricao }}</span>\r\n </div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n\r\n<div class=\"kv-editor-container flex flex-column overflow-hidden relative\">\r\n <div\r\n #mentionAnchor\r\n style=\"position: fixed; width: 1px; height: 1px; opacity: 0\"\r\n ></div>\r\n</div>\r\n\r\n<p-overlayPanel\r\n #opVariables\r\n [appendTo]=\"'body'\"\r\n (onHide)=\"closeVariablesPanel()\"\r\n>\r\n <div\r\n class=\"flex flex-column gap-1 p-1 overflow-y-auto scroll-virtual border-round-lg\"\r\n style=\"max-height: 250px; min-width: 250px; background-color: #333333\"\r\n >\r\n @for(variable of filteredVariables(); track variable.id) {\r\n <div\r\n class=\"p-2 cursor-pointer transition-colors transition-duration-200 border-round-lg text-sm text-white option-dropdown\"\r\n (click)=\"selectVariableFromPanel(variable)\"\r\n >\r\n {{ variable.descricao }} (\r\n <span class=\"text-gray-400\">{{ variable.value }}</span> )\r\n </div>\r\n } @empty {\r\n <div class=\"p-2 text-sm text-gray-500\">Nenhuma vari\u00E1vel encontrada.</div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n", styles: [":host ::ng-deep .ql-font-roboto{font-family:Roboto,sans-serif}:host ::ng-deep .ql-font-inter{font-family:Inter var,sans-serif}:host ::ng-deep .ql-font-arial{font-family:Arial,Arial,sans-serif}:host ::ng-deep .ql-font-times-new-roman{font-family:Times New Roman,Times,serif}:host ::ng-deep .ql-tooltip.ql-editing[data-mode=video]{transform:translate(40%)}:host ::ng-deep #kv-editor-toolbar{border-radius:6px 6px 0 0;border:1px solid #e5e7eb}:host ::ng-deep #kv-editor{border-radius:0 0 6px 6px;border:1px solid #e5e7eb}.error-border-toolbar{transition:all ease-in .2s;border-top-color:#e24c4c!important;border-bottom-color:#e24c4c!important;border-left-color:#e24c4c!important;border-right-color:#e24c4c!important}.error-border{border-color:#e24c4c!important;transition:all ease-in .2s}:host ::ng-deep .blot-formatter__resize-handle{background:#eaeaea!important}:ng-deep p{text-align:justify!important}::ng-deep .scrollstyle,::ng-deep .ql-editor{overflow-x:hidden}::ng-deep .scrollstyle::-webkit-scrollbar,::ng-deep .ql-editor::-webkit-scrollbar{width:6px}::ng-deep .scrollstyle::-webkit-scrollbar:hover,::ng-deep .ql-editor::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scrollstyle::-webkit-scrollbar-thumb,::ng-deep .ql-editor::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scrollstyle:hover::-webkit-scrollbar-thumb,::ng-deep .ql-editor:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scrollstyle::-webkit-scrollbar-track,::ng-deep .ql-editor::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}:host ::ng-deep .editor-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffff80;display:flex;justify-content:center;align-items:center;z-index:100000;border-radius:inherit}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:after{background:#002542}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:before{background:#002542}::ng-deep .scroll-virtual{overflow-x:hidden}::ng-deep .scroll-virtual::-webkit-scrollbar{width:8px}::ng-deep .scroll-virtual::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scroll-virtual::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scroll-virtual:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scroll-virtual::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.option-dropdown{background-color:#333;transition:all ease-in .2s}.option-dropdown:hover{background-color:#444}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i4.KvErrorComponent, selector: "kv-error", inputs: ["formControl", "hasError"] }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i6.Divider, selector: "p-divider", inputs: ["style", "styleClass", "layout", "type", "align"] }, { kind: "component", type: i7.ProgressBar, selector: "p-progressBar", inputs: ["value", "showValue", "styleClass", "style", "unit", "mode", "color"] }, { kind: "component", type: i8.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i9.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i10.KvTagsComponent, selector: "kv-tags", inputs: ["tags", "hover", "clickable"], outputs: ["onClickTag"] }] }); }
270
+ atualizarPreview() {
271
+ if (!this.quill)
272
+ return;
273
+ let conteudoHtml = this.quill.root.innerHTML;
274
+ conteudoHtml = this.decodificarEntidadesHtml(conteudoHtml);
275
+ this.htmlEspelho.set(conteudoHtml);
276
+ const conteudoProcessado = this.processarConteudoPreview(conteudoHtml);
277
+ this.previewContent.set(conteudoProcessado);
278
+ }
279
+ decodificarEntidadesHtml(text) {
280
+ const textarea = document.createElement('textarea');
281
+ textarea.innerHTML = text;
282
+ return textarea.value;
283
+ }
284
+ configurarHtmlAutoCompleteTag(delta) {
285
+ if (!delta.ops || delta.ops.length === 0)
286
+ return;
287
+ const ultimoOp = delta.ops[delta.ops.length - 1];
288
+ if (ultimoOp.insert && typeof ultimoOp.insert === 'string' && ultimoOp.insert === '>') {
289
+ const textoAtual = this.quill.getText();
290
+ const posicaoCursor = this.quill.getSelection()?.index || 0;
291
+ const textoAntesCursor = textoAtual.substring(0, posicaoCursor);
292
+ const regexTagAberta = /<(\w+)(?:\s+[^>]*)?(?<!\/)\>$/;
293
+ const verificarTag = textoAntesCursor.match(regexTagAberta);
294
+ if (verificarTag) {
295
+ const tagName = verificarTag[1];
296
+ const tagsInline = ['img', 'br', 'hr', 'input', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr'];
297
+ if (!tagsInline.includes(tagName.toLowerCase())) {
298
+ const textoDepoisCursor = textoAtual.substring(posicaoCursor);
299
+ const fecharTagRegex = new RegExp(`^<\/${tagName}>`, 'i');
300
+ if (!fecharTagRegex.test(textoDepoisCursor)) {
301
+ this.updatingEditor = true;
302
+ this.quill.insertText(posicaoCursor, `</${tagName}>`, 'user');
303
+ setTimeout(() => {
304
+ this.quill.setSelection(posicaoCursor, 0);
305
+ this.updatingEditor = false;
306
+ }, 0);
307
+ }
308
+ }
309
+ }
310
+ }
311
+ }
312
+ processarConteudoPreview(content) {
313
+ if (!content || content === '\n') {
314
+ return this.sanitizer.bypassSecurityTrustHtml('<p class="text-gray-400 text-sm">O conteúdo aparecerá aqui...</p>');
315
+ }
316
+ const styleRegex = /<style[^>]*>([\s\S]*?)<\/style>/gi;
317
+ const styles = [];
318
+ let conteudoProcessado = content;
319
+ let match;
320
+ while ((match = styleRegex.exec(content)) !== null) {
321
+ styles.push(match[1]);
322
+ }
323
+ conteudoProcessado = this.processarVariaveisComHtml(conteudoProcessado);
324
+ conteudoProcessado = this.manterQuebrasLinhaHtml(conteudoProcessado);
325
+ let conteudoFinal = '<div class="kv-editor-preview-wrapper">';
326
+ if (styles.length > 0) {
327
+ conteudoFinal += '<style>' + styles.join('\n') + '</style>';
328
+ }
329
+ conteudoFinal += conteudoProcessado;
330
+ conteudoFinal += '</div>';
331
+ return this.sanitizer.bypassSecurityTrustHtml(conteudoFinal);
332
+ }
333
+ manterQuebrasLinhaHtml(html) {
334
+ return html;
335
+ }
336
+ isHtmlString(str) {
337
+ if (!str || typeof str !== 'string')
338
+ return false;
339
+ const trimmed = str.trim();
340
+ if (!trimmed.startsWith('<') || !trimmed.endsWith('>'))
341
+ return false;
342
+ const htmlTagRegex = /<\/?[a-z][\s\S]*?>/i;
343
+ const hasOpeningTag = /<[a-z][\s\S]*?>/i.test(trimmed);
344
+ const hasClosingTag = /<\/[a-z][\s\S]*?>/i.test(trimmed);
345
+ return htmlTagRegex.test(trimmed) && (hasOpeningTag || hasClosingTag);
346
+ }
347
+ processarVariaveisComHtml(content) {
348
+ if (!this.relatorio() || !this.relatorio().variaveis) {
349
+ return content;
350
+ }
351
+ let conteudoProcessado = content;
352
+ const variaveis = this.relatorio().variaveis;
353
+ variaveis.forEach(variavel => {
354
+ const placeholderId = `{${variavel.id}}`;
355
+ //para buscar outros padrões de html pra variável
356
+ //obs: padronizar o uso de menções com spans data-mention
357
+ const patterns = [
358
+ `<span[^>]*class="[^"]*mention[^"]*"[^>]*>\\s*${this.escapeRegex(variavel.descricao)}\\s*</span>`,
359
+ `<span[^>]*data-mention[^>]*>\\s*${this.escapeRegex(variavel.descricao)}\\s*</span>`,
360
+ `>\\s*${this.escapeRegex(variavel.descricao)}\\s*<`,
361
+ `<[^>]+>\\s*${this.escapeRegex(variavel.descricao)}\\s*</[^>]+>`
362
+ ];
363
+ if (conteudoProcessado.includes(placeholderId)) {
364
+ if (this.isHtmlString(variavel.value)) {
365
+ conteudoProcessado = conteudoProcessado.split(placeholderId).join(variavel.value);
366
+ }
367
+ }
368
+ let substituido = false;
369
+ for (const pattern of patterns) {
370
+ const regexMention = new RegExp(pattern, 'gi');
371
+ if (regexMention.test(conteudoProcessado)) {
372
+ if (this.isHtmlString(variavel.value)) {
373
+ const replacement = pattern.includes('>') && pattern.includes('<')
374
+ ? variavel.value
375
+ : `>${variavel.value}<`;
376
+ conteudoProcessado = conteudoProcessado.replace(regexMention, pattern.startsWith('>') ? `>${variavel.value}<` : variavel.value);
377
+ }
378
+ else {
379
+ conteudoProcessado = conteudoProcessado.replace(regexMention, pattern.startsWith('>') ? `>${variavel.value}<` : variavel.value);
380
+ }
381
+ substituido = true;
382
+ break;
383
+ }
384
+ }
385
+ if (!substituido && conteudoProcessado.includes(variavel.descricao)) {
386
+ if (this.isHtmlString(variavel.value)) {
387
+ conteudoProcessado = conteudoProcessado.split(variavel.descricao).join(variavel.value);
388
+ }
389
+ }
390
+ });
391
+ return conteudoProcessado;
392
+ }
393
+ escapeRegex(str) {
394
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
395
+ }
396
+ get getPreviewContent() {
397
+ return this.previewContent();
398
+ }
399
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvEditorComponent, deps: [{ token: i1.ComponentService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
400
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvEditorComponent, selector: "kv-editor", inputs: { canvaHeigth: { classPropertyName: "canvaHeigth", publicName: "canvaHeigth", isSignal: false, isRequired: false, transformFunction: null }, contentType: { classPropertyName: "contentType", publicName: "contentType", isSignal: false, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: false, isRequired: false, transformFunction: null }, enablePreviewMode: { classPropertyName: "enablePreviewMode", publicName: "enablePreviewMode", isSignal: true, isRequired: false, transformFunction: null }, relatorios: { classPropertyName: "relatorios", publicName: "relatorios", isSignal: true, isRequired: false, transformFunction: null }, idRelatorioInitial: { classPropertyName: "idRelatorioInitial", publicName: "idRelatorioInitial", isSignal: true, isRequired: false, transformFunction: null }, printButton: { classPropertyName: "printButton", publicName: "printButton", isSignal: true, isRequired: false, transformFunction: null }, labelEmptyDropdown: { classPropertyName: "labelEmptyDropdown", publicName: "labelEmptyDropdown", isSignal: true, isRequired: false, transformFunction: null }, instrucoesTemplate: { classPropertyName: "instrucoesTemplate", publicName: "instrucoesTemplate", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onTextChange: "onTextChange", onSelectionChange: "onSelectionChange", outputRaw: "outputRaw", outputHtml: "outputHtml", idRelatorioInitial: "idRelatorioInitialChange" }, providers: ComponentProviders(KvEditorComponent), viewQueries: [{ propertyName: "opVariables", first: true, predicate: ["opVariables"], descendants: true }, { propertyName: "mentionAnchor", first: true, predicate: ["mentionAnchor"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n class=\"kv-editor-container h-full w-full max-h-full flex flex-column overflow-hidden\"\r\n>\r\n <div\r\n #editor\r\n id=\"kv-editor-toolbar\"\r\n [ngClass]=\"{ 'error-border-toolbar': hasControlError() }\"\r\n class=\"{{ showHeader() ? 'flex' : 'hidden' }} flex-column flex-initial\"\r\n >\r\n @if(relatorios().length > 0) {\r\n <div class=\"flex flex-row justify-content-between {{readonly() && 'pointer-events-none opacity-90'}}\">\r\n <div class=\"flex flex-row gap-2\">\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-green-600 font-medium\"\r\n >\r\n contract\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">{{\r\n !clearedTemplate()\r\n ? relatorio()?.label || labelEmptyDropdown()\r\n : labelEmptyDropdown()\r\n }}</span>\r\n <span class=\"material-symbols-outlined text-lg\">\r\n keyboard_arrow_down\r\n </span>\r\n </div>\r\n\r\n @if(!clearedTemplate()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"clearTemplate()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-orange-600 font-medium\"\r\n [pTooltip]=\"'Limpar Template'\"\r\n >\r\n layers_clear\r\n </span>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"showInstrucoes()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-blue-600 font-medium\"\r\n >\r\n info\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Instru\u00E7\u00F5es</span>\r\n </div>\r\n </div>\r\n\r\n <!-- @if(printButton()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"openRelatorio()\"\r\n >\r\n <span class=\"material-symbols-outlined text-lg font-medium\">\r\n print\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Imprimir</span>\r\n </div>\r\n } -->\r\n </div>\r\n\r\n <p-divider class=\"w-full\"></p-divider>\r\n\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-between w-full flex-initial\"\r\n >\r\n @if(isLoading()) {\r\n\r\n <div class=\"flex flex-row align-items-center gap-3 w-full\">\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex-row align-items-center flex-wrap gap-2 {{\r\n isLoading() ? 'hidden' : 'flex'\r\n }} w-full\"\r\n >\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-font\">\r\n <option value=\"roboto\">Roboto</option>\r\n <option value=\"arial\">Arial</option>\r\n <option value=\"times-new-roman\">Times New Roman</option>\r\n <option value=\"monospace\">Monospace</option>\r\n <option value=\"inter\">Inter</option>\r\n <option selected>Sans Serif</option>\r\n <option value=\"serif\">Serif</option>\r\n </select>\r\n\r\n <select class=\"ql-header\">\r\n <option value=\"1\">Titulo</option>\r\n <option value=\"2\">Subtitulo</option>\r\n <option selected>Normal</option>\r\n </select>\r\n\r\n <span class=\"ql-format-group\">\r\n <select title=\"Size\" class=\"ql-size\">\r\n <option value=\"15px\">15px</option>\r\n <option value=\"20px\">20px</option>\r\n <option value=\"30px\">30px</option>\r\n <option value=\"40px\">40px</option>\r\n <option value=\"50px\">50px</option>\r\n <option value=\"70px\">70px</option>\r\n <option value=\"90px\">90px</option>\r\n </select>\r\n </span>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-bold\"></button>\r\n <button class=\"ql-italic\"></button>\r\n <button class=\"ql-underline\"></button>\r\n <button class=\"ql-strike\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-color\"></select>\r\n <select class=\"ql-background\"></select>\r\n </span>\r\n\r\n @if(true) {\r\n <!-- <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-header\" value=\"1\"></button>\r\n <button class=\"ql-header\" value=\"2\"></button>\r\n </span> -->\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-link\"></button>\r\n <button class=\"ql-image\"></button>\r\n <button class=\"ql-video\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-list\" value=\"ordered\"></button>\r\n <button class=\"ql-list\" value=\"bullet\"></button>\r\n <select class=\"ql-align\"></select>\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n style=\"height: 3px; border-top: none; border-bottom: none\"\r\n [style.borderRight]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n [style.borderLeft]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n >\r\n @if(isLoadingPdf()) {\r\n <p-progressBar mode=\"indeterminate\" [style]=\"{ height: '3px' }\" />\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-row flex-1 gap-0 overflow-auto\">\r\n <div\r\n id=\"kv-editor\"\r\n class=\"overflow-auto flex-1 scrollstyle\"\r\n [ngClass]=\"{\r\n 'error-border': hasControlError(),\r\n 'pointer-events-none opacity-60': isLoadingPdf()\r\n }\"\r\n [style.borderTop]=\"showHeader() ? 'none' : '1px solid #e5e7eb'\"\r\n [style.borderRight]=\"enablePreviewMode() ? 'none' : '1px solid #e5e7eb'\"\r\n ></div>\r\n\r\n @if(enablePreviewMode()) {\r\n <div class=\"flex flex-column flex-1\">\r\n <div \r\n class=\"flex align-items-center gap-2 px-3 py-2\" \r\n [style.borderRight]=\"'1px solid #e5e7eb'\"\r\n [style.borderLeft]=\"'1px solid #e5e7eb'\"\r\n >\r\n <span class=\"material-symbols-outlined text-blue-600 text-lg\">visibility</span>\r\n <span class=\"font-semibold text-gray-700 text-sm\">Preview</span>\r\n </div>\r\n \r\n <div\r\n id=\"kv-editor-preview\"\r\n class=\"overflow-auto flex-1 scrollstyle\"\r\n [innerHTML]=\"getPreviewContent\"\r\n [style.border]=\"'1px solid #e5e7eb'\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n\r\n</div>\r\n<kv-error [hasError]=\"hasControlError()\">{{ erroMessage() }}</kv-error>\r\n\r\n<!-- <link href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.snow.css\" rel=\"stylesheet\" /> -->\r\n<link href=\"https://fonts.googleapis.com/css?family=Roboto\" rel=\"stylesheet\" />\r\n<script src=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js\"></script>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.bubble.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css\"\r\n/>\r\n\r\n<p-overlayPanel #op styleClass=\"overflow-hidden\">\r\n <div\r\n class=\"grid m-0 gap-2 p-2 max-w-20rem overflow-y-auto scrollstyle\"\r\n style=\"max-height: 16rem\"\r\n >\r\n @for(item of relatorios(); track $index) {\r\n <div\r\n class=\"col-12 cursor-pointer hover:bg-gray-100 transition-colors transition-duration-200 border-round-lg shadow-2 flex flex-column gap-2\"\r\n (click)=\"setRelatorio(item)\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 justify-content-between\"\r\n >\r\n <span class=\"text-sm font-medium w-full\">{{ item.label }}</span>\r\n\r\n <kv-tags\r\n class=\"transition-opacity transition-duration-300 {{\r\n item?.id == idRelatorioSelected() ? 'opacity-100' : 'opacity-0'\r\n }}\"\r\n [tags]=\"[{ label: 'Selecionado', severity: 'primary' }]\"\r\n ></kv-tags>\r\n </div>\r\n <span class=\"text-xs text-gray-500\">{{ item.descricao }}</span>\r\n </div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n\r\n<div class=\"kv-editor-container flex flex-column overflow-hidden relative\">\r\n <div\r\n #mentionAnchor\r\n style=\"position: fixed; width: 1px; height: 1px; opacity: 0\"\r\n ></div>\r\n</div>\r\n\r\n<p-overlayPanel\r\n #opVariables\r\n [appendTo]=\"'body'\"\r\n (onHide)=\"closeVariablesPanel()\"\r\n>\r\n <div\r\n class=\"flex flex-column gap-1 p-1 overflow-y-auto scroll-virtual border-round-lg\"\r\n style=\"max-height: 250px; min-width: 250px; background-color: #333333\"\r\n >\r\n @for(variable of filteredVariables(); track variable.id) {\r\n <div\r\n class=\"p-2 cursor-pointer transition-colors transition-duration-200 border-round-lg text-sm text-white option-dropdown\"\r\n (click)=\"selectVariableFromPanel(variable)\"\r\n >\r\n {{ variable.descricao }} (\r\n <span class=\"text-gray-400\">{{ variable.value }}</span> )\r\n </div>\r\n } @empty {\r\n <div class=\"p-2 text-sm text-gray-500\">Nenhuma vari\u00E1vel encontrada.</div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n", styles: [":host ::ng-deep .ql-font-roboto{font-family:Roboto,sans-serif}:host ::ng-deep .ql-font-inter{font-family:Inter var,sans-serif}:host ::ng-deep .ql-font-arial{font-family:Arial,Arial,sans-serif}:host ::ng-deep .ql-font-times-new-roman{font-family:Times New Roman,Times,serif}:host ::ng-deep .ql-tooltip.ql-editing[data-mode=video]{transform:translate(40%)}:host ::ng-deep #kv-editor-toolbar{border-radius:6px 6px 0 0;border:1px solid #e5e7eb}:host ::ng-deep #kv-editor{border-radius:0 0 6px 6px;border:1px solid #e5e7eb}.error-border-toolbar{transition:all ease-in .2s;border-top-color:#e24c4c!important;border-bottom-color:#e24c4c!important;border-left-color:#e24c4c!important;border-right-color:#e24c4c!important}.error-border{border-color:#e24c4c!important;transition:all ease-in .2s}:host ::ng-deep .blot-formatter__resize-handle{background:#eaeaea!important}:host ::ng-deep #kv-editor-preview{border-radius:0 0 6px 6px;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper{font-family:Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42;color:#000;padding:12px 15px;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper p{margin:0;padding:0;white-space:pre-wrap}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper *{white-space:pre-wrap}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper strong,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper b{font-weight:700!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper em,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper i{font-style:italic!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper u{text-decoration:underline!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper s,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper strike{text-decoration:line-through!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h1,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h2,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h3,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h4,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h5,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h6{font-weight:700;margin:0;padding:0}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h1{font-size:2em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h2{font-size:1.5em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h3{font-size:1.17em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h4{font-size:1em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h5{font-size:.83em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h6{font-size:.67em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper a{color:#06c;text-decoration:underline}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper code{background-color:#f0f0f0;border-radius:3px;padding:2px 4px;font-family:monospace;font-size:85%}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper pre{background-color:#23241f;color:#f8f8f2;overflow:visible;border-radius:3px;padding:5px 10px;white-space:pre-wrap;margin-bottom:5px;margin-top:5px}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper pre code{background-color:transparent;border-radius:0;color:inherit;font-size:100%;padding:0}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper ol,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper ul{margin:0;padding-left:1.5em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper img{max-width:100%;height:auto}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table{width:100%;border-collapse:collapse;margin-bottom:1rem}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table th,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table td{border:1px solid #e5e7eb;padding:.5rem;text-align:left}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table th{background-color:#f9fafb;font-weight:600}:ng-deep p{text-align:justify!important}::ng-deep .scrollstyle,::ng-deep .ql-editor{overflow-x:hidden}::ng-deep .scrollstyle::-webkit-scrollbar,::ng-deep .ql-editor::-webkit-scrollbar{width:6px}::ng-deep .scrollstyle::-webkit-scrollbar:hover,::ng-deep .ql-editor::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scrollstyle::-webkit-scrollbar-thumb,::ng-deep .ql-editor::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scrollstyle:hover::-webkit-scrollbar-thumb,::ng-deep .ql-editor:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scrollstyle::-webkit-scrollbar-track,::ng-deep .ql-editor::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}:host ::ng-deep .editor-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffff80;display:flex;justify-content:center;align-items:center;z-index:100000;border-radius:inherit}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:after{background:#002542}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:before{background:#002542}::ng-deep .scroll-virtual{overflow-x:hidden}::ng-deep .scroll-virtual::-webkit-scrollbar{width:8px}::ng-deep .scroll-virtual::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scroll-virtual::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scroll-virtual:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scroll-virtual::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.option-dropdown{background-color:#333;transition:all ease-in .2s}.option-dropdown:hover{background-color:#444}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i5.KvErrorComponent, selector: "kv-error", inputs: ["formControl", "hasError"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.Divider, selector: "p-divider", inputs: ["style", "styleClass", "layout", "type", "align"] }, { kind: "component", type: i8.ProgressBar, selector: "p-progressBar", inputs: ["value", "showValue", "styleClass", "style", "unit", "mode", "color"] }, { kind: "component", type: i9.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i10.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i11.KvTagsComponent, selector: "kv-tags", inputs: ["tags", "hover", "clickable"], outputs: ["onClickTag"] }] }); }
246
401
  }
247
402
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvEditorComponent, decorators: [{
248
403
  type: Component,
249
- args: [{ selector: 'kv-editor', providers: ComponentProviders(KvEditorComponent), template: "<div\r\n class=\"kv-editor-container h-full w-full max-h-full flex flex-column overflow-hidden\"\r\n>\r\n <div\r\n #editor\r\n id=\"kv-editor-toolbar\"\r\n [ngClass]=\"{ 'error-border-toolbar': hasControlError() }\"\r\n class=\"{{ showHeader() ? 'flex' : 'hidden' }} flex-column flex-initial\"\r\n >\r\n @if(relatorios().length > 0) {\r\n <div class=\"flex flex-row justify-content-between\">\r\n <div class=\"flex flex-row gap-2\">\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-green-600 font-medium\"\r\n >\r\n contract\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">{{\r\n !clearedTemplate()\r\n ? relatorio()?.label || labelEmptyDropdown()\r\n : labelEmptyDropdown()\r\n }}</span>\r\n <span class=\"material-symbols-outlined text-lg\">\r\n keyboard_arrow_down\r\n </span>\r\n </div>\r\n\r\n @if(!clearedTemplate()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"clearTemplate()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-orange-600 font-medium\"\r\n [pTooltip]=\"'Limpar Template'\"\r\n >\r\n layers_clear\r\n </span>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"showInstrucoes()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-blue-600 font-medium\"\r\n >\r\n info\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Instru\u00E7\u00F5es</span>\r\n </div>\r\n </div>\r\n\r\n @if(printButton()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"openRelatorio()\"\r\n >\r\n <span class=\"material-symbols-outlined text-lg font-medium\">\r\n print\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Imprimir</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p-divider class=\"w-full\"></p-divider>\r\n\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-between w-full flex-initial\"\r\n >\r\n @if(isLoading()) {\r\n\r\n <div class=\"flex flex-row align-items-center gap-3 w-full\">\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex-row align-items-center flex-wrap gap-2 {{\r\n isLoading() ? 'hidden' : 'flex'\r\n }} w-full\"\r\n >\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-font\">\r\n <option value=\"roboto\">Roboto</option>\r\n <option value=\"arial\">Arial</option>\r\n <option value=\"times-new-roman\">Times New Roman</option>\r\n <option value=\"monospace\">Monospace</option>\r\n <option value=\"inter\">Inter</option>\r\n <option selected>Sans Serif</option>\r\n <option value=\"serif\">Serif</option>\r\n </select>\r\n\r\n <select class=\"ql-header\">\r\n <option value=\"1\">Titulo</option>\r\n <option value=\"2\">Subtitulo</option>\r\n <option selected>Normal</option>\r\n </select>\r\n\r\n <span class=\"ql-format-group\">\r\n <select title=\"Size\" class=\"ql-size\">\r\n <option value=\"15px\">15px</option>\r\n <option value=\"20px\">20px</option>\r\n <option value=\"30px\">30px</option>\r\n <option value=\"40px\">40px</option>\r\n <option value=\"50px\">50px</option>\r\n <option value=\"70px\">70px</option>\r\n <option value=\"90px\">90px</option>\r\n </select>\r\n </span>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-bold\"></button>\r\n <button class=\"ql-italic\"></button>\r\n <button class=\"ql-underline\"></button>\r\n <button class=\"ql-strike\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-color\"></select>\r\n <select class=\"ql-background\"></select>\r\n </span>\r\n\r\n @if(true) {\r\n <!-- <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-header\" value=\"1\"></button>\r\n <button class=\"ql-header\" value=\"2\"></button>\r\n </span> -->\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-link\"></button>\r\n <button class=\"ql-image\"></button>\r\n <button class=\"ql-video\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-list\" value=\"ordered\"></button>\r\n <button class=\"ql-list\" value=\"bullet\"></button>\r\n <select class=\"ql-align\"></select>\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n style=\"height: 3px; border-top: none; border-bottom: none\"\r\n [style.borderRight]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n [style.borderLeft]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n >\r\n @if(isLoadingPdf()) {\r\n <p-progressBar mode=\"indeterminate\" [style]=\"{ height: '3px' }\" />\r\n }\r\n </div>\r\n\r\n <div\r\n id=\"kv-editor\"\r\n class=\"overflow-auto w-full flex-1 scrollstyle w-full\"\r\n [ngClass]=\"{\r\n 'error-border': hasControlError(),\r\n 'pointer-events-none opacity-60': isLoadingPdf()\r\n }\"\r\n [style.borderTop]=\"showHeader() ? 'none' : '1px solid #e5e7eb'\"\r\n ></div>\r\n</div>\r\n<kv-error [hasError]=\"hasControlError()\">{{ erroMessage() }}</kv-error>\r\n\r\n<!-- <link href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.snow.css\" rel=\"stylesheet\" /> -->\r\n<link href=\"https://fonts.googleapis.com/css?family=Roboto\" rel=\"stylesheet\" />\r\n<script src=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js\"></script>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.bubble.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css\"\r\n/>\r\n\r\n<p-overlayPanel #op styleClass=\"overflow-hidden\">\r\n <div\r\n class=\"grid m-0 gap-2 p-2 max-w-20rem overflow-y-auto scrollstyle\"\r\n style=\"max-height: 16rem\"\r\n >\r\n @for(item of relatorios(); track $index) {\r\n <div\r\n class=\"col-12 cursor-pointer hover:bg-gray-100 transition-colors transition-duration-200 border-round-lg shadow-2 flex flex-column gap-2\"\r\n (click)=\"setRelatorio(item)\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 justify-content-between\"\r\n >\r\n <span class=\"text-sm font-medium w-full\">{{ item.label }}</span>\r\n\r\n <kv-tags\r\n class=\"transition-opacity transition-duration-300 {{\r\n item?.id == idRelatorioSelected() ? 'opacity-100' : 'opacity-0'\r\n }}\"\r\n [tags]=\"[{ label: 'Selecionado', severity: 'primary' }]\"\r\n ></kv-tags>\r\n </div>\r\n <span class=\"text-xs text-gray-500\">{{ item.descricao }}</span>\r\n </div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n\r\n<div class=\"kv-editor-container flex flex-column overflow-hidden relative\">\r\n <div\r\n #mentionAnchor\r\n style=\"position: fixed; width: 1px; height: 1px; opacity: 0\"\r\n ></div>\r\n</div>\r\n\r\n<p-overlayPanel\r\n #opVariables\r\n [appendTo]=\"'body'\"\r\n (onHide)=\"closeVariablesPanel()\"\r\n>\r\n <div\r\n class=\"flex flex-column gap-1 p-1 overflow-y-auto scroll-virtual border-round-lg\"\r\n style=\"max-height: 250px; min-width: 250px; background-color: #333333\"\r\n >\r\n @for(variable of filteredVariables(); track variable.id) {\r\n <div\r\n class=\"p-2 cursor-pointer transition-colors transition-duration-200 border-round-lg text-sm text-white option-dropdown\"\r\n (click)=\"selectVariableFromPanel(variable)\"\r\n >\r\n {{ variable.descricao }} (\r\n <span class=\"text-gray-400\">{{ variable.value }}</span> )\r\n </div>\r\n } @empty {\r\n <div class=\"p-2 text-sm text-gray-500\">Nenhuma vari\u00E1vel encontrada.</div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n", styles: [":host ::ng-deep .ql-font-roboto{font-family:Roboto,sans-serif}:host ::ng-deep .ql-font-inter{font-family:Inter var,sans-serif}:host ::ng-deep .ql-font-arial{font-family:Arial,Arial,sans-serif}:host ::ng-deep .ql-font-times-new-roman{font-family:Times New Roman,Times,serif}:host ::ng-deep .ql-tooltip.ql-editing[data-mode=video]{transform:translate(40%)}:host ::ng-deep #kv-editor-toolbar{border-radius:6px 6px 0 0;border:1px solid #e5e7eb}:host ::ng-deep #kv-editor{border-radius:0 0 6px 6px;border:1px solid #e5e7eb}.error-border-toolbar{transition:all ease-in .2s;border-top-color:#e24c4c!important;border-bottom-color:#e24c4c!important;border-left-color:#e24c4c!important;border-right-color:#e24c4c!important}.error-border{border-color:#e24c4c!important;transition:all ease-in .2s}:host ::ng-deep .blot-formatter__resize-handle{background:#eaeaea!important}:ng-deep p{text-align:justify!important}::ng-deep .scrollstyle,::ng-deep .ql-editor{overflow-x:hidden}::ng-deep .scrollstyle::-webkit-scrollbar,::ng-deep .ql-editor::-webkit-scrollbar{width:6px}::ng-deep .scrollstyle::-webkit-scrollbar:hover,::ng-deep .ql-editor::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scrollstyle::-webkit-scrollbar-thumb,::ng-deep .ql-editor::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scrollstyle:hover::-webkit-scrollbar-thumb,::ng-deep .ql-editor:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scrollstyle::-webkit-scrollbar-track,::ng-deep .ql-editor::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}:host ::ng-deep .editor-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffff80;display:flex;justify-content:center;align-items:center;z-index:100000;border-radius:inherit}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:after{background:#002542}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:before{background:#002542}::ng-deep .scroll-virtual{overflow-x:hidden}::ng-deep .scroll-virtual::-webkit-scrollbar{width:8px}::ng-deep .scroll-virtual::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scroll-virtual::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scroll-virtual:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scroll-virtual::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.option-dropdown{background-color:#333;transition:all ease-in .2s}.option-dropdown:hover{background-color:#444}\n"] }]
250
- }], ctorParameters: () => [{ type: i1.ComponentService }], propDecorators: { canvaHeigth: [{
404
+ args: [{ selector: 'kv-editor', providers: ComponentProviders(KvEditorComponent), template: "<div\r\n class=\"kv-editor-container h-full w-full max-h-full flex flex-column overflow-hidden\"\r\n>\r\n <div\r\n #editor\r\n id=\"kv-editor-toolbar\"\r\n [ngClass]=\"{ 'error-border-toolbar': hasControlError() }\"\r\n class=\"{{ showHeader() ? 'flex' : 'hidden' }} flex-column flex-initial\"\r\n >\r\n @if(relatorios().length > 0) {\r\n <div class=\"flex flex-row justify-content-between {{readonly() && 'pointer-events-none opacity-90'}}\">\r\n <div class=\"flex flex-row gap-2\">\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-green-600 font-medium\"\r\n >\r\n contract\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">{{\r\n !clearedTemplate()\r\n ? relatorio()?.label || labelEmptyDropdown()\r\n : labelEmptyDropdown()\r\n }}</span>\r\n <span class=\"material-symbols-outlined text-lg\">\r\n keyboard_arrow_down\r\n </span>\r\n </div>\r\n\r\n @if(!clearedTemplate()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"clearTemplate()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-orange-600 font-medium\"\r\n [pTooltip]=\"'Limpar Template'\"\r\n >\r\n layers_clear\r\n </span>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"showInstrucoes()\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined text-lg text-blue-600 font-medium\"\r\n >\r\n info\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Instru\u00E7\u00F5es</span>\r\n </div>\r\n </div>\r\n\r\n <!-- @if(printButton()) {\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 p-2 border-round-lg border-1 border-gray-200 hover:shadow-1 hover:bg-gray-100 cursor-pointer transition-all transition-duration-300\"\r\n (click)=\"openRelatorio()\"\r\n >\r\n <span class=\"material-symbols-outlined text-lg font-medium\">\r\n print\r\n </span>\r\n <span class=\"font-semibold text-xs text-gray-600\">Imprimir</span>\r\n </div>\r\n } -->\r\n </div>\r\n\r\n <p-divider class=\"w-full\"></p-divider>\r\n\r\n }\r\n\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-between w-full flex-initial\"\r\n >\r\n @if(isLoading()) {\r\n\r\n <div class=\"flex flex-row align-items-center gap-3 w-full\">\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n\r\n <p-skeleton\r\n styleClass=\"w-6rem\"\r\n [style]=\"{ height: '2rem' }\"\r\n ></p-skeleton>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"flex-row align-items-center flex-wrap gap-2 {{\r\n isLoading() ? 'hidden' : 'flex'\r\n }} w-full\"\r\n >\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-font\">\r\n <option value=\"roboto\">Roboto</option>\r\n <option value=\"arial\">Arial</option>\r\n <option value=\"times-new-roman\">Times New Roman</option>\r\n <option value=\"monospace\">Monospace</option>\r\n <option value=\"inter\">Inter</option>\r\n <option selected>Sans Serif</option>\r\n <option value=\"serif\">Serif</option>\r\n </select>\r\n\r\n <select class=\"ql-header\">\r\n <option value=\"1\">Titulo</option>\r\n <option value=\"2\">Subtitulo</option>\r\n <option selected>Normal</option>\r\n </select>\r\n\r\n <span class=\"ql-format-group\">\r\n <select title=\"Size\" class=\"ql-size\">\r\n <option value=\"15px\">15px</option>\r\n <option value=\"20px\">20px</option>\r\n <option value=\"30px\">30px</option>\r\n <option value=\"40px\">40px</option>\r\n <option value=\"50px\">50px</option>\r\n <option value=\"70px\">70px</option>\r\n <option value=\"90px\">90px</option>\r\n </select>\r\n </span>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-bold\"></button>\r\n <button class=\"ql-italic\"></button>\r\n <button class=\"ql-underline\"></button>\r\n <button class=\"ql-strike\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <select class=\"ql-color\"></select>\r\n <select class=\"ql-background\"></select>\r\n </span>\r\n\r\n @if(true) {\r\n <!-- <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-header\" value=\"1\"></button>\r\n <button class=\"ql-header\" value=\"2\"></button>\r\n </span> -->\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-link\"></button>\r\n <button class=\"ql-image\"></button>\r\n <button class=\"ql-video\"></button>\r\n </span>\r\n\r\n <p-divider layout=\"vertical\"></p-divider>\r\n\r\n <span class=\"ql-formats border-round-md\">\r\n <button class=\"ql-list\" value=\"ordered\"></button>\r\n <button class=\"ql-list\" value=\"bullet\"></button>\r\n <select class=\"ql-align\"></select>\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n style=\"height: 3px; border-top: none; border-bottom: none\"\r\n [style.borderRight]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n [style.borderLeft]=\"showHeader() ? '1px solid #e5e7eb' : 'none'\"\r\n >\r\n @if(isLoadingPdf()) {\r\n <p-progressBar mode=\"indeterminate\" [style]=\"{ height: '3px' }\" />\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-row flex-1 gap-0 overflow-auto\">\r\n <div\r\n id=\"kv-editor\"\r\n class=\"overflow-auto flex-1 scrollstyle\"\r\n [ngClass]=\"{\r\n 'error-border': hasControlError(),\r\n 'pointer-events-none opacity-60': isLoadingPdf()\r\n }\"\r\n [style.borderTop]=\"showHeader() ? 'none' : '1px solid #e5e7eb'\"\r\n [style.borderRight]=\"enablePreviewMode() ? 'none' : '1px solid #e5e7eb'\"\r\n ></div>\r\n\r\n @if(enablePreviewMode()) {\r\n <div class=\"flex flex-column flex-1\">\r\n <div \r\n class=\"flex align-items-center gap-2 px-3 py-2\" \r\n [style.borderRight]=\"'1px solid #e5e7eb'\"\r\n [style.borderLeft]=\"'1px solid #e5e7eb'\"\r\n >\r\n <span class=\"material-symbols-outlined text-blue-600 text-lg\">visibility</span>\r\n <span class=\"font-semibold text-gray-700 text-sm\">Preview</span>\r\n </div>\r\n \r\n <div\r\n id=\"kv-editor-preview\"\r\n class=\"overflow-auto flex-1 scrollstyle\"\r\n [innerHTML]=\"getPreviewContent\"\r\n [style.border]=\"'1px solid #e5e7eb'\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n\r\n</div>\r\n<kv-error [hasError]=\"hasControlError()\">{{ erroMessage() }}</kv-error>\r\n\r\n<!-- <link href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.snow.css\" rel=\"stylesheet\" /> -->\r\n<link href=\"https://fonts.googleapis.com/css?family=Roboto\" rel=\"stylesheet\" />\r\n<script src=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js\"></script>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.bubble.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css\"\r\n/>\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css\"\r\n/>\r\n\r\n<p-overlayPanel #op styleClass=\"overflow-hidden\">\r\n <div\r\n class=\"grid m-0 gap-2 p-2 max-w-20rem overflow-y-auto scrollstyle\"\r\n style=\"max-height: 16rem\"\r\n >\r\n @for(item of relatorios(); track $index) {\r\n <div\r\n class=\"col-12 cursor-pointer hover:bg-gray-100 transition-colors transition-duration-200 border-round-lg shadow-2 flex flex-column gap-2\"\r\n (click)=\"setRelatorio(item)\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center gap-2 justify-content-between\"\r\n >\r\n <span class=\"text-sm font-medium w-full\">{{ item.label }}</span>\r\n\r\n <kv-tags\r\n class=\"transition-opacity transition-duration-300 {{\r\n item?.id == idRelatorioSelected() ? 'opacity-100' : 'opacity-0'\r\n }}\"\r\n [tags]=\"[{ label: 'Selecionado', severity: 'primary' }]\"\r\n ></kv-tags>\r\n </div>\r\n <span class=\"text-xs text-gray-500\">{{ item.descricao }}</span>\r\n </div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n\r\n<div class=\"kv-editor-container flex flex-column overflow-hidden relative\">\r\n <div\r\n #mentionAnchor\r\n style=\"position: fixed; width: 1px; height: 1px; opacity: 0\"\r\n ></div>\r\n</div>\r\n\r\n<p-overlayPanel\r\n #opVariables\r\n [appendTo]=\"'body'\"\r\n (onHide)=\"closeVariablesPanel()\"\r\n>\r\n <div\r\n class=\"flex flex-column gap-1 p-1 overflow-y-auto scroll-virtual border-round-lg\"\r\n style=\"max-height: 250px; min-width: 250px; background-color: #333333\"\r\n >\r\n @for(variable of filteredVariables(); track variable.id) {\r\n <div\r\n class=\"p-2 cursor-pointer transition-colors transition-duration-200 border-round-lg text-sm text-white option-dropdown\"\r\n (click)=\"selectVariableFromPanel(variable)\"\r\n >\r\n {{ variable.descricao }} (\r\n <span class=\"text-gray-400\">{{ variable.value }}</span> )\r\n </div>\r\n } @empty {\r\n <div class=\"p-2 text-sm text-gray-500\">Nenhuma vari\u00E1vel encontrada.</div>\r\n }\r\n </div>\r\n</p-overlayPanel>\r\n", styles: [":host ::ng-deep .ql-font-roboto{font-family:Roboto,sans-serif}:host ::ng-deep .ql-font-inter{font-family:Inter var,sans-serif}:host ::ng-deep .ql-font-arial{font-family:Arial,Arial,sans-serif}:host ::ng-deep .ql-font-times-new-roman{font-family:Times New Roman,Times,serif}:host ::ng-deep .ql-tooltip.ql-editing[data-mode=video]{transform:translate(40%)}:host ::ng-deep #kv-editor-toolbar{border-radius:6px 6px 0 0;border:1px solid #e5e7eb}:host ::ng-deep #kv-editor{border-radius:0 0 6px 6px;border:1px solid #e5e7eb}.error-border-toolbar{transition:all ease-in .2s;border-top-color:#e24c4c!important;border-bottom-color:#e24c4c!important;border-left-color:#e24c4c!important;border-right-color:#e24c4c!important}.error-border{border-color:#e24c4c!important;transition:all ease-in .2s}:host ::ng-deep .blot-formatter__resize-handle{background:#eaeaea!important}:host ::ng-deep #kv-editor-preview{border-radius:0 0 6px 6px;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper{font-family:Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42;color:#000;padding:12px 15px;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper p{margin:0;padding:0;white-space:pre-wrap}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper *{white-space:pre-wrap}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper strong,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper b{font-weight:700!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper em,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper i{font-style:italic!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper u{text-decoration:underline!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper s,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper strike{text-decoration:line-through!important}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h1,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h2,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h3,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h4,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h5,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h6{font-weight:700;margin:0;padding:0}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h1{font-size:2em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h2{font-size:1.5em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h3{font-size:1.17em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h4{font-size:1em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h5{font-size:.83em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper h6{font-size:.67em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper a{color:#06c;text-decoration:underline}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper code{background-color:#f0f0f0;border-radius:3px;padding:2px 4px;font-family:monospace;font-size:85%}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper pre{background-color:#23241f;color:#f8f8f2;overflow:visible;border-radius:3px;padding:5px 10px;white-space:pre-wrap;margin-bottom:5px;margin-top:5px}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper pre code{background-color:transparent;border-radius:0;color:inherit;font-size:100%;padding:0}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper ol,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper ul{margin:0;padding-left:1.5em}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper img{max-width:100%;height:auto}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table{width:100%;border-collapse:collapse;margin-bottom:1rem}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table th,:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table td{border:1px solid #e5e7eb;padding:.5rem;text-align:left}:host ::ng-deep #kv-editor-preview .kv-editor-preview-wrapper table th{background-color:#f9fafb;font-weight:600}:ng-deep p{text-align:justify!important}::ng-deep .scrollstyle,::ng-deep .ql-editor{overflow-x:hidden}::ng-deep .scrollstyle::-webkit-scrollbar,::ng-deep .ql-editor::-webkit-scrollbar{width:6px}::ng-deep .scrollstyle::-webkit-scrollbar:hover,::ng-deep .ql-editor::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scrollstyle::-webkit-scrollbar-thumb,::ng-deep .ql-editor::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scrollstyle:hover::-webkit-scrollbar-thumb,::ng-deep .ql-editor:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scrollstyle::-webkit-scrollbar-track,::ng-deep .ql-editor::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}:host ::ng-deep .editor-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffff80;display:flex;justify-content:center;align-items:center;z-index:100000;border-radius:inherit}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:after{background:#002542}::ng-deep .p-progressbar-indeterminate .p-progressbar-value:before{background:#002542}::ng-deep .scroll-virtual{overflow-x:hidden}::ng-deep .scroll-virtual::-webkit-scrollbar{width:8px}::ng-deep .scroll-virtual::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .scroll-virtual::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .scroll-virtual:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .scroll-virtual::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.option-dropdown{background-color:#333;transition:all ease-in .2s}.option-dropdown:hover{background-color:#444}\n"] }]
405
+ }], ctorParameters: () => [{ type: i1.ComponentService }, { type: i2.DomSanitizer }], propDecorators: { canvaHeigth: [{
251
406
  type: Input
252
407
  }], contentType: [{
253
408
  type: Input
@@ -268,4 +423,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
268
423
  type: ViewChild,
269
424
  args: ['mentionAnchor']
270
425
  }] } });
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWlucHV0cy9rdi1lZGl0b3Iva3YtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWlucHV0cy9rdi1lZGl0b3Iva3YtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUdMLE1BQU0sRUFFTixNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUUvRyxPQUFPLEVBR0wsb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ25CLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7QUFRckIsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGtCQUEwQjtJQUUvRCxZQUFZLGdCQUFrQztRQUM1QyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQVUxQixzQkFBc0I7UUFDZCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVDLHFCQUFnQixHQUFHLE1BQU0sQ0FB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QUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7OEdBbFJVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDBtREFGakIsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsOFBDekNsRCwwdlVBMlJBOzsyRkRoUGEsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLFdBQVcsYUFHVixrQkFBa0IsbUJBQW1CO3FGQTBCdkMsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBc0NtQixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0ksYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgY29tcHV0ZWQsXHJcbiAgZWZmZWN0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGluamVjdCxcclxuICBpbnB1dCxcclxuICBJbnB1dCxcclxuICBtb2RlbCxcclxuICBPbkluaXQsXHJcbiAgb3V0cHV0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgc2lnbmFsLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCBRdWlsbCBmcm9tICdxdWlsbCc7XHJcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCB9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcblxyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50SW5wdXQgfSBmcm9tICcuLi8uLi8uLi9hcGkvYmFzZS1jb21wb25lbnRzL2Jhc2UtY29tcG9uZW50LWlucHV0JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UHJvdmlkZXJzIH0gZnJvbSAnLi4vLi4vLi4vYXBpL2hlbHBlcnMvY29tcG9uZW50LXByb3ZpZGVycyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcGkvc2VydmljZXMvY29tcG9uZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBLdkluc3RydWNvZXNSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMva3YtaW5zdHJ1Y29lcy1yZXBvcnQva3YtaW5zdHJ1Y29lcy1yZXBvcnQuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7XHJcbiAgS3ZFZGl0b3JSZWxhdG9yaW8sXHJcbiAgS3ZFZGl0b3JWYXJpYXZlbCxcclxuICBLdkVkaXRvclF1aWxsU2VydmljZSxcclxuICBLdkVkaXRvclJlbGF0b3Jpb1NlcnZpY2UsXHJcbiAgS3ZFZGl0b3JNZW50aW9uU2VydmljZSxcclxuICBLdkVkaXRvclBkZlNlcnZpY2VcclxufSBmcm9tICcuL2t2LWVkaXRvcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2t2LWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2t2LWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4va3YtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBDb21wb25lbnRQcm92aWRlcnMoS3ZFZGl0b3JDb21wb25lbnQpLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgS3ZFZGl0b3JDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50SW5wdXQ8c3RyaW5nPiBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudFNlcnZpY2U6IENvbXBvbmVudFNlcnZpY2UpIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGxldCByZWFkb25seSA9IHRoaXMucmVhZG9ubHkoKTtcclxuICAgICAgaWYgKHRoaXMucXVpbGwpIHtcclxuICAgICAgICB0aGlzLnF1aWxsLmVuYWJsZSghcmVhZG9ubHkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIEluamXDp8OjbyBkZSBzZXJ2acOnb3NcclxuICBwcml2YXRlIHF1aWxsU2VydmljZSA9IGluamVjdChLdkVkaXRvclF1aWxsU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWxhdG9yaW9TZXJ2aWNlID0gaW5qZWN0KEt2RWRpdG9yUmVsYXRvcmlvU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBtZW50aW9uU2VydmljZSA9IGluamVjdChLdkVkaXRvck1lbnRpb25TZXJ2aWNlKTtcclxuICBwcml2YXRlIHBkZlNlcnZpY2UgPSBpbmplY3QoS3ZFZGl0b3JQZGZTZXJ2aWNlKTtcclxuICBwcml2YXRlIGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XHJcblxyXG4gIC8vIFByb3ByaWVkYWRlcyBkZSBjb25maWd1cmHDp8Ojb1xyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIEVzc2EgcHJvcHJpZWRhZGUgbsOjbyBzZXLDoSBtYWlzIHV0aWxpemFkYSBwb3IgZXNzZSBjb21wb25lbnRlIG5hcyBwcsOzeGltYXMgdmVyc8O1ZXMuXHJcbiAgICovXHJcbiAgQElucHV0KCkgY2FudmFIZWlndGg6IHN0cmluZyA9ICczODBweCc7XHJcblxyXG4gIEBJbnB1dCgpIGNvbnRlbnRUeXBlOiAnaHRtbCcgfCAndGV4dCcgPSAnaHRtbCc7XHJcbiAgQElucHV0KCkgZGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gRXZlbnRvc1xyXG4gIEBPdXRwdXQoKSBvblRleHRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG91dHB1dFJhdzogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG91dHB1dEh0bWw6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBQcm9wcmllZGFkZXMgaW50ZXJuYXNcclxuICBwcml2YXRlIHVwZGF0aW5nRWRpdG9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0U2VsZWN0aW9uUmFuZ2U6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBlZGl0b3JSZWFkeVJlc29sdmVyITogKCkgPT4gdm9pZDtcclxuICBwcml2YXRlIGVkaXRvclJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XHJcbiAgICB0aGlzLmVkaXRvclJlYWR5UmVzb2x2ZXIgPSByZXNvbHZlO1xyXG4gIH0pO1xyXG5cclxuICAvLyBJbnN0w6JuY2lhIGRvIFF1aWxsXHJcbiAgcXVpbGwhOiBRdWlsbDtcclxuICBodG1sRG9FZGl0b3IgPSAnJztcclxuXHJcbiAgLy8gU2lnbmFscyBwYXJhIGNvbnRyb2xlIGRlIGVzdGFkb1xyXG4gIGluaXRMb2FkQ29tcGxldGUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGlzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcclxuICBlZGl0b3JUb29sYmFySGVpZ2h0ID0gc2lnbmFsPHN0cmluZz4oJzNyZW0nKTtcclxuICAvLyB0aXBvVmlzdWFsaXphY2FvID0gc2lnbmFsPCd2YWxvcicgfCAnZGVzY3JpY2FvJz4oJ2Rlc2NyaWNhbycpO1xyXG4gIGZpbHRlcmVkVmFyaWFibGVzID0gc2lnbmFsPEt2RWRpdG9yVmFyaWF2ZWxbXT4oW10pO1xyXG4gIGNsZWFyZWRUZW1wbGF0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8vIElucHV0cyBwYXJhIHJlbGF0w7NyaW9zXHJcbiAgcmVsYXRvcmlvcyA9IGlucHV0PEt2RWRpdG9yUmVsYXRvcmlvW10+KFtdKTtcclxuICBpZFJlbGF0b3Jpb0luaXRpYWwgPSBtb2RlbDxhbnk+KDApO1xyXG4gIHByaW50QnV0dG9uID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgbGFiZWxFbXB0eURyb3Bkb3duID0gaW5wdXQ8c3RyaW5nPignU2VsZWNpb25lIHVtIHJlbGF0w7NyaW8nKTtcclxuICBpbnN0cnVjb2VzVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xyXG4gIHNob3dIZWFkZXIgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcclxuICByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcblxyXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXMgcGFyYSByZWxhdMOzcmlvc1xyXG4gIGlkUmVsYXRvcmlvU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlbGF0b3Jpb1NlcnZpY2UuZ2V0SWRSZWxhdG9yaW9TZWxlY3RlZCgpKTtcclxuICByZWxhdG9yaW8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlbGF0b3Jpb1NlcnZpY2UuZ2V0UmVsYXRvcmlvU2VsZWN0ZWQoKSk7XHJcbiAgaXNMb2FkaW5nUGRmID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wZGZTZXJ2aWNlLmdldElzTG9hZGluZ1BkZigpKTtcclxuXHJcbiAgLy8gVmlld0NoaWxkIHBhcmEgb3ZlcmxheSBwYW5lbHNcclxuICBAVmlld0NoaWxkKCdvcFZhcmlhYmxlcycpIG9wVmFyaWFibGVzITogT3ZlcmxheVBhbmVsO1xyXG4gIEBWaWV3Q2hpbGQoJ21lbnRpb25BbmNob3InKSBtZW50aW9uQW5jaG9yITogRWxlbWVudFJlZjtcclxuXHJcbiAgbWVzc2FnZXMgPSBbeyBzZXZlcml0eTogJ2luZm8nLCBkZXRhaWw6ICdNZXNzYWdlIENvbnRlbnQnIH1dO1xyXG5cclxuICAvLyBNw6l0b2RvcyBwYXJhIGdlcmVuY2lhciByZWxhdMOzcmlvc1xyXG4gIHNldFJlbGF0b3Jpb1BvcklkKGlkOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlbGF0b3JpbyA9IHRoaXMucmVsYXRvcmlvU2VydmljZS5zZXRSZWxhdG9yaW9Qb3JJZChpZCk7XHJcbiAgICBpZiAocmVsYXRvcmlvKSB7XHJcbiAgICAgIHRoaXMuc2V0UmVsYXRvcmlvKHJlbGF0b3Jpbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRSZWxhdG9yaW8ocmVsYXRvcmlvOiBLdkVkaXRvclJlbGF0b3Jpbyk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcmVkVGVtcGxhdGUuc2V0KGZhbHNlKTtcclxuICAgIHRoaXMucmVsYXRvcmlvU2VydmljZS5zZXRSZWxhdG9yaW8ocmVsYXRvcmlvKTtcclxuICAgIGNvbnN0IG1vZGVsbyA9IHJlbGF0b3Jpby5tb2RlbG9SZWxhdG9yaW8gfHwgJyc7XHJcbiAgICBjb25zdCB2YXJpYXZlaXMgPSByZWxhdG9yaW8udmFyaWF2ZWlzIHx8IFtdO1xyXG5cclxuICAgIHRoaXMuaHRtbERvRWRpdG9yID0gdGhpcy5yZWxhdG9yaW9TZXJ2aWNlLnJlbmRlckNvbnRyYXRvKG1vZGVsbywgdmFyaWF2ZWlzKTtcclxuICAgIHRoaXMudXBkYXRpbmdFZGl0b3IgPSB0cnVlO1xyXG4gICAgdGhpcy5lc2NyZXZhVmFsb3IodGhpcy5odG1sRG9FZGl0b3IpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIC8vIEluaWNpYWxpemEgb3MgcmVsYXTDs3Jpb3Mgbm8gc2VydmnDp29cclxuICAgIHRoaXMucmVsYXRvcmlvU2VydmljZS5zZXRSZWxhdG9yaW9zKHRoaXMucmVsYXRvcmlvcygpKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucXVpbGwpIHtcclxuICAgICAgdGhpcy5oYW5kbGVJbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XHJcbiAgICB9LCAxMDAwKTtcclxuXHJcbiAgICBpZiAodGhpcy5pZFJlbGF0b3Jpb0luaXRpYWwoKSkge1xyXG4gICAgICB0aGlzLmNsZWFyZWRUZW1wbGF0ZS5zZXQoZmFsc2UpO1xyXG4gICAgICB0aGlzLnNldFJlbGF0b3Jpb1BvcklkKHRoaXMuaWRSZWxhdG9yaW9Jbml0aWFsKCkpO1xyXG4gICAgfSBlbHNlIHRoaXMuY2xlYXJlZFRlbXBsYXRlLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZUluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnF1aWxsU2VydmljZS5sb2FkQ3NzKCk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVRdWlsbEVkaXRvcigpO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZVF1aWxsRWRpdG9yKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICB0aGVtZTogJ3Nub3cnLFxyXG4gICAgICBtb2R1bGVzOiB7XHJcbiAgICAgICAgdG9vbGJhcjogJyNrdi1lZGl0b3ItdG9vbGJhcicsXHJcbiAgICAgIH0sXHJcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLmxhYmVsID8gdGhpcy5sYWJlbCA6ICcnLFxyXG4gICAgICByZWFkT25seTogdGhpcy5yZWFkb25seSgpLFxyXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5xdWlsbCA9IHRoaXMucXVpbGxTZXJ2aWNlLmNyZWF0ZVF1aWxsSW5zdGFuY2UoJyNrdi1lZGl0b3InLCBjb25maWcpO1xyXG5cclxuICAgIHRoaXMuc2V0dXBRdWlsbEV2ZW50cygpO1xyXG4gICAgdGhpcy5lZGl0b3JSZWFkeVJlc29sdmVyKCk7XHJcbiAgICB0aGlzLmluaXRMb2FkQ29tcGxldGUuc2V0KHRydWUpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbDtcclxuICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5tYXJrQXNQcmlzdGluZSkge1xyXG4gICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBRdWlsbEV2ZW50cygpOiB2b2lkIHtcclxuICAgIHRoaXMucXVpbGwub24oJ3NlbGVjdGlvbi1jaGFuZ2UnLCAocmFuZ2UsIG9sZFJhbmdlLCBzb3VyY2UpID0+IHtcclxuICAgICAgaWYgKHJhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uUmFuZ2UgPSByYW5nZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xyXG4gICAgICAgIHJhbmdlOiByYW5nZSxcclxuICAgICAgICBvbGRSYW5nZTogb2xkUmFuZ2UsXHJcbiAgICAgICAgc291cmNlOiBzb3VyY2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5xdWlsbC5vbigndGV4dC1jaGFuZ2UnLCAoZGVsdGEsIG9sZENvbnRlbnRzLCBzb3VyY2UpID0+IHtcclxuICAgICAgaWYgKHRoaXMucmVsYXRvcmlvcygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmhhbmRsZU1lbnRpb24oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLnVwZGF0aW5nRWRpdG9yKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGluZ0VkaXRvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZXNjcmV2YVZhbG9yKHRoaXMucXVpbGwuZ2V0U2VtYW50aWNIVE1MKCksIHRoaXMucXVpbGwuZ2V0VGV4dCgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblRleHRDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICBkZWx0YTogZGVsdGEsXHJcbiAgICAgICAgICBvbGRDb250ZW50czogb2xkQ29udGVudHMsXHJcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vdXRwdXRSYXcuZW1pdCh0aGlzLnF1aWxsLmdldFRleHQoKSk7XHJcbiAgICAgICAgdGhpcy5vdXRwdXRIdG1sLmVtaXQodGhpcy5xdWlsbC5nZXRTZW1hbnRpY0hUTUwoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0aW5nRWRpdG9yID0gdHJ1ZTtcclxuICAgIHRoaXMuZXNjcmV2YVZhbG9yKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGVzY3JldmFWYWxvcihodG1sdmFsdWU6IGFueSwgcmF3dmFsdWU/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5pbml0TG9hZENvbXBsZXRlKCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5lZGl0b3JSZWFkeVByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucXVpbGwpIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRpbmdFZGl0b3IpIHtcclxuICAgICAgICB0aGlzLnF1aWxsLmNsaXBib2FyZC5kYW5nZXJvdXNseVBhc3RlSFRNTChodG1sdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRpbmdFZGl0b3IgPSBmYWxzZTtcclxuICAgICAgdGhpcy52YWx1ZSA9IGh0bWx2YWx1ZTtcclxuXHJcbiAgICAgIGlmIChyYXd2YWx1ZSA9PSBcIlxcblwiIHx8IHRoaXMudmFsdWUgPT0gXCJcXG5cIikge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSAnJztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGluZ0VkaXRvciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3V0cHV0SHRtbC5lbWl0KHRoaXMucXVpbGwuZ2V0U2VtYW50aWNIVE1MKCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RWRpdG9yU2l6ZSgpOiB2b2lkIHtcclxuICAgIGxldCBlZGl0b3JGaWVsZEhlaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrdi1lZGl0b3ItdG9vbGJhcicpPy5vZmZzZXRIZWlnaHQ7XHJcbiAgICBpZiAoZWRpdG9yRmllbGRIZWlnaHQpIHtcclxuICAgICAgdGhpcy5lZGl0b3JUb29sYmFySGVpZ2h0LnNldChgJHtlZGl0b3JGaWVsZEhlaWdodH1weGApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb3BlblJlbGF0b3JpbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzTG9hZGluZ1BkZigpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaHRtbENvbnRlbnQgPSB0aGlzLnF1aWxsLmdldFNlbWFudGljSFRNTCgpO1xyXG4gICAgY29uc3QgcmVsYXRvcmlvID0gdGhpcy5yZWxhdG9yaW8oKTtcclxuICAgIC8vIGNvbnN0IHRpcG9WaXN1YWxpemFjYW8gPSB0aGlzLnRpcG9WaXN1YWxpemFjYW8oKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnBkZlNlcnZpY2Uub3BlblJlbGF0b3JpbyhodG1sQ29udGVudCwgcmVsYXRvcmlvLCAndmFsb3InKTtcclxuICB9XHJcblxyXG4gIC8vIE3DqXRvZG9zIHBhcmEgc2lzdGVtYSBkZSBtZW7Dp8O1ZXNcclxuICBoYW5kbGVNZW50aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbGF0b3JpbygpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tZW50aW9uU2VydmljZS5oYW5kbGVNZW50aW9uKHRoaXMucXVpbGwsIHRoaXMucmVsYXRvcmlvKCkhLnZhcmlhdmVpcyk7XHJcbiAgICB0aGlzLmZpbHRlcmVkVmFyaWFibGVzLnNldChyZXN1bHQuZmlsdGVyZWRWYXJpYWJsZXMpO1xyXG5cclxuICAgIGlmIChyZXN1bHQuc2hvdWxkU2hvd1BhbmVsICYmIHJlc3VsdC5tZW50aW9uQm91bmRzKSB7XHJcbiAgICAgIHRoaXMuc2hvd1ZhcmlhYmxlc1BhbmVsKHJlc3VsdC5tZW50aW9uQm91bmRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xvc2VWYXJpYWJsZXNQYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93VmFyaWFibGVzUGFuZWwoYm91bmRzOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgY29uc3QgYW5jaG9yRWwgPSB0aGlzLm1lbnRpb25BbmNob3IubmF0aXZlRWxlbWVudDtcclxuICAgIGFuY2hvckVsLnN0eWxlLnRvcCA9IGAke2JvdW5kcy50b3B9cHhgO1xyXG4gICAgYW5jaG9yRWwuc3R5bGUubGVmdCA9IGAke2JvdW5kcy5sZWZ0fXB4YDtcclxuICAgIHRoaXMub3BWYXJpYWJsZXMuc2hvdyhudWxsLCBhbmNob3JFbCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RWYXJpYWJsZUZyb21QYW5lbCh2YXJpYWJsZTogS3ZFZGl0b3JWYXJpYXZlbCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW50aW9uU2VydmljZS5pbnNlcnRWYXJpYWJsZSh0aGlzLnF1aWxsLCB2YXJpYWJsZSk7XHJcbiAgICB0aGlzLmNsb3NlVmFyaWFibGVzUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlVmFyaWFibGVzUGFuZWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vcFZhcmlhYmxlcykge1xyXG4gICAgICB0aGlzLm9wVmFyaWFibGVzLmhpZGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMubWVudGlvblNlcnZpY2UuY2xvc2VNZW50aW9uKCk7XHJcbiAgfVxyXG5cclxuICBzaG93SW5zdHJ1Y29lcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKEt2SW5zdHJ1Y29lc1JlcG9ydENvbXBvbmVudCwge1xyXG4gICAgICBoZWFkZXI6ICdJbnN0cnXDp8O1ZXMnLFxyXG4gICAgICB3aWR0aDogJzQwJScsXHJcbiAgICAgIGhlaWdodDogJzMwJScsXHJcbiAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICBjbG9zYWJsZTogdHJ1ZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLmluc3RydWNvZXNUZW1wbGF0ZSgpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJUZW1wbGF0ZSgpIHtcclxuICAgIC8vIExpbXBhIG8gdGVtcGxhdGUgZG8gZWRpdG9yXHJcbiAgICB0aGlzLmNsZWFyZWRUZW1wbGF0ZS5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLnNldFJlbGF0b3Jpb1BvcklkKDApO1xyXG4gICAgdGhpcy53cml0ZVZhbHVlKCcnKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gIGNsYXNzPVwia3YtZWRpdG9yLWNvbnRhaW5lciBoLWZ1bGwgdy1mdWxsIG1heC1oLWZ1bGwgZmxleCBmbGV4LWNvbHVtbiBvdmVyZmxvdy1oaWRkZW5cIlxyXG4+XHJcbiAgPGRpdlxyXG4gICAgI2VkaXRvclxyXG4gICAgaWQ9XCJrdi1lZGl0b3ItdG9vbGJhclwiXHJcbiAgICBbbmdDbGFzc109XCJ7ICdlcnJvci1ib3JkZXItdG9vbGJhcic6IGhhc0NvbnRyb2xFcnJvcigpIH1cIlxyXG4gICAgY2xhc3M9XCJ7eyBzaG93SGVhZGVyKCkgPyAnZmxleCcgOiAnaGlkZGVuJyB9fSBmbGV4LWNvbHVtbiBmbGV4LWluaXRpYWxcIlxyXG4gID5cclxuICAgIEBpZihyZWxhdG9yaW9zKCkubGVuZ3RoID4gMCkge1xyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHAtMiBib3JkZXItcm91bmQtbGcgYm9yZGVyLTEgYm9yZGVyLWdyYXktMjAwIGhvdmVyOnNoYWRvdy0xIGhvdmVyOmJnLWdyYXktMTAwIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tYWxsIHRyYW5zaXRpb24tZHVyYXRpb24tMzAwXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtbGcgdGV4dC1ncmVlbi02MDAgZm9udC1tZWRpdW1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBjb250cmFjdFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQteHMgdGV4dC1ncmF5LTYwMFwiPnt7XHJcbiAgICAgICAgICAgICFjbGVhcmVkVGVtcGxhdGUoKVxyXG4gICAgICAgICAgICAgID8gcmVsYXRvcmlvKCk/LmxhYmVsIHx8IGxhYmVsRW1wdHlEcm9wZG93bigpXHJcbiAgICAgICAgICAgICAgOiBsYWJlbEVtcHR5RHJvcGRvd24oKVxyXG4gICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdGV4dC1sZ1wiPlxyXG4gICAgICAgICAgICBrZXlib2FyZF9hcnJvd19kb3duXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZighY2xlYXJlZFRlbXBsYXRlKCkpIHtcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHAtMiBib3JkZXItcm91bmQtbGcgYm9yZGVyLTEgYm9yZGVyLWdyYXktMjAwIGhvdmVyOnNoYWRvdy0xIGhvdmVyOmJnLWdyYXktMTAwIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tYWxsIHRyYW5zaXRpb24tZHVyYXRpb24tMzAwXCJcclxuICAgICAgICAgIChjbGljayk9XCJjbGVhclRlbXBsYXRlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0ZXh0LWxnIHRleHQtb3JhbmdlLTYwMCBmb250LW1lZGl1bVwiXHJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCInTGltcGFyIFRlbXBsYXRlJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIGxheWVyc19jbGVhclxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBwLTIgYm9yZGVyLXJvdW5kLWxnIGJvcmRlci0xIGJvcmRlci1ncmF5LTIwMCBob3ZlcjpzaGFkb3ctMSBob3ZlcjpiZy1ncmF5LTEwMCBjdXJzb3ItcG9pbnRlciB0cmFuc2l0aW9uLWFsbCB0cmFuc2l0aW9uLWR1cmF0aW9uLTMwMFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2hvd0luc3RydWNvZXMoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtbGcgdGV4dC1ibHVlLTYwMCBmb250LW1lZGl1bVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIGluZm9cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXhzIHRleHQtZ3JheS02MDBcIj5JbnN0cnXDp8O1ZXM8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgQGlmKHByaW50QnV0dG9uKCkpIHtcclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgcC0yIGJvcmRlci1yb3VuZC1sZyBib3JkZXItMSBib3JkZXItZ3JheS0yMDAgaG92ZXI6c2hhZG93LTEgaG92ZXI6YmctZ3JheS0xMDAgY3Vyc29yLXBvaW50ZXIgdHJhbnNpdGlvbi1hbGwgdHJhbnNpdGlvbi1kdXJhdGlvbi0zMDBcIlxyXG4gICAgICAgIChjbGljayk9XCJvcGVuUmVsYXRvcmlvKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtbGcgZm9udC1tZWRpdW1cIj5cclxuICAgICAgICAgIHByaW50XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXhzIHRleHQtZ3JheS02MDBcIj5JbXByaW1pcjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxwLWRpdmlkZXIgY2xhc3M9XCJ3LWZ1bGxcIj48L3AtZGl2aWRlcj5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctZnVsbCBmbGV4LWluaXRpYWxcIlxyXG4gICAgPlxyXG4gICAgICBAaWYoaXNMb2FkaW5nKCkpIHtcclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyB3LWZ1bGxcIj5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMiB7e1xyXG4gICAgICAgICAgaXNMb2FkaW5nKCkgPyAnaGlkZGVuJyA6ICdmbGV4J1xyXG4gICAgICAgIH19IHctZnVsbFwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInFsLWZvcm1hdHMgYm9yZGVyLXJvdW5kLW1kXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwicWwtZm9udFwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicm9ib3RvXCI+Um9ib3RvPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhcmlhbFwiPkFyaWFsPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0aW1lcy1uZXctcm9tYW5cIj5UaW1lcyBOZXcgUm9tYW48L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbm9zcGFjZVwiPk1vbm9zcGFjZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJcIj5JbnRlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkPlNhbnMgU2VyaWY8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlcmlmXCI+U2VyaWY8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJxbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj5UaXR1bG88L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj5TdWJ0aXR1bG88L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZD5Ob3JtYWw8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicWwtZm9ybWF0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxzZWxlY3QgdGl0bGU9XCJTaXplXCIgY2xhc3M9XCJxbC1zaXplXCI+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE1cHhcIj4xNXB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwcHhcIj4yMHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjMwcHhcIj4zMHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjQwcHhcIj40MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwcHhcIj41MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjcwcHhcIj43MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjkwcHhcIj45MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHAtZGl2aWRlciBsYXlvdXQ9XCJ2ZXJ0aWNhbFwiPjwvcC1kaXZpZGVyPlxyXG5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInFsLWZvcm1hdHMgYm9yZGVyLXJvdW5kLW1kXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicWwtYm9sZFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLWl0YWxpY1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLXVuZGVybGluZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLXN0cmlrZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHAtZGl2aWRlciBsYXlvdXQ9XCJ2ZXJ0aWNhbFwiPjwvcC1kaXZpZGVyPlxyXG5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInFsLWZvcm1hdHMgYm9yZGVyLXJvdW5kLW1kXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwicWwtY29sb3JcIj48L3NlbGVjdD5cclxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJxbC1iYWNrZ3JvdW5kXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICBAaWYodHJ1ZSkge1xyXG4gICAgICAgIDwhLS0gPHAtZGl2aWRlciBsYXlvdXQ9XCJ2ZXJ0aWNhbFwiPjwvcC1kaXZpZGVyPlxyXG5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJxbC1mb3JtYXRzIGJvcmRlci1yb3VuZC1tZFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1oZWFkZXJcIiB2YWx1ZT1cIjFcIj48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicWwtaGVhZGVyXCIgdmFsdWU9XCIyXCI+PC9idXR0b24+XHJcbiAgICAgIDwvc3Bhbj4gLS0+XHJcblxyXG4gICAgICAgIDxwLWRpdmlkZXIgbGF5b3V0PVwidmVydGljYWxcIj48L3AtZGl2aWRlcj5cclxuXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxbC1mb3JtYXRzIGJvcmRlci1yb3VuZC1tZFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLWxpbmtcIj48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1pbWFnZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLXZpZGVvXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8cC1kaXZpZGVyIGxheW91dD1cInZlcnRpY2FsXCI+PC9wLWRpdmlkZXI+XHJcblxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicWwtZm9ybWF0cyBib3JkZXItcm91bmQtbWRcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1saXN0XCIgdmFsdWU9XCJvcmRlcmVkXCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicWwtbGlzdFwiIHZhbHVlPVwiYnVsbGV0XCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwicWwtYWxpZ25cIj48L3NlbGVjdD5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXZcclxuICAgIHN0eWxlPVwiaGVpZ2h0OiAzcHg7IGJvcmRlci10b3A6IG5vbmU7IGJvcmRlci1ib3R0b206IG5vbmVcIlxyXG4gICAgW3N0eWxlLmJvcmRlclJpZ2h0XT1cInNob3dIZWFkZXIoKSA/ICcxcHggc29saWQgI2U1ZTdlYicgOiAnbm9uZSdcIlxyXG4gICAgW3N0eWxlLmJvcmRlckxlZnRdPVwic2hvd0hlYWRlcigpID8gJzFweCBzb2xpZCAjZTVlN2ViJyA6ICdub25lJ1wiXHJcbiAgPlxyXG4gICAgQGlmKGlzTG9hZGluZ1BkZigpKSB7XHJcbiAgICA8cC1wcm9ncmVzc0JhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIFtzdHlsZV09XCJ7IGhlaWdodDogJzNweCcgfVwiIC8+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXZcclxuICAgIGlkPVwia3YtZWRpdG9yXCJcclxuICAgIGNsYXNzPVwib3ZlcmZsb3ctYXV0byB3LWZ1bGwgZmxleC0xIHNjcm9sbHN0eWxlIHctZnVsbFwiXHJcbiAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICdlcnJvci1ib3JkZXInOiBoYXNDb250cm9sRXJyb3IoKSxcclxuICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgb3BhY2l0eS02MCc6IGlzTG9hZGluZ1BkZigpXHJcbiAgICB9XCJcclxuICAgIFtzdHlsZS5ib3JkZXJUb3BdPVwic2hvd0hlYWRlcigpID8gJ25vbmUnIDogJzFweCBzb2xpZCAjZTVlN2ViJ1wiXHJcbiAgPjwvZGl2PlxyXG48L2Rpdj5cclxuPGt2LWVycm9yIFtoYXNFcnJvcl09XCJoYXNDb250cm9sRXJyb3IoKVwiPnt7IGVycm9NZXNzYWdlKCkgfX08L2t2LWVycm9yPlxyXG5cclxuPCEtLSA8bGluayBocmVmPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9xdWlsbEAyLjAuMi9kaXN0L3F1aWxsLnNub3cuY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIC8+IC0tPlxyXG48bGluayBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90b1wiIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxyXG48c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vcXVpbGxAMi4wLjIvZGlzdC9xdWlsbC5qc1wiPjwvc2NyaXB0PlxyXG48c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0va2F0ZXhAMC4xNi45L2Rpc3Qva2F0ZXgubWluLmpzXCI+PC9zY3JpcHQ+XHJcblxyXG48bGlua1xyXG4gIHJlbD1cInN0eWxlc2hlZXRcIlxyXG4gIGhyZWY9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3F1aWxsQDIuMC4yL2Rpc3QvcXVpbGwuYnViYmxlLmNzc1wiXHJcbi8+XHJcbjxsaW5rXHJcbiAgcmVsPVwic3R5bGVzaGVldFwiXHJcbiAgaHJlZj1cImh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS45LjAvc3R5bGVzL2F0b20tb25lLWRhcmsubWluLmNzc1wiXHJcbi8+XHJcbjxsaW5rXHJcbiAgcmVsPVwic3R5bGVzaGVldFwiXHJcbiAgaHJlZj1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0va2F0ZXhAMC4xNi45L2Rpc3Qva2F0ZXgubWluLmNzc1wiXHJcbi8+XHJcblxyXG48cC1vdmVybGF5UGFuZWwgI29wIHN0eWxlQ2xhc3M9XCJvdmVyZmxvdy1oaWRkZW5cIj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImdyaWQgbS0wIGdhcC0yIHAtMiBtYXgtdy0yMHJlbSBvdmVyZmxvdy15LWF1dG8gc2Nyb2xsc3R5bGVcIlxyXG4gICAgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxNnJlbVwiXHJcbiAgPlxyXG4gICAgQGZvcihpdGVtIG9mIHJlbGF0b3Jpb3MoKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiY29sLTEyIGN1cnNvci1wb2ludGVyIGhvdmVyOmJnLWdyYXktMTAwIHRyYW5zaXRpb24tY29sb3JzIHRyYW5zaXRpb24tZHVyYXRpb24tMjAwIGJvcmRlci1yb3VuZC1sZyBzaGFkb3ctMiBmbGV4IGZsZXgtY29sdW1uIGdhcC0yXCJcclxuICAgICAgKGNsaWNrKT1cInNldFJlbGF0b3JpbyhpdGVtKVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB3LWZ1bGxcIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxyXG5cclxuICAgICAgICA8a3YtdGFnc1xyXG4gICAgICAgICAgY2xhc3M9XCJ0cmFuc2l0aW9uLW9wYWNpdHkgdHJhbnNpdGlvbi1kdXJhdGlvbi0zMDAge3tcclxuICAgICAgICAgICAgaXRlbT8uaWQgPT0gaWRSZWxhdG9yaW9TZWxlY3RlZCgpID8gJ29wYWNpdHktMTAwJyA6ICdvcGFjaXR5LTAnXHJcbiAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICBbdGFnc109XCJbeyBsYWJlbDogJ1NlbGVjaW9uYWRvJywgc2V2ZXJpdHk6ICdwcmltYXJ5JyB9XVwiXHJcbiAgICAgICAgPjwva3YtdGFncz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyB0ZXh0LWdyYXktNTAwXCI+e3sgaXRlbS5kZXNjcmljYW8gfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9wLW92ZXJsYXlQYW5lbD5cclxuXHJcbjxkaXYgY2xhc3M9XCJrdi1lZGl0b3ItY29udGFpbmVyIGZsZXggZmxleC1jb2x1bW4gb3ZlcmZsb3ctaGlkZGVuIHJlbGF0aXZlXCI+XHJcbiAgPGRpdlxyXG4gICAgI21lbnRpb25BbmNob3JcclxuICAgIHN0eWxlPVwicG9zaXRpb246IGZpeGVkOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFweDsgb3BhY2l0eTogMFwiXHJcbiAgPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxwLW92ZXJsYXlQYW5lbFxyXG4gICNvcFZhcmlhYmxlc1xyXG4gIFthcHBlbmRUb109XCInYm9keSdcIlxyXG4gIChvbkhpZGUpPVwiY2xvc2VWYXJpYWJsZXNQYW5lbCgpXCJcclxuPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMSBwLTEgb3ZlcmZsb3cteS1hdXRvIHNjcm9sbC12aXJ0dWFsIGJvcmRlci1yb3VuZC1sZ1wiXHJcbiAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1MHB4OyBtaW4td2lkdGg6IDI1MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzXCJcclxuICA+XHJcbiAgICBAZm9yKHZhcmlhYmxlIG9mIGZpbHRlcmVkVmFyaWFibGVzKCk7IHRyYWNrIHZhcmlhYmxlLmlkKSB7XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwicC0yIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tY29sb3JzIHRyYW5zaXRpb24tZHVyYXRpb24tMjAwIGJvcmRlci1yb3VuZC1sZyB0ZXh0LXNtIHRleHQtd2hpdGUgb3B0aW9uLWRyb3Bkb3duXCJcclxuICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmlhYmxlRnJvbVBhbmVsKHZhcmlhYmxlKVwiXHJcbiAgICA+XHJcbiAgICAgIHt7IHZhcmlhYmxlLmRlc2NyaWNhbyB9fSAoXHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ncmF5LTQwMFwiPnt7IHZhcmlhYmxlLnZhbHVlIH19PC9zcGFuPiApXHJcbiAgICA8L2Rpdj5cclxuICAgIH0gQGVtcHR5IHtcclxuICAgIDxkaXYgY2xhc3M9XCJwLTIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+TmVuaHVtYSB2YXJpw6F2ZWwgZW5jb250cmFkYS48L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9wLW92ZXJsYXlQYW5lbD5cclxuIl19
426
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWlucHV0cy9rdi1lZGl0b3Iva3YtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWlucHV0cy9rdi1lZGl0b3Iva3YtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUdMLE1BQU0sRUFFTixNQUFNLEVBRU4sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUUvRyxPQUFPLEVBR0wsb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ25CLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBUXJCLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBMEI7SUFFL0QsWUFDRSxnQkFBa0MsRUFDMUIsU0FBdUI7UUFFL0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFGaEIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQWtCakMsc0JBQXNCO1FBQ2QsaUJBQVksR0FBRyxNQUFNLENBQUMsb0JB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VyxhQUdWLGtCQUFrQixtQkFBbUI7Z0hBbUN2QyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUdJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkE2Q21CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFDSSxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBjb21wdXRlZCxcclxuICBlZmZlY3QsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgaW5qZWN0LFxyXG4gIGlucHV0LFxyXG4gIElucHV0LFxyXG4gIG1vZGVsLFxyXG4gIE9uSW5pdCxcclxuICBvdXRwdXQsXHJcbiAgT3V0cHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBzaWduYWwsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFNlY3VyaXR5Q29udGV4dCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuaW1wb3J0IFF1aWxsIGZyb20gJ3F1aWxsJztcclxuaW1wb3J0IHsgT3ZlcmxheVBhbmVsIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuXHJcbmltcG9ydCB7IEJhc2VDb21wb25lbnRJbnB1dCB9IGZyb20gJy4uLy4uLy4uL2FwaS9iYXNlLWNvbXBvbmVudHMvYmFzZS1jb21wb25lbnQtaW5wdXQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQcm92aWRlcnMgfSBmcm9tICcuLi8uLi8uLi9hcGkvaGVscGVycy9jb21wb25lbnQtcHJvdmlkZXJzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwaS9zZXJ2aWNlcy9jb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEt2SW5zdHJ1Y29lc1JlcG9ydENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9rdi1pbnN0cnVjb2VzLXJlcG9ydC9rdi1pbnN0cnVjb2VzLXJlcG9ydC5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHtcclxuICBLdkVkaXRvclJlbGF0b3JpbyxcclxuICBLdkVkaXRvclZhcmlhdmVsLFxyXG4gIEt2RWRpdG9yUXVpbGxTZXJ2aWNlLFxyXG4gIEt2RWRpdG9yUmVsYXRvcmlvU2VydmljZSxcclxuICBLdkVkaXRvck1lbnRpb25TZXJ2aWNlLFxyXG4gIEt2RWRpdG9yUGRmU2VydmljZVxyXG59IGZyb20gJy4va3YtZWRpdG9yJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAna3YtZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4va3YtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9rdi1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IENvbXBvbmVudFByb3ZpZGVycyhLdkVkaXRvckNvbXBvbmVudCksXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdkVkaXRvckNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnRJbnB1dDxzdHJpbmc+IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb21wb25lbnRTZXJ2aWNlOiBDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplclxyXG4gICkge1xyXG4gICAgc3VwZXIoY29tcG9uZW50U2VydmljZSk7XHJcblxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgbGV0IHJlYWRvbmx5ID0gdGhpcy5yZWFkb25seSgpO1xyXG4gICAgICBpZiAodGhpcy5xdWlsbCkge1xyXG4gICAgICAgIHRoaXMucXVpbGwuZW5hYmxlKCFyZWFkb25seSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZVByZXZpZXdNb2RlKCkpIHtcclxuICAgICAgICB0aGlzLmF0dWFsaXphclByZXZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBJbmplw6fDo28gZGUgc2VydmnDp29zXHJcbiAgcHJpdmF0ZSBxdWlsbFNlcnZpY2UgPSBpbmplY3QoS3ZFZGl0b3JRdWlsbFNlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVsYXRvcmlvU2VydmljZSA9IGluamVjdChLdkVkaXRvclJlbGF0b3Jpb1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgbWVudGlvblNlcnZpY2UgPSBpbmplY3QoS3ZFZGl0b3JNZW50aW9uU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBwZGZTZXJ2aWNlID0gaW5qZWN0KEt2RWRpdG9yUGRmU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlID0gaW5qZWN0KERpYWxvZ1NlcnZpY2UpO1xyXG5cclxuICAvLyBQcm9wcmllZGFkZXMgZGUgY29uZmlndXJhw6fDo29cclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBFc3NhIHByb3ByaWVkYWRlIG7Do28gc2Vyw6EgbWFpcyB1dGlsaXphZGEgcG9yIGVzc2UgY29tcG9uZW50ZSBuYXMgcHLDs3hpbWFzIHZlcnPDtWVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNhbnZhSGVpZ3RoOiBzdHJpbmcgPSAnMzgwcHgnO1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50VHlwZTogJ2h0bWwnIHwgJ3RleHQnID0gJ2h0bWwnO1xyXG4gIEBJbnB1dCgpIGRlYnVnOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIEV2ZW50b3NcclxuICBAT3V0cHV0KCkgb25UZXh0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvdXRwdXRSYXc6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvdXRwdXRIdG1sOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gUHJvcHJpZWRhZGVzIGludGVybmFzXHJcbiAgcHJpdmF0ZSB1cGRhdGluZ0VkaXRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdFNlbGVjdGlvblJhbmdlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgZWRpdG9yUmVhZHlSZXNvbHZlciE6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBlZGl0b3JSZWFkeVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgdGhpcy5lZGl0b3JSZWFkeVJlc29sdmVyID0gcmVzb2x2ZTtcclxuICB9KTtcclxuXHJcbiAgLy8gSW5zdMOibmNpYSBkbyBRdWlsbFxyXG4gIHF1aWxsITogUXVpbGw7XHJcbiAgaHRtbERvRWRpdG9yID0gJyc7XHJcblxyXG4gIC8vIFNpZ25hbCBwYXJhIGVzcGVsaGFtZW50byBkbyBjb250ZcO6ZG8gZG8gZWRpdG9yXHJcbiAgaHRtbEVzcGVsaG8gPSBzaWduYWw8c3RyaW5nPignJyk7XHJcbiAgcHJldmlld0NvbnRlbnQgPSBzaWduYWw8U2FmZUh0bWw+KCcnKTtcclxuXHJcbiAgLy8gU2lnbmFscyBwYXJhIGNvbnRyb2xlIGRlIGVzdGFkb1xyXG4gIGluaXRMb2FkQ29tcGxldGUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGlzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcclxuICBlZGl0b3JUb29sYmFySGVpZ2h0ID0gc2lnbmFsPHN0cmluZz4oJzNyZW0nKTtcclxuICAvLyB0aXBvVmlzdWFsaXphY2FvID0gc2lnbmFsPCd2YWxvcicgfCAnZGVzY3JpY2FvJz4oJ2Rlc2NyaWNhbycpO1xyXG4gIGZpbHRlcmVkVmFyaWFibGVzID0gc2lnbmFsPEt2RWRpdG9yVmFyaWF2ZWxbXT4oW10pO1xyXG4gIGNsZWFyZWRUZW1wbGF0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8vSW5wdXQgcGFyYSBoYWJpbGl0YXIgcHJldmlld1xyXG4gIGVuYWJsZVByZXZpZXdNb2RlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICAvLyBJbnB1dHMgcGFyYSByZWxhdMOzcmlvc1xyXG4gIHJlbGF0b3Jpb3MgPSBpbnB1dDxLdkVkaXRvclJlbGF0b3Jpb1tdPihbXSk7XHJcbiAgaWRSZWxhdG9yaW9Jbml0aWFsID0gbW9kZWw8YW55PigwKTtcclxuICBwcmludEJ1dHRvbiA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xyXG4gIGxhYmVsRW1wdHlEcm9wZG93biA9IGlucHV0PHN0cmluZz4oJ1NlbGVjaW9uZSB1bSByZWxhdMOzcmlvJyk7XHJcbiAgaW5zdHJ1Y29lc1RlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICBzaG93SGVhZGVyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcblxyXG5cclxuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIHBhcmEgcmVsYXTDs3Jpb3NcclxuICBpZFJlbGF0b3Jpb1NlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZWxhdG9yaW9TZXJ2aWNlLmdldElkUmVsYXRvcmlvU2VsZWN0ZWQoKSk7XHJcbiAgcmVsYXRvcmlvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZWxhdG9yaW9TZXJ2aWNlLmdldFJlbGF0b3Jpb1NlbGVjdGVkKCkpO1xyXG4gIGlzTG9hZGluZ1BkZiA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGRmU2VydmljZS5nZXRJc0xvYWRpbmdQZGYoKSk7XHJcblxyXG4gIC8vIFZpZXdDaGlsZCBwYXJhIG92ZXJsYXkgcGFuZWxzXHJcbiAgQFZpZXdDaGlsZCgnb3BWYXJpYWJsZXMnKSBvcFZhcmlhYmxlcyE6IE92ZXJsYXlQYW5lbDtcclxuICBAVmlld0NoaWxkKCdtZW50aW9uQW5jaG9yJykgbWVudGlvbkFuY2hvciE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIG1lc3NhZ2VzID0gW3sgc2V2ZXJpdHk6ICdpbmZvJywgZGV0YWlsOiAnTWVzc2FnZSBDb250ZW50JyB9XTtcclxuXHJcbiAgLy8gTcOpdG9kb3MgcGFyYSBnZXJlbmNpYXIgcmVsYXTDs3Jpb3NcclxuICBzZXRSZWxhdG9yaW9Qb3JJZChpZDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCByZWxhdG9yaW8gPSB0aGlzLnJlbGF0b3Jpb1NlcnZpY2Uuc2V0UmVsYXRvcmlvUG9ySWQoaWQpO1xyXG4gICAgaWYgKHJlbGF0b3Jpbykge1xyXG4gICAgICB0aGlzLnNldFJlbGF0b3JpbyhyZWxhdG9yaW8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0UmVsYXRvcmlvKHJlbGF0b3JpbzogS3ZFZGl0b3JSZWxhdG9yaW8pOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJlZFRlbXBsYXRlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLnJlbGF0b3Jpb1NlcnZpY2Uuc2V0UmVsYXRvcmlvKHJlbGF0b3Jpbyk7XHJcbiAgICBjb25zdCBtb2RlbG8gPSByZWxhdG9yaW8ubW9kZWxvUmVsYXRvcmlvIHx8ICcnO1xyXG4gICAgY29uc3QgdmFyaWF2ZWlzID0gcmVsYXRvcmlvLnZhcmlhdmVpcyB8fCBbXTtcclxuXHJcbiAgICB0aGlzLmh0bWxEb0VkaXRvciA9IHRoaXMucmVsYXRvcmlvU2VydmljZS5yZW5kZXJDb250cmF0byhtb2RlbG8sIHZhcmlhdmVpcyk7XHJcbiAgICB0aGlzLnVwZGF0aW5nRWRpdG9yID0gdHJ1ZTtcclxuICAgIHRoaXMuZXNjcmV2YVZhbG9yKHRoaXMuaHRtbERvRWRpdG9yKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAvLyBJbmljaWFsaXphIG9zIHJlbGF0w7NyaW9zIG5vIHNlcnZpw6dvXHJcbiAgICB0aGlzLnJlbGF0b3Jpb1NlcnZpY2Uuc2V0UmVsYXRvcmlvcyh0aGlzLnJlbGF0b3Jpb3MoKSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnF1aWxsKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgfSwgMTAwMCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaWRSZWxhdG9yaW9Jbml0aWFsKCkpIHtcclxuICAgICAgdGhpcy5jbGVhcmVkVGVtcGxhdGUuc2V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRSZWxhdG9yaW9Qb3JJZCh0aGlzLmlkUmVsYXRvcmlvSW5pdGlhbCgpKTtcclxuICAgIH0gZWxzZSB0aGlzLmNsZWFyZWRUZW1wbGF0ZS5zZXQodHJ1ZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZVByZXZpZXdNb2RlKCkpIHtcclxuICAgICAgICB0aGlzLmF0dWFsaXphclByZXZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTUwMCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVJbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5xdWlsbFNlcnZpY2UubG9hZENzcygpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplUXVpbGxFZGl0b3IoKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVRdWlsbEVkaXRvcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgdGhlbWU6ICdzbm93JyxcclxuICAgICAgbW9kdWxlczoge1xyXG4gICAgICAgIHRvb2xiYXI6ICcja3YtZWRpdG9yLXRvb2xiYXInLFxyXG4gICAgICB9LFxyXG4gICAgICBwbGFjZWhvbGRlcjogdGhpcy5sYWJlbCA/IHRoaXMubGFiZWwgOiAnJyxcclxuICAgICAgcmVhZE9ubHk6IHRoaXMucmVhZG9ubHkoKSxcclxuICAgICAgZGVidWc6IHRoaXMuZGVidWcsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucXVpbGwgPSB0aGlzLnF1aWxsU2VydmljZS5jcmVhdGVRdWlsbEluc3RhbmNlKCcja3YtZWRpdG9yJywgY29uZmlnKTtcclxuXHJcbiAgICB0aGlzLnNldHVwUXVpbGxFdmVudHMoKTtcclxuICAgIHRoaXMuZWRpdG9yUmVhZHlSZXNvbHZlcigpO1xyXG4gICAgdGhpcy5pbml0TG9hZENvbXBsZXRlLnNldCh0cnVlKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2w7XHJcbiAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wubWFya0FzUHJpc3RpbmUpIHtcclxuICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwUXVpbGxFdmVudHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnF1aWxsLm9uKCdzZWxlY3Rpb24tY2hhbmdlJywgKHJhbmdlLCBvbGRSYW5nZSwgc291cmNlKSA9PiB7XHJcbiAgICAgIGlmIChyYW5nZSkge1xyXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvblJhbmdlID0gcmFuZ2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcclxuICAgICAgICByYW5nZTogcmFuZ2UsXHJcbiAgICAgICAgb2xkUmFuZ2U6IG9sZFJhbmdlLFxyXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucXVpbGwub24oJ3RleHQtY2hhbmdlJywgKGRlbHRhLCBvbGRDb250ZW50cywgc291cmNlKSA9PiB7XHJcbiAgICAgIGlmIChzb3VyY2UgPT09ICd1c2VyJyAmJiBkZWx0YS5vcHMpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXJIdG1sQXV0b0NvbXBsZXRlVGFnKGRlbHRhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucmVsYXRvcmlvcygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmhhbmRsZU1lbnRpb24oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLnVwZGF0aW5nRWRpdG9yKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGluZ0VkaXRvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZXNjcmV2YVZhbG9yKHRoaXMucXVpbGwuZ2V0U2VtYW50aWNIVE1MKCksIHRoaXMucXVpbGwuZ2V0VGV4dCgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblRleHRDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICBkZWx0YTogZGVsdGEsXHJcbiAgICAgICAgICBvbGRDb250ZW50czogb2xkQ29udGVudHMsXHJcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vdXRwdXRSYXcuZW1pdCh0aGlzLnF1aWxsLmdldFRleHQoKSk7XHJcbiAgICAgICAgdGhpcy5vdXRwdXRIdG1sLmVtaXQodGhpcy5xdWlsbC5nZXRTZW1hbnRpY0hUTUwoKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVByZXZpZXdNb2RlKCkpIHtcclxuICAgICAgICAgIHRoaXMuYXR1YWxpemFyUHJldmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRpbmdFZGl0b3IgPSB0cnVlO1xyXG4gICAgdGhpcy5lc2NyZXZhVmFsb3IodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZXNjcmV2YVZhbG9yKGh0bWx2YWx1ZTogYW55LCByYXd2YWx1ZT86IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmluaXRMb2FkQ29tcGxldGUoKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmVkaXRvclJlYWR5UHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5xdWlsbCkge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGluZ0VkaXRvcikge1xyXG4gICAgICAgIHRoaXMucXVpbGwuY2xpcGJvYXJkLmRhbmdlcm91c2x5UGFzdGVIVE1MKGh0bWx2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGRhdGluZ0VkaXRvciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnZhbHVlID0gaHRtbHZhbHVlO1xyXG5cclxuICAgICAgaWYgKHJhd3ZhbHVlID09IFwiXFxuXCIgfHwgdGhpcy52YWx1ZSA9PSBcIlxcblwiKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5lbmFibGVQcmV2aWV3TW9kZSgpKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF0dWFsaXphclByZXZpZXcoKSwgMTAwKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGluZ0VkaXRvciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3V0cHV0SHRtbC5lbWl0KHRoaXMucXVpbGwuZ2V0U2VtYW50aWNIVE1MKCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RWRpdG9yU2l6ZSgpOiB2b2lkIHtcclxuICAgIGxldCBlZGl0b3JGaWVsZEhlaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrdi1lZGl0b3ItdG9vbGJhcicpPy5vZmZzZXRIZWlnaHQ7XHJcbiAgICBpZiAoZWRpdG9yRmllbGRIZWlnaHQpIHtcclxuICAgICAgdGhpcy5lZGl0b3JUb29sYmFySGVpZ2h0LnNldChgJHtlZGl0b3JGaWVsZEhlaWdodH1weGApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb3BlblJlbGF0b3JpbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzTG9hZGluZ1BkZigpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaHRtbENvbnRlbnQgPSB0aGlzLnF1aWxsLmdldFNlbWFudGljSFRNTCgpO1xyXG4gICAgY29uc3QgcmVsYXRvcmlvID0gdGhpcy5yZWxhdG9yaW8oKTtcclxuICAgIC8vIGNvbnN0IHRpcG9WaXN1YWxpemFjYW8gPSB0aGlzLnRpcG9WaXN1YWxpemFjYW8oKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnBkZlNlcnZpY2Uub3BlblJlbGF0b3JpbyhodG1sQ29udGVudCwgcmVsYXRvcmlvLCAndmFsb3InKTtcclxuICB9XHJcblxyXG4gIC8vIE3DqXRvZG9zIHBhcmEgc2lzdGVtYSBkZSBtZW7Dp8O1ZXNcclxuICBoYW5kbGVNZW50aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbGF0b3JpbygpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tZW50aW9uU2VydmljZS5oYW5kbGVNZW50aW9uKHRoaXMucXVpbGwsIHRoaXMucmVsYXRvcmlvKCkhLnZhcmlhdmVpcyk7XHJcbiAgICB0aGlzLmZpbHRlcmVkVmFyaWFibGVzLnNldChyZXN1bHQuZmlsdGVyZWRWYXJpYWJsZXMpO1xyXG5cclxuICAgIGlmIChyZXN1bHQuc2hvdWxkU2hvd1BhbmVsICYmIHJlc3VsdC5tZW50aW9uQm91bmRzKSB7XHJcbiAgICAgIHRoaXMuc2hvd1ZhcmlhYmxlc1BhbmVsKHJlc3VsdC5tZW50aW9uQm91bmRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xvc2VWYXJpYWJsZXNQYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93VmFyaWFibGVzUGFuZWwoYm91bmRzOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgY29uc3QgYW5jaG9yRWwgPSB0aGlzLm1lbnRpb25BbmNob3IubmF0aXZlRWxlbWVudDtcclxuICAgIGFuY2hvckVsLnN0eWxlLnRvcCA9IGAke2JvdW5kcy50b3B9cHhgO1xyXG4gICAgYW5jaG9yRWwuc3R5bGUubGVmdCA9IGAke2JvdW5kcy5sZWZ0fXB4YDtcclxuICAgIHRoaXMub3BWYXJpYWJsZXMuc2hvdyhudWxsLCBhbmNob3JFbCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RWYXJpYWJsZUZyb21QYW5lbCh2YXJpYWJsZTogS3ZFZGl0b3JWYXJpYXZlbCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW50aW9uU2VydmljZS5pbnNlcnRWYXJpYWJsZSh0aGlzLnF1aWxsLCB2YXJpYWJsZSk7XHJcbiAgICB0aGlzLmNsb3NlVmFyaWFibGVzUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlVmFyaWFibGVzUGFuZWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vcFZhcmlhYmxlcykge1xyXG4gICAgICB0aGlzLm9wVmFyaWFibGVzLmhpZGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMubWVudGlvblNlcnZpY2UuY2xvc2VNZW50aW9uKCk7XHJcbiAgfVxyXG5cclxuICBzaG93SW5zdHJ1Y29lcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKEt2SW5zdHJ1Y29lc1JlcG9ydENvbXBvbmVudCwge1xyXG4gICAgICBoZWFkZXI6ICdJbnN0cnXDp8O1ZXMnLFxyXG4gICAgICB3aWR0aDogJzQwJScsXHJcbiAgICAgIGhlaWdodDogJzMwJScsXHJcbiAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICBjbG9zYWJsZTogdHJ1ZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLmluc3RydWNvZXNUZW1wbGF0ZSgpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJUZW1wbGF0ZSgpIHtcclxuICAgIC8vIExpbXBhIG8gdGVtcGxhdGUgZG8gZWRpdG9yXHJcbiAgICB0aGlzLmNsZWFyZWRUZW1wbGF0ZS5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLnNldFJlbGF0b3Jpb1BvcklkKDApO1xyXG4gICAgdGhpcy53cml0ZVZhbHVlKCcnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXR1YWxpemFyUHJldmlldygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5xdWlsbCkgcmV0dXJuO1xyXG5cclxuICAgIGxldCBjb250ZXVkb0h0bWwgPSB0aGlzLnF1aWxsLnJvb3QuaW5uZXJIVE1MO1xyXG5cclxuICAgIGNvbnRldWRvSHRtbCA9IHRoaXMuZGVjb2RpZmljYXJFbnRpZGFkZXNIdG1sKGNvbnRldWRvSHRtbCk7XHJcbiAgICBcclxuICAgIHRoaXMuaHRtbEVzcGVsaG8uc2V0KGNvbnRldWRvSHRtbCk7XHJcblxyXG4gICAgY29uc3QgY29udGV1ZG9Qcm9jZXNzYWRvID0gdGhpcy5wcm9jZXNzYXJDb250ZXVkb1ByZXZpZXcoY29udGV1ZG9IdG1sKTtcclxuICAgIHRoaXMucHJldmlld0NvbnRlbnQuc2V0KGNvbnRldWRvUHJvY2Vzc2Fkbyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlY29kaWZpY2FyRW50aWRhZGVzSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xyXG4gICAgdGV4dGFyZWEuaW5uZXJIVE1MID0gdGV4dDtcclxuICAgIHJldHVybiB0ZXh0YXJlYS52YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJhckh0bWxBdXRvQ29tcGxldGVUYWcoZGVsdGE6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCFkZWx0YS5vcHMgfHwgZGVsdGEub3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHVsdGltb09wID0gZGVsdGEub3BzW2RlbHRhLm9wcy5sZW5ndGggLSAxXTtcclxuICAgIGlmICh1bHRpbW9PcC5pbnNlcnQgJiYgdHlwZW9mIHVsdGltb09wLmluc2VydCA9PT0gJ3N0cmluZycgJiYgdWx0aW1vT3AuaW5zZXJ0ID09PSAnPicpIHtcclxuICAgICAgY29uc3QgdGV4dG9BdHVhbCA9IHRoaXMucXVpbGwuZ2V0VGV4dCgpO1xyXG4gICAgICBjb25zdCBwb3NpY2FvQ3Vyc29yID0gdGhpcy5xdWlsbC5nZXRTZWxlY3Rpb24oKT8uaW5kZXggfHwgMDtcclxuXHJcbiAgICAgIGNvbnN0IHRleHRvQW50ZXNDdXJzb3IgPSB0ZXh0b0F0dWFsLnN1YnN0cmluZygwLCBwb3NpY2FvQ3Vyc29yKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlZ2V4VGFnQWJlcnRhID0gLzwoXFx3KykoPzpcXHMrW14+XSopPyg/PCFcXC8pXFw+JC87XHJcbiAgICAgIGNvbnN0IHZlcmlmaWNhclRhZyA9IHRleHRvQW50ZXNDdXJzb3IubWF0Y2gocmVnZXhUYWdBYmVydGEpO1xyXG5cclxuICAgICAgaWYgKHZlcmlmaWNhclRhZykge1xyXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSB2ZXJpZmljYXJUYWdbMV07XHJcblxyXG4gICAgICAgIGNvbnN0IHRhZ3NJbmxpbmUgPSBbJ2ltZycsICdicicsICdocicsICdpbnB1dCcsICdtZXRhJywgJ2xpbmsnLCAnYXJlYScsICdiYXNlJywgJ2NvbCcsICdlbWJlZCcsICdzb3VyY2UnLCAndHJhY2snLCAnd2JyJ107XHJcblxyXG4gICAgICAgIGlmICghdGFnc0lubGluZS5pbmNsdWRlcyh0YWdOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICBjb25zdCB0ZXh0b0RlcG9pc0N1cnNvciA9IHRleHRvQXR1YWwuc3Vic3RyaW5nKHBvc2ljYW9DdXJzb3IpO1xyXG4gICAgICAgICAgY29uc3QgZmVjaGFyVGFnUmVnZXggPSBuZXcgUmVnRXhwKGBePFxcLyR7dGFnTmFtZX0+YCwgJ2knKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWZlY2hhclRhZ1JlZ2V4LnRlc3QodGV4dG9EZXBvaXNDdXJzb3IpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmdFZGl0b3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnF1aWxsLmluc2VydFRleHQocG9zaWNhb0N1cnNvciwgYDwvJHt0YWdOYW1lfT5gLCAndXNlcicpO1xyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24ocG9zaWNhb0N1cnNvciwgMCk7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGluZ0VkaXRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJvY2Vzc2FyQ29udGV1ZG9QcmV2aWV3KGNvbnRlbnQ6IHN0cmluZyk6IFNhZmVIdG1sIHtcclxuICAgIGlmICghY29udGVudCB8fCBjb250ZW50ID09PSAnXFxuJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoJzxwIGNsYXNzPVwidGV4dC1ncmF5LTQwMCB0ZXh0LXNtXCI+TyBjb250ZcO6ZG8gYXBhcmVjZXLDoSBhcXVpLi4uPC9wPicpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0eWxlUmVnZXggPSAvPHN0eWxlW14+XSo+KFtcXHNcXFNdKj8pPFxcL3N0eWxlPi9naTtcclxuICAgIGNvbnN0IHN0eWxlczogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCBjb250ZXVkb1Byb2Nlc3NhZG8gPSBjb250ZW50O1xyXG5cclxuICAgIGxldCBtYXRjaDtcclxuICAgIHdoaWxlICgobWF0Y2ggPSBzdHlsZVJlZ2V4LmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7XHJcbiAgICAgIHN0eWxlcy5wdXNoKG1hdGNoWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICBjb250ZXVkb1Byb2Nlc3NhZG8gPSB0aGlzLnByb2Nlc3NhclZhcmlhdmVpc0NvbUh0bWwoY29udGV1ZG9Qcm9jZXNzYWRvKTtcclxuICAgIGNvbnRldWRvUHJvY2Vzc2FkbyA9IHRoaXMubWFudGVyUXVlYnJhc0xpbmhhSHRtbChjb250ZXVkb1Byb2Nlc3NhZG8pO1xyXG5cclxuICAgIGxldCBjb250ZXVkb0ZpbmFsID0gJzxkaXYgY2xhc3M9XCJrdi1lZGl0b3ItcHJldmlldy13cmFwcGVyXCI+JztcclxuXHJcbiAgICBpZiAoc3R5bGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29udGV1ZG9GaW5hbCArPSAnPHN0eWxlPicgKyBzdHlsZXMuam9pbignXFxuJykgKyAnPC9zdHlsZT4nO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRldWRvRmluYWwgKz0gY29udGV1ZG9Qcm9jZXNzYWRvO1xyXG4gICAgY29udGV1ZG9GaW5hbCArPSAnPC9kaXY+JztcclxuXHJcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoY29udGV1ZG9GaW5hbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbnRlclF1ZWJyYXNMaW5oYUh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBodG1sO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0h0bWxTdHJpbmcoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghc3RyIHx8IHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICBcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBzdHIudHJpbSgpO1xyXG4gICAgXHJcbiAgICBpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aCgnPCcpIHx8ICF0cmltbWVkLmVuZHNXaXRoKCc+JykpIHJldHVybiBmYWxzZTtcclxuICAgIFxyXG4gICAgY29uc3QgaHRtbFRhZ1JlZ2V4ID0gLzxcXC8/W2Etel1bXFxzXFxTXSo/Pi9pO1xyXG4gICAgY29uc3QgaGFzT3BlbmluZ1RhZyA9IC88W2Etel1bXFxzXFxTXSo/Pi9pLnRlc3QodHJpbW1lZCk7XHJcbiAgICBjb25zdCBoYXNDbG9zaW5nVGFnID0gLzxcXC9bYS16XVtcXHNcXFNdKj8+L2kudGVzdCh0cmltbWVkKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGh0bWxUYWdSZWdleC50ZXN0KHRyaW1tZWQpICYmIChoYXNPcGVuaW5nVGFnIHx8IGhhc0Nsb3NpbmdUYWcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcm9jZXNzYXJWYXJpYXZlaXNDb21IdG1sKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMucmVsYXRvcmlvKCkgfHwgIXRoaXMucmVsYXRvcmlvKCkhLnZhcmlhdmVpcykge1xyXG4gICAgICByZXR1cm4gY29udGVudDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29udGV1ZG9Qcm9jZXNzYWRvID0gY29udGVudDtcclxuICAgIGNvbnN0IHZhcmlhdmVpcyA9IHRoaXMucmVsYXRvcmlvKCkhLnZhcmlhdmVpcztcclxuXHJcbiAgICB2YXJpYXZlaXMuZm9yRWFjaCh2YXJpYXZlbCA9PiB7XHJcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVySWQgPSBgeyR7dmFyaWF2ZWwuaWR9fWA7XHJcbiAgICAgIFxyXG4gICAgICAvL3BhcmEgYnVzY2FyIG91dHJvcyBwYWRyw7VlcyBkZSBodG1sIHByYSB2YXJpw6F2ZWxcclxuICAgICAgLy9vYnM6IHBhZHJvbml6YXIgbyB1c28gZGUgbWVuw6fDtWVzIGNvbSBzcGFucyBkYXRhLW1lbnRpb25cclxuICAgICAgY29uc3QgcGF0dGVybnMgPSBbXHJcbiAgICAgICAgYDxzcGFuW14+XSpjbGFzcz1cIlteXCJdKm1lbnRpb25bXlwiXSpcIltePl0qPlxcXFxzKiR7dGhpcy5lc2NhcGVSZWdleCh2YXJpYXZlbC5kZXNjcmljYW8pfVxcXFxzKjwvc3Bhbj5gLFxyXG4gICAgICAgIGA8c3BhbltePl0qZGF0YS1tZW50aW9uW14+XSo+XFxcXHMqJHt0aGlzLmVzY2FwZVJlZ2V4KHZhcmlhdmVsLmRlc2NyaWNhbyl9XFxcXHMqPC9zcGFuPmAsXHJcbiAgICAgICAgYD5cXFxccyoke3RoaXMuZXNjYXBlUmVnZXgodmFyaWF2ZWwuZGVzY3JpY2FvKX1cXFxccyo8YCxcclxuICAgICAgICBgPFtePl0rPlxcXFxzKiR7dGhpcy5lc2NhcGVSZWdleCh2YXJpYXZlbC5kZXNjcmljYW8pfVxcXFxzKjwvW14+XSs+YFxyXG4gICAgICBdO1xyXG4gICAgICBcclxuICAgICAgaWYgKGNvbnRldWRvUHJvY2Vzc2Fkby5pbmNsdWRlcyhwbGFjZWhvbGRlcklkKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSHRtbFN0cmluZyh2YXJpYXZlbC52YWx1ZSkpIHtcclxuICAgICAgICAgIGNvbnRldWRvUHJvY2Vzc2FkbyA9IGNvbnRldWRvUHJvY2Vzc2Fkby5zcGxpdChwbGFjZWhvbGRlcklkKS5qb2luKHZhcmlhdmVsLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGxldCBzdWJzdGl0dWlkbyA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcclxuICAgICAgICBjb25zdCByZWdleE1lbnRpb24gPSBuZXcgUmVnRXhwKHBhdHRlcm4sICdnaScpO1xyXG4gICAgICAgIGlmIChyZWdleE1lbnRpb24udGVzdChjb250ZXVkb1Byb2Nlc3NhZG8pKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc0h0bWxTdHJpbmcodmFyaWF2ZWwudmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcGF0dGVybi5pbmNsdWRlcygnPicpICYmIHBhdHRlcm4uaW5jbHVkZXMoJzwnKSBcclxuICAgICAgICAgICAgICA/IHZhcmlhdmVsLnZhbHVlIFxyXG4gICAgICAgICAgICAgIDogYD4ke3ZhcmlhdmVsLnZhbHVlfTxgO1xyXG4gICAgICAgICAgICBjb250ZXVkb1Byb2Nlc3NhZG8gPSBjb250ZXVkb1Byb2Nlc3NhZG8ucmVwbGFjZShyZWdleE1lbnRpb24sIFxyXG4gICAgICAgICAgICAgIHBhdHRlcm4uc3RhcnRzV2l0aCgnPicpID8gYD4ke3ZhcmlhdmVsLnZhbHVlfTxgIDogdmFyaWF2ZWwudmFsdWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRldWRvUHJvY2Vzc2FkbyA9IGNvbnRldWRvUHJvY2Vzc2Fkby5yZXBsYWNlKHJlZ2V4TWVudGlvbiwgXHJcbiAgICAgICAgICAgICAgcGF0dGVybi5zdGFydHNXaXRoKCc+JykgPyBgPiR7dmFyaWF2ZWwudmFsdWV9PGAgOiB2YXJpYXZlbC52YWx1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc3Vic3RpdHVpZG8gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBpZiAoIXN1YnN0aXR1aWRvICYmIGNvbnRldWRvUHJvY2Vzc2Fkby5pbmNsdWRlcyh2YXJpYXZlbC5kZXNjcmljYW8pKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNIdG1sU3RyaW5nKHZhcmlhdmVsLnZhbHVlKSkge1xyXG4gICAgICAgICAgY29udGV1ZG9Qcm9jZXNzYWRvID0gY29udGV1ZG9Qcm9jZXNzYWRvLnNwbGl0KHZhcmlhdmVsLmRlc2NyaWNhbykuam9pbih2YXJpYXZlbC52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29udGV1ZG9Qcm9jZXNzYWRvO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVSZWdleChzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0UHJldmlld0NvbnRlbnQoKTogU2FmZUh0bWwge1xyXG4gICAgcmV0dXJuIHRoaXMucHJldmlld0NvbnRlbnQoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gIGNsYXNzPVwia3YtZWRpdG9yLWNvbnRhaW5lciBoLWZ1bGwgdy1mdWxsIG1heC1oLWZ1bGwgZmxleCBmbGV4LWNvbHVtbiBvdmVyZmxvdy1oaWRkZW5cIlxyXG4+XHJcbiAgPGRpdlxyXG4gICAgI2VkaXRvclxyXG4gICAgaWQ9XCJrdi1lZGl0b3ItdG9vbGJhclwiXHJcbiAgICBbbmdDbGFzc109XCJ7ICdlcnJvci1ib3JkZXItdG9vbGJhcic6IGhhc0NvbnRyb2xFcnJvcigpIH1cIlxyXG4gICAgY2xhc3M9XCJ7eyBzaG93SGVhZGVyKCkgPyAnZmxleCcgOiAnaGlkZGVuJyB9fSBmbGV4LWNvbHVtbiBmbGV4LWluaXRpYWxcIlxyXG4gID5cclxuICAgIEBpZihyZWxhdG9yaW9zKCkubGVuZ3RoID4gMCkge1xyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW4ge3tyZWFkb25seSgpICYmICdwb2ludGVyLWV2ZW50cy1ub25lIG9wYWNpdHktOTAnfX1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHAtMiBib3JkZXItcm91bmQtbGcgYm9yZGVyLTEgYm9yZGVyLWdyYXktMjAwIGhvdmVyOnNoYWRvdy0xIGhvdmVyOmJnLWdyYXktMTAwIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tYWxsIHRyYW5zaXRpb24tZHVyYXRpb24tMzAwXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtbGcgdGV4dC1ncmVlbi02MDAgZm9udC1tZWRpdW1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBjb250cmFjdFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQteHMgdGV4dC1ncmF5LTYwMFwiPnt7XHJcbiAgICAgICAgICAgICFjbGVhcmVkVGVtcGxhdGUoKVxyXG4gICAgICAgICAgICAgID8gcmVsYXRvcmlvKCk/LmxhYmVsIHx8IGxhYmVsRW1wdHlEcm9wZG93bigpXHJcbiAgICAgICAgICAgICAgOiBsYWJlbEVtcHR5RHJvcGRvd24oKVxyXG4gICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdGV4dC1sZ1wiPlxyXG4gICAgICAgICAgICBrZXlib2FyZF9hcnJvd19kb3duXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZighY2xlYXJlZFRlbXBsYXRlKCkpIHtcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHAtMiBib3JkZXItcm91bmQtbGcgYm9yZGVyLTEgYm9yZGVyLWdyYXktMjAwIGhvdmVyOnNoYWRvdy0xIGhvdmVyOmJnLWdyYXktMTAwIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tYWxsIHRyYW5zaXRpb24tZHVyYXRpb24tMzAwXCJcclxuICAgICAgICAgIChjbGljayk9XCJjbGVhclRlbXBsYXRlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0ZXh0LWxnIHRleHQtb3JhbmdlLTYwMCBmb250LW1lZGl1bVwiXHJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCInTGltcGFyIFRlbXBsYXRlJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIGxheWVyc19jbGVhclxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBwLTIgYm9yZGVyLXJvdW5kLWxnIGJvcmRlci0xIGJvcmRlci1ncmF5LTIwMCBob3ZlcjpzaGFkb3ctMSBob3ZlcjpiZy1ncmF5LTEwMCBjdXJzb3ItcG9pbnRlciB0cmFuc2l0aW9uLWFsbCB0cmFuc2l0aW9uLWR1cmF0aW9uLTMwMFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2hvd0luc3RydWNvZXMoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtbGcgdGV4dC1ibHVlLTYwMCBmb250LW1lZGl1bVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIGluZm9cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXhzIHRleHQtZ3JheS02MDBcIj5JbnN0cnXDp8O1ZXM8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBAaWYocHJpbnRCdXR0b24oKSkge1xyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBwLTIgYm9yZGVyLXJvdW5kLWxnIGJvcmRlci0xIGJvcmRlci1ncmF5LTIwMCBob3ZlcjpzaGFkb3ctMSBob3ZlcjpiZy1ncmF5LTEwMCBjdXJzb3ItcG9pbnRlciB0cmFuc2l0aW9uLWFsbCB0cmFuc2l0aW9uLWR1cmF0aW9uLTMwMFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5SZWxhdG9yaW8oKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdGV4dC1sZyBmb250LW1lZGl1bVwiPlxyXG4gICAgICAgICAgcHJpbnRcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQteHMgdGV4dC1ncmF5LTYwMFwiPkltcHJpbWlyPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfSAtLT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxwLWRpdmlkZXIgY2xhc3M9XCJ3LWZ1bGxcIj48L3AtZGl2aWRlcj5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctZnVsbCBmbGV4LWluaXRpYWxcIlxyXG4gICAgPlxyXG4gICAgICBAaWYoaXNMb2FkaW5nKCkpIHtcclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyB3LWZ1bGxcIj5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG5cclxuICAgICAgICA8cC1za2VsZXRvblxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctNnJlbVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcycmVtJyB9XCJcclxuICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMiB7e1xyXG4gICAgICAgICAgaXNMb2FkaW5nKCkgPyAnaGlkZGVuJyA6ICdmbGV4J1xyXG4gICAgICAgIH19IHctZnVsbFwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInFsLWZvcm1hdHMgYm9yZGVyLXJvdW5kLW1kXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwicWwtZm9udFwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicm9ib3RvXCI+Um9ib3RvPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhcmlhbFwiPkFyaWFsPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0aW1lcy1uZXctcm9tYW5cIj5UaW1lcyBOZXcgUm9tYW48L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbm9zcGFjZVwiPk1vbm9zcGFjZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW50ZXJcIj5JbnRlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkPlNhbnMgU2VyaWY8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlcmlmXCI+U2VyaWY8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJxbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj5UaXR1bG88L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj5TdWJ0aXR1bG88L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZD5Ob3JtYWw8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicWwtZm9ybWF0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxzZWxlY3QgdGl0bGU9XCJTaXplXCIgY2xhc3M9XCJxbC1zaXplXCI+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE1cHhcIj4xNXB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwcHhcIj4yMHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjMwcHhcIj4zMHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjQwcHhcIj40MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwcHhcIj41MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjcwcHhcIj43MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjkwcHhcIj45MHB4PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHAtZGl2aWRlciBsYXlvdXQ9XCJ2ZXJ0aWNhbFwiPjwvcC1kaXZpZGVyPlxyXG5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInFsLWZvcm1hdHMgYm9yZGVyLXJvdW5kLW1kXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicWwtYm9sZFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLWl0YWxpY1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLXVuZGVybGluZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLXN0cmlrZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHAtZGl2aWRlciBsYXlvdXQ9XCJ2ZXJ0aWNhbFwiPjwvcC1kaXZpZGVyPlxyXG5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInFsLWZvcm1hdHMgYm9yZGVyLXJvdW5kLW1kXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwicWwtY29sb3JcIj48L3NlbGVjdD5cclxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJxbC1iYWNrZ3JvdW5kXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICBAaWYodHJ1ZSkge1xyXG4gICAgICAgIDwhLS0gPHAtZGl2aWRlciBsYXlvdXQ9XCJ2ZXJ0aWNhbFwiPjwvcC1kaXZpZGVyPlxyXG5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJxbC1mb3JtYXRzIGJvcmRlci1yb3VuZC1tZFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1oZWFkZXJcIiB2YWx1ZT1cIjFcIj48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicWwtaGVhZGVyXCIgdmFsdWU9XCIyXCI+PC9idXR0b24+XHJcbiAgICAgIDwvc3Bhbj4gLS0+XHJcblxyXG4gICAgICAgIDxwLWRpdmlkZXIgbGF5b3V0PVwidmVydGljYWxcIj48L3AtZGl2aWRlcj5cclxuXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxbC1mb3JtYXRzIGJvcmRlci1yb3VuZC1tZFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLWxpbmtcIj48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1pbWFnZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLXZpZGVvXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8cC1kaXZpZGVyIGxheW91dD1cInZlcnRpY2FsXCI+PC9wLWRpdmlkZXI+XHJcblxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicWwtZm9ybWF0cyBib3JkZXItcm91bmQtbWRcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1saXN0XCIgdmFsdWU9XCJvcmRlcmVkXCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicWwtbGlzdFwiIHZhbHVlPVwiYnVsbGV0XCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwicWwtYWxpZ25cIj48L3NlbGVjdD5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXZcclxuICAgIHN0eWxlPVwiaGVpZ2h0OiAzcHg7IGJvcmRlci10b3A6IG5vbmU7IGJvcmRlci1ib3R0b206IG5vbmVcIlxyXG4gICAgW3N0eWxlLmJvcmRlclJpZ2h0XT1cInNob3dIZWFkZXIoKSA/ICcxcHggc29saWQgI2U1ZTdlYicgOiAnbm9uZSdcIlxyXG4gICAgW3N0eWxlLmJvcmRlckxlZnRdPVwic2hvd0hlYWRlcigpID8gJzFweCBzb2xpZCAjZTVlN2ViJyA6ICdub25lJ1wiXHJcbiAgPlxyXG4gICAgQGlmKGlzTG9hZGluZ1BkZigpKSB7XHJcbiAgICA8cC1wcm9ncmVzc0JhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIFtzdHlsZV09XCJ7IGhlaWdodDogJzNweCcgfVwiIC8+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGZsZXgtMSBnYXAtMCBvdmVyZmxvdy1hdXRvXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGlkPVwia3YtZWRpdG9yXCJcclxuICAgICAgY2xhc3M9XCJvdmVyZmxvdy1hdXRvIGZsZXgtMSBzY3JvbGxzdHlsZVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAnZXJyb3ItYm9yZGVyJzogaGFzQ29udHJvbEVycm9yKCksXHJcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgb3BhY2l0eS02MCc6IGlzTG9hZGluZ1BkZigpXHJcbiAgICAgIH1cIlxyXG4gICAgICBbc3R5bGUuYm9yZGVyVG9wXT1cInNob3dIZWFkZXIoKSA/ICdub25lJyA6ICcxcHggc29saWQgI2U1ZTdlYidcIlxyXG4gICAgICBbc3R5bGUuYm9yZGVyUmlnaHRdPVwiZW5hYmxlUHJldmlld01vZGUoKSA/ICdub25lJyA6ICcxcHggc29saWQgI2U1ZTdlYidcIlxyXG4gICAgPjwvZGl2PlxyXG5cclxuICAgIEBpZihlbmFibGVQcmV2aWV3TW9kZSgpKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBmbGV4LTFcIj5cclxuICAgICAgPGRpdiBcclxuICAgICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMlwiIFxyXG4gICAgICAgIFtzdHlsZS5ib3JkZXJSaWdodF09XCInMXB4IHNvbGlkICNlNWU3ZWInXCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyTGVmdF09XCInMXB4IHNvbGlkICNlNWU3ZWInXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0ZXh0LWJsdWUtNjAwIHRleHQtbGdcIj52aXNpYmlsaXR5PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktNzAwIHRleHQtc21cIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgXHJcbiAgICAgIDxkaXZcclxuICAgICAgICBpZD1cImt2LWVkaXRvci1wcmV2aWV3XCJcclxuICAgICAgICBjbGFzcz1cIm92ZXJmbG93LWF1dG8gZmxleC0xIHNjcm9sbHN0eWxlXCJcclxuICAgICAgICBbaW5uZXJIVE1MXT1cImdldFByZXZpZXdDb250ZW50XCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyXT1cIicxcHggc29saWQgI2U1ZTdlYidcIlxyXG4gICAgICA+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG48a3YtZXJyb3IgW2hhc0Vycm9yXT1cImhhc0NvbnRyb2xFcnJvcigpXCI+e3sgZXJyb01lc3NhZ2UoKSB9fTwva3YtZXJyb3I+XHJcblxyXG48IS0tIDxsaW5rIGhyZWY9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3F1aWxsQDIuMC4yL2Rpc3QvcXVpbGwuc25vdy5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgLz4gLS0+XHJcbjxsaW5rIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvXCIgcmVsPVwic3R5bGVzaGVldFwiIC8+XHJcbjxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9xdWlsbEAyLjAuMi9kaXN0L3F1aWxsLmpzXCI+PC9zY3JpcHQ+XHJcbjxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9rYXRleEAwLjE2LjkvZGlzdC9rYXRleC5taW4uanNcIj48L3NjcmlwdD5cclxuXHJcbjxsaW5rXHJcbiAgcmVsPVwic3R5bGVzaGVldFwiXHJcbiAgaHJlZj1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vcXVpbGxAMi4wLjIvZGlzdC9xdWlsbC5idWJibGUuY3NzXCJcclxuLz5cclxuPGxpbmtcclxuICByZWw9XCJzdHlsZXNoZWV0XCJcclxuICBocmVmPVwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjkuMC9zdHlsZXMvYXRvbS1vbmUtZGFyay5taW4uY3NzXCJcclxuLz5cclxuPGxpbmtcclxuICByZWw9XCJzdHlsZXNoZWV0XCJcclxuICBocmVmPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9rYXRleEAwLjE2LjkvZGlzdC9rYXRleC5taW4uY3NzXCJcclxuLz5cclxuXHJcbjxwLW92ZXJsYXlQYW5lbCAjb3Agc3R5bGVDbGFzcz1cIm92ZXJmbG93LWhpZGRlblwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiZ3JpZCBtLTAgZ2FwLTIgcC0yIG1heC13LTIwcmVtIG92ZXJmbG93LXktYXV0byBzY3JvbGxzdHlsZVwiXHJcbiAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDE2cmVtXCJcclxuICA+XHJcbiAgICBAZm9yKGl0ZW0gb2YgcmVsYXRvcmlvcygpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJjb2wtMTIgY3Vyc29yLXBvaW50ZXIgaG92ZXI6YmctZ3JheS0xMDAgdHJhbnNpdGlvbi1jb2xvcnMgdHJhbnNpdGlvbi1kdXJhdGlvbi0yMDAgYm9yZGVyLXJvdW5kLWxnIHNoYWRvdy0yIGZsZXggZmxleC1jb2x1bW4gZ2FwLTJcIlxyXG4gICAgICAoY2xpY2spPVwic2V0UmVsYXRvcmlvKGl0ZW0pXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHctZnVsbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XHJcblxyXG4gICAgICAgIDxrdi10YWdzXHJcbiAgICAgICAgICBjbGFzcz1cInRyYW5zaXRpb24tb3BhY2l0eSB0cmFuc2l0aW9uLWR1cmF0aW9uLTMwMCB7e1xyXG4gICAgICAgICAgICBpdGVtPy5pZCA9PSBpZFJlbGF0b3Jpb1NlbGVjdGVkKCkgPyAnb3BhY2l0eS0xMDAnIDogJ29wYWNpdHktMCdcclxuICAgICAgICAgIH19XCJcclxuICAgICAgICAgIFt0YWdzXT1cIlt7IGxhYmVsOiAnU2VsZWNpb25hZG8nLCBzZXZlcml0eTogJ3ByaW1hcnknIH1dXCJcclxuICAgICAgICA+PC9rdi10YWdzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtZ3JheS01MDBcIj57eyBpdGVtLmRlc2NyaWNhbyB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3Atb3ZlcmxheVBhbmVsPlxyXG5cclxuPGRpdiBjbGFzcz1cImt2LWVkaXRvci1jb250YWluZXIgZmxleCBmbGV4LWNvbHVtbiBvdmVyZmxvdy1oaWRkZW4gcmVsYXRpdmVcIj5cclxuICA8ZGl2XHJcbiAgICAjbWVudGlvbkFuY2hvclxyXG4gICAgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBvcGFjaXR5OiAwXCJcclxuICA+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHAtb3ZlcmxheVBhbmVsXHJcbiAgI29wVmFyaWFibGVzXHJcbiAgW2FwcGVuZFRvXT1cIidib2R5J1wiXHJcbiAgKG9uSGlkZSk9XCJjbG9zZVZhcmlhYmxlc1BhbmVsKClcIlxyXG4+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGdhcC0xIHAtMSBvdmVyZmxvdy15LWF1dG8gc2Nyb2xsLXZpcnR1YWwgYm9yZGVyLXJvdW5kLWxnXCJcclxuICAgIHN0eWxlPVwibWF4LWhlaWdodDogMjUwcHg7IG1pbi13aWR0aDogMjUwcHg7IGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzNcIlxyXG4gID5cclxuICAgIEBmb3IodmFyaWFibGUgb2YgZmlsdGVyZWRWYXJpYWJsZXMoKTsgdHJhY2sgdmFyaWFibGUuaWQpIHtcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJwLTIgY3Vyc29yLXBvaW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgdHJhbnNpdGlvbi1kdXJhdGlvbi0yMDAgYm9yZGVyLXJvdW5kLWxnIHRleHQtc20gdGV4dC13aGl0ZSBvcHRpb24tZHJvcGRvd25cIlxyXG4gICAgICAoY2xpY2spPVwic2VsZWN0VmFyaWFibGVGcm9tUGFuZWwodmFyaWFibGUpXCJcclxuICAgID5cclxuICAgICAge3sgdmFyaWFibGUuZGVzY3JpY2FvIH19IChcclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWdyYXktNDAwXCI+e3sgdmFyaWFibGUudmFsdWUgfX08L3NwYW4+IClcclxuICAgIDwvZGl2PlxyXG4gICAgfSBAZW1wdHkge1xyXG4gICAgPGRpdiBjbGFzcz1cInAtMiB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5OZW5odW1hIHZhcmnDoXZlbCBlbmNvbnRyYWRhLjwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3Atb3ZlcmxheVBhbmVsPlxyXG4iXX0=