angular-froala-wysiwyg 4.0.19 → 4.1.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.
@@ -1,5 +1,6 @@
1
1
  import { ControlValueAccessor } from "@angular/forms";
2
2
  import { ElementRef, EventEmitter, NgZone } from '@angular/core';
3
+ import * as i0 from "@angular/core";
3
4
  export declare class FroalaEditorDirective implements ControlValueAccessor {
4
5
  private zone;
5
6
  private _opts;
@@ -20,6 +21,7 @@ export declare class FroalaEditorDirective implements ControlValueAccessor {
20
21
  set froalaEditor(opts: any);
21
22
  private clone;
22
23
  set froalaModel(content: any);
24
+ private stringify;
23
25
  private updateEditor;
24
26
  froalaModelChange: EventEmitter<any>;
25
27
  froalaInit: EventEmitter<Object>;
@@ -33,6 +35,10 @@ export declare class FroalaEditorDirective implements ControlValueAccessor {
33
35
  private getEditor;
34
36
  private generateManualController;
35
37
  ngAfterViewInit(): void;
38
+ private initialized;
39
+ private setup;
36
40
  ngOnDestroy(): void;
37
41
  setDisabledState(isDisabled: boolean): void;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<FroalaEditorDirective, never>;
43
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FroalaEditorDirective, "[froalaEditor]", ["froalaEditor"], { "froalaEditor": "froalaEditor"; "froalaModel": "froalaModel"; }, { "froalaModelChange": "froalaModelChange"; "froalaInit": "froalaInit"; }, never, never, false, never>;
38
44
  }
@@ -1,4 +1,9 @@
1
1
  import { ModuleWithProviders } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "./editor.directive";
2
4
  export declare class FroalaEditorModule {
3
5
  static forRoot(): ModuleWithProviders<FroalaEditorModule>;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<FroalaEditorModule, never>;
7
+ static ɵmod: i0.ɵɵNgModuleDeclaration<FroalaEditorModule, [typeof i1.FroalaEditorDirective], never, [typeof i1.FroalaEditorDirective]>;
8
+ static ɵinj: i0.ɵɵInjectorDeclaration<FroalaEditorModule>;
4
9
  }
@@ -0,0 +1,357 @@
1
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
2
+ import { Directive, ElementRef, EventEmitter, forwardRef, Input, NgZone, Output } from '@angular/core';
3
+ import FroalaEditor from 'froala-editor';
4
+ import * as i0 from "@angular/core";
5
+ export class FroalaEditorDirective {
6
+ constructor(el, zone) {
7
+ this.zone = zone;
8
+ // editor options
9
+ this._opts = {
10
+ immediateAngularModelUpdate: false,
11
+ angularIgnoreAttrs: null
12
+ };
13
+ this.SPECIAL_TAGS = ['img', 'button', 'input', 'a'];
14
+ this.INNER_HTML_ATTR = 'innerHTML';
15
+ this._hasSpecialTag = false;
16
+ this._editorInitialized = false;
17
+ this._oldModel = null;
18
+ // Begin ControlValueAccesor methods.
19
+ this.onChange = (_) => {
20
+ };
21
+ this.onTouched = () => {
22
+ };
23
+ // froalaModel directive as output: update model if editor contentChanged
24
+ this.froalaModelChange = new EventEmitter();
25
+ // froalaInit directive as output: send manual editor initialization
26
+ this.froalaInit = new EventEmitter();
27
+ this.initialized = false;
28
+ let element = el.nativeElement;
29
+ // check if the element is a special tag
30
+ if (this.SPECIAL_TAGS.indexOf(element.tagName.toLowerCase()) != -1) {
31
+ this._hasSpecialTag = true;
32
+ }
33
+ this._element = element;
34
+ this.zone = zone;
35
+ }
36
+ // Form model content changed.
37
+ writeValue(content) {
38
+ this.updateEditor(content);
39
+ if (content) {
40
+ this.setup();
41
+ }
42
+ }
43
+ registerOnChange(fn) {
44
+ this.onChange = fn;
45
+ }
46
+ registerOnTouched(fn) {
47
+ this.onTouched = fn;
48
+ }
49
+ // End ControlValueAccesor methods.
50
+ // froalaEditor directive as input: store the editor options
51
+ set froalaEditor(opts) {
52
+ this._opts = this.clone(opts || this._opts);
53
+ this._opts = { ...this._opts };
54
+ }
55
+ // TODO: replace clone method with better possible alternate
56
+ clone(item) {
57
+ const me = this;
58
+ if (!item) {
59
+ return item;
60
+ } // null, undefined values check
61
+ let types = [Number, String, Boolean], result;
62
+ // normalizing primitives if someone did new String('aaa'), or new Number('444');
63
+ types.forEach(function (type) {
64
+ if (item instanceof type) {
65
+ result = type(item);
66
+ }
67
+ });
68
+ if (typeof result == "undefined") {
69
+ if (Object.prototype.toString.call(item) === "[object Array]") {
70
+ result = [];
71
+ item.forEach(function (child, index, array) {
72
+ result[index] = me.clone(child);
73
+ });
74
+ }
75
+ else if (typeof item == "object") {
76
+ // testing that this is DOM
77
+ if (item.nodeType && typeof item.cloneNode == "function") {
78
+ result = item.cloneNode(true);
79
+ }
80
+ else if (!item.prototype) { // check that this is a literal
81
+ if (item instanceof Date) {
82
+ result = new Date(item);
83
+ }
84
+ else {
85
+ // it is an object literal
86
+ result = {};
87
+ for (var i in item) {
88
+ result[i] = me.clone(item[i]);
89
+ }
90
+ }
91
+ }
92
+ else {
93
+ if (false && item.constructor) {
94
+ result = new item.constructor();
95
+ }
96
+ else {
97
+ result = item;
98
+ }
99
+ }
100
+ }
101
+ else {
102
+ result = item;
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ // froalaModel directive as input: store initial editor content
108
+ set froalaModel(content) {
109
+ this.updateEditor(content);
110
+ }
111
+ stringify(obj) {
112
+ let cache = [];
113
+ let str = JSON.stringify(obj, function (key, value) {
114
+ if (typeof value === "object" && value !== null) {
115
+ if (cache.indexOf(value) !== -1) {
116
+ // Circular reference found, discard key
117
+ return;
118
+ }
119
+ // Store value in our collection
120
+ cache.push(value);
121
+ }
122
+ return value;
123
+ });
124
+ cache = null; // reset the cache
125
+ return str;
126
+ }
127
+ // Update editor with model contents.
128
+ updateEditor(content) {
129
+ if (this.stringify(this._oldModel) == this.stringify(content)) {
130
+ return;
131
+ }
132
+ if (!this._hasSpecialTag) {
133
+ this._oldModel = content;
134
+ }
135
+ else {
136
+ this._model = content;
137
+ }
138
+ if (this._editorInitialized) {
139
+ if (!this._hasSpecialTag) {
140
+ this._editor.html.set(content);
141
+ }
142
+ else {
143
+ this.setContent();
144
+ }
145
+ }
146
+ else {
147
+ if (!this._hasSpecialTag) {
148
+ this._element.innerHTML = content || '';
149
+ }
150
+ else {
151
+ this.setContent();
152
+ }
153
+ }
154
+ }
155
+ // update model if editor contentChanged
156
+ updateModel() {
157
+ this.zone.run(() => {
158
+ let modelContent = null;
159
+ if (this._hasSpecialTag) {
160
+ let attributeNodes = this._element.attributes;
161
+ let attrs = {};
162
+ for (let i = 0; i < attributeNodes.length; i++) {
163
+ let attrName = attributeNodes[i].name;
164
+ if (this._opts.angularIgnoreAttrs && this._opts.angularIgnoreAttrs.indexOf(attrName) != -1) {
165
+ continue;
166
+ }
167
+ attrs[attrName] = attributeNodes[i].value;
168
+ }
169
+ if (this._element.innerHTML) {
170
+ attrs[this.INNER_HTML_ATTR] = this._element.innerHTML;
171
+ }
172
+ modelContent = attrs;
173
+ }
174
+ else {
175
+ let returnedHtml = this._editor.html.get();
176
+ if (typeof returnedHtml === 'string') {
177
+ modelContent = returnedHtml;
178
+ }
179
+ }
180
+ if (this._oldModel !== modelContent) {
181
+ this._oldModel = modelContent;
182
+ // Update froalaModel.
183
+ this.froalaModelChange.emit(modelContent);
184
+ // Update form model.
185
+ this.onChange(modelContent);
186
+ }
187
+ });
188
+ }
189
+ registerEvent(eventName, callback) {
190
+ if (!eventName || !callback) {
191
+ return;
192
+ }
193
+ if (!this._opts.events) {
194
+ this._opts.events = {};
195
+ }
196
+ this._opts.events[eventName] = callback;
197
+ }
198
+ initListeners() {
199
+ let self = this;
200
+ // Check if we have events on the editor.
201
+ if (this._editor.events) {
202
+ // bind contentChange and keyup event to froalaModel
203
+ this._editor.events.on('contentChanged', function () {
204
+ self.updateModel();
205
+ });
206
+ this._editor.events.on('mousedown', function () {
207
+ setTimeout(function () {
208
+ self.onTouched();
209
+ }, 0);
210
+ });
211
+ if (this._opts.immediateAngularModelUpdate) {
212
+ this._editor.events.on('keyup', function () {
213
+ setTimeout(function () {
214
+ self.updateModel();
215
+ }, 0);
216
+ });
217
+ }
218
+ }
219
+ this._editorInitialized = true;
220
+ }
221
+ createEditor() {
222
+ if (this._editorInitialized) {
223
+ return;
224
+ }
225
+ this.setContent(true);
226
+ // init editor
227
+ this.zone.runOutsideAngular(() => {
228
+ // Add listeners on initialized event.
229
+ if (!this._opts.events)
230
+ this._opts.events = {};
231
+ // Register initialized event.
232
+ this.registerEvent('initialized', this._opts.events && this._opts.events.initialized);
233
+ const existingInitCallback = this._opts.events.initialized;
234
+ // Default initialized event.
235
+ if (!this._opts.events.initialized || !this._opts.events.initialized.overridden) {
236
+ this._opts.events.initialized = () => {
237
+ this.initListeners();
238
+ existingInitCallback && existingInitCallback.call(this._editor, this);
239
+ };
240
+ this._opts.events.initialized.overridden = true;
241
+ }
242
+ // Initialize the Froala Editor.
243
+ this._editor = new FroalaEditor(this._element, this._opts);
244
+ });
245
+ }
246
+ setHtml() {
247
+ this._editor.html.set(this._model || "");
248
+ // This will reset the undo stack everytime the model changes externally. Can we fix this?
249
+ this._editor.undo.reset();
250
+ this._editor.undo.saveStep();
251
+ }
252
+ setContent(firstTime = false) {
253
+ let self = this;
254
+ // Set initial content
255
+ if (this._model || this._model == '') {
256
+ this._oldModel = this._model;
257
+ if (this._hasSpecialTag) {
258
+ let tags = this._model;
259
+ // add tags on element
260
+ if (tags) {
261
+ for (let attr in tags) {
262
+ if (tags.hasOwnProperty(attr) && attr != this.INNER_HTML_ATTR) {
263
+ this._element.setAttribute(attr, tags[attr]);
264
+ }
265
+ }
266
+ if (tags.hasOwnProperty(this.INNER_HTML_ATTR)) {
267
+ this._element.innerHTML = tags[this.INNER_HTML_ATTR];
268
+ }
269
+ }
270
+ }
271
+ else {
272
+ if (firstTime) {
273
+ this.registerEvent('initialized', function () {
274
+ self.setHtml();
275
+ });
276
+ }
277
+ else {
278
+ self.setHtml();
279
+ }
280
+ }
281
+ }
282
+ }
283
+ destroyEditor() {
284
+ if (this._editorInitialized) {
285
+ this._editor.destroy();
286
+ this._editorInitialized = false;
287
+ }
288
+ }
289
+ getEditor() {
290
+ if (this._element) {
291
+ return this._editor;
292
+ }
293
+ return null;
294
+ }
295
+ // send manual editor initialization
296
+ generateManualController() {
297
+ let controls = {
298
+ initialize: this.createEditor.bind(this),
299
+ destroy: this.destroyEditor.bind(this),
300
+ getEditor: this.getEditor.bind(this),
301
+ };
302
+ this.froalaInit.emit(controls);
303
+ }
304
+ // TODO not sure if ngOnInit is executed after @inputs
305
+ ngAfterViewInit() {
306
+ // check if output froalaInit is present. Maybe observers is private and should not be used?? TODO how to better test that an output directive is present.
307
+ this.setup();
308
+ }
309
+ setup() {
310
+ if (this.initialized) {
311
+ return;
312
+ }
313
+ this.initialized = true;
314
+ if (!this.froalaInit.observers.length) {
315
+ this.createEditor();
316
+ }
317
+ else {
318
+ this.generateManualController();
319
+ }
320
+ }
321
+ ngOnDestroy() {
322
+ this.destroyEditor();
323
+ }
324
+ setDisabledState(isDisabled) {
325
+ }
326
+ }
327
+ /** @nocollapse */ FroalaEditorDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaEditorDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
328
+ /** @nocollapse */ FroalaEditorDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: FroalaEditorDirective, selector: "[froalaEditor]", inputs: { froalaEditor: "froalaEditor", froalaModel: "froalaModel" }, outputs: { froalaModelChange: "froalaModelChange", froalaInit: "froalaInit" }, providers: [
329
+ {
330
+ provide: NG_VALUE_ACCESSOR,
331
+ useExisting: forwardRef((() => FroalaEditorDirective)),
332
+ multi: true
333
+ }
334
+ ], exportAs: ["froalaEditor"], ngImport: i0 });
335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaEditorDirective, decorators: [{
336
+ type: Directive,
337
+ args: [{
338
+ selector: '[froalaEditor]',
339
+ exportAs: 'froalaEditor',
340
+ providers: [
341
+ {
342
+ provide: NG_VALUE_ACCESSOR,
343
+ useExisting: forwardRef((() => FroalaEditorDirective)),
344
+ multi: true
345
+ }
346
+ ]
347
+ }]
348
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { froalaEditor: [{
349
+ type: Input
350
+ }], froalaModel: [{
351
+ type: Input
352
+ }], froalaModelChange: [{
353
+ type: Output
354
+ }], froalaInit: [{
355
+ type: Output
356
+ }] } });
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2xpYnJhcnkvc3JjL2VkaXRvci9lZGl0b3IuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sWUFBWSxNQUFNLGVBQWUsQ0FBQzs7QUFhekMsTUFBTSxPQUFPLHFCQUFxQjtJQXdCaEMsWUFBWSxFQUFjLEVBQVUsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUF0QmhELGlCQUFpQjtRQUNULFVBQUssR0FBUTtZQUNuQiwyQkFBMkIsRUFBRSxLQUFLO1lBQ2xDLGtCQUFrQixFQUFFLElBQUk7U0FDekIsQ0FBQztRQUlNLGlCQUFZLEdBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6RCxvQkFBZSxHQUFXLFdBQVcsQ0FBQztRQUN0QyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQVFoQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFFcEMsY0FBUyxHQUFXLElBQUksQ0FBQztRQWVqQyxxQ0FBcUM7UUFDckMsYUFBUSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUU7UUFDdEIsQ0FBQyxDQUFDO1FBQ0YsY0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNqQixDQUFDLENBQUM7UUEySEYseUVBQXlFO1FBQy9ELHNCQUFpQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXpFLG9FQUFvRTtRQUMxRCxlQUFVLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFnTWhFLGdCQUFXLEdBQUcsS0FBSyxDQUFD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RUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtJQUNwQyxDQUFDOztxSUExWFUscUJBQXFCO3lIQUFyQixxQkFBcUIsOExBUnJCO1FBQ1Q7WUFDRSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLEVBQUM7WUFDcEQsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGOzJGQUVVLHFCQUFxQjtrQkFYakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixRQUFRLEVBQUUsY0FBYztvQkFDeEIsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLEVBQUMsR0FBRyxFQUFFLHNCQUFzQixFQUFDOzRCQUNwRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjtzSEErRGMsWUFBWTtzQkFBeEIsS0FBSztnQkFzRE8sV0FBVztzQkFBdkIsS0FBSztnQkFpREksaUJBQWlCO3NCQUExQixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgTmdab25lLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IEZyb2FsYUVkaXRvciBmcm9tICdmcm9hbGEtZWRpdG9yJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Zyb2FsYUVkaXRvcl0nLFxuICBleHBvcnRBczogJ2Zyb2FsYUVkaXRvcicsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRnJvYWxhRWRpdG9yRGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZyb2FsYUVkaXRvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICAvLyBlZGl0b3Igb3B0aW9uc1xuICBwcml2YXRlIF9vcHRzOiBhbnkgPSB7XG4gICAgaW1tZWRpYXRlQW5ndWxhck1vZGVsVXBkYXRlOiBmYWxzZSxcbiAgICBhbmd1bGFySWdub3JlQXR0cnM6IG51bGxcbiAgfTtcblxuICBwcml2YXRlIF9lbGVtZW50OiBhbnk7XG5cbiAgcHJpdmF0ZSBTUEVDSUFMX1RBR1M6IHN0cmluZ1tdID0gWydpbWcnLCAnYnV0dG9uJywgJ2lucHV0JywgJ2EnXTtcbiAgcHJpdmF0ZSBJTk5FUl9IVE1MX0FUVFI6IHN0cmluZyA9ICdpbm5lckhUTUwnO1xuICBwcml2YXRlIF9oYXNTcGVjaWFsVGFnOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gZWRpdG9yIGVsZW1lbnRcbiAgcHJpdmF0ZSBfZWRpdG9yOiBhbnk7XG5cbiAgLy8gaW5pdGlhbCBlZGl0b3IgY29udGVudFxuICBwcml2YXRlIF9tb2RlbDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2VkaXRvckluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfb2xkTW9kZWw6IHN0cmluZyA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7XG5cbiAgICBsZXQgZWxlbWVudDogYW55ID0gZWwubmF0aXZlRWxlbWVudDtcblxuICAgIC8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGEgc3BlY2lhbCB0YWdcbiAgICBpZiAodGhpcy5TUEVDSUFMX1RBR1MuaW5kZXhPZihlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcbiAgICAgIHRoaXMuX2hhc1NwZWNpYWxUYWcgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gIH1cblxuICAvLyBCZWdpbiBDb250cm9sVmFsdWVBY2Nlc29yIG1ldGhvZHMuXG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge1xuICB9O1xuICBvblRvdWNoZWQgPSAoKSA9PiB7XG4gIH07XG5cbiAgLy8gRm9ybSBtb2RlbCBjb250ZW50IGNoYW5nZWQuXG4gIHdyaXRlVmFsdWUoY29udGVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVFZGl0b3IoY29udGVudCk7XG4gICAgaWYoY29udGVudCl7XG4gICAgICB0aGlzLnNldHVwKCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8vIEVuZCBDb250cm9sVmFsdWVBY2Nlc29yIG1ldGhvZHMuXG5cbiAgLy8gZnJvYWxhRWRpdG9yIGRpcmVjdGl2ZSBhcyBpbnB1dDogc3RvcmUgdGhlIGVkaXRvciBvcHRpb25zXG4gIEBJbnB1dCgpIHNldCBmcm9hbGFFZGl0b3Iob3B0czogYW55KSB7XG4gICAgdGhpcy5fb3B0cyA9IHRoaXMuY2xvbmUoICBvcHRzIHx8IHRoaXMuX29wdHMpO1xuICAgIHRoaXMuX29wdHMgPSAgey4uLnRoaXMuX29wdHN9O1xuICB9XG5cbiAgIC8vIFRPRE86IHJlcGxhY2UgY2xvbmUgbWV0aG9kIHdpdGggYmV0dGVyIHBvc3NpYmxlIGFsdGVybmF0ZSBcbiAgcHJpdmF0ZSBjbG9uZShpdGVtKSB7XG4gIFx0Y29uc3QgbWUgPSB0aGlzOyAgXG4gICAgICBpZiAoIWl0ZW0pIHsgcmV0dXJuIGl0ZW07IH0gLy8gbnVsbCwgdW5kZWZpbmVkIHZhbHVlcyBjaGVja1xuXG4gICAgICBsZXQgdHlwZXMgPSBbIE51bWJlciwgU3RyaW5nLCBCb29sZWFuIF0sIFxuICAgICAgICAgIHJlc3VsdDtcblxuICAgICAgLy8gbm9ybWFsaXppbmcgcHJpbWl0aXZlcyBpZiBzb21lb25lIGRpZCBuZXcgU3RyaW5nKCdhYWEnKSwgb3IgbmV3IE51bWJlcignNDQ0Jyk7XG4gICAgICB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIHR5cGUpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdHlwZSggaXRlbSApO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCggaXRlbSApID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgIGl0ZW0uZm9yRWFjaChmdW5jdGlvbihjaGlsZCwgaW5kZXgsIGFycmF5KSB7IFxuICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1lLmNsb25lKCBjaGlsZCApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgLy8gdGVzdGluZyB0aGF0IHRoaXMgaXMgRE9NXG4gICAgICAgICAgICAgIGlmIChpdGVtLm5vZGVUeXBlICYmIHR5cGVvZiBpdGVtLmNsb25lTm9kZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW0uY2xvbmVOb2RlKCB0cnVlICk7ICAgIFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpdGVtLnByb3RvdHlwZSkgeyAvLyBjaGVjayB0aGF0IHRoaXMgaXMgYSBsaXRlcmFsXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgRGF0ZShpdGVtKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaXMgYW4gb2JqZWN0IGxpdGVyYWxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gbWUuY2xvbmUoIGl0ZW1baV0gKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmFsc2UgJiYgaXRlbS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBpdGVtLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBpdGVtO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gZnJvYWxhTW9kZWwgZGlyZWN0aXZlIGFzIGlucHV0OiBzdG9yZSBpbml0aWFsIGVkaXRvciBjb250ZW50XG4gIEBJbnB1dCgpIHNldCBmcm9hbGFNb2RlbChjb250ZW50OiBhbnkpIHtcbiAgICB0aGlzLnVwZGF0ZUVkaXRvcihjb250ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RyaW5naWZ5KG9iaikge1xuICAgIGxldCBjYWNoZSA9IFtdO1xuICAgIGxldCBzdHIgPSBKU09OLnN0cmluZ2lmeShvYmosIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGNhY2hlLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgIC8vIENpcmN1bGFyIHJlZmVyZW5jZSBmb3VuZCwgZGlzY2FyZCBrZXlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RvcmUgdmFsdWUgaW4gb3VyIGNvbGxlY3Rpb25cbiAgICAgICAgY2FjaGUucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgY2FjaGUgPSBudWxsOyAvLyByZXNldCB0aGUgY2FjaGVcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIFxuICAgIC8vIFVwZGF0ZSBlZGl0b3Igd2l0aCBtb2RlbCBjb250ZW50cy5cbiAgICBwcml2YXRlIHVwZGF0ZUVkaXRvcihjb250ZW50OiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnN0cmluZ2lmeSh0aGlzLl9vbGRNb2RlbCkgPT0gdGhpcy5zdHJpbmdpZnkoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICBcbiAgICBpZiAoIXRoaXMuX2hhc1NwZWNpYWxUYWcpIHtcbiAgICAgIHRoaXMuX29sZE1vZGVsID0gY29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbW9kZWwgPSBjb250ZW50O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9lZGl0b3JJbml0aWFsaXplZCkge1xuICAgICAgaWYgKCF0aGlzLl9oYXNTcGVjaWFsVGFnKSB7XG4gICAgICAgIHRoaXMuX2VkaXRvci5odG1sLnNldChjb250ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0Q29udGVudCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuX2hhc1NwZWNpYWxUYWcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50IHx8ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZnJvYWxhTW9kZWwgZGlyZWN0aXZlIGFzIG91dHB1dDogdXBkYXRlIG1vZGVsIGlmIGVkaXRvciBjb250ZW50Q2hhbmdlZFxuICBAT3V0cHV0KCkgZnJvYWxhTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8gZnJvYWxhSW5pdCBkaXJlY3RpdmUgYXMgb3V0cHV0OiBzZW5kIG1hbnVhbCBlZGl0b3IgaW5pdGlhbGl6YXRpb25cbiAgQE91dHB1dCgpIGZyb2FsYUluaXQ6IEV2ZW50RW1pdHRlcjxPYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxPYmplY3Q+KCk7XG5cbiAgLy8gdXBkYXRlIG1vZGVsIGlmIGVkaXRvciBjb250ZW50Q2hhbmdlZFxuICBwcml2YXRlIHVwZGF0ZU1vZGVsKCkge1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuXG4gICAgICBsZXQgbW9kZWxDb250ZW50OiBhbnkgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5faGFzU3BlY2lhbFRhZykge1xuXG4gICAgICAgIGxldCBhdHRyaWJ1dGVOb2RlcyA9IHRoaXMuX2VsZW1lbnQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGF0dHJzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVOb2Rlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXR0cmlidXRlTm9kZXNbaV0ubmFtZTtcbiAgICAgICAgICBpZiAodGhpcy5fb3B0cy5hbmd1bGFySWdub3JlQXR0cnMgJiYgdGhpcy5fb3B0cy5hbmd1bGFySWdub3JlQXR0cnMuaW5kZXhPZihhdHRyTmFtZSkgIT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF0dHJzW2F0dHJOYW1lXSA9IGF0dHJpYnV0ZU5vZGVzW2ldLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuaW5uZXJIVE1MKSB7XG4gICAgICAgICAgYXR0cnNbdGhpcy5JTk5FUl9IVE1MX0FUVFJdID0gdGhpcy5fZWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIH1cblxuICAgICAgICBtb2RlbENvbnRlbnQgPSBhdHRycztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbGV0IHJldHVybmVkSHRtbDogYW55ID0gdGhpcy5fZWRpdG9yLmh0bWwuZ2V0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0dXJuZWRIdG1sID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG1vZGVsQ29udGVudCA9IHJldHVybmVkSHRtbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX29sZE1vZGVsICE9PSBtb2RlbENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fb2xkTW9kZWwgPSBtb2RlbENvbnRlbnQ7XG5cbiAgICAgICAgLy8gVXBkYXRlIGZyb2FsYU1vZGVsLlxuICAgICAgICB0aGlzLmZyb2FsYU1vZGVsQ2hhbmdlLmVtaXQobW9kZWxDb250ZW50KTtcblxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBtb2RlbC5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbENvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJFdmVudChldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFldmVudE5hbWUgfHwgIWNhbGxiYWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vcHRzLmV2ZW50cykge1xuICAgICAgdGhpcy5fb3B0cy5ldmVudHMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLl9vcHRzLmV2ZW50c1tldmVudE5hbWVdID0gY2FsbGJhY2s7XG4gIH1cblxuICBwcml2YXRlIGluaXRMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgZXZlbnRzIG9uIHRoZSBlZGl0b3IuXG4gICAgaWYgKHRoaXMuX2VkaXRvci5ldmVudHMpIHtcbiAgICAgIC8vIGJpbmQgY29udGVudENoYW5nZSBhbmQga2V5dXAgZXZlbnQgdG8gZnJvYWxhTW9kZWxcbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2NvbnRlbnRDaGFuZ2VkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnVwZGF0ZU1vZGVsKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ21vdXNlZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5vblRvdWNoZWQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuX29wdHMuaW1tZWRpYXRlQW5ndWxhck1vZGVsVXBkYXRlKSB7XG4gICAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2tleXVwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi51cGRhdGVNb2RlbCgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9lZGl0b3JJbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVkaXRvcigpIHtcbiAgICBpZiAodGhpcy5fZWRpdG9ySW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldENvbnRlbnQodHJ1ZSk7XG5cbiAgICAvLyBpbml0IGVkaXRvclxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAvLyBBZGQgbGlzdGVuZXJzIG9uIGluaXRpYWxpemVkIGV2ZW50LlxuICAgICAgaWYgKCF0aGlzLl9vcHRzLmV2ZW50cykgdGhpcy5fb3B0cy5ldmVudHMgPSB7fTtcblxuICAgICAgLy8gUmVnaXN0ZXIgaW5pdGlhbGl6ZWQgZXZlbnQuXG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoJ2luaXRpYWxpemVkJywgdGhpcy5fb3B0cy5ldmVudHMgJiYgdGhpcy5fb3B0cy5ldmVudHMuaW5pdGlhbGl6ZWQpO1xuICAgICAgY29uc3QgZXhpc3RpbmdJbml0Q2FsbGJhY2sgPSB0aGlzLl9vcHRzLmV2ZW50cy5pbml0aWFsaXplZDtcbiAgICAgIC8vIERlZmF1bHQgaW5pdGlhbGl6ZWQgZXZlbnQuXG4gICAgICBpZiAoIXRoaXMuX29wdHMuZXZlbnRzLmluaXRpYWxpemVkIHx8ICF0aGlzLl9vcHRzLmV2ZW50cy5pbml0aWFsaXplZC5vdmVycmlkZGVuKSB7XG4gICAgICAgIHRoaXMuX29wdHMuZXZlbnRzLmluaXRpYWxpemVkID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5pdExpc3RlbmVycygpO1xuICAgICAgICAgIGV4aXN0aW5nSW5pdENhbGxiYWNrICYmIGV4aXN0aW5nSW5pdENhbGxiYWNrLmNhbGwodGhpcy5fZWRpdG9yLCB0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fb3B0cy5ldmVudHMuaW5pdGlhbGl6ZWQub3ZlcnJpZGRlbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIEZyb2FsYSBFZGl0b3IuXG4gICAgICB0aGlzLl9lZGl0b3IgPSBuZXcgRnJvYWxhRWRpdG9yKFxuICAgICAgICB0aGlzLl9lbGVtZW50LFxuICAgICAgICB0aGlzLl9vcHRzXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIdG1sKCkge1xuICAgIHRoaXMuX2VkaXRvci5odG1sLnNldCh0aGlzLl9tb2RlbCB8fCBcIlwiKTtcblxuICAgIC8vIFRoaXMgd2lsbCByZXNldCB0aGUgdW5kbyBzdGFjayBldmVyeXRpbWUgdGhlIG1vZGVsIGNoYW5nZXMgZXh0ZXJuYWxseS4gQ2FuIHdlIGZpeCB0aGlzP1xuICAgIHRoaXMuX2VkaXRvci51bmRvLnJlc2V0KCk7XG4gICAgdGhpcy5fZWRpdG9yLnVuZG8uc2F2ZVN0ZXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29udGVudChmaXJzdFRpbWUgPSBmYWxzZSkge1xuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIC8vIFNldCBpbml0aWFsIGNvbnRlbnRcbiAgICBpZiAodGhpcy5fbW9kZWwgfHwgdGhpcy5fbW9kZWwgPT0gJycpIHtcbiAgICAgIHRoaXMuX29sZE1vZGVsID0gdGhpcy5fbW9kZWw7XG4gICAgICBpZiAodGhpcy5faGFzU3BlY2lhbFRhZykge1xuXG4gICAgICAgIGxldCB0YWdzOiBPYmplY3QgPSB0aGlzLl9tb2RlbDtcblxuICAgICAgICAvLyBhZGQgdGFncyBvbiBlbGVtZW50XG4gICAgICAgIGlmICh0YWdzKSB7XG5cbiAgICAgICAgICBmb3IgKGxldCBhdHRyIGluIHRhZ3MpIHtcbiAgICAgICAgICAgIGlmICh0YWdzLmhhc093blByb3BlcnR5KGF0dHIpICYmIGF0dHIgIT0gdGhpcy5JTk5FUl9IVE1MX0FUVFIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgdGFnc1thdHRyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRhZ3MuaGFzT3duUHJvcGVydHkodGhpcy5JTk5FUl9IVE1MX0FUVFIpKSB7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmlubmVySFRNTCA9IHRhZ3NbdGhpcy5JTk5FUl9IVE1MX0FUVFJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCgnaW5pdGlhbGl6ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnNldEh0bWwoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLnNldEh0bWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveUVkaXRvcigpIHtcbiAgICBpZiAodGhpcy5fZWRpdG9ySW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX2VkaXRvci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9lZGl0b3JJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWRpdG9yKCkge1xuICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gc2VuZCBtYW51YWwgZWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIHByaXZhdGUgZ2VuZXJhdGVNYW51YWxDb250cm9sbGVyKCkge1xuICAgIGxldCBjb250cm9scyA9IHtcbiAgICAgIGluaXRpYWxpemU6IHRoaXMuY3JlYXRlRWRpdG9yLmJpbmQodGhpcyksXG4gICAgICBkZXN0cm95OiB0aGlzLmRlc3Ryb3lFZGl0b3IuYmluZCh0aGlzKSxcbiAgICAgIGdldEVkaXRvcjogdGhpcy5nZXRFZGl0b3IuYmluZCh0aGlzKSxcbiAgICB9O1xuICAgIHRoaXMuZnJvYWxhSW5pdC5lbWl0KGNvbnRyb2xzKTtcbiAgfVxuXG4gIC8vIFRPRE8gbm90IHN1cmUgaWYgbmdPbkluaXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgQGlucHV0c1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gY2hlY2sgaWYgb3V0cHV0IGZyb2FsYUluaXQgaXMgcHJlc2VudC4gTWF5YmUgb2JzZXJ2ZXJzIGlzIHByaXZhdGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZD8/IFRPRE8gaG93IHRvIGJldHRlciB0ZXN0IHRoYXQgYW4gb3V0cHV0IGRpcmVjdGl2ZSBpcyBwcmVzZW50LlxuICAgIHRoaXMuc2V0dXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzZXR1cCgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZnJvYWxhSW5pdC5vYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNyZWF0ZUVkaXRvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdlbmVyYXRlTWFudWFsQ29udHJvbGxlcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUVkaXRvcigpO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { FroalaEditorDirective } from './editor.directive';
3
+ import * as i0 from "@angular/core";
4
+ export class FroalaEditorModule {
5
+ static forRoot() {
6
+ return { ngModule: FroalaEditorModule, providers: [] };
7
+ }
8
+ }
9
+ /** @nocollapse */ FroalaEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ /** @nocollapse */ FroalaEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FroalaEditorModule, declarations: [FroalaEditorDirective], exports: [FroalaEditorDirective] });
11
+ /** @nocollapse */ FroalaEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaEditorModule });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaEditorModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ declarations: [FroalaEditorDirective],
16
+ exports: [FroalaEditorDirective]
17
+ }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2xpYnJhcnkvc3JjL2VkaXRvci9lZGl0b3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQU8zRCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3RCLE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU8sRUFBQyxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3ZELENBQUM7O2tJQUhVLGtCQUFrQjttSUFBbEIsa0JBQWtCLGlCQUpkLHFCQUFxQixhQUMxQixxQkFBcUI7bUlBR3BCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUw5QixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNyQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGcm9hbGFFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuL2VkaXRvci5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtGcm9hbGFFZGl0b3JEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbRnJvYWxhRWRpdG9yRGlyZWN0aXZlXVxufSlcblxuZXhwb3J0IGNsYXNzIEZyb2FsYUVkaXRvck1vZHVsZSB7XG4gIHB1YmxpYyBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPEZyb2FsYUVkaXRvck1vZHVsZT4ge1xuICAgIHJldHVybiB7bmdNb2R1bGU6IEZyb2FsYUVkaXRvck1vZHVsZSwgcHJvdmlkZXJzOiBbXX07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { FroalaEditorModule } from './editor/editor.module';
3
+ import { FroalaViewModule } from './view/view.module';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./editor/editor.module";
6
+ import * as i2 from "./view/view.module";
7
+ export class FERootModule {
8
+ }
9
+ /** @nocollapse */ FERootModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FERootModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ /** @nocollapse */ FERootModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FERootModule, imports: [i1.FroalaEditorModule, i2.FroalaViewModule], exports: [FroalaEditorModule,
11
+ FroalaViewModule] });
12
+ /** @nocollapse */ FERootModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FERootModule, imports: [FroalaEditorModule.forRoot(),
13
+ FroalaViewModule.forRoot(), FroalaEditorModule,
14
+ FroalaViewModule] });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FERootModule, decorators: [{
16
+ type: NgModule,
17
+ args: [{
18
+ imports: [
19
+ FroalaEditorModule.forRoot(),
20
+ FroalaViewModule.forRoot()
21
+ ],
22
+ exports: [
23
+ FroalaEditorModule,
24
+ FroalaViewModule
25
+ ]
26
+ }]
27
+ }] });
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmUtcm9vdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wcm9qZWN0cy9saWJyYXJ5L3NyYy9mZS1yb290Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7O0FBWXRELE1BQU0sT0FBTyxZQUFZOzs0SEFBWixZQUFZOzZIQUFaLFlBQVksbUVBSnJCLGtCQUFrQjtRQUNsQixnQkFBZ0I7NkhBR1AsWUFBWSxZQVJyQixrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7UUFDNUIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBRzFCLGtCQUFrQjtRQUNsQixnQkFBZ0I7MkZBR1AsWUFBWTtrQkFWeEIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1Asa0JBQWtCLENBQUMsT0FBTyxFQUFFO3dCQUM1QixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7cUJBQzNCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxrQkFBa0I7d0JBQ2xCLGdCQUFnQjtxQkFDakI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJvYWxhRWRpdG9yTW9kdWxlIH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLm1vZHVsZSc7XG5pbXBvcnQgeyBGcm9hbGFWaWV3TW9kdWxlIH0gZnJvbSAnLi92aWV3L3ZpZXcubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIEZyb2FsYUVkaXRvck1vZHVsZS5mb3JSb290KCksXG4gICAgRnJvYWxhVmlld01vZHVsZS5mb3JSb290KClcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEZyb2FsYUVkaXRvck1vZHVsZSxcbiAgICBGcm9hbGFWaWV3TW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRkVSb290TW9kdWxlIHtcblxufVxuIl19
@@ -0,0 +1,26 @@
1
+ import { Directive, ElementRef, Renderer2, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class FroalaViewDirective {
4
+ constructor(renderer, element) {
5
+ this.renderer = renderer;
6
+ this._element = element.nativeElement;
7
+ }
8
+ // update content model as it comes
9
+ set froalaView(content) {
10
+ this._element.innerHTML = content;
11
+ }
12
+ ngAfterViewInit() {
13
+ this.renderer.addClass(this._element, "fr-view");
14
+ }
15
+ }
16
+ /** @nocollapse */ FroalaViewDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaViewDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
17
+ /** @nocollapse */ FroalaViewDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: FroalaViewDirective, selector: "[froalaView]", inputs: { froalaView: "froalaView" }, ngImport: i0 });
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaViewDirective, decorators: [{
19
+ type: Directive,
20
+ args: [{
21
+ selector: '[froalaView]'
22
+ }]
23
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { froalaView: [{
24
+ type: Input
25
+ }] } });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9saWJyYXJ5L3NyYy92aWV3L3ZpZXcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBS3hFLE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBb0IsUUFBbUIsRUFBRSxPQUFtQjtRQUF4QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLElBQWEsVUFBVSxDQUFDLE9BQWU7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDOzttSUFmVSxtQkFBbUI7dUhBQW5CLG1CQUFtQjsyRkFBbkIsbUJBQW1CO2tCQUgvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO2lCQUN6Qjt5SEFVYyxVQUFVO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmcm9hbGFWaWV3XSdcbn0pXG5leHBvcnQgY2xhc3MgRnJvYWxhVmlld0RpcmVjdGl2ZSB7XG5cbiAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBjb250ZW50IG1vZGVsIGFzIGl0IGNvbWVzXG4gIEBJbnB1dCgpIHNldCBmcm9hbGFWaWV3KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHRoaXMuX2VsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudDtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuX2VsZW1lbnQsIFwiZnItdmlld1wiKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,19 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { FroalaViewDirective } from './view.directive';
3
+ import * as i0 from "@angular/core";
4
+ export class FroalaViewModule {
5
+ static forRoot() {
6
+ return { ngModule: FroalaViewModule, providers: [] };
7
+ }
8
+ }
9
+ /** @nocollapse */ FroalaViewModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ /** @nocollapse */ FroalaViewModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FroalaViewModule, declarations: [FroalaViewDirective], exports: [FroalaViewDirective] });
11
+ /** @nocollapse */ FroalaViewModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaViewModule });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FroalaViewModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ declarations: [FroalaViewDirective],
16
+ exports: [FroalaViewDirective]
17
+ }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9saWJyYXJ5L3NyYy92aWV3L3ZpZXcubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQU12RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3BCLE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU8sRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3JELENBQUM7O2dJQUhVLGdCQUFnQjtpSUFBaEIsZ0JBQWdCLGlCQUhaLG1CQUFtQixhQUN4QixtQkFBbUI7aUlBRWxCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUo1QixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLG1CQUFtQixDQUFDO29CQUNuQyxPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDL0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGcm9hbGFWaWV3RGlyZWN0aXZlIH0gZnJvbSAnLi92aWV3LmRpcmVjdGl2ZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW0Zyb2FsYVZpZXdEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbRnJvYWxhVmlld0RpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgRnJvYWxhVmlld01vZHVsZSB7XG4gIHB1YmxpYyBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPEZyb2FsYVZpZXdNb2R1bGU+IHtcbiAgICByZXR1cm4ge25nTW9kdWxlOiBGcm9hbGFWaWV3TW9kdWxlLCBwcm92aWRlcnM6IFtdfTtcbiAgfVxufVxuIl19
@@ -1,2 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./editor/editor.module";
3
+ import * as i2 from "./view/view.module";
1
4
  export declare class FERootModule {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<FERootModule, never>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<FERootModule, never, [typeof i1.FroalaEditorModule, typeof i2.FroalaViewModule], [typeof i1.FroalaEditorModule, typeof i2.FroalaViewModule]>;
7
+ static ɵinj: i0.ɵɵInjectorDeclaration<FERootModule>;
2
8
  }