@covalent/code-editor 4.0.0 → 4.1.0-develop.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -37
- package/covalent-code-editor.d.ts +2 -1
- package/esm2020/covalent-code-editor.mjs +5 -0
- package/esm2020/lib/code-editor.component.mjs +363 -0
- package/esm2020/lib/code-editor.module.mjs +19 -0
- package/esm2020/public_api.mjs +3 -0
- package/fesm2015/covalent-code-editor.mjs +384 -0
- package/fesm2015/covalent-code-editor.mjs.map +1 -0
- package/fesm2020/covalent-code-editor.mjs +384 -0
- package/fesm2020/covalent-code-editor.mjs.map +1 -0
- package/{code-editor.component.d.ts → lib/code-editor.component.d.ts} +16 -18
- package/lib/code-editor.module.d.ts +8 -0
- package/package.json +35 -22
- package/public_api.d.ts +2 -0
- package/bundles/covalent-code-editor.umd.js +0 -1067
- package/bundles/covalent-code-editor.umd.js.map +0 -1
- package/bundles/covalent-code-editor.umd.min.js +0 -16
- package/bundles/covalent-code-editor.umd.min.js.map +0 -1
- package/code-editor.component.scss +0 -18
- package/code-editor.module.d.ts +0 -2
- package/covalent-code-editor.metadata.json +0 -1
- package/esm2015/code-editor.component.js +0 -674
- package/esm2015/code-editor.module.js +0 -19
- package/esm2015/covalent-code-editor.js +0 -10
- package/esm2015/index.js +0 -7
- package/esm2015/public-api.js +0 -8
- package/fesm2015/covalent-code-editor.js +0 -709
- package/fesm2015/covalent-code-editor.js.map +0 -1
- package/index.d.ts +0 -1
- package/public-api.d.ts +0 -2
|
@@ -1,674 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: code-editor.component.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, forwardRef, NgZone, ChangeDetectorRef, } from '@angular/core';
|
|
7
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
8
|
-
import { Subject } from 'rxjs';
|
|
9
|
-
import { fromEvent, merge, timer } from 'rxjs';
|
|
10
|
-
import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
|
11
|
-
// Use esm version to support shipping subset of languages and features
|
|
12
|
-
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
|
|
13
|
-
/** @type {?} */
|
|
14
|
-
const noop = (/**
|
|
15
|
-
* @return {?}
|
|
16
|
-
*/
|
|
17
|
-
() => {
|
|
18
|
-
// empty method
|
|
19
|
-
});
|
|
20
|
-
const ɵ0 = noop;
|
|
21
|
-
// counter for ids to allow for multiple editors on one page
|
|
22
|
-
/** @type {?} */
|
|
23
|
-
let uniqueCounter = 0;
|
|
24
|
-
export class TdCodeEditorComponent {
|
|
25
|
-
// tslint:disable-next-line:member-ordering
|
|
26
|
-
/**
|
|
27
|
-
* @param {?} zone
|
|
28
|
-
* @param {?} _changeDetectorRef
|
|
29
|
-
* @param {?} _elementRef
|
|
30
|
-
*/
|
|
31
|
-
constructor(zone, _changeDetectorRef, _elementRef) {
|
|
32
|
-
this.zone = zone;
|
|
33
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
34
|
-
this._elementRef = _elementRef;
|
|
35
|
-
this._destroy = new Subject();
|
|
36
|
-
this._widthSubject = new Subject();
|
|
37
|
-
this._heightSubject = new Subject();
|
|
38
|
-
this._editorStyle = 'width:100%;height:100%;border:1px solid grey;';
|
|
39
|
-
this._value = '';
|
|
40
|
-
this._theme = 'vs';
|
|
41
|
-
this._language = 'javascript';
|
|
42
|
-
this._subject = new Subject();
|
|
43
|
-
this._editorInnerContainer = 'editorInnerContainer' + uniqueCounter++;
|
|
44
|
-
this._fromEditor = false;
|
|
45
|
-
this._componentInitialized = false;
|
|
46
|
-
this._editorOptions = {};
|
|
47
|
-
this._isFullScreen = false;
|
|
48
|
-
this._registeredLanguagesStyles = [];
|
|
49
|
-
/**
|
|
50
|
-
* editorInitialized: function($event)
|
|
51
|
-
* Event emitted when editor is first initialized
|
|
52
|
-
*/
|
|
53
|
-
this.editorInitialized = new EventEmitter();
|
|
54
|
-
/**
|
|
55
|
-
* editorConfigurationChanged: function($event)
|
|
56
|
-
* Event emitted when editor's configuration changes
|
|
57
|
-
*/
|
|
58
|
-
this.editorConfigurationChanged = new EventEmitter();
|
|
59
|
-
/**
|
|
60
|
-
* editorLanguageChanged: function($event)
|
|
61
|
-
* Event emitted when editor's Language changes
|
|
62
|
-
*/
|
|
63
|
-
this.editorLanguageChanged = new EventEmitter();
|
|
64
|
-
/**
|
|
65
|
-
* editorValueChange: function($event)
|
|
66
|
-
* Event emitted any time something changes the editor value
|
|
67
|
-
*/
|
|
68
|
-
this.editorValueChange = new EventEmitter();
|
|
69
|
-
/**
|
|
70
|
-
* The change event notifies you about a change happening in an input field.
|
|
71
|
-
* Since the component is not a native Angular component have to specifiy the event emitter ourself
|
|
72
|
-
*/
|
|
73
|
-
this.change = new EventEmitter();
|
|
74
|
-
/* tslint:disable-next-line */
|
|
75
|
-
this.propagateChange = (/**
|
|
76
|
-
* @param {?} _
|
|
77
|
-
* @return {?}
|
|
78
|
-
*/
|
|
79
|
-
(_) => { });
|
|
80
|
-
this.onTouched = (/**
|
|
81
|
-
* @return {?}
|
|
82
|
-
*/
|
|
83
|
-
() => noop);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* value?: string
|
|
87
|
-
* @param {?} value
|
|
88
|
-
* @return {?}
|
|
89
|
-
*/
|
|
90
|
-
set value(value) {
|
|
91
|
-
if (value === this._value) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
this._value = value;
|
|
95
|
-
if (this._componentInitialized) {
|
|
96
|
-
this.applyValue();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* @return {?}
|
|
101
|
-
*/
|
|
102
|
-
get value() {
|
|
103
|
-
return this._value;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* @return {?}
|
|
107
|
-
*/
|
|
108
|
-
applyValue() {
|
|
109
|
-
if (!this._fromEditor) {
|
|
110
|
-
this._editor.setValue(this._value);
|
|
111
|
-
}
|
|
112
|
-
this._fromEditor = false;
|
|
113
|
-
this.propagateChange(this._value);
|
|
114
|
-
this.change.emit();
|
|
115
|
-
this.editorValueChange.emit();
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Implemented as part of ControlValueAccessor.
|
|
119
|
-
* @param {?} value
|
|
120
|
-
* @return {?}
|
|
121
|
-
*/
|
|
122
|
-
writeValue(value) {
|
|
123
|
-
// do not write if null or undefined
|
|
124
|
-
// tslint:disable-next-line
|
|
125
|
-
if (value != undefined) {
|
|
126
|
-
this.value = value;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* @param {?} fn
|
|
131
|
-
* @return {?}
|
|
132
|
-
*/
|
|
133
|
-
registerOnChange(fn) {
|
|
134
|
-
this.propagateChange = fn;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* @param {?} fn
|
|
138
|
-
* @return {?}
|
|
139
|
-
*/
|
|
140
|
-
registerOnTouched(fn) {
|
|
141
|
-
this.onTouched = fn;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* getEditorContent?: function
|
|
145
|
-
* Returns the content within the editor
|
|
146
|
-
* @return {?}
|
|
147
|
-
*/
|
|
148
|
-
getValue() {
|
|
149
|
-
if (this._componentInitialized) {
|
|
150
|
-
setTimeout((/**
|
|
151
|
-
* @return {?}
|
|
152
|
-
*/
|
|
153
|
-
() => {
|
|
154
|
-
this._subject.next(this._value);
|
|
155
|
-
this._subject.complete();
|
|
156
|
-
this._subject = new Subject();
|
|
157
|
-
}));
|
|
158
|
-
return this._subject.asObservable();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* language?: string
|
|
163
|
-
* language used in editor
|
|
164
|
-
* @param {?} language
|
|
165
|
-
* @return {?}
|
|
166
|
-
*/
|
|
167
|
-
set language(language) {
|
|
168
|
-
this._language = language;
|
|
169
|
-
if (this._componentInitialized) {
|
|
170
|
-
this.applyLanguage();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* @return {?}
|
|
175
|
-
*/
|
|
176
|
-
get language() {
|
|
177
|
-
return this._language;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* @return {?}
|
|
181
|
-
*/
|
|
182
|
-
applyLanguage() {
|
|
183
|
-
if (this._language) {
|
|
184
|
-
monaco.editor.setModelLanguage(this._editor.getModel(), this._language);
|
|
185
|
-
this.editorLanguageChanged.emit();
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* registerLanguage?: function
|
|
190
|
-
* Registers a custom Language within the editor
|
|
191
|
-
* @param {?} language
|
|
192
|
-
* @return {?}
|
|
193
|
-
*/
|
|
194
|
-
registerLanguage(language) {
|
|
195
|
-
if (this._componentInitialized) {
|
|
196
|
-
for (const provider of language.completionItemProvider) {
|
|
197
|
-
/* tslint:disable-next-line */
|
|
198
|
-
provider.kind = eval(provider.kind);
|
|
199
|
-
}
|
|
200
|
-
for (const monarchTokens of language.monarchTokensProvider) {
|
|
201
|
-
/* tslint:disable-next-line */
|
|
202
|
-
monarchTokens[0] = eval(monarchTokens[0]);
|
|
203
|
-
}
|
|
204
|
-
monaco.languages.register({ id: language.id });
|
|
205
|
-
monaco.languages.setMonarchTokensProvider(language.id, {
|
|
206
|
-
tokenizer: {
|
|
207
|
-
root: language.monarchTokensProvider,
|
|
208
|
-
},
|
|
209
|
-
});
|
|
210
|
-
// Define a new theme that constains only rules that match this language
|
|
211
|
-
monaco.editor.defineTheme(language.customTheme.id, language.customTheme.theme);
|
|
212
|
-
this._theme = language.customTheme.id;
|
|
213
|
-
monaco.languages.registerCompletionItemProvider(language.id, {
|
|
214
|
-
provideCompletionItems: (/**
|
|
215
|
-
* @return {?}
|
|
216
|
-
*/
|
|
217
|
-
() => {
|
|
218
|
-
return language.completionItemProvider;
|
|
219
|
-
}),
|
|
220
|
-
});
|
|
221
|
-
/** @type {?} */
|
|
222
|
-
const css = document.createElement('style');
|
|
223
|
-
css.type = 'text/css';
|
|
224
|
-
css.innerHTML = language.monarchTokensProviderCSS;
|
|
225
|
-
document.body.appendChild(css);
|
|
226
|
-
this.editorConfigurationChanged.emit();
|
|
227
|
-
this._registeredLanguagesStyles = [...this._registeredLanguagesStyles, css];
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* style?: string
|
|
232
|
-
* css style of the editor on the page
|
|
233
|
-
* @param {?} editorStyle
|
|
234
|
-
* @return {?}
|
|
235
|
-
*/
|
|
236
|
-
set editorStyle(editorStyle) {
|
|
237
|
-
this._editorStyle = editorStyle;
|
|
238
|
-
if (this._componentInitialized) {
|
|
239
|
-
this.applyStyle();
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* @return {?}
|
|
244
|
-
*/
|
|
245
|
-
get editorStyle() {
|
|
246
|
-
return this._editorStyle;
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* @return {?}
|
|
250
|
-
*/
|
|
251
|
-
applyStyle() {
|
|
252
|
-
if (this._editorStyle) {
|
|
253
|
-
/** @type {?} */
|
|
254
|
-
const containerDiv = this._editorContainer.nativeElement;
|
|
255
|
-
containerDiv.setAttribute('style', this._editorStyle);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* theme?: string
|
|
260
|
-
* Theme to be applied to editor
|
|
261
|
-
* @param {?} theme
|
|
262
|
-
* @return {?}
|
|
263
|
-
*/
|
|
264
|
-
set theme(theme) {
|
|
265
|
-
this._theme = theme;
|
|
266
|
-
if (this._componentInitialized) {
|
|
267
|
-
this._editor.updateOptions({ theme });
|
|
268
|
-
this.editorConfigurationChanged.emit();
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* @return {?}
|
|
273
|
-
*/
|
|
274
|
-
get theme() {
|
|
275
|
-
return this._theme;
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* fullScreenKeyBinding?: number
|
|
279
|
-
* See here for key bindings https://microsoft.github.io/monaco-editor/api/enums/monaco.keycode.html
|
|
280
|
-
* Sets the KeyCode for shortcutting to Fullscreen mode
|
|
281
|
-
* @param {?} keycode
|
|
282
|
-
* @return {?}
|
|
283
|
-
*/
|
|
284
|
-
set fullScreenKeyBinding(keycode) {
|
|
285
|
-
this._keycode = keycode;
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* @return {?}
|
|
289
|
-
*/
|
|
290
|
-
get fullScreenKeyBinding() {
|
|
291
|
-
return this._keycode;
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* editorOptions?: object
|
|
295
|
-
* Options used on editor instantiation. Available options listed here:
|
|
296
|
-
* https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.ieditoroptions.html
|
|
297
|
-
* @param {?} editorOptions
|
|
298
|
-
* @return {?}
|
|
299
|
-
*/
|
|
300
|
-
set editorOptions(editorOptions) {
|
|
301
|
-
this._editorOptions = editorOptions;
|
|
302
|
-
if (this._componentInitialized) {
|
|
303
|
-
this._editor.updateOptions(editorOptions);
|
|
304
|
-
this.editorConfigurationChanged.emit();
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* @return {?}
|
|
309
|
-
*/
|
|
310
|
-
get editorOptions() {
|
|
311
|
-
return this._editorOptions;
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* layout method that calls layout method of editor and instructs the editor to remeasure its container
|
|
315
|
-
* @return {?}
|
|
316
|
-
*/
|
|
317
|
-
layout() {
|
|
318
|
-
if (this._componentInitialized) {
|
|
319
|
-
this._editor.layout();
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Returns if in Full Screen Mode or not
|
|
324
|
-
* @return {?}
|
|
325
|
-
*/
|
|
326
|
-
get isFullScreen() {
|
|
327
|
-
return this._isFullScreen;
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* @return {?}
|
|
331
|
-
*/
|
|
332
|
-
ngOnInit() {
|
|
333
|
-
/** @type {?} */
|
|
334
|
-
const containerDiv = this._editorContainer.nativeElement;
|
|
335
|
-
containerDiv.id = this._editorInnerContainer;
|
|
336
|
-
this._editor = monaco.editor.create(containerDiv, Object.assign({
|
|
337
|
-
value: this._value,
|
|
338
|
-
language: this.language,
|
|
339
|
-
theme: this._theme,
|
|
340
|
-
}, this.editorOptions));
|
|
341
|
-
this._componentInitialized = true;
|
|
342
|
-
setTimeout((/**
|
|
343
|
-
* @return {?}
|
|
344
|
-
*/
|
|
345
|
-
() => {
|
|
346
|
-
this.applyLanguage();
|
|
347
|
-
this._fromEditor = true;
|
|
348
|
-
this.applyValue();
|
|
349
|
-
this.applyStyle();
|
|
350
|
-
this.editorInitialized.emit(this._editor);
|
|
351
|
-
this.editorConfigurationChanged.emit();
|
|
352
|
-
}));
|
|
353
|
-
this._editor.getModel().onDidChangeContent((/**
|
|
354
|
-
* @param {?} e
|
|
355
|
-
* @return {?}
|
|
356
|
-
*/
|
|
357
|
-
(e) => {
|
|
358
|
-
this._fromEditor = true;
|
|
359
|
-
this.writeValue(this._editor.getValue());
|
|
360
|
-
this.layout();
|
|
361
|
-
}));
|
|
362
|
-
this.addFullScreenModeCommand();
|
|
363
|
-
merge(fromEvent(window, 'resize').pipe(debounceTime(100)), this._widthSubject.asObservable().pipe(distinctUntilChanged()), this._heightSubject.asObservable().pipe(distinctUntilChanged()))
|
|
364
|
-
.pipe(takeUntil(this._destroy), debounceTime(100))
|
|
365
|
-
.subscribe((/**
|
|
366
|
-
* @return {?}
|
|
367
|
-
*/
|
|
368
|
-
() => {
|
|
369
|
-
this.layout();
|
|
370
|
-
this._changeDetectorRef.markForCheck();
|
|
371
|
-
}));
|
|
372
|
-
timer(500, 250)
|
|
373
|
-
.pipe(takeUntil(this._destroy))
|
|
374
|
-
.subscribe((/**
|
|
375
|
-
* @return {?}
|
|
376
|
-
*/
|
|
377
|
-
() => {
|
|
378
|
-
if (this._elementRef && this._elementRef.nativeElement) {
|
|
379
|
-
this._widthSubject.next(((/** @type {?} */ (this._elementRef.nativeElement))).getBoundingClientRect().width);
|
|
380
|
-
this._heightSubject.next(((/** @type {?} */ (this._elementRef.nativeElement))).getBoundingClientRect().height);
|
|
381
|
-
}
|
|
382
|
-
}));
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* @return {?}
|
|
386
|
-
*/
|
|
387
|
-
ngOnDestroy() {
|
|
388
|
-
this._changeDetectorRef.detach();
|
|
389
|
-
this._registeredLanguagesStyles.forEach((/**
|
|
390
|
-
* @param {?} style
|
|
391
|
-
* @return {?}
|
|
392
|
-
*/
|
|
393
|
-
(style) => style.remove()));
|
|
394
|
-
if (this._editor) {
|
|
395
|
-
this._editor.dispose();
|
|
396
|
-
}
|
|
397
|
-
this._destroy.next(true);
|
|
398
|
-
this._destroy.unsubscribe();
|
|
399
|
-
}
|
|
400
|
-
/**
|
|
401
|
-
* showFullScreenEditor request for full screen of Code Editor based on its browser type.
|
|
402
|
-
* @return {?}
|
|
403
|
-
*/
|
|
404
|
-
showFullScreenEditor() {
|
|
405
|
-
if (this._componentInitialized) {
|
|
406
|
-
/** @type {?} */
|
|
407
|
-
const codeEditorElement = (/** @type {?} */ (this._editorContainer.nativeElement));
|
|
408
|
-
/** @type {?} */
|
|
409
|
-
const fullScreenMap = {
|
|
410
|
-
// Chrome
|
|
411
|
-
requestFullscreen: (/**
|
|
412
|
-
* @return {?}
|
|
413
|
-
*/
|
|
414
|
-
() => codeEditorElement.requestFullscreen()),
|
|
415
|
-
// Safari
|
|
416
|
-
webkitRequestFullscreen: (/**
|
|
417
|
-
* @return {?}
|
|
418
|
-
*/
|
|
419
|
-
() => ((/** @type {?} */ (codeEditorElement))).webkitRequestFullscreen()),
|
|
420
|
-
// IE
|
|
421
|
-
msRequestFullscreen: (/**
|
|
422
|
-
* @return {?}
|
|
423
|
-
*/
|
|
424
|
-
() => ((/** @type {?} */ (codeEditorElement))).msRequestFullscreen()),
|
|
425
|
-
// Firefox
|
|
426
|
-
mozRequestFullScreen: (/**
|
|
427
|
-
* @return {?}
|
|
428
|
-
*/
|
|
429
|
-
() => ((/** @type {?} */ (codeEditorElement))).mozRequestFullScreen()),
|
|
430
|
-
};
|
|
431
|
-
for (const handler of Object.keys(fullScreenMap)) {
|
|
432
|
-
if (codeEditorElement[handler]) {
|
|
433
|
-
fullScreenMap[handler]();
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
this._isFullScreen = true;
|
|
438
|
-
}
|
|
439
|
-
/**
|
|
440
|
-
* exitFullScreenEditor request to exit full screen of Code Editor based on its browser type.
|
|
441
|
-
* @return {?}
|
|
442
|
-
*/
|
|
443
|
-
exitFullScreenEditor() {
|
|
444
|
-
if (this._componentInitialized) {
|
|
445
|
-
/** @type {?} */
|
|
446
|
-
const exitFullScreenMap = {
|
|
447
|
-
// Chrome
|
|
448
|
-
exitFullscreen: (/**
|
|
449
|
-
* @return {?}
|
|
450
|
-
*/
|
|
451
|
-
() => document.exitFullscreen()),
|
|
452
|
-
// Safari
|
|
453
|
-
webkitExitFullscreen: (/**
|
|
454
|
-
* @return {?}
|
|
455
|
-
*/
|
|
456
|
-
() => ((/** @type {?} */ (document))).webkitExitFullscreen()),
|
|
457
|
-
// Firefox
|
|
458
|
-
mozCancelFullScreen: (/**
|
|
459
|
-
* @return {?}
|
|
460
|
-
*/
|
|
461
|
-
() => ((/** @type {?} */ (document))).mozCancelFullScreen()),
|
|
462
|
-
// IE
|
|
463
|
-
msExitFullscreen: (/**
|
|
464
|
-
* @return {?}
|
|
465
|
-
*/
|
|
466
|
-
() => ((/** @type {?} */ (document))).msExitFullscreen()),
|
|
467
|
-
};
|
|
468
|
-
for (const handler of Object.keys(exitFullScreenMap)) {
|
|
469
|
-
if (document[handler]) {
|
|
470
|
-
exitFullScreenMap[handler]();
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
this._isFullScreen = false;
|
|
475
|
-
}
|
|
476
|
-
/**
|
|
477
|
-
* addFullScreenModeCommand used to add the fullscreen option to the context menu
|
|
478
|
-
* @private
|
|
479
|
-
* @return {?}
|
|
480
|
-
*/
|
|
481
|
-
addFullScreenModeCommand() {
|
|
482
|
-
this._editor.addAction({
|
|
483
|
-
// An unique identifier of the contributed action.
|
|
484
|
-
id: 'fullScreen',
|
|
485
|
-
// A label of the action that will be presented to the user.
|
|
486
|
-
label: 'Full Screen',
|
|
487
|
-
// An optional array of keybindings for the action.
|
|
488
|
-
contextMenuGroupId: 'navigation',
|
|
489
|
-
keybindings: this._keycode,
|
|
490
|
-
contextMenuOrder: 1.5,
|
|
491
|
-
// Method that will be executed when the action is triggered.
|
|
492
|
-
// @param editor The editor instance is passed in as a convinience
|
|
493
|
-
run: (/**
|
|
494
|
-
* @param {?} ed
|
|
495
|
-
* @return {?}
|
|
496
|
-
*/
|
|
497
|
-
(ed) => {
|
|
498
|
-
this.showFullScreenEditor();
|
|
499
|
-
}),
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
TdCodeEditorComponent.decorators = [
|
|
504
|
-
{ type: Component, args: [{
|
|
505
|
-
selector: 'td-code-editor',
|
|
506
|
-
template: "<div class=\"editorContainer\" #editorContainer></div>\n",
|
|
507
|
-
providers: [
|
|
508
|
-
{
|
|
509
|
-
provide: NG_VALUE_ACCESSOR,
|
|
510
|
-
useExisting: forwardRef((/**
|
|
511
|
-
* @return {?}
|
|
512
|
-
*/
|
|
513
|
-
() => TdCodeEditorComponent)),
|
|
514
|
-
multi: true,
|
|
515
|
-
},
|
|
516
|
-
],
|
|
517
|
-
styles: [":host{display:block;position:relative}:host .editorContainer{bottom:0;left:0;position:absolute;right:0;top:0}::ng-deep .monaco-aria-container{display:none}"]
|
|
518
|
-
}] }
|
|
519
|
-
];
|
|
520
|
-
/** @nocollapse */
|
|
521
|
-
TdCodeEditorComponent.ctorParameters = () => [
|
|
522
|
-
{ type: NgZone },
|
|
523
|
-
{ type: ChangeDetectorRef },
|
|
524
|
-
{ type: ElementRef }
|
|
525
|
-
];
|
|
526
|
-
TdCodeEditorComponent.propDecorators = {
|
|
527
|
-
_editorContainer: [{ type: ViewChild, args: ['editorContainer', { static: true },] }],
|
|
528
|
-
editorInitialized: [{ type: Output }],
|
|
529
|
-
editorConfigurationChanged: [{ type: Output }],
|
|
530
|
-
editorLanguageChanged: [{ type: Output }],
|
|
531
|
-
editorValueChange: [{ type: Output }],
|
|
532
|
-
change: [{ type: Output }],
|
|
533
|
-
value: [{ type: Input, args: ['value',] }],
|
|
534
|
-
language: [{ type: Input, args: ['language',] }],
|
|
535
|
-
editorStyle: [{ type: Input, args: ['editorStyle',] }],
|
|
536
|
-
theme: [{ type: Input, args: ['theme',] }],
|
|
537
|
-
fullScreenKeyBinding: [{ type: Input, args: ['fullScreenKeyBinding',] }],
|
|
538
|
-
editorOptions: [{ type: Input, args: ['editorOptions',] }]
|
|
539
|
-
};
|
|
540
|
-
if (false) {
|
|
541
|
-
/**
|
|
542
|
-
* @type {?}
|
|
543
|
-
* @private
|
|
544
|
-
*/
|
|
545
|
-
TdCodeEditorComponent.prototype._destroy;
|
|
546
|
-
/**
|
|
547
|
-
* @type {?}
|
|
548
|
-
* @private
|
|
549
|
-
*/
|
|
550
|
-
TdCodeEditorComponent.prototype._widthSubject;
|
|
551
|
-
/**
|
|
552
|
-
* @type {?}
|
|
553
|
-
* @private
|
|
554
|
-
*/
|
|
555
|
-
TdCodeEditorComponent.prototype._heightSubject;
|
|
556
|
-
/**
|
|
557
|
-
* @type {?}
|
|
558
|
-
* @private
|
|
559
|
-
*/
|
|
560
|
-
TdCodeEditorComponent.prototype._editorStyle;
|
|
561
|
-
/**
|
|
562
|
-
* @type {?}
|
|
563
|
-
* @private
|
|
564
|
-
*/
|
|
565
|
-
TdCodeEditorComponent.prototype._value;
|
|
566
|
-
/**
|
|
567
|
-
* @type {?}
|
|
568
|
-
* @private
|
|
569
|
-
*/
|
|
570
|
-
TdCodeEditorComponent.prototype._theme;
|
|
571
|
-
/**
|
|
572
|
-
* @type {?}
|
|
573
|
-
* @private
|
|
574
|
-
*/
|
|
575
|
-
TdCodeEditorComponent.prototype._language;
|
|
576
|
-
/**
|
|
577
|
-
* @type {?}
|
|
578
|
-
* @private
|
|
579
|
-
*/
|
|
580
|
-
TdCodeEditorComponent.prototype._subject;
|
|
581
|
-
/**
|
|
582
|
-
* @type {?}
|
|
583
|
-
* @private
|
|
584
|
-
*/
|
|
585
|
-
TdCodeEditorComponent.prototype._editorInnerContainer;
|
|
586
|
-
/**
|
|
587
|
-
* @type {?}
|
|
588
|
-
* @private
|
|
589
|
-
*/
|
|
590
|
-
TdCodeEditorComponent.prototype._editor;
|
|
591
|
-
/**
|
|
592
|
-
* @type {?}
|
|
593
|
-
* @private
|
|
594
|
-
*/
|
|
595
|
-
TdCodeEditorComponent.prototype._fromEditor;
|
|
596
|
-
/**
|
|
597
|
-
* @type {?}
|
|
598
|
-
* @private
|
|
599
|
-
*/
|
|
600
|
-
TdCodeEditorComponent.prototype._componentInitialized;
|
|
601
|
-
/**
|
|
602
|
-
* @type {?}
|
|
603
|
-
* @private
|
|
604
|
-
*/
|
|
605
|
-
TdCodeEditorComponent.prototype._editorOptions;
|
|
606
|
-
/**
|
|
607
|
-
* @type {?}
|
|
608
|
-
* @private
|
|
609
|
-
*/
|
|
610
|
-
TdCodeEditorComponent.prototype._isFullScreen;
|
|
611
|
-
/**
|
|
612
|
-
* @type {?}
|
|
613
|
-
* @private
|
|
614
|
-
*/
|
|
615
|
-
TdCodeEditorComponent.prototype._keycode;
|
|
616
|
-
/**
|
|
617
|
-
* @type {?}
|
|
618
|
-
* @private
|
|
619
|
-
*/
|
|
620
|
-
TdCodeEditorComponent.prototype._registeredLanguagesStyles;
|
|
621
|
-
/** @type {?} */
|
|
622
|
-
TdCodeEditorComponent.prototype._editorContainer;
|
|
623
|
-
/**
|
|
624
|
-
* editorInitialized: function($event)
|
|
625
|
-
* Event emitted when editor is first initialized
|
|
626
|
-
* @type {?}
|
|
627
|
-
*/
|
|
628
|
-
TdCodeEditorComponent.prototype.editorInitialized;
|
|
629
|
-
/**
|
|
630
|
-
* editorConfigurationChanged: function($event)
|
|
631
|
-
* Event emitted when editor's configuration changes
|
|
632
|
-
* @type {?}
|
|
633
|
-
*/
|
|
634
|
-
TdCodeEditorComponent.prototype.editorConfigurationChanged;
|
|
635
|
-
/**
|
|
636
|
-
* editorLanguageChanged: function($event)
|
|
637
|
-
* Event emitted when editor's Language changes
|
|
638
|
-
* @type {?}
|
|
639
|
-
*/
|
|
640
|
-
TdCodeEditorComponent.prototype.editorLanguageChanged;
|
|
641
|
-
/**
|
|
642
|
-
* editorValueChange: function($event)
|
|
643
|
-
* Event emitted any time something changes the editor value
|
|
644
|
-
* @type {?}
|
|
645
|
-
*/
|
|
646
|
-
TdCodeEditorComponent.prototype.editorValueChange;
|
|
647
|
-
/**
|
|
648
|
-
* The change event notifies you about a change happening in an input field.
|
|
649
|
-
* Since the component is not a native Angular component have to specifiy the event emitter ourself
|
|
650
|
-
* @type {?}
|
|
651
|
-
*/
|
|
652
|
-
TdCodeEditorComponent.prototype.change;
|
|
653
|
-
/** @type {?} */
|
|
654
|
-
TdCodeEditorComponent.prototype.propagateChange;
|
|
655
|
-
/** @type {?} */
|
|
656
|
-
TdCodeEditorComponent.prototype.onTouched;
|
|
657
|
-
/**
|
|
658
|
-
* @type {?}
|
|
659
|
-
* @private
|
|
660
|
-
*/
|
|
661
|
-
TdCodeEditorComponent.prototype.zone;
|
|
662
|
-
/**
|
|
663
|
-
* @type {?}
|
|
664
|
-
* @private
|
|
665
|
-
*/
|
|
666
|
-
TdCodeEditorComponent.prototype._changeDetectorRef;
|
|
667
|
-
/**
|
|
668
|
-
* @type {?}
|
|
669
|
-
* @private
|
|
670
|
-
*/
|
|
671
|
-
TdCodeEditorComponent.prototype._elementRef;
|
|
672
|
-
}
|
|
673
|
-
export { ɵ0 };
|
|
674
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9jb2RlLWVkaXRvci8iLCJzb3VyY2VzIjpbImNvZGUtZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBRVosU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLGlCQUFpQixHQUVsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFHL0UsT0FBTyxLQUFLLE1BQU0sTUFBTSx3Q0FBd0MsQ0FBQzs7TUFFM0QsSUFBSTs7O0FBQVEsR0FBRyxFQUFFO0lBQ3JCLGVBQWU7QUFDakIsQ0FBQyxDQUFBOzs7O0lBR0csYUFBYSxHQUFXLENBQUM7QUFjN0IsTUFBTSxPQUFPLHFCQUFxQjs7Ozs7OztJQXdRaEMsWUFBb0IsSUFBWSxFQUFVLGtCQUFxQyxFQUFVLFdBQXVCO1FBQTVGLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUF2UXhHLGFBQVEsR0FBcUIsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUNwRCxrQkFBYSxHQUFvQixJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3ZELG1CQUFjLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFFeEQsaUJBQVks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c0I7Ozs7O0lBQ3RCLDJEQUE0RDs7SUFFNUQsaURBQTZFOzs7Ozs7SUFNN0Usa0RBQTJFOzs7Ozs7SUFNM0UsMkRBQW9GOzs7Ozs7SUFNcEYsc0RBQStFOzs7Ozs7SUFNL0Usa0RBQTJFOzs7Ozs7SUFNM0UsdUNBQWdFOztJQUVoRSxnREFBaUM7O0lBQ2pDLDBDQUF1Qjs7Ozs7SUFvTlgscUNBQW9COzs7OztJQUFFLG1EQUE2Qzs7Ozs7SUFBRSw0Q0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIE5nWm9uZSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBVc2UgZXNtIHZlcnNpb24gdG8gc3VwcG9ydCBzaGlwcGluZyBzdWJzZXQgb2YgbGFuZ3VhZ2VzIGFuZCBmZWF0dXJlc1xuaW1wb3J0ICogYXMgbW9uYWNvIGZyb20gJ21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9lZGl0b3IuYXBpJztcblxuY29uc3Qgbm9vcDogYW55ID0gKCkgPT4ge1xuICAvLyBlbXB0eSBtZXRob2Rcbn07XG5cbi8vIGNvdW50ZXIgZm9yIGlkcyB0byBhbGxvdyBmb3IgbXVsdGlwbGUgZWRpdG9ycyBvbiBvbmUgcGFnZVxubGV0IHVuaXF1ZUNvdW50ZXI6IG51bWJlciA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RkLWNvZGUtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvZGUtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29kZS1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUZENvZGVFZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGRDb2RlRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfZGVzdHJveTogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgX3dpZHRoU3ViamVjdDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICBwcml2YXRlIF9oZWlnaHRTdWJqZWN0OiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBfZWRpdG9yU3R5bGU6IHN0cmluZyA9ICd3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjoxcHggc29saWQgZ3JleTsnO1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3RoZW1lOiBzdHJpbmcgPSAndnMnO1xuICBwcml2YXRlIF9sYW5ndWFnZTogc3RyaW5nID0gJ2phdmFzY3JpcHQnO1xuICBwcml2YXRlIF9zdWJqZWN0OiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIF9lZGl0b3JJbm5lckNvbnRhaW5lcjogc3RyaW5nID0gJ2VkaXRvcklubmVyQ29udGFpbmVyJyArIHVuaXF1ZUNvdW50ZXIrKztcbiAgcHJpdmF0ZSBfZWRpdG9yOiBhbnk7XG4gIHByaXZhdGUgX2Zyb21FZGl0b3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29tcG9uZW50SW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZWRpdG9yT3B0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgX2lzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9rZXljb2RlOiBhbnk7XG4gIHByaXZhdGUgX3JlZ2lzdGVyZWRMYW5ndWFnZXNTdHlsZXM6IEhUTUxTdHlsZUVsZW1lbnRbXSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvckNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIF9lZGl0b3JDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIGVkaXRvckluaXRpYWxpemVkOiBmdW5jdGlvbigkZXZlbnQpXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBlZGl0b3IgaXMgZmlyc3QgaW5pdGlhbGl6ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBlZGl0b3JJbml0aWFsaXplZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBlZGl0b3JDb25maWd1cmF0aW9uQ2hhbmdlZDogZnVuY3Rpb24oJGV2ZW50KVxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gZWRpdG9yJ3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzXG4gICAqL1xuICBAT3V0cHV0KCkgZWRpdG9yQ29uZmlndXJhdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogZWRpdG9yTGFuZ3VhZ2VDaGFuZ2VkOiBmdW5jdGlvbigkZXZlbnQpXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBlZGl0b3IncyBMYW5ndWFnZSBjaGFuZ2VzXG4gICAqL1xuICBAT3V0cHV0KCkgZWRpdG9yTGFuZ3VhZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIGVkaXRvclZhbHVlQ2hhbmdlOiBmdW5jdGlvbigkZXZlbnQpXG4gICAqIEV2ZW50IGVtaXR0ZWQgYW55IHRpbWUgc29tZXRoaW5nIGNoYW5nZXMgdGhlIGVkaXRvciB2YWx1ZVxuICAgKi9cbiAgQE91dHB1dCgpIGVkaXRvclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFuZ2UgZXZlbnQgbm90aWZpZXMgeW91IGFib3V0IGEgY2hhbmdlIGhhcHBlbmluZyBpbiBhbiBpbnB1dCBmaWVsZC5cbiAgICogU2luY2UgdGhlIGNvbXBvbmVudCBpcyBub3QgYSBuYXRpdmUgQW5ndWxhciBjb21wb25lbnQgaGF2ZSB0byBzcGVjaWZpeSB0aGUgZXZlbnQgZW1pdHRlciBvdXJzZWxmXG4gICAqL1xuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4gbm9vcDtcblxuICAvKipcbiAgICogdmFsdWU/OiBzdHJpbmdcbiAgICovXG4gIEBJbnB1dCgndmFsdWUnKVxuICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuYXBwbHlWYWx1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIGFwcGx5VmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9mcm9tRWRpdG9yKSB7XG4gICAgICB0aGlzLl9lZGl0b3Iuc2V0VmFsdWUodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9mcm9tRWRpdG9yID0gZmFsc2U7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoKTtcbiAgICB0aGlzLmVkaXRvclZhbHVlQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gZG8gbm90IHdyaXRlIGlmIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldEVkaXRvckNvbnRlbnQ/OiBmdW5jdGlvblxuICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHdpdGhpbiB0aGUgZWRpdG9yXG4gICAqL1xuICBnZXRWYWx1ZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9jb21wb25lbnRJbml0aWFsaXplZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3N1YmplY3QubmV4dCh0aGlzLl92YWx1ZSk7XG4gICAgICAgIHRoaXMuX3N1YmplY3QuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fc3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBsYW5ndWFnZT86IHN0cmluZ1xuICAgKiBsYW5ndWFnZSB1c2VkIGluIGVkaXRvclxuICAgKi9cbiAgQElucHV0KCdsYW5ndWFnZScpXG4gIHNldCBsYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuYXBwbHlMYW5ndWFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIGFwcGx5TGFuZ3VhZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xhbmd1YWdlKSB7XG4gICAgICBtb25hY28uZWRpdG9yLnNldE1vZGVsTGFuZ3VhZ2UodGhpcy5fZWRpdG9yLmdldE1vZGVsKCksIHRoaXMuX2xhbmd1YWdlKTtcbiAgICAgIHRoaXMuZWRpdG9yTGFuZ3VhZ2VDaGFuZ2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVnaXN0ZXJMYW5ndWFnZT86IGZ1bmN0aW9uXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBMYW5ndWFnZSB3aXRoaW4gdGhlIGVkaXRvclxuICAgKi9cbiAgcmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudEluaXRpYWxpemVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIGxhbmd1YWdlLmNvbXBsZXRpb25JdGVtUHJvdmlkZXIpIHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgIHByb3ZpZGVyLmtpbmQgPSBldmFsKHByb3ZpZGVyLmtpbmQpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBtb25hcmNoVG9rZW5zIG9mIGxhbmd1YWdlLm1vbmFyY2hUb2tlbnNQcm92aWRlcikge1xuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgbW9uYXJjaFRva2Vuc1swXSA9IGV2YWwobW9uYXJjaFRva2Vuc1swXSk7XG4gICAgICB9XG4gICAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyKHsgaWQ6IGxhbmd1YWdlLmlkIH0pO1xuXG4gICAgICBtb25hY28ubGFuZ3VhZ2VzLnNldE1vbmFyY2hUb2tlbnNQcm92aWRlcihsYW5ndWFnZS5pZCwge1xuICAgICAgICB0b2tlbml6ZXI6IHtcbiAgICAgICAgICByb290OiBsYW5ndWFnZS5tb25hcmNoVG9rZW5zUHJvdmlkZXIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gRGVmaW5lIGEgbmV3IHRoZW1lIHRoYXQgY29uc3RhaW5zIG9ubHkgcnVsZXMgdGhhdCBtYXRjaCB0aGlzIGxhbmd1YWdlXG4gICAgICBtb25hY28uZWRpdG9yLmRlZmluZVRoZW1lKGxhbmd1YWdlLmN1c3RvbVRoZW1lLmlkLCBsYW5ndWFnZS5jdXN0b21UaGVtZS50aGVtZSk7XG4gICAgICB0aGlzLl90aGVtZSA9IGxhbmd1YWdlLmN1c3RvbVRoZW1lLmlkO1xuXG4gICAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcihsYW5ndWFnZS5pZCwge1xuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGxhbmd1YWdlLmNvbXBsZXRpb25JdGVtUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY3NzOiBIVE1MU3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIGNzcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIGNzcy5pbm5lckhUTUwgPSBsYW5ndWFnZS5tb25hcmNoVG9rZW5zUHJvdmlkZXJDU1M7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNzcyk7XG4gICAgICB0aGlzLmVkaXRvckNvbmZpZ3VyYXRpb25DaGFuZ2VkLmVtaXQoKTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRMYW5ndWFnZXNTdHlsZXMgPSBbLi4udGhpcy5fcmVnaXN0ZXJlZExhbmd1YWdlc1N0eWxlcywgY3NzXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc3R5bGU/OiBzdHJpbmdcbiAgICogY3NzIHN0eWxlIG9mIHRoZSBlZGl0b3Igb24gdGhlIHBhZ2VcbiAgICovXG4gIEBJbnB1dCgnZWRpdG9yU3R5bGUnKVxuICBzZXQgZWRpdG9yU3R5bGUoZWRpdG9yU3R5bGU6IHN0cmluZykge1xuICAgIHRoaXMuX2VkaXRvclN0eWxlID0gZWRpdG9yU3R5bGU7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudEluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmFwcGx5U3R5bGUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZWRpdG9yU3R5bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yU3R5bGU7XG4gIH1cblxuICBhcHBseVN0eWxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9lZGl0b3JTdHlsZSkge1xuICAgICAgY29uc3QgY29udGFpbmVyRGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuX2VkaXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgY29udGFpbmVyRGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCB0aGlzLl9lZGl0b3JTdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRoZW1lPzogc3RyaW5nXG4gICAqIFRoZW1lIHRvIGJlIGFwcGxpZWQgdG8gZWRpdG9yXG4gICAqL1xuICBASW5wdXQoJ3RoZW1lJylcbiAgc2V0IHRoZW1lKHRoZW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aGVtZSA9IHRoZW1lO1xuICAgIGlmICh0aGlzLl9jb21wb25lbnRJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5fZWRpdG9yLnVwZGF0ZU9wdGlvbnMoeyB0aGVtZSB9KTtcbiAgICAgIHRoaXMuZWRpdG9yQ29uZmlndXJhdGlvbkNoYW5nZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuICBnZXQgdGhlbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGhlbWU7XG4gIH1cblxuICAvKipcbiAgICogZnVsbFNjcmVlbktleUJpbmRpbmc/OiBudW1iZXJcbiAgICogU2VlIGhlcmUgZm9yIGtleSBiaW5kaW5ncyBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbW9uYWNvLWVkaXRvci9hcGkvZW51bXMvbW9uYWNvLmtleWNvZGUuaHRtbFxuICAgKiBTZXRzIHRoZSBLZXlDb2RlIGZvciBzaG9ydGN1dHRpbmcgdG8gRnVsbHNjcmVlbiBtb2RlXG4gICAqL1xuICBASW5wdXQoJ2Z1bGxTY3JlZW5LZXlCaW5kaW5nJylcbiAgc2V0IGZ1bGxTY3JlZW5LZXlCaW5kaW5nKGtleWNvZGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5fa2V5Y29kZSA9IGtleWNvZGU7XG4gIH1cbiAgZ2V0IGZ1bGxTY3JlZW5LZXlCaW5kaW5nKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5Y29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBlZGl0b3JPcHRpb25zPzogb2JqZWN0XG4gICAqIE9wdGlvbnMgdXNlZCBvbiBlZGl0b3IgaW5zdGFudGlhdGlvbi4gQXZhaWxhYmxlIG9wdGlvbnMgbGlzdGVkIGhlcmU6XG4gICAqIGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9tb25hY28tZWRpdG9yL2FwaS9pbnRlcmZhY2VzL21vbmFjby5lZGl0b3IuaWVkaXRvcm9wdGlvbnMuaHRtbFxuICAgKi9cbiAgQElucHV0KCdlZGl0b3JPcHRpb25zJylcbiAgc2V0IGVkaXRvck9wdGlvbnMoZWRpdG9yT3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5fZWRpdG9yT3B0aW9ucyA9IGVkaXRvck9wdGlvbnM7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudEluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9lZGl0b3IudXBkYXRlT3B0aW9ucyhlZGl0b3JPcHRpb25zKTtcbiAgICAgIHRoaXMuZWRpdG9yQ29uZmlndXJhdGlvbkNoYW5nZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuICBnZXQgZWRpdG9yT3B0aW9ucygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3JPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIGxheW91dCBtZXRob2QgdGhhdCBjYWxscyBsYXlvdXQgbWV0aG9kIG9mIGVkaXRvciBhbmQgaW5zdHJ1Y3RzIHRoZSBlZGl0b3IgdG8gcmVtZWFzdXJlIGl0cyBjb250YWluZXJcbiAgICovXG4gIGxheW91dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX2VkaXRvci5sYXlvdXQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpZiBpbiBGdWxsIFNjcmVlbiBNb2RlIG9yIG5vdFxuICAgKi9cbiAgZ2V0IGlzRnVsbFNjcmVlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGdWxsU2NyZWVuO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1lbWJlci1vcmRlcmluZ1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckRpdjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLl9lZGl0b3JDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICBjb250YWluZXJEaXYuaWQgPSB0aGlzLl9lZGl0b3JJbm5lckNvbnRhaW5lcjtcblxuICAgIHRoaXMuX2VkaXRvciA9IG1vbmFjby5lZGl0b3IuY3JlYXRlKFxuICAgICAgY29udGFpbmVyRGl2LFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZSxcbiAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICB0aGVtZTogdGhpcy5fdGhlbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuZWRpdG9yT3B0aW9ucyxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9jb21wb25lbnRJbml0aWFsaXplZCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UoKTtcbiAgICAgIHRoaXMuX2Zyb21FZGl0b3IgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseVZhbHVlKCk7XG4gICAgICB0aGlzLmFwcGx5U3R5bGUoKTtcbiAgICAgIHRoaXMuZWRpdG9ySW5pdGlhbGl6ZWQuZW1pdCh0aGlzLl9lZGl0b3IpO1xuICAgICAgdGhpcy5lZGl0b3JDb25maWd1cmF0aW9uQ2hhbmdlZC5lbWl0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5fZWRpdG9yLmdldE1vZGVsKCkub25EaWRDaGFuZ2VDb250ZW50KChlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2Zyb21FZGl0b3IgPSB0cnVlO1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX2VkaXRvci5nZXRWYWx1ZSgpKTtcbiAgICAgIHRoaXMubGF5b3V0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRGdWxsU2NyZWVuTW9kZUNvbW1hbmQoKTtcblxuICAgIG1lcmdlKFxuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLFxuICAgICAgdGhpcy5fd2lkdGhTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSksXG4gICAgICB0aGlzLl9oZWlnaHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSksXG4gICAgKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpLCBkZWJvdW5jZVRpbWUoMTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxheW91dCgpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIHRpbWVyKDUwMCwgMjUwKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50UmVmICYmIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuX3dpZHRoU3ViamVjdC5uZXh0KCg8SFRNTEVsZW1lbnQ+dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XG4gICAgICAgICAgdGhpcy5faGVpZ2h0U3ViamVjdC5uZXh0KCg8SFRNTEVsZW1lbnQ+dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGFjaCgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRMYW5ndWFnZXNTdHlsZXMuZm9yRWFjaCgoc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQpID0+IHN0eWxlLnJlbW92ZSgpKTtcbiAgICBpZiAodGhpcy5fZWRpdG9yKSB7XG4gICAgICB0aGlzLl9lZGl0b3IuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kZXN0cm95Lm5leHQodHJ1ZSk7XG4gICAgdGhpcy5fZGVzdHJveS51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNob3dGdWxsU2NyZWVuRWRpdG9yIHJlcXVlc3QgZm9yIGZ1bGwgc2NyZWVuIG9mIENvZGUgRWRpdG9yIGJhc2VkIG9uIGl0cyBicm93c2VyIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc2hvd0Z1bGxTY3JlZW5FZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudEluaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb2RlRWRpdG9yRWxlbWVudDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLl9lZGl0b3JDb250YWluZXIubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgIGNvbnN0IGZ1bGxTY3JlZW5NYXA6IG9iamVjdCA9IHtcbiAgICAgICAgLy8gQ2hyb21lXG4gICAgICAgIHJlcXVlc3RGdWxsc2NyZWVuOiAoKSA9PiBjb2RlRWRpdG9yRWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpLFxuICAgICAgICAvLyBTYWZhcmlcbiAgICAgICAgd2Via2l0UmVxdWVzdEZ1bGxzY3JlZW46ICgpID0+ICg8YW55PmNvZGVFZGl0b3JFbGVtZW50KS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpLFxuICAgICAgICAvLyBJRVxuICAgICAgICBtc1JlcXVlc3RGdWxsc2NyZWVuOiAoKSA9PiAoPGFueT5jb2RlRWRpdG9yRWxlbWVudCkubXNSZXF1ZXN0RnVsbHNjcmVlbigpLFxuICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgIG1velJlcXVlc3RGdWxsU2NyZWVuOiAoKSA9PiAoPGFueT5jb2RlRWRpdG9yRWxlbWVudCkubW96UmVxdWVzdEZ1bGxTY3JlZW4oKSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBPYmplY3Qua2V5cyhmdWxsU2NyZWVuTWFwKSkge1xuICAgICAgICBpZiAoY29kZUVkaXRvckVsZW1lbnRbaGFuZGxlcl0pIHtcbiAgICAgICAgICBmdWxsU2NyZWVuTWFwW2hhbmRsZXJdKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXNGdWxsU2NyZWVuID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleGl0RnVsbFNjcmVlbkVkaXRvciByZXF1ZXN0IHRvIGV4aXQgZnVsbCBzY3JlZW4gb2YgQ29kZSBFZGl0b3IgYmFzZWQgb24gaXRzIGJyb3dzZXIgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBleGl0RnVsbFNjcmVlbkVkaXRvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnN0IGV4aXRGdWxsU2NyZWVuTWFwOiBvYmplY3QgPSB7XG4gICAgICAgIC8vIENocm9tZVxuICAgICAgICBleGl0RnVsbHNjcmVlbjogKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKSxcbiAgICAgICAgLy8gU2FmYXJpXG4gICAgICAgIHdlYmtpdEV4aXRGdWxsc2NyZWVuOiAoKSA9PiAoPGFueT5kb2N1bWVudCkud2Via2l0RXhpdEZ1bGxzY3JlZW4oKSxcbiAgICAgICAgLy8gRmlyZWZveFxuICAgICAgICBtb3pDYW5jZWxGdWxsU2NyZWVuOiAoKSA9PiAoPGFueT5kb2N1bWVudCkubW96Q2FuY2VsRnVsbFNjcmVlbigpLFxuICAgICAgICAvLyBJRVxuICAgICAgICBtc0V4aXRGdWxsc2NyZWVuOiAoKSA9PiAoPGFueT5kb2N1bWVudCkubXNFeGl0RnVsbHNjcmVlbigpLFxuICAgICAgfTtcblxuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIE9iamVjdC5rZXlzKGV4aXRGdWxsU2NyZWVuTWFwKSkge1xuICAgICAgICBpZiAoZG9jdW1lbnRbaGFuZGxlcl0pIHtcbiAgICAgICAgICBleGl0RnVsbFNjcmVlbk1hcFtoYW5kbGVyXSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2lzRnVsbFNjcmVlbiA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZEZ1bGxTY3JlZW5Nb2RlQ29tbWFuZCB1c2VkIHRvIGFkZCB0aGUgZnVsbHNjcmVlbiBvcHRpb24gdG8gdGhlIGNvbnRleHQgbWVudVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRGdWxsU2NyZWVuTW9kZUNvbW1hbmQoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yLmFkZEFjdGlvbih7XG4gICAgICAvLyBBbiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29udHJpYnV0ZWQgYWN0aW9uLlxuICAgICAgaWQ6ICdmdWxsU2NyZWVuJyxcbiAgICAgIC8vIEEgbGFiZWwgb2YgdGhlIGFjdGlvbiB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgICAgbGFiZWw6ICdGdWxsIFNjcmVlbicsXG4gICAgICAvLyBBbiBvcHRpb25hbCBhcnJheSBvZiBrZXliaW5kaW5ncyBmb3IgdGhlIGFjdGlvbi5cbiAgICAgIGNvbnRleHRNZW51R3JvdXBJZDogJ25hdmlnYXRpb24nLFxuICAgICAga2V5YmluZGluZ3M6IHRoaXMuX2tleWNvZGUsXG4gICAgICBjb250ZXh0TWVudU9yZGVyOiAxLjUsXG4gICAgICAvLyBNZXRob2QgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGFjdGlvbiBpcyB0cmlnZ2VyZWQuXG4gICAgICAvLyBAcGFyYW0gZWRpdG9yIFRoZSBlZGl0b3IgaW5zdGFuY2UgaXMgcGFzc2VkIGluIGFzIGEgY29udmluaWVuY2VcbiAgICAgIHJ1bjogKGVkOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zaG93RnVsbFNjcmVlbkVkaXRvcigpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|