@seniorsistemas/angular-components 19.5.5 → 19.6.0

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.
Files changed (98) hide show
  1. package/accordion/README.md +95 -59
  2. package/calendar-mask/lib/calendar-mask/calendar-mask.directive.d.ts +4 -0
  3. package/datepicker/README.md +175 -0
  4. package/datepicker/index.d.ts +5 -0
  5. package/datepicker/lib/datepicker/date.utils.d.ts +21 -0
  6. package/datepicker/lib/datepicker/datepicker.component.d.ts +254 -0
  7. package/datepicker/lib/datepicker/models/index.d.ts +16 -0
  8. package/datepicker/public-api.d.ts +2 -0
  9. package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +3 -1
  10. package/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.d.ts +5 -0
  11. package/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +119 -24
  12. package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +6 -0
  13. package/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.d.ts +6 -23
  14. package/dynamic-form/public-api.d.ts +1 -0
  15. package/editor/README.md +229 -0
  16. package/editor/index.d.ts +5 -0
  17. package/editor/lib/editor/editor.component.d.ts +127 -0
  18. package/editor/lib/editor/link-dialog/link-dialog.component.d.ts +18 -0
  19. package/editor/lib/editor/models/index.d.ts +12 -0
  20. package/editor/lib/editor/toolbar-button/editor-toolbar-button.component.d.ts +10 -0
  21. package/editor/public-api.d.ts +2 -0
  22. package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.directive.mjs +5 -1
  23. package/esm2022/datepicker/lib/datepicker/date.utils.mjs +182 -0
  24. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +1062 -0
  25. package/esm2022/datepicker/lib/datepicker/models/index.mjs +2 -0
  26. package/esm2022/datepicker/public-api.mjs +2 -0
  27. package/esm2022/datepicker/seniorsistemas-angular-components-datepicker.mjs +5 -0
  28. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +11 -5
  29. package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.mjs +2 -0
  30. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.mjs +1 -1
  31. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
  32. package/esm2022/dynamic-form/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +2 -2
  33. package/esm2022/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +23 -116
  34. package/esm2022/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +3 -3
  35. package/esm2022/dynamic-form/public-api.mjs +1 -1
  36. package/esm2022/editor/lib/editor/editor.component.mjs +375 -0
  37. package/esm2022/editor/lib/editor/link-dialog/link-dialog.component.mjs +48 -0
  38. package/esm2022/editor/lib/editor/models/index.mjs +3 -0
  39. package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +17 -0
  40. package/esm2022/editor/public-api.mjs +3 -0
  41. package/esm2022/editor/seniorsistemas-angular-components-editor.mjs +5 -0
  42. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.mjs +22 -12
  43. package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +5 -5
  44. package/esm2022/lib/locale/fallback.mjs +82 -3
  45. package/esm2022/optional-fields/editor/editor-field/editor-field.component.mjs +5 -6
  46. package/esm2022/optional-fields/editor/editor-field.mjs +1 -1
  47. package/esm2022/panel/lib/panel/panel.component.mjs +7 -3
  48. package/esm2022/select/lib/select/select.component.mjs +4 -8
  49. package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +5 -1
  50. package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs +4 -0
  51. package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs.map +1 -1
  52. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +1250 -0
  53. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -0
  54. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +49 -135
  55. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  56. package/fesm2022/seniorsistemas-angular-components-editor.mjs +437 -0
  57. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -0
  58. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +24 -15
  59. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  60. package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs +4 -5
  61. package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs.map +1 -1
  62. package/fesm2022/seniorsistemas-angular-components-panel.mjs +6 -2
  63. package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
  64. package/fesm2022/seniorsistemas-angular-components-select.mjs +3 -7
  65. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  66. package/fesm2022/seniorsistemas-angular-components-shared.mjs +4 -0
  67. package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
  68. package/fesm2022/seniorsistemas-angular-components.mjs +81 -2
  69. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  70. package/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.d.ts +6 -4
  71. package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +2 -2
  72. package/loading-state/README.md +57 -17
  73. package/optional-fields/editor/editor-field.d.ts +9 -6
  74. package/package.json +74 -8
  75. package/panel/README.md +12 -1
  76. package/panel/lib/panel/panel.component.d.ts +3 -1
  77. package/schematics/collection.json +4 -0
  78. package/schematics/migrations/migrate-p-datepicker/index.d.ts +2 -0
  79. package/schematics/migrations/migrate-p-datepicker/index.js +141 -0
  80. package/schematics/migrations/migrate-p-datepicker/index.js.map +1 -0
  81. package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +1 -0
  82. package/schematics/migrations/migrate-p-datepicker/index.test.js +392 -0
  83. package/schematics/migrations/migrate-p-datepicker/index.test.js.map +1 -0
  84. package/schematics/migrations.json +10 -0
  85. package/schematics/utils/ast-utils.d.ts +28 -0
  86. package/schematics/utils/ast-utils.js +116 -0
  87. package/schematics/utils/ast-utils.js.map +1 -0
  88. package/schematics/utils/ast-utils.test.d.ts +1 -0
  89. package/schematics/utils/ast-utils.test.js +138 -0
  90. package/schematics/utils/ast-utils.test.js.map +1 -0
  91. package/schematics/utils/workspace-utils.d.ts +6 -0
  92. package/schematics/utils/workspace-utils.js +37 -0
  93. package/schematics/utils/workspace-utils.js.map +1 -0
  94. package/schematics/utils/workspace-utils.test.d.ts +1 -0
  95. package/schematics/utils/workspace-utils.test.js +152 -0
  96. package/schematics/utils/workspace-utils.test.js.map +1 -0
  97. package/shared/lib/accessibility/datepicker-no-period-tab.directive.d.ts +4 -0
  98. package/stats-card/README.md +80 -45
@@ -0,0 +1,375 @@
1
+ import { NgClass, NgStyle } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, effect, forwardRef, inject, input, output, viewChild, } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
+ import { take } from 'rxjs/operators';
6
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
7
+ import { DialogService } from '@seniorsistemas/angular-components/dialog';
8
+ import { Editor } from '@tiptap/core';
9
+ import { Color } from '@tiptap/extension-color';
10
+ import Highlight from '@tiptap/extension-highlight';
11
+ import Image from '@tiptap/extension-image';
12
+ import Placeholder from '@tiptap/extension-placeholder';
13
+ import Subscript from '@tiptap/extension-subscript';
14
+ import Superscript from '@tiptap/extension-superscript';
15
+ import TextAlign from '@tiptap/extension-text-align';
16
+ import { TextStyle } from '@tiptap/extension-text-style';
17
+ import Underline from '@tiptap/extension-underline';
18
+ import StarterKit from '@tiptap/starter-kit';
19
+ import { LinkDialogComponent } from './link-dialog/link-dialog.component';
20
+ import { EditorToolbarButtonComponent } from './toolbar-button/editor-toolbar-button.component';
21
+ import * as i0 from "@angular/core";
22
+ import * as i1 from "@ngx-translate/core";
23
+ /**
24
+ * @description Componente de editor de texto rico (WYSIWYG) construído sobre o Tiptap/ProseMirror.
25
+ * Substitui o `p-editor` do PrimeNG sem dependência externa de licença comercial.
26
+ * Implementa {@link ControlValueAccessor} para integração com Angular Forms.
27
+ *
28
+ * @example
29
+ * ```html
30
+ * <s-editor
31
+ * formControlName="descricao"
32
+ * [readonly]="false"
33
+ * (textChange)="onTextChange($event)" />
34
+ * ```
35
+ */
36
+ export class EditorComponent {
37
+ cdr = inject(ChangeDetectorRef);
38
+ dialogService = inject(DialogService);
39
+ translateService = inject(TranslateService);
40
+ destroyRef = inject(DestroyRef);
41
+ /**
42
+ * @description Coloca o editor em modo somente leitura.
43
+ * @default false
44
+ */
45
+ readonly = input(false);
46
+ /**
47
+ * @description Lista de formatos habilitados na toolbar. Quando vazio, todos os formatos são exibidos.
48
+ */
49
+ formats = input();
50
+ /**
51
+ * @description Texto de dica exibido quando o editor está vazio.
52
+ */
53
+ placeholder = input();
54
+ /**
55
+ * @description Estilos inline aplicados ao container do editor.
56
+ */
57
+ style = input();
58
+ /**
59
+ * @description Classes CSS adicionais aplicadas ao container do editor.
60
+ */
61
+ styleClass = input();
62
+ /**
63
+ * @description Extensões Tiptap adicionais para estender o comportamento padrão do editor.
64
+ */
65
+ extensions = input([]);
66
+ /**
67
+ * @description Emitido quando o editor é inicializado e está pronto para uso.
68
+ */
69
+ editorInit = output();
70
+ /**
71
+ * @description Emitido sempre que o conteúdo do editor é alterado.
72
+ */
73
+ textChange = output();
74
+ /**
75
+ * @description Emitido quando a seleção de texto no editor muda.
76
+ */
77
+ selectionChange = output();
78
+ editorContainer = viewChild.required('editorContainer');
79
+ imageInput = viewChild.required('imageInput');
80
+ editor;
81
+ _formDisabled = false;
82
+ _currentPlaceholder = '';
83
+ activeStates = {
84
+ isBold: false,
85
+ isItalic: false,
86
+ isUnderline: false,
87
+ isStrike: false,
88
+ isBulletList: false,
89
+ isOrderedList: false,
90
+ isBlockquote: false,
91
+ isCode: false,
92
+ isSubscript: false,
93
+ isSuperscript: false,
94
+ isAlignLeft: false,
95
+ isAlignCenter: false,
96
+ isAlignRight: false,
97
+ currentHeading: 0,
98
+ currentColor: '#000000',
99
+ currentHighlight: 'transparent',
100
+ canUndo: false,
101
+ canRedo: false,
102
+ };
103
+ _value = '';
104
+ _onChange = () => { };
105
+ _onTouched = () => { };
106
+ constructor() {
107
+ effect(() => {
108
+ if (this.editor) {
109
+ this.editor.setEditable(!this.readonly() && !this._formDisabled);
110
+ this.cdr.markForCheck();
111
+ }
112
+ });
113
+ effect(() => {
114
+ this._currentPlaceholder = this.placeholder() ?? '';
115
+ this.editor?.view.dispatch(this.editor.state.tr);
116
+ });
117
+ }
118
+ ngAfterViewInit() {
119
+ this.initEditor();
120
+ }
121
+ ngOnDestroy() {
122
+ this.editor?.destroy();
123
+ }
124
+ writeValue(value) {
125
+ this._value = value ?? '';
126
+ if (this.editor) {
127
+ this.editor.chain().setMeta('addToHistory', false).setContent(this._value, { emitUpdate: false }).run();
128
+ this.cdr.markForCheck();
129
+ }
130
+ }
131
+ registerOnChange(fn) {
132
+ this._onChange = fn;
133
+ }
134
+ registerOnTouched(fn) {
135
+ this._onTouched = fn;
136
+ }
137
+ setDisabledState(isDisabled) {
138
+ this._formDisabled = isDisabled;
139
+ this.editor?.setEditable(!isDisabled && !this.readonly());
140
+ this.cdr.markForCheck();
141
+ }
142
+ isFormatAllowed(format) {
143
+ const formats = this.formats();
144
+ return !formats?.length || formats.includes(format);
145
+ }
146
+ hasAnyFormatBeforeUndoRedo() {
147
+ const formatsBeforeUndoRedo = [
148
+ 'header', 'bold', 'italic', 'underline', 'strike', 'subscript', 'superscript',
149
+ 'color', 'highlight', 'list', 'align', 'blockquote', 'code-block', 'link', 'image',
150
+ ];
151
+ return formatsBeforeUndoRedo.some(f => this.isFormatAllowed(f));
152
+ }
153
+ toggleBold() {
154
+ this.editor?.chain().focus().toggleBold().run();
155
+ }
156
+ toggleItalic() {
157
+ this.editor?.chain().focus().toggleItalic().run();
158
+ }
159
+ toggleUnderline() {
160
+ this.editor?.chain().focus().toggleUnderline().run();
161
+ }
162
+ toggleStrike() {
163
+ this.editor?.chain().focus().toggleStrike().run();
164
+ }
165
+ toggleBulletList() {
166
+ this.editor?.chain().focus().toggleBulletList().run();
167
+ }
168
+ toggleOrderedList() {
169
+ this.editor?.chain().focus().toggleOrderedList().run();
170
+ }
171
+ toggleBlockquote() {
172
+ this.editor?.chain().focus().toggleBlockquote().run();
173
+ }
174
+ toggleCode() {
175
+ this.editor?.chain().focus().toggleCode().run();
176
+ }
177
+ toggleSubscript() {
178
+ this.editor?.chain().focus().toggleSubscript().run();
179
+ }
180
+ toggleSuperscript() {
181
+ this.editor?.chain().focus().toggleSuperscript().run();
182
+ }
183
+ setTextAlign(align) {
184
+ this.editor?.chain().focus().setTextAlign(align).run();
185
+ }
186
+ setColor(color) {
187
+ this.editor?.chain().focus().setColor(color).run();
188
+ }
189
+ setHighlight(color) {
190
+ this.editor?.chain().focus().setHighlight({ color }).run();
191
+ }
192
+ clearFormatting() {
193
+ this.editor?.chain().focus().clearNodes().unsetAllMarks().run();
194
+ }
195
+ onHeadingChange(event) {
196
+ const level = parseInt(event.target.value);
197
+ if (isNaN(level) || level === 0) {
198
+ this.editor?.chain().focus().setParagraph().run();
199
+ }
200
+ else {
201
+ this.editor?.chain().focus().setHeading({ level }).run();
202
+ }
203
+ }
204
+ setLink() {
205
+ const existingUrl = this.editor?.getAttributes('link')['href'] ?? '';
206
+ const ref = this.dialogService.open(LinkDialogComponent, { size: 'sm' });
207
+ ref.componentInstance.initialUrl = existingUrl;
208
+ ref.closed
209
+ .pipe(take(1), takeUntilDestroyed(this.destroyRef))
210
+ .subscribe((url) => {
211
+ if (url === '') {
212
+ this.editor?.chain().focus().extendMarkRange('link').unsetLink().run();
213
+ }
214
+ else {
215
+ this.editor?.chain().focus().extendMarkRange('link').setLink({ href: url }).run();
216
+ }
217
+ });
218
+ }
219
+ setImage() {
220
+ this.imageInput().nativeElement.click();
221
+ }
222
+ onImageFileSelected(event) {
223
+ const input = event.target;
224
+ const file = input.files?.[0];
225
+ if (!file)
226
+ return;
227
+ const reader = new FileReader();
228
+ reader.onload = (e) => {
229
+ const src = e.target?.result;
230
+ this.editor?.chain().focus().setImage({ src }).run();
231
+ input.value = '';
232
+ this.cdr.markForCheck();
233
+ };
234
+ reader.readAsDataURL(file);
235
+ }
236
+ undo() {
237
+ this.editor?.chain().focus().undo().run();
238
+ }
239
+ redo() {
240
+ this.editor?.chain().focus().redo().run();
241
+ }
242
+ onToolbarKeydown(event) {
243
+ if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key))
244
+ return;
245
+ event.preventDefault();
246
+ const toolbar = event.currentTarget;
247
+ const focusable = this.getToolbarFocusable(toolbar);
248
+ if (!focusable.length)
249
+ return;
250
+ const currentIndex = focusable.findIndex(el => el === document.activeElement);
251
+ let nextIndex;
252
+ switch (event.key) {
253
+ case 'ArrowRight':
254
+ nextIndex = (currentIndex + 1) % focusable.length;
255
+ break;
256
+ case 'ArrowLeft':
257
+ nextIndex = (currentIndex - 1 + focusable.length) % focusable.length;
258
+ break;
259
+ case 'Home':
260
+ nextIndex = 0;
261
+ break;
262
+ default:
263
+ nextIndex = focusable.length - 1;
264
+ break;
265
+ }
266
+ focusable.forEach((el, i) => el.setAttribute('tabindex', i === nextIndex ? '0' : '-1'));
267
+ focusable[nextIndex].focus();
268
+ }
269
+ onToolbarFocusIn(event) {
270
+ const target = event.target;
271
+ const toolbar = event.currentTarget;
272
+ const focusable = this.getToolbarFocusable(toolbar);
273
+ if (focusable.includes(target)) {
274
+ focusable.forEach(el => el.setAttribute('tabindex', el === target ? '0' : '-1'));
275
+ }
276
+ }
277
+ getToolbarFocusable(toolbar) {
278
+ return Array.from(toolbar.querySelectorAll('button:not([disabled]), select, label[tabindex]'));
279
+ }
280
+ initEditor() {
281
+ this.editor = new Editor({
282
+ element: this.editorContainer().nativeElement,
283
+ extensions: [
284
+ StarterKit.configure({
285
+ link: { openOnClick: false },
286
+ underline: false,
287
+ }),
288
+ Underline,
289
+ Image,
290
+ TextAlign.configure({ types: ['heading', 'paragraph'] }),
291
+ TextStyle,
292
+ Color,
293
+ Highlight.configure({ multicolor: true }),
294
+ Placeholder.configure({ placeholder: () => this._currentPlaceholder }),
295
+ Subscript,
296
+ Superscript,
297
+ ...this.extensions(),
298
+ ],
299
+ content: this._value,
300
+ editable: !this.readonly(),
301
+ editorProps: {
302
+ attributes: {
303
+ role: 'textbox',
304
+ 'aria-multiline': 'true',
305
+ 'aria-label': this.translateService.instant('platform.angular_components.editor_content_area'),
306
+ },
307
+ },
308
+ onUpdate: ({ editor }) => {
309
+ const html = editor.getHTML();
310
+ const text = editor.getText();
311
+ this._value = html;
312
+ this._onChange(html);
313
+ this.textChange.emit({ htmlValue: html, textValue: text });
314
+ this.syncActiveStates();
315
+ this.cdr.markForCheck();
316
+ },
317
+ onBlur: () => {
318
+ this._onTouched();
319
+ },
320
+ onSelectionUpdate: ({ editor }) => {
321
+ this.syncActiveStates();
322
+ const { from, to, empty } = editor.state.selection;
323
+ this.selectionChange.emit({ from, to, empty });
324
+ this.cdr.markForCheck();
325
+ },
326
+ });
327
+ this.syncActiveStates();
328
+ this.cdr.markForCheck();
329
+ this.editorInit.emit(this.editor);
330
+ }
331
+ syncActiveStates() {
332
+ if (!this.editor)
333
+ return;
334
+ const e = this.editor;
335
+ this.activeStates = {
336
+ isBold: e.isActive('bold'),
337
+ isItalic: e.isActive('italic'),
338
+ isUnderline: e.isActive('underline'),
339
+ isStrike: e.isActive('strike'),
340
+ isBulletList: e.isActive('bulletList'),
341
+ isOrderedList: e.isActive('orderedList'),
342
+ isBlockquote: e.isActive('blockquote'),
343
+ isCode: e.isActive('code'),
344
+ isSubscript: e.isActive('subscript'),
345
+ isSuperscript: e.isActive('superscript'),
346
+ isAlignLeft: e.isActive({ textAlign: 'left' }),
347
+ isAlignCenter: e.isActive({ textAlign: 'center' }),
348
+ isAlignRight: e.isActive({ textAlign: 'right' }),
349
+ currentHeading: [1, 2, 3].find((level) => e.isActive('heading', { level })) ?? 0,
350
+ currentColor: e.getAttributes('textStyle')['color'] || '#000000',
351
+ currentHighlight: e.getAttributes('highlight')['color'] || 'transparent',
352
+ canUndo: e.can().undo(),
353
+ canRedo: e.can().redo(),
354
+ };
355
+ }
356
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
357
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: EditorComponent, isStandalone: true, selector: "s-editor", inputs: { readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, formats: { classPropertyName: "formats", publicName: "formats", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, extensions: { classPropertyName: "extensions", publicName: "extensions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editorInit: "editorInit", textChange: "textChange", selectionChange: "selectionChange" }, providers: [
358
+ {
359
+ provide: NG_VALUE_ACCESSOR,
360
+ useExisting: forwardRef(() => EditorComponent),
361
+ multi: true,
362
+ },
363
+ ], viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, isSignal: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"rounded bg-white flex flex-col border border-grayscale-30 transition-[border-color,box-shadow] duration-150 focus-within:border-[#5c5ce6] focus-within:shadow-[0_0_0_2px_rgba(92,92,230,0.15)]\"\n [ngClass]=\"styleClass()\"\n [ngStyle]=\"style()\"\n [class.s-editor--readonly]=\"readonly()\"\n>\n @if (!readonly()) {\n <div\n class=\"rounded-t flex flex-wrap items-center gap-0.5 border-b border-grayscale-30 bg-[#f9f9fb] px-2 py-1.5\"\n role=\"toolbar\"\n [attr.aria-label]=\"'platform.angular_components.editor_toolbar' | translate\"\n (keydown)=\"onToolbarKeydown($event)\"\n (focusin)=\"onToolbarFocusIn($event)\"\n >\n @if (isFormatAllowed('header')) {\n <select\n class=\"rounded bg-white h-7 cursor-pointer border border-grayscale-30 px-1.5 text-[13px] text-[#3d3d4d] outline-none transition-colors duration-150 focus:border-[#5c5ce6]\"\n (change)=\"onHeadingChange($event)\"\n [attr.aria-label]=\"'platform.angular_components.editor_heading_level' | translate\"\n >\n <option\n [value]=\"0\"\n [selected]=\"activeStates.currentHeading === 0\"\n >\n {{ 'platform.angular_components.editor_heading_normal' | translate }}\n </option>\n <option\n [value]=\"1\"\n [selected]=\"activeStates.currentHeading === 1\"\n >\n {{ 'platform.angular_components.editor_heading_1' | translate }}\n </option>\n <option\n [value]=\"2\"\n [selected]=\"activeStates.currentHeading === 2\"\n >\n {{ 'platform.angular_components.editor_heading_2' | translate }}\n </option>\n <option\n [value]=\"3\"\n [selected]=\"activeStates.currentHeading === 3\"\n >\n {{ 'platform.angular_components.editor_heading_3' | translate }}\n </option>\n </select>\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n @if (isFormatAllowed('bold')) {\n <s-editor-toolbar-button\n icon=\"fa fa-bold\"\n [label]=\"'platform.angular_components.editor_bold' | translate\"\n [active]=\"activeStates.isBold\"\n (clicked)=\"toggleBold()\"\n />\n }\n\n @if (isFormatAllowed('italic')) {\n <s-editor-toolbar-button\n icon=\"fa fa-italic\"\n [label]=\"'platform.angular_components.editor_italic' | translate\"\n [active]=\"activeStates.isItalic\"\n (clicked)=\"toggleItalic()\"\n />\n }\n\n @if (isFormatAllowed('underline')) {\n <s-editor-toolbar-button\n icon=\"fa fa-underline\"\n [label]=\"'platform.angular_components.editor_underline' | translate\"\n [active]=\"activeStates.isUnderline\"\n (clicked)=\"toggleUnderline()\"\n />\n }\n\n @if (isFormatAllowed('strike')) {\n <s-editor-toolbar-button\n icon=\"fa fa-strikethrough\"\n [label]=\"'platform.angular_components.editor_strikethrough' | translate\"\n [active]=\"activeStates.isStrike\"\n (clicked)=\"toggleStrike()\"\n />\n }\n\n @if (isFormatAllowed('subscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-subscript\"\n [label]=\"'platform.angular_components.editor_subscript' | translate\"\n [active]=\"activeStates.isSubscript\"\n (clicked)=\"toggleSubscript()\"\n />\n }\n\n @if (isFormatAllowed('superscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-superscript\"\n [label]=\"'platform.angular_components.editor_superscript' | translate\"\n [active]=\"activeStates.isSuperscript\"\n (clicked)=\"toggleSuperscript()\"\n />\n }\n\n @if (isFormatAllowed('color')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_text_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_text_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); colorInput.click()\"\n (keydown.space)=\"$event.preventDefault(); colorInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-font text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentColor\"\n ></span>\n </span>\n <input\n #colorInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentColor\"\n (input)=\"setColor($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('highlight')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_background_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_background_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); highlightInput.click()\"\n (keydown.space)=\"$event.preventDefault(); highlightInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-highlighter text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n ></span>\n </span>\n <input\n #highlightInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n (input)=\"setHighlight($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('list')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-list-ul\"\n [label]=\"'platform.angular_components.editor_bullet_list' | translate\"\n [active]=\"activeStates.isBulletList\"\n (clicked)=\"toggleBulletList()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-list-ol\"\n [label]=\"'platform.angular_components.editor_ordered_list' | translate\"\n [active]=\"activeStates.isOrderedList\"\n (clicked)=\"toggleOrderedList()\"\n />\n }\n\n @if (isFormatAllowed('align')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-align-left\"\n [label]=\"'platform.angular_components.editor_align_left' | translate\"\n [active]=\"activeStates.isAlignLeft\"\n (clicked)=\"setTextAlign('left')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-center\"\n [label]=\"'platform.angular_components.editor_align_center' | translate\"\n [active]=\"activeStates.isAlignCenter\"\n (clicked)=\"setTextAlign('center')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-right\"\n [label]=\"'platform.angular_components.editor_align_right' | translate\"\n [active]=\"activeStates.isAlignRight\"\n (clicked)=\"setTextAlign('right')\"\n />\n }\n\n @if (isFormatAllowed('blockquote')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-quote-right\"\n [label]=\"'platform.angular_components.editor_blockquote' | translate\"\n [active]=\"activeStates.isBlockquote\"\n (clicked)=\"toggleBlockquote()\"\n />\n }\n\n @if (isFormatAllowed('code-block')) {\n <s-editor-toolbar-button\n icon=\"fa fa-code\"\n [label]=\"'platform.angular_components.editor_inline_code' | translate\"\n [active]=\"activeStates.isCode\"\n (clicked)=\"toggleCode()\"\n />\n }\n\n @if (isFormatAllowed('link')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-link\"\n [label]=\"'platform.angular_components.editor_insert_link' | translate\"\n (clicked)=\"setLink()\"\n />\n }\n\n @if (isFormatAllowed('image')) {\n <s-editor-toolbar-button\n icon=\"fa fa-image\"\n [label]=\"'platform.angular_components.editor_insert_image' | translate\"\n (clicked)=\"setImage()\"\n />\n }\n\n @if (hasAnyFormatBeforeUndoRedo()) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n <s-editor-toolbar-button\n icon=\"fa fa-undo\"\n [label]=\"('platform.angular_components.editor_undo' | translate) + ' (Ctrl+Z)'\"\n [disabled]=\"!activeStates.canUndo\"\n (clicked)=\"undo()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-redo\"\n [label]=\"('platform.angular_components.editor_redo' | translate) + ' (Ctrl+Y)'\"\n [disabled]=\"!activeStates.canRedo\"\n (clicked)=\"redo()\"\n />\n\n @if (isFormatAllowed('clean')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-remove-format\"\n [label]=\"'platform.angular_components.editor_clear_formatting' | translate\"\n (clicked)=\"clearFormatting()\"\n />\n }\n </div>\n }\n\n <div\n #editorContainer\n class=\"s-editor-content flex-1\"\n ></div>\n <input\n #imageInput\n type=\"file\"\n accept=\"image/*\"\n style=\"display: none\"\n aria-hidden=\"true\"\n (change)=\"onImageFileSelected($event)\"\n />\n</div>\n", styles: [".s-editor--readonly ::ng-deep .ProseMirror{cursor:default}.s-editor-content ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:#9ca3af;pointer-events:none;float:left;height:0}.s-editor-content ::ng-deep .ProseMirror{padding:12px 16px;min-height:150px;outline:none!important;color:#1e1e2e;font-size:14px;line-height:1.6}.s-editor-content ::ng-deep .ProseMirror>*+*{margin-top:.5em}.s-editor-content ::ng-deep .ProseMirror p{margin:0}.s-editor-content ::ng-deep .ProseMirror h1{font-size:1.75em;font-weight:700;line-height:1.2;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h1:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h2{font-size:1.4em;font-weight:600;line-height:1.3;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h2:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h3{font-size:1.15em;font-weight:600;line-height:1.4;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h3:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror ul{list-style:disc;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror ol{list-style:decimal;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror li{margin:.2em 0}.s-editor-content ::ng-deep .ProseMirror li p{margin:0}.s-editor-content ::ng-deep .ProseMirror blockquote{border-left:3px solid #5c5ce6;padding-left:1em;margin:.75em 0;color:#6b6b80;font-style:italic}.s-editor-content ::ng-deep .ProseMirror code{background:#f0f0f8;border-radius:3px;padding:.15em .4em;font-family:Courier New,Courier,monospace;font-size:.875em;color:#c026d3}.s-editor-content ::ng-deep .ProseMirror pre{background:#1e1e2e;color:#cdd6f4;border-radius:6px;padding:1em 1.25em;overflow-x:auto;font-family:Courier New,Courier,monospace;font-size:.875em;line-height:1.5}.s-editor-content ::ng-deep .ProseMirror pre code{background:none;padding:0;color:inherit;font-size:inherit}.s-editor-content ::ng-deep .ProseMirror a{color:#5c5ce6;text-decoration:underline;cursor:pointer}.s-editor-content ::ng-deep .ProseMirror a:hover{color:#4040b0}.s-editor-content ::ng-deep .ProseMirror img{max-width:100%;height:auto;border-radius:4px;display:block}.s-editor-content ::ng-deep .ProseMirror hr{border:none;border-top:2px solid #e8e8f0;margin:1em 0}.s-editor-content ::ng-deep .ProseMirror sub{font-size:.75em;vertical-align:sub}.s-editor-content ::ng-deep .ProseMirror sup{font-size:.75em;vertical-align:super}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: EditorToolbarButtonComponent, selector: "s-editor-toolbar-button", inputs: ["icon", "label", "active", "disabled"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
364
+ }
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorComponent, decorators: [{
366
+ type: Component,
367
+ args: [{ selector: 's-editor', standalone: true, imports: [NgClass, NgStyle, TranslateModule, EditorToolbarButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
368
+ {
369
+ provide: NG_VALUE_ACCESSOR,
370
+ useExisting: forwardRef(() => EditorComponent),
371
+ multi: true,
372
+ },
373
+ ], template: "<div\n class=\"rounded bg-white flex flex-col border border-grayscale-30 transition-[border-color,box-shadow] duration-150 focus-within:border-[#5c5ce6] focus-within:shadow-[0_0_0_2px_rgba(92,92,230,0.15)]\"\n [ngClass]=\"styleClass()\"\n [ngStyle]=\"style()\"\n [class.s-editor--readonly]=\"readonly()\"\n>\n @if (!readonly()) {\n <div\n class=\"rounded-t flex flex-wrap items-center gap-0.5 border-b border-grayscale-30 bg-[#f9f9fb] px-2 py-1.5\"\n role=\"toolbar\"\n [attr.aria-label]=\"'platform.angular_components.editor_toolbar' | translate\"\n (keydown)=\"onToolbarKeydown($event)\"\n (focusin)=\"onToolbarFocusIn($event)\"\n >\n @if (isFormatAllowed('header')) {\n <select\n class=\"rounded bg-white h-7 cursor-pointer border border-grayscale-30 px-1.5 text-[13px] text-[#3d3d4d] outline-none transition-colors duration-150 focus:border-[#5c5ce6]\"\n (change)=\"onHeadingChange($event)\"\n [attr.aria-label]=\"'platform.angular_components.editor_heading_level' | translate\"\n >\n <option\n [value]=\"0\"\n [selected]=\"activeStates.currentHeading === 0\"\n >\n {{ 'platform.angular_components.editor_heading_normal' | translate }}\n </option>\n <option\n [value]=\"1\"\n [selected]=\"activeStates.currentHeading === 1\"\n >\n {{ 'platform.angular_components.editor_heading_1' | translate }}\n </option>\n <option\n [value]=\"2\"\n [selected]=\"activeStates.currentHeading === 2\"\n >\n {{ 'platform.angular_components.editor_heading_2' | translate }}\n </option>\n <option\n [value]=\"3\"\n [selected]=\"activeStates.currentHeading === 3\"\n >\n {{ 'platform.angular_components.editor_heading_3' | translate }}\n </option>\n </select>\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n @if (isFormatAllowed('bold')) {\n <s-editor-toolbar-button\n icon=\"fa fa-bold\"\n [label]=\"'platform.angular_components.editor_bold' | translate\"\n [active]=\"activeStates.isBold\"\n (clicked)=\"toggleBold()\"\n />\n }\n\n @if (isFormatAllowed('italic')) {\n <s-editor-toolbar-button\n icon=\"fa fa-italic\"\n [label]=\"'platform.angular_components.editor_italic' | translate\"\n [active]=\"activeStates.isItalic\"\n (clicked)=\"toggleItalic()\"\n />\n }\n\n @if (isFormatAllowed('underline')) {\n <s-editor-toolbar-button\n icon=\"fa fa-underline\"\n [label]=\"'platform.angular_components.editor_underline' | translate\"\n [active]=\"activeStates.isUnderline\"\n (clicked)=\"toggleUnderline()\"\n />\n }\n\n @if (isFormatAllowed('strike')) {\n <s-editor-toolbar-button\n icon=\"fa fa-strikethrough\"\n [label]=\"'platform.angular_components.editor_strikethrough' | translate\"\n [active]=\"activeStates.isStrike\"\n (clicked)=\"toggleStrike()\"\n />\n }\n\n @if (isFormatAllowed('subscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-subscript\"\n [label]=\"'platform.angular_components.editor_subscript' | translate\"\n [active]=\"activeStates.isSubscript\"\n (clicked)=\"toggleSubscript()\"\n />\n }\n\n @if (isFormatAllowed('superscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-superscript\"\n [label]=\"'platform.angular_components.editor_superscript' | translate\"\n [active]=\"activeStates.isSuperscript\"\n (clicked)=\"toggleSuperscript()\"\n />\n }\n\n @if (isFormatAllowed('color')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_text_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_text_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); colorInput.click()\"\n (keydown.space)=\"$event.preventDefault(); colorInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-font text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentColor\"\n ></span>\n </span>\n <input\n #colorInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentColor\"\n (input)=\"setColor($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('highlight')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_background_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_background_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); highlightInput.click()\"\n (keydown.space)=\"$event.preventDefault(); highlightInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-highlighter text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n ></span>\n </span>\n <input\n #highlightInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n (input)=\"setHighlight($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('list')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-list-ul\"\n [label]=\"'platform.angular_components.editor_bullet_list' | translate\"\n [active]=\"activeStates.isBulletList\"\n (clicked)=\"toggleBulletList()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-list-ol\"\n [label]=\"'platform.angular_components.editor_ordered_list' | translate\"\n [active]=\"activeStates.isOrderedList\"\n (clicked)=\"toggleOrderedList()\"\n />\n }\n\n @if (isFormatAllowed('align')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-align-left\"\n [label]=\"'platform.angular_components.editor_align_left' | translate\"\n [active]=\"activeStates.isAlignLeft\"\n (clicked)=\"setTextAlign('left')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-center\"\n [label]=\"'platform.angular_components.editor_align_center' | translate\"\n [active]=\"activeStates.isAlignCenter\"\n (clicked)=\"setTextAlign('center')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-right\"\n [label]=\"'platform.angular_components.editor_align_right' | translate\"\n [active]=\"activeStates.isAlignRight\"\n (clicked)=\"setTextAlign('right')\"\n />\n }\n\n @if (isFormatAllowed('blockquote')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-quote-right\"\n [label]=\"'platform.angular_components.editor_blockquote' | translate\"\n [active]=\"activeStates.isBlockquote\"\n (clicked)=\"toggleBlockquote()\"\n />\n }\n\n @if (isFormatAllowed('code-block')) {\n <s-editor-toolbar-button\n icon=\"fa fa-code\"\n [label]=\"'platform.angular_components.editor_inline_code' | translate\"\n [active]=\"activeStates.isCode\"\n (clicked)=\"toggleCode()\"\n />\n }\n\n @if (isFormatAllowed('link')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-link\"\n [label]=\"'platform.angular_components.editor_insert_link' | translate\"\n (clicked)=\"setLink()\"\n />\n }\n\n @if (isFormatAllowed('image')) {\n <s-editor-toolbar-button\n icon=\"fa fa-image\"\n [label]=\"'platform.angular_components.editor_insert_image' | translate\"\n (clicked)=\"setImage()\"\n />\n }\n\n @if (hasAnyFormatBeforeUndoRedo()) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n <s-editor-toolbar-button\n icon=\"fa fa-undo\"\n [label]=\"('platform.angular_components.editor_undo' | translate) + ' (Ctrl+Z)'\"\n [disabled]=\"!activeStates.canUndo\"\n (clicked)=\"undo()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-redo\"\n [label]=\"('platform.angular_components.editor_redo' | translate) + ' (Ctrl+Y)'\"\n [disabled]=\"!activeStates.canRedo\"\n (clicked)=\"redo()\"\n />\n\n @if (isFormatAllowed('clean')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-remove-format\"\n [label]=\"'platform.angular_components.editor_clear_formatting' | translate\"\n (clicked)=\"clearFormatting()\"\n />\n }\n </div>\n }\n\n <div\n #editorContainer\n class=\"s-editor-content flex-1\"\n ></div>\n <input\n #imageInput\n type=\"file\"\n accept=\"image/*\"\n style=\"display: none\"\n aria-hidden=\"true\"\n (change)=\"onImageFileSelected($event)\"\n />\n</div>\n", styles: [".s-editor--readonly ::ng-deep .ProseMirror{cursor:default}.s-editor-content ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:#9ca3af;pointer-events:none;float:left;height:0}.s-editor-content ::ng-deep .ProseMirror{padding:12px 16px;min-height:150px;outline:none!important;color:#1e1e2e;font-size:14px;line-height:1.6}.s-editor-content ::ng-deep .ProseMirror>*+*{margin-top:.5em}.s-editor-content ::ng-deep .ProseMirror p{margin:0}.s-editor-content ::ng-deep .ProseMirror h1{font-size:1.75em;font-weight:700;line-height:1.2;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h1:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h2{font-size:1.4em;font-weight:600;line-height:1.3;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h2:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h3{font-size:1.15em;font-weight:600;line-height:1.4;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h3:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror ul{list-style:disc;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror ol{list-style:decimal;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror li{margin:.2em 0}.s-editor-content ::ng-deep .ProseMirror li p{margin:0}.s-editor-content ::ng-deep .ProseMirror blockquote{border-left:3px solid #5c5ce6;padding-left:1em;margin:.75em 0;color:#6b6b80;font-style:italic}.s-editor-content ::ng-deep .ProseMirror code{background:#f0f0f8;border-radius:3px;padding:.15em .4em;font-family:Courier New,Courier,monospace;font-size:.875em;color:#c026d3}.s-editor-content ::ng-deep .ProseMirror pre{background:#1e1e2e;color:#cdd6f4;border-radius:6px;padding:1em 1.25em;overflow-x:auto;font-family:Courier New,Courier,monospace;font-size:.875em;line-height:1.5}.s-editor-content ::ng-deep .ProseMirror pre code{background:none;padding:0;color:inherit;font-size:inherit}.s-editor-content ::ng-deep .ProseMirror a{color:#5c5ce6;text-decoration:underline;cursor:pointer}.s-editor-content ::ng-deep .ProseMirror a:hover{color:#4040b0}.s-editor-content ::ng-deep .ProseMirror img{max-width:100%;height:auto;border-radius:4px;display:block}.s-editor-content ::ng-deep .ProseMirror hr{border:none;border-top:2px solid #e8e8f0;margin:1em 0}.s-editor-content ::ng-deep .ProseMirror sub{font-size:.75em;vertical-align:sub}.s-editor-content ::ng-deep .ProseMirror sup{font-size:.75em;vertical-align:super}\n"] }]
374
+ }], ctorParameters: () => [] });
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9lZGl0b3Ivc3JjL2xpYi9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9lZGl0b3Ivc3JjL2xpYi9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFHVixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxTQUFTLE1BQU0sNkJBQTZCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFDNUMsT0FBTyxXQUFXLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxTQUFTLE1BQU0sNkJBQTZC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QUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDaEYsWUFBWSxFQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFZLElBQUksU0FBUztZQUM1RSxnQkFBZ0IsRUFBRyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBWSxJQUFJLGFBQWE7WUFDcEYsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUU7U0FDMUIsQ0FBQztJQUNOLENBQUM7d0dBNVdRLGVBQWU7NEZBQWYsZUFBZSx1N0JBUmI7WUFDUDtnQkFDSSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLHlRQ2hFTCw4NFlBNlFBLHc5RUR2TmMsT0FBTyxvRkFBRSxPQUFPLDBFQUFFLGVBQWUsNEZBQUUsNEJBQTRCOzs0RkFZaEUsZUFBZTtrQkFmM0IsU0FBUzsrQkFDSSxVQUFVLGNBQ1IsSUFBSSxXQUNQLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsNEJBQTRCLENBQUMsbUJBR3pELHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgZWZmZWN0LFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG91dHB1dCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9kaWFsb2cnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29sb3InO1xuaW1wb3J0IEhpZ2hsaWdodCBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oaWdobGlnaHQnO1xuaW1wb3J0IEltYWdlIGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWltYWdlJztcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1wbGFjZWhvbGRlcic7XG5pbXBvcnQgU3Vic2NyaXB0IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXN1YnNjcmlwdCc7XG5pbXBvcnQgU3VwZXJzY3JpcHQgZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tc3VwZXJzY3JpcHQnO1xuaW1wb3J0IFRleHRBbGlnbiBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0LWFsaWduJztcbmltcG9ydCB7IFRleHRTdHlsZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRleHQtc3R5bGUnO1xuaW1wb3J0IFVuZGVybGluZSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi11bmRlcmxpbmUnO1xuaW1wb3J0IFN0YXJ0ZXJLaXQgZnJvbSAnQHRpcHRhcC9zdGFydGVyLWtpdCc7XG5cbmltcG9ydCB7IExpbmtEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2xpbmstZGlhbG9nL2xpbmstZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGl0b3JGb3JtYXQsIEVkaXRvclNlbGVjdGlvbkNoYW5nZUV2ZW50LCBFZGl0b3JUZXh0Q2hhbmdlRXZlbnQsIEV4dGVuc2lvbiB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEVkaXRvclRvb2xiYXJCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXItYnV0dG9uL2VkaXRvci10b29sYmFyLWJ1dHRvbi5jb21wb25lbnQnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnRlIGRlIGVkaXRvciBkZSB0ZXh0byByaWNvIChXWVNJV1lHKSBjb25zdHJ1w61kbyBzb2JyZSBvIFRpcHRhcC9Qcm9zZU1pcnJvci5cbiAqIFN1YnN0aXR1aSBvIGBwLWVkaXRvcmAgZG8gUHJpbWVORyBzZW0gZGVwZW5kw6puY2lhIGV4dGVybmEgZGUgbGljZW7Dp2EgY29tZXJjaWFsLlxuICogSW1wbGVtZW50YSB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHBhcmEgaW50ZWdyYcOnw6NvIGNvbSBBbmd1bGFyIEZvcm1zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8cy1lZGl0b3JcbiAqICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpY2FvXCJcbiAqICAgW3JlYWRvbmx5XT1cImZhbHNlXCJcbiAqICAgKHRleHRDaGFuZ2UpPVwib25UZXh0Q2hhbmdlKCRldmVudClcIiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1lZGl0b3InLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nQ2xhc3MsIE5nU3R5bGUsIFRyYW5zbGF0ZU1vZHVsZSwgRWRpdG9yVG9vbGJhckJ1dHRvbkNvbXBvbmVudF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDb2xvY2EgbyBlZGl0b3IgZW0gbW9kbyBzb21lbnRlIGxlaXR1cmEuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBMaXN0YSBkZSBmb3JtYXRvcyBoYWJpbGl0YWRvcyBuYSB0b29sYmFyLiBRdWFuZG8gdmF6aW8sIHRvZG9zIG9zIGZvcm1hdG9zIHPDo28gZXhpYmlkb3MuXG4gICAgICovXG4gICAgZm9ybWF0cyA9IGlucHV0PEVkaXRvckZvcm1hdFtdPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFRleHRvIGRlIGRpY2EgZXhpYmlkbyBxdWFuZG8gbyBlZGl0b3IgZXN0w6EgdmF6aW8uXG4gICAgICovXG4gICAgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRXN0aWxvcyBpbmxpbmUgYXBsaWNhZG9zIGFvIGNvbnRhaW5lciBkbyBlZGl0b3IuXG4gICAgICovXG4gICAgc3R5bGUgPSBpbnB1dDx7IFtrbGFzczogc3RyaW5nXTogdW5rbm93biB9PigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENsYXNzZXMgQ1NTIGFkaWNpb25haXMgYXBsaWNhZGFzIGFvIGNvbnRhaW5lciBkbyBlZGl0b3IuXG4gICAgICovXG4gICAgc3R5bGVDbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBFeHRlbnPDtWVzIFRpcHRhcCBhZGljaW9uYWlzIHBhcmEgZXN0ZW5kZXIgbyBjb21wb3J0YW1lbnRvIHBhZHLDo28gZG8gZWRpdG9yLlxuICAgICAqL1xuICAgIGV4dGVuc2lvbnMgPSBpbnB1dDxFeHRlbnNpb25bXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gZWRpdG9yIMOpIGluaWNpYWxpemFkbyBlIGVzdMOhIHByb250byBwYXJhIHVzby5cbiAgICAgKi9cbiAgICBlZGl0b3JJbml0ID0gb3V0cHV0PEVkaXRvcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIHNlbXByZSBxdWUgbyBjb250ZcO6ZG8gZG8gZWRpdG9yIMOpIGFsdGVyYWRvLlxuICAgICAqL1xuICAgIHRleHRDaGFuZ2UgPSBvdXRwdXQ8RWRpdG9yVGV4dENoYW5nZUV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIGEgc2VsZcOnw6NvIGRlIHRleHRvIG5vIGVkaXRvciBtdWRhLlxuICAgICAqL1xuICAgIHNlbGVjdGlvbkNoYW5nZSA9IG91dHB1dDxFZGl0b3JTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICAgIHByaXZhdGUgZWRpdG9yQ29udGFpbmVyID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignZWRpdG9yQ29udGFpbmVyJyk7XG4gICAgcHJpdmF0ZSBpbWFnZUlucHV0ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdpbWFnZUlucHV0Jyk7XG5cbiAgICBwcml2YXRlIGVkaXRvcj86IEVkaXRvcjtcbiAgICBwcml2YXRlIF9mb3JtRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jdXJyZW50UGxhY2Vob2xkZXIgPSAnJztcblxuICAgIGFjdGl2ZVN0YXRlcyA9IHtcbiAgICAgICAgaXNCb2xkOiBmYWxzZSxcbiAgICAgICAgaXNJdGFsaWM6IGZhbHNlLFxuICAgICAgICBpc1VuZGVybGluZTogZmFsc2UsXG4gICAgICAgIGlzU3RyaWtlOiBmYWxzZSxcbiAgICAgICAgaXNCdWxsZXRMaXN0OiBmYWxzZSxcbiAgICAgICAgaXNPcmRlcmVkTGlzdDogZmFsc2UsXG4gICAgICAgIGlzQmxvY2txdW90ZTogZmFsc2UsXG4gICAgICAgIGlzQ29kZTogZmFsc2UsXG4gICAgICAgIGlzU3Vic2NyaXB0OiBmYWxzZSxcbiAgICAgICAgaXNTdXBlcnNjcmlwdDogZmFsc2UsXG4gICAgICAgIGlzQWxpZ25MZWZ0OiBmYWxzZSxcbiAgICAgICAgaXNBbGlnbkNlbnRlcjogZmFsc2UsXG4gICAgICAgIGlzQWxpZ25SaWdodDogZmFsc2UsXG4gICAgICAgIGN1cnJlbnRIZWFkaW5nOiAwLFxuICAgICAgICBjdXJyZW50Q29sb3I6ICcjMDAwMDAwJyxcbiAgICAgICAgY3VycmVudEhpZ2hsaWdodDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgY2FuVW5kbzogZmFsc2UsXG4gICAgICAgIGNhblJlZG86IGZhbHNlLFxuICAgIH07XG5cbiAgICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRFZGl0YWJsZSghdGhpcy5yZWFkb25seSgpICYmICF0aGlzLl9mb3JtRGlzYWJsZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcigpID8/ICcnO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3I/LnZpZXcuZGlzcGF0Y2godGhpcy5lZGl0b3Iuc3RhdGUudHIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdEVkaXRvcigpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlID8/ICcnO1xuICAgICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmNoYWluKCkuc2V0TWV0YSgnYWRkVG9IaXN0b3J5JywgZmFsc2UpLnNldENvbnRlbnQodGhpcy5fdmFsdWUsIHsgZW1pdFVwZGF0ZTogZmFsc2UgfSkucnVuKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Zvcm1EaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5zZXRFZGl0YWJsZSghaXNEaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSgpKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgaXNGb3JtYXRBbGxvd2VkKGZvcm1hdDogRWRpdG9yRm9ybWF0KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSB0aGlzLmZvcm1hdHMoKTtcbiAgICAgICAgcmV0dXJuICFmb3JtYXRzPy5sZW5ndGggfHwgZm9ybWF0cy5pbmNsdWRlcyhmb3JtYXQpO1xuICAgIH1cblxuICAgIGhhc0FueUZvcm1hdEJlZm9yZVVuZG9SZWRvKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb3JtYXRzQmVmb3JlVW5kb1JlZG86IEVkaXRvckZvcm1hdFtdID0gW1xuICAgICAgICAgICAgJ2hlYWRlcicsICdib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtlJywgJ3N1YnNjcmlwdCcsICdzdXBlcnNjcmlwdCcsXG4gICAgICAgICAgICAnY29sb3InLCAnaGlnaGxpZ2h0JywgJ2xpc3QnLCAnYWxpZ24nLCAnYmxvY2txdW90ZScsICdjb2RlLWJsb2NrJywgJ2xpbmsnLCAnaW1hZ2UnLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gZm9ybWF0c0JlZm9yZVVuZG9SZWRvLnNvbWUoZiA9PiB0aGlzLmlzRm9ybWF0QWxsb3dlZChmKSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlQm9sZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS50b2dnbGVCb2xkKCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlSXRhbGljKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUl0YWxpYygpLnJ1bigpO1xuICAgIH1cblxuICAgIHRvZ2dsZVVuZGVybGluZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS50b2dnbGVVbmRlcmxpbmUoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVTdHJpa2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3RyaWtlKCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlQnVsbGV0TGlzdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS50b2dnbGVCdWxsZXRMaXN0KCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlT3JkZXJlZExpc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVCbG9ja3F1b3RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVDb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGUoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVTdWJzY3JpcHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3Vic2NyaXB0KCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlU3VwZXJzY3JpcHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3VwZXJzY3JpcHQoKS5ydW4oKTtcbiAgICB9XG5cbiAgICBzZXRUZXh0QWxpZ24oYWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldFRleHRBbGlnbihhbGlnbikucnVuKCk7XG4gICAgfVxuXG4gICAgc2V0Q29sb3IoY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldENvbG9yKGNvbG9yKS5ydW4oKTtcbiAgICB9XG5cbiAgICBzZXRIaWdobGlnaHQoY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldEhpZ2hsaWdodCh7IGNvbG9yIH0pLnJ1bigpO1xuICAgIH1cblxuICAgIGNsZWFyRm9ybWF0dGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS5jbGVhck5vZGVzKCkudW5zZXRBbGxNYXJrcygpLnJ1bigpO1xuICAgIH1cblxuICAgIG9uSGVhZGluZ0NoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBwYXJzZUludCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZSkgYXMgMCB8IDEgfCAyIHwgMztcbiAgICAgICAgaWYgKGlzTmFOKGxldmVsKSB8fCBsZXZlbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS5zZXRQYXJhZ3JhcGgoKS5ydW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkuc2V0SGVhZGluZyh7IGxldmVsIH0pLnJ1bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0TGluaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdVcmwgPSAodGhpcy5lZGl0b3I/LmdldEF0dHJpYnV0ZXMoJ2xpbmsnKVsnaHJlZiddIGFzIHN0cmluZykgPz8gJyc7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKExpbmtEaWFsb2dDb21wb25lbnQsIHsgc2l6ZTogJ3NtJyB9KTtcbiAgICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLmluaXRpYWxVcmwgPSBleGlzdGluZ1VybDtcbiAgICAgICAgcmVmLmNsb3NlZFxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh1cmwgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkuZXh0ZW5kTWFya1JhbmdlKCdsaW5rJykudW5zZXRMaW5rKCkucnVuKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS5leHRlbmRNYXJrUmFuZ2UoJ2xpbmsnKS5zZXRMaW5rKHsgaHJlZjogdXJsIH0pLnJ1bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEltYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmltYWdlSW5wdXQoKS5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgb25JbWFnZUZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgICAgIGlmICghZmlsZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldEltYWdlKHsgc3JjIH0pLnJ1bigpO1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9XG5cbiAgICB1bmRvKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnVuZG8oKS5ydW4oKTtcbiAgICB9XG5cbiAgICByZWRvKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnJlZG8oKS5ydW4oKTtcbiAgICB9XG5cbiAgICBvblRvb2xiYXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdIb21lJywgJ0VuZCddLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB0b29sYmFyID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gdGhpcy5nZXRUb29sYmFyRm9jdXNhYmxlKHRvb2xiYXIpO1xuICAgICAgICBpZiAoIWZvY3VzYWJsZS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmb2N1c2FibGUuZmluZEluZGV4KGVsID0+IGVsID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgbGV0IG5leHRJbmRleDogbnVtYmVyO1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzogbmV4dEluZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgZm9jdXNhYmxlLmxlbmd0aDsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiBuZXh0SW5kZXggPSAoY3VycmVudEluZGV4IC0gMSArIGZvY3VzYWJsZS5sZW5ndGgpICUgZm9jdXNhYmxlLmxlbmd0aDsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIb21lJzogbmV4dEluZGV4ID0gMDsgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiBuZXh0SW5kZXggPSBmb2N1c2FibGUubGVuZ3RoIC0gMTsgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBmb2N1c2FibGUuZm9yRWFjaCgoZWwsIGkpID0+IGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCBpID09PSBuZXh0SW5kZXggPyAnMCcgOiAnLTEnKSk7XG4gICAgICAgIGZvY3VzYWJsZVtuZXh0SW5kZXhdLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgb25Ub29sYmFyRm9jdXNJbihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRvb2xiYXIgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSB0aGlzLmdldFRvb2xiYXJGb2N1c2FibGUodG9vbGJhcik7XG4gICAgICAgIGlmIChmb2N1c2FibGUuaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICAgICAgZm9jdXNhYmxlLmZvckVhY2goZWwgPT4gZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIGVsID09PSB0YXJnZXQgPyAnMCcgOiAnLTEnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRvb2xiYXJGb2N1c2FibGUodG9vbGJhcjogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgICAgICB0b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pLCBzZWxlY3QsIGxhYmVsW3RhYmluZGV4XScpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEVkaXRvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBuZXcgRWRpdG9yKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWRpdG9yQ29udGFpbmVyKCkubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IFtcbiAgICAgICAgICAgICAgICBTdGFydGVyS2l0LmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICAgICAgICAgIGxpbms6IHsgb3Blbk9uQ2xpY2s6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgICAgIHVuZGVybGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgVW5kZXJsaW5lLFxuICAgICAgICAgICAgICAgIEltYWdlLFxuICAgICAgICAgICAgICAgIFRleHRBbGlnbi5jb25maWd1cmUoeyB0eXBlczogWydoZWFkaW5nJywgJ3BhcmFncmFwaCddIH0pLFxuICAgICAgICAgICAgICAgIFRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICBDb2xvcixcbiAgICAgICAgICAgICAgICBIaWdobGlnaHQuY29uZmlndXJlKHsgbXVsdGljb2xvcjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICBQbGFjZWhvbGRlci5jb25maWd1cmUoeyBwbGFjZWhvbGRlcjogKCkgPT4gdGhpcy5fY3VycmVudFBsYWNlaG9sZGVyIH0pLFxuICAgICAgICAgICAgICAgIFN1YnNjcmlwdCxcbiAgICAgICAgICAgICAgICBTdXBlcnNjcmlwdCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmV4dGVuc2lvbnMoKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgIGVkaXRhYmxlOiAhdGhpcy5yZWFkb25seSgpLFxuICAgICAgICAgICAgZWRpdG9yUHJvcHM6IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGU6ICd0ZXh0Ym94JyxcbiAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbXVsdGlsaW5lJzogJ3RydWUnLFxuICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfY29udGVudF9hcmVhJyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBlZGl0b3IuZ2V0SFRNTCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBlZGl0b3IuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gaHRtbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShodG1sKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdCh7IGh0bWxWYWx1ZTogaHRtbCwgdGV4dFZhbHVlOiB0ZXh0IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0FjdGl2ZVN0YXRlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0FjdGl2ZVN0YXRlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZnJvbSwgdG8sIGVtcHR5IH0gPSBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBmcm9tLCB0bywgZW1wdHkgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN5bmNBY3RpdmVTdGF0ZXMoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuZWRpdG9ySW5pdC5lbWl0KHRoaXMuZWRpdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNBY3RpdmVTdGF0ZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgICAgICBjb25zdCBlID0gdGhpcy5lZGl0b3I7XG4gICAgICAgIHRoaXMuYWN0aXZlU3RhdGVzID0ge1xuICAgICAgICAgICAgaXNCb2xkOiBlLmlzQWN0aXZlKCdib2xkJyksXG4gICAgICAgICAgICBpc0l0YWxpYzogZS5pc0FjdGl2ZSgnaXRhbGljJyksXG4gICAgICAgICAgICBpc1VuZGVybGluZTogZS5pc0FjdGl2ZSgndW5kZXJsaW5lJyksXG4gICAgICAgICAgICBpc1N0cmlrZTogZS5pc0FjdGl2ZSgnc3RyaWtlJyksXG4gICAgICAgICAgICBpc0J1bGxldExpc3Q6IGUuaXNBY3RpdmUoJ2J1bGxldExpc3QnKSxcbiAgICAgICAgICAgIGlzT3JkZXJlZExpc3Q6IGUuaXNBY3RpdmUoJ29yZGVyZWRMaXN0JyksXG4gICAgICAgICAgICBpc0Jsb2NrcXVvdGU6IGUuaXNBY3RpdmUoJ2Jsb2NrcXVvdGUnKSxcbiAgICAgICAgICAgIGlzQ29kZTogZS5pc0FjdGl2ZSgnY29kZScpLFxuICAgICAgICAgICAgaXNTdWJzY3JpcHQ6IGUuaXNBY3RpdmUoJ3N1YnNjcmlwdCcpLFxuICAgICAgICAgICAgaXNTdXBlcnNjcmlwdDogZS5pc0FjdGl2ZSgnc3VwZXJzY3JpcHQnKSxcbiAgICAgICAgICAgIGlzQWxpZ25MZWZ0OiBlLmlzQWN0aXZlKHsgdGV4dEFsaWduOiAnbGVmdCcgfSksXG4gICAgICAgICAgICBpc0FsaWduQ2VudGVyOiBlLmlzQWN0aXZlKHsgdGV4dEFsaWduOiAnY2VudGVyJyB9KSxcbiAgICAgICAgICAgIGlzQWxpZ25SaWdodDogZS5pc0FjdGl2ZSh7IHRleHRBbGlnbjogJ3JpZ2h0JyB9KSxcbiAgICAgICAgICAgIGN1cnJlbnRIZWFkaW5nOiBbMSwgMiwgM10uZmluZCgobGV2ZWwpID0+IGUuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsIH0pKSA/PyAwLFxuICAgICAgICAgICAgY3VycmVudENvbG9yOiAoZS5nZXRBdHRyaWJ1dGVzKCd0ZXh0U3R5bGUnKVsnY29sb3InXSBhcyBzdHJpbmcpIHx8ICcjMDAwMDAwJyxcbiAgICAgICAgICAgIGN1cnJlbnRIaWdobGlnaHQ6IChlLmdldEF0dHJpYnV0ZXMoJ2hpZ2hsaWdodCcpWydjb2xvciddIGFzIHN0cmluZykgfHwgJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgIGNhblVuZG86IGUuY2FuKCkudW5kbygpLFxuICAgICAgICAgICAgY2FuUmVkbzogZS5jYW4oKS5yZWRvKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwicm91bmRlZCBiZy13aGl0ZSBmbGV4IGZsZXgtY29sIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHRyYW5zaXRpb24tW2JvcmRlci1jb2xvcixib3gtc2hhZG93XSBkdXJhdGlvbi0xNTAgZm9jdXMtd2l0aGluOmJvcmRlci1bIzVjNWNlNl0gZm9jdXMtd2l0aGluOnNoYWRvdy1bMF8wXzBfMnB4X3JnYmEoOTIsOTIsMjMwLDAuMTUpXVwiXG4gICAgW25nQ2xhc3NdPVwic3R5bGVDbGFzcygpXCJcbiAgICBbbmdTdHlsZV09XCJzdHlsZSgpXCJcbiAgICBbY2xhc3Mucy1lZGl0b3ItLXJlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuPlxuICAgIEBpZiAoIXJlYWRvbmx5KCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXQgZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0wLjUgYm9yZGVyLWIgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1bI2Y5ZjlmYl0gcHgtMiBweS0xLjVcIlxuICAgICAgICAgICAgcm9sZT1cInRvb2xiYXJcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl90b29sYmFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblRvb2xiYXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGZvY3VzaW4pPVwib25Ub29sYmFyRm9jdXNJbigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2hlYWRlcicpKSB7XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQgYmctd2hpdGUgaC03IGN1cnNvci1wb2ludGVyIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTEuNSB0ZXh0LVsxM3B4XSB0ZXh0LVsjM2QzZDRkXSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMTUwIGZvY3VzOmJvcmRlci1bIzVjNWNlNl1cIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSGVhZGluZ0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9oZWFkaW5nX2xldmVsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiYWN0aXZlU3RhdGVzLmN1cnJlbnRIZWFkaW5nID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfaGVhZGluZ19ub3JtYWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiYWN0aXZlU3RhdGVzLmN1cnJlbnRIZWFkaW5nID09PSAxXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfaGVhZGluZ18xJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImFjdGl2ZVN0YXRlcy5jdXJyZW50SGVhZGluZyA9PT0gMlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2hlYWRpbmdfMicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCIzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJhY3RpdmVTdGF0ZXMuY3VycmVudEhlYWRpbmcgPT09IDNcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9oZWFkaW5nXzMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnYm9sZCcpKSB7XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS1ib2xkXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2JvbGQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNCb2xkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlQm9sZCgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnaXRhbGljJykpIHtcbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWl0YWxpY1wiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9pdGFsaWMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNJdGFsaWNcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVJdGFsaWMoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ3VuZGVybGluZScpKSB7XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfdW5kZXJsaW5lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiYWN0aXZlU3RhdGVzLmlzVW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlVW5kZXJsaW5lKClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdzdHJpa2UnKSkge1xuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtc3RyaWtldGhyb3VnaFwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9zdHJpa2V0aHJvdWdoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiYWN0aXZlU3RhdGVzLmlzU3RyaWtlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlU3RyaWtlKClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdzdWJzY3JpcHQnKSkge1xuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtc3Vic2NyaXB0XCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX3N1YnNjcmlwdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc1N1YnNjcmlwdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInRvZ2dsZVN1YnNjcmlwdCgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnc3VwZXJzY3JpcHQnKSkge1xuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtc3VwZXJzY3JpcHRcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3Jfc3VwZXJzY3JpcHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNTdXBlcnNjcmlwdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInRvZ2dsZVN1cGVyc2NyaXB0KClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdjb2xvcicpKSB7XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBoLTcgdy03IGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkIGJnLXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTE1MCBob3ZlcjpiZy1bI2YwZjBmOF1cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl90ZXh0X2NvbG9yJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfdGV4dF9jb2xvcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgY29sb3JJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGNvbG9ySW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC1weFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mb250IHRleHQtWzExcHhdIHRleHQtWyMzZDNkNGRdXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtWzNweF0gdy0zLjUgcm91bmRlZC1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYWN0aXZlU3RhdGVzLmN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgI2NvbG9ySW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCBjdXJzb3ItcG9pbnRlciBvcGFjaXR5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjdGl2ZVN0YXRlcy5jdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldENvbG9yKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnaGlnaGxpZ2h0JykpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtNyB3LTcgY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQgYmctd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMTUwIGhvdmVyOmJnLVsjZjBmMGY4XVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2JhY2tncm91bmRfY29sb3InIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9iYWNrZ3JvdW5kX2NvbG9yJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBoaWdobGlnaHRJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGhpZ2hsaWdodElucHV0LmNsaWNrKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaGlnaGxpZ2h0ZXIgdGV4dC1bMTFweF0gdGV4dC1bIzNkM2Q0ZF1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC1bM3B4XSB3LTMuNSByb3VuZGVkLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJhY3RpdmVTdGF0ZXMuY3VycmVudEhpZ2hsaWdodCA9PT0gJ3RyYW5zcGFyZW50JyA/ICcjZmZmZjAwJyA6IGFjdGl2ZVN0YXRlcy5jdXJyZW50SGlnaGxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAjaGlnaGxpZ2h0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCBjdXJzb3ItcG9pbnRlciBvcGFjaXR5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjdGl2ZVN0YXRlcy5jdXJyZW50SGlnaGxpZ2h0ID09PSAndHJhbnNwYXJlbnQnID8gJyNmZmZmMDAnIDogYWN0aXZlU3RhdGVzLmN1cnJlbnRIaWdobGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldEhpZ2hsaWdodCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2xpc3QnKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtbGlzdC11bFwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9idWxsZXRfbGlzdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0J1bGxldExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVCdWxsZXRMaXN0KClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS1saXN0LW9sXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX29yZGVyZWRfbGlzdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc09yZGVyZWRMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlT3JkZXJlZExpc3QoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2FsaWduJykpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTEgaW5saW5lLWJsb2NrIGgtNSB3LXB4IHNocmluay0wIGJnLVsjZDFkMWRjXVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWFsaWduLWxlZnRcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfYWxpZ25fbGVmdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0FsaWduTGVmdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFRleHRBbGlnbignbGVmdCcpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2FsaWduX2NlbnRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0FsaWduQ2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2V0VGV4dEFsaWduKCdjZW50ZXInKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWFsaWduLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2FsaWduX3JpZ2h0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiYWN0aXZlU3RhdGVzLmlzQWxpZ25SaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFRleHRBbGlnbigncmlnaHQnKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2Jsb2NrcXVvdGUnKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtcXVvdGUtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfYmxvY2txdW90ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0Jsb2NrcXVvdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVCbG9ja3F1b3RlKClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdjb2RlLWJsb2NrJykpIHtcbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfaW5saW5lX2NvZGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlQ29kZSgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnbGluaycpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0xIGlubGluZS1ibG9jayBoLTUgdy1weCBzaHJpbmstMCBiZy1bI2QxZDFkY11cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2luc2VydF9saW5rJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldExpbmsoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2ltYWdlJykpIHtcbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2luc2VydF9pbWFnZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRJbWFnZSgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGhhc0FueUZvcm1hdEJlZm9yZVVuZG9SZWRvKCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTEgaW5saW5lLWJsb2NrIGgtNSB3LXB4IHNocmluay0wIGJnLVsjZDFkMWRjXVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLXVuZG9cIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfdW5kbycgfCB0cmFuc2xhdGUpICsgJyAoQ3RybCtaKSdcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhYWN0aXZlU3RhdGVzLmNhblVuZG9cIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInVuZG8oKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLXJlZG9cIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfcmVkbycgfCB0cmFuc2xhdGUpICsgJyAoQ3RybCtZKSdcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhYWN0aXZlU3RhdGVzLmNhblJlZG9cIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInJlZG8oKVwiXG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnY2xlYW4nKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtcmVtb3ZlLWZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9jbGVhcl9mb3JtYXR0aW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImNsZWFyRm9ybWF0dGluZygpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgICNlZGl0b3JDb250YWluZXJcbiAgICAgICAgY2xhc3M9XCJzLWVkaXRvci1jb250ZW50IGZsZXgtMVwiXG4gICAgPjwvZGl2PlxuICAgIDxpbnB1dFxuICAgICAgICAjaW1hZ2VJbnB1dFxuICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxuICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uSW1hZ2VGaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgLz5cbjwvZGl2PlxuIl19
@@ -0,0 +1,48 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
4
+ import { ButtonModule } from '@seniorsistemas/angular-components/button';
5
+ import { ActiveDialog, DialogComponent } from '@seniorsistemas/angular-components/dialog';
6
+ import { DynamicFormModule } from '@seniorsistemas/angular-components/dynamic-form';
7
+ import { TemplateModule } from '@seniorsistemas/angular-components/template';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@ngx-translate/core";
10
+ import * as i2 from "@seniorsistemas/angular-components/dynamic-form";
11
+ import * as i3 from "@seniorsistemas/angular-components/button";
12
+ import * as i4 from "@seniorsistemas/angular-components/template";
13
+ export class LinkDialogComponent {
14
+ activeDialog = inject(ActiveDialog);
15
+ translateService = inject(TranslateService);
16
+ initialUrl = '';
17
+ form = new FormGroup({ url: new FormControl('') });
18
+ configs = [];
19
+ ngOnInit() {
20
+ this.form.setValue({ url: this.initialUrl });
21
+ this.configs = [
22
+ {
23
+ type: 'row',
24
+ fields: [
25
+ {
26
+ type: 'string',
27
+ name: 'url',
28
+ label: this.translateService.instant('platform.angular_components.editor_link_url_label'),
29
+ placeholder: this.translateService.instant('platform.angular_components.editor_link_url_placeholder'),
30
+ },
31
+ ],
32
+ },
33
+ ];
34
+ }
35
+ confirm() {
36
+ this.activeDialog.close(this.form.value.url?.trim() ?? '');
37
+ }
38
+ cancel() {
39
+ this.activeDialog.dismiss();
40
+ }
41
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LinkDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
42
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: LinkDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<s-dialog [header]=\"'platform.angular_components.editor_insert_link' | translate\">\n <ng-template sTemplate=\"body\">\n <s-dynamic-form [form]=\"form\" [configs]=\"configs\" />\n </ng-template>\n <ng-template sTemplate=\"footer\">\n <div style=\"display:flex; justify-content:flex-end; gap:8px; width:100%\">\n <s-button\n [label]=\"'platform.angular_components.cancel' | translate\"\n priority=\"secondary\"\n (clicked)=\"cancel()\"\n />\n <s-button\n [label]=\"'platform.angular_components.editor_confirm' | translate\"\n priority=\"primary\"\n (clicked)=\"confirm()\"\n />\n </div>\n </ng-template>\n</s-dialog>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: DialogComponent, selector: "s-dialog", inputs: ["header", "visible", "size", "contentClassName", "escapeOnEsc", "destroyClickOutside", "closeAriaLabel"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: DynamicFormModule }, { kind: "component", type: i2.DynamicFormComponent, selector: "s-dynamic-form", inputs: ["id", "configs", "fields", "form", "errorMessages"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel", "ariaLabel"], outputs: ["clicked"] }, { kind: "ngmodule", type: TemplateModule }, { kind: "directive", type: i4.TemplateDirective, selector: "[sTemplate]", inputs: ["sTemplate"] }] });
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LinkDialogComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ standalone: true, imports: [ReactiveFormsModule, TranslateModule, DialogComponent, DynamicFormModule, ButtonModule, TemplateModule], template: "<s-dialog [header]=\"'platform.angular_components.editor_insert_link' | translate\">\n <ng-template sTemplate=\"body\">\n <s-dynamic-form [form]=\"form\" [configs]=\"configs\" />\n </ng-template>\n <ng-template sTemplate=\"footer\">\n <div style=\"display:flex; justify-content:flex-end; gap:8px; width:100%\">\n <s-button\n [label]=\"'platform.angular_components.cancel' | translate\"\n priority=\"secondary\"\n (clicked)=\"cancel()\"\n />\n <s-button\n [label]=\"'platform.angular_components.editor_confirm' | translate\"\n priority=\"primary\"\n (clicked)=\"confirm()\"\n />\n </div>\n </ng-template>\n</s-dialog>\n" }]
47
+ }] });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2VkaXRvci9zcmMvbGliL2VkaXRvci9saW5rLWRpYWxvZy9saW5rLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZWRpdG9yL3NyYy9saWIvZWRpdG9yL2xpbmstZGlhbG9nL2xpbmstZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxpREFBaUQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7OztBQU83RSxNQUFNLE9BQU8sbUJBQW1CO0lBQ1gsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3RCxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBRWhCLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFbkQsT0FBTyxHQUF1QixFQUFFLENBQUM7SUFFakMsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDWDtnQkFDSSxJQUFJLEVBQUUsS0FBSztnQkFDWCxNQUFNLEVBQUU7b0JBQ0o7d0JBQ0ksSUFBSSxFQUFFLFFBQVE7d0JBQ2QsSUFBSSxFQUFFLEtBQUs7d0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsbURBQW1ELENBQUM7d0JBQ3pGLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUN0Qyx5REFBeUQsQ0FDNUQ7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0FuQ1EsbUJBQW1COzRGQUFuQixtQkFBbUIsd0VDZGhDLG14QkFtQkEsMkNEUmMsbUJBQW1CLDhCQUFFLGVBQWUsNEZBQUUsZUFBZSxtTUFBRSxpQkFBaUIsOEtBQUUsWUFBWSxvWUFBRSxjQUFjOzs0RkFHdkcsbUJBQW1CO2tCQUwvQixTQUFTO2lDQUNNLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHsgQWN0aXZlRGlhbG9nLCBEaWFsb2dDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RpYWxvZyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybU1vZHVsZSwgRHluYW1pY1N0cnVjdHVyZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHluYW1pYy1mb3JtJztcbmltcG9ydCB7IFRlbXBsYXRlTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy90ZW1wbGF0ZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZSwgRGlhbG9nQ29tcG9uZW50LCBEeW5hbWljRm9ybU1vZHVsZSwgQnV0dG9uTW9kdWxlLCBUZW1wbGF0ZU1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xpbmstZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTGlua0RpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEaWFsb2cgPSBpbmplY3QoQWN0aXZlRGlhbG9nKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgICBpbml0aWFsVXJsID0gJyc7XG5cbiAgICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7IHVybDogbmV3IEZvcm1Db250cm9sKCcnKSB9KTtcblxuICAgIGNvbmZpZ3M6IER5bmFtaWNTdHJ1Y3R1cmVbXSA9IFtdO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh7IHVybDogdGhpcy5pbml0aWFsVXJsIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZ3MgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JvdycsXG4gICAgICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3VybCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfbGlua191cmxfbGFiZWwnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9saW5rX3VybF9wbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGlhbG9nLmNsb3NlKHRoaXMuZm9ybS52YWx1ZS51cmw/LnRyaW0oKSA/PyAnJyk7XG4gICAgfVxuXG4gICAgY2FuY2VsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZy5kaXNtaXNzKCk7XG4gICAgfVxufVxuXG4iLCI8cy1kaWFsb2cgW2hlYWRlcl09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9pbnNlcnRfbGluaycgfCB0cmFuc2xhdGVcIj5cbiAgICA8bmctdGVtcGxhdGUgc1RlbXBsYXRlPVwiYm9keVwiPlxuICAgICAgICA8cy1keW5hbWljLWZvcm0gW2Zvcm1dPVwiZm9ybVwiIFtjb25maWdzXT1cImNvbmZpZ3NcIiAvPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHNUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7IGdhcDo4cHg7IHdpZHRoOjEwMCVcIj5cbiAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmNhbmNlbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2NvbmZpcm0nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwcmlvcml0eT1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9zLWRpYWxvZz5cbiJdfQ==