@skyux/text-editor 5.0.2 → 5.5.0-beta.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 (128) hide show
  1. package/README.md +7 -1
  2. package/bundles/skyux-text-editor.umd.js +270 -170
  3. package/documentation.json +109 -57
  4. package/esm2015/index.js +15 -0
  5. package/esm2015/index.js.map +1 -0
  6. package/esm2015/lib/modules/rich-text-display/rich-text-display.component.js +39 -0
  7. package/esm2015/lib/modules/rich-text-display/rich-text-display.component.js.map +1 -0
  8. package/esm2015/lib/modules/rich-text-display/rich-text-display.module.js +18 -0
  9. package/esm2015/lib/modules/rich-text-display/rich-text-display.module.js.map +1 -0
  10. package/esm2015/lib/modules/shared/forms-utility.js +10 -0
  11. package/esm2015/lib/modules/shared/forms-utility.js.map +1 -0
  12. package/esm2015/lib/modules/shared/sky-text-editor-resources.module.js +106 -0
  13. package/esm2015/lib/modules/shared/sky-text-editor-resources.module.js.map +1 -0
  14. package/esm2015/lib/modules/text-editor/defaults/font-list-defaults.js +42 -0
  15. package/esm2015/lib/modules/text-editor/defaults/font-list-defaults.js.map +1 -0
  16. package/esm2015/lib/modules/text-editor/defaults/font-size-list-defaults.js +7 -0
  17. package/esm2015/lib/modules/text-editor/defaults/font-size-list-defaults.js.map +1 -0
  18. package/esm2015/lib/modules/text-editor/defaults/menu-defaults.js +5 -0
  19. package/esm2015/lib/modules/text-editor/defaults/menu-defaults.js.map +1 -0
  20. package/esm2015/lib/modules/text-editor/defaults/style-state-defaults.js +15 -0
  21. package/esm2015/lib/modules/text-editor/defaults/style-state-defaults.js.map +1 -0
  22. package/esm2015/lib/modules/text-editor/defaults/toolbar-action-defaults.js +12 -0
  23. package/esm2015/lib/modules/text-editor/defaults/toolbar-action-defaults.js.map +1 -0
  24. package/esm2015/lib/modules/text-editor/menubar/text-editor-menubar.component.js +196 -0
  25. package/esm2015/lib/modules/text-editor/menubar/text-editor-menubar.component.js.map +1 -0
  26. package/esm2015/lib/modules/text-editor/services/text-editor-adapter.service.js +473 -0
  27. package/esm2015/lib/modules/text-editor/services/text-editor-adapter.service.js.map +1 -0
  28. package/esm2015/lib/modules/text-editor/services/text-editor-selection.service.js +80 -0
  29. package/esm2015/lib/modules/text-editor/services/text-editor-selection.service.js.map +1 -0
  30. package/esm2015/lib/modules/text-editor/services/text-editor.service.js +61 -0
  31. package/esm2015/lib/modules/text-editor/services/text-editor.service.js.map +1 -0
  32. package/esm2015/lib/modules/text-editor/services/text-sanitization.service.js +38 -0
  33. package/esm2015/lib/modules/text-editor/services/text-sanitization.service.js.map +1 -0
  34. package/esm2015/lib/modules/text-editor/text-editor.component.js +322 -0
  35. package/esm2015/lib/modules/text-editor/text-editor.component.js.map +1 -0
  36. package/esm2015/lib/modules/text-editor/text-editor.module.js +99 -0
  37. package/esm2015/lib/modules/text-editor/text-editor.module.js.map +1 -0
  38. package/esm2015/lib/modules/text-editor/toolbar/text-editor-toolbar.component.js +175 -0
  39. package/esm2015/lib/modules/text-editor/toolbar/text-editor-toolbar.component.js.map +1 -0
  40. package/esm2015/lib/modules/text-editor/types/editor-command.js +2 -0
  41. package/esm2015/lib/modules/text-editor/types/editor-command.js.map +1 -0
  42. package/esm2015/lib/modules/text-editor/types/editor-setting.js +2 -0
  43. package/esm2015/lib/modules/text-editor/types/editor-setting.js.map +1 -0
  44. package/esm2015/lib/modules/text-editor/types/font-state.js +2 -0
  45. package/esm2015/lib/modules/text-editor/types/font-state.js.map +1 -0
  46. package/esm2015/lib/modules/text-editor/types/menu-type.js +2 -0
  47. package/esm2015/lib/modules/text-editor/types/menu-type.js.map +1 -0
  48. package/esm2015/lib/modules/text-editor/types/style-state.js +2 -0
  49. package/esm2015/lib/modules/text-editor/types/style-state.js.map +1 -0
  50. package/esm2015/lib/modules/text-editor/types/text-editor-merge-field.js +2 -0
  51. package/esm2015/lib/modules/text-editor/types/text-editor-merge-field.js.map +1 -0
  52. package/esm2015/lib/modules/text-editor/types/toolbar-action-type.js +2 -0
  53. package/esm2015/lib/modules/text-editor/types/toolbar-action-type.js.map +1 -0
  54. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-context.js +6 -0
  55. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-context.js.map +1 -0
  56. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-result.js +2 -0
  57. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-result.js.map +1 -0
  58. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal.component.js +121 -0
  59. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal.component.js.map +1 -0
  60. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-target.js +9 -0
  61. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-target.js.map +1 -0
  62. package/esm2015/skyux-text-editor.js +2 -2
  63. package/esm2015/skyux-text-editor.js.map +1 -0
  64. package/fesm2015/skyux-text-editor.js +332 -232
  65. package/fesm2015/skyux-text-editor.js.map +1 -1
  66. package/index.d.ts +12 -0
  67. package/{modules → lib/modules}/rich-text-display/rich-text-display.component.d.ts +0 -0
  68. package/{modules → lib/modules}/rich-text-display/rich-text-display.module.d.ts +0 -0
  69. package/{modules → lib/modules}/shared/forms-utility.d.ts +0 -0
  70. package/{modules → lib/modules}/shared/sky-text-editor-resources.module.d.ts +0 -0
  71. package/{modules → lib/modules}/text-editor/defaults/font-list-defaults.d.ts +0 -0
  72. package/{modules → lib/modules}/text-editor/defaults/font-size-list-defaults.d.ts +0 -0
  73. package/{modules → lib/modules}/text-editor/defaults/menu-defaults.d.ts +0 -0
  74. package/{modules → lib/modules}/text-editor/defaults/style-state-defaults.d.ts +0 -0
  75. package/{modules → lib/modules}/text-editor/defaults/toolbar-action-defaults.d.ts +0 -0
  76. package/{modules → lib/modules}/text-editor/menubar/text-editor-menubar.component.d.ts +0 -0
  77. package/{modules → lib/modules}/text-editor/services/text-editor-adapter.service.d.ts +0 -0
  78. package/{modules → lib/modules}/text-editor/services/text-editor-selection.service.d.ts +0 -0
  79. package/{modules → lib/modules}/text-editor/services/text-editor.service.d.ts +0 -0
  80. package/{modules → lib/modules}/text-editor/services/text-sanitization.service.d.ts +0 -0
  81. package/{modules → lib/modules}/text-editor/text-editor.component.d.ts +0 -0
  82. package/{modules → lib/modules}/text-editor/text-editor.module.d.ts +0 -0
  83. package/{modules → lib/modules}/text-editor/toolbar/text-editor-toolbar.component.d.ts +0 -0
  84. package/{modules → lib/modules}/text-editor/types/editor-command.d.ts +0 -0
  85. package/{modules → lib/modules}/text-editor/types/editor-setting.d.ts +0 -0
  86. package/{modules → lib/modules}/text-editor/types/font-state.d.ts +0 -0
  87. package/{modules → lib/modules}/text-editor/types/menu-type.d.ts +0 -0
  88. package/{modules → lib/modules}/text-editor/types/style-state.d.ts +0 -0
  89. package/{modules → lib/modules}/text-editor/types/text-editor-merge-field.d.ts +0 -0
  90. package/{modules → lib/modules}/text-editor/types/toolbar-action-type.d.ts +0 -0
  91. package/{modules → lib/modules}/text-editor/url-modal/text-editor-url-modal-context.d.ts +0 -0
  92. package/{modules → lib/modules}/text-editor/url-modal/text-editor-url-modal-result.d.ts +0 -0
  93. package/{modules → lib/modules}/text-editor/url-modal/text-editor-url-modal.component.d.ts +0 -0
  94. package/{modules → lib/modules}/text-editor/url-modal/text-editor-url-target.d.ts +0 -0
  95. package/package.json +27 -13
  96. package/skyux-text-editor.d.ts +1 -1
  97. package/LICENSE +0 -21
  98. package/bundles/skyux-text-editor.umd.js.map +0 -1
  99. package/esm2015/modules/rich-text-display/rich-text-display.component.js +0 -37
  100. package/esm2015/modules/rich-text-display/rich-text-display.module.js +0 -26
  101. package/esm2015/modules/shared/forms-utility.js +0 -10
  102. package/esm2015/modules/shared/sky-text-editor-resources.module.js +0 -41
  103. package/esm2015/modules/text-editor/defaults/font-list-defaults.js +0 -42
  104. package/esm2015/modules/text-editor/defaults/font-size-list-defaults.js +0 -5
  105. package/esm2015/modules/text-editor/defaults/menu-defaults.js +0 -8
  106. package/esm2015/modules/text-editor/defaults/style-state-defaults.js +0 -15
  107. package/esm2015/modules/text-editor/defaults/toolbar-action-defaults.js +0 -12
  108. package/esm2015/modules/text-editor/menubar/text-editor-menubar.component.js +0 -189
  109. package/esm2015/modules/text-editor/services/text-editor-adapter.service.js +0 -460
  110. package/esm2015/modules/text-editor/services/text-editor-selection.service.js +0 -76
  111. package/esm2015/modules/text-editor/services/text-editor.service.js +0 -61
  112. package/esm2015/modules/text-editor/services/text-sanitization.service.js +0 -38
  113. package/esm2015/modules/text-editor/text-editor.component.js +0 -307
  114. package/esm2015/modules/text-editor/text-editor.module.js +0 -101
  115. package/esm2015/modules/text-editor/toolbar/text-editor-toolbar.component.js +0 -163
  116. package/esm2015/modules/text-editor/types/editor-command.js +0 -2
  117. package/esm2015/modules/text-editor/types/editor-setting.js +0 -2
  118. package/esm2015/modules/text-editor/types/font-state.js +0 -2
  119. package/esm2015/modules/text-editor/types/menu-type.js +0 -2
  120. package/esm2015/modules/text-editor/types/style-state.js +0 -2
  121. package/esm2015/modules/text-editor/types/text-editor-merge-field.js +0 -2
  122. package/esm2015/modules/text-editor/types/toolbar-action-type.js +0 -2
  123. package/esm2015/modules/text-editor/url-modal/text-editor-url-modal-context.js +0 -6
  124. package/esm2015/modules/text-editor/url-modal/text-editor-url-modal-result.js +0 -2
  125. package/esm2015/modules/text-editor/url-modal/text-editor-url-modal.component.js +0 -112
  126. package/esm2015/modules/text-editor/url-modal/text-editor-url-target.js +0 -9
  127. package/esm2015/public-api.js +0 -15
  128. package/public-api.d.ts +0 -12
@@ -1,460 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { STYLE_STATE_DEFAULTS } from '../defaults/style-state-defaults';
4
- import { UrlTarget } from '../url-modal/text-editor-url-target';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./text-editor-selection.service";
7
- import * as i2 from "./text-editor.service";
8
- import * as i3 from "@skyux/core";
9
- /**
10
- * @internal
11
- */
12
- export class SkyTextEditorAdapterService {
13
- constructor(selectionService, textEditorService, windowService) {
14
- this.selectionService = selectionService;
15
- this.textEditorService = textEditorService;
16
- this.windowService = windowService;
17
- }
18
- get editors() {
19
- return this.textEditorService.editors;
20
- }
21
- /**
22
- * Creates a text editor inside the supplied iframe element.
23
- */
24
- addEditor(id, iframeElement, styleState, placeholder) {
25
- /* istanbul ignore else */
26
- if (!(id in this.editors)) {
27
- this.editors[id] = this.createObservers(id, iframeElement);
28
- const documentEl = this.getIframeDocumentEl(id);
29
- const styleEl = documentEl.createElement('style');
30
- styleEl.innerHTML = `.editor:empty:before {
31
- content: attr(data-placeholder);
32
- font-family: "Blackbaud Sans", Arial, sans-serif;
33
- color: #686c73;
34
- font-weight: 400;
35
- font-size: 15px;
36
- font-style: italic;
37
- }`;
38
- documentEl.head.appendChild(styleEl);
39
- const style = Object.assign(Object.assign({}, STYLE_STATE_DEFAULTS), styleState);
40
- const bodyStyle = `background-color: ${style.backColor};
41
- color: ${style.fontColor};
42
- font-family: ${style.font};
43
- font-size: ${style.fontSize}px`;
44
- documentEl.querySelector('html').setAttribute('lang', 'en');
45
- documentEl.body.setAttribute('contenteditable', 'true');
46
- documentEl.body.setAttribute('id', id);
47
- documentEl.body.setAttribute('role', 'main');
48
- documentEl.body.setAttribute('class', 'editor');
49
- documentEl.body.setAttribute('style', bodyStyle);
50
- documentEl.body.setAttribute('data-placeholder', placeholder || '');
51
- }
52
- }
53
- disableEditor(id, focusableChildren, textEditorNativeElement) {
54
- this.setEditorDisabled(id, focusableChildren, textEditorNativeElement, true);
55
- }
56
- enableEditor(id, focusableChildren, textEditorNativeElement) {
57
- this.setEditorDisabled(id, focusableChildren, textEditorNativeElement, false);
58
- }
59
- /**
60
- * Executes a command on the text editor with the corresponding id.
61
- */
62
- execCommand(id, editorCommand) {
63
- /* istanbul ignore else */
64
- if (id in this.editors) {
65
- const documentEl = this.getIframeDocumentEl(id);
66
- /* istanbul ignore else */
67
- if (this.editorSelected(id)) {
68
- const commandIsSupportedAndEnabled = documentEl.execCommand(editorCommand.command, false, editorCommand.value);
69
- // IE11 doesn't support insertHTML
70
- /* istanbul ignore next */
71
- if (editorCommand.command.toLowerCase() === 'inserthtml' &&
72
- !commandIsSupportedAndEnabled) {
73
- this.insertHtmlInIE11(id, editorCommand.value);
74
- }
75
- this.focusEditor(id);
76
- this.editors[id].commandChangeObservable.next();
77
- }
78
- }
79
- }
80
- getCurrentSelection(id) {
81
- return this.selectionService.getCurrentSelection(this.getIframeDocumentEl(id));
82
- }
83
- /**
84
- * Returns a data URI using the provided text string.
85
- * Used to display a merge field inside a string of text.
86
- */
87
- getMergeFieldDataURI(text) {
88
- const documentEl = this.windowService.nativeWindow.document;
89
- let textToUse = text;
90
- if (text.length > 18) {
91
- textToUse = text.substr(0, 15) + '...';
92
- }
93
- const canvasElement = documentEl.createElement('canvas');
94
- canvasElement.setAttribute('height', '20');
95
- canvasElement.setAttribute('width', '100');
96
- canvasElement.style.backgroundColor = 'tan';
97
- canvasElement.style.border = '1px solid #000000';
98
- canvasElement.style.borderRadius = '5px';
99
- const context = canvasElement.getContext('2d');
100
- context.font = '12px Arial';
101
- context.textAlign = 'center';
102
- context.fillText(textToUse, 50, 15);
103
- context.globalCompositeOperation = 'destination-over';
104
- context.fillStyle = '#00FFFF';
105
- context.fillRect(0, 0, 100, 20);
106
- context.globalCompositeOperation = 'source-over';
107
- context.lineWidth = 2;
108
- context.strokeStyle = '#FF0000';
109
- context.strokeRect(0, 0, 100, 20);
110
- const result = canvasElement.toDataURL('image/png', 1.0);
111
- return result;
112
- }
113
- getStyleState(id) {
114
- const documentEl = this.getIframeDocumentEl(id);
115
- /* istanbul ignore else */
116
- if (this.editorSelected(id)) {
117
- return {
118
- backColor: this.getColor(documentEl, 'BackColor'),
119
- fontColor: this.getColor(documentEl, 'ForeColor'),
120
- fontSize: parseInt(this.getFontSize(id), undefined),
121
- font: documentEl.queryCommandValue('fontname'),
122
- boldState: documentEl.queryCommandState('Bold'),
123
- italicState: documentEl.queryCommandState('Italic'),
124
- underlineState: documentEl.queryCommandState('Underline'),
125
- linkState: this.hasLink(id)
126
- };
127
- }
128
- /* istanbul ignore next */
129
- return {};
130
- }
131
- getEditorInnerHtml(id) {
132
- const documentEl = this.getIframeDocumentEl(id);
133
- if (documentEl) {
134
- return this.replaceHtmlCodes(documentEl.body.innerHTML);
135
- }
136
- return '';
137
- }
138
- setEditorInnerHtml(id, value) {
139
- const documentEl = this.getIframeDocumentEl(id);
140
- const editorContent = documentEl.body;
141
- /* istanbul ignore else */
142
- if (editorContent.innerHTML !== value) {
143
- editorContent.innerHTML = value;
144
- }
145
- }
146
- focusEditor(id) {
147
- /* istanbul ignore else */
148
- if (id in this.editors) {
149
- const windowEl = this.getContentWindowEl(id);
150
- const iframeDocumentEl = this.getIframeDocumentEl(id);
151
- const currentSelection = this.selectionService.getCurrentSelectionRange(iframeDocumentEl, windowEl);
152
- const cursorIsNotActiveAndHasReset = currentSelection && (currentSelection.startOffset === 0 && currentSelection.endOffset === 0);
153
- if (!this.editorSelected(id) || cursorIsNotActiveAndHasReset) {
154
- // focus the end of the editor
155
- const documentEl = this.windowService.nativeWindow.document;
156
- const editor = iframeDocumentEl.body;
157
- const range = documentEl.createRange();
158
- this.editors[id].iframeElementRef.focus();
159
- editor.focus();
160
- /* istanbul ignore else */
161
- if (windowEl.getSelection && documentEl.createRange) {
162
- range.selectNodeContents(editor);
163
- range.collapse(false);
164
- const sel = windowEl.getSelection();
165
- sel.removeAllRanges();
166
- sel.addRange(range);
167
- }
168
- else {
169
- // IE only
170
- const textRange = editor.createTextRange();
171
- textRange.moveToElementText(editor);
172
- textRange.collapse(false);
173
- textRange.select();
174
- }
175
- }
176
- else {
177
- // Cursor may not be active, restore it
178
- this.editors[id].iframeElementRef.focus();
179
- iframeDocumentEl.body.focus();
180
- }
181
- }
182
- }
183
- getLink(editorId) {
184
- let link = undefined;
185
- const anchorEl = this.getSelectedAnchorTag(editorId);
186
- if (anchorEl && anchorEl.href) {
187
- link = {
188
- target: anchorEl.getAttribute('target') === '_blank' ? UrlTarget.NewWindow : UrlTarget.None,
189
- url: anchorEl.href
190
- };
191
- }
192
- return link;
193
- }
194
- getSelectedAnchorTag(editorId) {
195
- const selectedEl = this.getCurrentSelectionParentElement(editorId);
196
- return this.getParent(selectedEl, 'a');
197
- }
198
- saveSelection(id) {
199
- return this.selectionService.getCurrentSelectionRange(this.getIframeDocumentEl(id), this.getContentWindowEl(id));
200
- }
201
- selectElement(id, element) {
202
- this.selectionService.selectElement(this.getIframeDocumentEl(id), this.getContentWindowEl(id), element);
203
- }
204
- setPlaceholder(id, placeholder) {
205
- const documentEl = this.getIframeDocumentEl(id);
206
- documentEl.body.setAttribute('data-placeholder', placeholder || '');
207
- }
208
- setFontSize(id, fontSize) {
209
- const doc = this.getIframeDocumentEl(id);
210
- this.execCommand(id, { command: 'fontSize', value: 1 });
211
- const fontElements = Array.from(doc.querySelectorAll('font[size="1"]'));
212
- for (let element of fontElements) {
213
- element.removeAttribute('size');
214
- element.style.fontSize = (fontSize + 'px');
215
- }
216
- this.cleanUpBlankStyleTags(doc);
217
- this.focusEditor(id);
218
- this.editors[id].commandChangeObservable.next();
219
- }
220
- removeObservers(setting) {
221
- /* istanbul ignore next */
222
- const documentEl = setting.iframeElementRef.contentWindow ?
223
- setting.iframeElementRef.contentWindow.document :
224
- setting.iframeElementRef.contentDocument;
225
- setting.selectionChangeObservable.complete();
226
- setting.clickObservable.complete();
227
- setting.commandChangeObservable.complete();
228
- documentEl.removeEventListener('selectionchange', setting.selectionListener);
229
- documentEl.removeEventListener('input', setting.selectionListener);
230
- documentEl.removeEventListener('mousedown', setting.clickListener);
231
- documentEl.body.removeEventListener('paste', setting.pasteListener);
232
- }
233
- getContentWindowEl(id) {
234
- return this.editors[id].iframeElementRef.contentWindow;
235
- }
236
- getChildSelectedAnchorTags(editorId) {
237
- const selectedRange = this.getCurrentSelection(editorId).getRangeAt(0);
238
- if (selectedRange.toString().length <= 0) {
239
- return [];
240
- }
241
- const parentElement = this.getCurrentSelectionParentElement(editorId);
242
- let childElements = [];
243
- /* istanbul ignore else */
244
- if (parentElement) {
245
- childElements = Array.from(parentElement.querySelectorAll('a'));
246
- }
247
- /* istanbul ignore next */
248
- return childElements.filter(element => {
249
- // IE specific
250
- if (!selectedRange.intersectsNode) {
251
- if (!element || !element.href) {
252
- return false;
253
- }
254
- const tempRange = document.createRange();
255
- tempRange.selectNodeContents(element);
256
- return (selectedRange.compareBoundaryPoints(Range.START_TO_START, tempRange) !== -1
257
- && selectedRange.compareBoundaryPoints(Range.START_TO_END, tempRange) !== 1) ||
258
- (selectedRange.compareBoundaryPoints(Range.END_TO_START, tempRange) !== -1
259
- && selectedRange.compareBoundaryPoints(Range.END_TO_END, tempRange) !== 1);
260
- }
261
- // Normal non-IE
262
- return !!element && !!element.href && selectedRange.intersectsNode(element);
263
- });
264
- }
265
- getIframeDocumentEl(id) {
266
- /* istanbul ignore next */
267
- if (!(id in this.editors)) {
268
- return undefined;
269
- }
270
- const contentWindowEl = this.getContentWindowEl(id);
271
- /* istanbul ignore else */
272
- if (contentWindowEl) {
273
- return contentWindowEl.document;
274
- }
275
- /* istanbul ignore next */
276
- return this.editors[id].iframeElementRef.contentDocument;
277
- }
278
- getFontSize(id) {
279
- let fontSize = STYLE_STATE_DEFAULTS.fontSize.toString();
280
- const selection = this.getCurrentSelection(id);
281
- /* istanbul ignore else */
282
- if (selection &&
283
- selection.anchorNode &&
284
- selection.anchorNode.parentElement) {
285
- let element = selection.anchorNode;
286
- if (element.nodeType !== 1) {
287
- element = element.parentElement;
288
- }
289
- const computedStyle = window.getComputedStyle(element);
290
- /* istanbul ignore else */
291
- if (computedStyle) {
292
- fontSize = computedStyle.getPropertyValue('font-size');
293
- }
294
- }
295
- return fontSize;
296
- }
297
- createObservers(id, element) {
298
- /* istanbul ignore next */
299
- const documentEl = element.contentWindow ?
300
- element.contentWindow.document :
301
- element.contentDocument;
302
- // Firefox bug where we need to open/close to cancel load so it doesn't overwrite attrs
303
- documentEl.open();
304
- documentEl.close();
305
- const selectionObservable = new Subject();
306
- const selectionListener = () => selectionObservable.next();
307
- const clickObservable = new Subject();
308
- const clickListener = () => clickObservable.next();
309
- const pasteListener = this.getPasteOverride(id);
310
- const blurObservable = new Subject();
311
- const blurListener = () => blurObservable.next();
312
- const inputObservable = new Subject();
313
- const inputListener = () => inputObservable.next();
314
- documentEl.addEventListener('selectionchange', selectionListener);
315
- documentEl.addEventListener('input', inputListener);
316
- documentEl.addEventListener('mousedown', clickListener);
317
- documentEl.body.addEventListener('paste', pasteListener);
318
- documentEl.body.addEventListener('blur', blurListener);
319
- return {
320
- blurObservable: blurObservable,
321
- clickObservable: clickObservable,
322
- commandChangeObservable: new Subject(),
323
- iframeElementRef: element,
324
- inputObservable: inputObservable,
325
- selectionChangeObservable: selectionObservable,
326
- blurListener: blurListener,
327
- clickListener: clickListener,
328
- inputListener: inputListener,
329
- pasteListener: pasteListener,
330
- selectionListener: selectionListener
331
- };
332
- }
333
- /* istanbul ignore next */
334
- getPasteOverride(id) {
335
- return (e) => {
336
- e.preventDefault();
337
- const text = e.clipboardData.getData('text/plain');
338
- this.execCommand(id, { command: 'insertHTML', value: text });
339
- };
340
- }
341
- getCurrentSelectionParentElement(id) {
342
- return this.selectionService.getCurrentSelectionParentElement(this.getIframeDocumentEl(id));
343
- }
344
- getColor(documentEl, selector) {
345
- const commandValue = documentEl.queryCommandValue(selector);
346
- // Edge is weird and returns numbers
347
- /* istanbul ignore if */
348
- if (typeof commandValue === 'number') {
349
- /* istanbul ignore next */
350
- // tslint:disable-next-line: no-bitwise
351
- return 'rgb(' + (commandValue & 0xFF) + ', ' +
352
- // tslint:disable-next-line: no-bitwise
353
- ((commandValue & 0xFF00) >> 8) + ', ' +
354
- // tslint:disable-next-line: no-bitwise
355
- ((commandValue & 0xFF0000) >> 16) + ')';
356
- }
357
- // Firefox uses 'Transparent' instead of a color value
358
- /* istanbul ignore next */
359
- if (commandValue.toString().toLowerCase() === 'transparent') {
360
- return STYLE_STATE_DEFAULTS.backColor;
361
- }
362
- return commandValue;
363
- }
364
- hasLink(editorId) {
365
- const anchorEl = this.getSelectedAnchorTag(editorId);
366
- const childAnchorEls = this.getChildSelectedAnchorTags(editorId);
367
- /* istanbul ignore next */
368
- return childAnchorEls.length > 0 || (!!anchorEl && !!anchorEl.href);
369
- }
370
- getParent(element, tag) {
371
- let currentNode = element;
372
- while (currentNode && currentNode.tagName.toUpperCase() !== 'BODY') {
373
- if (currentNode.tagName.toUpperCase() === tag.toUpperCase()) {
374
- return currentNode;
375
- }
376
- currentNode = currentNode.parentElement;
377
- }
378
- return undefined;
379
- }
380
- editorSelected(id) {
381
- const documentEl = this.getIframeDocumentEl(id);
382
- return this.selectionService.isElementSelected(documentEl, documentEl.body);
383
- }
384
- /* istanbul ignore next */
385
- insertHtmlInIE11(id, html) {
386
- const documentEl = this.getIframeDocumentEl(id);
387
- const windowEl = this.getContentWindowEl(id);
388
- const sel = windowEl.getSelection();
389
- if (sel.getRangeAt && sel.rangeCount) {
390
- let range = sel.getRangeAt(0);
391
- range.deleteContents();
392
- const el = documentEl.createElement('div');
393
- el.innerHTML = html;
394
- let frag = documentEl.createDocumentFragment(), node, lastNode;
395
- while (el.firstChild) {
396
- node = el.firstChild;
397
- lastNode = frag.appendChild(node);
398
- }
399
- range.insertNode(frag);
400
- // Preserve the selection
401
- if (lastNode) {
402
- range = range.cloneRange();
403
- range.setStartAfter(lastNode);
404
- range.collapse(true);
405
- sel.removeAllRanges();
406
- sel.addRange(range);
407
- }
408
- }
409
- }
410
- cleanUpBlankStyleTags(doc) {
411
- const orphanElements = Array.from(doc.querySelectorAll('font,span,*[style=""]'));
412
- for (let element of orphanElements) {
413
- if (!element.getAttribute('style')) {
414
- element.removeAttribute('style');
415
- }
416
- }
417
- const removableElements = orphanElements.filter(element => {
418
- const tagName = element.tagName.toUpperCase();
419
- return (tagName === 'FONT' || tagName === 'SPAN') &&
420
- (element.attributes.length === 0 || !element.hasChildNodes);
421
- });
422
- for (let element of removableElements) {
423
- const parent = element.parentNode;
424
- /* istanbul ignore else */
425
- if (parent) {
426
- while (element.firstChild) {
427
- parent.insertBefore(element.firstChild, element);
428
- }
429
- parent.removeChild(element);
430
- }
431
- }
432
- }
433
- // Certain values are encoded in html and need to be decoded
434
- replaceHtmlCodes(str) {
435
- return str.replace(/&nbsp;/, String.fromCharCode(160))
436
- .replace(/&lt;/g, '<')
437
- .replace(/&gt;/g, '>')
438
- .replace(/&amp;/g, '&');
439
- }
440
- setEditorDisabled(id, focusableChildren, textEditorNativeElement, disabled) {
441
- textEditorNativeElement.style.pointerEvents = disabled ? 'none' : 'auto';
442
- textEditorNativeElement.setAttribute('aria-disabled', disabled ? 'true' : 'false');
443
- /* istanbul ignore else */
444
- if (focusableChildren.length > 0) {
445
- focusableChildren.forEach(aFocusableChild => {
446
- aFocusableChild.tabIndex = disabled ? -1 : 0;
447
- });
448
- }
449
- this.getIframeDocumentEl(id).body.setAttribute('contenteditable', disabled ? 'false' : 'true');
450
- }
451
- }
452
- SkyTextEditorAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTextEditorAdapterService, deps: [{ token: i1.SkyTextEditorSelectionService }, { token: i2.SkyTextEditorService }, { token: i3.SkyAppWindowRef }], target: i0.ɵɵFactoryTarget.Injectable });
453
- SkyTextEditorAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTextEditorAdapterService, providedIn: 'root' });
454
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTextEditorAdapterService, decorators: [{
455
- type: Injectable,
456
- args: [{
457
- providedIn: 'root'
458
- }]
459
- }], ctorParameters: function () { return [{ type: i1.SkyTextEditorSelectionService }, { type: i2.SkyTextEditorService }, { type: i3.SkyAppWindowRef }]; } });
460
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3ItYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGV4dC1lZGl0b3Ivc3JjL21vZHVsZXMvdGV4dC1lZGl0b3Ivc2VydmljZXMvdGV4dC1lZGl0b3ItYWRhcHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUNMLE9BQU8sRUFDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxvQkFBb0IsRUFDckIsTUFBTSxrQ0FBa0MsQ0FBQztBQWtCMUMsT0FBTyxFQUNMLFNBQVMsRUFDVixNQUFNLHFDQUFxQyxDQUFDOzs7OztBQVU3Qzs7R0FFRztBQUlILE1BQU0sT0FBTywyQkFBMkI7SUFNdEMsWUFDVSxnQkFBK0MsRUFDL0MsaUJBQXVDLEVBQ3ZDLGFBQThCO1FBRjlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBK0I7UUFDL0Msc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQUN2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7SUFDcEMsQ0FBQztJQVJMLElBQVksT0FBTztRQUNqQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7SUFDeEMsQ0FBQztJQVFEOztPQUVHO0lBQ0ksU0FBUyxDQUNkLEVBQVUsRUFDVixhQUFnQyxFQUNoQyxVQUFtQyxFQUNuQyxXQUFvQjtRQUVwQiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBRTNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFF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QGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIFNreUFwcFdpbmRvd1JlZlxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbmltcG9ydCB7XG4gIFN1YmplY3Rcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIFNUWUxFX1NUQVRFX0RFRkFVTFRTXG59IGZyb20gJy4uL2RlZmF1bHRzL3N0eWxlLXN0YXRlLWRlZmF1bHRzJztcblxuaW1wb3J0IHtcbiAgRWRpdG9yQ29tbWFuZFxufSBmcm9tICcuLi90eXBlcy9lZGl0b3ItY29tbWFuZCc7XG5cbmltcG9ydCB7XG4gIEVkaXRvclNldHRpbmdcbn0gZnJvbSAnLi4vdHlwZXMvZWRpdG9yLXNldHRpbmcnO1xuXG5pbXBvcnQge1xuICBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZVxufSBmcm9tICcuLi90eXBlcy9zdHlsZS1zdGF0ZSc7XG5cbmltcG9ydCB7XG4gIFVybE1vZGFsUmVzdWx0XG59IGZyb20gJy4uL3VybC1tb2RhbC90ZXh0LWVkaXRvci11cmwtbW9kYWwtcmVzdWx0JztcblxuaW1wb3J0IHtcbiAgVXJsVGFyZ2V0XG59IGZyb20gJy4uL3VybC1tb2RhbC90ZXh0LWVkaXRvci11cmwtdGFyZ2V0JztcblxuaW1wb3J0IHtcbiAgU2t5VGV4dEVkaXRvclNlcnZpY2Vcbn0gZnJvbSAnLi90ZXh0LWVkaXRvci5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgU2t5VGV4dEVkaXRvclNlbGVjdGlvblNlcnZpY2Vcbn0gZnJvbSAnLi90ZXh0LWVkaXRvci1zZWxlY3Rpb24uc2VydmljZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JBZGFwdGVyU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBnZXQgZWRpdG9ycygpOiB7IFtrZXk6IHN0cmluZ106IEVkaXRvclNldHRpbmcgfSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dEVkaXRvclNlcnZpY2UuZWRpdG9ycztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZTogU2t5VGV4dEVkaXRvclNlbGVjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZXh0RWRpdG9yU2VydmljZTogU2t5VGV4dEVkaXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBTa3lBcHBXaW5kb3dSZWZcbiAgKSB7IH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRleHQgZWRpdG9yIGluc2lkZSB0aGUgc3VwcGxpZWQgaWZyYW1lIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgYWRkRWRpdG9yKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgaWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsXG4gICAgc3R5bGVTdGF0ZTogU2t5VGV4dEVkaXRvclN0eWxlU3RhdGUsXG4gICAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIShpZCBpbiB0aGlzLmVkaXRvcnMpKSB7XG4gICAgICB0aGlzLmVkaXRvcnNbaWRdID0gdGhpcy5jcmVhdGVPYnNlcnZlcnMoaWQsIGlmcmFtZUVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy5nZXRJZnJhbWVEb2N1bWVudEVsKGlkKTtcblxuICAgICAgY29uc3Qgc3R5bGVFbCA9IGRvY3VtZW50RWwuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlRWwuaW5uZXJIVE1MID0gYC5lZGl0b3I6ZW1wdHk6YmVmb3JlIHtcbiAgICAgICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQmxhY2tiYXVkIFNhbnNcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgICAgIGNvbG9yOiAjNjg2YzczO1xuICAgICAgICBmb250LXdlaWdodDogNDAwO1xuICAgICAgICBmb250LXNpemU6IDE1cHg7XG4gICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICAgIH1gO1xuICAgICAgZG9jdW1lbnRFbC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWwpO1xuXG4gICAgICBjb25zdCBzdHlsZTogU2t5VGV4dEVkaXRvclN0eWxlU3RhdGUgPSB7IC4uLlNUWUxFX1NUQVRFX0RFRkFVTFRTLCAuLi5zdHlsZVN0YXRlIH07XG4gICAgICBjb25zdCBib2R5U3R5bGUgPSBgYmFja2dyb3VuZC1jb2xvcjogJHtzdHlsZS5iYWNrQ29sb3J9O1xuICAgICAgICBjb2xvcjogJHtzdHlsZS5mb250Q29sb3J9O1xuICAgICAgICBmb250LWZhbWlseTogJHtzdHlsZS5mb250fTtcbiAgICAgICAgZm9udC1zaXplOiAke3N0eWxlLmZvbnRTaXplfXB4YDtcbiAgICAgIGRvY3VtZW50RWwucXVlcnlTZWxlY3RvcignaHRtbCcpLnNldEF0dHJpYnV0ZSgnbGFuZycsICdlbicpO1xuICAgICAgZG9jdW1lbnRFbC5ib2R5LnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcbiAgICAgIGRvY3VtZW50RWwuYm9keS5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpO1xuICAgICAgZG9jdW1lbnRFbC5ib2R5LnNldEF0dHJpYnV0ZSgncm9sZScsICdtYWluJyk7XG4gICAgICBkb2N1bWVudEVsLmJvZHkuc2V0QXR0cmlidXRlKCdjbGFzcycsICdlZGl0b3InKTtcbiAgICAgIGRvY3VtZW50RWwuYm9keS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYm9keVN0eWxlKTtcbiAgICAgIGRvY3VtZW50RWwuYm9keS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCBwbGFjZWhvbGRlciB8fCAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc2FibGVFZGl0b3IoaWQ6IHN0cmluZywgZm9jdXNhYmxlQ2hpbGRyZW46IEhUTUxFbGVtZW50W10sIHRleHRFZGl0b3JOYXRpdmVFbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNldEVkaXRvckRpc2FibGVkKGlkLCBmb2N1c2FibGVDaGlsZHJlbiwgdGV4dEVkaXRvck5hdGl2ZUVsZW1lbnQsIHRydWUpO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZUVkaXRvcihpZDogc3RyaW5nLCBmb2N1c2FibGVDaGlsZHJlbjogSFRNTEVsZW1lbnRbXSwgdGV4dEVkaXRvck5hdGl2ZUVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2V0RWRpdG9yRGlzYWJsZWQoaWQsIGZvY3VzYWJsZUNoaWxkcmVuLCB0ZXh0RWRpdG9yTmF0aXZlRWxlbWVudCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgY29tbWFuZCBvbiB0aGUgdGV4dCBlZGl0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBleGVjQ29tbWFuZChpZDogc3RyaW5nLCBlZGl0b3JDb21tYW5kOiBFZGl0b3JDb21tYW5kKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaWQgaW4gdGhpcy5lZGl0b3JzKSB7XG4gICAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy5nZXRJZnJhbWVEb2N1bWVudEVsKGlkKTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0aGlzLmVkaXRvclNlbGVjdGVkKGlkKSkge1xuICAgICAgICBjb25zdCBjb21tYW5kSXNTdXBwb3J0ZWRBbmRFbmFibGVkID0gZG9jdW1lbnRFbC5leGVjQ29tbWFuZChlZGl0b3JDb21tYW5kLmNvbW1hbmQsIGZhbHNlLCBlZGl0b3JDb21tYW5kLnZhbHVlKTtcblxuICAgICAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBpbnNlcnRIVE1MXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICBlZGl0b3JDb21tYW5kLmNvbW1hbmQudG9Mb3dlckNhc2UoKSA9PT0gJ2luc2VydGh0bWwnICYmXG4gICAgICAgICAgIWNvbW1hbmRJc1N1cHBvcnRlZEFuZEVuYWJsZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pbnNlcnRIdG1sSW5JRTExKGlkLCBlZGl0b3JDb21tYW5kLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNFZGl0b3IoaWQpO1xuICAgICAgICB0aGlzLmVkaXRvcnNbaWRdLmNvbW1hbmRDaGFuZ2VPYnNlcnZhYmxlLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNlbGVjdGlvbihpZDogc3RyaW5nKTogU2VsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldEN1cnJlbnRTZWxlY3Rpb24odGhpcy5nZXRJZnJhbWVEb2N1bWVudEVsKGlkKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGRhdGEgVVJJIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IHN0cmluZy5cbiAgICogVXNlZCB0byBkaXNwbGF5IGEgbWVyZ2UgZmllbGQgaW5zaWRlIGEgc3RyaW5nIG9mIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVyZ2VGaWVsZERhdGFVUkkodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy53aW5kb3dTZXJ2aWNlLm5hdGl2ZVdpbmRvdy5kb2N1bWVudDtcbiAgICBsZXQgdGV4dFRvVXNlID0gdGV4dDtcbiAgICBpZiAodGV4dC5sZW5ndGggPiAxOCkge1xuICAgICAgdGV4dFRvVXNlID0gdGV4dC5zdWJzdHIoMCwgMTUpICsgJy4uLic7XG4gICAgfVxuXG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50RWwuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcyMCcpO1xuICAgIGNhbnZhc0VsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxMDAnKTtcbiAgICBjYW52YXNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0YW4nO1xuICAgIGNhbnZhc0VsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDAwMDAwJztcbiAgICBjYW52YXNFbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc1cHgnO1xuXG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb250ZXh0LmZvbnQgPSAnMTJweCBBcmlhbCc7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBjb250ZXh0LmZpbGxUZXh0KHRleHRUb1VzZSwgNTAsIDE1KTtcblxuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW92ZXInO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyMwMEZGRkYnO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgMTAwLCAyMCk7XG5cbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAyO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGMDAwMCc7XG4gICAgY29udGV4dC5zdHJva2VSZWN0KDAsIDAsIDEwMCwgMjApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY2FudmFzRWxlbWVudC50b0RhdGFVUkwoJ2ltYWdlL3BuZycsIDEuMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHlsZVN0YXRlKGlkOiBzdHJpbmcpOiBQYXJ0aWFsPFNreVRleHRFZGl0b3JTdHlsZVN0YXRlPiB7XG4gICAgY29uc3QgZG9jdW1lbnRFbCA9IHRoaXMuZ2V0SWZyYW1lRG9jdW1lbnRFbChpZCk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmVkaXRvclNlbGVjdGVkKGlkKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmFja0NvbG9yOiB0aGlzLmdldENvbG9yKGRvY3VtZW50RWwsICdCYWNrQ29sb3InKSxcbiAgICAgICAgZm9udENvbG9yOiB0aGlzLmdldENvbG9yKGRvY3VtZW50RWwsICdGb3JlQ29sb3InKSxcbiAgICAgICAgZm9udFNpemU6IHBhcnNlSW50KHRoaXMuZ2V0Rm9udFNpemUoaWQpLCB1bmRlZmluZWQpLFxuICAgICAgICBmb250OiBkb2N1bWVudEVsLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250bmFtZScpLFxuICAgICAgICBib2xkU3RhdGU6IGRvY3VtZW50RWwucXVlcnlDb21tYW5kU3RhdGUoJ0JvbGQnKSxcbiAgICAgICAgaXRhbGljU3RhdGU6IGRvY3VtZW50RWwucXVlcnlDb21tYW5kU3RhdGUoJ0l0YWxpYycpLFxuICAgICAgICB1bmRlcmxpbmVTdGF0ZTogZG9jdW1lbnRFbC5xdWVyeUNvbW1hbmRTdGF0ZSgnVW5kZXJsaW5lJyksXG4gICAgICAgIGxpbmtTdGF0ZTogdGhpcy5oYXNMaW5rKGlkKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFZGl0b3JJbm5lckh0bWwoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZG9jdW1lbnRFbCA9IHRoaXMuZ2V0SWZyYW1lRG9jdW1lbnRFbChpZCk7XG4gICAgaWYgKGRvY3VtZW50RWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VIdG1sQ29kZXMoZG9jdW1lbnRFbC5ib2R5LmlubmVySFRNTCk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFZGl0b3JJbm5lckh0bWwoaWQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLmdldElmcmFtZURvY3VtZW50RWwoaWQpO1xuICAgIGNvbnN0IGVkaXRvckNvbnRlbnQgPSBkb2N1bWVudEVsLmJvZHk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZWRpdG9yQ29udGVudC5pbm5lckhUTUwgIT09IHZhbHVlKSB7XG4gICAgICBlZGl0b3JDb250ZW50LmlubmVySFRNTCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb2N1c0VkaXRvcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaWQgaW4gdGhpcy5lZGl0b3JzKSB7XG4gICAgICBjb25zdCB3aW5kb3dFbCA9IHRoaXMuZ2V0Q29udGVudFdpbmRvd0VsKGlkKTtcbiAgICAgIGNvbnN0IGlmcmFtZURvY3VtZW50RWwgPSB0aGlzLmdldElmcmFtZURvY3VtZW50RWwoaWQpO1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRDdXJyZW50U2VsZWN0aW9uUmFuZ2UoaWZyYW1lRG9jdW1lbnRFbCwgd2luZG93RWwpO1xuICAgICAgY29uc3QgY3Vyc29ySXNOb3RBY3RpdmVBbmRIYXNSZXNldCA9IGN1cnJlbnRTZWxlY3Rpb24gJiYgKGN1cnJlbnRTZWxlY3Rpb24uc3RhcnRPZmZzZXQgPT09IDAgJiYgY3VycmVudFNlbGVjdGlvbi5lbmRPZmZzZXQgPT09IDApO1xuXG4gICAgICBpZiAoIXRoaXMuZWRpdG9yU2VsZWN0ZWQoaWQpIHx8IGN1cnNvcklzTm90QWN0aXZlQW5kSGFzUmVzZXQpIHtcbiAgICAgICAgLy8gZm9jdXMgdGhlIGVuZCBvZiB0aGUgZWRpdG9yXG4gICAgICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLndpbmRvd1NlcnZpY2UubmF0aXZlV2luZG93LmRvY3VtZW50O1xuICAgICAgICBjb25zdCBlZGl0b3I6IGFueSA9IGlmcmFtZURvY3VtZW50RWwuYm9keTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudEVsLmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgdGhpcy5lZGl0b3JzW2lkXS5pZnJhbWVFbGVtZW50UmVmLmZvY3VzKCk7XG4gICAgICAgIGVkaXRvci5mb2N1cygpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAod2luZG93RWwuZ2V0U2VsZWN0aW9uICYmIGRvY3VtZW50RWwuY3JlYXRlUmFuZ2UpIHtcbiAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XG4gICAgICAgICAgY29uc3Qgc2VsID0gd2luZG93RWwuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSUUgb25seVxuICAgICAgICAgIGNvbnN0IHRleHRSYW5nZSA9IGVkaXRvci5jcmVhdGVUZXh0UmFuZ2UoKTtcbiAgICAgICAgICB0ZXh0UmFuZ2UubW92ZVRvRWxlbWVudFRleHQoZWRpdG9yKTtcbiAgICAgICAgICB0ZXh0UmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgICAgICAgIHRleHRSYW5nZS5zZWxlY3QoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3Vyc29yIG1heSBub3QgYmUgYWN0aXZlLCByZXN0b3JlIGl0XG4gICAgICAgIHRoaXMuZWRpdG9yc1tpZF0uaWZyYW1lRWxlbWVudFJlZi5mb2N1cygpO1xuICAgICAgICBpZnJhbWVEb2N1bWVudEVsLmJvZHkuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TGluayhlZGl0b3JJZDogc3RyaW5nKTogVXJsTW9kYWxSZXN1bHQge1xuICAgIGxldCBsaW5rOiBVcmxNb2RhbFJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhbmNob3JFbCA9IHRoaXMuZ2V0U2VsZWN0ZWRBbmNob3JUYWcoZWRpdG9ySWQpO1xuICAgIGlmIChhbmNob3JFbCAmJiBhbmNob3JFbC5ocmVmKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICB0YXJnZXQ6IGFuY2hvckVsLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykgPT09ICdfYmxhbmsnID8gVXJsVGFyZ2V0Lk5ld1dpbmRvdyA6IFVybFRhcmdldC5Ob25lLFxuICAgICAgICB1cmw6IGFuY2hvckVsLmhyZWZcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbms7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRBbmNob3JUYWcoZWRpdG9ySWQ6IHN0cmluZyk6IEhUTUxBbmNob3JFbGVtZW50IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudChlZGl0b3JJZCk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnQoc2VsZWN0ZWRFbCwgJ2EnKSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2VsZWN0aW9uKGlkOiBzdHJpbmcpOiBSYW5nZSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRDdXJyZW50U2VsZWN0aW9uUmFuZ2UodGhpcy5nZXRJZnJhbWVEb2N1bWVudEVsKGlkKSwgdGhpcy5nZXRDb250ZW50V2luZG93RWwoaWQpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RFbGVtZW50KGlkOiBzdHJpbmcsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEVsZW1lbnQodGhpcy5nZXRJZnJhbWVEb2N1bWVudEVsKGlkKSwgdGhpcy5nZXRDb250ZW50V2luZG93RWwoaWQpLCBlbGVtZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbGFjZWhvbGRlcihpZDogc3RyaW5nLCBwbGFjZWhvbGRlcj86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLmdldElmcmFtZURvY3VtZW50RWwoaWQpO1xuICAgIGRvY3VtZW50RWwuYm9keS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCBwbGFjZWhvbGRlciB8fCAnJyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Rm9udFNpemUoaWQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRvYyA9IHRoaXMuZ2V0SWZyYW1lRG9jdW1lbnRFbChpZCk7XG4gICAgdGhpcy5leGVjQ29tbWFuZChpZCwge2NvbW1hbmQ6ICdmb250U2l6ZScsIHZhbHVlOiAxfSk7XG4gICAgY29uc3QgZm9udEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gQXJyYXkuZnJvbShkb2MucXVlcnlTZWxlY3RvckFsbCgnZm9udFtzaXplPVwiMVwiXScpKTtcbiAgICBmb3IgKGxldCBlbGVtZW50IG9mIGZvbnRFbGVtZW50cykge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3NpemUnKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAoZm9udFNpemUgKyAncHgnKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhblVwQmxhbmtTdHlsZVRhZ3MoZG9jKTtcblxuICAgIHRoaXMuZm9jdXNFZGl0b3IoaWQpO1xuICAgIHRoaXMuZWRpdG9yc1tpZF0uY29tbWFuZENoYW5nZU9ic2VydmFibGUubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZU9ic2VydmVycyhzZXR0aW5nOiBFZGl0b3JTZXR0aW5nKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjb25zdCBkb2N1bWVudEVsID0gc2V0dGluZy5pZnJhbWVFbGVtZW50UmVmLmNvbnRlbnRXaW5kb3cgP1xuICAgICAgIHNldHRpbmcuaWZyYW1lRWxlbWVudFJlZi5jb250ZW50V2luZG93LmRvY3VtZW50IDpcbiAgICAgICBzZXR0aW5nLmlmcmFtZUVsZW1lbnRSZWYuY29udGVudERvY3VtZW50O1xuICAgIHNldHRpbmcuc2VsZWN0aW9uQ2hhbmdlT2JzZXJ2YWJsZS5jb21wbGV0ZSgpO1xuICAgIHNldHRpbmcuY2xpY2tPYnNlcnZhYmxlLmNvbXBsZXRlKCk7XG4gICAgc2V0dGluZy5jb21tYW5kQ2hhbmdlT2JzZXJ2YWJsZS5jb21wbGV0ZSgpO1xuICAgIGRvY3VtZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uY2hhbmdlJywgc2V0dGluZy5zZWxlY3Rpb25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIHNldHRpbmcuc2VsZWN0aW9uTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc2V0dGluZy5jbGlja0xpc3RlbmVyKTtcbiAgICBkb2N1bWVudEVsLmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBzZXR0aW5nLnBhc3RlTGlzdGVuZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZW50V2luZG93RWwoaWQ6IHN0cmluZyk6IFdpbmRvdyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yc1tpZF0uaWZyYW1lRWxlbWVudFJlZi5jb250ZW50V2luZG93O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDaGlsZFNlbGVjdGVkQW5jaG9yVGFncyhlZGl0b3JJZDogc3RyaW5nKTogRWxlbWVudFtdIHtcbiAgICBjb25zdCBzZWxlY3RlZFJhbmdlID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0aW9uKGVkaXRvcklkKS5nZXRSYW5nZUF0KDApO1xuICAgIGlmIChzZWxlY3RlZFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudChlZGl0b3JJZCk7XG5cbiAgICBsZXQgY2hpbGRFbGVtZW50cyA9IFtdO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGNoaWxkRWxlbWVudHMgPSBBcnJheS5mcm9tKHBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYScpKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IHtcblxuICAgICAgLy8gSUUgc3BlY2lmaWNcbiAgICAgIGlmICghc2VsZWN0ZWRSYW5nZS5pbnRlcnNlY3RzTm9kZSkge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuaHJlZikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZW1wUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICB0ZW1wUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gKHNlbGVjdGVkUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLlNUQVJUX1RPX1NUQVJULCB0ZW1wUmFuZ2UpICE9PSAtMVxuICAgICAgICAgICYmIHNlbGVjdGVkUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLlNUQVJUX1RPX0VORCwgdGVtcFJhbmdlKSAhPT0gMSkgfHxcbiAgICAgICAgICAoc2VsZWN0ZWRSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuRU5EX1RPX1NUQVJULCB0ZW1wUmFuZ2UpICE9PSAtMVxuICAgICAgICAgICYmIHNlbGVjdGVkUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLkVORF9UT19FTkQsIHRlbXBSYW5nZSkgIT09IDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWwgbm9uLUlFXG4gICAgICByZXR1cm4gISFlbGVtZW50ICYmICEhZWxlbWVudC5ocmVmICYmIHNlbGVjdGVkUmFuZ2UuaW50ZXJzZWN0c05vZGUoZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldElmcmFtZURvY3VtZW50RWwoaWQ6IHN0cmluZyk6IERvY3VtZW50IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICghKGlkIGluIHRoaXMuZWRpdG9ycykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFdpbmRvd0VsID0gdGhpcy5nZXRDb250ZW50V2luZG93RWwoaWQpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGNvbnRlbnRXaW5kb3dFbCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRXaW5kb3dFbC5kb2N1bWVudDtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLmVkaXRvcnNbaWRdLmlmcmFtZUVsZW1lbnRSZWYuY29udGVudERvY3VtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb250U2l6ZShpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZm9udFNpemUgPSBTVFlMRV9TVEFURV9ERUZBVUxUUy5mb250U2l6ZS50b1N0cmluZygpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbihpZCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoXG4gICAgICBzZWxlY3Rpb24gJiZcbiAgICAgIHNlbGVjdGlvbi5hbmNob3JOb2RlICYmXG4gICAgICBzZWxlY3Rpb24uYW5jaG9yTm9kZS5wYXJlbnRFbGVtZW50XG4gICAgKSB7XG4gICAgICBsZXQgZWxlbWVudCA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50IGFzIEVsZW1lbnQpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgIGZvbnRTaXplID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbnRTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPYnNlcnZlcnMoaWQ6IHN0cmluZywgZWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQpOiBFZGl0b3JTZXR0aW5nIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGNvbnN0IGRvY3VtZW50RWwgPSBlbGVtZW50LmNvbnRlbnRXaW5kb3cgP1xuICAgICAgZWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50IDpcbiAgICAgIGVsZW1lbnQuY29udGVudERvY3VtZW50O1xuXG4gICAgLy8gRmlyZWZveCBidWcgd2hlcmUgd2UgbmVlZCB0byBvcGVuL2Nsb3NlIHRvIGNhbmNlbCBsb2FkIHNvIGl0IGRvZXNuJ3Qgb3ZlcndyaXRlIGF0dHJzXG4gICAgZG9jdW1lbnRFbC5vcGVuKCk7XG4gICAgZG9jdW1lbnRFbC5jbG9zZSgpO1xuXG4gICAgY29uc3Qgc2VsZWN0aW9uT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTGlzdGVuZXIgPSAoKSA9PiBzZWxlY3Rpb25PYnNlcnZhYmxlLm5leHQoKTtcbiAgICBjb25zdCBjbGlja09ic2VydmFibGUgPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IGNsaWNrTGlzdGVuZXIgPSAoKSA9PiBjbGlja09ic2VydmFibGUubmV4dCgpO1xuICAgIGNvbnN0IHBhc3RlTGlzdGVuZXIgPSB0aGlzLmdldFBhc3RlT3ZlcnJpZGUoaWQpO1xuICAgIGNvbnN0IGJsdXJPYnNlcnZhYmxlID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCBibHVyTGlzdGVuZXIgPSAoKSA9PiBibHVyT2JzZXJ2YWJsZS5uZXh0KCk7XG4gICAgY29uc3QgaW5wdXRPYnNlcnZhYmxlID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCBpbnB1dExpc3RlbmVyID0gKCkgPT4gaW5wdXRPYnNlcnZhYmxlLm5leHQoKTtcblxuICAgIGRvY3VtZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uY2hhbmdlJywgc2VsZWN0aW9uTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBpbnB1dExpc3RlbmVyKTtcbiAgICBkb2N1bWVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNsaWNrTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50RWwuYm9keS5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIHBhc3RlTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50RWwuYm9keS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgYmx1ckxpc3RlbmVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgYmx1ck9ic2VydmFibGU6IGJsdXJPYnNlcnZhYmxlLFxuICAgICAgY2xpY2tPYnNlcnZhYmxlOiBjbGlja09ic2VydmFibGUsXG4gICAgICBjb21tYW5kQ2hhbmdlT2JzZXJ2YWJsZTogbmV3IFN1YmplY3QoKSxcbiAgICAgIGlmcmFtZUVsZW1lbnRSZWY6IGVsZW1lbnQsXG4gICAgICBpbnB1dE9ic2VydmFibGU6IGlucHV0T2JzZXJ2YWJsZSxcbiAgICAgIHNlbGVjdGlvbkNoYW5nZU9ic2VydmFibGU6IHNlbGVjdGlvbk9ic2VydmFibGUsXG4gICAgICBibHVyTGlzdGVuZXI6IGJsdXJMaXN0ZW5lcixcbiAgICAgIGNsaWNrTGlzdGVuZXI6IGNsaWNrTGlzdGVuZXIsXG4gICAgICBpbnB1dExpc3RlbmVyOiBpbnB1dExpc3RlbmVyLFxuICAgICAgcGFzdGVMaXN0ZW5lcjogcGFzdGVMaXN0ZW5lcixcbiAgICAgIHNlbGVjdGlvbkxpc3RlbmVyOiBzZWxlY3Rpb25MaXN0ZW5lclxuICAgIH07XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBwcml2YXRlIGdldFBhc3RlT3ZlcnJpZGUoaWQ6IHN0cmluZyk6IChlOiBDbGlwYm9hcmRFdmVudCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIChlOiBDbGlwYm9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgdGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XG4gICAgICB0aGlzLmV4ZWNDb21tYW5kKGlkLCB7IGNvbW1hbmQ6ICdpbnNlcnRIVE1MJywgdmFsdWU6IHRleHQgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFNlbGVjdGlvblBhcmVudEVsZW1lbnQoaWQ6IHN0cmluZyk6IEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFNlbGVjdGlvblBhcmVudEVsZW1lbnQodGhpcy5nZXRJZnJhbWVEb2N1bWVudEVsKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbG9yKGRvY3VtZW50RWw6IERvY3VtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21tYW5kVmFsdWUgPSBkb2N1bWVudEVsLnF1ZXJ5Q29tbWFuZFZhbHVlKHNlbGVjdG9yKTtcblxuICAgIC8vIEVkZ2UgaXMgd2VpcmQgYW5kIHJldHVybnMgbnVtYmVyc1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0eXBlb2YgY29tbWFuZFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYml0d2lzZVxuICAgICAgcmV0dXJuICdyZ2IoJyArIChjb21tYW5kVmFsdWUgJiAweEZGKSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICAgICAgKChjb21tYW5kVmFsdWUgJiAweEZGMDApID4+IDgpICsgJywgJyArXG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYml0d2lzZVxuICAgICAgICAgICAgICAgICAgICAoKGNvbW1hbmRWYWx1ZSAmIDB4RkYwMDAwKSA+PiAxNiApICsgJyknO1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3ggdXNlcyAnVHJhbnNwYXJlbnQnIGluc3RlYWQgb2YgYSBjb2xvciB2YWx1ZVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGNvbW1hbmRWYWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgIHJldHVybiBTVFlMRV9TVEFURV9ERUZBVUxUUy5iYWNrQ29sb3I7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGhhc0xpbmsoZWRpdG9ySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFuY2hvckVsID0gdGhpcy5nZXRTZWxlY3RlZEFuY2hvclRhZyhlZGl0b3JJZCk7XG4gICAgY29uc3QgY2hpbGRBbmNob3JFbHMgPSB0aGlzLmdldENoaWxkU2VsZWN0ZWRBbmNob3JUYWdzKGVkaXRvcklkKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBjaGlsZEFuY2hvckVscy5sZW5ndGggPiAwIHx8ICghIWFuY2hvckVsICYmICEhYW5jaG9yRWwuaHJlZik7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmVudChlbGVtZW50OiBFbGVtZW50LCB0YWc6IHN0cmluZyk6IEVsZW1lbnQge1xuICAgIGxldCBjdXJyZW50Tm9kZSA9IGVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gJ0JPRFknKSB7XG4gICAgICBpZiAoY3VycmVudE5vZGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSB0YWcudG9VcHBlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgICB9XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGVkaXRvclNlbGVjdGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy5nZXRJZnJhbWVEb2N1bWVudEVsKGlkKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzRWxlbWVudFNlbGVjdGVkKGRvY3VtZW50RWwsIGRvY3VtZW50RWwuYm9keSk7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBwcml2YXRlIGluc2VydEh0bWxJbklFMTEoaWQ6IHN0cmluZywgaHRtbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZG9jdW1lbnRFbCA9IHRoaXMuZ2V0SWZyYW1lRG9jdW1lbnRFbChpZCk7XG4gICAgY29uc3Qgd2luZG93RWwgPSB0aGlzLmdldENvbnRlbnRXaW5kb3dFbChpZCk7XG4gICAgY29uc3Qgc2VsID0gd2luZG93RWwuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbC5nZXRSYW5nZUF0ICYmIHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICBsZXQgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG5cbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnRFbC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBsZXQgZnJhZyA9IGRvY3VtZW50RWwuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLCBub2RlLCBsYXN0Tm9kZTtcbiAgICAgIHdoaWxlIChlbC5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUgPSBlbC5maXJzdENoaWxkO1xuICAgICAgICBsYXN0Tm9kZSA9IGZyYWcuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICB9XG4gICAgICByYW5nZS5pbnNlcnROb2RlKGZyYWcpO1xuXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgc2VsZWN0aW9uXG4gICAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgICAgcmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIobGFzdE5vZGUpO1xuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5VcEJsYW5rU3R5bGVUYWdzKGRvYzogRG9jdW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBvcnBoYW5FbGVtZW50czogSFRNTEVsZW1lbnRbXSA9IEFycmF5LmZyb20oZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ZvbnQsc3BhbiwqW3N0eWxlPVwiXCJdJykpO1xuICAgIGZvciAobGV0IGVsZW1lbnQgb2Ygb3JwaGFuRWxlbWVudHMpIHtcbiAgICAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlbW92YWJsZUVsZW1lbnRzID0gb3JwaGFuRWxlbWVudHMuZmlsdGVyKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgcmV0dXJuICh0YWdOYW1lID09PSAnRk9OVCcgfHwgdGFnTmFtZSA9PT0gJ1NQQU4nKSAmJlxuICAgICAgICAoZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCB8fCAhZWxlbWVudC5oYXNDaGlsZE5vZGVzKTtcbiAgICB9KTtcbiAgICBmb3IgKGxldCBlbGVtZW50IG9mIHJlbW92YWJsZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShlbGVtZW50LmZpcnN0Q2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDZXJ0YWluIHZhbHVlcyBhcmUgZW5jb2RlZCBpbiBodG1sIGFuZCBuZWVkIHRvIGJlIGRlY29kZWRcbiAgcHJpdmF0ZSByZXBsYWNlSHRtbENvZGVzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyZuYnNwOy8sIFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSlcbiAgICAgIC5yZXBsYWNlKC8mbHQ7L2csICc8JylcbiAgICAgIC5yZXBsYWNlKC8mZ3Q7L2csICc+JylcbiAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCAnJicpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFZGl0b3JEaXNhYmxlZChpZDogc3RyaW5nLCBmb2N1c2FibGVDaGlsZHJlbjogSFRNTEVsZW1lbnRbXSwgdGV4dEVkaXRvck5hdGl2ZUVsZW1lbnQ6IGFueSwgZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0ZXh0RWRpdG9yTmF0aXZlRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gZGlzYWJsZWQgPyAnbm9uZScgOiAnYXV0byc7XG4gICAgdGV4dEVkaXRvck5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgZGlzYWJsZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChmb2N1c2FibGVDaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBmb2N1c2FibGVDaGlsZHJlbi5mb3JFYWNoKGFGb2N1c2FibGVDaGlsZCA9PiB7XG4gICAgICAgIGFGb2N1c2FibGVDaGlsZC50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZ2V0SWZyYW1lRG9jdW1lbnRFbChpZCkuYm9keS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIGRpc2FibGVkID8gJ2ZhbHNlJyA6ICd0cnVlJyk7XG4gIH1cblxufVxuIl19
@@ -1,76 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * @internal
5
- */
6
- export class SkyTextEditorSelectionService {
7
- isElementSelected(documentEl, element) {
8
- const selectedNode = this.getCurrentSelection(documentEl).anchorNode;
9
- /* istanbul ignore next */
10
- return selectedNode &&
11
- (element.contains(selectedNode) || (selectedNode.parentNode && element.contains(selectedNode.parentNode)));
12
- }
13
- getCurrentSelection(documentEl) {
14
- return documentEl.getSelection();
15
- }
16
- getCurrentSelectionParentElement(documentEl) {
17
- const selection = this.getCurrentSelection(documentEl);
18
- let selectedEl;
19
- /* istanbul ignore else */
20
- if (selection &&
21
- selection.getRangeAt &&
22
- selection.getRangeAt(0).commonAncestorContainer) {
23
- selectedEl = selection.getRangeAt(0).commonAncestorContainer;
24
- selectedEl = selectedEl.nodeType !== 1 ? selectedEl.parentElement : selectedEl;
25
- }
26
- else if (selection && selection.type !== 'Control') {
27
- selectedEl = selection.createRange().parentElement();
28
- }
29
- else {
30
- return undefined;
31
- }
32
- return selectedEl;
33
- }
34
- getCurrentSelectionRange(documentEl, windowEl) {
35
- /* istanbul ignore else */
36
- if (windowEl.getSelection) {
37
- const sel = windowEl.getSelection();
38
- /* istanbul ignore else */
39
- if (sel.getRangeAt && sel.rangeCount) {
40
- return sel.getRangeAt(0);
41
- }
42
- }
43
- else if (documentEl.getSelection() && documentEl.getSelection().getRangeAt) {
44
- return documentEl.getSelection().getRangeAt(0);
45
- }
46
- }
47
- selectElement(documentEl, windowEl, element) {
48
- /* istanbul ignore else */
49
- if (element) {
50
- /* istanbul ignore else */
51
- if (windowEl.getSelection) {
52
- const sel = windowEl.getSelection();
53
- sel.removeAllRanges();
54
- const range = documentEl.createRange();
55
- range.selectNodeContents(element);
56
- sel.addRange(range);
57
- }
58
- else if (documentEl.getSelection) {
59
- const sel = documentEl.getSelection();
60
- sel.removeAllRanges();
61
- const range = documentEl.createRange();
62
- range.selectNodeContents(element);
63
- sel.addRange(range);
64
- }
65
- }
66
- }
67
- }
68
- SkyTextEditorSelectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTextEditorSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
69
- SkyTextEditorSelectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTextEditorSelectionService, providedIn: 'root' });
70
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTextEditorSelectionService, decorators: [{
71
- type: Injectable,
72
- args: [{
73
- providedIn: 'root'
74
- }]
75
- }] });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3Itc2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXh0LWVkaXRvci9zcmMvbW9kdWxlcy90ZXh0LWVkaXRvci9zZXJ2aWNlcy90ZXh0LWVkaXRvci1zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDOztBQUV2Qjs7R0FFRztBQUlILE1BQU0sT0FBTyw2QkFBNkI7SUFDakMsaUJBQWlCLENBQUMsVUFBb0IsRUFBRSxPQUFvQjtRQUNqRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBeUIsQ0FBQztRQUNwRiwwQkFBMEI7UUFDMUIsT0FBTyxZQUFZO1lBQ2pCLENBQ0UsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FDekcsQ0FBQztJQUNOLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxVQUFvQjtRQUM3QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sZ0NBQWdDLENBQUMsVUFBb0I7UUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksVUFBbUIsQ0FBQztRQUN4QiwwQkFBMEI7UUFDMUIsSUFBSSxTQUFTO1lBQ1QsU0FBUyxDQUFDLFVBQVU7WUFDcEIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsRUFDakQ7WUFDQSxVQUFVLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBa0MsQ0FBQztZQUN4RSxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUNoRjthQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ2xELFVBQVUsR0FBSSxTQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ2pFO2FBQU07WUFDTCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxVQUFvQixFQUFFLFFBQWdCO1FBQ3BFLDBCQUEwQjtRQUMxQixJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDekIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BDLDBCQUEwQjtZQUMxQixJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTtnQkFDcEMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFCO1NBQ0Y7YUFBTSxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFO1lBQzVFLE9BQU8sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFTSxhQUFhLENBQUMsVUFBb0IsRUFBRSxRQUFnQixFQUFFLE9BQW9CO1FBQy9FLDBCQUEwQjtRQUMxQixJQUFJLE9BQU8sRUFBRTtZQUNYLDBCQUEwQjtZQUMxQixJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3pCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQzs7MkhBL0RVLDZCQUE2QjsrSEFBN0IsNkJBQTZCLGNBRjVCLE1BQU07NEZBRVAsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIGlzRWxlbWVudFNlbGVjdGVkKGRvY3VtZW50RWw6IERvY3VtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkTm9kZSA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbihkb2N1bWVudEVsKS5hbmNob3JOb2RlIGFzIEhUTUxFbGVtZW50O1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHNlbGVjdGVkTm9kZSAmJlxuICAgICAgKFxuICAgICAgICBlbGVtZW50LmNvbnRhaW5zKHNlbGVjdGVkTm9kZSkgfHwgKHNlbGVjdGVkTm9kZS5wYXJlbnROb2RlICYmIGVsZW1lbnQuY29udGFpbnMoc2VsZWN0ZWROb2RlLnBhcmVudE5vZGUpKVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50RWw6IERvY3VtZW50KTogU2VsZWN0aW9uIHtcbiAgICByZXR1cm4gZG9jdW1lbnRFbC5nZXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudChkb2N1bWVudEVsOiBEb2N1bWVudCk6IEVsZW1lbnQge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbihkb2N1bWVudEVsKTtcbiAgICBsZXQgc2VsZWN0ZWRFbDogRWxlbWVudDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChzZWxlY3Rpb24gJiZcbiAgICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQgJiZcbiAgICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXJcbiAgICApIHtcbiAgICAgIHNlbGVjdGVkRWwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lciBhcyBFbGVtZW50O1xuICAgICAgc2VsZWN0ZWRFbCA9IHNlbGVjdGVkRWwubm9kZVR5cGUgIT09IDEgPyBzZWxlY3RlZEVsLnBhcmVudEVsZW1lbnQgOiBzZWxlY3RlZEVsO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50eXBlICE9PSAnQ29udHJvbCcpIHtcbiAgICAgICAgc2VsZWN0ZWRFbCA9IChzZWxlY3Rpb24gYXMgYW55KS5jcmVhdGVSYW5nZSgpLnBhcmVudEVsZW1lbnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkRWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNlbGVjdGlvblJhbmdlKGRvY3VtZW50RWw6IERvY3VtZW50LCB3aW5kb3dFbDogV2luZG93KTogUmFuZ2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHdpbmRvd0VsLmdldFNlbGVjdGlvbikge1xuICAgICAgY29uc3Qgc2VsID0gd2luZG93RWwuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHNlbC5nZXRSYW5nZUF0ICYmIHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICAgIHJldHVybiBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWwuZ2V0U2VsZWN0aW9uKCkgJiYgZG9jdW1lbnRFbC5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnRFbC5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RFbGVtZW50KGRvY3VtZW50RWw6IERvY3VtZW50LCB3aW5kb3dFbDogV2luZG93LCBlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAod2luZG93RWwuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvd0VsLmdldFNlbGVjdGlvbigpO1xuICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnRFbC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWwuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNlbCA9IGRvY3VtZW50RWwuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudEVsLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuIl19