raise-common-lib 0.0.192 → 0.0.193

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 (77) hide show
  1. package/README.md +57 -57
  2. package/bundles/raise-common-lib.umd.js +1240 -10
  3. package/bundles/raise-common-lib.umd.js.map +1 -1
  4. package/bundles/raise-common-lib.umd.min.js +1 -1
  5. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  6. package/esm2015/lib/common-grid/index.component.js +2 -2
  7. package/esm2015/lib/dialog/new-action-notification/new-action-notification.component.js +1 -1
  8. package/esm2015/lib/form/drawer-form/drawer-form.component.js +1 -1
  9. package/esm2015/lib/form/richtexteditor/ai-config.js +70 -0
  10. package/esm2015/lib/form/richtexteditor/data-config.js +273 -0
  11. package/esm2015/lib/form/richtexteditor/index.component.js +604 -0
  12. package/esm2015/lib/form/richtexteditor/openapi.js +175 -0
  13. package/esm2015/lib/layout/drawer/index.component.js +1 -1
  14. package/esm2015/lib/layout/page-tab/index.component.js +7 -3
  15. package/esm2015/lib/raise-common-lib.module.js +7 -2
  16. package/esm2015/public-api.js +2 -1
  17. package/esm2015/raise-common-lib.js +2 -2
  18. package/esm5/lib/common-grid/index.component.js +2 -2
  19. package/esm5/lib/dialog/new-action-notification/new-action-notification.component.js +1 -1
  20. package/esm5/lib/form/drawer-form/drawer-form.component.js +1 -1
  21. package/esm5/lib/form/richtexteditor/ai-config.js +73 -0
  22. package/esm5/lib/form/richtexteditor/data-config.js +273 -0
  23. package/esm5/lib/form/richtexteditor/index.component.js +684 -0
  24. package/esm5/lib/form/richtexteditor/openapi.js +208 -0
  25. package/esm5/lib/layout/drawer/index.component.js +1 -1
  26. package/esm5/lib/layout/page-tab/index.component.js +7 -3
  27. package/esm5/lib/raise-common-lib.module.js +7 -2
  28. package/esm5/public-api.js +2 -1
  29. package/esm5/raise-common-lib.js +2 -2
  30. package/fesm2015/raise-common-lib.js +1126 -12
  31. package/fesm2015/raise-common-lib.js.map +1 -1
  32. package/fesm5/raise-common-lib.js +1241 -12
  33. package/fesm5/raise-common-lib.js.map +1 -1
  34. package/lib/form/richtexteditor/ai-config.d.ts +10 -0
  35. package/lib/form/richtexteditor/data-config.d.ts +14 -0
  36. package/lib/form/richtexteditor/index.component.d.ts +78 -0
  37. package/lib/form/richtexteditor/openapi.d.ts +3 -0
  38. package/lib/layout/page-tab/index.component.d.ts +1 -0
  39. package/package.json +1 -1
  40. package/public-api.d.ts +1 -0
  41. package/raise-common-lib.metadata.json +1 -1
  42. package/src/assets/img/arrow_right.svg +4 -4
  43. package/src/assets/img/calendar-disabled.svg +6 -6
  44. package/src/assets/img/calendar.svg +6 -6
  45. package/src/assets/img/calendar_arrow_left.svg +3 -3
  46. package/src/assets/img/calendar_arrow_right.svg +3 -3
  47. package/src/assets/img/checked-vector.svg +3 -3
  48. package/src/assets/img/dialog-close.svg +4 -4
  49. package/src/assets/img/dialog-grow.svg +6 -6
  50. package/src/assets/img/dialog-shrink.svg +6 -6
  51. package/src/assets/img/editor-copy.svg +5 -0
  52. package/src/assets/img/info.svg +5 -0
  53. package/src/assets/img/plus.svg +4 -4
  54. package/src/assets/img/search.svg +4 -4
  55. package/src/assets/img/shrink-icon.svg +6 -6
  56. package/src/assets/img/time-disabled.svg +4 -4
  57. package/src/assets/img/time.svg +4 -4
  58. package/src/assets/img/toolbar-action-addFolder.svg +17 -17
  59. package/src/assets/img/toolbar-action-calculator.svg +11 -11
  60. package/src/assets/img/toolbar-action-collapse.svg +7 -7
  61. package/src/assets/img/toolbar-action-combine.svg +4 -4
  62. package/src/assets/img/toolbar-action-edit.svg +4 -4
  63. package/src/assets/img/toolbar-action-expand.svg +7 -7
  64. package/src/assets/img/toolbar-action-folderMove.svg +8 -8
  65. package/src/assets/img/toolbar-action-lock.svg +6 -6
  66. package/src/assets/img/toolbar-action-preview.svg +7 -7
  67. package/src/assets/img/toolbar-action-publish.svg +5 -5
  68. package/src/assets/img/toolbar-action-reminders.svg +10 -10
  69. package/src/assets/img/toolbar-action-rename.svg +7 -7
  70. package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
  71. package/src/assets/img/toolbar-action-send-file.svg +5 -5
  72. package/src/assets/img/toolbar-action-settle.svg +7 -7
  73. package/src/assets/img/toolbar-action-share.svg +5 -5
  74. package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
  75. package/src/assets/img/toolbar-action-sync.svg +4 -4
  76. package/src/assets/img/toolbar-action-template.svg +6 -6
  77. package/src/assets/img/toolbar-action-workflow.svg +9 -9
@@ -0,0 +1,684 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/form/richtexteditor/index.component.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import * as tslib_1 from "tslib";
7
+ import { Component, Input, Output, ViewChild, ChangeDetectorRef, EventEmitter, } from "@angular/core";
8
+ import { DropDownListComponent } from "@syncfusion/ej2-angular-dropdowns";
9
+ import { RichTextEditorComponent, } from "@syncfusion/ej2-angular-richtexteditor";
10
+ import { ButtonComponent } from "@syncfusion/ej2-angular-buttons";
11
+ import { DropDownButton } from "@syncfusion/ej2-angular-splitbuttons";
12
+ import { DialogComponent } from "@syncfusion/ej2-angular-popups";
13
+ // service
14
+ // import { PbFunService } from "@app/services/pb-fun.service";
15
+ // import { SharedSyncfusionModule } from "@app/module/syncfusionModule";
16
+ import { OpenAiModelRTE } from "./openapi";
17
+ import { lineHeight_items } from "./data-config";
18
+ import { fontFamily } from "./data-config";
19
+ var RichtexteditorComponent = /** @class */ (function () {
20
+ function RichtexteditorComponent(ref) {
21
+ this.ref = ref;
22
+ // @ViewChild("chipList", { static: false }) public chipList!: ChipListComponent;
23
+ this.placeholder = "";
24
+ this.value = "";
25
+ this.height = 150;
26
+ this.autoSaveOnIdle = true;
27
+ this.target = "#container"; // dialog 弹窗父级
28
+ // dialog 弹窗父级
29
+ this.toolbarClick = new EventEmitter();
30
+ this.change = new EventEmitter();
31
+ // @Output() change = new EventEmitter();
32
+ this.family = fontFamily;
33
+ this.dialogWidth = "800px";
34
+ this.dialogHeight = "642px";
35
+ this.showZoomBtn = true;
36
+ this.showMsg = false;
37
+ this.insertImageSettings = {
38
+ saveFormat: "Blob",
39
+ allowedTypes: [".svg", ".png"],
40
+ display: "none",
41
+ };
42
+ this.size = "";
43
+ this.dropValIndex = 0;
44
+ this.queryList = [
45
+ { id: "Rephrase", text: "Rephrase" },
46
+ { id: "Grammar", text: "Correct Grammar" },
47
+ { id: "Summarize", text: "Summarize" },
48
+ { id: "Elaborate", text: "Elaborate" },
49
+ { id: "Translate", text: "Translate" },
50
+ { id: "SentimentAnalysis", text: "Sentiment Analysis" },
51
+ ];
52
+ this.rephraseTyleList = [
53
+ { text: "Standard", id: "Standard" },
54
+ { text: "Fluent", id: "Fluent" },
55
+ { text: "Professional", id: "Professional" },
56
+ ];
57
+ this.languageList = [
58
+ { id: "EN", text: "English" },
59
+ { id: "ZH", text: "Chinese (Simplified)" },
60
+ { id: "ES", text: "Spanish" },
61
+ { id: "ZHT", text: "Chinese (Traditional)" },
62
+ { id: "HI", text: "Hindi" },
63
+ { id: "AR", text: "Arabic" },
64
+ { id: "BN", text: "Bengali" },
65
+ { id: "PT", text: "Portuguese" },
66
+ { id: "RU", text: "Russian" },
67
+ { id: "JA", text: "Japanese" },
68
+ { id: "DE", text: "German" },
69
+ { id: "KO", text: "Korean" },
70
+ { id: "FR", text: "French" },
71
+ { id: "IT", text: "Italian" },
72
+ { id: "TR", text: "Turkish" },
73
+ ];
74
+ this.promptQuery = "";
75
+ this.isSentimentCheck = false;
76
+ this.subQuery = "";
77
+ this.chipValue = "Standard";
78
+ this.tools = {
79
+ enableFloating: false,
80
+ items: [
81
+ {
82
+ tooltipText: "AI Assist",
83
+ template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="ai_assistant_button_tbar" style="width:100%"><div class="e-rte-dropdown-btn-text">AI Assist</div></button>',
84
+ },
85
+ "Bold",
86
+ "Italic",
87
+ "Underline",
88
+ "StrikeThrough",
89
+ "FontName",
90
+ "FontSize",
91
+ "FontColor",
92
+ "BackgroundColor",
93
+ "LowerCase",
94
+ "UpperCase",
95
+ "|",
96
+ "CreateTable",
97
+ "Formats",
98
+ "Alignments",
99
+ {
100
+ tooltipText: "Line Height",
101
+ template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="lineheight_tbar" style="width:100%"></button>',
102
+ },
103
+ "OrderedList",
104
+ "UnorderedList",
105
+ "Outdent",
106
+ "Indent",
107
+ "|",
108
+ "CreateLink",
109
+ {
110
+ tooltipText: "",
111
+ template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="custom_tbar" style="width:100%">' +
112
+ '<div class="e-tbar-btn-text" style="font-weight: 500;"><img src="/assets/img/file-icon.svg" style="position: relative;top: -2px;"/><div class="uploadActions"><div id="uploadFromUser">Computer File</div><div id="relationDom">Ticket Attachment</div></div></div></button>',
113
+ },
114
+ "|",
115
+ "FormatPainter",
116
+ "ClearFormat",
117
+ "|",
118
+ "Undo",
119
+ "Redo",
120
+ ],
121
+ };
122
+ }
123
+ /**
124
+ * @return {?}
125
+ */
126
+ RichtexteditorComponent.prototype.ngOnInit = /**
127
+ * @return {?}
128
+ */
129
+ function () { };
130
+ /**
131
+ * @param {?} args
132
+ * @return {?}
133
+ */
134
+ RichtexteditorComponent.prototype.onContentChange = /**
135
+ * @param {?} args
136
+ * @return {?}
137
+ */
138
+ function (args) {
139
+ /** @type {?} */
140
+ var tables = document.querySelectorAll("table.e-rte-table");
141
+ tables.forEach((/**
142
+ * @param {?} table
143
+ * @return {?}
144
+ */
145
+ function (table) {
146
+ /** @type {?} */
147
+ var htmlTable = (/** @type {?} */ (table));
148
+ htmlTable.style.marginBottom = "10px";
149
+ htmlTable.style.borderCollapse = "collapse";
150
+ htmlTable.style.emptyCells = "show";
151
+ /** @type {?} */
152
+ var tdElements = table.querySelectorAll("td");
153
+ tdElements.forEach((/**
154
+ * @param {?} td
155
+ * @return {?}
156
+ */
157
+ function (td) {
158
+ td.style.border = "1px solid #adb5bd";
159
+ td.style.height = "20px";
160
+ td.style.minWidth = "20px";
161
+ td.style.padding = "2px 5px";
162
+ td.style.boxSizing = "border-box";
163
+ }));
164
+ }));
165
+ this.change.emit(args);
166
+ };
167
+ /**
168
+ * @return {?}
169
+ */
170
+ RichtexteditorComponent.prototype.onCreate = /**
171
+ * @return {?}
172
+ */
173
+ function () {
174
+ var _this = this;
175
+ //bind the a click event
176
+ // let editorContent = this.rteObj.contentModule.getEditPanel() as HTMLElement;
177
+ // editorContent.addEventListener('click', this.OnClicked.bind(this));
178
+ //add the line height
179
+ this.editorManager = this.rteObj.formatter.editorManager;
180
+ /** @type {?} */
181
+ var splitButton = new DropDownButton({
182
+ items: lineHeight_items,
183
+ iconCss: "e-icons e-line-spacing",
184
+ select: this.onSelect.bind(this),
185
+ });
186
+ splitButton.appendTo("#lineheight_tbar");
187
+ // ai assist
188
+ /** @type {?} */
189
+ var aiassistantButton = new DropDownButton({
190
+ items: this.queryList,
191
+ // iconCss: "e-btn-icon e-icons e-assistview-icon e-icon-left",
192
+ select: (/**
193
+ * @param {?} args
194
+ * @return {?}
195
+ */
196
+ function (args) { return _this.aiQuerySelectedMenu(args); }),
197
+ });
198
+ aiassistantButton.appendTo("#ai_assistant_button_tbar");
199
+ };
200
+ /**
201
+ * @private
202
+ * @param {?} args
203
+ * @return {?}
204
+ */
205
+ RichtexteditorComponent.prototype.onSelect = /**
206
+ * @private
207
+ * @param {?} args
208
+ * @return {?}
209
+ */
210
+ function (args) {
211
+ if (this.rteObj.formatter.getUndoRedoStack().length === 0) {
212
+ this.rteObj.formatter.saveData();
213
+ }
214
+ /** @type {?} */
215
+ var nodes = this.editorManager.domNode.blockNodes();
216
+ for (var i = 0; nodes.length > i; i++) {
217
+ ((/** @type {?} */ (nodes[i]))).style.lineHeight = args.item.text;
218
+ }
219
+ this.rteObj.formatter.saveData();
220
+ this.rteObj.formatter.enableUndo(this.rteObj);
221
+ };
222
+ /**
223
+ * @private
224
+ * @param {?} args
225
+ * @return {?}
226
+ */
227
+ RichtexteditorComponent.prototype.aiQuerySelectedMenu = /**
228
+ * @private
229
+ * @param {?} args
230
+ * @return {?}
231
+ */
232
+ function (args) {
233
+ this.dialogueOpen(args.item.text);
234
+ };
235
+ /**
236
+ * @param {?} selectedQuery
237
+ * @return {?}
238
+ */
239
+ RichtexteditorComponent.prototype.dialogueOpen = /**
240
+ * @param {?} selectedQuery
241
+ * @return {?}
242
+ */
243
+ function (selectedQuery) {
244
+ var _this = this;
245
+ /** @type {?} */
246
+ var selectionText = this.rteObj.getSelectedHtml();
247
+ this.selectedQuery = selectedQuery;
248
+ if (selectionText) {
249
+ /** @type {?} */
250
+ var range = ((/** @type {?} */ (this.rteObj))).formatter.editorManager.nodeSelection.getRange(((/** @type {?} */ (this.rteObj))).contentModule.getDocument());
251
+ ((/** @type {?} */ (this.rteObj))).formatter.editorManager.nodeSelection.save(range, ((/** @type {?} */ (this.rteObj))).contentModule.getDocument());
252
+ this.dropValIndex = this.queryList.findIndex((/**
253
+ * @param {?} q
254
+ * @return {?}
255
+ */
256
+ function (q) { return q.text.toLowerCase() === selectedQuery.toLowerCase(); }));
257
+ this.queryCategory.index = this.dropValIndex;
258
+ this.leftRte.value = this.promptQuery = selectionText;
259
+ this.leftRte.refreshUI();
260
+ this.AIdialog.show();
261
+ this.updateAISugesstionsData(selectedQuery);
262
+ }
263
+ else {
264
+ this.showMsg = true;
265
+ setTimeout((/**
266
+ * @return {?}
267
+ */
268
+ function () {
269
+ _this.showMsg = false;
270
+ }), 3000);
271
+ console.log("Please select the content to perform the AI operation.");
272
+ }
273
+ };
274
+ /**
275
+ * @param {?} selectedQuery
276
+ * @return {?}
277
+ */
278
+ RichtexteditorComponent.prototype.updateAISugesstionsData = /**
279
+ * @param {?} selectedQuery
280
+ * @return {?}
281
+ */
282
+ function (selectedQuery) {
283
+ this.isSentimentCheck = false;
284
+ switch (selectedQuery) {
285
+ case "Summarize":
286
+ this.subQuery = "Summarize the upcoming sentence shortly.";
287
+ break;
288
+ case "Elaborate":
289
+ this.subQuery = "Elaborate on the upcoming sentence.";
290
+ break;
291
+ case "Rephrase":
292
+ this.subQuery = this.chipValue + " rephrase the upcoming sentence.";
293
+ break;
294
+ case "Correct Grammar":
295
+ this.subQuery = "Correct the grammar of the upcoming sentence.";
296
+ break;
297
+ case "Translate":
298
+ this.subQuery =
299
+ "Translate the upcoming sentence to " + this.translatelanguage + ".";
300
+ break;
301
+ case "Sentiment Analysis":
302
+ this.isSentimentCheck = true;
303
+ this.subQuery =
304
+ 'Analyze the sentiment and grammar of the following paragraphs and provide the expression score with an emoji followed by the sentiment in the format: "😊 Neutral". \n\nNOTE: Avoid any additional text or explanation:';
305
+ break;
306
+ }
307
+ this.updateAISugesstions();
308
+ };
309
+ /**
310
+ * @return {?}
311
+ */
312
+ RichtexteditorComponent.prototype.updateAISugesstions = /**
313
+ * @return {?}
314
+ */
315
+ function () {
316
+ var _this = this;
317
+ try {
318
+ if (this.promptQuery) {
319
+ ((/** @type {?} */ (document.getElementById("skeletonId")))).style.display =
320
+ "";
321
+ ((/** @type {?} */ (document.getElementById("rightRte")))).style.display =
322
+ "none";
323
+ this.sentimentButton.element.style.display = "none";
324
+ this.regenerateButton.disabled = true;
325
+ this.copyButton.disabled = true;
326
+ this.replaceButton.disabled = true;
327
+ this.apiResultData = this.getResponseFromOpenAI(this.subQuery, this.promptQuery);
328
+ this.apiResultData.then((/**
329
+ * @param {?} result
330
+ * @return {?}
331
+ */
332
+ function (result) {
333
+ _this.AIResult = _this.isSentimentCheck ? _this.promptQuery : result;
334
+ _this.sentimentButton.content = result
335
+ .toLowerCase()
336
+ .includes("positive")
337
+ ? "😊 Positive"
338
+ : result.toLowerCase().includes("negative")
339
+ ? "😞 Negative"
340
+ : "😐 Neutral";
341
+ _this.sentimentButton.element.style.display = !_this.isSentimentCheck
342
+ ? "none"
343
+ : "";
344
+ _this.rightRte.value = _this.AIResult;
345
+ /** @type {?} */
346
+ var noResultsFound = !(_this.AIResult || _this.promptQuery);
347
+ ((/** @type {?} */ (document.getElementById("no-results-found")))).style.display = noResultsFound ? "" : "none";
348
+ _this.regenerateButton.disabled = noResultsFound;
349
+ _this.copyButton.disabled = noResultsFound;
350
+ _this.replaceButton.disabled = noResultsFound;
351
+ ((/** @type {?} */ (document.getElementById("skeletonId")))).style.display =
352
+ "none";
353
+ ((/** @type {?} */ (document.getElementById("rightRte")))).style.display =
354
+ noResultsFound ? "none" : "";
355
+ console.log(noResultsFound, ((/** @type {?} */ (document.getElementById("rightRte")))).style);
356
+ // this.ref.markForCheck();
357
+ }));
358
+ }
359
+ }
360
+ catch (_a) {
361
+ // this.toastObj.show();
362
+ }
363
+ };
364
+ /**
365
+ * @param {?} subQuery
366
+ * @param {?} promptQuery
367
+ * @return {?}
368
+ */
369
+ RichtexteditorComponent.prototype.getResponseFromOpenAI = /**
370
+ * @param {?} subQuery
371
+ * @param {?} promptQuery
372
+ * @return {?}
373
+ */
374
+ function (subQuery, promptQuery) {
375
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
376
+ var content;
377
+ return tslib_1.__generator(this, function (_a) {
378
+ switch (_a.label) {
379
+ case 0: return [4 /*yield*/, OpenAiModelRTE(subQuery, promptQuery)];
380
+ case 1:
381
+ content = _a.sent();
382
+ return [2 /*return*/, content ? ((/** @type {?} */ (content))) : ""];
383
+ }
384
+ });
385
+ });
386
+ };
387
+ /**
388
+ * @return {?}
389
+ */
390
+ RichtexteditorComponent.prototype.dialogShow = /**
391
+ * @return {?}
392
+ */
393
+ function () {
394
+ var _this = this;
395
+ (/** @type {?} */ (this.regenerateButton)).element.addEventListener("click", (/**
396
+ * @return {?}
397
+ */
398
+ function () {
399
+ _this.updateAISugesstions();
400
+ }));
401
+ (/** @type {?} */ (this.copyButton)).element.addEventListener("click", (/**
402
+ * @return {?}
403
+ */
404
+ function () {
405
+ _this.copyTextToClipboard(_this.AIResult);
406
+ }));
407
+ (/** @type {?} */ (this.replaceButton)).element.addEventListener("click", (/**
408
+ * @return {?}
409
+ */
410
+ function () {
411
+ /** @type {?} */
412
+ var range = ((/** @type {?} */ (_this.rteObj))).formatter.editorManager.nodeSelection.getRange(((/** @type {?} */ (_this.rteObj))).contentModule.getDocument());
413
+ ((/** @type {?} */ (_this.rteObj))).formatter.editorManager.nodeSelection.restore(range);
414
+ ((/** @type {?} */ (_this.rteObj))).executeCommand("insertHTML", _this.AIResult, {
415
+ undo: true,
416
+ });
417
+ _this.closeDialog();
418
+ }));
419
+ ((/** @type {?} */ (this.AIdialog))).element.style.display = "";
420
+ };
421
+ /**
422
+ * @return {?}
423
+ */
424
+ RichtexteditorComponent.prototype.closeDialog = /**
425
+ * @return {?}
426
+ */
427
+ function () {
428
+ this.AIdialog.hide();
429
+ this.rightRte.value = "";
430
+ this.leftRte.value = "";
431
+ this.promptQuery = "";
432
+ this.chipValue = "Standard";
433
+ this.AIResult = "";
434
+ this.dropValIndex = 0;
435
+ this.selectedQuery = "Rephrase";
436
+ this.sentimentButton.content = "😊 Neutral";
437
+ };
438
+ /**
439
+ * @param {?} text
440
+ * @return {?}
441
+ */
442
+ RichtexteditorComponent.prototype.copyTextToClipboard = /**
443
+ * @param {?} text
444
+ * @return {?}
445
+ */
446
+ function (text) {
447
+ if (navigator.clipboard) {
448
+ navigator.clipboard
449
+ .writeText(text)
450
+ .then((/**
451
+ * @return {?}
452
+ */
453
+ function () {
454
+ console.log("Text copied to clipboard successfully!");
455
+ }))
456
+ .catch((/**
457
+ * @param {?} err
458
+ * @return {?}
459
+ */
460
+ function (err) {
461
+ console.error("Failed to copy text: ", err);
462
+ }));
463
+ }
464
+ else {
465
+ // Fallback for browsers that do not support the Clipboard API
466
+ /** @type {?} */
467
+ var textarea = document.createElement("textarea");
468
+ textarea.value = text;
469
+ document.body.appendChild(textarea);
470
+ textarea.select();
471
+ try {
472
+ document.execCommand("copy");
473
+ console.log("Text copied to clipboard using execCommand");
474
+ }
475
+ catch (err) {
476
+ console.error("Failed to copy text: ", err);
477
+ }
478
+ finally {
479
+ document.body.removeChild(textarea);
480
+ }
481
+ }
482
+ };
483
+ /**
484
+ * @return {?}
485
+ */
486
+ RichtexteditorComponent.prototype.onOverlayClick = /**
487
+ * @return {?}
488
+ */
489
+ function () {
490
+ /** @type {?} */
491
+ var activeEle = this.AIdialog.element.querySelector(".char_block.e-active");
492
+ if (activeEle) {
493
+ activeEle.classList.remove("e-active");
494
+ }
495
+ this.closeDialog();
496
+ };
497
+ /**
498
+ * @param {?} args
499
+ * @return {?}
500
+ */
501
+ RichtexteditorComponent.prototype.onQuerySelect = /**
502
+ * @param {?} args
503
+ * @return {?}
504
+ */
505
+ function (args) {
506
+ // this.chipList.selectedChips = 0;
507
+ this.translatelanguage = "EN";
508
+ this.selectedQuery = args.itemData.text;
509
+ this.updateAISugesstionsData(args.itemData.text);
510
+ };
511
+ /**
512
+ * @param {?} args
513
+ * @return {?}
514
+ */
515
+ RichtexteditorComponent.prototype.onLanguageSelect = /**
516
+ * @param {?} args
517
+ * @return {?}
518
+ */
519
+ function (args) {
520
+ this.translatelanguage = args.itemData.id;
521
+ this.updateAISugesstionsData("Translate");
522
+ };
523
+ /**
524
+ * @param {?} args
525
+ * @return {?}
526
+ */
527
+ RichtexteditorComponent.prototype.onChipClick = /**
528
+ * @param {?} args
529
+ * @return {?}
530
+ */
531
+ function (args) {
532
+ this.chipValue = args.itemData.text;
533
+ // 事件会触发两次 必须判断args.text是否有值
534
+ if (args.itemData.text)
535
+ this.updateAISugesstionsData("Rephrase");
536
+ };
537
+ /**
538
+ * @param {?} args
539
+ * @return {?}
540
+ */
541
+ RichtexteditorComponent.prototype._toolbarClick = /**
542
+ * @param {?} args
543
+ * @return {?}
544
+ */
545
+ function (args) {
546
+ this.toolbarClick.emit(args);
547
+ };
548
+ /**
549
+ * @return {?}
550
+ */
551
+ RichtexteditorComponent.prototype.hideToast = /**
552
+ * @return {?}
553
+ */
554
+ function () {
555
+ this.showMsg = false;
556
+ };
557
+ /**
558
+ * @return {?}
559
+ */
560
+ RichtexteditorComponent.prototype.onZoom = /**
561
+ * @return {?}
562
+ */
563
+ function () {
564
+ if (this.size === "largest") {
565
+ this.size = ""; // 恢复到原始大小
566
+ }
567
+ else {
568
+ this.size = "largest"; // 设置为最大化
569
+ }
570
+ };
571
+ RichtexteditorComponent.decorators = [
572
+ { type: Component, args: [{
573
+ selector: "rs-richtext-editor",
574
+ template: "<div class=\"editor_box\" id=\"container\">\r\n <ejs-richtexteditor\r\n #editor\r\n id=\"editor\"\r\n [height]=\"height\"\r\n [saveInterval]=\"0\"\r\n [autoSaveOnIdle]=\"autoSaveOnIdle\"\r\n [toolbarSettings]=\"tools\"\r\n [fontFamily]=\"family\"\r\n [insertImageSettings]=\"insertImageSettings\"\r\n [(value)]=\"value\"\r\n (change)=\"onContentChange($event)\"\r\n (created)=\"onCreate()\"\r\n (toolbarClick)=\"_toolbarClick($event)\"\r\n >\r\n </ejs-richtexteditor>\r\n <ejs-dialog\r\n #AIdialog\r\n id=\"AIdialog\"\r\n [ngClass]=\"size\"\r\n [visible]=\"false\"\r\n [target]=\"target\"\r\n [isModal]=\"true\"\r\n [height]=\"dialogHeight\"\r\n [width]=\"dialogWidth\"\r\n maxHeight=\"80%\"\r\n cssClass=\"e-rte-elements custom-dialog-rte\"\r\n zIndex=\"1000\"\r\n (close)=\"closeDialog()\"\r\n (overlayClick)=\"onOverlayClick()\"\r\n (open)=\"dialogShow()\"\r\n >\r\n <ng-template #header>\r\n <div class=\"header-title\">AI Assist</div>\r\n <div class=\"header-buttons\">\r\n <div *ngIf=\"showZoomBtn\" class=\"header-zoom\" (click)=\"onZoom()\">\r\n <img\r\n class=\"header-icon\"\r\n *ngIf=\"size === 'largest'\"\r\n src=\"../../../assets/img/dialog-shrink.svg\"\r\n />\r\n <img\r\n class=\"header-icon\"\r\n *ngIf=\"size !== 'largest'\"\r\n src=\"../../../assets/img/dialog-grow.svg\"\r\n />\r\n </div>\r\n <div class=\"header-btn\" (click)=\"closeDialog()\">\r\n <img class=\"header-icon\" src=\"../../../assets/img/dialog-close.svg\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #footerTemplate>\r\n <div id=\"dialog-footer-content\">\r\n <div class=\"custom-row-0\">\r\n <div\r\n class=\"cuscol-0\"\r\n style=\"width: 100%; align-items: center; justify-content: left\"\r\n ></div>\r\n <div\r\n class=\"cuscol-1\"\r\n style=\"\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n \"\r\n >\r\n <div style=\"text-align: right; width: 100%\">\r\n <button\r\n ejs-button\r\n #sentimentButton\r\n content=\"\uD83D\uDE0A Neutral\"\r\n disabled=\"false\"\r\n cssClass=\"sentiment\"\r\n ></button>\r\n <button\r\n ejs-button\r\n #copyButton\r\n content=\"Copy\"\r\n disabled=\"false\"\r\n class=\"copy-btn\"\r\n ></button>\r\n <button\r\n ejs-button\r\n #replaceButton\r\n content=\"Replace\"\r\n isPrimary=\"true\"\r\n disabled=\"false\"\r\n ></button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #content>\r\n <div class=\"dialog-content\" style=\"height: 100%\">\r\n <div class=\"custom-row-0\">\r\n <div class=\"cuscol-0\" style=\"width: 100%\">\r\n <ejs-dropdownlist\r\n #queryCategory\r\n style=\"width: 200px\"\r\n id=\"queryCategory\"\r\n [dataSource]=\"queryList\"\r\n index=\"0\"\r\n [fields]=\"{ text: 'text', value: 'id' }\"\r\n (select)=\"onQuerySelect($event)\"\r\n >\r\n Rephrase\r\n </ejs-dropdownlist>\r\n <ejs-dropdownlist\r\n *ngIf=\"selectedQuery == 'Rephrase'\"\r\n id=\"chips-container\"\r\n #chipList\r\n style=\"width: 160px\"\r\n [(ngModel)]=\"chipValue\"\r\n [dataSource]=\"rephraseTyleList\"\r\n [fields]=\"{ text: 'text', value: 'id' }\"\r\n (select)=\"onChipClick($event)\"\r\n >\r\n </ejs-dropdownlist>\r\n <ejs-dropdownlist\r\n *ngIf=\"selectedQuery == 'Translate'\"\r\n #languageCategory\r\n index=\"0\"\r\n id=\"language-Category\"\r\n [dataSource]=\"languageList\"\r\n [fields]=\"{ text: 'text', value: 'id' }\"\r\n (select)=\"onLanguageSelect($event)\"\r\n >\r\n </ejs-dropdownlist>\r\n </div>\r\n <div\r\n class=\"cuscol-1\"\r\n style=\"\r\n justify-content: space-between;\r\n align-items: center;\r\n width: 100%;\r\n \"\r\n >\r\n <!-- <ejs-chiplist\r\n id=\"chips-container\"\r\n #chipList\r\n [chips]=\"['Standard', 'Fluent', 'Professional']\"\r\n selection=\"Single\"\r\n cssClass=\"e-outline\"\r\n [selectedChips]=\"[0]\"\r\n (click)=\"onChipClick($event)\"\r\n >\r\n </ejs-chiplist> -->\r\n <button\r\n ejs-button\r\n #regenerateButton\r\n content=\"Regenerate\"\r\n isPrimary=\"true\"\r\n disabled=\"false\"\r\n ></button>\r\n </div>\r\n </div>\r\n <div class=\"custom-row-1\" style=\"height: calc(100% - 40px)\">\r\n <div\r\n class=\"cuscol-0\"\r\n style=\"\r\n width: 100%;\r\n height: 100%;\r\n align-items: center;\r\n justify-content: left;\r\n \"\r\n >\r\n <div style=\"text-align: left; height: 100%\">\r\n <ejs-richtexteditor\r\n #leftRte\r\n id=\"leftRte\"\r\n height=\"100%\"\r\n [toolbarSettings]=\"{ enable: false }\"\r\n placeholder=\"Analysis of AI Support\"\r\n cssClass=\"e-outline\"\r\n >\r\n </ejs-richtexteditor>\r\n </div>\r\n </div>\r\n <div\r\n class=\"cuscol-1\"\r\n style=\"\r\n display: flex;\r\n justify-content: space-between;\r\n width: 100%;\r\n height: 100%;\r\n \"\r\n >\r\n <div style=\"text-align: left; width: 100%; height: 100%\">\r\n <ejs-richtexteditor\r\n #rightRte\r\n id=\"rightRte\"\r\n height=\"100%\"\r\n [toolbarSettings]=\"{ enable: false }\"\r\n placeholder=\"Analysis of AI Support\"\r\n cssClass=\"e-outline\"\r\n >\r\n <!-- style=\"display: none\" -->\r\n </ejs-richtexteditor>\r\n <div\r\n class=\"no-results-found\"\r\n id=\"no-results-found\"\r\n style=\"display: none; height: 244px; align-content: center\"\r\n >\r\n <img\r\n height=\"50\"\r\n width=\"50\"\r\n src=\"https://storage.googleapis.com/cdn-bolddesk/agent-angular-app/images/light/no-records-warning.svg\"\r\n />\r\n <div>No results found</div>\r\n </div>\r\n <div id=\"skeletonId\" style=\"display: none\">\r\n <ejs-skeleton\r\n #skeletonId1\r\n shape=\"Rectangle\"\r\n height=\"20px\"\r\n width=\"100%\"\r\n ></ejs-skeleton\r\n ><br />\r\n <ejs-skeleton\r\n #skeletonId2\r\n shape=\"Rectangle\"\r\n height=\"20px\"\r\n width=\"90%\"\r\n ></ejs-skeleton\r\n ><br />\r\n <ejs-skeleton\r\n #skeletonId3\r\n shape=\"Rectangle\"\r\n height=\"20px\"\r\n width=\"70%\"\r\n ></ejs-skeleton\r\n ><br />\r\n <ejs-skeleton\r\n #skeletonId4\r\n shape=\"Rectangle\"\r\n height=\"20px\"\r\n width=\"50%\"\r\n ></ejs-skeleton\r\n ><br />\r\n <ejs-skeleton\r\n #skeletonId5\r\n shape=\"Rectangle\"\r\n height=\"20px\"\r\n width=\"30%\"\r\n ></ejs-skeleton\r\n ><br />\r\n <ejs-skeleton\r\n #skeletonId6\r\n shape=\"Rectangle\"\r\n height=\"20px\"\r\n width=\"10%\"\r\n ></ejs-skeleton\r\n ><br />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ejs-dialog>\r\n <div class=\"toast\" *ngIf=\"showMsg\">\r\n <span class=\"toast_text\">First, Select some text</span\r\n ><span class=\"close_icon\" (click)=\"hideToast()\"></span>\r\n </div>\r\n</div>\r\n",
575
+ styles: [".editor_box{position:relative;width:100%;height:100%}.editor_box .toast{position:absolute;left:35%;top:110px;z-index:1;width:400px;border-radius:4px;border:1px solid #e8f2ff;background:#f4f8ff;padding:4px 12px;color:#1f3f5c;font-size:12px;font-style:normal;font-weight:400;height:32px;font-family:Arial;display:flex;align-items:center;justify-content:space-between}.editor_box .toast .toast_text::before{content:url(../../assets/img/info.svg);display:inline-block;width:16px;height:16px;vertical-align:bottom;margin-right:8px}.editor_box .toast .close_icon{background-image:url(../../assets/img/notification-close.svg);cursor:pointer;display:inline-block;width:16px;height:16px}.custom-dialog-rte{padding:0 20px;border-radius:10px}.custom-row-0,.custom-row-1,.custom-row-2{display:flex;align-items:center;padding:12px 24px}.e-rte-dropdown-btn-text{padding-left:4px}.no-results-found{text-align:center}.no-results-found img{display:block;margin:0 auto}.e-custom{margin-right:.5rem;border-radius:25px!important}.custom-dialog-rte .skeleton-rectangle{border-radius:4px}@media (max-width:767px){.cuscol-0,.cuscol-1,.cuscol-2{justify-content:center!important}.custom-row-0,.custom-row-1,.custom-row-2{flex-direction:column!important}.cuscol-1{border-right:none!important}.cuscol-0{width:100%;align-items:center}::ng-deep:host .e-dialog{max-height:80%!important}.custom-dialog-rte .e-dialog .e-dlg-content{overflow-y:auto!important}.custom-dialog-rte .e-dialog .e-dlg-content .e-richtexteditor{height:100px!important}.cuscol-noresult{padding-bottom:20px!important}.e-chip-list{padding:5px!important}.cuscol{padding-right:.2rem!important;width:auto!important}.custom-row-1{height:auto!important}}.cuscol-1{display:flex;flex-direction:row!important}.cuscol-2{display:flex;flex-direction:column!important}.sentiment{color:#000!important}.custom-dialog-rte .e-dialog .e-dlg-content{padding:0!important;overflow-y:hidden}.custom-dialog-rte .e-dialog .e-dlg-header-content{padding:20px 0!important;border:0!important}.custom-dialog-rte .e-dialog .e-dlg-header-content .e-dlg-header{display:flex;align-items:center;line-height:18px;justify-content:space-between}.custom-dialog-rte .e-dialog .e-dlg-header-content .e-dlg-header .header-title{font-family:Arial;font-size:15px;font-weight:700;font-style:normal}.custom-dialog-rte .e-dialog .e-dlg-header-content .header-buttons{display:flex}.custom-dialog-rte .e-dialog .e-dlg-header-content .header-buttons img{width:16px;height:16px;cursor:pointer;padding:2px;margin-left:12px}.custom-dialog-rte .e-dialog .e-footer-content{padding:0!important}.custom-dialog-rte .e-dialog .e-dlg-content .e-richtexteditor.e-rte-tb-expand .e-rte-content,.e-richtexteditor.e-rte-tb-expand .e-source-content{border:0;border-bottom:1px solid #dee2e6;border-top:0 solid #dee2e6!important}.custom-dialog-rte .dialog-content .custom-row-0{border-top:0 solid #ddd!important;padding:0;margin-bottom:12px}.custom-dialog-rte .dialog-content .custom-row-0 .cuscol-0{justify-content:left;border-right:none!important;padding:0;display:flex;gap:12px}.custom-dialog-rte .dialog-content .custom-row-0 .cuscol-1{padding:0;margin-left:12px}.custom-dialog-rte .dialog-content .custom-row-0 .cuscol-1 .e-primary{color:#44566c;border-radius:4px;border:1px solid #dbe1e7;background:#fff;width:87px;margin:0;padding:2px 12px;font-family:Arial;font-size:12px;font-style:normal;font-weight:400;line-height:14px;height:28px}.custom-dialog-rte .dialog-content .custom-row-1{padding:0;height:calc(100% - 40px);gap:12px}.custom-dialog-rte .e-footer-content{border:0}.custom-dialog-rte .e-footer-content .custom-row-0{padding:20px 0}.custom-dialog-rte .e-footer-content .e-control.e-btn{font-family:Arial;font-size:12px;line-height:14px;padding:2px 12px;height:28px;background:#fff;color:#44566c}.custom-dialog-rte .e-footer-content .e-control.e-btn.copy-btn{border-color:#dbe1e7}.custom-dialog-rte .e-footer-content .e-control.e-btn.copy-btn::before{content:url(../../assets/img/editor-copy.svg);vertical-align:middle;margin-right:6px}.custom-dialog-rte .e-footer-content .e-control.e-btn.e-primary{color:#fff;background:#1364b3}.editor_box .e-dialog.largest{width:96vw!important;height:88vh!important;max-height:88vh;max-width:2100px}"]
576
+ }] }
577
+ ];
578
+ /** @nocollapse */
579
+ RichtexteditorComponent.ctorParameters = function () { return [
580
+ { type: ChangeDetectorRef }
581
+ ]; };
582
+ RichtexteditorComponent.propDecorators = {
583
+ rteObj: [{ type: ViewChild, args: ["editor", { static: false },] }],
584
+ queryCategory: [{ type: ViewChild, args: ["queryCategory", { static: false },] }],
585
+ leftRte: [{ type: ViewChild, args: ["leftRte", { static: false },] }],
586
+ rightRte: [{ type: ViewChild, args: ["rightRte", { static: false },] }],
587
+ AIdialog: [{ type: ViewChild, args: ["AIdialog", { static: true },] }],
588
+ sentimentButton: [{ type: ViewChild, args: ["sentimentButton", { static: false },] }],
589
+ regenerateButton: [{ type: ViewChild, args: ["regenerateButton", { static: false },] }],
590
+ copyButton: [{ type: ViewChild, args: ["copyButton", { static: false },] }],
591
+ replaceButton: [{ type: ViewChild, args: ["replaceButton", { static: false },] }],
592
+ placeholder: [{ type: Input }],
593
+ value: [{ type: Input }],
594
+ height: [{ type: Input }],
595
+ autoSaveOnIdle: [{ type: Input }],
596
+ target: [{ type: Input }],
597
+ toolbarClick: [{ type: Output }],
598
+ change: [{ type: Output }]
599
+ };
600
+ return RichtexteditorComponent;
601
+ }());
602
+ export { RichtexteditorComponent };
603
+ if (false) {
604
+ /** @type {?} */
605
+ RichtexteditorComponent.prototype.rteObj;
606
+ /** @type {?} */
607
+ RichtexteditorComponent.prototype.queryCategory;
608
+ /** @type {?} */
609
+ RichtexteditorComponent.prototype.leftRte;
610
+ /** @type {?} */
611
+ RichtexteditorComponent.prototype.rightRte;
612
+ /** @type {?} */
613
+ RichtexteditorComponent.prototype.AIdialog;
614
+ /** @type {?} */
615
+ RichtexteditorComponent.prototype.sentimentButton;
616
+ /** @type {?} */
617
+ RichtexteditorComponent.prototype.regenerateButton;
618
+ /** @type {?} */
619
+ RichtexteditorComponent.prototype.copyButton;
620
+ /** @type {?} */
621
+ RichtexteditorComponent.prototype.replaceButton;
622
+ /** @type {?} */
623
+ RichtexteditorComponent.prototype.placeholder;
624
+ /** @type {?} */
625
+ RichtexteditorComponent.prototype.value;
626
+ /** @type {?} */
627
+ RichtexteditorComponent.prototype.height;
628
+ /** @type {?} */
629
+ RichtexteditorComponent.prototype.autoSaveOnIdle;
630
+ /** @type {?} */
631
+ RichtexteditorComponent.prototype.target;
632
+ /** @type {?} */
633
+ RichtexteditorComponent.prototype.toolbarClick;
634
+ /** @type {?} */
635
+ RichtexteditorComponent.prototype.change;
636
+ /** @type {?} */
637
+ RichtexteditorComponent.prototype.family;
638
+ /** @type {?} */
639
+ RichtexteditorComponent.prototype.dialogWidth;
640
+ /** @type {?} */
641
+ RichtexteditorComponent.prototype.dialogHeight;
642
+ /** @type {?} */
643
+ RichtexteditorComponent.prototype.showZoomBtn;
644
+ /** @type {?} */
645
+ RichtexteditorComponent.prototype.showMsg;
646
+ /** @type {?} */
647
+ RichtexteditorComponent.prototype.insertImageSettings;
648
+ /** @type {?} */
649
+ RichtexteditorComponent.prototype.editorManager;
650
+ /** @type {?} */
651
+ RichtexteditorComponent.prototype.size;
652
+ /** @type {?} */
653
+ RichtexteditorComponent.prototype.selectedQuery;
654
+ /** @type {?} */
655
+ RichtexteditorComponent.prototype.dropValIndex;
656
+ /** @type {?} */
657
+ RichtexteditorComponent.prototype.queryList;
658
+ /** @type {?} */
659
+ RichtexteditorComponent.prototype.rephraseTyleList;
660
+ /** @type {?} */
661
+ RichtexteditorComponent.prototype.languageList;
662
+ /** @type {?} */
663
+ RichtexteditorComponent.prototype.promptQuery;
664
+ /** @type {?} */
665
+ RichtexteditorComponent.prototype.isSentimentCheck;
666
+ /** @type {?} */
667
+ RichtexteditorComponent.prototype.subQuery;
668
+ /** @type {?} */
669
+ RichtexteditorComponent.prototype.translatelanguage;
670
+ /** @type {?} */
671
+ RichtexteditorComponent.prototype.chipValue;
672
+ /** @type {?} */
673
+ RichtexteditorComponent.prototype.apiResultData;
674
+ /** @type {?} */
675
+ RichtexteditorComponent.prototype.AIResult;
676
+ /** @type {?} */
677
+ RichtexteditorComponent.prototype.tools;
678
+ /**
679
+ * @type {?}
680
+ * @private
681
+ */
682
+ RichtexteditorComponent.prototype.ref;
683
+ }
684
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL3JpY2h0ZXh0ZWRpdG9yL2luZGV4LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNqQixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUNMLHVCQUF1QixHQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBSWpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0M7SUF5SUUsaUNBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1COztRQTlHakMsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLFdBQU0sR0FBRyxHQUFHLENBQUM7UUFDYixtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixXQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsY0FBYzs7UUFFcEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOztRQUd0QyxXQUFNLEdBQUcsVUFBVSxDQUFD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QyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzhCQUk1QyxLQUFLO3dCQUNMLEtBQUs7eUJBQ0wsS0FBSztpQ0FDTCxLQUFLO3lCQUNMLEtBQUs7K0JBRUwsTUFBTTt5QkFDTixNQUFNOztJQWdZVCw4QkFBQztDQUFBLEFBbGFELElBa2FDO1NBM1pZLHVCQUF1Qjs7O0lBQ2xDLHlDQUN1Qzs7SUFDdkMsZ0RBQzZDOztJQUM3QywwQ0FDeUM7O0lBQ3pDLDJDQUMwQzs7SUFDMUMsMkNBQTJFOztJQUMzRSxrREFDeUM7O0lBQ3pDLG1EQUMwQzs7SUFDMUMsNkNBQ29DOztJQUNwQyxnREFDdUM7O0lBR3ZDLDhDQUEwQjs7SUFDMUIsd0NBQW9COztJQUNwQix5Q0FBc0I7O0lBQ3RCLGlEQUErQjs7SUFDL0IseUNBQStCOztJQUUvQiwrQ0FBNEM7O0lBQzVDLHlDQUFzQzs7SUFHdEMseUNBQW9COztJQUNwQiw4Q0FBc0I7O0lBQ3RCLCtDQUF1Qjs7SUFDdkIsOENBQW1COztJQUNuQiwwQ0FBZ0I7O0lBQ2hCLHNEQUlFOztJQUNGLGdEQUFtQjs7SUFDbkIsdUNBQVU7O0lBQ1YsZ0RBQWM7O0lBQ2QsK0NBQXdCOztJQUN4Qiw0Q0FPRTs7SUFDRixtREFJRTs7SUFDRiwrQ0FnQkU7O0lBQ0YsOENBQXdCOztJQUN4QixtREFBeUM7O0lBQ3pDLDJDQUFxQjs7SUFDckIsb0RBQWtDOztJQUNsQyw0Q0FBOEI7O0lBQzlCLGdEQUEwQjs7SUFDMUIsMkNBQXlCOztJQUN6Qix3Q0ErQ0U7Ozs7O0lBRVUsc0NBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IERyb3BEb3duTGlzdENvbXBvbmVudCB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYW5ndWxhci1kcm9wZG93bnNcIjtcclxuaW1wb3J0IHtcclxuICBSaWNoVGV4dEVkaXRvckNvbXBvbmVudCxcclxuICBUb29sYmFyU2V0dGluZ3NNb2RlbCxcclxufSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWFuZ3VsYXItcmljaHRleHRlZGl0b3JcIjtcclxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1hbmd1bGFyLWJ1dHRvbnNcIjtcclxuaW1wb3J0IHsgRHJvcERvd25CdXR0b24gfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWFuZ3VsYXItc3BsaXRidXR0b25zXCI7XHJcbmltcG9ydCB7IERpYWxvZ0NvbXBvbmVudCB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYW5ndWxhci1wb3B1cHNcIjtcclxuLy8gc2VydmljZVxyXG4vLyBpbXBvcnQgeyBQYkZ1blNlcnZpY2UgfSBmcm9tIFwiQGFwcC9zZXJ2aWNlcy9wYi1mdW4uc2VydmljZVwiO1xyXG4vLyBpbXBvcnQgeyBTaGFyZWRTeW5jZnVzaW9uTW9kdWxlIH0gZnJvbSBcIkBhcHAvbW9kdWxlL3N5bmNmdXNpb25Nb2R1bGVcIjtcclxuaW1wb3J0IHsgT3BlbkFpTW9kZWxSVEUgfSBmcm9tIFwiLi9vcGVuYXBpXCI7XHJcbmltcG9ydCB7IGxpbmVIZWlnaHRfaXRlbXMgfSBmcm9tIFwiLi9kYXRhLWNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBmb250RmFtaWx5IH0gZnJvbSBcIi4vZGF0YS1jb25maWdcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcInJzLXJpY2h0ZXh0LWVkaXRvclwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vaW5kZXguY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vaW5kZXguY29tcG9uZW50LnNjc3NcIl0sXHJcbiAgLy8gc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAvLyBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTaGFyZWRTeW5jZnVzaW9uTW9kdWxlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJpY2h0ZXh0ZWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKFwiZWRpdG9yXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyBydGVPYmo6IFJpY2hUZXh0RWRpdG9yQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJxdWVyeUNhdGVnb3J5XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyBxdWVyeUNhdGVnb3J5ITogRHJvcERvd25MaXN0Q29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJsZWZ0UnRlXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyBsZWZ0UnRlITogUmljaFRleHRFZGl0b3JDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInJpZ2h0UnRlXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyByaWdodFJ0ZSE6IFJpY2hUZXh0RWRpdG9yQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJBSWRpYWxvZ1wiLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgQUlkaWFsb2chOiBEaWFsb2dDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInNlbnRpbWVudEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBwdWJsaWMgc2VudGltZW50QnV0dG9uITogQnV0dG9uQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJyZWdlbmVyYXRlQnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyByZWdlbmVyYXRlQnV0dG9uITogQnV0dG9uQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJjb3B5QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyBjb3B5QnV0dG9uITogQnV0dG9uQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJyZXBsYWNlQnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyByZXBsYWNlQnV0dG9uITogQnV0dG9uQ29tcG9uZW50O1xyXG4gIC8vIEBWaWV3Q2hpbGQoXCJjaGlwTGlzdFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGNoaXBMaXN0ITogQ2hpcExpc3RDb21wb25lbnQ7XHJcblxyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gXCJcIjtcclxuICBASW5wdXQoKSB2YWx1ZSA9IFwiXCI7XHJcbiAgQElucHV0KCkgaGVpZ2h0ID0gMTUwO1xyXG4gIEBJbnB1dCgpIGF1dG9TYXZlT25JZGxlID0gdHJ1ZTtcclxuICBASW5wdXQoKSB0YXJnZXQgPSBcIiNjb250YWluZXJcIjsgLy8gZGlhbG9nIOW8ueeql+eItue6p1xyXG5cclxuICBAT3V0cHV0KCkgdG9vbGJhckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgLy8gQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgZmFtaWx5ID0gZm9udEZhbWlseTtcclxuICBkaWFsb2dXaWR0aCA9IFwiODAwcHhcIjtcclxuICBkaWFsb2dIZWlnaHQgPSBcIjY0MnB4XCI7XHJcbiAgc2hvd1pvb21CdG4gPSB0cnVlO1xyXG4gIHNob3dNc2cgPSBmYWxzZTtcclxuICBpbnNlcnRJbWFnZVNldHRpbmdzID0ge1xyXG4gICAgc2F2ZUZvcm1hdDogXCJCbG9iXCIsXHJcbiAgICBhbGxvd2VkVHlwZXM6IFtcIi5zdmdcIiwgXCIucG5nXCJdLFxyXG4gICAgZGlzcGxheTogXCJub25lXCIsXHJcbiAgfTtcclxuICBlZGl0b3JNYW5hZ2VyOiBhbnk7XHJcbiAgc2l6ZSA9IFwiXCI7XHJcbiAgc2VsZWN0ZWRRdWVyeTtcclxuICBwdWJsaWMgZHJvcFZhbEluZGV4ID0gMDtcclxuICBwdWJsaWMgcXVlcnlMaXN0OiB7IGlkOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXHJcbiAgICB7IGlkOiBcIlJlcGhyYXNlXCIsIHRleHQ6IFwiUmVwaHJhc2VcIiB9LFxyXG4gICAgeyBpZDogXCJHcmFtbWFyXCIsIHRleHQ6IFwiQ29ycmVjdCBHcmFtbWFyXCIgfSxcclxuICAgIHsgaWQ6IFwiU3VtbWFyaXplXCIsIHRleHQ6IFwiU3VtbWFyaXplXCIgfSxcclxuICAgIHsgaWQ6IFwiRWxhYm9yYXRlXCIsIHRleHQ6IFwiRWxhYm9yYXRlXCIgfSxcclxuICAgIHsgaWQ6IFwiVHJhbnNsYXRlXCIsIHRleHQ6IFwiVHJhbnNsYXRlXCIgfSxcclxuICAgIHsgaWQ6IFwiU2VudGltZW50QW5hbHlzaXNcIiwgdGV4dDogXCJTZW50aW1lbnQgQW5hbHlzaXNcIiB9LFxyXG4gIF07XHJcbiAgcHVibGljIHJlcGhyYXNlVHlsZUxpc3QgPSBbXHJcbiAgICB7IHRleHQ6IFwiU3RhbmRhcmRcIiwgaWQ6IFwiU3RhbmRhcmRcIiB9LFxyXG4gICAgeyB0ZXh0OiBcIkZsdWVudFwiLCBpZDogXCJGbHVlbnRcIiB9LFxyXG4gICAgeyB0ZXh0OiBcIlByb2Zlc3Npb25hbFwiLCBpZDogXCJQcm9mZXNzaW9uYWxcIiB9LFxyXG4gIF07XHJcbiAgcHVibGljIGxhbmd1YWdlTGlzdDogeyBpZDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW1xyXG4gICAgeyBpZDogXCJFTlwiLCB0ZXh0OiBcIkVuZ2xpc2hcIiB9LFxyXG4gICAgeyBpZDogXCJaSFwiLCB0ZXh0OiBcIkNoaW5lc2UgKFNpbXBsaWZpZWQpXCIgfSxcclxuICAgIHsgaWQ6IFwiRVNcIiwgdGV4dDogXCJTcGFuaXNoXCIgfSxcclxuICAgIHsgaWQ6IFwiWkhUXCIsIHRleHQ6IFwiQ2hpbmVzZSAoVHJhZGl0aW9uYWwpXCIgfSxcclxuICAgIHsgaWQ6IFwiSElcIiwgdGV4dDogXCJIaW5kaVwiIH0sXHJcbiAgICB7IGlkOiBcIkFSXCIsIHRleHQ6IFwiQXJhYmljXCIgfSxcclxuICAgIHsgaWQ6IFwiQk5cIiwgdGV4dDogXCJCZW5nYWxpXCIgfSxcclxuICAgIHsgaWQ6IFwiUFRcIiwgdGV4dDogXCJQb3J0dWd1ZXNlXCIgfSxcclxuICAgIHsgaWQ6IFwiUlVcIiwgdGV4dDogXCJSdXNzaWFuXCIgfSxcclxuICAgIHsgaWQ6IFwiSkFcIiwgdGV4dDogXCJKYXBhbmVzZVwiIH0sXHJcbiAgICB7IGlkOiBcIkRFXCIsIHRleHQ6IFwiR2VybWFuXCIgfSxcclxuICAgIHsgaWQ6IFwiS09cIiwgdGV4dDogXCJLb3JlYW5cIiB9LFxyXG4gICAgeyBpZDogXCJGUlwiLCB0ZXh0OiBcIkZyZW5jaFwiIH0sXHJcbiAgICB7IGlkOiBcIklUXCIsIHRleHQ6IFwiSXRhbGlhblwiIH0sXHJcbiAgICB7IGlkOiBcIlRSXCIsIHRleHQ6IFwiVHVya2lzaFwiIH0sXHJcbiAgXTtcclxuICBwdWJsaWMgcHJvbXB0UXVlcnkgPSBcIlwiO1xyXG4gIHB1YmxpYyBpc1NlbnRpbWVudENoZWNrOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHN1YlF1ZXJ5ID0gXCJcIjtcclxuICBwdWJsaWMgdHJhbnNsYXRlbGFuZ3VhZ2UhOiBzdHJpbmc7XHJcbiAgcHVibGljIGNoaXBWYWx1ZSA9IFwiU3RhbmRhcmRcIjtcclxuICBwdWJsaWMgYXBpUmVzdWx0RGF0YTogYW55O1xyXG4gIHB1YmxpYyBBSVJlc3VsdCE6IHN0cmluZztcclxuICB0b29sczogVG9vbGJhclNldHRpbmdzTW9kZWwgPSB7XHJcbiAgICBlbmFibGVGbG9hdGluZzogZmFsc2UsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgdG9vbHRpcFRleHQ6IFwiQUkgQXNzaXN0XCIsXHJcbiAgICAgICAgdGVtcGxhdGU6XHJcbiAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz1cImUtdGJhci1idG4gZS1idG5cIiB0YWJpbmRleD1cIi0xXCIgaWQ9XCJhaV9hc3Npc3RhbnRfYnV0dG9uX3RiYXJcIiBzdHlsZT1cIndpZHRoOjEwMCVcIj48ZGl2IGNsYXNzPVwiZS1ydGUtZHJvcGRvd24tYnRuLXRleHRcIj5BSSBBc3Npc3Q8L2Rpdj48L2J1dHRvbj4nLFxyXG4gICAgICB9LFxyXG4gICAgICBcIkJvbGRcIixcclxuICAgICAgXCJJdGFsaWNcIixcclxuICAgICAgXCJVbmRlcmxpbmVcIixcclxuICAgICAgXCJTdHJpa2VUaHJvdWdoXCIsXHJcbiAgICAgIFwiRm9udE5hbWVcIixcclxuICAgICAgXCJGb250U2l6ZVwiLFxyXG4gICAgICBcIkZvbnRDb2xvclwiLFxyXG4gICAgICBcIkJhY2tncm91bmRDb2xvclwiLFxyXG4gICAgICBcIkxvd2VyQ2FzZVwiLFxyXG4gICAgICBcIlVwcGVyQ2FzZVwiLFxyXG4gICAgICBcInxcIixcclxuICAgICAgXCJDcmVhdGVUYWJsZVwiLFxyXG4gICAgICBcIkZvcm1hdHNcIixcclxuICAgICAgXCJBbGlnbm1lbnRzXCIsXHJcbiAgICAgIHtcclxuICAgICAgICB0b29sdGlwVGV4dDogXCJMaW5lIEhlaWdodFwiLFxyXG4gICAgICAgIHRlbXBsYXRlOlxyXG4gICAgICAgICAgJzxidXR0b24gY2xhc3M9XCJlLXRiYXItYnRuIGUtYnRuXCIgdGFiaW5kZXg9XCItMVwiIGlkPVwibGluZWhlaWdodF90YmFyXCIgIHN0eWxlPVwid2lkdGg6MTAwJVwiPjwvYnV0dG9uPicsXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiT3JkZXJlZExpc3RcIixcclxuICAgICAgXCJVbm9yZGVyZWRMaXN0XCIsXHJcbiAgICAgIFwiT3V0ZGVudFwiLFxyXG4gICAgICBcIkluZGVudFwiLFxyXG4gICAgICBcInxcIixcclxuICAgICAgXCJDcmVhdGVMaW5rXCIsXHJcbiAgICAgIHtcclxuICAgICAgICB0b29sdGlwVGV4dDogXCJcIixcclxuICAgICAgICB0ZW1wbGF0ZTpcclxuICAgICAgICAgICc8YnV0dG9uIGNsYXNzPVwiZS10YmFyLWJ0biBlLWJ0blwiIHRhYmluZGV4PVwiLTFcIiBpZD1cImN1c3RvbV90YmFyXCIgIHN0eWxlPVwid2lkdGg6MTAwJVwiPicgK1xyXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJlLXRiYXItYnRuLXRleHRcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7XCI+PGltZyBzcmM9XCIvYXNzZXRzL2ltZy9maWxlLWljb24uc3ZnXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7dG9wOiAtMnB4O1wiLz48ZGl2IGNsYXNzPVwidXBsb2FkQWN0aW9uc1wiPjxkaXYgaWQ9XCJ1cGxvYWRGcm9tVXNlclwiPkNvbXB1dGVyIEZpbGU8L2Rpdj48ZGl2IGlkPVwicmVsYXRpb25Eb21cIj5UaWNrZXQgQXR0YWNobWVudDwvZGl2PjwvZGl2PjwvZGl2PjwvYnV0dG9uPicsXHJcbiAgICAgIH0sXHJcbiAgICAgIFwifFwiLFxyXG4gICAgICBcIkZvcm1hdFBhaW50ZXJcIixcclxuICAgICAgXCJDbGVhckZvcm1hdFwiLFxyXG4gICAgICBcInxcIixcclxuICAgICAgXCJVbmRvXCIsXHJcbiAgICAgIFwiUmVkb1wiLFxyXG4gICAgICAvLydTb3VyY2VDb2RlJyxcclxuICAgIF0sXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gIG9uQ29udGVudENoYW5nZShhcmdzKSB7XHJcbiAgICBjb25zdCB0YWJsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwidGFibGUuZS1ydGUtdGFibGVcIik7XHJcbiAgICB0YWJsZXMuZm9yRWFjaCgodGFibGUpID0+IHtcclxuICAgICAgY29uc3QgaHRtbFRhYmxlID0gdGFibGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgaHRtbFRhYmxlLnN0eWxlLm1hcmdpbkJvdHRvbSA9IFwiMTBweFwiO1xyXG4gICAgICBodG1sVGFibGUuc3R5bGUuYm9yZGVyQ29sbGFwc2UgPSBcImNvbGxhcHNlXCI7XHJcbiAgICAgIGh0bWxUYWJsZS5zdHlsZS5lbXB0eUNlbGxzID0gXCJzaG93XCI7XHJcbiAgICAgIGNvbnN0IHRkRWxlbWVudHMgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGRcIik7XHJcbiAgICAgIHRkRWxlbWVudHMuZm9yRWFjaCgodGQpID0+IHtcclxuICAgICAgICB0ZC5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjYWRiNWJkXCI7XHJcbiAgICAgICAgdGQuc3R5bGUuaGVpZ2h0ID0gXCIyMHB4XCI7XHJcbiAgICAgICAgdGQuc3R5bGUubWluV2lkdGggPSBcIjIwcHhcIjtcclxuICAgICAgICB0ZC5zdHlsZS5wYWRkaW5nID0gXCIycHggNXB4XCI7XHJcbiAgICAgICAgdGQuc3R5bGUuYm94U2l6aW5nID0gXCJib3JkZXItYm94XCI7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ3JlYXRlKCk6IHZvaWQge1xyXG4gICAgLy9iaW5kIHRoZSBhIGNsaWNrIGV2ZW50XHJcbiAgICAvLyBsZXQgZWRpdG9yQ29udGVudCA9IHRoaXMucnRlT2JqLmNvbnRlbnRNb2R1bGUuZ2V0RWRpdFBhbmVsKCkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyBlZGl0b3JDb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5PbkNsaWNrZWQuYmluZCh0aGlzKSk7XHJcbiAgICAvL2FkZCB0aGUgbGluZSBoZWlnaHRcclxuICAgIHRoaXMuZWRpdG9yTWFuYWdlciA9IHRoaXMucnRlT2JqLmZvcm1hdHRlci5lZGl0b3JNYW5hZ2VyO1xyXG4gICAgbGV0IHNwbGl0QnV0dG9uID0gbmV3IERyb3BEb3duQnV0dG9uKHtcclxuICAgICAgaXRlbXM6IGxpbmVIZWlnaHRfaXRlbXMsXHJcbiAgICAgIGljb25Dc3M6IFwiZS1pY29ucyBlLWxpbmUtc3BhY2luZ1wiLFxyXG4gICAgICBzZWxlY3Q6IHRoaXMub25TZWxlY3QuYmluZCh0aGlzKSxcclxuICAgIH0pO1xyXG4gICAgc3BsaXRCdXR0b24uYXBwZW5kVG8oXCIjbGluZWhlaWdodF90YmFyXCIpO1xyXG4gICAgLy8gYWkgYXNzaXN0XHJcbiAgICBsZXQgYWlhc3Npc3RhbnRCdXR0b24gPSBuZXcgRHJvcERvd25CdXR0b24oe1xyXG4gICAgICBpdGVtczogdGhpcy5xdWVyeUxpc3QsXHJcbiAgICAgIC8vIGljb25Dc3M6IFwiZS1idG4taWNvbiBlLWljb25zIGUtYXNzaXN0dmlldy1pY29uIGUtaWNvbi1sZWZ0XCIsXHJcbiAgICAgIHNlbGVjdDogKGFyZ3MpID0+IHRoaXMuYWlRdWVyeVNlbGVjdGVkTWVudShhcmdzKSxcclxuICAgIH0pO1xyXG4gICAgYWlhc3Npc3RhbnRCdXR0b24uYXBwZW5kVG8oXCIjYWlfYXNzaXN0YW50X2J1dHRvbl90YmFyXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblNlbGVjdChhcmdzKSB7XHJcbiAgICBpZiAodGhpcy5ydGVPYmouZm9ybWF0dGVyLmdldFVuZG9SZWRvU3RhY2soKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5ydGVPYmouZm9ybWF0dGVyLnNhdmVEYXRhKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgbm9kZXM6IE5vZGVbXSA9IHRoaXMuZWRpdG9yTWFuYWdlci5kb21Ob2RlLmJsb2NrTm9kZXMoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IG5vZGVzLmxlbmd0aCA+IGk7IGkrKykge1xyXG4gICAgICAobm9kZXNbaV0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmxpbmVIZWlnaHQgPSBhcmdzLml0ZW0udGV4dDtcclxuICAgIH1cclxuICAgIHRoaXMucnRlT2JqLmZvcm1hdHRlci5zYXZlRGF0YSgpO1xyXG4gICAgdGhpcy5ydGVPYmouZm9ybWF0dGVyLmVuYWJsZVVuZG8odGhpcy5ydGVPYmopO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhaVF1ZXJ5U2VsZWN0ZWRNZW51KGFyZ3M6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5kaWFsb2d1ZU9wZW4oYXJncy5pdGVtLnRleHQpO1xyXG4gIH1cclxuXHJcbiAgZGlhbG9ndWVPcGVuKHNlbGVjdGVkUXVlcnk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdmFyIHNlbGVjdGlvblRleHQgPSB0aGlzLnJ0ZU9iai5nZXRTZWxlY3RlZEh0bWwoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRRdWVyeSA9IHNlbGVjdGVkUXVlcnk7XHJcbiAgICBpZiAoc2VsZWN0aW9uVGV4dCkge1xyXG4gICAgICBsZXQgcmFuZ2U6IFJhbmdlID0gKFxyXG4gICAgICAgIHRoaXMucnRlT2JqIGFzIGFueVxyXG4gICAgICApLmZvcm1hdHRlci5lZGl0b3JNYW5hZ2VyLm5vZGVTZWxlY3Rpb24uZ2V0UmFuZ2UoXHJcbiAgICAgICAgKHRoaXMucnRlT2JqIGFzIGFueSkuY29udGVudE1vZHVsZS5nZXREb2N1bWVudCgpXHJcbiAgICAgICk7XHJcbiAgICAgICh0aGlzLnJ0ZU9iaiBhcyBhbnkpLmZvcm1hdHRlci5lZGl0b3JNYW5hZ2VyLm5vZGVTZWxlY3Rpb24uc2F2ZShcclxuICAgICAgICByYW5nZSxcclxuICAgICAgICAodGhpcy5ydGVPYmogYXMgYW55KS5jb250ZW50TW9kdWxlLmdldERvY3VtZW50KClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5kcm9wVmFsSW5kZXggPSB0aGlzLnF1ZXJ5TGlzdC5maW5kSW5kZXgoXHJcbiAgICAgICAgKHEpID0+IHEudGV4dC50b0xvd2VyQ2FzZSgpID09PSBzZWxlY3RlZFF1ZXJ5LnRvTG93ZXJDYXNlKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5xdWVyeUNhdGVnb3J5LmluZGV4ID0gdGhpcy5kcm9wVmFsSW5kZXg7XHJcbiAgICAgIHRoaXMubGVmdFJ0ZS52YWx1ZSA9IHRoaXMucHJvbXB0UXVlcnkgPSBzZWxlY3Rpb25UZXh0O1xyXG4gICAgICB0aGlzLmxlZnRSdGUucmVmcmVzaFVJKCk7XHJcbiAgICAgIHRoaXMuQUlkaWFsb2cuc2hvdygpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUFJU3VnZXNzdGlvbnNEYXRhKHNlbGVjdGVkUXVlcnkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93TXNnID0gdHJ1ZTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93TXNnID0gZmFsc2U7XHJcbiAgICAgIH0sIDMwMDApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSBzZWxlY3QgdGhlIGNvbnRlbnQgdG8gcGVyZm9ybSB0aGUgQUkgb3BlcmF0aW9uLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUFJU3VnZXNzdGlvbnNEYXRhKHNlbGVjdGVkUXVlcnk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1NlbnRpbWVudENoZWNrID0gZmFsc2U7XHJcbiAgICBzd2l0Y2ggKHNlbGVjdGVkUXVlcnkpIHtcclxuICAgICAgY2FzZSBcIlN1bW1hcml6ZVwiOlxyXG4gICAgICAgIHRoaXMuc3ViUXVlcnkgPSBcIlN1bW1hcml6ZSB0aGUgdXBjb21pbmcgc2VudGVuY2Ugc2hvcnRseS5cIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIkVsYWJvcmF0ZVwiOlxyXG4gICAgICAgIHRoaXMuc3ViUXVlcnkgPSBcIkVsYWJvcmF0ZSBvbiB0aGUgdXBjb21pbmcgc2VudGVuY2UuXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJSZXBocmFzZVwiOlxyXG4gICAgICAgIHRoaXMuc3ViUXVlcnkgPSB0aGlzLmNoaXBWYWx1ZSArIFwiIHJlcGhyYXNlIHRoZSB1cGNvbWluZyBzZW50ZW5jZS5cIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIkNvcnJlY3QgR3JhbW1hclwiOlxyXG4gICAgICAgIHRoaXMuc3ViUXVlcnkgPSBcIkNvcnJlY3QgdGhlIGdyYW1tYXIgb2YgdGhlIHVwY29taW5nIHNlbnRlbmNlLlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiVHJhbnNsYXRlXCI6XHJcbiAgICAgICAgdGhpcy5zdWJRdWVyeSA9XHJcbiAgICAgICAgICBcIlRyYW5zbGF0ZSB0aGUgdXBjb21pbmcgc2VudGVuY2UgdG8gXCIgKyB0aGlzLnRyYW5zbGF0ZWxhbmd1YWdlICsgXCIuXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJTZW50aW1lbnQgQW5hbHlzaXNcIjpcclxuICAgICAgICB0aGlzLmlzU2VudGltZW50Q2hlY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3ViUXVlcnkgPVxyXG4gICAgICAgICAgJ0FuYWx5emUgdGhlIHNlbnRpbWVudCBhbmQgZ3JhbW1hciBvZiB0aGUgZm9sbG93aW5nIHBhcmFncmFwaHMgYW5kIHByb3ZpZGUgdGhlIGV4cHJlc3Npb24gc2NvcmUgd2l0aCBhbiBlbW9qaSBmb2xsb3dlZCBieSB0aGUgc2VudGltZW50IGluIHRoZSBmb3JtYXQ6IFwi8J+YiiBOZXV0cmFsXCIuIFxcblxcbk5PVEU6IEF2b2lkIGFueSBhZGRpdGlvbmFsIHRleHQgb3IgZXhwbGFuYXRpb246JztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlQUlTdWdlc3N0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQUlTdWdlc3N0aW9ucygpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnByb21wdFF1ZXJ5KSB7XHJcbiAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2tlbGV0b25JZFwiKSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZGlzcGxheSA9XHJcbiAgICAgICAgICBcIlwiO1xyXG4gICAgICAgIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJpZ2h0UnRlXCIpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID1cclxuICAgICAgICAgIFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuc2VudGltZW50QnV0dG9uLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMucmVnZW5lcmF0ZUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb3B5QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlcGxhY2VCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYXBpUmVzdWx0RGF0YSA9IHRoaXMuZ2V0UmVzcG9uc2VGcm9tT3BlbkFJKFxyXG4gICAgICAgICAgdGhpcy5zdWJRdWVyeSxcclxuICAgICAgICAgIHRoaXMucHJvbXB0UXVlcnlcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuYXBpUmVzdWx0RGF0YS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5BSVJlc3VsdCA9IHRoaXMuaXNTZW50aW1lbnRDaGVjayA/IHRoaXMucHJvbXB0UXVlcnkgOiByZXN1bHQ7XHJcbiAgICAgICAgICB0aGlzLnNlbnRpbWVudEJ1dHRvbi5jb250ZW50ID0gcmVzdWx0XHJcbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgIC5pbmNsdWRlcyhcInBvc2l0aXZlXCIpXHJcbiAgICAgICAgICAgID8gXCLwn5iKIFBvc2l0aXZlXCJcclxuICAgICAgICAgICAgOiByZXN1bHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcIm5lZ2F0aXZlXCIpXHJcbiAgICAgICAgICAgID8gXCLwn5ieIE5lZ2F0aXZlXCJcclxuICAgICAgICAgICAgOiBcIvCfmJAgTmV1dHJhbFwiO1xyXG4gICAgICAgICAgdGhpcy5zZW50aW1lbnRCdXR0b24uZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gIXRoaXMuaXNTZW50aW1lbnRDaGVja1xyXG4gICAgICAgICAgICA/IFwibm9uZVwiXHJcbiAgICAgICAgICAgIDogXCJcIjtcclxuICAgICAgICAgIHRoaXMucmlnaHRSdGUudmFsdWUgPSB0aGlzLkFJUmVzdWx0O1xyXG4gICAgICAgICAgdmFyIG5vUmVzdWx0c0ZvdW5kID0gISh0aGlzLkFJUmVzdWx0IHx8IHRoaXMucHJvbXB0UXVlcnkpO1xyXG4gICAgICAgICAgKFxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5vLXJlc3VsdHMtZm91bmRcIikgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgICAgICkuc3R5bGUuZGlzcGxheSA9IG5vUmVzdWx0c0ZvdW5kID8gXCJcIiA6IFwibm9uZVwiO1xyXG4gICAgICAgICAgdGhpcy5yZWdlbmVyYXRlQnV0dG9uLmRpc2FibGVkID0gbm9SZXN1bHRzRm91bmQ7XHJcbiAgICAgICAgICB0aGlzLmNvcHlCdXR0b24uZGlzYWJsZWQgPSBub1Jlc3VsdHNGb3VuZDtcclxuICAgICAgICAgIHRoaXMucmVwbGFjZUJ1dHRvbi5kaXNhYmxlZCA9IG5vUmVzdWx0c0ZvdW5kO1xyXG4gICAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2tlbGV0b25JZFwiKSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZGlzcGxheSA9XHJcbiAgICAgICAgICAgIFwibm9uZVwiO1xyXG4gICAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRSdGVcIikgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPVxyXG4gICAgICAgICAgICBub1Jlc3VsdHNGb3VuZCA/IFwibm9uZVwiIDogXCJcIjtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICBub1Jlc3VsdHNGb3VuZCxcclxuICAgICAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRSdGVcIikgYXMgSFRNTEVsZW1lbnQpLnN0eWxlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgLy8gdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyB0aGlzLnRvYXN0T2JqLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFJlc3BvbnNlRnJvbU9wZW5BSShcclxuICAgIHN1YlF1ZXJ5OiBzdHJpbmcsXHJcbiAgICBwcm9tcHRRdWVyeTogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBPcGVuQWlNb2RlbFJURShzdWJRdWVyeSwgcHJvbXB0UXVlcnkpO1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgPyAoY29udGVudCBhcyBzdHJpbmcpIDogXCJcIjtcclxuICB9XHJcblxyXG4gIGRpYWxvZ1Nob3coKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZ2VuZXJhdGVCdXR0b24hLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVBSVN1Z2Vzc3Rpb25zKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY29weUJ1dHRvbiEuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvcHlUZXh0VG9DbGlwYm9hcmQodGhpcy5BSVJlc3VsdCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVwbGFjZUJ1dHRvbiEuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICBsZXQgcmFuZ2U6IFJhbmdlID0gKFxyXG4gICAgICAgIHRoaXMucnRlT2JqIGFzIGFueVxyXG4gICAgICApLmZvcm1hdHRlci5lZGl0b3JNYW5hZ2VyLm5vZGVTZWxlY3Rpb24uZ2V0UmFuZ2UoXHJcbiAgICAgICAgKHRoaXMucnRlT2JqIGFzIGFueSkuY29udGVudE1vZHVsZS5nZXREb2N1bWVudCgpXHJcbiAgICAgICk7XHJcbiAgICAgICh0aGlzLnJ0ZU9iaiBhcyBhbnkpLmZvcm1hdHRlci5lZGl0b3JNYW5hZ2VyLm5vZGVTZWxlY3Rpb24ucmVzdG9yZShyYW5nZSk7XHJcbiAgICAgICh0aGlzLnJ0ZU9iaiBhcyBhbnkpLmV4ZWN1dGVDb21tYW5kKFwiaW5zZXJ0SFRNTFwiLCB0aGlzLkFJUmVzdWx0LCB7XHJcbiAgICAgICAgdW5kbzogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY2xvc2VEaWFsb2coKTtcclxuICAgIH0pO1xyXG4gICAgKHRoaXMuQUlkaWFsb2cgYXMgRGlhbG9nQ29tcG9uZW50KS5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VEaWFsb2coKTogdm9pZCB7XHJcbiAgICB0aGlzLkFJZGlhbG9nLmhpZGUoKTtcclxuICAgIHRoaXMucmlnaHRSdGUudmFsdWUgPSBcIlwiO1xyXG4gICAgdGhpcy5sZWZ0UnRlLnZhbHVlID0gXCJcIjtcclxuICAgIHRoaXMucHJvbXB0UXVlcnkgPSBcIlwiO1xyXG4gICAgdGhpcy5jaGlwVmFsdWUgPSBcIlN0YW5kYXJkXCI7XHJcbiAgICB0aGlzLkFJUmVzdWx0ID0gXCJcIjtcclxuICAgIHRoaXMuZHJvcFZhbEluZGV4ID0gMDtcclxuICAgIHRoaXMuc2VsZWN0ZWRRdWVyeSA9IFwiUmVwaHJhc2VcIjtcclxuICAgIHRoaXMuc2VudGltZW50QnV0dG9uLmNvbnRlbnQgPSBcIvCfmIogTmV1dHJhbFwiO1xyXG4gIH1cclxuXHJcbiAgY29weVRleHRUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7XHJcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmRcclxuICAgICAgICAud3JpdGVUZXh0KHRleHQpXHJcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJUZXh0IGNvcGllZCB0byBjbGlwYm9hcmQgc3VjY2Vzc2Z1bGx5IVwiKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNvcHkgdGV4dDogXCIsIGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBGYWxsYmFjayBmb3IgYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgQ2xpcGJvYXJkIEFQSVxyXG4gICAgICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcclxuICAgICAgdGV4dGFyZWEudmFsdWUgPSB0ZXh0O1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcclxuICAgICAgdGV4dGFyZWEuc2VsZWN0KCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVGV4dCBjb3BpZWQgdG8gY2xpcGJvYXJkIHVzaW5nIGV4ZWNDb21tYW5kXCIpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNvcHkgdGV4dDogXCIsIGVycik7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0YXJlYSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uT3ZlcmxheUNsaWNrKCk6IHZvaWQge1xyXG4gICAgbGV0IGFjdGl2ZUVsZTogSFRNTEVsZW1lbnQgfCBudWxsID0gdGhpcy5BSWRpYWxvZy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgIFwiLmNoYXJfYmxvY2suZS1hY3RpdmVcIlxyXG4gICAgKTtcclxuICAgIGlmIChhY3RpdmVFbGUpIHtcclxuICAgICAgYWN0aXZlRWxlLmNsYXNzTGlzdC5yZW1vdmUoXCJlLWFjdGl2ZVwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xvc2VEaWFsb2coKTtcclxuICB9XHJcblxyXG4gIG9uUXVlcnlTZWxlY3QoYXJncykge1xyXG4gICAgLy8gdGhpcy5jaGlwTGlzdC5zZWxlY3RlZENoaXBzID0gMDtcclxuICAgIHRoaXMudHJhbnNsYXRlbGFuZ3VhZ2UgPSBcIkVOXCI7XHJcbiAgICB0aGlzLnNlbGVjdGVkUXVlcnkgPSBhcmdzLml0ZW1EYXRhLnRleHQ7XHJcbiAgICB0aGlzLnVwZGF0ZUFJU3VnZXNzdGlvbnNEYXRhKGFyZ3MuaXRlbURhdGEudGV4dCk7XHJcbiAgfVxyXG5cclxuICBvbkxhbmd1YWdlU2VsZWN0KGFyZ3M6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy50cmFuc2xhdGVsYW5ndWFnZSA9IGFyZ3MuaXRlbURhdGEuaWQ7XHJcbiAgICB0aGlzLnVwZGF0ZUFJU3VnZXNzdGlvbnNEYXRhKFwiVHJhbnNsYXRlXCIpO1xyXG4gIH1cclxuXHJcbiAgb25DaGlwQ2xpY2soYXJnczogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmNoaXBWYWx1ZSA9IGFyZ3MuaXRlbURhdGEudGV4dDtcclxuICAgIC8vIOS6i+S7tuS8muinpuWPkeS4pOasoSDlv4XpobvliKTmlq1hcmdzLnRleHTmmK/lkKbmnInlgLxcclxuICAgIGlmIChhcmdzLml0ZW1EYXRhLnRleHQpIHRoaXMudXBkYXRlQUlTdWdlc3N0aW9uc0RhdGEoXCJSZXBocmFzZVwiKTtcclxuICB9XHJcblxyXG4gIF90b29sYmFyQ2xpY2soYXJncykge1xyXG4gICAgdGhpcy50b29sYmFyQ2xpY2suZW1pdChhcmdzKTtcclxuICB9XHJcblxyXG4gIGhpZGVUb2FzdCgpIHtcclxuICAgIHRoaXMuc2hvd01zZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25ab29tKCkge1xyXG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gXCJsYXJnZXN0XCIpIHtcclxuICAgICAgdGhpcy5zaXplID0gXCJcIjsgLy8g5oGi5aSN5Yiw5Y6f5aeL5aSn5bCPXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNpemUgPSBcImxhcmdlc3RcIjsgLy8g6K6+572u5Li65pyA5aSn5YyWXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==