@flogeez/angular-tiptap-editor 2.3.0 → 2.4.1
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/CHANGELOG.md +23 -0
- package/README.md +132 -93
- package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
- package/esm2022/lib/ate-editor.provider.mjs +38 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +133 -0
- package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
- package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +226 -0
- package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
- package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +121 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +266 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +294 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +122 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +953 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +329 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +90 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +31 -0
- package/esm2022/lib/config/ate-editor.config.mjs +76 -0
- package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
- package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
- package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
- package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +270 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +29 -0
- package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
- package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
- package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
- package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
- package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
- package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
- package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
- package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
- package/esm2022/lib/models/ate-bubble-menu.model.mjs +49 -0
- package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
- package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
- package/esm2022/lib/models/ate-image.model.mjs +2 -0
- package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
- package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
- package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
- package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
- package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
- package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
- package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
- package/esm2022/lib/services/ate-color-picker.service.mjs +193 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +465 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +410 -0
- package/esm2022/lib/services/ate-image.service.mjs +368 -0
- package/esm2022/lib/services/ate-link.service.mjs +97 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/public-api.mjs +93 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +1178 -1100
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1562
- package/lib/ate-editor.provider.d.ts +21 -0
- package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
- package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
- package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
- package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +52 -0
- package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
- package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +12 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +24 -0
- package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
- package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
- package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +235 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +43 -0
- package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
- package/lib/components/ui/ate-button.component.d.ts +25 -0
- package/lib/components/ui/ate-separator.component.d.ts +7 -0
- package/lib/config/ate-editor.config.d.ts +7 -0
- package/lib/config/ate-global-config.token.d.ts +6 -0
- package/lib/config/ate-slash-commands.config.d.ts +41 -0
- package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
- package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
- package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
- package/lib/extensions/ate-table.extension.d.ts +2 -0
- package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
- package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
- package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
- package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
- package/lib/models/ate-bubble-menu.model.d.ts +33 -0
- package/lib/models/ate-editor-config.model.d.ts +100 -0
- package/lib/models/ate-editor-state.model.d.ts +109 -0
- package/lib/models/ate-image.model.d.ts +104 -0
- package/lib/models/ate-toolbar.model.d.ts +18 -0
- package/lib/node-view/ate-angular-node-view.d.ts +115 -0
- package/lib/node-view/ate-injector.registry.d.ts +3 -0
- package/lib/node-view/ate-node-view.factory.d.ts +10 -0
- package/lib/node-view/ate-node-view.models.d.ts +138 -0
- package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
- package/lib/node-view/ate-register-angular-component.d.ts +35 -0
- package/lib/services/ate-color-picker.service.d.ts +65 -0
- package/lib/services/ate-editor-commands.service.d.ts +72 -0
- package/lib/services/ate-i18n.service.d.ts +394 -0
- package/lib/services/ate-image.service.d.ts +71 -0
- package/lib/services/ate-link.service.d.ts +42 -0
- package/lib/utils/ate-color.utils.d.ts +12 -0
- package/package.json +3 -1
- package/public-api.d.ts +112 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { Component, input, viewChild, effect, computed, inject, signal, ChangeDetectionStrategy, } from "@angular/core";
|
|
2
|
+
import tippy, { sticky } from "tippy.js";
|
|
3
|
+
import { AteI18nService } from "../../services/ate-i18n.service";
|
|
4
|
+
import { AteEditorCommandsService } from "../../services/ate-editor-commands.service";
|
|
5
|
+
import { createDefaultSlashCommands } from "../../config/ate-slash-commands.config";
|
|
6
|
+
import { Plugin, PluginKey } from "@tiptap/pm/state";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
// Default command definitions are now centralized in src/lib/config/slash-commands.config.ts
|
|
9
|
+
export class AteSlashCommandsComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.i18nService = inject(AteI18nService);
|
|
12
|
+
this.editor = input.required();
|
|
13
|
+
this.config = input(undefined);
|
|
14
|
+
this.menuRef = viewChild.required("menuRef");
|
|
15
|
+
this.tippyInstance = null;
|
|
16
|
+
this.editorCommands = inject(AteEditorCommandsService);
|
|
17
|
+
// Local state
|
|
18
|
+
this.isActive = false;
|
|
19
|
+
this.currentQuery = signal("");
|
|
20
|
+
this.slashRange = null;
|
|
21
|
+
// Signal for selected index
|
|
22
|
+
this.selectedIndex = signal(0);
|
|
23
|
+
// Toolbar interaction state (from centralized service)
|
|
24
|
+
this.isToolbarInteracting = this.editorCommands.isToolbarInteracting;
|
|
25
|
+
this.commands = computed(() => {
|
|
26
|
+
const config = this.config();
|
|
27
|
+
if (config && config.commands) {
|
|
28
|
+
return config.commands;
|
|
29
|
+
}
|
|
30
|
+
// Fallback to default native commands
|
|
31
|
+
return createDefaultSlashCommands(this.i18nService, this.editorCommands);
|
|
32
|
+
});
|
|
33
|
+
this.filteredCommands = computed(() => {
|
|
34
|
+
const query = this.currentQuery().toLowerCase();
|
|
35
|
+
const commands = this.commands();
|
|
36
|
+
if (!query) {
|
|
37
|
+
return commands;
|
|
38
|
+
}
|
|
39
|
+
return commands.filter(command => command.title.toLowerCase().includes(query) ||
|
|
40
|
+
command.description.toLowerCase().includes(query) ||
|
|
41
|
+
command.keywords.some(keyword => keyword.toLowerCase().includes(query)));
|
|
42
|
+
});
|
|
43
|
+
this.updateMenu = () => {
|
|
44
|
+
const ed = this.editor();
|
|
45
|
+
if (!ed) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const { from } = ed.state.selection;
|
|
49
|
+
// Check if '/' was typed at the beginning of a line or after a space
|
|
50
|
+
const textBefore = ed.state.doc.textBetween(Math.max(0, from - 20), from, "\n");
|
|
51
|
+
const slashMatch = textBefore.match(/(?:^|\s)\/([^/\s]*)$/);
|
|
52
|
+
if (slashMatch) {
|
|
53
|
+
const query = slashMatch[1] || "";
|
|
54
|
+
const wasActive = this.isActive;
|
|
55
|
+
this.currentQuery.set(query);
|
|
56
|
+
this.slashRange = {
|
|
57
|
+
from: from - slashMatch[0].length + slashMatch[0].indexOf("/"),
|
|
58
|
+
to: from,
|
|
59
|
+
};
|
|
60
|
+
// Reset index if menu just became active
|
|
61
|
+
if (!wasActive) {
|
|
62
|
+
this.selectedIndex.set(0);
|
|
63
|
+
}
|
|
64
|
+
this.isActive = true;
|
|
65
|
+
if (this.isToolbarInteracting()) {
|
|
66
|
+
this.hideTippy();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this.showTippy();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.isActive = false;
|
|
74
|
+
this.hideTippy();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
this.handleBlur = () => {
|
|
78
|
+
setTimeout(() => this.hideTippy(), 100);
|
|
79
|
+
};
|
|
80
|
+
effect(() => {
|
|
81
|
+
const ed = this.editor();
|
|
82
|
+
if (!ed) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Clean up old listeners
|
|
86
|
+
ed.off("selectionUpdate", this.updateMenu);
|
|
87
|
+
ed.off("transaction", this.updateMenu);
|
|
88
|
+
ed.off("focus", this.updateMenu);
|
|
89
|
+
ed.off("blur", this.handleBlur);
|
|
90
|
+
// Add new listeners
|
|
91
|
+
ed.on("selectionUpdate", this.updateMenu);
|
|
92
|
+
ed.on("transaction", this.updateMenu);
|
|
93
|
+
ed.on("focus", this.updateMenu);
|
|
94
|
+
ed.on("blur", this.handleBlur);
|
|
95
|
+
// Use ProseMirror plugin system to intercept keys
|
|
96
|
+
this.addKeyboardPlugin(ed);
|
|
97
|
+
// updateMenu() will be called automatically when editor is ready
|
|
98
|
+
}, { allowSignalWrites: true });
|
|
99
|
+
}
|
|
100
|
+
ngOnInit() {
|
|
101
|
+
this.initTippy();
|
|
102
|
+
}
|
|
103
|
+
ngOnDestroy() {
|
|
104
|
+
const ed = this.editor();
|
|
105
|
+
if (ed) {
|
|
106
|
+
ed.off("selectionUpdate", this.updateMenu);
|
|
107
|
+
ed.off("transaction", this.updateMenu);
|
|
108
|
+
ed.off("focus", this.updateMenu);
|
|
109
|
+
ed.off("blur", this.handleBlur);
|
|
110
|
+
}
|
|
111
|
+
if (this.tippyInstance) {
|
|
112
|
+
this.tippyInstance.destroy();
|
|
113
|
+
this.tippyInstance = null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
initTippy() {
|
|
117
|
+
if (!this.menuRef()?.nativeElement) {
|
|
118
|
+
setTimeout(() => this.initTippy(), 50);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const menuElement = this.menuRef().nativeElement;
|
|
122
|
+
if (this.tippyInstance) {
|
|
123
|
+
this.tippyInstance.destroy();
|
|
124
|
+
}
|
|
125
|
+
this.tippyInstance = tippy(document.body, {
|
|
126
|
+
content: menuElement,
|
|
127
|
+
trigger: "manual",
|
|
128
|
+
placement: "bottom-start",
|
|
129
|
+
theme: "slash-menu",
|
|
130
|
+
appendTo: _ref => {
|
|
131
|
+
// Always try to climb up to editor host to inherit CSS variables
|
|
132
|
+
const host = this.editor().options.element.closest("angular-tiptap-editor");
|
|
133
|
+
return host || document.body;
|
|
134
|
+
},
|
|
135
|
+
interactive: true,
|
|
136
|
+
arrow: false,
|
|
137
|
+
offset: [0, 8],
|
|
138
|
+
hideOnClick: true,
|
|
139
|
+
plugins: [sticky],
|
|
140
|
+
sticky: false,
|
|
141
|
+
getReferenceClientRect: () => this.getSlashRect(),
|
|
142
|
+
// Improve positioning with scroll
|
|
143
|
+
popperOptions: {
|
|
144
|
+
modifiers: [
|
|
145
|
+
{
|
|
146
|
+
name: "preventOverflow",
|
|
147
|
+
options: {
|
|
148
|
+
boundary: this.editor().options.element,
|
|
149
|
+
padding: 8,
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "flip",
|
|
154
|
+
options: {
|
|
155
|
+
fallbackPlacements: ["top-start", "bottom-end", "top-end"],
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: "hide",
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
// Initial check after Tippy is initialized
|
|
165
|
+
this.updateMenu();
|
|
166
|
+
}
|
|
167
|
+
getSlashRect() {
|
|
168
|
+
const ed = this.editor();
|
|
169
|
+
if (!ed || !this.slashRange) {
|
|
170
|
+
return new DOMRect(-9999, -9999, 0, 0);
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
// Use ProseMirror coordinates for better precision
|
|
174
|
+
const coords = ed.view.coordsAtPos(this.slashRange.from);
|
|
175
|
+
return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.warn("Error calculating coordinates:", error);
|
|
179
|
+
// Fallback to window.getSelection
|
|
180
|
+
const selection = window.getSelection();
|
|
181
|
+
if (!selection || selection.rangeCount === 0) {
|
|
182
|
+
return new DOMRect(-9999, -9999, 0, 0);
|
|
183
|
+
}
|
|
184
|
+
const range = selection.getRangeAt(0);
|
|
185
|
+
return range.getBoundingClientRect();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
scrollToSelected() {
|
|
189
|
+
// Scroll to the selected element
|
|
190
|
+
const menuEl = this.menuRef()?.nativeElement;
|
|
191
|
+
if (menuEl) {
|
|
192
|
+
const selectedItem = menuEl.querySelector(".slash-command-item.selected");
|
|
193
|
+
if (selectedItem) {
|
|
194
|
+
selectedItem.scrollIntoView({ block: "nearest", behavior: "smooth" });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
showTippy() {
|
|
199
|
+
if (this.tippyInstance && this.filteredCommands().length > 0) {
|
|
200
|
+
this.tippyInstance.setProps({ sticky: "reference" });
|
|
201
|
+
this.tippyInstance.show();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
hideTippy() {
|
|
205
|
+
if (this.tippyInstance) {
|
|
206
|
+
this.tippyInstance.setProps({ sticky: false });
|
|
207
|
+
this.tippyInstance.hide();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
executeCommand(command) {
|
|
211
|
+
const ed = this.editor();
|
|
212
|
+
if (!ed || !this.slashRange) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
// Remove slash text ("/")
|
|
216
|
+
const { tr } = ed.state;
|
|
217
|
+
tr.delete(this.slashRange.from, this.slashRange.to);
|
|
218
|
+
ed.view.dispatch(tr);
|
|
219
|
+
// Hide menu immediately
|
|
220
|
+
this.hideTippy();
|
|
221
|
+
this.isActive = false;
|
|
222
|
+
// Give focus back to editor and execute command
|
|
223
|
+
// Use a micro-delay to ensure ProseMirror DOM is stable after removing "/"
|
|
224
|
+
setTimeout(() => {
|
|
225
|
+
ed.commands.focus();
|
|
226
|
+
command.command(ed);
|
|
227
|
+
}, 10);
|
|
228
|
+
}
|
|
229
|
+
addKeyboardPlugin(ed) {
|
|
230
|
+
// Add a ProseMirror plugin to intercept keyboard events
|
|
231
|
+
const keyboardPlugin = new Plugin({
|
|
232
|
+
key: new PluginKey("slash-commands-keyboard"),
|
|
233
|
+
props: {
|
|
234
|
+
handleKeyDown: (view, event) => {
|
|
235
|
+
// Only handle if menu is active
|
|
236
|
+
if (!this.isActive || this.filteredCommands().length === 0) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
switch (event.key) {
|
|
240
|
+
case "ArrowDown": {
|
|
241
|
+
event.preventDefault();
|
|
242
|
+
const nextIndex = (this.selectedIndex() + 1) % this.filteredCommands().length;
|
|
243
|
+
this.selectedIndex.set(nextIndex);
|
|
244
|
+
this.scrollToSelected();
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
case "ArrowUp": {
|
|
248
|
+
event.preventDefault();
|
|
249
|
+
const prevIndex = this.selectedIndex() === 0
|
|
250
|
+
? this.filteredCommands().length - 1
|
|
251
|
+
: this.selectedIndex() - 1;
|
|
252
|
+
this.selectedIndex.set(prevIndex);
|
|
253
|
+
this.scrollToSelected();
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
case "Enter": {
|
|
257
|
+
event.preventDefault();
|
|
258
|
+
const selectedCommand = this.filteredCommands()[this.selectedIndex()];
|
|
259
|
+
if (selectedCommand) {
|
|
260
|
+
this.executeCommand(selectedCommand);
|
|
261
|
+
}
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
case "Escape": {
|
|
265
|
+
event.preventDefault();
|
|
266
|
+
this.isActive = false;
|
|
267
|
+
this.hideTippy();
|
|
268
|
+
// Remove typed "/"
|
|
269
|
+
if (this.slashRange) {
|
|
270
|
+
const { tr } = view.state;
|
|
271
|
+
tr.delete(this.slashRange.from, this.slashRange.to);
|
|
272
|
+
view.dispatch(tr);
|
|
273
|
+
}
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return false;
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
// Add plugin to editor
|
|
282
|
+
ed.view.updateState(ed.view.state.reconfigure({
|
|
283
|
+
plugins: [keyboardPlugin, ...ed.view.state.plugins],
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteSlashCommandsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
287
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteSlashCommandsComponent, isStandalone: true, selector: "ate-slash-commands", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "menuRef", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
288
|
+
<div #menuRef class="slash-commands-menu">
|
|
289
|
+
@for (command of filteredCommands(); track command.title) {
|
|
290
|
+
<div
|
|
291
|
+
class="slash-command-item"
|
|
292
|
+
[class.selected]="$index === selectedIndex()"
|
|
293
|
+
(mousedown)="executeCommand(command); $event.preventDefault(); $event.stopPropagation()"
|
|
294
|
+
(mouseenter)="selectedIndex.set($index)">
|
|
295
|
+
<div class="slash-command-icon">
|
|
296
|
+
<span class="material-symbols-outlined">{{ command.icon }}</span>
|
|
297
|
+
</div>
|
|
298
|
+
<div class="slash-command-content">
|
|
299
|
+
<div class="slash-command-title">{{ command.title }}</div>
|
|
300
|
+
<div class="slash-command-description">{{ command.description }}</div>
|
|
301
|
+
</div>
|
|
302
|
+
</div>
|
|
303
|
+
}
|
|
304
|
+
</div>
|
|
305
|
+
`, isInline: true, styles: [".slash-commands-menu{background:var(--ate-menu-bg);border:1px solid var(--ate-menu-border);border-radius:var(--ate-menu-border-radius, 12px);box-shadow:var(--ate-menu-shadow);padding:var(--ate-menu-padding);max-height:320px;overflow-y:auto;min-width:280px;outline:none;animation:slashMenuFadeIn .2s cubic-bezier(0,0,.2,1);scrollbar-width:thin;scrollbar-color:var(--ate-scrollbar-thumb) var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar{width:var(--ate-scrollbar-width)}.slash-commands-menu::-webkit-scrollbar-track{background:var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar-thumb{background:var(--ate-scrollbar-thumb);border:3px solid transparent;background-clip:content-box;border-radius:10px}.slash-commands-menu::-webkit-scrollbar-thumb:hover{background:var(--ate-scrollbar-thumb-hover);background-clip:content-box}@keyframes slashMenuFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.slash-command-item{display:flex;align-items:center;gap:12px;padding:var(--ate-menu-padding);border-radius:var(--ate-menu-border-radius, 8px);cursor:pointer;transition:all .15s ease;border:var(--ate-border-width, 1px) solid transparent;outline:none;margin-bottom:2px}.slash-command-item:last-child{margin-bottom:0}.slash-command-item:hover{background:var(--ate-surface-secondary)}.slash-command-item.selected{background:var(--ate-primary-light);border-color:var(--ate-primary-light-alpha)}.slash-command-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--ate-surface-tertiary);border-radius:var(--ate-sub-border-radius, 8px);color:var(--ate-primary);flex-shrink:0;transition:all .15s ease}.slash-command-item.selected .slash-command-icon{background:var(--ate-primary);color:var(--ate-primary-contrast, #ffffff)}.slash-command-icon .material-symbols-outlined{font-size:18px}.slash-command-content{flex:1;min-width:0}.slash-command-title{font-weight:500;color:var(--ate-text);font-size:14px;margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.slash-command-description{color:var(--ate-text-secondary);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
306
|
+
}
|
|
307
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteSlashCommandsComponent, decorators: [{
|
|
308
|
+
type: Component,
|
|
309
|
+
args: [{ selector: "ate-slash-commands", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
310
|
+
<div #menuRef class="slash-commands-menu">
|
|
311
|
+
@for (command of filteredCommands(); track command.title) {
|
|
312
|
+
<div
|
|
313
|
+
class="slash-command-item"
|
|
314
|
+
[class.selected]="$index === selectedIndex()"
|
|
315
|
+
(mousedown)="executeCommand(command); $event.preventDefault(); $event.stopPropagation()"
|
|
316
|
+
(mouseenter)="selectedIndex.set($index)">
|
|
317
|
+
<div class="slash-command-icon">
|
|
318
|
+
<span class="material-symbols-outlined">{{ command.icon }}</span>
|
|
319
|
+
</div>
|
|
320
|
+
<div class="slash-command-content">
|
|
321
|
+
<div class="slash-command-title">{{ command.title }}</div>
|
|
322
|
+
<div class="slash-command-description">{{ command.description }}</div>
|
|
323
|
+
</div>
|
|
324
|
+
</div>
|
|
325
|
+
}
|
|
326
|
+
</div>
|
|
327
|
+
`, styles: [".slash-commands-menu{background:var(--ate-menu-bg);border:1px solid var(--ate-menu-border);border-radius:var(--ate-menu-border-radius, 12px);box-shadow:var(--ate-menu-shadow);padding:var(--ate-menu-padding);max-height:320px;overflow-y:auto;min-width:280px;outline:none;animation:slashMenuFadeIn .2s cubic-bezier(0,0,.2,1);scrollbar-width:thin;scrollbar-color:var(--ate-scrollbar-thumb) var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar{width:var(--ate-scrollbar-width)}.slash-commands-menu::-webkit-scrollbar-track{background:var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar-thumb{background:var(--ate-scrollbar-thumb);border:3px solid transparent;background-clip:content-box;border-radius:10px}.slash-commands-menu::-webkit-scrollbar-thumb:hover{background:var(--ate-scrollbar-thumb-hover);background-clip:content-box}@keyframes slashMenuFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.slash-command-item{display:flex;align-items:center;gap:12px;padding:var(--ate-menu-padding);border-radius:var(--ate-menu-border-radius, 8px);cursor:pointer;transition:all .15s ease;border:var(--ate-border-width, 1px) solid transparent;outline:none;margin-bottom:2px}.slash-command-item:last-child{margin-bottom:0}.slash-command-item:hover{background:var(--ate-surface-secondary)}.slash-command-item.selected{background:var(--ate-primary-light);border-color:var(--ate-primary-light-alpha)}.slash-command-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--ate-surface-tertiary);border-radius:var(--ate-sub-border-radius, 8px);color:var(--ate-primary);flex-shrink:0;transition:all .15s ease}.slash-command-item.selected .slash-command-icon{background:var(--ate-primary);color:var(--ate-primary-contrast, #ffffff)}.slash-command-icon .material-symbols-outlined{font-size:18px}.slash-command-content{flex:1;min-width:0}.slash-command-title{font-weight:500;color:var(--ate-text);font-size:14px;margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.slash-command-description{color:var(--ate-text-secondary);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
|
|
328
|
+
}], ctorParameters: () => [] });
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLXNsYXNoLWNvbW1hbmRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvbGliL2NvbXBvbmVudHMvc2xhc2gtY29tbWFuZHMvYXRlLXNsYXNoLWNvbW1hbmRzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBSVQsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLHVCQUF1QixHQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssRUFBRSxFQUE2QixNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBZXJELDZGQUE2RjtBQWtKN0YsTUFBTSxPQUFPLHlCQUF5QjtJQStDcEM7UUE5Q1MsZ0JBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsV0FBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUNsQyxXQUFNLEdBQUcsS0FBSyxDQUFxQyxTQUFTLENBQUMsQ0FBQztRQUU5RCxZQUFPLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsU0FBUyxDQUFDLENBQUM7UUFFNUQsa0JBQWEsR0FBeUIsSUFBSSxDQUFDO1FBQzNDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFMUQsY0FBYztRQUNOLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsZUFBVSxHQUF3QyxJQUFJLENBQUM7UUFFL0QsNEJBQTRCO1FBQzVCLGtCQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFCLHVEQUF1RDtRQUN0Qyx5QkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDO1FBRWpGLGFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUN6QixDQUFDO1lBRUQsc0NBQXNDO1lBQ3RDLE9BQU8sMEJBQTBCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxxQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFakMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFFRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQ3BCLE9BQU8sQ0FBQyxFQUFFLENBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMzQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMxRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUE2SEgsZUFBVSxHQUFHLEdBQUcsRUFBRTtZQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNSLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBRXBDLHFFQUFxRTtZQUNyRSxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFFNUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUVoQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRztvQkFDaEIsSUFBSSxFQUFFLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO29CQUM5RCxFQUFFLEVBQUUsSUFBSTtpQkFDVCxDQUFDO2dCQUVGLHlDQUF5QztnQkFDekMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixDQUFDO2dCQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUVyQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDO1FBcEtBLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNSLE9BQU87WUFDVCxDQUFDO1lBRUQseUJBQXlCO1lBQ3pCLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2QyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWhDLG9CQUFvQjtZQUNwQixFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQyxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUvQixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRTNCLGlFQUFpRTtRQUNuRSxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxFQUFFLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ25DLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEMsT0FBTyxFQUFFLFdBQVc7WUFDcEIsT0FBTyxFQUFFLFFBQVE7WUFDakIsU0FBUyxFQUFFLGNBQWM7WUFDekIsS0FBSyxFQUFFLFlBQVk7WUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLGlFQUFpRTtnQkFDakUsTUFBTSxJQUFJLEdBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUF1QixDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUM3RixPQUFPLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQy9CLENBQUM7WUFDRCxXQUFXLEVBQUUsSUFBSTtZQUNqQixLQUFLLEVBQUUsS0FBSztZQUNaLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsTUFBTSxFQUFFLEtBQUs7WUFDYixzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pELGtDQUFrQztZQUNsQyxhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFO29CQUNUO3dCQUNFLElBQUksRUFBRSxpQkFBaUI7d0JBQ3ZCLE9BQU8sRUFBRTs0QkFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPOzRCQUN2QyxPQUFPLEVBQUUsQ0FBQzt5QkFDWDtxQkFDRjtvQkFDRDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixPQUFPLEVBQUU7NEJBQ1Asa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQzt5QkFDM0Q7cUJBQ0Y7b0JBQ0Q7d0JBQ0UsSUFBSSxFQUFFLE1BQU07cUJBQ2I7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILDJDQUEyQztRQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVPLFlBQVk7UUFDbEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILG1EQUFtRDtZQUNuRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pELE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsa0NBQWtDO1lBQ2xDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUE4Q08sZ0JBQWdCO1FBQ3RCLGlDQUFpQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsYUFBYSxDQUFDO1FBQzdDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFnQixDQUFDO1lBQ3pGLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsT0FBNEI7UUFDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUIsT0FBTztRQUNULENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDeEIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXJCLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsZ0RBQWdEO1FBQ2hELDJFQUEyRTtRQUMzRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxFQUFVO1FBQ2xDLHdEQUF3RDtRQUN4RCxNQUFNLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQztZQUNoQyxHQUFHLEVBQUUsSUFBSSxTQUFTLENBQUMseUJBQXlCLENBQUM7WUFDN0MsS0FBSyxFQUFFO2dCQUNMLGFBQWEsRUFBRSxDQUFDLElBQWdCLEVBQUUsS0FBb0IsRUFBRSxFQUFFO29CQUN4RCxnQ0FBZ0M7b0JBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0QsT0FBTyxLQUFLLENBQUM7b0JBQ2YsQ0FBQztvQkFFRCxRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEIsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDOzRCQUNqQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ3ZCLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQzs0QkFDOUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOzRCQUN4QixPQUFPLElBQUksQ0FBQzt3QkFDZCxDQUFDO3dCQUNELEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQzs0QkFDZixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ3ZCLE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDO2dDQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7Z0NBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7NEJBQ3hCLE9BQU8sSUFBSSxDQUFDO3dCQUNkLENBQUM7d0JBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDOzRCQUNiLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzs0QkFDdkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7NEJBQ3RFLElBQUksZUFBZSxFQUFFLENBQUM7Z0NBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7NEJBQ3ZDLENBQUM7NEJBQ0QsT0FBTyxJQUFJLENBQUM7d0JBQ2QsQ0FBQzt3QkFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7NEJBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDOzRCQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNqQixtQkFBbUI7NEJBQ25CLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dDQUNwQixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQ0FDMUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNwQixDQUFDOzRCQUNELE9BQU8sSUFBSSxDQUFDO3dCQUNkLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCx1QkFBdUI7UUFDdkIsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQ2pCLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUN4QixPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDcEQsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQXBVVSx5QkFBeUI7bUdBQXpCLHlCQUF5QixtY0E1STFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQlQ7OzRGQTBIVSx5QkFBeUI7a0JBaEpyQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgaW5wdXQsXG4gIHZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIGVmZmVjdCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgc2lnbmFsLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0aXBweSwgeyBJbnN0YW5jZSBhcyBUaXBweUluc3RhbmNlLCBzdGlja3kgfSBmcm9tIFwidGlwcHkuanNcIjtcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IEF0ZUkxOG5TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2F0ZS1pMThuLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF0ZUVkaXRvckNvbW1hbmRzU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hdGUtZWRpdG9yLWNvbW1hbmRzLnNlcnZpY2VcIjtcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRTbGFzaENvbW1hbmRzIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hdGUtc2xhc2gtY29tbWFuZHMuY29uZmlnXCI7XG5pbXBvcnQgeyBQbHVnaW4sIFBsdWdpbktleSB9IGZyb20gXCJAdGlwdGFwL3BtL3N0YXRlXCI7XG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSBcIkB0aXB0YXAvcG0vdmlld1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0ZVNsYXNoQ29tbWFuZEl0ZW0ge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIGtleXdvcmRzOiBzdHJpbmdbXTtcbiAgY29tbWFuZDogKGVkaXRvcjogRWRpdG9yKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0ZUN1c3RvbVNsYXNoQ29tbWFuZHMge1xuICBjb21tYW5kcz86IEF0ZVNsYXNoQ29tbWFuZEl0ZW1bXTtcbn1cblxuLy8gRGVmYXVsdCBjb21tYW5kIGRlZmluaXRpb25zIGFyZSBub3cgY2VudHJhbGl6ZWQgaW4gc3JjL2xpYi9jb25maWcvc2xhc2gtY29tbWFuZHMuY29uZmlnLnRzXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhdGUtc2xhc2gtY29tbWFuZHNcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAjbWVudVJlZiBjbGFzcz1cInNsYXNoLWNvbW1hbmRzLW1lbnVcIj5cbiAgICAgIEBmb3IgKGNvbW1hbmQgb2YgZmlsdGVyZWRDb21tYW5kcygpOyB0cmFjayBjb21tYW5kLnRpdGxlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNsYXNoLWNvbW1hbmQtaXRlbVwiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIiRpbmRleCA9PT0gc2VsZWN0ZWRJbmRleCgpXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cImV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3RlZEluZGV4LnNldCgkaW5kZXgpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsYXNoLWNvbW1hbmQtaWNvblwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+e3sgY29tbWFuZC5pY29uIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGFzaC1jb21tYW5kLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGFzaC1jb21tYW5kLXRpdGxlXCI+e3sgY29tbWFuZC50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsYXNoLWNvbW1hbmQtZGVzY3JpcHRpb25cIj57eyBjb21tYW5kLmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuc2xhc2gtY29tbWFuZHMtbWVudSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1tZW51LWJnKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYXRlLW1lbnUtYm9yZGVyKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXRlLW1lbnUtYm9yZGVyLXJhZGl1cywgMTJweCk7XG4gICAgICAgIGJveC1zaGFkb3c6IHZhcigtLWF0ZS1tZW51LXNoYWRvdyk7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLWF0ZS1tZW51LXBhZGRpbmcpO1xuICAgICAgICBtYXgtaGVpZ2h0OiAzMjBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgbWluLXdpZHRoOiAyODBweDtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgYW5pbWF0aW9uOiBzbGFzaE1lbnVGYWRlSW4gMC4ycyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuICAgICAgICBzY3JvbGxiYXItY29sb3I6IHZhcigtLWF0ZS1zY3JvbGxiYXItdGh1bWIpIHZhcigtLWF0ZS1zY3JvbGxiYXItdHJhY2spO1xuICAgICAgfVxuXG4gICAgICAuc2xhc2gtY29tbWFuZHMtbWVudTo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgICB3aWR0aDogdmFyKC0tYXRlLXNjcm9sbGJhci13aWR0aCk7XG4gICAgICB9XG5cbiAgICAgIC5zbGFzaC1jb21tYW5kcy1tZW51Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1zY3JvbGxiYXItdHJhY2spO1xuICAgICAgfVxuXG4gICAgICAuc2xhc2gtY29tbWFuZHMtbWVudTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hdGUtc2Nyb2xsYmFyLXRodW1iKTtcbiAgICAgICAgYm9yZGVyOiAzcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJhY2tncm91bmQtY2xpcDogY29udGVudC1ib3g7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5zbGFzaC1jb21tYW5kcy1tZW51Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1zY3JvbGxiYXItdGh1bWItaG92ZXIpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNsaXA6IGNvbnRlbnQtYm94O1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIHNsYXNoTWVudUZhZGVJbiB7XG4gICAgICAgIGZyb20ge1xuICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDRweCk7XG4gICAgICAgIH1cbiAgICAgICAgdG8ge1xuICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC5zbGFzaC1jb21tYW5kLWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLWF0ZS1tZW51LXBhZGRpbmcpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hdGUtbWVudS1ib3JkZXItcmFkaXVzLCA4cHgpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgICAgICBib3JkZXI6IHZhcigtLWF0ZS1ib3JkZXItd2lkdGgsIDFweCkgc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgICAgIH1cblxuICAgICAgLnNsYXNoLWNvbW1hbmQtaXRlbTpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cblxuICAgICAgLnNsYXNoLWNvbW1hbmQtaXRlbTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1zdXJmYWNlLXNlY29uZGFyeSk7XG4gICAgICB9XG5cbiAgICAgIC5zbGFzaC1jb21tYW5kLWl0ZW0uc2VsZWN0ZWQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hdGUtcHJpbWFyeS1saWdodCk7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYXRlLXByaW1hcnktbGlnaHQtYWxwaGEpO1xuICAgICAgfVxuXG4gICAgICAuc2xhc2gtY29tbWFuZC1pY29uIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1zdXJmYWNlLXRlcnRpYXJ5KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXRlLXN1Yi1ib3JkZXItcmFkaXVzLCA4cHgpO1xuICAgICAgICBjb2xvcjogdmFyKC0tYXRlLXByaW1hcnkpO1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgICB9XG5cbiAgICAgIC5zbGFzaC1jb21tYW5kLWl0ZW0uc2VsZWN0ZWQgLnNsYXNoLWNvbW1hbmQtaWNvbiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1wcmltYXJ5KTtcbiAgICAgICAgY29sb3I6IHZhcigtLWF0ZS1wcmltYXJ5LWNvbnRyYXN0LCAjZmZmZmZmKTtcbiAgICAgIH1cblxuICAgICAgLnNsYXNoLWNvbW1hbmQtaWNvbiAubWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgIH1cblxuICAgICAgLnNsYXNoLWNvbW1hbmQtY29udGVudCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cblxuICAgICAgLnNsYXNoLWNvbW1hbmQtdGl0bGUge1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICBjb2xvcjogdmFyKC0tYXRlLXRleHQpO1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgIC5zbGFzaC1jb21tYW5kLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWF0ZS10ZXh0LXNlY29uZGFyeSk7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQXRlU2xhc2hDb21tYW5kc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgaTE4blNlcnZpY2UgPSBpbmplY3QoQXRlSTE4blNlcnZpY2UpO1xuICBlZGl0b3IgPSBpbnB1dC5yZXF1aXJlZDxFZGl0b3I+KCk7XG4gIGNvbmZpZyA9IGlucHV0PEF0ZUN1c3RvbVNsYXNoQ29tbWFuZHMgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgbWVudVJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oXCJtZW51UmVmXCIpO1xuXG4gIHByaXZhdGUgdGlwcHlJbnN0YW5jZTogVGlwcHlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVkaXRvckNvbW1hbmRzID0gaW5qZWN0KEF0ZUVkaXRvckNvbW1hbmRzU2VydmljZSk7XG5cbiAgLy8gTG9jYWwgc3RhdGVcbiAgcHJpdmF0ZSBpc0FjdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIGN1cnJlbnRRdWVyeSA9IHNpZ25hbChcIlwiKTtcbiAgcHJpdmF0ZSBzbGFzaFJhbmdlOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gU2lnbmFsIGZvciBzZWxlY3RlZCBpbmRleFxuICBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuXG4gIC8vIFRvb2xiYXIgaW50ZXJhY3Rpb24gc3RhdGUgKGZyb20gY2VudHJhbGl6ZWQgc2VydmljZSlcbiAgcHJpdmF0ZSByZWFkb25seSBpc1Rvb2xiYXJJbnRlcmFjdGluZyA9IHRoaXMuZWRpdG9yQ29tbWFuZHMuaXNUb29sYmFySW50ZXJhY3Rpbmc7XG5cbiAgY29tbWFuZHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5jb21tYW5kcykge1xuICAgICAgcmV0dXJuIGNvbmZpZy5jb21tYW5kcztcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IG5hdGl2ZSBjb21tYW5kc1xuICAgIHJldHVybiBjcmVhdGVEZWZhdWx0U2xhc2hDb21tYW5kcyh0aGlzLmkxOG5TZXJ2aWNlLCB0aGlzLmVkaXRvckNvbW1hbmRzKTtcbiAgfSk7XG5cbiAgZmlsdGVyZWRDb21tYW5kcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuY3VycmVudFF1ZXJ5KCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjb21tYW5kcyA9IHRoaXMuY29tbWFuZHMoKTtcblxuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIHJldHVybiBjb21tYW5kcztcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWFuZHMuZmlsdGVyKFxuICAgICAgY29tbWFuZCA9PlxuICAgICAgICBjb21tYW5kLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpIHx8XG4gICAgICAgIGNvbW1hbmQuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkgfHxcbiAgICAgICAgY29tbWFuZC5rZXl3b3Jkcy5zb21lKGtleXdvcmQgPT4ga2V5d29yZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSlcbiAgICApO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZWQgPSB0aGlzLmVkaXRvcigpO1xuICAgICAgaWYgKCFlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIHVwIG9sZCBsaXN0ZW5lcnNcbiAgICAgIGVkLm9mZihcInNlbGVjdGlvblVwZGF0ZVwiLCB0aGlzLnVwZGF0ZU1lbnUpO1xuICAgICAgZWQub2ZmKFwidHJhbnNhY3Rpb25cIiwgdGhpcy51cGRhdGVNZW51KTtcbiAgICAgIGVkLm9mZihcImZvY3VzXCIsIHRoaXMudXBkYXRlTWVudSk7XG4gICAgICBlZC5vZmYoXCJibHVyXCIsIHRoaXMuaGFuZGxlQmx1cik7XG5cbiAgICAgIC8vIEFkZCBuZXcgbGlzdGVuZXJzXG4gICAgICBlZC5vbihcInNlbGVjdGlvblVwZGF0ZVwiLCB0aGlzLnVwZGF0ZU1lbnUpO1xuICAgICAgZWQub24oXCJ0cmFuc2FjdGlvblwiLCB0aGlzLnVwZGF0ZU1lbnUpO1xuICAgICAgZWQub24oXCJmb2N1c1wiLCB0aGlzLnVwZGF0ZU1lbnUpO1xuICAgICAgZWQub24oXCJibHVyXCIsIHRoaXMuaGFuZGxlQmx1cik7XG5cbiAgICAgIC8vIFVzZSBQcm9zZU1pcnJvciBwbHVnaW4gc3lzdGVtIHRvIGludGVyY2VwdCBrZXlzXG4gICAgICB0aGlzLmFkZEtleWJvYXJkUGx1Z2luKGVkKTtcblxuICAgICAgLy8gdXBkYXRlTWVudSgpIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBlZGl0b3IgaXMgcmVhZHlcbiAgICB9LCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0VGlwcHkoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnN0IGVkID0gdGhpcy5lZGl0b3IoKTtcbiAgICBpZiAoZWQpIHtcbiAgICAgIGVkLm9mZihcInNlbGVjdGlvblVwZGF0ZVwiLCB0aGlzLnVwZGF0ZU1lbnUpO1xuICAgICAgZWQub2ZmKFwidHJhbnNhY3Rpb25cIiwgdGhpcy51cGRhdGVNZW51KTtcbiAgICAgIGVkLm9mZihcImZvY3VzXCIsIHRoaXMudXBkYXRlTWVudSk7XG4gICAgICBlZC5vZmYoXCJibHVyXCIsIHRoaXMuaGFuZGxlQmx1cik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSkge1xuICAgICAgdGhpcy50aXBweUluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudGlwcHlJbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0VGlwcHkoKSB7XG4gICAgaWYgKCF0aGlzLm1lbnVSZWYoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXRUaXBweSgpLCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVudUVsZW1lbnQgPSB0aGlzLm1lbnVSZWYoKS5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSkge1xuICAgICAgdGhpcy50aXBweUluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLnRpcHB5SW5zdGFuY2UgPSB0aXBweShkb2N1bWVudC5ib2R5LCB7XG4gICAgICBjb250ZW50OiBtZW51RWxlbWVudCxcbiAgICAgIHRyaWdnZXI6IFwibWFudWFsXCIsXG4gICAgICBwbGFjZW1lbnQ6IFwiYm90dG9tLXN0YXJ0XCIsXG4gICAgICB0aGVtZTogXCJzbGFzaC1tZW51XCIsXG4gICAgICBhcHBlbmRUbzogX3JlZiA9PiB7XG4gICAgICAgIC8vIEFsd2F5cyB0cnkgdG8gY2xpbWIgdXAgdG8gZWRpdG9yIGhvc3QgdG8gaW5oZXJpdCBDU1MgdmFyaWFibGVzXG4gICAgICAgIGNvbnN0IGhvc3QgPSAodGhpcy5lZGl0b3IoKS5vcHRpb25zLmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJhbmd1bGFyLXRpcHRhcC1lZGl0b3JcIik7XG4gICAgICAgIHJldHVybiBob3N0IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICB9LFxuICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICBhcnJvdzogZmFsc2UsXG4gICAgICBvZmZzZXQ6IFswLCA4XSxcbiAgICAgIGhpZGVPbkNsaWNrOiB0cnVlLFxuICAgICAgcGx1Z2luczogW3N0aWNreV0sXG4gICAgICBzdGlja3k6IGZhbHNlLFxuICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDogKCkgPT4gdGhpcy5nZXRTbGFzaFJlY3QoKSxcbiAgICAgIC8vIEltcHJvdmUgcG9zaXRpb25pbmcgd2l0aCBzY3JvbGxcbiAgICAgIHBvcHBlck9wdGlvbnM6IHtcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJwcmV2ZW50T3ZlcmZsb3dcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYm91bmRhcnk6IHRoaXMuZWRpdG9yKCkub3B0aW9ucy5lbGVtZW50LFxuICAgICAgICAgICAgICBwYWRkaW5nOiA4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZmxpcFwiLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBmYWxsYmFja1BsYWNlbWVudHM6IFtcInRvcC1zdGFydFwiLCBcImJvdHRvbS1lbmRcIiwgXCJ0b3AtZW5kXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaGlkZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbCBjaGVjayBhZnRlciBUaXBweSBpcyBpbml0aWFsaXplZFxuICAgIHRoaXMudXBkYXRlTWVudSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTbGFzaFJlY3QoKTogRE9NUmVjdCB7XG4gICAgY29uc3QgZWQgPSB0aGlzLmVkaXRvcigpO1xuICAgIGlmICghZWQgfHwgIXRoaXMuc2xhc2hSYW5nZSkge1xuICAgICAgcmV0dXJuIG5ldyBET01SZWN0KC05OTk5LCAtOTk5OSwgMCwgMCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBQcm9zZU1pcnJvciBjb29yZGluYXRlcyBmb3IgYmV0dGVyIHByZWNpc2lvblxuICAgICAgY29uc3QgY29vcmRzID0gZWQudmlldy5jb29yZHNBdFBvcyh0aGlzLnNsYXNoUmFuZ2UuZnJvbSk7XG4gICAgICByZXR1cm4gbmV3IERPTVJlY3QoY29vcmRzLmxlZnQsIGNvb3Jkcy50b3AsIDAsIGNvb3Jkcy5ib3R0b20gLSBjb29yZHMudG9wKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiRXJyb3IgY2FsY3VsYXRpbmcgY29vcmRpbmF0ZXM6XCIsIGVycm9yKTtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIHdpbmRvdy5nZXRTZWxlY3Rpb25cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgRE9NUmVjdCgtOTk5OSwgLTk5OTksIDAsIDApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIHJldHVybiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVNZW51ID0gKCkgPT4ge1xuICAgIGNvbnN0IGVkID0gdGhpcy5lZGl0b3IoKTtcbiAgICBpZiAoIWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBmcm9tIH0gPSBlZC5zdGF0ZS5zZWxlY3Rpb247XG5cbiAgICAvLyBDaGVjayBpZiAnLycgd2FzIHR5cGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIG9yIGFmdGVyIGEgc3BhY2VcbiAgICBjb25zdCB0ZXh0QmVmb3JlID0gZWQuc3RhdGUuZG9jLnRleHRCZXR3ZWVuKE1hdGgubWF4KDAsIGZyb20gLSAyMCksIGZyb20sIFwiXFxuXCIpO1xuICAgIGNvbnN0IHNsYXNoTWF0Y2ggPSB0ZXh0QmVmb3JlLm1hdGNoKC8oPzpefFxccylcXC8oW14vXFxzXSopJC8pO1xuXG4gICAgaWYgKHNsYXNoTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gc2xhc2hNYXRjaFsxXSB8fCBcIlwiO1xuICAgICAgY29uc3Qgd2FzQWN0aXZlID0gdGhpcy5pc0FjdGl2ZTtcblxuICAgICAgdGhpcy5jdXJyZW50UXVlcnkuc2V0KHF1ZXJ5KTtcbiAgICAgIHRoaXMuc2xhc2hSYW5nZSA9IHtcbiAgICAgICAgZnJvbTogZnJvbSAtIHNsYXNoTWF0Y2hbMF0ubGVuZ3RoICsgc2xhc2hNYXRjaFswXS5pbmRleE9mKFwiL1wiKSxcbiAgICAgICAgdG86IGZyb20sXG4gICAgICB9O1xuXG4gICAgICAvLyBSZXNldCBpbmRleCBpZiBtZW51IGp1c3QgYmVjYW1lIGFjdGl2ZVxuICAgICAgaWYgKCF3YXNBY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4LnNldCgwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICAgIGlmICh0aGlzLmlzVG9vbGJhckludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgdGhpcy5oaWRlVGlwcHkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd1RpcHB5KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuaGlkZVRpcHB5KCk7XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZUJsdXIgPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGVUaXBweSgpLCAxMDApO1xuICB9O1xuXG4gIHByaXZhdGUgc2Nyb2xsVG9TZWxlY3RlZCgpIHtcbiAgICAvLyBTY3JvbGwgdG8gdGhlIHNlbGVjdGVkIGVsZW1lbnRcbiAgICBjb25zdCBtZW51RWwgPSB0aGlzLm1lbnVSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAobWVudUVsKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBtZW51RWwucXVlcnlTZWxlY3RvcihcIi5zbGFzaC1jb21tYW5kLWl0ZW0uc2VsZWN0ZWRcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiBcIm5lYXJlc3RcIiwgYmVoYXZpb3I6IFwic21vb3RoXCIgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VGlwcHkoKSB7XG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSAmJiB0aGlzLmZpbHRlcmVkQ29tbWFuZHMoKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRpcHB5SW5zdGFuY2Uuc2V0UHJvcHMoeyBzdGlja3k6IFwicmVmZXJlbmNlXCIgfSk7XG4gICAgICB0aGlzLnRpcHB5SW5zdGFuY2Uuc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlkZVRpcHB5KCkge1xuICAgIGlmICh0aGlzLnRpcHB5SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMudGlwcHlJbnN0YW5jZS5zZXRQcm9wcyh7IHN0aWNreTogZmFsc2UgfSk7XG4gICAgICB0aGlzLnRpcHB5SW5zdGFuY2UuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQ6IEF0ZVNsYXNoQ29tbWFuZEl0ZW0pIHtcbiAgICBjb25zdCBlZCA9IHRoaXMuZWRpdG9yKCk7XG4gICAgaWYgKCFlZCB8fCAhdGhpcy5zbGFzaFJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHNsYXNoIHRleHQgKFwiL1wiKVxuICAgIGNvbnN0IHsgdHIgfSA9IGVkLnN0YXRlO1xuICAgIHRyLmRlbGV0ZSh0aGlzLnNsYXNoUmFuZ2UuZnJvbSwgdGhpcy5zbGFzaFJhbmdlLnRvKTtcbiAgICBlZC52aWV3LmRpc3BhdGNoKHRyKTtcblxuICAgIC8vIEhpZGUgbWVudSBpbW1lZGlhdGVseVxuICAgIHRoaXMuaGlkZVRpcHB5KCk7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gR2l2ZSBmb2N1cyBiYWNrIHRvIGVkaXRvciBhbmQgZXhlY3V0ZSBjb21tYW5kXG4gICAgLy8gVXNlIGEgbWljcm8tZGVsYXkgdG8gZW5zdXJlIFByb3NlTWlycm9yIERPTSBpcyBzdGFibGUgYWZ0ZXIgcmVtb3ZpbmcgXCIvXCJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVkLmNvbW1hbmRzLmZvY3VzKCk7XG4gICAgICBjb21tYW5kLmNvbW1hbmQoZWQpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkS2V5Ym9hcmRQbHVnaW4oZWQ6IEVkaXRvcikge1xuICAgIC8vIEFkZCBhIFByb3NlTWlycm9yIHBsdWdpbiB0byBpbnRlcmNlcHQga2V5Ym9hcmQgZXZlbnRzXG4gICAgY29uc3Qga2V5Ym9hcmRQbHVnaW4gPSBuZXcgUGx1Z2luKHtcbiAgICAgIGtleTogbmV3IFBsdWdpbktleShcInNsYXNoLWNvbW1hbmRzLWtleWJvYXJkXCIpLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgaGFuZGxlS2V5RG93bjogKHZpZXc6IEVkaXRvclZpZXcsIGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gT25seSBoYW5kbGUgaWYgbWVudSBpcyBhY3RpdmVcbiAgICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUgfHwgdGhpcy5maWx0ZXJlZENvbW1hbmRzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjoge1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSAodGhpcy5zZWxlY3RlZEluZGV4KCkgKyAxKSAlIHRoaXMuZmlsdGVyZWRDb21tYW5kcygpLmxlbmd0aDtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOiB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZJbmRleCA9XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4KCkgPT09IDBcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5maWx0ZXJlZENvbW1hbmRzKCkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlbGVjdGVkSW5kZXgoKSAtIDE7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleC5zZXQocHJldkluZGV4KTtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIkVudGVyXCI6IHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb21tYW5kID0gdGhpcy5maWx0ZXJlZENvbW1hbmRzKClbdGhpcy5zZWxlY3RlZEluZGV4KCldO1xuICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ29tbWFuZChzZWxlY3RlZENvbW1hbmQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIkVzY2FwZVwiOiB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5oaWRlVGlwcHkoKTtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHR5cGVkIFwiL1wiXG4gICAgICAgICAgICAgIGlmICh0aGlzLnNsYXNoUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRyIH0gPSB2aWV3LnN0YXRlO1xuICAgICAgICAgICAgICAgIHRyLmRlbGV0ZSh0aGlzLnNsYXNoUmFuZ2UuZnJvbSwgdGhpcy5zbGFzaFJhbmdlLnRvKTtcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHBsdWdpbiB0byBlZGl0b3JcbiAgICBlZC52aWV3LnVwZGF0ZVN0YXRlKFxuICAgICAgZWQudmlldy5zdGF0ZS5yZWNvbmZpZ3VyZSh7XG4gICAgICAgIHBsdWdpbnM6IFtrZXlib2FyZFBsdWdpbiwgLi4uZWQudmlldy5zdGF0ZS5wbHVnaW5zXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
|