@ecodev/natural-editor 62.1.2 → 62.3.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.
- package/fesm2022/ecodev-natural-editor.mjs +40 -44
- package/fesm2022/ecodev-natural-editor.mjs.map +1 -1
- package/lib/class-dialog/class-dialog.component.d.ts +1 -1
- package/lib/color-dialog/color-dialog.component.d.ts +1 -1
- package/lib/editor/editor.component.d.ts +6 -4
- package/lib/id-dialog/id-dialog.component.d.ts +1 -1
- package/lib/link-dialog/link-dialog.component.d.ts +1 -1
- package/package.json +6 -8
- package/esm2022/ecodev-natural-editor.mjs +0 -5
- package/esm2022/lib/class-dialog/class-dialog.component.mjs +0 -40
- package/esm2022/lib/color-dialog/color-dialog.component.mjs +0 -197
- package/esm2022/lib/custom-css/custom-css.directive.mjs +0 -75
- package/esm2022/lib/editor/editor.component.mjs +0 -238
- package/esm2022/lib/id-dialog/id-dialog.component.mjs +0 -40
- package/esm2022/lib/link-dialog/link-dialog.component.mjs +0 -39
- package/esm2022/lib/utils/image.mjs +0 -82
- package/esm2022/lib/utils/inputrules.mjs +0 -70
- package/esm2022/lib/utils/items/cell-background-color-item.mjs +0 -55
- package/esm2022/lib/utils/items/class-item.mjs +0 -85
- package/esm2022/lib/utils/items/horizontal-rule-item.mjs +0 -24
- package/esm2022/lib/utils/items/id-item.mjs +0 -85
- package/esm2022/lib/utils/items/item.mjs +0 -40
- package/esm2022/lib/utils/items/link-item.mjs +0 -40
- package/esm2022/lib/utils/items/table-item.mjs +0 -43
- package/esm2022/lib/utils/items/text-align-item.mjs +0 -78
- package/esm2022/lib/utils/items/text-color-item.mjs +0 -56
- package/esm2022/lib/utils/items/utils.mjs +0 -55
- package/esm2022/lib/utils/items/wrap-list-item.mjs +0 -6
- package/esm2022/lib/utils/keymap.mjs +0 -115
- package/esm2022/lib/utils/menu.mjs +0 -111
- package/esm2022/lib/utils/schema/heading.mjs +0 -64
- package/esm2022/lib/utils/schema/paragraph-with-alignment.mjs +0 -50
- package/esm2022/lib/utils/schema/schema.mjs +0 -58
- package/esm2022/lib/utils/schema/table.mjs +0 -120
- package/esm2022/lib/utils/schema/text-color.mjs +0 -18
- package/esm2022/public-api.mjs +0 -7
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { Component, ElementRef, EventEmitter, inject, input, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
-
import { NgControl } from '@angular/forms';
|
|
3
|
-
import { EditorView } from 'prosemirror-view';
|
|
4
|
-
import { EditorState, Plugin } from 'prosemirror-state';
|
|
5
|
-
import { DOMParser, DOMSerializer } from 'prosemirror-model';
|
|
6
|
-
import { DOCUMENT } from '@angular/common';
|
|
7
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
8
|
-
import { goToNextCell, tableEditing } from 'prosemirror-tables';
|
|
9
|
-
import { keymap } from 'prosemirror-keymap';
|
|
10
|
-
import { ImagePlugin } from '../utils/image';
|
|
11
|
-
import { advancedSchema, basicSchema } from '../utils/schema/schema';
|
|
12
|
-
import { buildMenuItems } from '../utils/menu';
|
|
13
|
-
import { history } from 'prosemirror-history';
|
|
14
|
-
import { baseKeymap } from 'prosemirror-commands';
|
|
15
|
-
import { dropCursor } from 'prosemirror-dropcursor';
|
|
16
|
-
import { gapCursor } from 'prosemirror-gapcursor';
|
|
17
|
-
import { buildInputRules } from '../utils/inputrules';
|
|
18
|
-
import { buildKeymap } from '../utils/keymap';
|
|
19
|
-
import { NaturalFileDropDirective } from '@ecodev/natural';
|
|
20
|
-
import { MatDividerModule } from '@angular/material/divider';
|
|
21
|
-
import { MatMenuModule } from '@angular/material/menu';
|
|
22
|
-
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
23
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
24
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
25
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
26
|
-
import * as i0 from "@angular/core";
|
|
27
|
-
import * as i1 from "@angular/material/button";
|
|
28
|
-
import * as i2 from "@angular/material/tooltip";
|
|
29
|
-
import * as i3 from "@angular/material/icon";
|
|
30
|
-
import * as i4 from "@angular/material/button-toggle";
|
|
31
|
-
import * as i5 from "@angular/material/menu";
|
|
32
|
-
import * as i6 from "@angular/material/divider";
|
|
33
|
-
/**
|
|
34
|
-
* Prosemirror component
|
|
35
|
-
*
|
|
36
|
-
* Usage :
|
|
37
|
-
*
|
|
38
|
-
* ```html
|
|
39
|
-
* <natural-editor [(ngModel)]="htmlString" />
|
|
40
|
-
* ```
|
|
41
|
-
*/
|
|
42
|
-
// @dynamic
|
|
43
|
-
export class NaturalEditorComponent {
|
|
44
|
-
ngControl = inject(NgControl, { optional: true, self: true });
|
|
45
|
-
document = inject(DOCUMENT);
|
|
46
|
-
dialog = inject(MatDialog);
|
|
47
|
-
imagePlugin = inject(ImagePlugin);
|
|
48
|
-
view = null;
|
|
49
|
-
editor;
|
|
50
|
-
contentChange = new EventEmitter();
|
|
51
|
-
/**
|
|
52
|
-
* Callback to upload an image.
|
|
53
|
-
*
|
|
54
|
-
* If given it will enable advanced schema, including image and tables.
|
|
55
|
-
* It must be given on initialization and cannot be changed later on.
|
|
56
|
-
*/
|
|
57
|
-
imageUploader = null;
|
|
58
|
-
/**
|
|
59
|
-
* Mode must be set on initialization. Later changes will have no effect. Possible values are:
|
|
60
|
-
*
|
|
61
|
-
* - `basic`, the default, only offers minimal formatting options
|
|
62
|
-
* - `advanced`, adds text colors, headings, alignments, and tables. If `imageUploader` is given, it will force `advanced` mode.
|
|
63
|
-
*/
|
|
64
|
-
mode = input('basic');
|
|
65
|
-
schema = basicSchema;
|
|
66
|
-
/**
|
|
67
|
-
* Interface with ControlValueAccessor
|
|
68
|
-
* Notifies parent model / form controller
|
|
69
|
-
*/
|
|
70
|
-
onChange;
|
|
71
|
-
/**
|
|
72
|
-
* HTML string
|
|
73
|
-
*/
|
|
74
|
-
content = '';
|
|
75
|
-
menu = null;
|
|
76
|
-
/**
|
|
77
|
-
* If subscribed to, then the save button will be shown and click events forwarded
|
|
78
|
-
*/
|
|
79
|
-
save = new EventEmitter();
|
|
80
|
-
disabled = false;
|
|
81
|
-
constructor() {
|
|
82
|
-
if (this.ngControl !== null) {
|
|
83
|
-
this.ngControl.valueAccessor = this;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
ngOnInit() {
|
|
87
|
-
this.schema = this.imageUploader || this.mode() === 'advanced' ? advancedSchema : basicSchema;
|
|
88
|
-
this.menu = buildMenuItems(this.schema, this.dialog);
|
|
89
|
-
const serializer = DOMSerializer.fromSchema(this.schema);
|
|
90
|
-
const state = this.createState();
|
|
91
|
-
this.view = new EditorView(this.editor.nativeElement, {
|
|
92
|
-
state: state,
|
|
93
|
-
editable: () => !this.disabled,
|
|
94
|
-
dispatchTransaction: (transaction) => {
|
|
95
|
-
if (!this.view) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const newState = this.view.state.apply(transaction);
|
|
99
|
-
this.view.updateState(newState);
|
|
100
|
-
// Transform doc into HTML string
|
|
101
|
-
const dom = serializer.serializeFragment(this.view.state.doc);
|
|
102
|
-
const el = this.document.createElement('_');
|
|
103
|
-
el.appendChild(dom);
|
|
104
|
-
const newContent = el.innerHTML;
|
|
105
|
-
if (this.content === newContent || this.disabled) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
this.content = el.innerHTML;
|
|
109
|
-
if (this.onChange) {
|
|
110
|
-
this.onChange(this.content);
|
|
111
|
-
}
|
|
112
|
-
this.contentChange.emit(this.content);
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
this.update();
|
|
116
|
-
}
|
|
117
|
-
writeValue(val) {
|
|
118
|
-
if (typeof val === 'string' && val !== this.content) {
|
|
119
|
-
this.content = val;
|
|
120
|
-
}
|
|
121
|
-
if (this.view !== null) {
|
|
122
|
-
const state = this.createState();
|
|
123
|
-
this.view.updateState(state);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
createState() {
|
|
127
|
-
const template = this.document.createElement('_');
|
|
128
|
-
template.innerHTML = '<div>' + this.content + '</div>';
|
|
129
|
-
if (!template.firstChild) {
|
|
130
|
-
throw new Error('child of template element could not be created');
|
|
131
|
-
}
|
|
132
|
-
const parser = DOMParser.fromSchema(this.schema);
|
|
133
|
-
const doc = parser.parse(template.firstChild);
|
|
134
|
-
return EditorState.create({
|
|
135
|
-
doc: doc,
|
|
136
|
-
plugins: this.createPlugins(),
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
createPlugins() {
|
|
140
|
-
const isMac = !!this.document.defaultView?.navigator.platform.match(/Mac/);
|
|
141
|
-
const plugins = [
|
|
142
|
-
buildInputRules(this.schema),
|
|
143
|
-
keymap(buildKeymap(this.schema, isMac)),
|
|
144
|
-
keymap(baseKeymap),
|
|
145
|
-
dropCursor(),
|
|
146
|
-
gapCursor(),
|
|
147
|
-
history(),
|
|
148
|
-
new Plugin({
|
|
149
|
-
props: {
|
|
150
|
-
attributes: { class: 'ProseMirror-example-setup-style' },
|
|
151
|
-
},
|
|
152
|
-
}),
|
|
153
|
-
new Plugin({
|
|
154
|
-
view: () => this,
|
|
155
|
-
}),
|
|
156
|
-
];
|
|
157
|
-
if (this.imageUploader) {
|
|
158
|
-
plugins.push(this.imagePlugin.plugin);
|
|
159
|
-
}
|
|
160
|
-
if (this.schema === advancedSchema) {
|
|
161
|
-
plugins.push(tableEditing(), keymap({
|
|
162
|
-
Tab: goToNextCell(1),
|
|
163
|
-
'Shift-Tab': goToNextCell(-1),
|
|
164
|
-
}));
|
|
165
|
-
}
|
|
166
|
-
return plugins;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Called by Prosemirror whenever the editor state changes. So we update our menu states.
|
|
170
|
-
*/
|
|
171
|
-
update() {
|
|
172
|
-
if (!this.view || !this.menu) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
for (const item of Object.values(this.menu)) {
|
|
176
|
-
item.update(this.view, this.view.state);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
registerOnChange(fn) {
|
|
180
|
-
this.onChange = fn;
|
|
181
|
-
}
|
|
182
|
-
registerOnTouched() {
|
|
183
|
-
// noop
|
|
184
|
-
}
|
|
185
|
-
setDisabledState(isDisabled) {
|
|
186
|
-
this.disabled = isDisabled;
|
|
187
|
-
}
|
|
188
|
-
ngOnDestroy() {
|
|
189
|
-
if (this.view) {
|
|
190
|
-
this.view.destroy();
|
|
191
|
-
this.view = null;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
run(event, key) {
|
|
195
|
-
if (!this.view || !this.menu) {
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
const item = this.menu[key];
|
|
199
|
-
if (!item || item.disabled || !item.show) {
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
item.spec.run(this.view.state, this.view.dispatch, this.view, event);
|
|
203
|
-
this.view.focus();
|
|
204
|
-
}
|
|
205
|
-
upload(file) {
|
|
206
|
-
if (!this.view || !this.imageUploader) {
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
if (this.view.state.selection.$from.parent.inlineContent) {
|
|
210
|
-
this.imagePlugin.startImageUpload(this.view, file, this.imageUploader, this.schema);
|
|
211
|
-
}
|
|
212
|
-
this.view.focus();
|
|
213
|
-
}
|
|
214
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
215
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: NaturalEditorComponent, isStandalone: true, selector: "natural-editor", inputs: { imageUploader: { classPropertyName: "imageUploader", publicName: "imageUploader", isSignal: false, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contentChange: "contentChange", save: "save" }, providers: [ImagePlugin], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "@if (menu && !this.disabled) {\n <div class=\"menu-container\">\n <div class=\"menu\">\n @if (save.observed) {\n <button mat-icon-button (click)=\"save.emit()\" i18n-matTooltip matTooltip=\"Enregistrer\">\n <mat-icon fontIcon=\"save\" />\n </button>\n }\n <mat-button-toggle-group hideMultipleSelectionIndicator multiple>\n @if (menu.toggleStrong) {\n <mat-button-toggle\n [disabled]=\"menu.toggleStrong.disabled\"\n [checked]=\"menu.toggleStrong.active\"\n (click)=\"run($event, 'toggleStrong')\"\n i18n-matTooltip\n matTooltip=\"Gras\"\n >\n <mat-icon fontIcon=\"format_bold\" />\n </mat-button-toggle>\n }\n @if (menu.toggleEm) {\n <mat-button-toggle\n [disabled]=\"menu.toggleEm.disabled\"\n [checked]=\"menu.toggleEm.active\"\n (click)=\"run($event, 'toggleEm')\"\n i18n-matTooltip\n matTooltip=\"Italique\"\n >\n <mat-icon fontIcon=\"format_italic\" />\n </mat-button-toggle>\n }\n @if (menu.toggleCode) {\n <mat-button-toggle\n [disabled]=\"menu.toggleCode.disabled\"\n [checked]=\"menu.toggleCode.active\"\n (click)=\"run($event, 'toggleCode')\"\n i18n-matTooltip\n matTooltip=\"Code\"\n >\n <mat-icon fontIcon=\"code\" />\n </mat-button-toggle>\n }\n @if (menu.toggleLink) {\n <mat-button-toggle\n [disabled]=\"menu.toggleLink.disabled\"\n [checked]=\"menu.toggleLink.active\"\n (click)=\"run($event, 'toggleLink')\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer un lien...\"\n >\n <mat-icon fontIcon=\"insert_link\" />\n </mat-button-toggle>\n }\n @if (menu.textColor) {\n <mat-button-toggle\n [disabled]=\"menu.textColor.disabled\"\n [checked]=\"menu.textColor.active\"\n (click)=\"run($event, 'textColor')\"\n i18n-matTooltip\n matTooltip=\"Couleur du texte...\"\n >\n <mat-icon fontIcon=\"format_color_text\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button mat-button [matMenuTriggerFor]=\"blockMenu\">\n <span i18n>Type</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n <mat-menu #blockMenu=\"matMenu\">\n @if (menu.makeParagraph) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeParagraph.disabled\"\n (click)=\"run($event, 'makeParagraph')\"\n i18n\n >Paragraphe\n </button>\n }\n @if (menu.makeCodeBlock) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeCodeBlock.disabled\"\n (click)=\"run($event, 'makeCodeBlock')\"\n i18n\n >Code\n </button>\n }\n @if (menu.makeHead1) {\n <button mat-menu-item [disabled]=\"menu.makeHead1.disabled\" (click)=\"run($event, 'makeHead1')\" i18n\n >Titre 1\n </button>\n }\n @if (menu.makeHead2) {\n <button mat-menu-item [disabled]=\"menu.makeHead2.disabled\" (click)=\"run($event, 'makeHead2')\" i18n\n >Titre 2\n </button>\n }\n @if (menu.makeHead3) {\n <button mat-menu-item [disabled]=\"menu.makeHead3.disabled\" (click)=\"run($event, 'makeHead3')\" i18n\n >Titre 3\n </button>\n }\n @if (menu.makeHead4) {\n <button mat-menu-item [disabled]=\"menu.makeHead4.disabled\" (click)=\"run($event, 'makeHead4')\" i18n\n >Titre 4\n </button>\n }\n @if (menu.makeHead5) {\n <button mat-menu-item [disabled]=\"menu.makeHead5.disabled\" (click)=\"run($event, 'makeHead5')\" i18n\n >Titre 5\n </button>\n }\n @if (menu.makeHead6) {\n <button mat-menu-item [disabled]=\"menu.makeHead6.disabled\" (click)=\"run($event, 'makeHead6')\" i18n\n >Titre 6\n </button>\n }\n @if (menu.blockClass || menu.blockId) {\n <mat-divider />\n }\n @if (menu.blockClass) {\n <button mat-menu-item [disabled]=\"menu.blockClass.disabled\" (click)=\"run($event, 'blockClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.blockId) {\n <button i18n mat-menu-item [disabled]=\"menu.blockId.disabled\" (click)=\"run($event, 'blockId')\"\n >ID...\n </button>\n }\n </mat-menu>\n @if (menu.addColumnBefore) {\n <button mat-button [matMenuTriggerFor]=\"tableMenu\">\n <span i18n>Tableau</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n }\n <mat-menu #tableMenu=\"matMenu\">\n @if (menu.insertTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.insertTable.disabled\"\n (click)=\"run($event, 'insertTable')\"\n i18n\n >Ins\u00E9rer un tableau\n </button>\n }\n @if (menu.deleteTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteTable.disabled\"\n (click)=\"run($event, 'deleteTable')\"\n i18n\n >Supprimer le tableau\n </button>\n }\n @if (menu.mergeCells) {\n <button mat-menu-item [disabled]=\"menu.mergeCells.disabled\" (click)=\"run($event, 'mergeCells')\" i18n\n >Fusionner les cellules\n </button>\n }\n @if (menu.splitCell) {\n <button mat-menu-item [disabled]=\"menu.splitCell.disabled\" (click)=\"run($event, 'splitCell')\" i18n\n >Scinder les cellules\n </button>\n }\n @if (menu.cellBackgroundColor) {\n <button\n mat-menu-item\n [disabled]=\"menu.cellBackgroundColor.disabled\"\n (click)=\"run($event, 'cellBackgroundColor')\"\n i18n\n >Couleur de fond...\n </button>\n }\n @if (menu.tableClass) {\n <button mat-menu-item [disabled]=\"menu.tableClass.disabled\" (click)=\"run($event, 'tableClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.tableId) {\n <button i18n mat-menu-item [disabled]=\"menu.tableId.disabled\" (click)=\"run($event, 'tableId')\"\n >ID...\n </button>\n }\n <mat-divider />\n @if (menu.addColumnBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnBefore.disabled\"\n (click)=\"run($event, 'addColumnBefore')\"\n i18n\n >Ins\u00E9rer une colonne avant\n </button>\n }\n @if (menu.addColumnAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnAfter.disabled\"\n (click)=\"run($event, 'addColumnAfter')\"\n i18n\n >Ins\u00E9rer une colonne apr\u00E8s\n </button>\n }\n @if (menu.deleteColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteColumn.disabled\"\n (click)=\"run($event, 'deleteColumn')\"\n i18n\n >Supprimer la colonne\n </button>\n }\n <mat-divider />\n @if (menu.addRowBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowBefore.disabled\"\n (click)=\"run($event, 'addRowBefore')\"\n i18n\n >Ins\u00E9rer une ligne avant\n </button>\n }\n @if (menu.addRowAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowAfter.disabled\"\n (click)=\"run($event, 'addRowAfter')\"\n i18n\n >Ins\u00E9rer une ligne apr\u00E8s\n </button>\n }\n @if (menu.deleteRow) {\n <button mat-menu-item [disabled]=\"menu.deleteRow.disabled\" (click)=\"run($event, 'deleteRow')\" i18n\n >Supprimer la ligne\n </button>\n }\n <mat-divider />\n @if (menu.toggleHeaderColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderColumn.disabled\"\n (click)=\"run($event, 'toggleHeaderColumn')\"\n i18n\n >Ent\u00EAte de colonne\n </button>\n }\n @if (menu.toggleHeaderRow) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderRow.disabled\"\n (click)=\"run($event, 'toggleHeaderRow')\"\n i18n\n >Ent\u00EAte de ligne\n </button>\n }\n @if (menu.toggleHeaderCell) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderCell.disabled\"\n (click)=\"run($event, 'toggleHeaderCell')\"\n i18n\n >Ent\u00EAte de cellule\n </button>\n }\n </mat-menu>\n @if (imageUploader) {\n <button\n mat-icon-button\n naturalFileDrop\n [selectable]=\"true\"\n [broadcast]=\"false\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer une image\"\n (fileChange)=\"upload($event)\"\n >\n <mat-icon fontIcon=\"insert_photo\" />\n </button>\n }\n @if (menu.alignLeft) {\n <mat-button-toggle-group hideSingleSelectionIndicator>\n @if (menu.alignLeft) {\n <mat-button-toggle\n [disabled]=\"menu.alignLeft.disabled\"\n [checked]=\"menu.alignLeft.active\"\n (click)=\"run($event, 'alignLeft')\"\n i18n-matTooltip\n matTooltip=\"Aligner gauche\"\n >\n <mat-icon fontIcon=\"format_align_left\" />\n </mat-button-toggle>\n }\n @if (menu.alignCenter) {\n <mat-button-toggle\n [disabled]=\"menu.alignCenter.disabled\"\n [checked]=\"menu.alignCenter.active\"\n (click)=\"run($event, 'alignCenter')\"\n i18n-matTooltip\n matTooltip=\"Centrer\"\n >\n <mat-icon fontIcon=\"format_align_center\" />\n </mat-button-toggle>\n }\n @if (menu.alignRight) {\n <mat-button-toggle\n [disabled]=\"menu.alignRight.disabled\"\n [checked]=\"menu.alignRight.active\"\n (click)=\"run($event, 'alignRight')\"\n i18n-matTooltip\n matTooltip=\"Aligner droite\"\n >\n <mat-icon fontIcon=\"format_align_right\" />\n </mat-button-toggle>\n }\n @if (menu.alignJustify) {\n <mat-button-toggle\n [disabled]=\"menu.alignJustify.disabled\"\n [checked]=\"menu.alignJustify.active\"\n (click)=\"run($event, 'alignJustify')\"\n i18n-matTooltip\n matTooltip=\"Justifier\"\n >\n <mat-icon fontIcon=\"format_align_justify\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n }\n @if (menu.undo) {\n <button\n mat-icon-button\n [disabled]=\"menu.undo.disabled\"\n (click)=\"run($event, 'undo')\"\n i18n-matTooltip\n matTooltip=\"Annuler\"\n >\n <mat-icon fontIcon=\"undo\" />\n </button>\n }\n @if (menu.redo) {\n <button\n mat-icon-button\n [disabled]=\"menu.redo.disabled\"\n (click)=\"run($event, 'redo')\"\n i18n-matTooltip\n matTooltip=\"Refaire\"\n >\n <mat-icon fontIcon=\"redo\" />\n </button>\n }\n @if (menu.wrapBulletList && menu.wrapBulletList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBulletList.disabled\"\n (click)=\"run($event, 'wrapBulletList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 puce\"\n >\n <mat-icon fontIcon=\"format_list_bulleted\" />\n </button>\n }\n @if (menu.wrapOrderedList && menu.wrapOrderedList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapOrderedList.disabled\"\n (click)=\"run($event, 'wrapOrderedList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 num\u00E9ro\"\n >\n <mat-icon fontIcon=\"format_list_numbered\" />\n </button>\n }\n @if (menu.wrapBlockQuote && menu.wrapBlockQuote.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBlockQuote.disabled\"\n (click)=\"run($event, 'wrapBlockQuote')\"\n i18n-matTooltip\n matTooltip=\"Citation\"\n >\n <mat-icon fontIcon=\"format_quote\" />\n </button>\n }\n @if (menu.joinUp && menu.joinUp.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.joinUp.disabled\"\n (click)=\"run($event, 'joinUp')\"\n i18n-matTooltip\n matTooltip=\"Fusionner avec l'\u00E9l\u00E9ment du haut\"\n >\n <mat-icon fontIcon=\"move_up\" />\n </button>\n }\n @if (menu.lift && menu.lift.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.lift.disabled\"\n (click)=\"run($event, 'lift')\"\n i18n-matTooltip\n matTooltip=\"D\u00E9sindenter\"\n >\n <mat-icon fontIcon=\"format_indent_decrease\" />\n </button>\n }\n @if (menu.selectParentNode && menu.selectParentNode.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.selectParentNode.disabled\"\n (click)=\"run($event, 'selectParentNode')\"\n i18n-matTooltip\n matTooltip=\"S\u00E9lectionner l'\u00E9l\u00E9ment parent\"\n >\n <mat-icon fontIcon=\"select_all\" />\n </button>\n }\n </div>\n </div>\n}\n<div class=\"editor-container\" #editor></div>\n", styles: [".menu{display:flex;flex-wrap:wrap;border-bottom:1px solid;padding:10px 18px}.menu-container{position:sticky;top:-20px;z-index:999}::ng-deep .ProseMirror{--padding-right: 8px;--padding-left: 14px;position:relative;outline:none;padding:4px var(--padding-right) 4px var(--padding-left);width:calc(100% - var(--padding-right) - var(--padding-left));line-height:1.2;word-wrap:break-word;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;white-space:pre-wrap}::ng-deep .ProseMirror pre{white-space:pre-wrap}::ng-deep .ProseMirror li{position:relative}::ng-deep .ProseMirror-hideselection *::selection{background:transparent}::ng-deep .ProseMirror-hideselection *::-moz-selection{background:transparent}::ng-deep .ProseMirror-hideselection{caret-color:transparent}::ng-deep .ProseMirror-selectednode{outline:2px solid #8cf}::ng-deep li.ProseMirror-selectednode{outline:none}::ng-deep li.ProseMirror-selectednode:after{position:absolute;inset:-2px -2px -2px -32px;border:2px solid #8cf;pointer-events:none;content:\"\"}::ng-deep .ProseMirror-gapcursor{display:none;position:absolute;pointer-events:none}::ng-deep .ProseMirror-gapcursor:after{display:block;position:absolute;top:-2px;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite;border-top:1px solid black;width:20px;content:\"\"}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}::ng-deep .ProseMirror-example-setup-style hr{margin:1em 0;border:none;padding:2px 10px}::ng-deep .ProseMirror-example-setup-style hr:after{display:block;background-color:silver;height:1px;content:\"\";line-height:2px}::ng-deep .ProseMirror ul,::ng-deep .ProseMirror ol{padding-left:30px}::ng-deep .ProseMirror blockquote{margin-right:0;margin-left:0;border-left:3px solid #eee;padding-left:1em}::ng-deep .ProseMirror-example-setup-style img{cursor:default}::ng-deep .ProseMirror p:first-child,::ng-deep .ProseMirror h1:first-child,::ng-deep .ProseMirror h2:first-child,::ng-deep .ProseMirror h3:first-child,::ng-deep .ProseMirror h4:first-child,::ng-deep .ProseMirror h5:first-child,::ng-deep .ProseMirror h6:first-child{margin-top:10px}::ng-deep .ProseMirror p{margin-bottom:1em}::ng-deep .ProseMirror .tableWrapper{overflow-x:auto}::ng-deep .ProseMirror table{border-collapse:collapse;width:100%;table-layout:fixed;overflow:hidden}::ng-deep .ProseMirror td,::ng-deep .ProseMirror th{position:relative;vertical-align:top;box-sizing:border-box}::ng-deep .ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;bottom:0;z-index:20;background-color:#adf;width:4px;pointer-events:none}::ng-deep .ProseMirror.resize-cursor{cursor:col-resize}::ng-deep .ProseMirror .selectedCell:after{position:absolute;inset:0;z-index:2;background:#c8c8ff66;pointer-events:none;content:\"\"}::ng-deep .ProseMirror table{margin:0}::ng-deep .ProseMirror th,::ng-deep .ProseMirror td{border:1px solid #ddd;padding:3px 5px;min-width:1em}::ng-deep .ProseMirror .tableWrapper{margin:1em 0}::ng-deep .ProseMirror th{font-weight:700;text-align:left}::ng-deep placeholder{display:block;animation:gradient 3s none infinite;background-size:500% 100%!important;width:50px;height:50px}@keyframes gradient{0%{background-position:100% 100%}to{background-position:0 0}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i4.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i4.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: NaturalFileDropDirective, selector: ":not([naturalFileSelect])[naturalFileDrop]", outputs: ["fileOver"] }] });
|
|
216
|
-
}
|
|
217
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalEditorComponent, decorators: [{
|
|
218
|
-
type: Component,
|
|
219
|
-
args: [{ selector: 'natural-editor', providers: [ImagePlugin], standalone: true, imports: [
|
|
220
|
-
MatButtonModule,
|
|
221
|
-
MatTooltipModule,
|
|
222
|
-
MatIconModule,
|
|
223
|
-
MatButtonToggleModule,
|
|
224
|
-
MatMenuModule,
|
|
225
|
-
MatDividerModule,
|
|
226
|
-
NaturalFileDropDirective,
|
|
227
|
-
], template: "@if (menu && !this.disabled) {\n <div class=\"menu-container\">\n <div class=\"menu\">\n @if (save.observed) {\n <button mat-icon-button (click)=\"save.emit()\" i18n-matTooltip matTooltip=\"Enregistrer\">\n <mat-icon fontIcon=\"save\" />\n </button>\n }\n <mat-button-toggle-group hideMultipleSelectionIndicator multiple>\n @if (menu.toggleStrong) {\n <mat-button-toggle\n [disabled]=\"menu.toggleStrong.disabled\"\n [checked]=\"menu.toggleStrong.active\"\n (click)=\"run($event, 'toggleStrong')\"\n i18n-matTooltip\n matTooltip=\"Gras\"\n >\n <mat-icon fontIcon=\"format_bold\" />\n </mat-button-toggle>\n }\n @if (menu.toggleEm) {\n <mat-button-toggle\n [disabled]=\"menu.toggleEm.disabled\"\n [checked]=\"menu.toggleEm.active\"\n (click)=\"run($event, 'toggleEm')\"\n i18n-matTooltip\n matTooltip=\"Italique\"\n >\n <mat-icon fontIcon=\"format_italic\" />\n </mat-button-toggle>\n }\n @if (menu.toggleCode) {\n <mat-button-toggle\n [disabled]=\"menu.toggleCode.disabled\"\n [checked]=\"menu.toggleCode.active\"\n (click)=\"run($event, 'toggleCode')\"\n i18n-matTooltip\n matTooltip=\"Code\"\n >\n <mat-icon fontIcon=\"code\" />\n </mat-button-toggle>\n }\n @if (menu.toggleLink) {\n <mat-button-toggle\n [disabled]=\"menu.toggleLink.disabled\"\n [checked]=\"menu.toggleLink.active\"\n (click)=\"run($event, 'toggleLink')\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer un lien...\"\n >\n <mat-icon fontIcon=\"insert_link\" />\n </mat-button-toggle>\n }\n @if (menu.textColor) {\n <mat-button-toggle\n [disabled]=\"menu.textColor.disabled\"\n [checked]=\"menu.textColor.active\"\n (click)=\"run($event, 'textColor')\"\n i18n-matTooltip\n matTooltip=\"Couleur du texte...\"\n >\n <mat-icon fontIcon=\"format_color_text\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button mat-button [matMenuTriggerFor]=\"blockMenu\">\n <span i18n>Type</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n <mat-menu #blockMenu=\"matMenu\">\n @if (menu.makeParagraph) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeParagraph.disabled\"\n (click)=\"run($event, 'makeParagraph')\"\n i18n\n >Paragraphe\n </button>\n }\n @if (menu.makeCodeBlock) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeCodeBlock.disabled\"\n (click)=\"run($event, 'makeCodeBlock')\"\n i18n\n >Code\n </button>\n }\n @if (menu.makeHead1) {\n <button mat-menu-item [disabled]=\"menu.makeHead1.disabled\" (click)=\"run($event, 'makeHead1')\" i18n\n >Titre 1\n </button>\n }\n @if (menu.makeHead2) {\n <button mat-menu-item [disabled]=\"menu.makeHead2.disabled\" (click)=\"run($event, 'makeHead2')\" i18n\n >Titre 2\n </button>\n }\n @if (menu.makeHead3) {\n <button mat-menu-item [disabled]=\"menu.makeHead3.disabled\" (click)=\"run($event, 'makeHead3')\" i18n\n >Titre 3\n </button>\n }\n @if (menu.makeHead4) {\n <button mat-menu-item [disabled]=\"menu.makeHead4.disabled\" (click)=\"run($event, 'makeHead4')\" i18n\n >Titre 4\n </button>\n }\n @if (menu.makeHead5) {\n <button mat-menu-item [disabled]=\"menu.makeHead5.disabled\" (click)=\"run($event, 'makeHead5')\" i18n\n >Titre 5\n </button>\n }\n @if (menu.makeHead6) {\n <button mat-menu-item [disabled]=\"menu.makeHead6.disabled\" (click)=\"run($event, 'makeHead6')\" i18n\n >Titre 6\n </button>\n }\n @if (menu.blockClass || menu.blockId) {\n <mat-divider />\n }\n @if (menu.blockClass) {\n <button mat-menu-item [disabled]=\"menu.blockClass.disabled\" (click)=\"run($event, 'blockClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.blockId) {\n <button i18n mat-menu-item [disabled]=\"menu.blockId.disabled\" (click)=\"run($event, 'blockId')\"\n >ID...\n </button>\n }\n </mat-menu>\n @if (menu.addColumnBefore) {\n <button mat-button [matMenuTriggerFor]=\"tableMenu\">\n <span i18n>Tableau</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n }\n <mat-menu #tableMenu=\"matMenu\">\n @if (menu.insertTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.insertTable.disabled\"\n (click)=\"run($event, 'insertTable')\"\n i18n\n >Ins\u00E9rer un tableau\n </button>\n }\n @if (menu.deleteTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteTable.disabled\"\n (click)=\"run($event, 'deleteTable')\"\n i18n\n >Supprimer le tableau\n </button>\n }\n @if (menu.mergeCells) {\n <button mat-menu-item [disabled]=\"menu.mergeCells.disabled\" (click)=\"run($event, 'mergeCells')\" i18n\n >Fusionner les cellules\n </button>\n }\n @if (menu.splitCell) {\n <button mat-menu-item [disabled]=\"menu.splitCell.disabled\" (click)=\"run($event, 'splitCell')\" i18n\n >Scinder les cellules\n </button>\n }\n @if (menu.cellBackgroundColor) {\n <button\n mat-menu-item\n [disabled]=\"menu.cellBackgroundColor.disabled\"\n (click)=\"run($event, 'cellBackgroundColor')\"\n i18n\n >Couleur de fond...\n </button>\n }\n @if (menu.tableClass) {\n <button mat-menu-item [disabled]=\"menu.tableClass.disabled\" (click)=\"run($event, 'tableClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.tableId) {\n <button i18n mat-menu-item [disabled]=\"menu.tableId.disabled\" (click)=\"run($event, 'tableId')\"\n >ID...\n </button>\n }\n <mat-divider />\n @if (menu.addColumnBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnBefore.disabled\"\n (click)=\"run($event, 'addColumnBefore')\"\n i18n\n >Ins\u00E9rer une colonne avant\n </button>\n }\n @if (menu.addColumnAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnAfter.disabled\"\n (click)=\"run($event, 'addColumnAfter')\"\n i18n\n >Ins\u00E9rer une colonne apr\u00E8s\n </button>\n }\n @if (menu.deleteColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteColumn.disabled\"\n (click)=\"run($event, 'deleteColumn')\"\n i18n\n >Supprimer la colonne\n </button>\n }\n <mat-divider />\n @if (menu.addRowBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowBefore.disabled\"\n (click)=\"run($event, 'addRowBefore')\"\n i18n\n >Ins\u00E9rer une ligne avant\n </button>\n }\n @if (menu.addRowAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowAfter.disabled\"\n (click)=\"run($event, 'addRowAfter')\"\n i18n\n >Ins\u00E9rer une ligne apr\u00E8s\n </button>\n }\n @if (menu.deleteRow) {\n <button mat-menu-item [disabled]=\"menu.deleteRow.disabled\" (click)=\"run($event, 'deleteRow')\" i18n\n >Supprimer la ligne\n </button>\n }\n <mat-divider />\n @if (menu.toggleHeaderColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderColumn.disabled\"\n (click)=\"run($event, 'toggleHeaderColumn')\"\n i18n\n >Ent\u00EAte de colonne\n </button>\n }\n @if (menu.toggleHeaderRow) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderRow.disabled\"\n (click)=\"run($event, 'toggleHeaderRow')\"\n i18n\n >Ent\u00EAte de ligne\n </button>\n }\n @if (menu.toggleHeaderCell) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderCell.disabled\"\n (click)=\"run($event, 'toggleHeaderCell')\"\n i18n\n >Ent\u00EAte de cellule\n </button>\n }\n </mat-menu>\n @if (imageUploader) {\n <button\n mat-icon-button\n naturalFileDrop\n [selectable]=\"true\"\n [broadcast]=\"false\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer une image\"\n (fileChange)=\"upload($event)\"\n >\n <mat-icon fontIcon=\"insert_photo\" />\n </button>\n }\n @if (menu.alignLeft) {\n <mat-button-toggle-group hideSingleSelectionIndicator>\n @if (menu.alignLeft) {\n <mat-button-toggle\n [disabled]=\"menu.alignLeft.disabled\"\n [checked]=\"menu.alignLeft.active\"\n (click)=\"run($event, 'alignLeft')\"\n i18n-matTooltip\n matTooltip=\"Aligner gauche\"\n >\n <mat-icon fontIcon=\"format_align_left\" />\n </mat-button-toggle>\n }\n @if (menu.alignCenter) {\n <mat-button-toggle\n [disabled]=\"menu.alignCenter.disabled\"\n [checked]=\"menu.alignCenter.active\"\n (click)=\"run($event, 'alignCenter')\"\n i18n-matTooltip\n matTooltip=\"Centrer\"\n >\n <mat-icon fontIcon=\"format_align_center\" />\n </mat-button-toggle>\n }\n @if (menu.alignRight) {\n <mat-button-toggle\n [disabled]=\"menu.alignRight.disabled\"\n [checked]=\"menu.alignRight.active\"\n (click)=\"run($event, 'alignRight')\"\n i18n-matTooltip\n matTooltip=\"Aligner droite\"\n >\n <mat-icon fontIcon=\"format_align_right\" />\n </mat-button-toggle>\n }\n @if (menu.alignJustify) {\n <mat-button-toggle\n [disabled]=\"menu.alignJustify.disabled\"\n [checked]=\"menu.alignJustify.active\"\n (click)=\"run($event, 'alignJustify')\"\n i18n-matTooltip\n matTooltip=\"Justifier\"\n >\n <mat-icon fontIcon=\"format_align_justify\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n }\n @if (menu.undo) {\n <button\n mat-icon-button\n [disabled]=\"menu.undo.disabled\"\n (click)=\"run($event, 'undo')\"\n i18n-matTooltip\n matTooltip=\"Annuler\"\n >\n <mat-icon fontIcon=\"undo\" />\n </button>\n }\n @if (menu.redo) {\n <button\n mat-icon-button\n [disabled]=\"menu.redo.disabled\"\n (click)=\"run($event, 'redo')\"\n i18n-matTooltip\n matTooltip=\"Refaire\"\n >\n <mat-icon fontIcon=\"redo\" />\n </button>\n }\n @if (menu.wrapBulletList && menu.wrapBulletList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBulletList.disabled\"\n (click)=\"run($event, 'wrapBulletList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 puce\"\n >\n <mat-icon fontIcon=\"format_list_bulleted\" />\n </button>\n }\n @if (menu.wrapOrderedList && menu.wrapOrderedList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapOrderedList.disabled\"\n (click)=\"run($event, 'wrapOrderedList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 num\u00E9ro\"\n >\n <mat-icon fontIcon=\"format_list_numbered\" />\n </button>\n }\n @if (menu.wrapBlockQuote && menu.wrapBlockQuote.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBlockQuote.disabled\"\n (click)=\"run($event, 'wrapBlockQuote')\"\n i18n-matTooltip\n matTooltip=\"Citation\"\n >\n <mat-icon fontIcon=\"format_quote\" />\n </button>\n }\n @if (menu.joinUp && menu.joinUp.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.joinUp.disabled\"\n (click)=\"run($event, 'joinUp')\"\n i18n-matTooltip\n matTooltip=\"Fusionner avec l'\u00E9l\u00E9ment du haut\"\n >\n <mat-icon fontIcon=\"move_up\" />\n </button>\n }\n @if (menu.lift && menu.lift.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.lift.disabled\"\n (click)=\"run($event, 'lift')\"\n i18n-matTooltip\n matTooltip=\"D\u00E9sindenter\"\n >\n <mat-icon fontIcon=\"format_indent_decrease\" />\n </button>\n }\n @if (menu.selectParentNode && menu.selectParentNode.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.selectParentNode.disabled\"\n (click)=\"run($event, 'selectParentNode')\"\n i18n-matTooltip\n matTooltip=\"S\u00E9lectionner l'\u00E9l\u00E9ment parent\"\n >\n <mat-icon fontIcon=\"select_all\" />\n </button>\n }\n </div>\n </div>\n}\n<div class=\"editor-container\" #editor></div>\n", styles: [".menu{display:flex;flex-wrap:wrap;border-bottom:1px solid;padding:10px 18px}.menu-container{position:sticky;top:-20px;z-index:999}::ng-deep .ProseMirror{--padding-right: 8px;--padding-left: 14px;position:relative;outline:none;padding:4px var(--padding-right) 4px var(--padding-left);width:calc(100% - var(--padding-right) - var(--padding-left));line-height:1.2;word-wrap:break-word;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;white-space:pre-wrap}::ng-deep .ProseMirror pre{white-space:pre-wrap}::ng-deep .ProseMirror li{position:relative}::ng-deep .ProseMirror-hideselection *::selection{background:transparent}::ng-deep .ProseMirror-hideselection *::-moz-selection{background:transparent}::ng-deep .ProseMirror-hideselection{caret-color:transparent}::ng-deep .ProseMirror-selectednode{outline:2px solid #8cf}::ng-deep li.ProseMirror-selectednode{outline:none}::ng-deep li.ProseMirror-selectednode:after{position:absolute;inset:-2px -2px -2px -32px;border:2px solid #8cf;pointer-events:none;content:\"\"}::ng-deep .ProseMirror-gapcursor{display:none;position:absolute;pointer-events:none}::ng-deep .ProseMirror-gapcursor:after{display:block;position:absolute;top:-2px;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite;border-top:1px solid black;width:20px;content:\"\"}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}::ng-deep .ProseMirror-example-setup-style hr{margin:1em 0;border:none;padding:2px 10px}::ng-deep .ProseMirror-example-setup-style hr:after{display:block;background-color:silver;height:1px;content:\"\";line-height:2px}::ng-deep .ProseMirror ul,::ng-deep .ProseMirror ol{padding-left:30px}::ng-deep .ProseMirror blockquote{margin-right:0;margin-left:0;border-left:3px solid #eee;padding-left:1em}::ng-deep .ProseMirror-example-setup-style img{cursor:default}::ng-deep .ProseMirror p:first-child,::ng-deep .ProseMirror h1:first-child,::ng-deep .ProseMirror h2:first-child,::ng-deep .ProseMirror h3:first-child,::ng-deep .ProseMirror h4:first-child,::ng-deep .ProseMirror h5:first-child,::ng-deep .ProseMirror h6:first-child{margin-top:10px}::ng-deep .ProseMirror p{margin-bottom:1em}::ng-deep .ProseMirror .tableWrapper{overflow-x:auto}::ng-deep .ProseMirror table{border-collapse:collapse;width:100%;table-layout:fixed;overflow:hidden}::ng-deep .ProseMirror td,::ng-deep .ProseMirror th{position:relative;vertical-align:top;box-sizing:border-box}::ng-deep .ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;bottom:0;z-index:20;background-color:#adf;width:4px;pointer-events:none}::ng-deep .ProseMirror.resize-cursor{cursor:col-resize}::ng-deep .ProseMirror .selectedCell:after{position:absolute;inset:0;z-index:2;background:#c8c8ff66;pointer-events:none;content:\"\"}::ng-deep .ProseMirror table{margin:0}::ng-deep .ProseMirror th,::ng-deep .ProseMirror td{border:1px solid #ddd;padding:3px 5px;min-width:1em}::ng-deep .ProseMirror .tableWrapper{margin:1em 0}::ng-deep .ProseMirror th{font-weight:700;text-align:left}::ng-deep placeholder{display:block;animation:gradient 3s none infinite;background-size:500% 100%!important;width:50px;height:50px}@keyframes gradient{0%{background-position:100% 100%}to{background-position:0 0}}\n"] }]
|
|
228
|
-
}], ctorParameters: () => [], propDecorators: { editor: [{
|
|
229
|
-
type: ViewChild,
|
|
230
|
-
args: ['editor', { read: ElementRef, static: true }]
|
|
231
|
-
}], contentChange: [{
|
|
232
|
-
type: Output
|
|
233
|
-
}], imageUploader: [{
|
|
234
|
-
type: Input
|
|
235
|
-
}], save: [{
|
|
236
|
-
type: Output
|
|
237
|
-
}] } });
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2VkaXRvci9lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBUyxNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBZ0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFFLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxjQUFjLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFB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S0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQzt1R0F0TlEsc0JBQXNCOzJGQUF0QixzQkFBc0IsMFlBWnBCLENBQUMsV0FBVyxDQUFDLHVHQW9CSSxVQUFVLDJDQ3ZFMUMsK3FrQkFvYUEsd3dHRDlXUSxlQUFlLHdVQUNmLGdCQUFnQiw0VEFDaEIsYUFBYSxtTEFDYixxQkFBcUIsc29CQUNyQixhQUFhLDZ2QkFDYixnQkFBZ0IsbUlBQ2hCLHdCQUF3Qjs7MkZBR25CLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0ksZ0JBQWdCLGFBR2YsQ0FBQyxXQUFXLENBQUMsY0FDWixJQUFJLFdBQ1A7d0JBQ0wsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IscUJBQXFCO3dCQUNyQixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsd0JBQXdCO3FCQUMzQjt3REFVOEQsTUFBTTtzQkFBcEUsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRTNCLGFBQWE7c0JBQXRDLE1BQU07Z0JBUVMsYUFBYTtzQkFBNUIsS0FBSztnQkE0Qm9CLElBQUk7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtFZGl0b3JWaWV3fSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7RWRpdG9yU3RhdGUsIFBsdWdpbiwgVHJhbnNhY3Rpb259IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7RE9NUGFyc2VyLCBET01TZXJpYWxpemVyLCBTY2hlbWF9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7Z29Ub05leHRDZWxsLCB0YWJsZUVkaXRpbmd9IGZyb20gJ3Byb3NlbWlycm9yLXRhYmxlcyc7XG5pbXBvcnQge2tleW1hcH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7SW1hZ2VQbHVnaW4sIEltYWdlVXBsb2FkZXJ9IGZyb20gJy4uL3V0aWxzL2ltYWdlJztcbmltcG9ydCB7YWR2YW5jZWRTY2hlbWEsIGJhc2ljU2NoZW1hfSBmcm9tICcuLi91dGlscy9zY2hlbWEvc2NoZW1hJztcbmltcG9ydCB7YnVpbGRNZW51SXRlbXMsIEtleSwgTWVudUl0ZW1zfSBmcm9tICcuLi91dGlscy9tZW51JztcbmltcG9ydCB7aGlzdG9yeX0gZnJvbSAncHJvc2VtaXJyb3ItaGlzdG9yeSc7XG5pbXBvcnQge2Jhc2VLZXltYXB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7ZHJvcEN1cnNvcn0gZnJvbSAncHJvc2VtaXJyb3ItZHJvcGN1cnNvcic7XG5pbXBvcnQge2dhcEN1cnNvcn0gZnJvbSAncHJvc2VtaXJyb3ItZ2FwY3Vyc29yJztcbmltcG9ydCB7YnVpbGRJbnB1dFJ1bGVzfSBmcm9tICcuLi91dGlscy9pbnB1dHJ1bGVzJztcbmltcG9ydCB7YnVpbGRLZXltYXB9IGZyb20gJy4uL3V0aWxzL2tleW1hcCc7XG5pbXBvcnQge05hdHVyYWxGaWxlRHJvcERpcmVjdGl2ZX0gZnJvbSAnQGVjb2Rldi9uYXR1cmFsJztcbmltcG9ydCB7TWF0RGl2aWRlck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5pbXBvcnQge01hdE1lbnVNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHtNYXRCdXR0b25Ub2dnbGVNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0VG9vbHRpcE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQge01hdEJ1dHRvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcblxuLyoqXG4gKiBQcm9zZW1pcnJvciBjb21wb25lbnRcbiAqXG4gKiBVc2FnZSA6XG4gKlxuICogYGBgaHRtbFxuICogPG5hdHVyYWwtZWRpdG9yIFsobmdNb2RlbCldPVwiaHRtbFN0cmluZ1wiIC8+XG4gKiBgYGBcbiAqL1xuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmF0dXJhbC1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxuICAgIHByb3ZpZGVyczogW0ltYWdlUGx1Z2luXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgICAgIE1hdERpdmlkZXJNb2R1bGUsXG4gICAgICAgIE5hdHVyYWxGaWxlRHJvcERpcmVjdGl2ZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nQ29udHJvbCA9IGluamVjdChOZ0NvbnRyb2wsIHtvcHRpb25hbDogdHJ1ZSwgc2VsZjogdHJ1ZX0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbWFnZVBsdWdpbiA9IGluamVjdChJbWFnZVBsdWdpbik7XG5cbiAgICBwcml2YXRlIHZpZXc6IEVkaXRvclZpZXcgfCBudWxsID0gbnVsbDtcblxuICAgIEBWaWV3Q2hpbGQoJ2VkaXRvcicsIHtyZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWV9KSBwcml2YXRlIGVkaXRvciE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBjb250ZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byB1cGxvYWQgYW4gaW1hZ2UuXG4gICAgICpcbiAgICAgKiBJZiBnaXZlbiBpdCB3aWxsIGVuYWJsZSBhZHZhbmNlZCBzY2hlbWEsIGluY2x1ZGluZyBpbWFnZSBhbmQgdGFibGVzLlxuICAgICAqIEl0IG11c3QgYmUgZ2l2ZW4gb24gaW5pdGlhbGl6YXRpb24gYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIGxhdGVyIG9uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbWFnZVVwbG9hZGVyOiBJbWFnZVVwbG9hZGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBNb2RlIG11c3QgYmUgc2V0IG9uIGluaXRpYWxpemF0aW9uLiBMYXRlciBjaGFuZ2VzIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICpcbiAgICAgKiAtIGBiYXNpY2AsIHRoZSBkZWZhdWx0LCBvbmx5IG9mZmVycyBtaW5pbWFsIGZvcm1hdHRpbmcgb3B0aW9uc1xuICAgICAqIC0gYGFkdmFuY2VkYCwgYWRkcyB0ZXh0IGNvbG9ycywgaGVhZGluZ3MsIGFsaWdubWVudHMsIGFuZCB0YWJsZXMuICBJZiBgaW1hZ2VVcGxvYWRlcmAgaXMgZ2l2ZW4sIGl0IHdpbGwgZm9yY2UgYGFkdmFuY2VkYCBtb2RlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBtb2RlID0gaW5wdXQ8J2Jhc2ljJyB8ICdhZHZhbmNlZCc+KCdiYXNpYycpO1xuXG4gICAgcHJpdmF0ZSBzY2hlbWE6IFNjaGVtYSA9IGJhc2ljU2NoZW1hO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJmYWNlIHdpdGggQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgICAgKiBOb3RpZmllcyBwYXJlbnQgbW9kZWwgLyBmb3JtIGNvbnRyb2xsZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIG9uQ2hhbmdlPzogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSFRNTCBzdHJpbmdcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnRlbnQgPSAnJztcblxuICAgIHB1YmxpYyBtZW51OiBNZW51SXRlbXMgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIElmIHN1YnNjcmliZWQgdG8sIHRoZW4gdGhlIHNhdmUgYnV0dG9uIHdpbGwgYmUgc2hvd24gYW5kIGNsaWNrIGV2ZW50cyBmb3J3YXJkZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSB0aGlzLmltYWdlVXBsb2FkZXIgfHwgdGhpcy5tb2RlKCkgPT09ICdhZHZhbmNlZCcgPyBhZHZhbmNlZFNjaGVtYSA6IGJhc2ljU2NoZW1hO1xuICAgICAgICB0aGlzLm1lbnUgPSBidWlsZE1lbnVJdGVtcyh0aGlzLnNjaGVtYSwgdGhpcy5kaWFsb2cpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gRE9NU2VyaWFsaXplci5mcm9tU2NoZW1hKHRoaXMuc2NoZW1hKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNyZWF0ZVN0YXRlKCk7XG5cbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IEVkaXRvclZpZXcodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgZWRpdGFibGU6ICgpID0+ICF0aGlzLmRpc2FibGVkLFxuICAgICAgICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbjogKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy52aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlldy5zdGF0ZS5hcHBseSh0cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKG5ld1N0YXRlKTtcblxuICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBkb2MgaW50byBIVE1MIHN0cmluZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvbSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQodGhpcy52aWV3LnN0YXRlLmRvYyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdfJyk7XG4gICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZG9tKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBlbC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudCA9PT0gbmV3Q29udGVudCB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBlbC5pbm5lckhUTUw7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuY29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KHRoaXMuY29udGVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsICE9PSB0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudCA9IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZpZXcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jcmVhdGVTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU3RhdGUoKTogRWRpdG9yU3RhdGUge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnXycpO1xuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSAnPGRpdj4nICsgdGhpcy5jb250ZW50ICsgJzwvZGl2Pic7XG4gICAgICAgIGlmICghdGVtcGxhdGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGlsZCBvZiB0ZW1wbGF0ZSBlbGVtZW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZXIgPSBET01QYXJzZXIuZnJvbVNjaGVtYSh0aGlzLnNjaGVtYSk7XG4gICAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZSh0ZW1wbGF0ZS5maXJzdENoaWxkKTtcblxuICAgICAgICByZXR1cm4gRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgICAgIGRvYzogZG9jLFxuICAgICAgICAgICAgcGx1Z2luczogdGhpcy5jcmVhdGVQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUGx1Z2lucygpOiBQbHVnaW5bXSB7XG4gICAgICAgIGNvbnN0IGlzTWFjID0gISF0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL01hYy8pO1xuXG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbXG4gICAgICAgICAgICBidWlsZElucHV0UnVsZXModGhpcy5zY2hlbWEpLFxuICAgICAgICAgICAga2V5bWFwKGJ1aWxkS2V5bWFwKHRoaXMuc2NoZW1hLCBpc01hYykpLFxuICAgICAgICAgICAga2V5bWFwKGJhc2VLZXltYXApLFxuICAgICAgICAgICAgZHJvcEN1cnNvcigpLFxuICAgICAgICAgICAgZ2FwQ3Vyc29yKCksXG4gICAgICAgICAgICBoaXN0b3J5KCksXG4gICAgICAgICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7Y2xhc3M6ICdQcm9zZU1pcnJvci1leGFtcGxlLXNldHVwLXN0eWxlJ30sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFBsdWdpbih7XG4gICAgICAgICAgICAgICAgdmlldzogKCkgPT4gdGhpcyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlVXBsb2FkZXIpIHtcbiAgICAgICAgICAgIHBsdWdpbnMucHVzaCh0aGlzLmltYWdlUGx1Z2luLnBsdWdpbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zY2hlbWEgPT09IGFkdmFuY2VkU2NoZW1hKSB7XG4gICAgICAgICAgICBwbHVnaW5zLnB1c2goXG4gICAgICAgICAgICAgICAgdGFibGVFZGl0aW5nKCksXG4gICAgICAgICAgICAgICAga2V5bWFwKHtcbiAgICAgICAgICAgICAgICAgICAgVGFiOiBnb1RvTmV4dENlbGwoMSksXG4gICAgICAgICAgICAgICAgICAgICdTaGlmdC1UYWInOiBnb1RvTmV4dENlbGwoLTEpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwbHVnaW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBieSBQcm9zZW1pcnJvciB3aGVuZXZlciB0aGUgZWRpdG9yIHN0YXRlIGNoYW5nZXMuIFNvIHdlIHVwZGF0ZSBvdXIgbWVudSBzdGF0ZXMuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcgfHwgIXRoaXMubWVudSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIE9iamVjdC52YWx1ZXModGhpcy5tZW51KSkge1xuICAgICAgICAgICAgaXRlbS51cGRhdGUodGhpcy52aWV3LCB0aGlzLnZpZXcuc3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKCk6IHZvaWQge1xuICAgICAgICAvLyBub29wXG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJ1bihldmVudDogRXZlbnQsIGtleTogS2V5KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52aWV3IHx8ICF0aGlzLm1lbnUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1lbnVba2V5XTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IGl0ZW0uZGlzYWJsZWQgfHwgIWl0ZW0uc2hvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5zcGVjLnJ1bih0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCwgdGhpcy52aWV3LCBldmVudCk7XG4gICAgICAgIHRoaXMudmlldy5mb2N1cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWQoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlldyB8fCAhdGhpcy5pbWFnZVVwbG9hZGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZVBsdWdpbi5zdGFydEltYWdlVXBsb2FkKHRoaXMudmlldywgZmlsZSwgdGhpcy5pbWFnZVVwbG9hZGVyLCB0aGlzLnNjaGVtYSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZpZXcuZm9jdXMoKTtcbiAgICB9XG59XG4iLCJAaWYgKG1lbnUgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibWVudS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnVcIj5cbiAgICAgICAgICAgIEBpZiAoc2F2ZS5vYnNlcnZlZCkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzYXZlLmVtaXQoKVwiIGkxOG4tbWF0VG9vbHRpcCBtYXRUb29sdGlwPVwiRW5yZWdpc3RyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2F2ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgaGlkZU11bHRpcGxlU2VsZWN0aW9uSW5kaWNhdG9yIG11bHRpcGxlPlxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50b2dnbGVTdHJvbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVTdHJvbmcuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS50b2dnbGVTdHJvbmcuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndG9nZ2xlU3Ryb25nJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiR3Jhc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9ib2xkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudG9nZ2xlRW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS50b2dnbGVFbS5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVFbScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkl0YWxpcXVlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2l0YWxpY1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50b2dnbGVDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudG9nZ2xlQ29kZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LnRvZ2dsZUNvZGUuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndG9nZ2xlQ29kZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjb2RlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVMaW5rLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1lbnUudG9nZ2xlTGluay5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVMaW5rJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiSW5zw6lyZXIgdW4gbGllbi4uLlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImluc2VydF9saW5rXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRleHRDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnRleHRDb2xvci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LnRleHRDb2xvci5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0ZXh0Q29sb3InKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb3VsZXVyIGR1IHRleHRlLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2NvbG9yX3RleHRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImJsb2NrTWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGkxOG4+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJhcnJvd19kcm9wX2Rvd25cIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2Jsb2NrTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZVBhcmFncmFwaCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5tYWtlUGFyYWdyYXBoLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZVBhcmFncmFwaCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5QYXJhZ3JhcGhlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUNvZGVCbG9jaykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5tYWtlQ29kZUJsb2NrLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUNvZGVCbG9jaycpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5Db2RlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUhlYWQxKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5tYWtlSGVhZDEuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VIZWFkMScpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlRpdHJlIDFcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5tYWtlSGVhZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51Lm1ha2VIZWFkMi5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUhlYWQyJylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+VGl0cmUgMlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VIZWFkMykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUubWFrZUhlYWQzLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdtYWtlSGVhZDMnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5UaXRyZSAzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUhlYWQ0KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5tYWtlSGVhZDQuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VIZWFkNCcpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlRpdHJlIDRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5tYWtlSGVhZDUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51Lm1ha2VIZWFkNS5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUhlYWQ1JylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+VGl0cmUgNVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VIZWFkNikge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUubWFrZUhlYWQ2LmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdtYWtlSGVhZDYnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5UaXRyZSA2XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYmxvY2tDbGFzcyB8fCBtZW51LmJsb2NrSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5ibG9ja0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5ibG9ja0NsYXNzLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdibG9ja0NsYXNzJylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+Q2xhc3NlLi4uXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYmxvY2tJZCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGkxOG4gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5ibG9ja0lkLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdibG9ja0lkJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPklELi4uXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICBAaWYgKG1lbnUuYWRkQ29sdW1uQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0YWJsZU1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaTE4bj5UYWJsZWF1PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJhcnJvd19kcm9wX2Rvd25cIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPG1hdC1tZW51ICN0YWJsZU1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51Lmluc2VydFRhYmxlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnaW5zZXJ0VGFibGUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+SW5zw6lyZXIgdW4gdGFibGVhdVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmRlbGV0ZVRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmRlbGV0ZVRhYmxlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnZGVsZXRlVGFibGUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+U3VwcHJpbWVyIGxlIHRhYmxlYXVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5tZXJnZUNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5tZXJnZUNlbGxzLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdtZXJnZUNlbGxzJylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+RnVzaW9ubmVyIGxlcyBjZWxsdWxlc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnNwbGl0Q2VsbCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUuc3BsaXRDZWxsLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdzcGxpdENlbGwnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5TY2luZGVyIGxlcyBjZWxsdWxlc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmNlbGxCYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuY2VsbEJhY2tncm91bmRDb2xvci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2NlbGxCYWNrZ3JvdW5kQ29sb3InKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+Q291bGV1ciBkZSBmb25kLi4uXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUudGFibGVDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUudGFibGVDbGFzcy5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAndGFibGVDbGFzcycpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkNsYXNzZS4uLlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRhYmxlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpMThuIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUudGFibGVJZC5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAndGFibGVJZCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5JRC4uLlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmFkZENvbHVtbkJlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hZGRDb2x1bW5CZWZvcmUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhZGRDb2x1bW5CZWZvcmUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+SW5zw6lyZXIgdW5lIGNvbG9ubmUgYXZhbnRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5hZGRDb2x1bW5BZnRlcikge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hZGRDb2x1bW5BZnRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FkZENvbHVtbkFmdGVyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkluc8OpcmVyIHVuZSBjb2xvbm5lIGFwcsOoc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmRlbGV0ZUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5kZWxldGVDb2x1bW4uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdkZWxldGVDb2x1bW4nKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+U3VwcHJpbWVyIGxhIGNvbG9ubmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlciAvPlxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5hZGRSb3dCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWRkUm93QmVmb3JlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWRkUm93QmVmb3JlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkluc8OpcmVyIHVuZSBsaWduZSBhdmFudFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmFkZFJvd0FmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFkZFJvd0FmdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWRkUm93QWZ0ZXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+SW5zw6lyZXIgdW5lIGxpZ25lIGFwcsOoc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmRlbGV0ZVJvdykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUuZGVsZXRlUm93LmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdkZWxldGVSb3cnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5TdXBwcmltZXIgbGEgbGlnbmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlciAvPlxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50b2dnbGVIZWFkZXJDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudG9nZ2xlSGVhZGVyQ29sdW1uLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndG9nZ2xlSGVhZGVyQ29sdW1uJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkVudMOqdGUgZGUgY29sb25uZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUhlYWRlclJvdykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVIZWFkZXJSb3cuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVIZWFkZXJSb3cnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+RW50w6p0ZSBkZSBsaWduZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUhlYWRlckNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudG9nZ2xlSGVhZGVyQ2VsbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3RvZ2dsZUhlYWRlckNlbGwnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+RW50w6p0ZSBkZSBjZWxsdWxlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICBAaWYgKGltYWdlVXBsb2FkZXIpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBuYXR1cmFsRmlsZURyb3BcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFticm9hZGNhc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkluc8OpcmVyIHVuZSBpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIChmaWxlQ2hhbmdlKT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImluc2VydF9waG90b1wiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUuYWxpZ25MZWZ0KSB7XG4gICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIGhpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobWVudS5hbGlnbkxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFsaWduTGVmdC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS5hbGlnbkxlZnQuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FsaWduTGVmdCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQWxpZ25lciBnYXVjaGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9hbGlnbl9sZWZ0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZW51LmFsaWduQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hbGlnbkNlbnRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS5hbGlnbkNlbnRlci5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWxpZ25DZW50ZXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNlbnRyZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9hbGlnbl9jZW50ZXJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWxpZ25SaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWxpZ25SaWdodC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS5hbGlnblJpZ2h0LmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhbGlnblJpZ2h0JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBbGlnbmVyIGRyb2l0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2FsaWduX3JpZ2h0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZW51LmFsaWduSnVzdGlmeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWxpZ25KdXN0aWZ5LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LmFsaWduSnVzdGlmeS5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWxpZ25KdXN0aWZ5JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJKdXN0aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9hbGlnbl9qdXN0aWZ5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LnVuZG8pIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS51bmRvLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd1bmRvJylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFubnVsZXJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwidW5kb1wiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUucmVkbykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnJlZG8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3JlZG8nKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiUmVmYWlyZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJyZWRvXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS53cmFwQnVsbGV0TGlzdCAmJiBtZW51LndyYXBCdWxsZXRMaXN0LnNob3cpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS53cmFwQnVsbGV0TGlzdC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnd3JhcEJ1bGxldExpc3QnKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTGlzdGUgw6AgcHVjZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfbGlzdF9idWxsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUud3JhcE9yZGVyZWRMaXN0ICYmIG1lbnUud3JhcE9yZGVyZWRMaXN0LnNob3cpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS53cmFwT3JkZXJlZExpc3QuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3dyYXBPcmRlcmVkTGlzdCcpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJMaXN0ZSDDoCBudW3DqXJvXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9saXN0X251bWJlcmVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS53cmFwQmxvY2tRdW90ZSAmJiBtZW51LndyYXBCbG9ja1F1b3RlLnNob3cpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS53cmFwQmxvY2tRdW90ZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnd3JhcEJsb2NrUXVvdGUnKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ2l0YXRpb25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X3F1b3RlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS5qb2luVXAgJiYgbWVudS5qb2luVXAuc2hvdykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmpvaW5VcC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnam9pblVwJylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkZ1c2lvbm5lciBhdmVjIGwnw6lsw6ltZW50IGR1IGhhdXRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwibW92ZV91cFwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUubGlmdCAmJiBtZW51LmxpZnQuc2hvdykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmxpZnQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2xpZnQnKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRMOpc2luZGVudGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9pbmRlbnRfZGVjcmVhc2VcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LnNlbGVjdFBhcmVudE5vZGUgJiYgbWVudS5zZWxlY3RQYXJlbnROb2RlLnNob3cpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5zZWxlY3RQYXJlbnROb2RlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdzZWxlY3RQYXJlbnROb2RlJylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlPDqWxlY3Rpb25uZXIgbCfDqWzDqW1lbnQgcGFyZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cInNlbGVjdF9hbGxcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbn1cbjxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCIgI2VkaXRvcj48L2Rpdj5cbiJdfQ==
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Component, inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
|
3
|
-
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
-
import { ifValid } from '@ecodev/natural';
|
|
5
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
-
import { MatInputModule } from '@angular/material/input';
|
|
7
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/material/dialog";
|
|
10
|
-
import * as i2 from "@angular/forms";
|
|
11
|
-
import * as i3 from "@angular/material/form-field";
|
|
12
|
-
import * as i4 from "@angular/material/input";
|
|
13
|
-
import * as i5 from "@angular/material/button";
|
|
14
|
-
export class IdDialogComponent {
|
|
15
|
-
dialogRef = inject(MatDialogRef);
|
|
16
|
-
idControl = new FormControl('', {
|
|
17
|
-
validators: Validators.pattern(/(^(-?[_a-zA-Z]+[_a-zA-Z0-9-]*)+)/),
|
|
18
|
-
nonNullable: true,
|
|
19
|
-
});
|
|
20
|
-
form = new FormGroup({
|
|
21
|
-
id: this.idControl,
|
|
22
|
-
});
|
|
23
|
-
constructor() {
|
|
24
|
-
const data = inject(MAT_DIALOG_DATA);
|
|
25
|
-
this.form.setValue(data);
|
|
26
|
-
}
|
|
27
|
-
maybeConfirm() {
|
|
28
|
-
ifValid(this.form).subscribe(() => this.confirm());
|
|
29
|
-
}
|
|
30
|
-
confirm() {
|
|
31
|
-
this.dialogRef.close(this.form.getRawValue());
|
|
32
|
-
}
|
|
33
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: IdDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
34
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: IdDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<h2 i18n mat-dialog-title>Saisir le ID</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>ID</mat-label>\n <input matInput [formControl]=\"idControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n @if (idControl.hasError('pattern')) {\n <mat-error i18n>Doit \u00EAtre un ID valide</mat-error>\n }\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;width:70vw;max-width:30em}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
|
|
35
|
-
}
|
|
36
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: IdDialogComponent, decorators: [{
|
|
37
|
-
type: Component,
|
|
38
|
-
args: [{ standalone: true, imports: [MatDialogModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule], template: "<h2 i18n mat-dialog-title>Saisir le ID</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>ID</mat-label>\n <input matInput [formControl]=\"idControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n @if (idControl.hasError('pattern')) {\n <mat-error i18n>Doit \u00EAtre un ID valide</mat-error>\n }\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;width:70vw;max-width:30em}\n"] }]
|
|
39
|
-
}], ctorParameters: () => [] });
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvaWQtZGlhbG9nL2lkLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2lkLWRpYWxvZy9pZC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDeEYsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7O0FBb0JoRSxNQUFNLE9BQU8saUJBQWlCO0lBQ2xCLFNBQVMsR0FBRyxNQUFNLENBQWdELFlBQVksQ0FBQyxDQUFDO0lBRXhFLFNBQVMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUU7UUFDNUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUM7UUFDbEUsV0FBVyxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDO0lBQ2EsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDO1FBQ2pDLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUztLQUNyQixDQUFDLENBQUM7SUFFSDtRQUNJLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBZSxlQUFlLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sWUFBWTtRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7dUdBdkJRLGlCQUFpQjsyRkFBakIsaUJBQWlCLHdFQzFCOUIsdXFCQWdCQSxxSERRYyxlQUFlLCtuQkFBRSxXQUFXLGtqQkFBRSxtQkFBbUIsa1dBQUUsa0JBQWtCLHVZQUFFLGNBQWMsMFdBQUUsZUFBZTs7MkZBRXZHLGlCQUFpQjtrQkFON0IsU0FBUztpQ0FHTSxJQUFJLFdBQ1AsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgaW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7aWZWYWxpZH0gZnJvbSAnQGVjb2Rldi9uYXR1cmFsJztcbmltcG9ydCB7TWF0QnV0dG9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtNYXRJbnB1dE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuXG5leHBvcnQgdHlwZSBJZERpYWxvZ0RhdGEgPSB7XG4gICAgLyoqXG4gICAgICogSUQgbmFtZVxuICAgICAqXG4gICAgICogRWc6XG4gICAgICpcbiAgICAgKiAtIGBcIlwiYFxuICAgICAqIC0gYFwibXktaWRcImBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xufTtcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICcuL2lkLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2lkLWRpYWxvZy5jb21wb25lbnQuc2NzcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTWF0RGlhbG9nTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgSWREaWFsb2dDb21wb25lbnQge1xuICAgIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxJZERpYWxvZ0NvbXBvbmVudCwgSWREaWFsb2dEYXRhPj4oTWF0RGlhbG9nUmVmKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBpZENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHtcbiAgICAgICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5wYXR0ZXJuKC8oXigtP1tfYS16QS1aXStbX2EtekEtWjAtOS1dKikrKS8pLFxuICAgICAgICBub25OdWxsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICBpZDogdGhpcy5pZENvbnRyb2wsXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBpbmplY3Q8SWREaWFsb2dEYXRhPihNQVRfRElBTE9HX0RBVEEpO1xuXG4gICAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF5YmVDb25maXJtKCk6IHZvaWQge1xuICAgICAgICBpZlZhbGlkKHRoaXMuZm9ybSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY29uZmlybSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgICB9XG59XG4iLCI8aDIgaTE4biBtYXQtZGlhbG9nLXRpdGxlPlNhaXNpciBsZSBJRDwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsIGkxOG4+SUQ8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJpZENvbnRyb2xcIiAoa2V5ZG93bi5lbnRlcik9XCJtYXliZUNvbmZpcm0oKVwiIGNka0ZvY3VzSW5pdGlhbCAvPlxuICAgICAgICBAaWYgKGlkQ29udHJvbC5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICAgICAgICA8bWF0LWVycm9yIGkxOG4+RG9pdCDDqnRyZSB1biBJRCB2YWxpZGU8L21hdC1lcnJvcj5cbiAgICAgICAgfVxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGkxOG4+QW5udWxlcjwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJtYXliZUNvbmZpcm0oKVwiIFtkaXNhYmxlZF09XCIhZm9ybS52YWxpZFwiPjxzcGFuIGkxOG4+VmFsaWRlcjwvc3Bhbj48L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Component, inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
|
3
|
-
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
-
import { ifValid } from '@ecodev/natural';
|
|
5
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
-
import { MatInputModule } from '@angular/material/input';
|
|
7
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/material/dialog";
|
|
10
|
-
import * as i2 from "@angular/forms";
|
|
11
|
-
import * as i3 from "@angular/material/form-field";
|
|
12
|
-
import * as i4 from "@angular/material/input";
|
|
13
|
-
import * as i5 from "@angular/material/button";
|
|
14
|
-
export class LinkDialogComponent {
|
|
15
|
-
dialogRef = inject(MatDialogRef);
|
|
16
|
-
hrefControl = new FormControl('', { validators: Validators.required, nonNullable: true });
|
|
17
|
-
titleControl = new FormControl('', { nonNullable: true });
|
|
18
|
-
form = new FormGroup({
|
|
19
|
-
href: this.hrefControl,
|
|
20
|
-
title: this.titleControl,
|
|
21
|
-
});
|
|
22
|
-
constructor() {
|
|
23
|
-
const data = inject(MAT_DIALOG_DATA);
|
|
24
|
-
this.form.setValue({ title: '', ...data });
|
|
25
|
-
}
|
|
26
|
-
maybeConfirm() {
|
|
27
|
-
ifValid(this.form).subscribe(() => this.confirm());
|
|
28
|
-
}
|
|
29
|
-
confirm() {
|
|
30
|
-
this.dialogRef.close(this.form.getRawValue());
|
|
31
|
-
}
|
|
32
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: LinkDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
33
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: LinkDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<h2 i18n mat-dialog-title>Ins\u00E9rer un lien</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>URL</mat-label>\n <input matInput [formControl]=\"hrefControl\" (keydown.enter)=\"maybeConfirm()\" />\n @if (hrefControl.hasError('required')) {\n <mat-error i18n>Ce champ est requis</mat-error>\n }\n </mat-form-field>\n <mat-form-field>\n <mat-label i18n>Titre</mat-label>\n <input matInput [formControl]=\"titleControl\" (keydown.enter)=\"maybeConfirm()\" />\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;width:70vw;max-width:60em}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
|
|
34
|
-
}
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: LinkDialogComponent, decorators: [{
|
|
36
|
-
type: Component,
|
|
37
|
-
args: [{ standalone: true, imports: [MatDialogModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule], template: "<h2 i18n mat-dialog-title>Ins\u00E9rer un lien</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>URL</mat-label>\n <input matInput [formControl]=\"hrefControl\" (keydown.enter)=\"maybeConfirm()\" />\n @if (hrefControl.hasError('required')) {\n <mat-error i18n>Ce champ est requis</mat-error>\n }\n </mat-form-field>\n <mat-form-field>\n <mat-label i18n>Titre</mat-label>\n <input matInput [formControl]=\"titleControl\" (keydown.enter)=\"maybeConfirm()\" />\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;width:70vw;max-width:60em}\n"] }]
|
|
38
|
-
}], ctorParameters: () => [] });
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC1lZGl0b3Ivc3JjL2xpYi9saW5rLWRpYWxvZy9saW5rLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2xpbmstZGlhbG9nL2xpbmstZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7OztBQWFoRSxNQUFNLE9BQU8sbUJBQW1CO0lBQ3BCLFNBQVMsR0FBRyxNQUFNLENBQW9ELFlBQVksQ0FBQyxDQUFDO0lBRTVFLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUN4RixZQUFZLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDeEQsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDO1FBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVztRQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7S0FDM0IsQ0FBQyxDQUFDO0lBRUg7UUFDSSxNQUFNLElBQUksR0FBRyxNQUFNLENBQWlCLGVBQWUsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLFlBQVk7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO3VHQXRCUSxtQkFBbUI7MkZBQW5CLG1CQUFtQix3RUNuQmhDLG0xQkFvQkEscUhESGMsZUFBZSwrbkJBQUUsV0FBVyxrakJBQUUsbUJBQW1CLGtXQUFFLGtCQUFrQix1WUFBRSxjQUFjLDBXQUFFLGVBQWU7OzJGQUV2RyxtQkFBbUI7a0JBTi9CLFNBQVM7aUNBR00sSUFBSSxXQUNQLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIGluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lmVmFsaWR9IGZyb20gJ0BlY29kZXYvbmF0dXJhbCc7XG5pbXBvcnQge01hdEJ1dHRvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7TWF0SW5wdXRNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcblxuZXhwb3J0IHR5cGUgTGlua0RpYWxvZ0RhdGEgPSB7XG4gICAgaHJlZjogc3RyaW5nO1xuICAgIHRpdGxlPzogc3RyaW5nO1xufTtcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICcuL2xpbmstZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vbGluay1kaWFsb2cuY29tcG9uZW50LnNjc3MnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW01hdERpYWxvZ01vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIExpbmtEaWFsb2dDb21wb25lbnQge1xuICAgIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxMaW5rRGlhbG9nQ29tcG9uZW50LCBMaW5rRGlhbG9nRGF0YT4+KE1hdERpYWxvZ1JlZik7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgaHJlZkNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHt2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLCBub25OdWxsYWJsZTogdHJ1ZX0pO1xuICAgIHB1YmxpYyByZWFkb25seSB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHtub25OdWxsYWJsZTogdHJ1ZX0pO1xuICAgIHB1YmxpYyByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGhyZWY6IHRoaXMuaHJlZkNvbnRyb2wsXG4gICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlQ29udHJvbCxcbiAgICB9KTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGluamVjdDxMaW5rRGlhbG9nRGF0YT4oTUFUX0RJQUxPR19EQVRBKTtcblxuICAgICAgICB0aGlzLmZvcm0uc2V0VmFsdWUoe3RpdGxlOiAnJywgLi4uZGF0YX0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXliZUNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGlmVmFsaWQodGhpcy5mb3JtKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb25maXJtKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkpO1xuICAgIH1cbn1cbiIsIjxoMiBpMThuIG1hdC1kaWFsb2ctdGl0bGU+SW5zw6lyZXIgdW4gbGllbjwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsIGkxOG4+VVJMPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiaHJlZkNvbnRyb2xcIiAoa2V5ZG93bi5lbnRlcik9XCJtYXliZUNvbmZpcm0oKVwiIC8+XG4gICAgICAgIEBpZiAoaHJlZkNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgaTE4bj5DZSBjaGFtcCBlc3QgcmVxdWlzPC9tYXQtZXJyb3I+XG4gICAgICAgIH1cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1sYWJlbCBpMThuPlRpdHJlPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidGl0bGVDb250cm9sXCIgKGtleWRvd24uZW50ZXIpPVwibWF5YmVDb25maXJtKClcIiAvPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGkxOG4+QW5udWxlcjwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJtYXliZUNvbmZpcm0oKVwiIFtkaXNhYmxlZF09XCIhZm9ybS52YWxpZFwiPjxzcGFuIGkxOG4+VmFsaWRlcjwvc3Bhbj48L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19
|