@mnaoumov/obsidian-lib 10.9.0 → 10.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/codemirror/editor-mode-extension/package.json +6 -0
  2. package/dist/lib/cjs/__merged.cjs +42 -1
  3. package/dist/lib/cjs/__merged.d.cts +6 -1
  4. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +180 -0
  5. package/dist/lib/cjs/codemirror/editor-mode-extension.d.cts +50 -0
  6. package/dist/lib/cjs/codemirror/index.cjs +4 -1
  7. package/dist/lib/cjs/codemirror/index.d.cts +1 -0
  8. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +4 -7
  9. package/dist/lib/cjs/components/plugin-settings-component.cjs +4 -3
  10. package/dist/lib/cjs/components/plugin-settings-component.d.cts +2 -1
  11. package/dist/lib/cjs/css-class.cjs +7 -1
  12. package/dist/lib/cjs/css-class.d.cts +24 -0
  13. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  14. package/dist/lib/cjs/i18n/i18n.cjs +38 -10
  15. package/dist/lib/cjs/i18n/i18n.d.cts +29 -2
  16. package/dist/lib/cjs/i18n/locales/en.cjs +19 -1
  17. package/dist/lib/cjs/i18n/locales/en.d.cts +18 -0
  18. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +18 -0
  19. package/dist/lib/cjs/index.cjs +7 -1
  20. package/dist/lib/cjs/index.d.cts +2 -0
  21. package/dist/lib/cjs/link.cjs +40 -1
  22. package/dist/lib/cjs/link.d.cts +37 -1
  23. package/dist/lib/cjs/modals/code-block-builder.cjs +486 -0
  24. package/dist/lib/cjs/modals/code-block-builder.d.cts +321 -0
  25. package/dist/lib/cjs/modals/index.cjs +4 -1
  26. package/dist/lib/cjs/modals/index.d.cts +1 -0
  27. package/dist/lib/cjs/plugin/index.cjs +4 -1
  28. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  29. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +189 -0
  30. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +111 -0
  31. package/dist/lib/cjs/plugin/plugin.cjs +47 -2
  32. package/dist/lib/cjs/plugin/plugin.d.cts +25 -1
  33. package/dist/lib/cjs/reference-definition.cjs +234 -0
  34. package/dist/lib/cjs/reference-definition.d.cts +47 -0
  35. package/dist/lib/cjs/release-asset.cjs +279 -0
  36. package/dist/lib/cjs/release-asset.d.cts +190 -0
  37. package/dist/lib/cjs/workspace.cjs +3 -2
  38. package/dist/lib/cjs/workspace.d.cts +6 -0
  39. package/dist/lib/esm/__merged.d.mts +6 -1
  40. package/dist/lib/esm/__merged.mjs +45 -1
  41. package/dist/lib/esm/codemirror/editor-mode-extension.d.mts +50 -0
  42. package/dist/lib/esm/codemirror/editor-mode-extension.mjs +93 -0
  43. package/dist/lib/esm/codemirror/index.d.mts +1 -0
  44. package/dist/lib/esm/codemirror/index.mjs +3 -1
  45. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +3 -9
  46. package/dist/lib/esm/components/plugin-settings-component.d.mts +2 -1
  47. package/dist/lib/esm/components/plugin-settings-component.mjs +4 -3
  48. package/dist/lib/esm/css-class.d.mts +24 -0
  49. package/dist/lib/esm/css-class.mjs +7 -1
  50. package/dist/lib/esm/generated-during-build.mjs +2 -2
  51. package/dist/lib/esm/i18n/i18n.d.mts +29 -2
  52. package/dist/lib/esm/i18n/i18n.mjs +40 -10
  53. package/dist/lib/esm/i18n/locales/en.d.mts +18 -0
  54. package/dist/lib/esm/i18n/locales/en.mjs +19 -1
  55. package/dist/lib/esm/i18n/locales/translations-map.d.mts +18 -0
  56. package/dist/lib/esm/index.d.mts +2 -0
  57. package/dist/lib/esm/index.mjs +5 -1
  58. package/dist/lib/esm/link.d.mts +37 -1
  59. package/dist/lib/esm/link.mjs +40 -1
  60. package/dist/lib/esm/modals/code-block-builder.d.mts +321 -0
  61. package/dist/lib/esm/modals/code-block-builder.mjs +408 -0
  62. package/dist/lib/esm/modals/index.d.mts +1 -0
  63. package/dist/lib/esm/modals/index.mjs +3 -1
  64. package/dist/lib/esm/plugin/index.d.mts +1 -0
  65. package/dist/lib/esm/plugin/index.mjs +3 -1
  66. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +111 -0
  67. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +96 -0
  68. package/dist/lib/esm/plugin/plugin.d.mts +25 -1
  69. package/dist/lib/esm/plugin/plugin.mjs +52 -2
  70. package/dist/lib/esm/reference-definition.d.mts +47 -0
  71. package/dist/lib/esm/reference-definition.mjs +146 -0
  72. package/dist/lib/esm/release-asset.d.mts +190 -0
  73. package/dist/lib/esm/release-asset.mjs +187 -0
  74. package/dist/lib/esm/workspace.d.mts +6 -0
  75. package/dist/lib/esm/workspace.mjs +3 -2
  76. package/dist/styles.css +31 -1
  77. package/modals/code-block-builder/package.json +6 -0
  78. package/package.json +1 -1
  79. package/plugin/plugin-async-cleanup/package.json +6 -0
@@ -0,0 +1,408 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
34
+ import {
35
+ assertNever,
36
+ ensureNonNullable
37
+ } from "@mnaoumov/typescript-lib/type-guards";
38
+ import {
39
+ DropdownComponent,
40
+ Notice,
41
+ Setting,
42
+ TextAreaComponent
43
+ } from "obsidian";
44
+ import { CssClass } from "../css-class.mjs";
45
+ import { t } from "../i18n/i18n.mjs";
46
+ import { MultipleDropdownComponent } from "../setting-components/multiple-dropdown-component.mjs";
47
+ import {
48
+ ModalBase,
49
+ showModal
50
+ } from "./modal.mjs";
51
+ const DEFAULT_SEPARATOR = ",";
52
+ const MIN_FENCE_LENGTH = 3;
53
+ const ROOT_FOLDER_PATH = "/";
54
+ class CodeBlockBuilderModal extends ModalBase {
55
+ codeBlock = "";
56
+ editor;
57
+ fields;
58
+ groupStates = [];
59
+ insertedCodeBlock = null;
60
+ language;
61
+ onUpdatePreview;
62
+ outputComponent = null;
63
+ previewEl = null;
64
+ title;
65
+ values = /* @__PURE__ */ new Map();
66
+ constructor(params) {
67
+ super(params);
68
+ this.addCssClasses(CssClass.CodeBlockBuilderModal);
69
+ this.editor = params.editor === void 0 ? params.app.workspace.activeEditor?.editor ?? null : params.editor;
70
+ this.fields = params.fields;
71
+ this.language = params.language;
72
+ this.onUpdatePreview = params.onUpdatePreview;
73
+ this.title = params.title ?? t(($) => $.obsidianLib.codeBlockBuilder.title);
74
+ for (const field of flattenFields(this.fields)) {
75
+ this.values.set(field.key, field.defaultValue);
76
+ }
77
+ }
78
+ onClose() {
79
+ this.promiseResolve(this.insertedCodeBlock);
80
+ }
81
+ onOpen() {
82
+ this.titleEl.setText(this.title);
83
+ for (const input of this.fields) {
84
+ if (input.type !== "group" && input.isRequired) {
85
+ this.renderField(this.contentEl, input);
86
+ }
87
+ }
88
+ for (const input of this.fields) {
89
+ if (input.type === "group") {
90
+ this.renderGroup(input);
91
+ } else if (!input.isRequired) {
92
+ this.renderField(this.contentEl, input);
93
+ }
94
+ }
95
+ this.previewEl = this.contentEl.createDiv({ cls: CssClass.CodeBlockBuilderPreview });
96
+ this.renderOutput();
97
+ this.update();
98
+ }
99
+ addResetButton(setting, field, reset) {
100
+ if (field.isRequired) {
101
+ return;
102
+ }
103
+ setting.addExtraButton((button) => {
104
+ button.setIcon("lucide-rotate-ccw").setTooltip(t(($) => $.obsidianLib.codeBlockBuilder.reset, { value: formatValue(field, field.defaultValue) || '""' })).onClick(() => {
105
+ reset();
106
+ this.setValue(field.key, field.defaultValue);
107
+ });
108
+ });
109
+ }
110
+ async copy() {
111
+ try {
112
+ await this.containerEl.win.navigator.clipboard.writeText(this.codeBlock);
113
+ new Notice(t(($) => $.obsidianLib.codeBlockBuilder.copied));
114
+ } catch {
115
+ new Notice(t(($) => $.obsidianLib.codeBlockBuilder.copyFailed));
116
+ }
117
+ }
118
+ insert() {
119
+ if (!this.editor) {
120
+ new Notice(t(($) => $.obsidianLib.codeBlockBuilder.insertUnavailable));
121
+ return;
122
+ }
123
+ const cursor = this.editor.getCursor("from");
124
+ const textBeforeCursor = this.editor.getLine(cursor.line).slice(0, cursor.ch);
125
+ const prefix = textBeforeCursor === "" ? "" : "\n";
126
+ this.editor.replaceSelection(`${prefix}${this.codeBlock}
127
+ `);
128
+ this.insertedCodeBlock = this.codeBlock;
129
+ this.close();
130
+ }
131
+ renderBooleanField(setting, field) {
132
+ setting.addToggle((toggle) => {
133
+ toggle.setValue(field.defaultValue).onChange((value) => {
134
+ this.setValue(field.key, value);
135
+ });
136
+ this.addResetButton(setting, field, () => {
137
+ toggle.setValue(field.defaultValue);
138
+ });
139
+ });
140
+ }
141
+ renderColorField(setting, field) {
142
+ setting.addColorPicker((colorPicker) => {
143
+ colorPicker.setValue(field.defaultValue).onChange((value) => {
144
+ this.setValue(field.key, value);
145
+ });
146
+ this.addResetButton(setting, field, () => {
147
+ colorPicker.setValue(field.defaultValue);
148
+ });
149
+ });
150
+ }
151
+ renderConditionalDropdownField(setting, field) {
152
+ const initialGroupIndex = Math.max(0, field.groups.findIndex((group) => Object.hasOwn(toRecord(group.options), field.defaultValue)));
153
+ const groupDropdown = new DropdownComponent(setting.controlEl);
154
+ for (const [index, group] of field.groups.entries()) {
155
+ groupDropdown.addOption(String(index), group.name);
156
+ }
157
+ groupDropdown.setValue(String(initialGroupIndex));
158
+ const optionDropdown = new DropdownComponent(setting.controlEl);
159
+ function fillOptions(groupIndex, value) {
160
+ const options = toRecord(field.groups[groupIndex]?.options ?? []);
161
+ const selectedValue = value ?? Object.keys(options)[0] ?? "";
162
+ optionDropdown.selectEl.empty();
163
+ optionDropdown.addOptions(options);
164
+ optionDropdown.setValue(selectedValue);
165
+ return selectedValue;
166
+ }
167
+ fillOptions(initialGroupIndex, field.defaultValue);
168
+ optionDropdown.onChange((value) => {
169
+ this.setValue(field.key, value);
170
+ });
171
+ groupDropdown.onChange((value) => {
172
+ this.setValue(field.key, fillOptions(Number(value)));
173
+ });
174
+ this.addResetButton(setting, field, () => {
175
+ groupDropdown.setValue(String(initialGroupIndex));
176
+ fillOptions(initialGroupIndex, field.defaultValue);
177
+ });
178
+ }
179
+ renderDropdownField(setting, field) {
180
+ setting.addDropdown((dropdown) => {
181
+ dropdown.addOptions(toRecord(field.options)).setValue(field.defaultValue).onChange((value) => {
182
+ this.setValue(field.key, value);
183
+ });
184
+ this.addResetButton(setting, field, () => {
185
+ dropdown.setValue(field.defaultValue);
186
+ });
187
+ });
188
+ }
189
+ renderField(containerEl, field) {
190
+ const setting = new Setting(containerEl).setName(field.name);
191
+ if (field.description !== void 0) {
192
+ setting.setDesc(field.description);
193
+ }
194
+ switch (field.type) {
195
+ case "boolean": {
196
+ this.renderBooleanField(setting, field);
197
+ break;
198
+ }
199
+ case "color": {
200
+ this.renderColorField(setting, field);
201
+ break;
202
+ }
203
+ case "conditionalDropdown": {
204
+ this.renderConditionalDropdownField(setting, field);
205
+ break;
206
+ }
207
+ case "dropdown": {
208
+ this.renderDropdownField(setting, field);
209
+ break;
210
+ }
211
+ case "folder": {
212
+ this.renderFolderField(setting, field);
213
+ break;
214
+ }
215
+ case "multipleDropdown": {
216
+ this.renderMultipleDropdownField(setting, field);
217
+ break;
218
+ }
219
+ case "slider": {
220
+ this.renderSliderField(setting, field);
221
+ break;
222
+ }
223
+ case "text": {
224
+ this.renderTextField(setting, field);
225
+ break;
226
+ }
227
+ default: {
228
+ assertNever(field);
229
+ }
230
+ }
231
+ }
232
+ renderFolderField(setting, field) {
233
+ const options = {
234
+ [ROOT_FOLDER_PATH]: t(($) => $.obsidianLib.codeBlockBuilder.rootFolder)
235
+ };
236
+ const folderPaths = this.app.vault.getAllFolders(false).map((folder) => folder.path).sort((a, b) => a.localeCompare(b));
237
+ for (const folderPath of folderPaths) {
238
+ options[folderPath] = folderPath;
239
+ }
240
+ options[field.defaultValue] ??= field.defaultValue;
241
+ setting.addDropdown((dropdown) => {
242
+ dropdown.addOptions(options).setValue(field.defaultValue).onChange((value) => {
243
+ this.setValue(field.key, value);
244
+ });
245
+ this.addResetButton(setting, field, () => {
246
+ dropdown.setValue(field.defaultValue);
247
+ });
248
+ });
249
+ }
250
+ renderGroup(group) {
251
+ const groupEl = this.contentEl.createDiv({ cls: CssClass.CodeBlockBuilderGroup });
252
+ const headingSetting = new Setting(groupEl).setName(group.name).setHeading();
253
+ const bodyEl = groupEl.createDiv({ cls: CssClass.CodeBlockBuilderGroupBody });
254
+ groupEl.addClass(CssClass.IsCollapsed);
255
+ headingSetting.addExtraButton((button) => {
256
+ const groupState = { button, groupEl };
257
+ this.groupStates.push(groupState);
258
+ updateGroupIcon(groupState);
259
+ button.onClick(() => {
260
+ this.setGroupExpanded(groupEl, groupEl.hasClass(CssClass.IsCollapsed));
261
+ });
262
+ });
263
+ for (const field of group.fields) {
264
+ this.renderField(bodyEl, field);
265
+ }
266
+ if (group.isInitiallyExpanded) {
267
+ this.setGroupExpanded(groupEl, true);
268
+ }
269
+ }
270
+ renderMultipleDropdownField(setting, field) {
271
+ const dropdown = new MultipleDropdownComponent(setting.controlEl).addOptions(toRecord(field.options)).setValue(field.defaultValue).onChange((value) => {
272
+ this.setValue(field.key, value);
273
+ });
274
+ setting.addComponent(() => dropdown);
275
+ this.addResetButton(setting, field, () => {
276
+ dropdown.setValue(field.defaultValue);
277
+ });
278
+ }
279
+ renderOutput() {
280
+ const setting = new Setting(this.contentEl).setName(t(($) => $.obsidianLib.codeBlockBuilder.output));
281
+ setting.settingEl.addClass(CssClass.CodeBlockBuilderOutput);
282
+ setting.addTextArea((textArea) => {
283
+ this.outputComponent = textArea;
284
+ textArea.inputEl.readOnly = true;
285
+ });
286
+ setting.addExtraButton((button) => {
287
+ button.setIcon("lucide-copy").setTooltip(t(($) => $.obsidianLib.codeBlockBuilder.copy)).onClick(() => {
288
+ invokeAsyncSafely(() => this.copy());
289
+ });
290
+ });
291
+ setting.addExtraButton((button) => {
292
+ button.setIcon("lucide-file-input").setTooltip(t(($) => this.editor ? $.obsidianLib.codeBlockBuilder.insert : $.obsidianLib.codeBlockBuilder.insertUnavailable)).onClick(() => {
293
+ this.insert();
294
+ });
295
+ });
296
+ }
297
+ renderSliderField(setting, field) {
298
+ setting.addSlider((slider) => {
299
+ slider.setLimits(Math.min(field.min, field.defaultValue), Math.max(field.max, field.defaultValue), field.step).setValue(field.defaultValue).onChange((value) => {
300
+ this.setValue(field.key, value);
301
+ });
302
+ this.addResetButton(setting, field, () => {
303
+ slider.setValue(field.defaultValue);
304
+ });
305
+ });
306
+ }
307
+ renderTextField(setting, field) {
308
+ setting.addText((text) => {
309
+ text.setPlaceholder(field.placeholder ?? "").setValue(field.defaultValue).onChange((value) => {
310
+ if (field.validationPattern && !doesMatchPattern(field.validationPattern, value)) {
311
+ text.inputEl.setCustomValidity(t(($) => $.obsidianLib.codeBlockBuilder.invalidValue));
312
+ return;
313
+ }
314
+ text.inputEl.setCustomValidity("");
315
+ this.setValue(field.key, value);
316
+ });
317
+ this.addResetButton(setting, field, () => {
318
+ text.setValue(field.defaultValue);
319
+ text.inputEl.setCustomValidity("");
320
+ });
321
+ });
322
+ }
323
+ setGroupExpanded(groupEl, isExpanded) {
324
+ for (const groupState of this.groupStates) {
325
+ const shouldExpand = isExpanded && groupState.groupEl === groupEl;
326
+ groupState.groupEl.toggleClass(CssClass.IsCollapsed, !shouldExpand);
327
+ updateGroupIcon(groupState);
328
+ }
329
+ }
330
+ setValue(key, value) {
331
+ this.values.set(key, value);
332
+ this.update();
333
+ }
334
+ update() {
335
+ this.codeBlock = formatCodeBlock({
336
+ fields: this.fields,
337
+ language: this.language,
338
+ values: this.values
339
+ });
340
+ const outputComponent = ensureNonNullable(this.outputComponent);
341
+ outputComponent.setValue(this.codeBlock);
342
+ outputComponent.inputEl.rows = this.codeBlock.split("\n").length;
343
+ if (this.onUpdatePreview) {
344
+ this.onUpdatePreview({
345
+ codeBlock: this.codeBlock,
346
+ previewEl: ensureNonNullable(this.previewEl),
347
+ values: this.values
348
+ });
349
+ }
350
+ }
351
+ }
352
+ function formatCodeBlock(params) {
353
+ const lines = [];
354
+ for (const field of flattenFields(params.fields)) {
355
+ const value = params.values.get(field.key) ?? field.defaultValue;
356
+ const formattedValue = formatValue(field, value);
357
+ if (formattedValue === "") {
358
+ continue;
359
+ }
360
+ if (!field.isRequired && isSameValue(value, field.defaultValue)) {
361
+ continue;
362
+ }
363
+ lines.push(field.shouldOmitKey ? formattedValue : `${field.key}: ${formattedValue}`);
364
+ }
365
+ const body = lines.join("\n");
366
+ const longestBacktickRun = Math.max(0, ...Array.from(body.matchAll(/`+/g), (match) => match[0].length));
367
+ const fence = "`".repeat(Math.max(MIN_FENCE_LENGTH, longestBacktickRun + 1));
368
+ return lines.length === 0 ? `${fence}${params.language}
369
+ ${fence}` : `${fence}${params.language}
370
+ ${body}
371
+ ${fence}`;
372
+ }
373
+ async function showCodeBlockBuilder(params) {
374
+ return await showModal(
375
+ (promiseResolve) => new CodeBlockBuilderModal({
376
+ ...params,
377
+ promiseResolve
378
+ })
379
+ );
380
+ }
381
+ function doesMatchPattern(pattern, value) {
382
+ pattern.lastIndex = 0;
383
+ return pattern.test(value);
384
+ }
385
+ function flattenFields(inputs) {
386
+ return inputs.flatMap((input) => input.type === "group" ? input.fields : [input]);
387
+ }
388
+ function formatValue(field, value) {
389
+ const separator = field.type === "multipleDropdown" ? field.separator ?? DEFAULT_SEPARATOR : DEFAULT_SEPARATOR;
390
+ return isStringArray(value) ? value.join(separator) : String(value);
391
+ }
392
+ function isSameValue(a, b) {
393
+ return isStringArray(a) && isStringArray(b) ? a.length === b.length && a.every((item, index) => item === b[index]) : a === b;
394
+ }
395
+ function isStringArray(value) {
396
+ return Array.isArray(value);
397
+ }
398
+ function toRecord(options) {
399
+ return isStringArray(options) ? Object.fromEntries(options.map((option) => [option, option])) : { ...options };
400
+ }
401
+ function updateGroupIcon(groupState) {
402
+ groupState.button.setIcon(groupState.groupEl.hasClass(CssClass.IsCollapsed) ? "lucide-chevron-down" : "lucide-chevron-up");
403
+ }
404
+ export {
405
+ formatCodeBlock,
406
+ showCodeBlockBuilder
407
+ };
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2RhbHMvY29kZS1ibG9jay1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB7QGxpbmsgc2hvd0NvZGVCbG9ja0J1aWxkZXJ9LCBhIG1vZGFsIHRoYXQgYnVpbGRzIGEgcGx1Z2luJ3MgY29kZSBibG9jayBmcm9tIGEgZGVjbGFyYXRpdmUgbGlzdCBvZiBmaWVsZHMsIGFuZFxuICoge0BsaW5rIGZvcm1hdENvZGVCbG9ja30sIHRoZSBwdXJlIGZvcm1hdHRlciBiZWhpbmQgaXQuXG4gKlxuICogRXZlcnkgZmllbGQgcmVuZGVycyBhcyBvbmUgc2V0dGluZ3Mgcm93LiBBIGZpZWxkIHdob3NlIHZhbHVlIGRpZmZlcnMgZnJvbSBpdHMgZGVmYXVsdCB3cml0ZXMgb25lIGBrZXk6IHZhbHVlYCBsaW5lXG4gKiBpbnRvIHRoZSBibG9jayAoYSByZXF1aXJlZCBmaWVsZCBhbHdheXMgZG9lcyksIHRoZSBibG9jayBpcyBzaG93biBsaXZlIHdpdGggYW4gb3B0aW9uYWwgcHJldmlldyB0aGUgcGx1Z2luIGRyYXdzLCBhbmRcbiAqIHRoZSB1c2VyIGNvcGllcyBpdCBvciBpbnNlcnRzIGl0IGludG8gdGhlIG5vdGUgYmVpbmcgZWRpdGVkLlxuICpcbiAqIEFkYXB0ZWQgZnJvbSB0aGUgY29kZSBibG9jayBjcmVhdG9yIG1vZGFsIG9mIGFsdGFyb2sncyBgb2JzaWRpYW4tZGV2LXV0aWxzYFxuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9hbHRhcm9rL29ic2lkaWFuLWRldi11dGlscywgYHNyYy9jb2RlLWJsb2NrLWNyZWF0b3IvYCksIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBiZWxvdy4gVGhlIHBvcnRcbiAqIHRha2VzIHRoZSBhcHAgZnJvbSB0aGUgY2FsbGVyLCBtb3ZlcyB0aGUgc3R5bGVzIGludG8gdGhlIGxpYnJhcnkgc3R5bGVzaGVldCwgcmV1c2VzIHRoaXMgbGlicmFyeSdzIHNldHRpbmdcbiAqIGNvbXBvbmVudHMsIGFuZCBwaWNrcyBhIGZlbmNlIGxvbmdlciB0aGFuIGFueSBiYWNrdGljayBydW4gaW4gdGhlIHZhbHVlcy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYgQWx0YXJva1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGVcbiAqIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEVcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUlxuICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbi8vIGNzcGVsbDp3b3JkcyBhbHRhcm9rIEFsdGFyb2sgcnJnZ2JiIC0tIFRoZSBhdXRob3IncyBoYW5kbGUsIGFzIHRoZSBsaWNlbnNlIG5vdGljZSBhYm92ZSBuYW1lcyBpdCwgYW5kIHRoZSBoZXggY29sb3Igbm90YXRpb24uXG5cbmltcG9ydCB0eXBlIHtcbiAgRWRpdG9yLFxuICBFeHRyYUJ1dHRvbkNvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGFzc2VydE5ldmVyLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgRHJvcGRvd25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgU2V0dGluZyxcbiAgVGV4dEFyZWFDb21wb25lbnRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGFsQmFzZUNvbnN0cnVjdG9yUGFyYW1zLFxuICBNb2RhbFBhcmFtc0Jhc2Vcbn0gZnJvbSAnLi9tb2RhbC50cyc7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL3NldHRpbmctY29tcG9uZW50cy9tdWx0aXBsZS1kcm9wZG93bi1jb21wb25lbnQudHMnO1xuaW1wb3J0IHtcbiAgTW9kYWxCYXNlLFxuICBzaG93TW9kYWxcbn0gZnJvbSAnLi9tb2RhbC50cyc7XG5cbi8qKlxuICogQSBib29sZWFuIGZpZWxkLCByZW5kZXJlZCBhcyBhIHRvZ2dsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tCdWlsZGVyQm9vbGVhbkZpZWxkIGV4dGVuZHMgQ29kZUJsb2NrQnVpbGRlckZpZWxkQmFzZTxib29sZWFuPiB7XG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiB0aGUgZmllbGQuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogQSBjb2xvciBmaWVsZCwgcmVuZGVyZWQgYXMgYSBjb2xvciBwaWNrZXIuIFRoZSB2YWx1ZSBpcyB0aGUgY29sb3IgYXMgYCNycmdnYmJgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja0J1aWxkZXJDb2xvckZpZWxkIGV4dGVuZHMgQ29kZUJsb2NrQnVpbGRlckZpZWxkQmFzZTxzdHJpbmc+IHtcbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6ICdjb2xvcic7XG59XG5cbi8qKlxuICogQSBwYWlyIG9mIGNhc2NhZGluZyBkcm9wZG93bnM6IHRoZSBmaXJzdCBwaWNrcyBhIGdyb3VwLCB0aGUgc2Vjb25kIG9uZSBvZiB0aGF0IGdyb3VwJ3Mgb3B0aW9ucy4gT25seSB0aGUgc2Vjb25kXG4gKiBkcm9wZG93bidzIHZhbHVlIGlzIHdyaXR0ZW4gaW50byB0aGUgY29kZSBibG9jay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tCdWlsZGVyQ29uZGl0aW9uYWxEcm9wZG93bkZpZWxkIGV4dGVuZHMgQ29kZUJsb2NrQnVpbGRlckZpZWxkQmFzZTxzdHJpbmc+IHtcbiAgLyoqXG4gICAqIFRoZSBncm91cHMgb2Ygb3B0aW9ucy4gVGhlIGdyb3VwIGNvbnRhaW5pbmcge0BsaW5rIENvZGVCbG9ja0J1aWxkZXJGaWVsZEJhc2UuZGVmYXVsdFZhbHVlfSBpcyBzZWxlY3RlZCBmaXJzdCwgZWxzZVxuICAgKiB0aGUgZmlyc3QgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSBncm91cHM6IHJlYWRvbmx5IENvZGVCbG9ja0J1aWxkZXJPcHRpb25Hcm91cFtdO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiB0aGUgZmllbGQuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnY29uZGl0aW9uYWxEcm9wZG93bic7XG59XG5cbi8qKlxuICogQSBzaW5nbGUtY2hvaWNlIGRyb3Bkb3duIGZpZWxkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja0J1aWxkZXJEcm9wZG93bkZpZWxkIGV4dGVuZHMgQ29kZUJsb2NrQnVpbGRlckZpZWxkQmFzZTxzdHJpbmc+IHtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93bi5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvZGVCbG9ja0J1aWxkZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiB0aGUgZmllbGQuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnZHJvcGRvd24nO1xufVxuXG4vKipcbiAqIEEgZmllbGQgb2YgdGhlIGNvZGUgYmxvY2sgYnVpbGRlciwgb3RoZXIgdGhhbiBhIHtAbGluayBDb2RlQmxvY2tCdWlsZGVyR3JvdXB9LlxuICovXG5leHBvcnQgdHlwZSBDb2RlQmxvY2tCdWlsZGVyRmllbGQgPVxuICB8IENvZGVCbG9ja0J1aWxkZXJCb29sZWFuRmllbGRcbiAgfCBDb2RlQmxvY2tCdWlsZGVyQ29sb3JGaWVsZFxuICB8IENvZGVCbG9ja0J1aWxkZXJDb25kaXRpb25hbERyb3Bkb3duRmllbGRcbiAgfCBDb2RlQmxvY2tCdWlsZGVyRHJvcGRvd25GaWVsZFxuICB8IENvZGVCbG9ja0J1aWxkZXJGb2xkZXJGaWVsZFxuICB8IENvZGVCbG9ja0J1aWxkZXJNdWx0aXBsZURyb3Bkb3duRmllbGRcbiAgfCBDb2RlQmxvY2tCdWlsZGVyU2xpZGVyRmllbGRcbiAgfCBDb2RlQmxvY2tCdWlsZGVyVGV4dEZpZWxkO1xuXG4vKipcbiAqIFRoZSBtZW1iZXJzIGV2ZXJ5IHtAbGluayBDb2RlQmxvY2tCdWlsZGVyRmllbGR9IGhhcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIGZpZWxkJ3MgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJsb2NrQnVpbGRlckZpZWxkQmFzZTxWYWx1ZSBleHRlbmRzIENvZGVCbG9ja0J1aWxkZXJWYWx1ZT4ge1xuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBmaWVsZCBzdGFydHMgd2l0aC4gV2hpbGUgdGhlIGZpZWxkIGhvbGRzIGl0LCB0aGUgZmllbGQgd3JpdGVzIG5vdGhpbmcgaW50byB0aGUgY29kZSBibG9jaywgdW5sZXNzIGl0XG4gICAqIGlzIHtAbGluayBDb2RlQmxvY2tCdWlsZGVyRmllbGRCYXNlLmlzUmVxdWlyZWR9LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlOiBWYWx1ZTtcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBzaG93biB1bmRlciB0aGUgZmllbGQncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGFsd2F5cyB3cml0dGVuIGludG8gdGhlIGNvZGUgYmxvY2suIEEgcmVxdWlyZWQgZmllbGQgaXMgc2hvd24gYWJvdmUgdGhlIG9wdGlvbmFsIG9uZXMgYW5kIGhhc1xuICAgKiBubyByZXNldCBidXR0b24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzUmVxdWlyZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHRoZSBmaWVsZCdzIGxpbmUgaXMgd3JpdHRlbiB3aXRoLCBhbmQgdGhlIGtleSBvZiBpdHMgdmFsdWUgaW4gdGhlIHZhbHVlcyB0aGUgcHJldmlldyByZWNlaXZlcy4gVW5pcXVlIGFjcm9zc1xuICAgKiBhbGwgZmllbGRzLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCwgc2hvd24gdG8gdGhlIHVzZXIuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkJ3MgbGluZSBob2xkcyBpdHMgdmFsdWUgYWxvbmUsIHdpdGhvdXQgdGhlIGBrZXk6IGAgcHJlZml4LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRPbWl0S2V5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGZvbGRlciBmaWVsZDogYSBkcm9wZG93biBvZiBldmVyeSBmb2xkZXIgb2YgdGhlIHZhdWx0LiBUaGUgdmFsdWUgaXMgdGhlIGZvbGRlciBwYXRoLCBgL2AgZm9yIHRoZSB2YXVsdCByb290LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja0J1aWxkZXJGb2xkZXJGaWVsZCBleHRlbmRzIENvZGVCbG9ja0J1aWxkZXJGaWVsZEJhc2U8c3RyaW5nPiB7XG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiB0aGUgZmllbGQuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnZm9sZGVyJztcbn1cblxuLyoqXG4gKiBBIGNvbGxhcHNpYmxlIGdyb3VwIG9mIGZpZWxkcy4gT25lIGdyb3VwIGlzIGV4cGFuZGVkIGF0IGEgdGltZTogZXhwYW5kaW5nIGEgZ3JvdXAgY29sbGFwc2VzIHRoZSBvdGhlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJsb2NrQnVpbGRlckdyb3VwIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZHMgb2YgdGhlIGdyb3VwLiBBIHJlcXVpcmVkIGZpZWxkIGluc2lkZSBhIGdyb3VwIGlzIHN0aWxsIHdyaXR0ZW4gaW50byB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkczogcmVhZG9ubHkgQ29kZUJsb2NrQnVpbGRlckZpZWxkW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGdyb3VwIHN0YXJ0cyBleHBhbmRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbml0aWFsbHlFeHBhbmRlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBoZWFkaW5nIG9mIHRoZSBncm91cC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ2dyb3VwJztcbn1cblxuLyoqXG4gKiBBbiBlbnRyeSBvZiB7QGxpbmsgU2hvd0NvZGVCbG9ja0J1aWxkZXJQYXJhbXMuZmllbGRzfTogYSBmaWVsZCwgb3IgYSBncm91cCBvZiBmaWVsZHMuXG4gKi9cbmV4cG9ydCB0eXBlIENvZGVCbG9ja0J1aWxkZXJJbnB1dCA9IENvZGVCbG9ja0J1aWxkZXJGaWVsZCB8IENvZGVCbG9ja0J1aWxkZXJHcm91cDtcblxuLyoqXG4gKiBBIG11bHRpcGxlLWNob2ljZSBkcm9wZG93biBmaWVsZC4gSXRzIGxpbmUgaG9sZHMgdGhlIHNlbGVjdGVkIG9wdGlvbnMgam9pbmVkIGJ5XG4gKiB7QGxpbmsgQ29kZUJsb2NrQnVpbGRlck11bHRpcGxlRHJvcGRvd25GaWVsZC5zZXBhcmF0b3J9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja0J1aWxkZXJNdWx0aXBsZURyb3Bkb3duRmllbGQgZXh0ZW5kcyBDb2RlQmxvY2tCdWlsZGVyRmllbGRCYXNlPHJlYWRvbmx5IHN0cmluZ1tdPiB7XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd24uXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBDb2RlQmxvY2tCdWlsZGVyT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHRleHQgdGhlIHNlbGVjdGVkIG9wdGlvbnMgYXJlIGpvaW5lZCB3aXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJywnYFxuICAgKi9cbiAgcmVhZG9ubHkgc2VwYXJhdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiB0aGUgZmllbGQuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnbXVsdGlwbGVEcm9wZG93bic7XG59XG5cbi8qKlxuICogQSBuYW1lZCBncm91cCBvZiBvcHRpb25zIG9mIGEge0BsaW5rIENvZGVCbG9ja0J1aWxkZXJDb25kaXRpb25hbERyb3Bkb3duRmllbGR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja0J1aWxkZXJPcHRpb25Hcm91cCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZ3JvdXAsIHNob3duIGluIHRoZSBmaXJzdCBkcm9wZG93bi5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wdGlvbnMgb2YgdGhlIGdyb3VwLCBzaG93biBpbiB0aGUgc2Vjb25kIGRyb3Bkb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogQ29kZUJsb2NrQnVpbGRlck9wdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgb2YgYSBkcm9wZG93bjogYSBsaXN0IG9mIHZhbHVlcyBzaG93biBhcyB0aGV5IGFyZSwgb3IgYSBtYXAgZnJvbSBlYWNoIHZhbHVlIHRvIGl0cyBkaXNwbGF5IHRleHQuXG4gKi9cbmV4cG9ydCB0eXBlIENvZGVCbG9ja0J1aWxkZXJPcHRpb25zID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCByZWFkb25seSBzdHJpbmdbXTtcblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBvZiB7QGxpbmsgU2hvd0NvZGVCbG9ja0J1aWxkZXJQYXJhbXMub25VcGRhdGVQcmV2aWV3fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tCdWlsZGVyUHJldmlld1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29kZSBibG9jayBhcyBpdCBzdGFuZHMuXG4gICAqL1xuICByZWFkb25seSBjb2RlQmxvY2s6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gZHJhdyB0aGUgcHJldmlldyBpbnRvLiBUaGUgbW9kYWwgbmV2ZXIgY2xlYXJzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJldmlld0VsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgZXZlcnkgZmllbGQsIGJ5IGl0cyBrZXkuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgQ29kZUJsb2NrQnVpbGRlclZhbHVlPjtcbn1cblxuLyoqXG4gKiBBIHNsaWRlciBmaWVsZC4gQSB7QGxpbmsgQ29kZUJsb2NrQnVpbGRlckZpZWxkQmFzZS5kZWZhdWx0VmFsdWV9IG91dHNpZGUgdGhlIGJvdW5kcyB3aWRlbnMgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tCdWlsZGVyU2xpZGVyRmllbGQgZXh0ZW5kcyBDb2RlQmxvY2tCdWlsZGVyRmllbGRCYXNlPG51bWJlcj4ge1xuICAvKipcbiAgICogVGhlIHVwcGVyIGJvdW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb3dlciBib3VuZC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZXA6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIGZpZWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ3NsaWRlcic7XG59XG5cbi8qKlxuICogQSB0ZXh0IGZpZWxkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja0J1aWxkZXJUZXh0RmllbGQgZXh0ZW5kcyBDb2RlQmxvY2tCdWlsZGVyRmllbGRCYXNlPHN0cmluZz4ge1xuICAvKipcbiAgICogQSBwbGFjZWhvbGRlciBzaG93biB3aGlsZSB0aGUgZmllbGQgaXMgZW1wdHkuXG4gICAqL1xuICByZWFkb25seSBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIGZpZWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ3RleHQnO1xuXG4gIC8qKlxuICAgKiBBIHBhdHRlcm4gdGhlIHZhbHVlIG11c3QgbWF0Y2guIFdoaWxlIGl0IGRvZXMgbm90LCB0aGUgZmllbGQgaXMgbWFya2VkIGludmFsaWQgYW5kIGtlZXBzIGl0cyBsYXN0IHZhbGlkIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvblBhdHRlcm4/OiBSZWdFeHA7XG59XG5cbi8qKlxuICogVGhlIHZhbHVlIG9mIGEge0BsaW5rIENvZGVCbG9ja0J1aWxkZXJGaWVsZH0uXG4gKi9cbmV4cG9ydCB0eXBlIENvZGVCbG9ja0J1aWxkZXJWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZztcblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBvZiB7QGxpbmsgZm9ybWF0Q29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRDb2RlQmxvY2tQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZpZWxkcyBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkczogcmVhZG9ubHkgQ29kZUJsb2NrQnVpbGRlcklucHV0W107XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiBlYWNoIGZpZWxkLCBieSBpdHMga2V5LiBBIGZpZWxkIG1pc3NpbmcgZnJvbSBpdCBob2xkcyBpdHMgZGVmYXVsdCB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBDb2RlQmxvY2tCdWlsZGVyVmFsdWU+O1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIG9mIHtAbGluayBzaG93Q29kZUJsb2NrQnVpbGRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvd0NvZGVCbG9ja0J1aWxkZXJQYXJhbXMgZXh0ZW5kcyBNb2RhbFBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVkaXRvciB0aGUgSW5zZXJ0IGJ1dHRvbiB3cml0ZXMgaW50by5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGFjdGl2ZSBlZGl0b3Igd2hlbiB0aGUgbW9kYWwgb3BlbnMuXG4gICAqL1xuICByZWFkb25seSBlZGl0b3I/OiBFZGl0b3IgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGRzIG9mIHRoZSBjb2RlIGJsb2NrLCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgd3JpdHRlbiBpbnRvIGl0LiBSZXF1aXJlZCBmaWVsZHMgYXJlIHNob3duIGZpcnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGRzOiByZWFkb25seSBDb2RlQmxvY2tCdWlsZGVySW5wdXRbXTtcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIG9mIHRoZSBjb2RlIGJsb2NrOiB0aGUgdGV4dCBhZnRlciBpdHMgb3BlbmluZyBmZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERyYXdzIGEgbGl2ZSBwcmV2aWV3IG9mIHRoZSBjb2RlIGJsb2NrLiBDYWxsZWQgb25jZSB3aGVuIHRoZSBtb2RhbCBvcGVucyBhbmQgYWdhaW4gYWZ0ZXIgZXZlcnkgY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHByZXZpZXcgZWxlbWVudCwgdGhlIGNvZGUgYmxvY2sgYW5kIHRoZSBjdXJyZW50IHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uVXBkYXRlUHJldmlldz86IChwYXJhbXM6IENvZGVCbG9ja0J1aWxkZXJQcmV2aWV3UGFyYW1zKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgdGl0bGUgb2YgdGhlIG1vZGFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ0NvZGUgYmxvY2sgYnVpbGRlcidgXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9TRVBBUkFUT1IgPSAnLCc7XG5jb25zdCBNSU5fRkVOQ0VfTEVOR1RIID0gMztcbmNvbnN0IFJPT1RfRk9MREVSX1BBVEggPSAnLyc7XG5cbnR5cGUgQ29kZUJsb2NrQnVpbGRlck1vZGFsQ29uc3RydWN0b3JQYXJhbXMgPSBNb2RhbEJhc2VDb25zdHJ1Y3RvclBhcmFtczxudWxsIHwgc3RyaW5nPiAmIFNob3dDb2RlQmxvY2tCdWlsZGVyUGFyYW1zO1xuXG5pbnRlcmZhY2UgR3JvdXBTdGF0ZSB7XG4gIHJlYWRvbmx5IGJ1dHRvbjogRXh0cmFCdXR0b25Db21wb25lbnQ7XG4gIHJlYWRvbmx5IGdyb3VwRWw6IEhUTUxFbGVtZW50O1xufVxuXG5jbGFzcyBDb2RlQmxvY2tCdWlsZGVyTW9kYWwgZXh0ZW5kcyBNb2RhbEJhc2U8bnVsbCB8IHN0cmluZz4ge1xuICBwcml2YXRlIGNvZGVCbG9jayA9ICcnO1xuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcjogRWRpdG9yIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWVsZHM6IHJlYWRvbmx5IENvZGVCbG9ja0J1aWxkZXJJbnB1dFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwU3RhdGVzOiBHcm91cFN0YXRlW10gPSBbXTtcbiAgcHJpdmF0ZSBpbnNlcnRlZENvZGVCbG9jazogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwZGF0ZVByZXZpZXc6ICgocGFyYW1zOiBDb2RlQmxvY2tCdWlsZGVyUHJldmlld1BhcmFtcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb3V0cHV0Q29tcG9uZW50OiBudWxsIHwgVGV4dEFyZWFDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHByZXZpZXdFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlcyA9IG5ldyBNYXA8c3RyaW5nLCBDb2RlQmxvY2tCdWlsZGVyVmFsdWU+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29kZUJsb2NrQnVpbGRlck1vZGFsQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuICAgIHRoaXMuYWRkQ3NzQ2xhc3NlcyhDc3NDbGFzcy5Db2RlQmxvY2tCdWlsZGVyTW9kYWwpO1xuICAgIHRoaXMuZWRpdG9yID0gcGFyYW1zLmVkaXRvciA9PT0gdW5kZWZpbmVkID8gcGFyYW1zLmFwcC53b3Jrc3BhY2UuYWN0aXZlRWRpdG9yPy5lZGl0b3IgPz8gbnVsbCA6IHBhcmFtcy5lZGl0b3I7XG4gICAgdGhpcy5maWVsZHMgPSBwYXJhbXMuZmllbGRzO1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBwYXJhbXMubGFuZ3VhZ2U7XG4gICAgdGhpcy5vblVwZGF0ZVByZXZpZXcgPSBwYXJhbXMub25VcGRhdGVQcmV2aWV3O1xuICAgIHRoaXMudGl0bGUgPSBwYXJhbXMudGl0bGUgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5jb2RlQmxvY2tCdWlsZGVyLnRpdGxlKTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZsYXR0ZW5GaWVsZHModGhpcy5maWVsZHMpKSB7XG4gICAgICB0aGlzLnZhbHVlcy5zZXQoZmllbGQua2V5LCBmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucHJvbWlzZVJlc29sdmUodGhpcy5pbnNlcnRlZENvZGVCbG9jayk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25PcGVuKCk6IHZvaWQge1xuICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KHRoaXMudGl0bGUpO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgaWYgKGlucHV0LnR5cGUgIT09ICdncm91cCcgJiYgaW5wdXQuaXNSZXF1aXJlZCkge1xuICAgICAgICB0aGlzLnJlbmRlckZpZWxkKHRoaXMuY29udGVudEVsLCBpbnB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJHcm91cChpbnB1dCk7XG4gICAgICB9IGVsc2UgaWYgKCFpbnB1dC5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMucmVuZGVyRmllbGQodGhpcy5jb250ZW50RWwsIGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByZXZpZXdFbCA9IHRoaXMuY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogQ3NzQ2xhc3MuQ29kZUJsb2NrQnVpbGRlclByZXZpZXcgfSk7XG4gICAgdGhpcy5yZW5kZXJPdXRwdXQoKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZXNldEJ1dHRvbihzZXR0aW5nOiBTZXR0aW5nLCBmaWVsZDogQ29kZUJsb2NrQnVpbGRlckZpZWxkLCByZXNldDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0dGluZy5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b25cbiAgICAgICAgLnNldEljb24oJ2x1Y2lkZS1yb3RhdGUtY2N3JylcbiAgICAgICAgLnNldFRvb2x0aXAodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5jb2RlQmxvY2tCdWlsZGVyLnJlc2V0LCB7IHZhbHVlOiBmb3JtYXRWYWx1ZShmaWVsZCwgZmllbGQuZGVmYXVsdFZhbHVlKSB8fCAnXCJcIicgfSkpXG4gICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoZmllbGQua2V5LCBmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb250YWluZXJFbC53aW4ubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5jb2RlQmxvY2spO1xuICAgICAgbmV3IE5vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmNvZGVCbG9ja0J1aWxkZXIuY29waWVkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBuZXcgTm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuY29kZUJsb2NrQnVpbGRlci5jb3B5RmFpbGVkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikge1xuICAgICAgbmV3IE5vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmNvZGVCbG9ja0J1aWxkZXIuaW5zZXJ0VW5hdmFpbGFibGUpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLmVkaXRvci5nZXRDdXJzb3IoJ2Zyb20nKTtcbiAgICBjb25zdCB0ZXh0QmVmb3JlQ3Vyc29yID0gdGhpcy5lZGl0b3IuZ2V0TGluZShjdXJzb3IubGluZSkuc2xpY2UoMCwgY3Vyc29yLmNoKTtcbiAgICBjb25zdCBwcmVmaXggPSB0ZXh0QmVmb3JlQ3Vyc29yID09PSAnJyA/ICcnIDogJ1xcbic7XG4gICAgdGhpcy5lZGl0b3IucmVwbGFjZVNlbGVjdGlvbihgJHtwcmVmaXh9JHt0aGlzLmNvZGVCbG9ja31cXG5gKTtcbiAgICB0aGlzLmluc2VydGVkQ29kZUJsb2NrID0gdGhpcy5jb2RlQmxvY2s7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCb29sZWFuRmllbGQoc2V0dGluZzogU2V0dGluZywgZmllbGQ6IENvZGVCbG9ja0J1aWxkZXJCb29sZWFuRmllbGQpOiB2b2lkIHtcbiAgICBzZXR0aW5nLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICB0b2dnbGVcbiAgICAgICAgLnNldFZhbHVlKGZpZWxkLmRlZmF1bHRWYWx1ZSlcbiAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoZmllbGQua2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRSZXNldEJ1dHRvbihzZXR0aW5nLCBmaWVsZCwgKCkgPT4ge1xuICAgICAgICB0b2dnbGUuc2V0VmFsdWUoZmllbGQuZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb2xvckZpZWxkKHNldHRpbmc6IFNldHRpbmcsIGZpZWxkOiBDb2RlQmxvY2tCdWlsZGVyQ29sb3JGaWVsZCk6IHZvaWQge1xuICAgIHNldHRpbmcuYWRkQ29sb3JQaWNrZXIoKGNvbG9yUGlja2VyKSA9PiB7XG4gICAgICBjb2xvclBpY2tlclxuICAgICAgICAuc2V0VmFsdWUoZmllbGQuZGVmYXVsdFZhbHVlKVxuICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShmaWVsZC5rZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLmFkZFJlc2V0QnV0dG9uKHNldHRpbmcsIGZpZWxkLCAoKSA9PiB7XG4gICAgICAgIGNvbG9yUGlja2VyLnNldFZhbHVlKGZpZWxkLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29uZGl0aW9uYWxEcm9wZG93bkZpZWxkKHNldHRpbmc6IFNldHRpbmcsIGZpZWxkOiBDb2RlQmxvY2tCdWlsZGVyQ29uZGl0aW9uYWxEcm9wZG93bkZpZWxkKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbEdyb3VwSW5kZXggPSBNYXRoLm1heCgwLCBmaWVsZC5ncm91cHMuZmluZEluZGV4KChncm91cCkgPT4gT2JqZWN0Lmhhc093bih0b1JlY29yZChncm91cC5vcHRpb25zKSwgZmllbGQuZGVmYXVsdFZhbHVlKSkpO1xuICAgIGNvbnN0IGdyb3VwRHJvcGRvd24gPSBuZXcgRHJvcGRvd25Db21wb25lbnQoc2V0dGluZy5jb250cm9sRWwpO1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBncm91cF0gb2YgZmllbGQuZ3JvdXBzLmVudHJpZXMoKSkge1xuICAgICAgZ3JvdXBEcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKGluZGV4KSwgZ3JvdXAubmFtZSk7XG4gICAgfVxuICAgIGdyb3VwRHJvcGRvd24uc2V0VmFsdWUoU3RyaW5nKGluaXRpYWxHcm91cEluZGV4KSk7XG5cbiAgICBjb25zdCBvcHRpb25Ecm9wZG93biA9IG5ldyBEcm9wZG93bkNvbXBvbmVudChzZXR0aW5nLmNvbnRyb2xFbCk7XG5cbiAgICBmdW5jdGlvbiBmaWxsT3B0aW9ucyhncm91cEluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0b1JlY29yZChmaWVsZC5ncm91cHNbZ3JvdXBJbmRleF0/Lm9wdGlvbnMgPz8gW10pO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlID8/IE9iamVjdC5rZXlzKG9wdGlvbnMpWzBdID8/ICcnO1xuICAgICAgb3B0aW9uRHJvcGRvd24uc2VsZWN0RWwuZW1wdHkoKTtcbiAgICAgIG9wdGlvbkRyb3Bkb3duLmFkZE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICBvcHRpb25Ecm9wZG93bi5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlKTtcbiAgICAgIHJldHVybiBzZWxlY3RlZFZhbHVlO1xuICAgIH1cblxuICAgIGZpbGxPcHRpb25zKGluaXRpYWxHcm91cEluZGV4LCBmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAgIG9wdGlvbkRyb3Bkb3duLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgdGhpcy5zZXRWYWx1ZShmaWVsZC5rZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIGdyb3VwRHJvcGRvd24ub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICB0aGlzLnNldFZhbHVlKGZpZWxkLmtleSwgZmlsbE9wdGlvbnMoTnVtYmVyKHZhbHVlKSkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRSZXNldEJ1dHRvbihzZXR0aW5nLCBmaWVsZCwgKCkgPT4ge1xuICAgICAgZ3JvdXBEcm9wZG93bi5zZXRWYWx1ZShTdHJpbmcoaW5pdGlhbEdyb3VwSW5kZXgpKTtcbiAgICAgIGZpbGxPcHRpb25zKGluaXRpYWxHcm91cEluZGV4LCBmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJEcm9wZG93bkZpZWxkKHNldHRpbmc6IFNldHRpbmcsIGZpZWxkOiBDb2RlQmxvY2tCdWlsZGVyRHJvcGRvd25GaWVsZCk6IHZvaWQge1xuICAgIHNldHRpbmcuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PiB7XG4gICAgICBkcm9wZG93blxuICAgICAgICAuYWRkT3B0aW9ucyh0b1JlY29yZChmaWVsZC5vcHRpb25zKSlcbiAgICAgICAgLnNldFZhbHVlKGZpZWxkLmRlZmF1bHRWYWx1ZSlcbiAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoZmllbGQua2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRSZXNldEJ1dHRvbihzZXR0aW5nLCBmaWVsZCwgKCkgPT4ge1xuICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckZpZWxkKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgZmllbGQ6IENvZGVCbG9ja0J1aWxkZXJGaWVsZCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0TmFtZShmaWVsZC5uYW1lKTtcbiAgICBpZiAoZmllbGQuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0dGluZy5zZXREZXNjKGZpZWxkLmRlc2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIHRoaXMucmVuZGVyQm9vbGVhbkZpZWxkKHNldHRpbmcsIGZpZWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb2xvcic6IHtcbiAgICAgICAgdGhpcy5yZW5kZXJDb2xvckZpZWxkKHNldHRpbmcsIGZpZWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb25kaXRpb25hbERyb3Bkb3duJzoge1xuICAgICAgICB0aGlzLnJlbmRlckNvbmRpdGlvbmFsRHJvcGRvd25GaWVsZChzZXR0aW5nLCBmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZHJvcGRvd24nOiB7XG4gICAgICAgIHRoaXMucmVuZGVyRHJvcGRvd25GaWVsZChzZXR0aW5nLCBmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZm9sZGVyJzoge1xuICAgICAgICB0aGlzLnJlbmRlckZvbGRlckZpZWxkKHNldHRpbmcsIGZpZWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdtdWx0aXBsZURyb3Bkb3duJzoge1xuICAgICAgICB0aGlzLnJlbmRlck11bHRpcGxlRHJvcGRvd25GaWVsZChzZXR0aW5nLCBmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc2xpZGVyJzoge1xuICAgICAgICB0aGlzLnJlbmRlclNsaWRlckZpZWxkKHNldHRpbmcsIGZpZWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICB0aGlzLnJlbmRlclRleHRGaWVsZChzZXR0aW5nLCBmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBhc3NlcnROZXZlcihmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJGb2xkZXJGaWVsZChzZXR0aW5nOiBTZXR0aW5nLCBmaWVsZDogQ29kZUJsb2NrQnVpbGRlckZvbGRlckZpZWxkKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFtST09UX0ZPTERFUl9QQVRIXTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5jb2RlQmxvY2tCdWlsZGVyLnJvb3RGb2xkZXIpXG4gICAgfTtcbiAgICBjb25zdCBmb2xkZXJQYXRocyA9IHRoaXMuYXBwLnZhdWx0LmdldEFsbEZvbGRlcnMoZmFsc2UpLm1hcCgoZm9sZGVyKSA9PiBmb2xkZXIucGF0aCkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICBmb3IgKGNvbnN0IGZvbGRlclBhdGggb2YgZm9sZGVyUGF0aHMpIHtcbiAgICAgIG9wdGlvbnNbZm9sZGVyUGF0aF0gPSBmb2xkZXJQYXRoO1xuICAgIH1cblxuICAgIG9wdGlvbnNbZmllbGQuZGVmYXVsdFZhbHVlXSA/Pz0gZmllbGQuZGVmYXVsdFZhbHVlO1xuXG4gICAgc2V0dGluZy5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcbiAgICAgIGRyb3Bkb3duXG4gICAgICAgIC5hZGRPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUpXG4gICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGZpZWxkLmtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIHRoaXMuYWRkUmVzZXRCdXR0b24oc2V0dGluZywgZmllbGQsICgpID0+IHtcbiAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUoZmllbGQuZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJHcm91cChncm91cDogQ29kZUJsb2NrQnVpbGRlckdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBFbCA9IHRoaXMuY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogQ3NzQ2xhc3MuQ29kZUJsb2NrQnVpbGRlckdyb3VwIH0pO1xuICAgIGNvbnN0IGhlYWRpbmdTZXR0aW5nID0gbmV3IFNldHRpbmcoZ3JvdXBFbCkuc2V0TmFtZShncm91cC5uYW1lKS5zZXRIZWFkaW5nKCk7XG4gICAgY29uc3QgYm9keUVsID0gZ3JvdXBFbC5jcmVhdGVEaXYoeyBjbHM6IENzc0NsYXNzLkNvZGVCbG9ja0J1aWxkZXJHcm91cEJvZHkgfSk7XG5cbiAgICBncm91cEVsLmFkZENsYXNzKENzc0NsYXNzLklzQ29sbGFwc2VkKTtcbiAgICBoZWFkaW5nU2V0dGluZy5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICBjb25zdCBncm91cFN0YXRlID0geyBidXR0b24sIGdyb3VwRWwgfTtcbiAgICAgIHRoaXMuZ3JvdXBTdGF0ZXMucHVzaChncm91cFN0YXRlKTtcbiAgICAgIHVwZGF0ZUdyb3VwSWNvbihncm91cFN0YXRlKTtcbiAgICAgIGJ1dHRvbi5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRHcm91cEV4cGFuZGVkKGdyb3VwRWwsIGdyb3VwRWwuaGFzQ2xhc3MoQ3NzQ2xhc3MuSXNDb2xsYXBzZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBncm91cC5maWVsZHMpIHtcbiAgICAgIHRoaXMucmVuZGVyRmllbGQoYm9keUVsLCBmaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwLmlzSW5pdGlhbGx5RXhwYW5kZWQpIHtcbiAgICAgIHRoaXMuc2V0R3JvdXBFeHBhbmRlZChncm91cEVsLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck11bHRpcGxlRHJvcGRvd25GaWVsZChzZXR0aW5nOiBTZXR0aW5nLCBmaWVsZDogQ29kZUJsb2NrQnVpbGRlck11bHRpcGxlRHJvcGRvd25GaWVsZCk6IHZvaWQge1xuICAgIGNvbnN0IGRyb3Bkb3duID0gbmV3IE11bHRpcGxlRHJvcGRvd25Db21wb25lbnQoc2V0dGluZy5jb250cm9sRWwpXG4gICAgICAuYWRkT3B0aW9ucyh0b1JlY29yZChmaWVsZC5vcHRpb25zKSlcbiAgICAgIC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUpXG4gICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUoZmllbGQua2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICBzZXR0aW5nLmFkZENvbXBvbmVudCgoKSA9PiBkcm9wZG93bik7XG4gICAgdGhpcy5hZGRSZXNldEJ1dHRvbihzZXR0aW5nLCBmaWVsZCwgKCkgPT4ge1xuICAgICAgZHJvcGRvd24uc2V0VmFsdWUoZmllbGQuZGVmYXVsdFZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3V0cHV0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmcgPSBuZXcgU2V0dGluZyh0aGlzLmNvbnRlbnRFbCkuc2V0TmFtZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmNvZGVCbG9ja0J1aWxkZXIub3V0cHV0KSk7XG4gICAgc2V0dGluZy5zZXR0aW5nRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuQ29kZUJsb2NrQnVpbGRlck91dHB1dCk7XG4gICAgc2V0dGluZy5hZGRUZXh0QXJlYSgodGV4dEFyZWEpID0+IHtcbiAgICAgIHRoaXMub3V0cHV0Q29tcG9uZW50ID0gdGV4dEFyZWE7XG4gICAgICB0ZXh0QXJlYS5pbnB1dEVsLnJlYWRPbmx5ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBzZXR0aW5nLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvblxuICAgICAgICAuc2V0SWNvbignbHVjaWRlLWNvcHknKVxuICAgICAgICAuc2V0VG9vbHRpcCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmNvZGVCbG9ja0J1aWxkZXIuY29weSkpXG4gICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLmNvcHkoKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHNldHRpbmcuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uXG4gICAgICAgIC5zZXRJY29uKCdsdWNpZGUtZmlsZS1pbnB1dCcpXG4gICAgICAgIC5zZXRUb29sdGlwKHQoKCQpID0+IHRoaXMuZWRpdG9yID8gJC5vYnNpZGlhbkxpYi5jb2RlQmxvY2tCdWlsZGVyLmluc2VydCA6ICQub2JzaWRpYW5MaWIuY29kZUJsb2NrQnVpbGRlci5pbnNlcnRVbmF2YWlsYWJsZSkpXG4gICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmluc2VydCgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU2xpZGVyRmllbGQoc2V0dGluZzogU2V0dGluZywgZmllbGQ6IENvZGVCbG9ja0J1aWxkZXJTbGlkZXJGaWVsZCk6IHZvaWQge1xuICAgIHNldHRpbmcuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcbiAgICAgIHNsaWRlclxuICAgICAgICAuc2V0TGltaXRzKE1hdGgubWluKGZpZWxkLm1pbiwgZmllbGQuZGVmYXVsdFZhbHVlKSwgTWF0aC5tYXgoZmllbGQubWF4LCBmaWVsZC5kZWZhdWx0VmFsdWUpLCBmaWVsZC5zdGVwKVxuICAgICAgICAuc2V0VmFsdWUoZmllbGQuZGVmYXVsdFZhbHVlKVxuICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShmaWVsZC5rZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLmFkZFJlc2V0QnV0dG9uKHNldHRpbmcsIGZpZWxkLCAoKSA9PiB7XG4gICAgICAgIHNsaWRlci5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRleHRGaWVsZChzZXR0aW5nOiBTZXR0aW5nLCBmaWVsZDogQ29kZUJsb2NrQnVpbGRlclRleHRGaWVsZCk6IHZvaWQge1xuICAgIHNldHRpbmcuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgdGV4dFxuICAgICAgICAuc2V0UGxhY2Vob2xkZXIoZmllbGQucGxhY2Vob2xkZXIgPz8gJycpXG4gICAgICAgIC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUpXG4gICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoZmllbGQudmFsaWRhdGlvblBhdHRlcm4gJiYgIWRvZXNNYXRjaFBhdHRlcm4oZmllbGQudmFsaWRhdGlvblBhdHRlcm4sIHZhbHVlKSkge1xuICAgICAgICAgICAgdGV4dC5pbnB1dEVsLnNldEN1c3RvbVZhbGlkaXR5KHQoKCQpID0+ICQub2JzaWRpYW5MaWIuY29kZUJsb2NrQnVpbGRlci5pbnZhbGlkVmFsdWUpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0ZXh0LmlucHV0RWwuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoZmllbGQua2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRSZXNldEJ1dHRvbihzZXR0aW5nLCBmaWVsZCwgKCkgPT4ge1xuICAgICAgICB0ZXh0LnNldFZhbHVlKGZpZWxkLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIHRleHQuaW5wdXRFbC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0R3JvdXBFeHBhbmRlZChncm91cEVsOiBIVE1MRWxlbWVudCwgaXNFeHBhbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZ3JvdXBTdGF0ZSBvZiB0aGlzLmdyb3VwU3RhdGVzKSB7XG4gICAgICBjb25zdCBzaG91bGRFeHBhbmQgPSBpc0V4cGFuZGVkICYmIGdyb3VwU3RhdGUuZ3JvdXBFbCA9PT0gZ3JvdXBFbDtcbiAgICAgIGdyb3VwU3RhdGUuZ3JvdXBFbC50b2dnbGVDbGFzcyhDc3NDbGFzcy5Jc0NvbGxhcHNlZCwgIXNob3VsZEV4cGFuZCk7XG4gICAgICB1cGRhdGVHcm91cEljb24oZ3JvdXBTdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IENvZGVCbG9ja0J1aWxkZXJWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVzLnNldChrZXksIHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5jb2RlQmxvY2sgPSBmb3JtYXRDb2RlQmxvY2soe1xuICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcyxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgdmFsdWVzOiB0aGlzLnZhbHVlc1xuICAgIH0pO1xuXG4gICAgLy8gT25seSByZWFjaGVkIG9uY2UgYG9uT3BlbmAgaGFzIHJlbmRlcmVkIHRoZSBvdXRwdXQgYW5kIHRoZSBwcmV2aWV3IGVsZW1lbnQuXG4gICAgY29uc3Qgb3V0cHV0Q29tcG9uZW50ID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vdXRwdXRDb21wb25lbnQpO1xuICAgIG91dHB1dENvbXBvbmVudC5zZXRWYWx1ZSh0aGlzLmNvZGVCbG9jayk7XG4gICAgb3V0cHV0Q29tcG9uZW50LmlucHV0RWwucm93cyA9IHRoaXMuY29kZUJsb2NrLnNwbGl0KCdcXG4nKS5sZW5ndGg7XG5cbiAgICBpZiAodGhpcy5vblVwZGF0ZVByZXZpZXcpIHtcbiAgICAgIHRoaXMub25VcGRhdGVQcmV2aWV3KHtcbiAgICAgICAgY29kZUJsb2NrOiB0aGlzLmNvZGVCbG9jayxcbiAgICAgICAgcHJldmlld0VsOiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLnByZXZpZXdFbCksXG4gICAgICAgIHZhbHVlczogdGhpcy52YWx1ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBjb2RlIGJsb2NrIGZyb20gaXRzIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWVzLlxuICpcbiAqIEVhY2ggZmllbGQgaG9sZGluZyBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGRlZmF1bHQsIG9yIG1hcmtlZCB7QGxpbmsgQ29kZUJsb2NrQnVpbGRlckZpZWxkQmFzZS5pc1JlcXVpcmVkfSwgd3JpdGVzIG9uZVxuICogbGluZSwgaW4gdGhlIG9yZGVyIG9mIHRoZSBmaWVsZHM7IGFuIGVtcHR5IHZhbHVlIHdyaXRlcyBub3RoaW5nLiBUaGUgZmVuY2UgaXMgb25lIGJhY2t0aWNrIGxvbmdlciB0aGFuIHRoZSBsb25nZXN0XG4gKiBiYWNrdGljayBydW4gaW4gdGhlIGxpbmVzLCBhbmQgbmV2ZXIgc2hvcnRlciB0aGFuIHRocmVlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGRzLCB0aGUgbGFuZ3VhZ2UgYW5kIHRoZSB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgY29kZSBibG9jaywgd2l0aG91dCBhIHRyYWlsaW5nIG5ld2xpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDb2RlQmxvY2socGFyYW1zOiBGb3JtYXRDb2RlQmxvY2tQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmbGF0dGVuRmllbGRzKHBhcmFtcy5maWVsZHMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbXMudmFsdWVzLmdldChmaWVsZC5rZXkpID8/IGZpZWxkLmRlZmF1bHRWYWx1ZTtcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdFZhbHVlKGZpZWxkLCB2YWx1ZSk7XG4gICAgaWYgKGZvcm1hdHRlZFZhbHVlID09PSAnJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFmaWVsZC5pc1JlcXVpcmVkICYmIGlzU2FtZVZhbHVlKHZhbHVlLCBmaWVsZC5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKGZpZWxkLnNob3VsZE9taXRLZXkgPyBmb3JtYXR0ZWRWYWx1ZSA6IGAke2ZpZWxkLmtleX06ICR7Zm9ybWF0dGVkVmFsdWV9YCk7XG4gIH1cblxuICBjb25zdCBib2R5ID0gbGluZXMuam9pbignXFxuJyk7XG4gIGNvbnN0IGxvbmdlc3RCYWNrdGlja1J1biA9IE1hdGgubWF4KDAsIC4uLkFycmF5LmZyb20oYm9keS5tYXRjaEFsbCgvYCsvZyksIChtYXRjaCkgPT4gbWF0Y2hbMF0ubGVuZ3RoKSk7XG4gIGNvbnN0IGZlbmNlID0gJ2AnLnJlcGVhdChNYXRoLm1heChNSU5fRkVOQ0VfTEVOR1RILCBsb25nZXN0QmFja3RpY2tSdW4gKyAxKSk7XG4gIHJldHVybiBsaW5lcy5sZW5ndGggPT09IDAgPyBgJHtmZW5jZX0ke3BhcmFtcy5sYW5ndWFnZX1cXG4ke2ZlbmNlfWAgOiBgJHtmZW5jZX0ke3BhcmFtcy5sYW5ndWFnZX1cXG4ke2JvZHl9XFxuJHtmZW5jZX1gO1xufVxuXG4vKipcbiAqIE9wZW5zIHRoZSBjb2RlIGJsb2NrIGJ1aWxkZXIgbW9kYWwuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZHMgb2YgdGhlIGNvZGUgYmxvY2sgYW5kIGhvdyB0byBwcmVzZW50IHRoZW0uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvZGUgYmxvY2sgd2hlbiB0aGUgdXNlciBpbnNlcnRlZCBpdCBpbnRvIHRoZSBub3RlLCBvciB3aXRoIGBudWxsYFxuICogd2hlbiB0aGUgbW9kYWwgd2FzIGNsb3NlZCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93Q29kZUJsb2NrQnVpbGRlcihwYXJhbXM6IFNob3dDb2RlQmxvY2tCdWlsZGVyUGFyYW1zKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIHJldHVybiBhd2FpdCBzaG93TW9kYWw8bnVsbCB8IHN0cmluZz4oKHByb21pc2VSZXNvbHZlKSA9PlxuICAgIG5ldyBDb2RlQmxvY2tCdWlsZGVyTW9kYWwoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcHJvbWlzZVJlc29sdmVcbiAgICB9KVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzTWF0Y2hQYXR0ZXJuKHBhdHRlcm46IFJlZ0V4cCwgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuRmllbGRzKGlucHV0czogcmVhZG9ubHkgQ29kZUJsb2NrQnVpbGRlcklucHV0W10pOiBDb2RlQmxvY2tCdWlsZGVyRmllbGRbXSB7XG4gIHJldHVybiBpbnB1dHMuZmxhdE1hcCgoaW5wdXQpID0+IGlucHV0LnR5cGUgPT09ICdncm91cCcgPyBpbnB1dC5maWVsZHMgOiBbaW5wdXRdKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoZmllbGQ6IENvZGVCbG9ja0J1aWxkZXJGaWVsZCwgdmFsdWU6IENvZGVCbG9ja0J1aWxkZXJWYWx1ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHNlcGFyYXRvciA9IGZpZWxkLnR5cGUgPT09ICdtdWx0aXBsZURyb3Bkb3duJyA/IGZpZWxkLnNlcGFyYXRvciA/PyBERUZBVUxUX1NFUEFSQVRPUiA6IERFRkFVTFRfU0VQQVJBVE9SO1xuICByZXR1cm4gaXNTdHJpbmdBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKHNlcGFyYXRvcikgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVWYWx1ZShhOiBDb2RlQmxvY2tCdWlsZGVyVmFsdWUsIGI6IENvZGVCbG9ja0J1aWxkZXJWYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNTdHJpbmdBcnJheShhKSAmJiBpc1N0cmluZ0FycmF5KGIpID8gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBpdGVtID09PSBiW2luZGV4XSkgOiBhID09PSBiO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgcmVhZG9ubHkgc3RyaW5nW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHRvUmVjb3JkKG9wdGlvbnM6IENvZGVCbG9ja0J1aWxkZXJPcHRpb25zKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBpc1N0cmluZ0FycmF5KG9wdGlvbnMpID8gT2JqZWN0LmZyb21FbnRyaWVzKG9wdGlvbnMubWFwKChvcHRpb24pID0+IFtvcHRpb24sIG9wdGlvbl0pKSA6IHsgLi4ub3B0aW9ucyB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVHcm91cEljb24oZ3JvdXBTdGF0ZTogR3JvdXBTdGF0ZSk6IHZvaWQge1xuICBncm91cFN0YXRlLmJ1dHRvbi5zZXRJY29uKGdyb3VwU3RhdGUuZ3JvdXBFbC5oYXNDbGFzcyhDc3NDbGFzcy5Jc0NvbGxhcHNlZCkgPyAnbHVjaWRlLWNoZXZyb24tZG93bicgOiAnbHVjaWRlLWNoZXZyb24tdXAnKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQ0EsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBT1AsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsaUNBQWlDO0FBQzFDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBa1VQLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sbUJBQW1CO0FBU3pCLE1BQU0sOEJBQThCLFVBQXlCO0FBQUEsRUFDbkQsWUFBWTtBQUFBLEVBQ0g7QUFBQSxFQUNBO0FBQUEsRUFDQSxjQUE0QixDQUFDO0FBQUEsRUFDdEMsb0JBQW1DO0FBQUEsRUFDMUI7QUFBQSxFQUNBO0FBQUEsRUFDVCxrQkFBNEM7QUFBQSxFQUM1QyxZQUFnQztBQUFBLEVBQ3ZCO0FBQUEsRUFDQSxTQUFTLG9CQUFJLElBQW1DO0FBQUEsRUFFMUQsWUFBWSxRQUFnRDtBQUNqRSxVQUFNLE1BQU07QUFDWixTQUFLLGNBQWMsU0FBUyxxQkFBcUI7QUFDakQsU0FBSyxTQUFTLE9B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
@@ -1,5 +1,6 @@
1
1
  /// <reference path="../library-references.d.mts" />
2
2
  export * as 'alert' from './alert.mjs';
3
+ export * as 'code-block-builder' from './code-block-builder.mjs';
3
4
  export * as 'confirm' from './confirm.mjs';
4
5
  export * as 'minimizable-modal' from './minimizable-modal.mjs';
5
6
  export * as 'modal-command-builder' from './modal-command-builder.mjs';
@@ -4,6 +4,7 @@ if you want to view the source, please visit the github repository of this plugi
4
4
  */
5
5
 
6
6
  import * as alert from "./alert.mjs";
7
+ import * as code_block_builder from "./code-block-builder.mjs";
7
8
  import * as confirm from "./confirm.mjs";
8
9
  import * as minimizable_modal from "./minimizable-modal.mjs";
9
10
  import * as modal_command_builder from "./modal-command-builder.mjs";
@@ -14,6 +15,7 @@ import * as select_option from "./select-option.mjs";
14
15
  import * as suggest_modal_command_builder from "./suggest-modal-command-builder.mjs";
15
16
  export {
16
17
  alert,
18
+ code_block_builder as "code-block-builder",
17
19
  confirm,
18
20
  minimizable_modal as "minimizable-modal",
19
21
  modal,
@@ -23,4 +25,4 @@ export {
23
25
  select_option as "select-option",
24
26
  suggest_modal_command_builder as "suggest-modal-command-builder"
25
27
  };
26
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL21vZGFscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhbGVydCcgZnJvbSAnLi9hbGVydC50cyc7XG5leHBvcnQgKiBhcyAnY29uZmlybScgZnJvbSAnLi9jb25maXJtLnRzJztcbmV4cG9ydCAqIGFzICdtaW5pbWl6YWJsZS1tb2RhbCcgZnJvbSAnLi9taW5pbWl6YWJsZS1tb2RhbC50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL21vZGFsLWNvbW1hbmQtYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwnIGZyb20gJy4vbW9kYWwudHMnO1xuZXhwb3J0ICogYXMgJ3Byb21wdCcgZnJvbSAnLi9wcm9tcHQudHMnO1xuZXhwb3J0ICogYXMgJ3NlbGVjdC1pdGVtJyBmcm9tICcuL3NlbGVjdC1pdGVtLnRzJztcbmV4cG9ydCAqIGFzICdzZWxlY3Qtb3B0aW9uJyBmcm9tICcuL3NlbGVjdC1vcHRpb24udHMnO1xuZXhwb3J0ICogYXMgJ3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWSxXQUFhO0FBQ3pCLFlBQVksYUFBZTtBQUMzQixZQUFZQSx1QkFBeUI7QUFDckMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVksV0FBYTtBQUN6QixZQUFZLFlBQWM7QUFDMUIsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyxtQ0FBcUM7IiwKICAibmFtZXMiOiBbIm1pbmltaXphYmxlLW1vZGFsIiwgIm1vZGFsLWNvbW1hbmQtYnVpbGRlciIsICJzZWxlY3QtaXRlbSIsICJzZWxlY3Qtb3B0aW9uIiwgInN1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyIl0KfQo=
28
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL21vZGFscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhbGVydCcgZnJvbSAnLi9hbGVydC50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1ibG9jay1idWlsZGVyJyBmcm9tICcuL2NvZGUtYmxvY2stYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnY29uZmlybScgZnJvbSAnLi9jb25maXJtLnRzJztcbmV4cG9ydCAqIGFzICdtaW5pbWl6YWJsZS1tb2RhbCcgZnJvbSAnLi9taW5pbWl6YWJsZS1tb2RhbC50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL21vZGFsLWNvbW1hbmQtYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwnIGZyb20gJy4vbW9kYWwudHMnO1xuZXhwb3J0ICogYXMgJ3Byb21wdCcgZnJvbSAnLi9wcm9tcHQudHMnO1xuZXhwb3J0ICogYXMgJ3NlbGVjdC1pdGVtJyBmcm9tICcuL3NlbGVjdC1pdGVtLnRzJztcbmV4cG9ydCAqIGFzICdzZWxlY3Qtb3B0aW9uJyBmcm9tICcuL3NlbGVjdC1vcHRpb24udHMnO1xuZXhwb3J0ICogYXMgJ3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWSxXQUFhO0FBQ3pCLFlBQVlBLHdCQUEwQjtBQUN0QyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsdUJBQXlCO0FBQ3JDLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZLFdBQWE7QUFDekIsWUFBWSxZQUFjO0FBQzFCLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMsbUNBQXFDOyIsCiAgIm5hbWVzIjogWyJjb2RlLWJsb2NrLWJ1aWxkZXIiLCAibWluaW1pemFibGUtbW9kYWwiLCAibW9kYWwtY29tbWFuZC1idWlsZGVyIiwgInNlbGVjdC1pdGVtIiwgInNlbGVjdC1vcHRpb24iLCAic3VnZ2VzdC1tb2RhbC1jb21tYW5kLWJ1aWxkZXIiXQp9Cg==
@@ -1,5 +1,6 @@
1
1
  /// <reference path="../library-references.d.mts" />
2
2
  export * as 'plugin-api' from './plugin-api.mjs';
3
+ export * as 'plugin-async-cleanup' from './plugin-async-cleanup.mjs';
3
4
  export * as 'plugin-context' from './plugin-context.mjs';
4
5
  export * as 'plugin-event-source' from './plugin-event-source.mjs';
5
6
  export * as 'plugin-install-state' from './plugin-install-state.mjs';
@@ -4,6 +4,7 @@ if you want to view the source, please visit the github repository of this plugi
4
4
  */
5
5
 
6
6
  import * as plugin_api from "./plugin-api.mjs";
7
+ import * as plugin_async_cleanup from "./plugin-async-cleanup.mjs";
7
8
  import * as plugin_context from "./plugin-context.mjs";
8
9
  import * as plugin_event_source from "./plugin-event-source.mjs";
9
10
  import * as plugin_install_state from "./plugin-install-state.mjs";
@@ -14,6 +15,7 @@ import * as settings_migration_api from "./settings-migration-api.mjs";
14
15
  export {
15
16
  plugin,
16
17
  plugin_api as "plugin-api",
18
+ plugin_async_cleanup as "plugin-async-cleanup",
17
19
  plugin_context as "plugin-context",
18
20
  plugin_event_source as "plugin-event-source",
19
21
  plugin_install_state as "plugin-install-state",
@@ -21,4 +23,4 @@ export {
21
23
  plugin_settings_tab as "plugin-settings-tab",
22
24
  settings_migration_api as "settings-migration-api"
23
25
  };
24
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdwbHVnaW4tYXBpJyBmcm9tICcuL3BsdWdpbi1hcGkudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1jb250ZXh0JyBmcm9tICcuL3BsdWdpbi1jb250ZXh0LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tZXZlbnQtc291cmNlJyBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1pbnN0YWxsLXN0YXRlJyBmcm9tICcuL3BsdWdpbi1pbnN0YWxsLXN0YXRlLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cycgZnJvbSAnLi9wbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cy50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLXRhYicgZnJvbSAnLi9wbHVnaW4tc2V0dGluZ3MtdGFiLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4nIGZyb20gJy4vcGx1Z2luLnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1taWdyYXRpb24tYXBpJyBmcm9tICcuL3NldHRpbmdzLW1pZ3JhdGlvbi1hcGkudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSxnQkFBa0I7QUFDOUIsWUFBWUMsb0JBQXNCO0FBQ2xDLFlBQVlDLHlCQUEyQjtBQUN2QyxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLHlCQUEyQjtBQUN2QyxZQUFZLFlBQWM7QUFDMUIsWUFBWUMsNEJBQThCOyIsCiAgIm5hbWVzIjogWyJwbHVnaW4tYXBpIiwgInBsdWdpbi1jb250ZXh0IiwgInBsdWdpbi1ldmVudC1zb3VyY2UiLCAicGx1Z2luLWluc3RhbGwtc3RhdGUiLCAicGx1Z2luLWxpZmVjeWNsZS1ldmVudHMiLCAicGx1Z2luLXNldHRpbmdzLXRhYiIsICJzZXR0aW5ncy1taWdyYXRpb24tYXBpIl0KfQo=
26
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdwbHVnaW4tYXBpJyBmcm9tICcuL3BsdWdpbi1hcGkudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1hc3luYy1jbGVhbnVwJyBmcm9tICcuL3BsdWdpbi1hc3luYy1jbGVhbnVwLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dCcgZnJvbSAnLi9wbHVnaW4tY29udGV4dC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWV2ZW50LXNvdXJjZScgZnJvbSAnLi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4taW5zdGFsbC1zdGF0ZScgZnJvbSAnLi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWxpZmVjeWNsZS1ldmVudHMnIGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy10YWInIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luJyBmcm9tICcuL3BsdWdpbi50cyc7XG5leHBvcnQgKiBhcyAnc2V0dGluZ3MtbWlncmF0aW9uLWFwaScgZnJvbSAnLi9zZXR0aW5ncy1taWdyYXRpb24tYXBpLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWUEsZ0JBQWtCO0FBQzlCLFlBQVlDLDBCQUE0QjtBQUN4QyxZQUFZQyxvQkFBc0I7QUFDbEMsWUFBWUMseUJBQTJCO0FBQ3ZDLFlBQVlDLDBCQUE0QjtBQUN4QyxZQUFZQyw2QkFBK0I7QUFDM0MsWUFBWUMseUJBQTJCO0FBQ3ZDLFlBQVksWUFBYztBQUMxQixZQUFZQyw0QkFBOEI7IiwKICAibmFtZXMiOiBbInBsdWdpbi1hcGkiLCAicGx1Z2luLWFzeW5jLWNsZWFudXAiLCAicGx1Z2luLWNvbnRleHQiLCAicGx1Z2luLWV2ZW50LXNvdXJjZSIsICJwbHVnaW4taW5zdGFsbC1zdGF0ZSIsICJwbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cyIsICJwbHVnaW4tc2V0dGluZ3MtdGFiIiwgInNldHRpbmdzLW1pZ3JhdGlvbi1hcGkiXQp9Cg==