@flogeez/angular-tiptap-editor 3.1.3 → 3.1.4

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 (113) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +2 -2
  3. package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
  4. package/esm2022/lib/ate-editor.provider.mjs +38 -0
  5. package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
  6. package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
  7. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
  8. package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
  9. package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
  10. package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
  11. package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
  12. package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
  13. package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
  14. package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
  15. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1031 -0
  16. package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
  17. package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
  18. package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
  19. package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
  20. package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
  21. package/esm2022/lib/config/ate-editor.config.mjs +133 -0
  22. package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
  23. package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
  24. package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
  25. package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
  26. package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
  27. package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
  28. package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
  29. package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
  30. package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
  31. package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
  32. package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
  33. package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
  34. package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
  35. package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
  36. package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
  37. package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
  38. package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
  39. package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
  40. package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
  41. package/esm2022/lib/models/ate-image.model.mjs +2 -0
  42. package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
  43. package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
  44. package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
  45. package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
  46. package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
  47. package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
  48. package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
  49. package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
  50. package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
  51. package/esm2022/lib/services/ate-editor-commands.service.mjs +474 -0
  52. package/esm2022/lib/services/ate-i18n.service.mjs +422 -0
  53. package/esm2022/lib/services/ate-image.service.mjs +459 -0
  54. package/esm2022/lib/services/ate-link.service.mjs +99 -0
  55. package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
  56. package/esm2022/public-api.mjs +40 -0
  57. package/fesm2022/flogeez-angular-tiptap-editor.mjs +319 -352
  58. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  59. package/index.d.ts +3 -1734
  60. package/lib/ate-editor.provider.d.ts +21 -0
  61. package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
  62. package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
  63. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
  64. package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
  65. package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
  66. package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
  67. package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
  68. package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
  69. package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
  70. package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
  71. package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
  72. package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
  73. package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
  74. package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
  75. package/lib/components/ui/ate-button.component.d.ts +25 -0
  76. package/lib/components/ui/ate-separator.component.d.ts +5 -0
  77. package/lib/config/ate-editor.config.d.ts +19 -0
  78. package/lib/config/ate-global-config.token.d.ts +6 -0
  79. package/lib/config/ate-slash-commands.config.d.ts +41 -0
  80. package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
  81. package/lib/directives/ate-tooltip.directive.d.ts +30 -0
  82. package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
  83. package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
  84. package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
  85. package/lib/extensions/ate-table.extension.d.ts +2 -0
  86. package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
  87. package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
  88. package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
  89. package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
  90. package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
  91. package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
  92. package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
  93. package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
  94. package/lib/models/ate-bubble-menu.model.d.ts +33 -0
  95. package/lib/models/ate-editor-config.model.d.ts +113 -0
  96. package/lib/models/ate-editor-state.model.d.ts +109 -0
  97. package/lib/models/ate-image.model.d.ts +104 -0
  98. package/lib/models/ate-slash-command.model.d.ts +17 -0
  99. package/lib/models/ate-toolbar.model.d.ts +18 -0
  100. package/lib/node-view/ate-angular-node-view.d.ts +115 -0
  101. package/lib/node-view/ate-injector.registry.d.ts +3 -0
  102. package/lib/node-view/ate-node-view.factory.d.ts +10 -0
  103. package/lib/node-view/ate-node-view.models.d.ts +138 -0
  104. package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
  105. package/lib/node-view/ate-register-angular-component.d.ts +35 -0
  106. package/lib/services/ate-color-picker.service.d.ts +65 -0
  107. package/lib/services/ate-editor-commands.service.d.ts +75 -0
  108. package/lib/services/ate-i18n.service.d.ts +406 -0
  109. package/lib/services/ate-image.service.d.ts +82 -0
  110. package/lib/services/ate-link.service.d.ts +42 -0
  111. package/lib/utils/ate-color.utils.d.ts +12 -0
  112. package/package.json +3 -1
  113. package/public-api.d.ts +31 -0
@@ -0,0 +1,474 @@
1
+ import { Injectable, inject, signal } from "@angular/core";
2
+ import { AteImageService } from "./ate-image.service";
3
+ import { AteColorPickerService } from "./ate-color-picker.service";
4
+ import { AteLinkService } from "./ate-link.service";
5
+ import { ATE_INITIAL_EDITOR_STATE } from "../models/ate-editor-state.model";
6
+ import * as i0 from "@angular/core";
7
+ export class AteEditorCommandsService {
8
+ constructor() {
9
+ this.imageService = inject(AteImageService);
10
+ this.colorPickerSvc = inject(AteColorPickerService);
11
+ this.linkSvc = inject(AteLinkService);
12
+ this._editorState = signal(ATE_INITIAL_EDITOR_STATE, {
13
+ equal: (a, b) => {
14
+ // 1. Primitive global states
15
+ if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {
16
+ return false;
17
+ }
18
+ // 2. Detailed selection comparison
19
+ if (a.selection.from !== b.selection.from ||
20
+ a.selection.to !== b.selection.to ||
21
+ a.selection.type !== b.selection.type ||
22
+ a.selection.empty !== b.selection.empty ||
23
+ a.selection.isSingleCell !== b.selection.isSingleCell) {
24
+ return false;
25
+ }
26
+ // Helper for object comparison
27
+ const isRecordEqual = (objA, objB) => {
28
+ const keysA = Object.keys(objA);
29
+ const keysB = Object.keys(objB);
30
+ if (keysA.length !== keysB.length) {
31
+ return false;
32
+ }
33
+ return keysA.every(key => objA[key] === objB[key]);
34
+ };
35
+ // 3. Compare sub-states (marks, can, nodes)
36
+ if (!isRecordEqual(a.marks, b.marks)) {
37
+ return false;
38
+ }
39
+ if (!isRecordEqual(a.can, b.can)) {
40
+ return false;
41
+ }
42
+ if (!isRecordEqual(a.nodes, b.nodes)) {
43
+ return false;
44
+ }
45
+ // 4. Compare custom extension states
46
+ if (!isRecordEqual(a.custom, b.custom)) {
47
+ return false;
48
+ }
49
+ return true;
50
+ },
51
+ });
52
+ /** Exposed editor state as a readonly signal */
53
+ this.editorState = this._editorState.asReadonly();
54
+ // ============================================
55
+ // Toolbar Interaction State
56
+ // ============================================
57
+ /** Signal to track when the toolbar is being hovered/interacted with */
58
+ this._isToolbarInteracting = signal(false);
59
+ this.isToolbarInteracting = this._isToolbarInteracting.asReadonly();
60
+ // Access to ImageService states as readonly signals for UI binding
61
+ this.isUploading = this.imageService.isUploading.asReadonly();
62
+ this.uploadProgress = this.imageService.uploadProgress.asReadonly();
63
+ this.uploadMessage = this.imageService.uploadMessage.asReadonly();
64
+ // ============================================
65
+ // Link State (proxied from LinkService)
66
+ // ============================================
67
+ /** Signal to toggle link edit mode from UI (Toolbar) - Immediate response */
68
+ this.linkEditMode = this.linkSvc.editMode.asReadonly();
69
+ /** Reference to the element that triggered the link menu (for anchoring) */
70
+ this.linkMenuTrigger = this.linkSvc.menuTrigger.asReadonly();
71
+ // ============================================
72
+ // Color Picker State (proxied from ColorPickerService)
73
+ // ============================================
74
+ /** Signal to toggle color picker mode from UI (text or highlight) */
75
+ this.colorEditMode = this.colorPickerSvc.editMode.asReadonly();
76
+ /** Reference to the element that triggered the color menu (for anchoring) */
77
+ this.colorMenuTrigger = this.colorPickerSvc.menuTrigger.asReadonly();
78
+ }
79
+ /** Set toolbar interaction state (called by editor component) */
80
+ setToolbarInteracting(value) {
81
+ this._isToolbarInteracting.set(value);
82
+ }
83
+ set uploadHandler(handler) {
84
+ this.imageService.uploadHandler = handler;
85
+ }
86
+ /** Update state (called by TiptapStateExtension) */
87
+ updateState(state) {
88
+ this._editorState.set(state);
89
+ }
90
+ // ============================================
91
+ // Link Edit Methods (delegated to LinkService)
92
+ // ============================================
93
+ // ============================================
94
+ // Command Execution
95
+ // ============================================
96
+ /** Generic method to execute any command by name */
97
+ execute(editor, command, ...args) {
98
+ if (!editor) {
99
+ return;
100
+ }
101
+ switch (command) {
102
+ case "toggleBold":
103
+ this.toggleBold(editor);
104
+ break;
105
+ case "toggleItalic":
106
+ this.toggleItalic(editor);
107
+ break;
108
+ case "toggleStrike":
109
+ this.toggleStrike(editor);
110
+ break;
111
+ case "toggleCode":
112
+ this.toggleCode(editor);
113
+ break;
114
+ case "toggleCodeBlock":
115
+ this.toggleCodeBlock(editor);
116
+ break;
117
+ case "toggleUnderline":
118
+ this.toggleUnderline(editor);
119
+ break;
120
+ case "toggleSuperscript":
121
+ this.toggleSuperscript(editor);
122
+ break;
123
+ case "toggleSubscript":
124
+ this.toggleSubscript(editor);
125
+ break;
126
+ case "toggleHeading":
127
+ this.toggleHeading(editor, args[0]);
128
+ break;
129
+ case "toggleBulletList":
130
+ this.toggleBulletList(editor);
131
+ break;
132
+ case "toggleOrderedList":
133
+ this.toggleOrderedList(editor);
134
+ break;
135
+ case "toggleBlockquote":
136
+ this.toggleBlockquote(editor);
137
+ break;
138
+ case "setTextAlign":
139
+ this.setTextAlign(editor, args[0]);
140
+ break;
141
+ case "toggleLink":
142
+ this.linkSvc.toggle(editor, args[0]);
143
+ break;
144
+ case "unsetLink":
145
+ this.linkSvc.unsetLink(editor);
146
+ break;
147
+ case "toggleColorPicker":
148
+ this.colorPickerSvc.toggle(editor, args[0], args[1]);
149
+ break;
150
+ case "insertHorizontalRule":
151
+ this.insertHorizontalRule(editor);
152
+ break;
153
+ case "insertImage":
154
+ this.insertImage(editor, args[0]);
155
+ break;
156
+ case "uploadImage":
157
+ this.uploadImage(editor, args[0], args[1]);
158
+ break;
159
+ case "toggleHighlight":
160
+ this.toggleHighlight(editor, args[0]);
161
+ break;
162
+ case "undo":
163
+ this.undo(editor);
164
+ break;
165
+ case "redo":
166
+ this.redo(editor);
167
+ break;
168
+ case "insertTable":
169
+ this.insertTable(editor, args[0], args[1]);
170
+ break;
171
+ case "addColumnBefore":
172
+ this.addColumnBefore(editor);
173
+ break;
174
+ case "addColumnAfter":
175
+ this.addColumnAfter(editor);
176
+ break;
177
+ case "deleteColumn":
178
+ this.deleteColumn(editor);
179
+ break;
180
+ case "addRowBefore":
181
+ this.addRowBefore(editor);
182
+ break;
183
+ case "addRowAfter":
184
+ this.addRowAfter(editor);
185
+ break;
186
+ case "deleteRow":
187
+ this.deleteRow(editor);
188
+ break;
189
+ case "deleteTable":
190
+ this.deleteTable(editor);
191
+ break;
192
+ case "mergeCells":
193
+ this.mergeCells(editor);
194
+ break;
195
+ case "splitCell":
196
+ this.splitCell(editor);
197
+ break;
198
+ case "toggleHeaderColumn":
199
+ this.toggleHeaderColumn(editor);
200
+ break;
201
+ case "toggleHeaderRow":
202
+ this.toggleHeaderRow(editor);
203
+ break;
204
+ case "applyColor":
205
+ this.colorPickerSvc.applyColor(editor, args[0], args[1], args[2]);
206
+ break;
207
+ case "applyHighlight":
208
+ this.colorPickerSvc.applyHighlight(editor, args[0], args[1], args[2]);
209
+ break;
210
+ case "unsetColor":
211
+ this.colorPickerSvc.unsetColor(editor, args[0]);
212
+ break;
213
+ case "unsetHighlight":
214
+ this.colorPickerSvc.unsetHighlight(editor, args[0]);
215
+ break;
216
+ case "clearContent":
217
+ this.clearContent(editor);
218
+ break;
219
+ }
220
+ }
221
+ // --- Formatting Commands ---
222
+ toggleBold(editor) {
223
+ if (!editor) {
224
+ return;
225
+ }
226
+ editor.chain().focus().toggleBold().run();
227
+ }
228
+ toggleItalic(editor) {
229
+ if (!editor) {
230
+ return;
231
+ }
232
+ editor.chain().focus().toggleItalic().run();
233
+ }
234
+ toggleStrike(editor) {
235
+ if (!editor) {
236
+ return;
237
+ }
238
+ editor.chain().focus().toggleStrike().run();
239
+ }
240
+ toggleCode(editor) {
241
+ if (!editor) {
242
+ return;
243
+ }
244
+ editor.chain().focus().toggleCode().run();
245
+ }
246
+ toggleCodeBlock(editor) {
247
+ if (!editor) {
248
+ return;
249
+ }
250
+ editor.chain().focus().toggleCodeBlock().run();
251
+ }
252
+ toggleUnderline(editor) {
253
+ if (!editor) {
254
+ return;
255
+ }
256
+ editor.chain().focus().toggleUnderline().run();
257
+ }
258
+ toggleSuperscript(editor) {
259
+ if (!editor) {
260
+ return;
261
+ }
262
+ editor.chain().focus().toggleSuperscript().run();
263
+ }
264
+ toggleSubscript(editor) {
265
+ if (!editor) {
266
+ return;
267
+ }
268
+ editor.chain().focus().toggleSubscript().run();
269
+ }
270
+ toggleHeading(editor, level) {
271
+ if (!editor) {
272
+ return;
273
+ }
274
+ editor.chain().focus().toggleHeading({ level }).run();
275
+ }
276
+ toggleHighlight(editor, color) {
277
+ if (!editor) {
278
+ return;
279
+ }
280
+ if (color) {
281
+ editor.chain().focus().setHighlight({ color }).run();
282
+ }
283
+ else {
284
+ editor.chain().focus().toggleHighlight().run();
285
+ }
286
+ }
287
+ // --- Structure Commands ---
288
+ toggleBulletList(editor) {
289
+ if (!editor) {
290
+ return;
291
+ }
292
+ editor.chain().focus().toggleBulletList().run();
293
+ }
294
+ toggleOrderedList(editor) {
295
+ if (!editor) {
296
+ return;
297
+ }
298
+ editor.chain().focus().toggleOrderedList().run();
299
+ }
300
+ toggleBlockquote(editor) {
301
+ if (!editor) {
302
+ return;
303
+ }
304
+ editor.chain().focus().toggleBlockquote().run();
305
+ }
306
+ setTextAlign(editor, alignment) {
307
+ if (!editor) {
308
+ return;
309
+ }
310
+ editor.chain().focus().setTextAlign(alignment).run();
311
+ }
312
+ insertHorizontalRule(editor) {
313
+ if (!editor) {
314
+ return;
315
+ }
316
+ editor.chain().focus().setHorizontalRule().run();
317
+ }
318
+ // --- History Commands ---
319
+ undo(editor) {
320
+ if (!editor) {
321
+ return;
322
+ }
323
+ editor.chain().focus().undo().run();
324
+ }
325
+ redo(editor) {
326
+ if (!editor) {
327
+ return;
328
+ }
329
+ editor.chain().focus().redo().run();
330
+ }
331
+ // --- Table Commands ---
332
+ insertTable(editor, rows = 3, cols = 3) {
333
+ if (!editor) {
334
+ return;
335
+ }
336
+ editor.chain().focus().insertTable({ rows, cols }).run();
337
+ }
338
+ addColumnBefore(editor) {
339
+ if (!editor) {
340
+ return;
341
+ }
342
+ editor.chain().focus().addColumnBefore().run();
343
+ }
344
+ addColumnAfter(editor) {
345
+ if (!editor) {
346
+ return;
347
+ }
348
+ editor.chain().focus().addColumnAfter().run();
349
+ }
350
+ deleteColumn(editor) {
351
+ if (!editor) {
352
+ return;
353
+ }
354
+ editor.chain().focus().deleteColumn().run();
355
+ }
356
+ addRowBefore(editor) {
357
+ if (!editor) {
358
+ return;
359
+ }
360
+ editor.chain().focus().addRowBefore().run();
361
+ }
362
+ addRowAfter(editor) {
363
+ if (!editor) {
364
+ return;
365
+ }
366
+ editor.chain().focus().addRowAfter().run();
367
+ }
368
+ deleteRow(editor) {
369
+ if (!editor) {
370
+ return;
371
+ }
372
+ editor.chain().focus().deleteRow().run();
373
+ }
374
+ deleteTable(editor) {
375
+ if (!editor) {
376
+ return;
377
+ }
378
+ editor.chain().focus().deleteTable().run();
379
+ }
380
+ mergeCells(editor) {
381
+ if (!editor) {
382
+ return;
383
+ }
384
+ editor.chain().focus().mergeCells().run();
385
+ }
386
+ splitCell(editor) {
387
+ if (!editor) {
388
+ return;
389
+ }
390
+ editor.chain().focus().splitCell().run();
391
+ }
392
+ toggleHeaderColumn(editor) {
393
+ if (!editor) {
394
+ return;
395
+ }
396
+ editor.chain().focus().toggleHeaderColumn().run();
397
+ }
398
+ toggleHeaderRow(editor) {
399
+ if (!editor) {
400
+ return;
401
+ }
402
+ editor.chain().focus().toggleHeaderRow().run();
403
+ }
404
+ // --- Utility Commands ---
405
+ clearContent(editor) {
406
+ if (!editor) {
407
+ return;
408
+ }
409
+ editor.commands.clearContent(true);
410
+ }
411
+ focus(editor) {
412
+ if (!editor) {
413
+ return;
414
+ }
415
+ editor.chain().focus().run();
416
+ }
417
+ blur(editor) {
418
+ if (!editor) {
419
+ return;
420
+ }
421
+ editor.chain().blur().run();
422
+ }
423
+ setContent(editor, content, emitUpdate = true) {
424
+ if (!editor) {
425
+ return;
426
+ }
427
+ editor.commands.setContent(content, { emitUpdate });
428
+ }
429
+ setEditable(editor, editable) {
430
+ if (!editor) {
431
+ return;
432
+ }
433
+ editor.setEditable(editable);
434
+ }
435
+ insertContent(editor, content) {
436
+ if (!editor) {
437
+ return;
438
+ }
439
+ editor.chain().focus().insertContent(content).run();
440
+ }
441
+ async insertImage(editor, options) {
442
+ try {
443
+ await this.imageService.selectAndUploadImage(editor, options);
444
+ }
445
+ catch (error) {
446
+ console.error("Error inserting image:", error);
447
+ throw error;
448
+ }
449
+ }
450
+ async uploadImage(editor, file, options) {
451
+ try {
452
+ await this.imageService.uploadAndInsertImage(editor, file, options);
453
+ }
454
+ catch (error) {
455
+ console.error("Error uploading image:", error);
456
+ throw error;
457
+ }
458
+ }
459
+ downloadImage(editor) {
460
+ this.imageService.downloadImage(editor);
461
+ }
462
+ handleImageDrop(editor, event, options) {
463
+ return this.imageService.handleDrop(editor, event, options);
464
+ }
465
+ handleImagePaste(editor, event, options) {
466
+ return this.imageService.handlePaste(editor, event, options);
467
+ }
468
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
469
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService }); }
470
+ }
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, decorators: [{
472
+ type: Injectable
473
+ }] });
474
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBMEIsd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFJcEcsTUFBTSxPQUFPLHdCQUF3QjtJQURyQztRQUVVLGlCQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QixpQkFBWSxHQUFHLE1BQU0sQ0FBeUIsd0JBQXdCLEVBQUU7WUFDdkYsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNkLDZCQUE2QjtnQkFDN0IsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pFLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBRUQsbUNBQW1DO2dCQUNuQyxJQUNFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFB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IHNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBBdGVJbWFnZVNlcnZpY2UgfSBmcm9tIFwiLi9hdGUtaW1hZ2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgQXRlQ29sb3JQaWNrZXJTZXJ2aWNlIH0gZnJvbSBcIi4vYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBdGVMaW5rU2VydmljZSB9IGZyb20gXCIuL2F0ZS1saW5rLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF0ZUVkaXRvclN0YXRlU25hcHNob3QsIEFURV9JTklUSUFMX0VESVRPUl9TVEFURSB9IGZyb20gXCIuLi9tb2RlbHMvYXRlLWVkaXRvci1zdGF0ZS5tb2RlbFwiO1xuaW1wb3J0IHsgQXRlSW1hZ2VVcGxvYWRIYW5kbGVyLCBBdGVJbWFnZVVwbG9hZE9wdGlvbnMgfSBmcm9tIFwiLi4vbW9kZWxzL2F0ZS1pbWFnZS5tb2RlbFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXRlRWRpdG9yQ29tbWFuZHNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBpbWFnZVNlcnZpY2UgPSBpbmplY3QoQXRlSW1hZ2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjb2xvclBpY2tlclN2YyA9IGluamVjdChBdGVDb2xvclBpY2tlclNlcnZpY2UpO1xuICBwcml2YXRlIGxpbmtTdmMgPSBpbmplY3QoQXRlTGlua1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0b3JTdGF0ZSA9IHNpZ25hbDxBdGVFZGl0b3JTdGF0ZVNuYXBzaG90PihBVEVfSU5JVElBTF9FRElUT1JfU1RBVEUsIHtcbiAgICBlcXVhbDogKGEsIGIpID0+IHtcbiAgICAgIC8vIDEuIFByaW1pdGl2ZSBnbG9iYWwgc3RhdGVzXG4gICAgICBpZiAoYS5pc0ZvY3VzZWQgIT09IGIuaXNGb2N1c2VkIHx8IGEuaXNFZGl0YWJsZSAhPT0gYi5pc0VkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gRGV0YWlsZWQgc2VsZWN0aW9uIGNvbXBhcmlzb25cbiAgICAgIGlmIChcbiAgICAgICAgYS5zZWxlY3Rpb24uZnJvbSAhPT0gYi5zZWxlY3Rpb24uZnJvbSB8fFxuICAgICAgICBhLnNlbGVjdGlvbi50byAhPT0gYi5zZWxlY3Rpb24udG8gfHxcbiAgICAgICAgYS5zZWxlY3Rpb24udHlwZSAhPT0gYi5zZWxlY3Rpb24udHlwZSB8fFxuICAgICAgICBhLnNlbGVjdGlvbi5lbXB0eSAhPT0gYi5zZWxlY3Rpb24uZW1wdHkgfHxcbiAgICAgICAgYS5zZWxlY3Rpb24uaXNTaW5nbGVDZWxsICE9PSBiLnNlbGVjdGlvbi5pc1NpbmdsZUNlbGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEhlbHBlciBmb3Igb2JqZWN0IGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IGlzUmVjb3JkRXF1YWwgPSAob2JqQTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9iakI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gICAgICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG4gICAgICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5c0EuZXZlcnkoa2V5ID0+IG9iakFba2V5XSA9PT0gb2JqQltrZXldKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIDMuIENvbXBhcmUgc3ViLXN0YXRlcyAobWFya3MsIGNhbiwgbm9kZXMpXG4gICAgICBpZiAoIWlzUmVjb3JkRXF1YWwoYS5tYXJrcywgYi5tYXJrcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1JlY29yZEVxdWFsKGEuY2FuLCBiLmNhbikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1JlY29yZEVxdWFsKGEubm9kZXMsIGIubm9kZXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gQ29tcGFyZSBjdXN0b20gZXh0ZW5zaW9uIHN0YXRlc1xuICAgICAgaWYgKCFpc1JlY29yZEVxdWFsKGEuY3VzdG9tLCBiLmN1c3RvbSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogRXhwb3NlZCBlZGl0b3Igc3RhdGUgYXMgYSByZWFkb25seSBzaWduYWwgKi9cbiAgcmVhZG9ubHkgZWRpdG9yU3RhdGUgPSB0aGlzLl9lZGl0b3JTdGF0ZS5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVG9vbGJhciBJbnRlcmFjdGlvbiBTdGF0ZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBTaWduYWwgdG8gdHJhY2sgd2hlbiB0aGUgdG9vbGJhciBpcyBiZWluZyBob3ZlcmVkL2ludGVyYWN0ZWQgd2l0aCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pc1Rvb2xiYXJJbnRlcmFjdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGlzVG9vbGJhckludGVyYWN0aW5nID0gdGhpcy5faXNUb29sYmFySW50ZXJhY3RpbmcuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBTZXQgdG9vbGJhciBpbnRlcmFjdGlvbiBzdGF0ZSAoY2FsbGVkIGJ5IGVkaXRvciBjb21wb25lbnQpICovXG4gIHNldFRvb2xiYXJJbnRlcmFjdGluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2lzVG9vbGJhckludGVyYWN0aW5nLnNldCh2YWx1ZSk7XG4gIH1cblxuICAvLyBBY2Nlc3MgdG8gSW1hZ2VTZXJ2aWNlIHN0YXRlcyBhcyByZWFkb25seSBzaWduYWxzIGZvciBVSSBiaW5kaW5nXG4gIHJlYWRvbmx5IGlzVXBsb2FkaW5nID0gdGhpcy5pbWFnZVNlcnZpY2UuaXNVcGxvYWRpbmcuYXNSZWFkb25seSgpO1xuICByZWFkb25seSB1cGxvYWRQcm9ncmVzcyA9IHRoaXMuaW1hZ2VTZXJ2aWNlLnVwbG9hZFByb2dyZXNzLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgdXBsb2FkTWVzc2FnZSA9IHRoaXMuaW1hZ2VTZXJ2aWNlLnVwbG9hZE1lc3NhZ2UuYXNSZWFkb25seSgpO1xuICBzZXQgdXBsb2FkSGFuZGxlcihoYW5kbGVyOiBBdGVJbWFnZVVwbG9hZEhhbmRsZXIgfCBudWxsKSB7XG4gICAgdGhpcy5pbWFnZVNlcnZpY2UudXBsb2FkSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvKiogVXBkYXRlIHN0YXRlIChjYWxsZWQgYnkgVGlwdGFwU3RhdGVFeHRlbnNpb24pICovXG4gIHVwZGF0ZVN0YXRlKHN0YXRlOiBBdGVFZGl0b3JTdGF0ZVNuYXBzaG90KSB7XG4gICAgdGhpcy5fZWRpdG9yU3RhdGUuc2V0KHN0YXRlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExpbmsgU3RhdGUgKHByb3hpZWQgZnJvbSBMaW5rU2VydmljZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogU2lnbmFsIHRvIHRvZ2dsZSBsaW5rIGVkaXQgbW9kZSBmcm9tIFVJIChUb29sYmFyKSAtIEltbWVkaWF0ZSByZXNwb25zZSAqL1xuICByZWFkb25seSBsaW5rRWRpdE1vZGUgPSB0aGlzLmxpbmtTdmMuZWRpdE1vZGUuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGxpbmsgbWVudSAoZm9yIGFuY2hvcmluZykgKi9cbiAgcmVhZG9ubHkgbGlua01lbnVUcmlnZ2VyID0gdGhpcy5saW5rU3ZjLm1lbnVUcmlnZ2VyLmFzUmVhZG9ubHkoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb2xvciBQaWNrZXIgU3RhdGUgKHByb3hpZWQgZnJvbSBDb2xvclBpY2tlclNlcnZpY2UpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFNpZ25hbCB0byB0b2dnbGUgY29sb3IgcGlja2VyIG1vZGUgZnJvbSBVSSAodGV4dCBvciBoaWdobGlnaHQpICovXG4gIHJlYWRvbmx5IGNvbG9yRWRpdE1vZGUgPSB0aGlzLmNvbG9yUGlja2VyU3ZjLmVkaXRNb2RlLmFzUmVhZG9ubHkoKTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjb2xvciBtZW51IChmb3IgYW5jaG9yaW5nKSAqL1xuICByZWFkb25seSBjb2xvck1lbnVUcmlnZ2VyID0gdGhpcy5jb2xvclBpY2tlclN2Yy5tZW51VHJpZ2dlci5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTGluayBFZGl0IE1ldGhvZHMgKGRlbGVnYXRlZCB0byBMaW5rU2VydmljZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb21tYW5kIEV4ZWN1dGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBHZW5lcmljIG1ldGhvZCB0byBleGVjdXRlIGFueSBjb21tYW5kIGJ5IG5hbWUgKi9cbiAgZXhlY3V0ZShlZGl0b3I6IEVkaXRvciwgY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29tbWFuZCkge1xuICAgICAgY2FzZSBcInRvZ2dsZUJvbGRcIjpcbiAgICAgICAgdGhpcy50b2dnbGVCb2xkKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUl0YWxpY1wiOlxuICAgICAgICB0aGlzLnRvZ2dsZUl0YWxpYyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVTdHJpa2VcIjpcbiAgICAgICAgdGhpcy50b2dnbGVTdHJpa2UoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlQ29kZVwiOlxuICAgICAgICB0aGlzLnRvZ2dsZUNvZGUoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlQ29kZUJsb2NrXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlQ29kZUJsb2NrKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZVVuZGVybGluZVwiOlxuICAgICAgICB0aGlzLnRvZ2dsZVVuZGVybGluZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVTdXBlcnNjcmlwdFwiOlxuICAgICAgICB0aGlzLnRvZ2dsZVN1cGVyc2NyaXB0KGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZVN1YnNjcmlwdFwiOlxuICAgICAgICB0aGlzLnRvZ2dsZVN1YnNjcmlwdChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVIZWFkaW5nXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlSGVhZGluZyhlZGl0b3IsIGFyZ3NbMF0gYXMgMSB8IDIgfCAzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlQnVsbGV0TGlzdFwiOlxuICAgICAgICB0aGlzLnRvZ2dsZUJ1bGxldExpc3QoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlT3JkZXJlZExpc3RcIjpcbiAgICAgICAgdGhpcy50b2dnbGVPcmRlcmVkTGlzdChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVCbG9ja3F1b3RlXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlQmxvY2txdW90ZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzZXRUZXh0QWxpZ25cIjpcbiAgICAgICAgdGhpcy5zZXRUZXh0QWxpZ24oZWRpdG9yLCBhcmdzWzBdIGFzIFwibGVmdFwiIHwgXCJjZW50ZXJcIiB8IFwicmlnaHRcIiB8IFwianVzdGlmeVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlTGlua1wiOlxuICAgICAgICB0aGlzLmxpbmtTdmMudG9nZ2xlKGVkaXRvciwgYXJnc1swXSBhcyBFdmVudCB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVuc2V0TGlua1wiOlxuICAgICAgICB0aGlzLmxpbmtTdmMudW5zZXRMaW5rKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUNvbG9yUGlja2VyXCI6XG4gICAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMudG9nZ2xlKGVkaXRvciwgYXJnc1swXSBhcyBcInRleHRcIiB8IFwiaGlnaGxpZ2h0XCIsIGFyZ3NbMV0gYXMgRXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJpbnNlcnRIb3Jpem9udGFsUnVsZVwiOlxuICAgICAgICB0aGlzLmluc2VydEhvcml6b250YWxSdWxlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImluc2VydEltYWdlXCI6XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UoZWRpdG9yLCBhcmdzWzBdIGFzIEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVwbG9hZEltYWdlXCI6XG4gICAgICAgIHRoaXMudXBsb2FkSW1hZ2UoZWRpdG9yLCBhcmdzWzBdIGFzIEZpbGUsIGFyZ3NbMV0gYXMgQXRlSW1hZ2VVcGxvYWRPcHRpb25zIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlSGlnaGxpZ2h0XCI6XG4gICAgICAgIHRoaXMudG9nZ2xlSGlnaGxpZ2h0KGVkaXRvciwgYXJnc1swXSBhcyBzdHJpbmcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1bmRvXCI6XG4gICAgICAgIHRoaXMudW5kbyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWRvXCI6XG4gICAgICAgIHRoaXMucmVkbyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJpbnNlcnRUYWJsZVwiOlxuICAgICAgICB0aGlzLmluc2VydFRhYmxlKGVkaXRvciwgYXJnc1swXSBhcyBudW1iZXIgfCB1bmRlZmluZWQsIGFyZ3NbMV0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYWRkQ29sdW1uQmVmb3JlXCI6XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uQmVmb3JlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFkZENvbHVtbkFmdGVyXCI6XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uQWZ0ZXIoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVsZXRlQ29sdW1uXCI6XG4gICAgICAgIHRoaXMuZGVsZXRlQ29sdW1uKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFkZFJvd0JlZm9yZVwiOlxuICAgICAgICB0aGlzLmFkZFJvd0JlZm9yZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhZGRSb3dBZnRlclwiOlxuICAgICAgICB0aGlzLmFkZFJvd0FmdGVyKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRlbGV0ZVJvd1wiOlxuICAgICAgICB0aGlzLmRlbGV0ZVJvdyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkZWxldGVUYWJsZVwiOlxuICAgICAgICB0aGlzLmRlbGV0ZVRhYmxlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1lcmdlQ2VsbHNcIjpcbiAgICAgICAgdGhpcy5tZXJnZUNlbGxzKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNwbGl0Q2VsbFwiOlxuICAgICAgICB0aGlzLnNwbGl0Q2VsbChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVIZWFkZXJDb2x1bW5cIjpcbiAgICAgICAgdGhpcy50b2dnbGVIZWFkZXJDb2x1bW4oZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlSGVhZGVyUm93XCI6XG4gICAgICAgIHRoaXMudG9nZ2xlSGVhZGVyUm93KGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFwcGx5Q29sb3JcIjpcbiAgICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy5hcHBseUNvbG9yKFxuICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICBhcmdzWzBdIGFzIHN0cmluZyxcbiAgICAgICAgICBhcmdzWzFdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgYXJnc1syXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFwcGx5SGlnaGxpZ2h0XCI6XG4gICAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuYXBwbHlIaWdobGlnaHQoXG4gICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgIGFyZ3NbMF0gYXMgc3RyaW5nLFxuICAgICAgICAgIGFyZ3NbMV0gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBhcmdzWzJdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidW5zZXRDb2xvclwiOlxuICAgICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLnVuc2V0Q29sb3IoZWRpdG9yLCBhcmdzWzBdIGFzIGJvb2xlYW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1bnNldEhpZ2hsaWdodFwiOlxuICAgICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLnVuc2V0SGlnaGxpZ2h0KGVkaXRvciwgYXJnc1swXSBhcyBib29sZWFuKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJjbGVhckNvbnRlbnRcIjpcbiAgICAgICAgdGhpcy5jbGVhckNvbnRlbnQoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIEZvcm1hdHRpbmcgQ29tbWFuZHMgLS0tXG5cbiAgdG9nZ2xlQm9sZChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlQm9sZCgpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlSXRhbGljKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVJdGFsaWMoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZVN0cmlrZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3RyaWtlKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVDb2RlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVDb2RlKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVDb2RlQmxvY2soZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGVCbG9jaygpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlVW5kZXJsaW5lKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVVbmRlcmxpbmUoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZVN1cGVyc2NyaXB0KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVTdXBlcnNjcmlwdCgpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlU3Vic2NyaXB0KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVTdWJzY3JpcHQoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUhlYWRpbmcoZWRpdG9yOiBFZGl0b3IsIGxldmVsOiAxIHwgMiB8IDMpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbCB9KS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUhpZ2hsaWdodChlZGl0b3I6IEVkaXRvciwgY29sb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0SGlnaGxpZ2h0KHsgY29sb3IgfSkucnVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGlnaGxpZ2h0KCkucnVuKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIFN0cnVjdHVyZSBDb21tYW5kcyAtLS1cblxuICB0b2dnbGVCdWxsZXRMaXN0KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVCdWxsZXRMaXN0KCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVPcmRlcmVkTGlzdChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUJsb2NrcXVvdGUoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKTtcbiAgfVxuXG4gIHNldFRleHRBbGlnbihlZGl0b3I6IEVkaXRvciwgYWxpZ25tZW50OiBcImxlZnRcIiB8IFwiY2VudGVyXCIgfCBcInJpZ2h0XCIgfCBcImp1c3RpZnlcIik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0VGV4dEFsaWduKGFsaWdubWVudCkucnVuKCk7XG4gIH1cblxuICBpbnNlcnRIb3Jpem9udGFsUnVsZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0SG9yaXpvbnRhbFJ1bGUoKS5ydW4oKTtcbiAgfVxuXG4gIC8vIC0tLSBIaXN0b3J5IENvbW1hbmRzIC0tLVxuXG4gIHVuZG8oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnVuZG8oKS5ydW4oKTtcbiAgfVxuXG4gIHJlZG8oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnJlZG8oKS5ydW4oKTtcbiAgfVxuXG4gIC8vIC0tLSBUYWJsZSBDb21tYW5kcyAtLS1cblxuICBpbnNlcnRUYWJsZShlZGl0b3I6IEVkaXRvciwgcm93cyA9IDMsIGNvbHMgPSAzKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5pbnNlcnRUYWJsZSh7IHJvd3MsIGNvbHMgfSkucnVuKCk7XG4gIH1cblxuICBhZGRDb2x1bW5CZWZvcmUoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLmFkZENvbHVtbkJlZm9yZSgpLnJ1bigpO1xuICB9XG5cbiAgYWRkQ29sdW1uQWZ0ZXIoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLmFkZENvbHVtbkFmdGVyKCkucnVuKCk7XG4gIH1cblxuICBkZWxldGVDb2x1bW4oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLmRlbGV0ZUNvbHVtbigpLnJ1bigpO1xuICB9XG5cbiAgYWRkUm93QmVmb3JlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5hZGRSb3dCZWZvcmUoKS5ydW4oKTtcbiAgfVxuXG4gIGFkZFJvd0FmdGVyKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5hZGRSb3dBZnRlcigpLnJ1bigpO1xuICB9XG5cbiAgZGVsZXRlUm93KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5kZWxldGVSb3coKS5ydW4oKTtcbiAgfVxuXG4gIGRlbGV0ZVRhYmxlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5kZWxldGVUYWJsZSgpLnJ1bigpO1xuICB9XG5cbiAgbWVyZ2VDZWxscyhlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkubWVyZ2VDZWxscygpLnJ1bigpO1xuICB9XG5cbiAgc3BsaXRDZWxsKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5zcGxpdENlbGwoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUhlYWRlckNvbHVtbihlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGVyQ29sdW1uKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVIZWFkZXJSb3coZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUhlYWRlclJvdygpLnJ1bigpO1xuICB9XG5cbiAgLy8gLS0tIFV0aWxpdHkgQ29tbWFuZHMgLS0tXG5cbiAgY2xlYXJDb250ZW50KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNvbW1hbmRzLmNsZWFyQ29udGVudCh0cnVlKTtcbiAgfVxuXG4gIGZvY3VzKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5ydW4oKTtcbiAgfVxuXG4gIGJsdXIoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5ibHVyKCkucnVuKCk7XG4gIH1cblxuICBzZXRDb250ZW50KGVkaXRvcjogRWRpdG9yLCBjb250ZW50OiBzdHJpbmcsIGVtaXRVcGRhdGUgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNvbW1hbmRzLnNldENvbnRlbnQoY29udGVudCwgeyBlbWl0VXBkYXRlIH0pO1xuICB9XG5cbiAgc2V0RWRpdGFibGUoZWRpdG9yOiBFZGl0b3IsIGVkaXRhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLnNldEVkaXRhYmxlKGVkaXRhYmxlKTtcbiAgfVxuXG4gIGluc2VydENvbnRlbnQoZWRpdG9yOiBFZGl0b3IsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuaW5zZXJ0Q29udGVudChjb250ZW50KS5ydW4oKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEltYWdlKGVkaXRvcjogRWRpdG9yLCBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW1hZ2VTZXJ2aWNlLnNlbGVjdEFuZFVwbG9hZEltYWdlKGVkaXRvciwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbnNlcnRpbmcgaW1hZ2U6XCIsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEltYWdlKGVkaXRvcjogRWRpdG9yLCBmaWxlOiBGaWxlLCBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW1hZ2VTZXJ2aWNlLnVwbG9hZEFuZEluc2VydEltYWdlKGVkaXRvciwgZmlsZSwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB1cGxvYWRpbmcgaW1hZ2U6XCIsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU2VydmljZS5kb3dubG9hZEltYWdlKGVkaXRvcik7XG4gIH1cblxuICBoYW5kbGVJbWFnZURyb3AoZWRpdG9yOiBFZGl0b3IsIGV2ZW50OiBEcmFnRXZlbnQsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZVNlcnZpY2UuaGFuZGxlRHJvcChlZGl0b3IsIGV2ZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIGhhbmRsZUltYWdlUGFzdGUoZWRpdG9yOiBFZGl0b3IsIGV2ZW50OiBDbGlwYm9hcmRFdmVudCwgb3B0aW9ucz86IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlU2VydmljZS5oYW5kbGVQYXN0ZShlZGl0b3IsIGV2ZW50LCBvcHRpb25zKTtcbiAgfVxufVxuIl19