raise-common-lib 0.0.191 → 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 (38) hide show
  1. package/bundles/raise-common-lib.umd.js +1241 -8
  2. package/bundles/raise-common-lib.umd.js.map +1 -1
  3. package/bundles/raise-common-lib.umd.min.js +1 -1
  4. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  5. package/esm2015/lib/common-grid/index.component.js +2 -2
  6. package/esm2015/lib/form/drawer-form/drawer-form.component.js +6 -3
  7. package/esm2015/lib/form/richtexteditor/ai-config.js +70 -0
  8. package/esm2015/lib/form/richtexteditor/data-config.js +273 -0
  9. package/esm2015/lib/form/richtexteditor/index.component.js +604 -0
  10. package/esm2015/lib/form/richtexteditor/openapi.js +175 -0
  11. package/esm2015/lib/layout/page-tab/index.component.js +6 -2
  12. package/esm2015/lib/raise-common-lib.module.js +7 -2
  13. package/esm2015/public-api.js +2 -1
  14. package/esm2015/raise-common-lib.js +2 -2
  15. package/esm5/lib/common-grid/index.component.js +2 -2
  16. package/esm5/lib/form/drawer-form/drawer-form.component.js +6 -3
  17. package/esm5/lib/form/richtexteditor/ai-config.js +73 -0
  18. package/esm5/lib/form/richtexteditor/data-config.js +273 -0
  19. package/esm5/lib/form/richtexteditor/index.component.js +684 -0
  20. package/esm5/lib/form/richtexteditor/openapi.js +208 -0
  21. package/esm5/lib/layout/page-tab/index.component.js +6 -2
  22. package/esm5/lib/raise-common-lib.module.js +7 -2
  23. package/esm5/public-api.js +2 -1
  24. package/esm5/raise-common-lib.js +2 -2
  25. package/fesm2015/raise-common-lib.js +1127 -10
  26. package/fesm2015/raise-common-lib.js.map +1 -1
  27. package/fesm5/raise-common-lib.js +1242 -10
  28. package/fesm5/raise-common-lib.js.map +1 -1
  29. package/lib/form/richtexteditor/ai-config.d.ts +10 -0
  30. package/lib/form/richtexteditor/data-config.d.ts +14 -0
  31. package/lib/form/richtexteditor/index.component.d.ts +78 -0
  32. package/lib/form/richtexteditor/openapi.d.ts +3 -0
  33. package/lib/layout/page-tab/index.component.d.ts +1 -0
  34. package/package.json +1 -1
  35. package/public-api.d.ts +1 -0
  36. package/raise-common-lib.metadata.json +1 -1
  37. package/src/assets/img/editor-copy.svg +5 -0
  38. package/src/assets/img/info.svg +5 -0
@@ -0,0 +1,604 @@
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
+ export class RichtexteditorComponent {
20
+ /**
21
+ * @param {?} ref
22
+ */
23
+ constructor(ref) {
24
+ this.ref = ref;
25
+ // @ViewChild("chipList", { static: false }) public chipList!: ChipListComponent;
26
+ this.placeholder = "";
27
+ this.value = "";
28
+ this.height = 150;
29
+ this.autoSaveOnIdle = true;
30
+ this.target = "#container"; // dialog 弹窗父级
31
+ // dialog 弹窗父级
32
+ this.toolbarClick = new EventEmitter();
33
+ this.change = new EventEmitter();
34
+ // @Output() change = new EventEmitter();
35
+ this.family = fontFamily;
36
+ this.dialogWidth = "800px";
37
+ this.dialogHeight = "642px";
38
+ this.showZoomBtn = true;
39
+ this.showMsg = false;
40
+ this.insertImageSettings = {
41
+ saveFormat: "Blob",
42
+ allowedTypes: [".svg", ".png"],
43
+ display: "none",
44
+ };
45
+ this.size = "";
46
+ this.dropValIndex = 0;
47
+ this.queryList = [
48
+ { id: "Rephrase", text: "Rephrase" },
49
+ { id: "Grammar", text: "Correct Grammar" },
50
+ { id: "Summarize", text: "Summarize" },
51
+ { id: "Elaborate", text: "Elaborate" },
52
+ { id: "Translate", text: "Translate" },
53
+ { id: "SentimentAnalysis", text: "Sentiment Analysis" },
54
+ ];
55
+ this.rephraseTyleList = [
56
+ { text: "Standard", id: "Standard" },
57
+ { text: "Fluent", id: "Fluent" },
58
+ { text: "Professional", id: "Professional" },
59
+ ];
60
+ this.languageList = [
61
+ { id: "EN", text: "English" },
62
+ { id: "ZH", text: "Chinese (Simplified)" },
63
+ { id: "ES", text: "Spanish" },
64
+ { id: "ZHT", text: "Chinese (Traditional)" },
65
+ { id: "HI", text: "Hindi" },
66
+ { id: "AR", text: "Arabic" },
67
+ { id: "BN", text: "Bengali" },
68
+ { id: "PT", text: "Portuguese" },
69
+ { id: "RU", text: "Russian" },
70
+ { id: "JA", text: "Japanese" },
71
+ { id: "DE", text: "German" },
72
+ { id: "KO", text: "Korean" },
73
+ { id: "FR", text: "French" },
74
+ { id: "IT", text: "Italian" },
75
+ { id: "TR", text: "Turkish" },
76
+ ];
77
+ this.promptQuery = "";
78
+ this.isSentimentCheck = false;
79
+ this.subQuery = "";
80
+ this.chipValue = "Standard";
81
+ this.tools = {
82
+ enableFloating: false,
83
+ items: [
84
+ {
85
+ tooltipText: "AI Assist",
86
+ 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>',
87
+ },
88
+ "Bold",
89
+ "Italic",
90
+ "Underline",
91
+ "StrikeThrough",
92
+ "FontName",
93
+ "FontSize",
94
+ "FontColor",
95
+ "BackgroundColor",
96
+ "LowerCase",
97
+ "UpperCase",
98
+ "|",
99
+ "CreateTable",
100
+ "Formats",
101
+ "Alignments",
102
+ {
103
+ tooltipText: "Line Height",
104
+ template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="lineheight_tbar" style="width:100%"></button>',
105
+ },
106
+ "OrderedList",
107
+ "UnorderedList",
108
+ "Outdent",
109
+ "Indent",
110
+ "|",
111
+ "CreateLink",
112
+ {
113
+ tooltipText: "",
114
+ template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="custom_tbar" style="width:100%">' +
115
+ '<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>',
116
+ },
117
+ "|",
118
+ "FormatPainter",
119
+ "ClearFormat",
120
+ "|",
121
+ "Undo",
122
+ "Redo",
123
+ ],
124
+ };
125
+ }
126
+ /**
127
+ * @return {?}
128
+ */
129
+ ngOnInit() { }
130
+ /**
131
+ * @param {?} args
132
+ * @return {?}
133
+ */
134
+ onContentChange(args) {
135
+ /** @type {?} */
136
+ const tables = document.querySelectorAll("table.e-rte-table");
137
+ tables.forEach((/**
138
+ * @param {?} table
139
+ * @return {?}
140
+ */
141
+ (table) => {
142
+ /** @type {?} */
143
+ const htmlTable = (/** @type {?} */ (table));
144
+ htmlTable.style.marginBottom = "10px";
145
+ htmlTable.style.borderCollapse = "collapse";
146
+ htmlTable.style.emptyCells = "show";
147
+ /** @type {?} */
148
+ const tdElements = table.querySelectorAll("td");
149
+ tdElements.forEach((/**
150
+ * @param {?} td
151
+ * @return {?}
152
+ */
153
+ (td) => {
154
+ td.style.border = "1px solid #adb5bd";
155
+ td.style.height = "20px";
156
+ td.style.minWidth = "20px";
157
+ td.style.padding = "2px 5px";
158
+ td.style.boxSizing = "border-box";
159
+ }));
160
+ }));
161
+ this.change.emit(args);
162
+ }
163
+ /**
164
+ * @return {?}
165
+ */
166
+ onCreate() {
167
+ //bind the a click event
168
+ // let editorContent = this.rteObj.contentModule.getEditPanel() as HTMLElement;
169
+ // editorContent.addEventListener('click', this.OnClicked.bind(this));
170
+ //add the line height
171
+ this.editorManager = this.rteObj.formatter.editorManager;
172
+ /** @type {?} */
173
+ let splitButton = new DropDownButton({
174
+ items: lineHeight_items,
175
+ iconCss: "e-icons e-line-spacing",
176
+ select: this.onSelect.bind(this),
177
+ });
178
+ splitButton.appendTo("#lineheight_tbar");
179
+ // ai assist
180
+ /** @type {?} */
181
+ let aiassistantButton = new DropDownButton({
182
+ items: this.queryList,
183
+ // iconCss: "e-btn-icon e-icons e-assistview-icon e-icon-left",
184
+ select: (/**
185
+ * @param {?} args
186
+ * @return {?}
187
+ */
188
+ (args) => this.aiQuerySelectedMenu(args)),
189
+ });
190
+ aiassistantButton.appendTo("#ai_assistant_button_tbar");
191
+ }
192
+ /**
193
+ * @private
194
+ * @param {?} args
195
+ * @return {?}
196
+ */
197
+ onSelect(args) {
198
+ if (this.rteObj.formatter.getUndoRedoStack().length === 0) {
199
+ this.rteObj.formatter.saveData();
200
+ }
201
+ /** @type {?} */
202
+ let nodes = this.editorManager.domNode.blockNodes();
203
+ for (let i = 0; nodes.length > i; i++) {
204
+ ((/** @type {?} */ (nodes[i]))).style.lineHeight = args.item.text;
205
+ }
206
+ this.rteObj.formatter.saveData();
207
+ this.rteObj.formatter.enableUndo(this.rteObj);
208
+ }
209
+ /**
210
+ * @private
211
+ * @param {?} args
212
+ * @return {?}
213
+ */
214
+ aiQuerySelectedMenu(args) {
215
+ this.dialogueOpen(args.item.text);
216
+ }
217
+ /**
218
+ * @param {?} selectedQuery
219
+ * @return {?}
220
+ */
221
+ dialogueOpen(selectedQuery) {
222
+ /** @type {?} */
223
+ var selectionText = this.rteObj.getSelectedHtml();
224
+ this.selectedQuery = selectedQuery;
225
+ if (selectionText) {
226
+ /** @type {?} */
227
+ let range = ((/** @type {?} */ (this.rteObj))).formatter.editorManager.nodeSelection.getRange(((/** @type {?} */ (this.rteObj))).contentModule.getDocument());
228
+ ((/** @type {?} */ (this.rteObj))).formatter.editorManager.nodeSelection.save(range, ((/** @type {?} */ (this.rteObj))).contentModule.getDocument());
229
+ this.dropValIndex = this.queryList.findIndex((/**
230
+ * @param {?} q
231
+ * @return {?}
232
+ */
233
+ (q) => q.text.toLowerCase() === selectedQuery.toLowerCase()));
234
+ this.queryCategory.index = this.dropValIndex;
235
+ this.leftRte.value = this.promptQuery = selectionText;
236
+ this.leftRte.refreshUI();
237
+ this.AIdialog.show();
238
+ this.updateAISugesstionsData(selectedQuery);
239
+ }
240
+ else {
241
+ this.showMsg = true;
242
+ setTimeout((/**
243
+ * @return {?}
244
+ */
245
+ () => {
246
+ this.showMsg = false;
247
+ }), 3000);
248
+ console.log("Please select the content to perform the AI operation.");
249
+ }
250
+ }
251
+ /**
252
+ * @param {?} selectedQuery
253
+ * @return {?}
254
+ */
255
+ updateAISugesstionsData(selectedQuery) {
256
+ this.isSentimentCheck = false;
257
+ switch (selectedQuery) {
258
+ case "Summarize":
259
+ this.subQuery = "Summarize the upcoming sentence shortly.";
260
+ break;
261
+ case "Elaborate":
262
+ this.subQuery = "Elaborate on the upcoming sentence.";
263
+ break;
264
+ case "Rephrase":
265
+ this.subQuery = this.chipValue + " rephrase the upcoming sentence.";
266
+ break;
267
+ case "Correct Grammar":
268
+ this.subQuery = "Correct the grammar of the upcoming sentence.";
269
+ break;
270
+ case "Translate":
271
+ this.subQuery =
272
+ "Translate the upcoming sentence to " + this.translatelanguage + ".";
273
+ break;
274
+ case "Sentiment Analysis":
275
+ this.isSentimentCheck = true;
276
+ this.subQuery =
277
+ '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:';
278
+ break;
279
+ }
280
+ this.updateAISugesstions();
281
+ }
282
+ /**
283
+ * @return {?}
284
+ */
285
+ updateAISugesstions() {
286
+ try {
287
+ if (this.promptQuery) {
288
+ ((/** @type {?} */ (document.getElementById("skeletonId")))).style.display =
289
+ "";
290
+ ((/** @type {?} */ (document.getElementById("rightRte")))).style.display =
291
+ "none";
292
+ this.sentimentButton.element.style.display = "none";
293
+ this.regenerateButton.disabled = true;
294
+ this.copyButton.disabled = true;
295
+ this.replaceButton.disabled = true;
296
+ this.apiResultData = this.getResponseFromOpenAI(this.subQuery, this.promptQuery);
297
+ this.apiResultData.then((/**
298
+ * @param {?} result
299
+ * @return {?}
300
+ */
301
+ (result) => {
302
+ this.AIResult = this.isSentimentCheck ? this.promptQuery : result;
303
+ this.sentimentButton.content = result
304
+ .toLowerCase()
305
+ .includes("positive")
306
+ ? "😊 Positive"
307
+ : result.toLowerCase().includes("negative")
308
+ ? "😞 Negative"
309
+ : "😐 Neutral";
310
+ this.sentimentButton.element.style.display = !this.isSentimentCheck
311
+ ? "none"
312
+ : "";
313
+ this.rightRte.value = this.AIResult;
314
+ /** @type {?} */
315
+ var noResultsFound = !(this.AIResult || this.promptQuery);
316
+ ((/** @type {?} */ (document.getElementById("no-results-found")))).style.display = noResultsFound ? "" : "none";
317
+ this.regenerateButton.disabled = noResultsFound;
318
+ this.copyButton.disabled = noResultsFound;
319
+ this.replaceButton.disabled = noResultsFound;
320
+ ((/** @type {?} */ (document.getElementById("skeletonId")))).style.display =
321
+ "none";
322
+ ((/** @type {?} */ (document.getElementById("rightRte")))).style.display =
323
+ noResultsFound ? "none" : "";
324
+ console.log(noResultsFound, ((/** @type {?} */ (document.getElementById("rightRte")))).style);
325
+ // this.ref.markForCheck();
326
+ }));
327
+ }
328
+ }
329
+ catch (_a) {
330
+ // this.toastObj.show();
331
+ }
332
+ }
333
+ /**
334
+ * @param {?} subQuery
335
+ * @param {?} promptQuery
336
+ * @return {?}
337
+ */
338
+ getResponseFromOpenAI(subQuery, promptQuery) {
339
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
340
+ /** @type {?} */
341
+ const content = yield OpenAiModelRTE(subQuery, promptQuery);
342
+ return content ? ((/** @type {?} */ (content))) : "";
343
+ });
344
+ }
345
+ /**
346
+ * @return {?}
347
+ */
348
+ dialogShow() {
349
+ (/** @type {?} */ (this.regenerateButton)).element.addEventListener("click", (/**
350
+ * @return {?}
351
+ */
352
+ () => {
353
+ this.updateAISugesstions();
354
+ }));
355
+ (/** @type {?} */ (this.copyButton)).element.addEventListener("click", (/**
356
+ * @return {?}
357
+ */
358
+ () => {
359
+ this.copyTextToClipboard(this.AIResult);
360
+ }));
361
+ (/** @type {?} */ (this.replaceButton)).element.addEventListener("click", (/**
362
+ * @return {?}
363
+ */
364
+ () => {
365
+ /** @type {?} */
366
+ let range = ((/** @type {?} */ (this.rteObj))).formatter.editorManager.nodeSelection.getRange(((/** @type {?} */ (this.rteObj))).contentModule.getDocument());
367
+ ((/** @type {?} */ (this.rteObj))).formatter.editorManager.nodeSelection.restore(range);
368
+ ((/** @type {?} */ (this.rteObj))).executeCommand("insertHTML", this.AIResult, {
369
+ undo: true,
370
+ });
371
+ this.closeDialog();
372
+ }));
373
+ ((/** @type {?} */ (this.AIdialog))).element.style.display = "";
374
+ }
375
+ /**
376
+ * @return {?}
377
+ */
378
+ closeDialog() {
379
+ this.AIdialog.hide();
380
+ this.rightRte.value = "";
381
+ this.leftRte.value = "";
382
+ this.promptQuery = "";
383
+ this.chipValue = "Standard";
384
+ this.AIResult = "";
385
+ this.dropValIndex = 0;
386
+ this.selectedQuery = "Rephrase";
387
+ this.sentimentButton.content = "😊 Neutral";
388
+ }
389
+ /**
390
+ * @param {?} text
391
+ * @return {?}
392
+ */
393
+ copyTextToClipboard(text) {
394
+ if (navigator.clipboard) {
395
+ navigator.clipboard
396
+ .writeText(text)
397
+ .then((/**
398
+ * @return {?}
399
+ */
400
+ () => {
401
+ console.log("Text copied to clipboard successfully!");
402
+ }))
403
+ .catch((/**
404
+ * @param {?} err
405
+ * @return {?}
406
+ */
407
+ (err) => {
408
+ console.error("Failed to copy text: ", err);
409
+ }));
410
+ }
411
+ else {
412
+ // Fallback for browsers that do not support the Clipboard API
413
+ /** @type {?} */
414
+ const textarea = document.createElement("textarea");
415
+ textarea.value = text;
416
+ document.body.appendChild(textarea);
417
+ textarea.select();
418
+ try {
419
+ document.execCommand("copy");
420
+ console.log("Text copied to clipboard using execCommand");
421
+ }
422
+ catch (err) {
423
+ console.error("Failed to copy text: ", err);
424
+ }
425
+ finally {
426
+ document.body.removeChild(textarea);
427
+ }
428
+ }
429
+ }
430
+ /**
431
+ * @return {?}
432
+ */
433
+ onOverlayClick() {
434
+ /** @type {?} */
435
+ let activeEle = this.AIdialog.element.querySelector(".char_block.e-active");
436
+ if (activeEle) {
437
+ activeEle.classList.remove("e-active");
438
+ }
439
+ this.closeDialog();
440
+ }
441
+ /**
442
+ * @param {?} args
443
+ * @return {?}
444
+ */
445
+ onQuerySelect(args) {
446
+ // this.chipList.selectedChips = 0;
447
+ this.translatelanguage = "EN";
448
+ this.selectedQuery = args.itemData.text;
449
+ this.updateAISugesstionsData(args.itemData.text);
450
+ }
451
+ /**
452
+ * @param {?} args
453
+ * @return {?}
454
+ */
455
+ onLanguageSelect(args) {
456
+ this.translatelanguage = args.itemData.id;
457
+ this.updateAISugesstionsData("Translate");
458
+ }
459
+ /**
460
+ * @param {?} args
461
+ * @return {?}
462
+ */
463
+ onChipClick(args) {
464
+ this.chipValue = args.itemData.text;
465
+ // 事件会触发两次 必须判断args.text是否有值
466
+ if (args.itemData.text)
467
+ this.updateAISugesstionsData("Rephrase");
468
+ }
469
+ /**
470
+ * @param {?} args
471
+ * @return {?}
472
+ */
473
+ _toolbarClick(args) {
474
+ this.toolbarClick.emit(args);
475
+ }
476
+ /**
477
+ * @return {?}
478
+ */
479
+ hideToast() {
480
+ this.showMsg = false;
481
+ }
482
+ /**
483
+ * @return {?}
484
+ */
485
+ onZoom() {
486
+ if (this.size === "largest") {
487
+ this.size = ""; // 恢复到原始大小
488
+ }
489
+ else {
490
+ this.size = "largest"; // 设置为最大化
491
+ }
492
+ }
493
+ }
494
+ RichtexteditorComponent.decorators = [
495
+ { type: Component, args: [{
496
+ selector: "rs-richtext-editor",
497
+ 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",
498
+ 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}"]
499
+ }] }
500
+ ];
501
+ /** @nocollapse */
502
+ RichtexteditorComponent.ctorParameters = () => [
503
+ { type: ChangeDetectorRef }
504
+ ];
505
+ RichtexteditorComponent.propDecorators = {
506
+ rteObj: [{ type: ViewChild, args: ["editor", { static: false },] }],
507
+ queryCategory: [{ type: ViewChild, args: ["queryCategory", { static: false },] }],
508
+ leftRte: [{ type: ViewChild, args: ["leftRte", { static: false },] }],
509
+ rightRte: [{ type: ViewChild, args: ["rightRte", { static: false },] }],
510
+ AIdialog: [{ type: ViewChild, args: ["AIdialog", { static: true },] }],
511
+ sentimentButton: [{ type: ViewChild, args: ["sentimentButton", { static: false },] }],
512
+ regenerateButton: [{ type: ViewChild, args: ["regenerateButton", { static: false },] }],
513
+ copyButton: [{ type: ViewChild, args: ["copyButton", { static: false },] }],
514
+ replaceButton: [{ type: ViewChild, args: ["replaceButton", { static: false },] }],
515
+ placeholder: [{ type: Input }],
516
+ value: [{ type: Input }],
517
+ height: [{ type: Input }],
518
+ autoSaveOnIdle: [{ type: Input }],
519
+ target: [{ type: Input }],
520
+ toolbarClick: [{ type: Output }],
521
+ change: [{ type: Output }]
522
+ };
523
+ if (false) {
524
+ /** @type {?} */
525
+ RichtexteditorComponent.prototype.rteObj;
526
+ /** @type {?} */
527
+ RichtexteditorComponent.prototype.queryCategory;
528
+ /** @type {?} */
529
+ RichtexteditorComponent.prototype.leftRte;
530
+ /** @type {?} */
531
+ RichtexteditorComponent.prototype.rightRte;
532
+ /** @type {?} */
533
+ RichtexteditorComponent.prototype.AIdialog;
534
+ /** @type {?} */
535
+ RichtexteditorComponent.prototype.sentimentButton;
536
+ /** @type {?} */
537
+ RichtexteditorComponent.prototype.regenerateButton;
538
+ /** @type {?} */
539
+ RichtexteditorComponent.prototype.copyButton;
540
+ /** @type {?} */
541
+ RichtexteditorComponent.prototype.replaceButton;
542
+ /** @type {?} */
543
+ RichtexteditorComponent.prototype.placeholder;
544
+ /** @type {?} */
545
+ RichtexteditorComponent.prototype.value;
546
+ /** @type {?} */
547
+ RichtexteditorComponent.prototype.height;
548
+ /** @type {?} */
549
+ RichtexteditorComponent.prototype.autoSaveOnIdle;
550
+ /** @type {?} */
551
+ RichtexteditorComponent.prototype.target;
552
+ /** @type {?} */
553
+ RichtexteditorComponent.prototype.toolbarClick;
554
+ /** @type {?} */
555
+ RichtexteditorComponent.prototype.change;
556
+ /** @type {?} */
557
+ RichtexteditorComponent.prototype.family;
558
+ /** @type {?} */
559
+ RichtexteditorComponent.prototype.dialogWidth;
560
+ /** @type {?} */
561
+ RichtexteditorComponent.prototype.dialogHeight;
562
+ /** @type {?} */
563
+ RichtexteditorComponent.prototype.showZoomBtn;
564
+ /** @type {?} */
565
+ RichtexteditorComponent.prototype.showMsg;
566
+ /** @type {?} */
567
+ RichtexteditorComponent.prototype.insertImageSettings;
568
+ /** @type {?} */
569
+ RichtexteditorComponent.prototype.editorManager;
570
+ /** @type {?} */
571
+ RichtexteditorComponent.prototype.size;
572
+ /** @type {?} */
573
+ RichtexteditorComponent.prototype.selectedQuery;
574
+ /** @type {?} */
575
+ RichtexteditorComponent.prototype.dropValIndex;
576
+ /** @type {?} */
577
+ RichtexteditorComponent.prototype.queryList;
578
+ /** @type {?} */
579
+ RichtexteditorComponent.prototype.rephraseTyleList;
580
+ /** @type {?} */
581
+ RichtexteditorComponent.prototype.languageList;
582
+ /** @type {?} */
583
+ RichtexteditorComponent.prototype.promptQuery;
584
+ /** @type {?} */
585
+ RichtexteditorComponent.prototype.isSentimentCheck;
586
+ /** @type {?} */
587
+ RichtexteditorComponent.prototype.subQuery;
588
+ /** @type {?} */
589
+ RichtexteditorComponent.prototype.translatelanguage;
590
+ /** @type {?} */
591
+ RichtexteditorComponent.prototype.chipValue;
592
+ /** @type {?} */
593
+ RichtexteditorComponent.prototype.apiResultData;
594
+ /** @type {?} */
595
+ RichtexteditorComponent.prototype.AIResult;
596
+ /** @type {?} */
597
+ RichtexteditorComponent.prototype.tools;
598
+ /**
599
+ * @type {?}
600
+ * @private
601
+ */
602
+ RichtexteditorComponent.prototype.ref;
603
+ }
604
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL3JpY2h0ZXh0ZWRpdG9yL2luZGV4LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNqQixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUNMLHVCQUF1QixHQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBSWpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFTM0MsTUFBTSxPQUFPLHVCQUF1Qjs7OztJQWtJbEMsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7O1FBOUdqQyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsV0FBTSxHQUFHLEdBQUcsQ0FBQztRQUNiLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLFdBQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxjQUFjOztRQUVwQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7O1FBR3RD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O0lBQzdDLDBDQUN5Qzs7SUFDekMsMkNBQzBDOztJQUMxQywyQ0FBMkU7O0lBQzNFLGtEQUN5Qzs7SUFDekMsbURBQzBDOztJQUMxQyw2Q0FDb0M7O0lBQ3BDLGdEQUN1Qzs7SUFHdkMsOENBQTBCOztJQUMxQix3Q0FBb0I7O0lBQ3BCLHlDQUFzQjs7SUFDdEIsaURBQStCOztJQUMvQix5Q0FBK0I7O0lBRS9CLCtDQUE0Qzs7SUFDNUMseUNBQXNDOztJQUd0Qyx5Q0FBb0I7O0lBQ3BCLDhDQUFzQjs7SUFDdEIsK0NBQXVCOztJQUN2Qiw4Q0FBbUI7O0lBQ25CLDBDQUFnQjs7SUFDaEIsc0RBSUU7O0lBQ0YsZ0RBQW1COztJQUNuQix1Q0FBVTs7SUFDVixnREFBYzs7SUFDZCwrQ0FBd0I7O0lBQ3hCLDRDQU9FOztJQUNGLG1EQUlFOztJQUNGLCtDQWdCRTs7SUFDRiw4Q0FBd0I7O0lBQ3hCLG1EQUF5Qzs7SUFDekMsMkNBQXFCOztJQUNyQixvREFBa0M7O0lBQ2xDLDRDQUE4Qjs7SUFDOUIsZ0RBQTBCOztJQUMxQiwyQ0FBeUI7O0lBQ3pCLHdDQStDRTs7Ozs7SUFFVSxzQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRHJvcERvd25MaXN0Q29tcG9uZW50IH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1hbmd1bGFyLWRyb3Bkb3duc1wiO1xyXG5pbXBvcnQge1xyXG4gIFJpY2hUZXh0RWRpdG9yQ29tcG9uZW50LFxyXG4gIFRvb2xiYXJTZXR0aW5nc01vZGVsLFxyXG59IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYW5ndWxhci1yaWNodGV4dGVkaXRvclwiO1xyXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWFuZ3VsYXItYnV0dG9uc1wiO1xyXG5pbXBvcnQgeyBEcm9wRG93bkJ1dHRvbiB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYW5ndWxhci1zcGxpdGJ1dHRvbnNcIjtcclxuaW1wb3J0IHsgRGlhbG9nQ29tcG9uZW50IH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1hbmd1bGFyLXBvcHVwc1wiO1xyXG4vLyBzZXJ2aWNlXHJcbi8vIGltcG9ydCB7IFBiRnVuU2VydmljZSB9IGZyb20gXCJAYXBwL3NlcnZpY2VzL3BiLWZ1bi5zZXJ2aWNlXCI7XHJcbi8vIGltcG9ydCB7IFNoYXJlZFN5bmNmdXNpb25Nb2R1bGUgfSBmcm9tIFwiQGFwcC9tb2R1bGUvc3luY2Z1c2lvbk1vZHVsZVwiO1xyXG5pbXBvcnQgeyBPcGVuQWlNb2RlbFJURSB9IGZyb20gXCIuL29wZW5hcGlcIjtcclxuaW1wb3J0IHsgbGluZUhlaWdodF9pdGVtcyB9IGZyb20gXCIuL2RhdGEtY29uZmlnXCI7XHJcbmltcG9ydCB7IGZvbnRGYW1pbHkgfSBmcm9tIFwiLi9kYXRhLWNvbmZpZ1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwicnMtcmljaHRleHQtZWRpdG9yXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9pbmRleC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9pbmRleC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICAvLyBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIC8vIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNoYXJlZFN5bmNmdXNpb25Nb2R1bGVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmljaHRleHRlZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBWaWV3Q2hpbGQoXCJlZGl0b3JcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIHJ0ZU9iajogUmljaFRleHRFZGl0b3JDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInF1ZXJ5Q2F0ZWdvcnlcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIHF1ZXJ5Q2F0ZWdvcnkhOiBEcm9wRG93bkxpc3RDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImxlZnRSdGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIGxlZnRSdGUhOiBSaWNoVGV4dEVkaXRvckNvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKFwicmlnaHRSdGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIHJpZ2h0UnRlITogUmljaFRleHRFZGl0b3JDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcIkFJZGlhbG9nXCIsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBBSWRpYWxvZyE6IERpYWxvZ0NvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKFwic2VudGltZW50QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHB1YmxpYyBzZW50aW1lbnRCdXR0b24hOiBCdXR0b25Db21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInJlZ2VuZXJhdGVCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIHJlZ2VuZXJhdGVCdXR0b24hOiBCdXR0b25Db21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImNvcHlCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIGNvcHlCdXR0b24hOiBCdXR0b25Db21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInJlcGxhY2VCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIHJlcGxhY2VCdXR0b24hOiBCdXR0b25Db21wb25lbnQ7XHJcbiAgLy8gQFZpZXdDaGlsZChcImNoaXBMaXN0XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgY2hpcExpc3QhOiBDaGlwTGlzdENvbXBvbmVudDtcclxuXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHZhbHVlID0gXCJcIjtcclxuICBASW5wdXQoKSBoZWlnaHQgPSAxNTA7XHJcbiAgQElucHV0KCkgYXV0b1NhdmVPbklkbGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHRhcmdldCA9IFwiI2NvbnRhaW5lclwiOyAvLyBkaWFsb2cg5by556qX54i257qnXHJcblxyXG4gIEBPdXRwdXQoKSB0b29sYmFyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAvLyBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBmYW1pbHkgPSBmb250RmFtaWx5O1xyXG4gIGRpYWxvZ1dpZHRoID0gXCI4MDBweFwiO1xyXG4gIGRpYWxvZ0hlaWdodCA9IFwiNjQycHhcIjtcclxuICBzaG93Wm9vbUJ0biA9IHRydWU7XHJcbiAgc2hvd01zZyA9IGZhbHNlO1xyXG4gIGluc2VydEltYWdlU2V0dGluZ3MgPSB7XHJcbiAgICBzYXZlRm9ybWF0OiBcIkJsb2JcIixcclxuICAgIGFsbG93ZWRUeXBlczogW1wiLnN2Z1wiLCBcIi5wbmdcIl0sXHJcbiAgICBkaXNwbGF5OiBcIm5vbmVcIixcclxuICB9O1xyXG4gIGVkaXRvck1hbmFnZXI6IGFueTtcclxuICBzaXplID0gXCJcIjtcclxuICBzZWxlY3RlZFF1ZXJ5O1xyXG4gIHB1YmxpYyBkcm9wVmFsSW5kZXggPSAwO1xyXG4gIHB1YmxpYyBxdWVyeUxpc3Q6IHsgaWQ6IHN0cmluZzsgdGV4dDogc3RyaW5nIH1bXSA9IFtcclxuICAgIHsgaWQ6IFwiUmVwaHJhc2VcIiwgdGV4dDogXCJSZXBocmFzZVwiIH0sXHJcbiAgICB7IGlkOiBcIkdyYW1tYXJcIiwgdGV4dDogXCJDb3JyZWN0IEdyYW1tYXJcIiB9LFxyXG4gICAgeyBpZDogXCJTdW1tYXJpemVcIiwgdGV4dDogXCJTdW1tYXJpemVcIiB9LFxyXG4gICAgeyBpZDogXCJFbGFib3JhdGVcIiwgdGV4dDogXCJFbGFib3JhdGVcIiB9LFxyXG4gICAgeyBpZDogXCJUcmFuc2xhdGVcIiwgdGV4dDogXCJUcmFuc2xhdGVcIiB9LFxyXG4gICAgeyBpZDogXCJTZW50aW1lbnRBbmFseXNpc1wiLCB0ZXh0OiBcIlNlbnRpbWVudCBBbmFseXNpc1wiIH0sXHJcbiAgXTtcclxuICBwdWJsaWMgcmVwaHJhc2VUeWxlTGlzdCA9IFtcclxuICAgIHsgdGV4dDogXCJTdGFuZGFyZFwiLCBpZDogXCJTdGFuZGFyZFwiIH0sXHJcbiAgICB7IHRleHQ6IFwiRmx1ZW50XCIsIGlkOiBcIkZsdWVudFwiIH0sXHJcbiAgICB7IHRleHQ6IFwiUHJvZmVzc2lvbmFsXCIsIGlkOiBcIlByb2Zlc3Npb25hbFwiIH0sXHJcbiAgXTtcclxuICBwdWJsaWMgbGFuZ3VhZ2VMaXN0OiB7IGlkOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXHJcbiAgICB7IGlkOiBcIkVOXCIsIHRleHQ6IFwiRW5nbGlzaFwiIH0sXHJcbiAgICB7IGlkOiBcIlpIXCIsIHRleHQ6IFwiQ2hpbmVzZSAoU2ltcGxpZmllZClcIiB9LFxyXG4gICAgeyBpZDogXCJFU1wiLCB0ZXh0OiBcIlNwYW5pc2hcIiB9LFxyXG4gICAgeyBpZDogXCJaSFRcIiwgdGV4dDogXCJDaGluZXNlIChUcmFkaXRpb25hbClcIiB9LFxyXG4gICAgeyBpZDogXCJISVwiLCB0ZXh0OiBcIkhpbmRpXCIgfSxcclxuICAgIHsgaWQ6IFwiQVJcIiwgdGV4dDogXCJBcmFiaWNcIiB9LFxyXG4gICAgeyBpZDogXCJCTlwiLCB0ZXh0OiBcIkJlbmdhbGlcIiB9LFxyXG4gICAgeyBpZDogXCJQVFwiLCB0ZXh0OiBcIlBvcnR1Z3Vlc2VcIiB9LFxyXG4gICAgeyBpZDogXCJSVVwiLCB0ZXh0OiBcIlJ1c3NpYW5cIiB9LFxyXG4gICAgeyBpZDogXCJKQVwiLCB0ZXh0OiBcIkphcGFuZXNlXCIgfSxcclxuICAgIHsgaWQ6IFwiREVcIiwgdGV4dDogXCJHZXJtYW5cIiB9LFxyXG4gICAgeyBpZDogXCJLT1wiLCB0ZXh0OiBcIktvcmVhblwiIH0sXHJcbiAgICB7IGlkOiBcIkZSXCIsIHRleHQ6IFwiRnJlbmNoXCIgfSxcclxuICAgIHsgaWQ6IFwiSVRcIiwgdGV4dDogXCJJdGFsaWFuXCIgfSxcclxuICAgIHsgaWQ6IFwiVFJcIiwgdGV4dDogXCJUdXJraXNoXCIgfSxcclxuICBdO1xyXG4gIHB1YmxpYyBwcm9tcHRRdWVyeSA9IFwiXCI7XHJcbiAgcHVibGljIGlzU2VudGltZW50Q2hlY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc3ViUXVlcnkgPSBcIlwiO1xyXG4gIHB1YmxpYyB0cmFuc2xhdGVsYW5ndWFnZSE6IHN0cmluZztcclxuICBwdWJsaWMgY2hpcFZhbHVlID0gXCJTdGFuZGFyZFwiO1xyXG4gIHB1YmxpYyBhcGlSZXN1bHREYXRhOiBhbnk7XHJcbiAgcHVibGljIEFJUmVzdWx0ITogc3RyaW5nO1xyXG4gIHRvb2xzOiBUb29sYmFyU2V0dGluZ3NNb2RlbCA9IHtcclxuICAgIGVuYWJsZUZsb2F0aW5nOiBmYWxzZSxcclxuICAgIGl0ZW1zOiBbXHJcbiAgICAgIHtcclxuICAgICAgICB0b29sdGlwVGV4dDogXCJBSSBBc3Npc3RcIixcclxuICAgICAgICB0ZW1wbGF0ZTpcclxuICAgICAgICAgICc8YnV0dG9uIGNsYXNzPVwiZS10YmFyLWJ0biBlLWJ0blwiIHRhYmluZGV4PVwiLTFcIiBpZD1cImFpX2Fzc2lzdGFudF9idXR0b25fdGJhclwiIHN0eWxlPVwid2lkdGg6MTAwJVwiPjxkaXYgY2xhc3M9XCJlLXJ0ZS1kcm9wZG93bi1idG4tdGV4dFwiPkFJIEFzc2lzdDwvZGl2PjwvYnV0dG9uPicsXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiQm9sZFwiLFxyXG4gICAgICBcIkl0YWxpY1wiLFxyXG4gICAgICBcIlVuZGVybGluZVwiLFxyXG4gICAgICBcIlN0cmlrZVRocm91Z2hcIixcclxuICAgICAgXCJGb250TmFtZVwiLFxyXG4gICAgICBcIkZvbnRTaXplXCIsXHJcbiAgICAgIFwiRm9udENvbG9yXCIsXHJcbiAgICAgIFwiQmFja2dyb3VuZENvbG9yXCIsXHJcbiAgICAgIFwiTG93ZXJDYXNlXCIsXHJcbiAgICAgIFwiVXBwZXJDYXNlXCIsXHJcbiAgICAgIFwifFwiLFxyXG4gICAgICBcIkNyZWF0ZVRhYmxlXCIsXHJcbiAgICAgIFwiRm9ybWF0c1wiLFxyXG4gICAgICBcIkFsaWdubWVudHNcIixcclxuICAgICAge1xyXG4gICAgICAgIHRvb2x0aXBUZXh0OiBcIkxpbmUgSGVpZ2h0XCIsXHJcbiAgICAgICAgdGVtcGxhdGU6XHJcbiAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz1cImUtdGJhci1idG4gZS1idG5cIiB0YWJpbmRleD1cIi0xXCIgaWQ9XCJsaW5laGVpZ2h0X3RiYXJcIiAgc3R5bGU9XCJ3aWR0aDoxMDAlXCI+PC9idXR0b24+JyxcclxuICAgICAgfSxcclxuICAgICAgXCJPcmRlcmVkTGlzdFwiLFxyXG4gICAgICBcIlVub3JkZXJlZExpc3RcIixcclxuICAgICAgXCJPdXRkZW50XCIsXHJcbiAgICAgIFwiSW5kZW50XCIsXHJcbiAgICAgIFwifFwiLFxyXG4gICAgICBcIkNyZWF0ZUxpbmtcIixcclxuICAgICAge1xyXG4gICAgICAgIHRvb2x0aXBUZXh0OiBcIlwiLFxyXG4gICAgICAgIHRlbXBsYXRlOlxyXG4gICAgICAgICAgJzxidXR0b24gY2xhc3M9XCJlLXRiYXItYnRuIGUtYnRuXCIgdGFiaW5kZXg9XCItMVwiIGlkPVwiY3VzdG9tX3RiYXJcIiAgc3R5bGU9XCJ3aWR0aDoxMDAlXCI+JyArXHJcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cImUtdGJhci1idG4tdGV4dFwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj48aW1nIHNyYz1cIi9hc3NldHMvaW1nL2ZpbGUtaWNvbi5zdmdcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTt0b3A6IC0ycHg7XCIvPjxkaXYgY2xhc3M9XCJ1cGxvYWRBY3Rpb25zXCI+PGRpdiBpZD1cInVwbG9hZEZyb21Vc2VyXCI+Q29tcHV0ZXIgRmlsZTwvZGl2PjxkaXYgaWQ9XCJyZWxhdGlvbkRvbVwiPlRpY2tldCBBdHRhY2htZW50PC9kaXY+PC9kaXY+PC9kaXY+PC9idXR0b24+JyxcclxuICAgICAgfSxcclxuICAgICAgXCJ8XCIsXHJcbiAgICAgIFwiRm9ybWF0UGFpbnRlclwiLFxyXG4gICAgICBcIkNsZWFyRm9ybWF0XCIsXHJcbiAgICAgIFwifFwiLFxyXG4gICAgICBcIlVuZG9cIixcclxuICAgICAgXCJSZWRvXCIsXHJcbiAgICAgIC8vJ1NvdXJjZUNvZGUnLFxyXG4gICAgXSxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge31cclxuXHJcbiAgb25Db250ZW50Q2hhbmdlKGFyZ3MpIHtcclxuICAgIGNvbnN0IHRhYmxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0YWJsZS5lLXJ0ZS10YWJsZVwiKTtcclxuICAgIHRhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xyXG4gICAgICBjb25zdCBodG1sVGFibGUgPSB0YWJsZSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICBodG1sVGFibGUuc3R5bGUubWFyZ2luQm90dG9tID0gXCIxMHB4XCI7XHJcbiAgICAgIGh0bWxUYWJsZS5zdHlsZS5ib3JkZXJDb2xsYXBzZSA9IFwiY29sbGFwc2VcIjtcclxuICAgICAgaHRtbFRhYmxlLnN0eWxlLmVtcHR5Q2VsbHMgPSBcInNob3dcIjtcclxuICAgICAgY29uc3QgdGRFbGVtZW50cyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZFwiKTtcclxuICAgICAgdGRFbGVtZW50cy5mb3JFYWNoKCh0ZCkgPT4ge1xyXG4gICAgICAgIHRkLnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkICNhZGI1YmRcIjtcclxuICAgICAgICB0ZC5zdHlsZS5oZWlnaHQgPSBcIjIwcHhcIjtcclxuICAgICAgICB0ZC5zdHlsZS5taW5XaWR0aCA9IFwiMjBweFwiO1xyXG4gICAgICAgIHRkLnN0eWxlLnBhZGRpbmcgPSBcIjJweCA1cHhcIjtcclxuICAgICAgICB0ZC5zdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2hhbmdlLmVtaXQoYXJncyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DcmVhdGUoKTogdm9pZCB7XHJcbiAgICAvL2JpbmQgdGhlIGEgY2xpY2sgZXZlbnRcclxuICAgIC8vIGxldCBlZGl0b3JDb250ZW50ID0gdGhpcy5ydGVPYmouY29udGVudE1vZHVsZS5nZXRFZGl0UGFuZWwoKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vIGVkaXRvckNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLk9uQ2xpY2tlZC5iaW5kKHRoaXMpKTtcclxuICAgIC8vYWRkIHRoZSBsaW5lIGhlaWdodFxyXG4gICAgdGhpcy5lZGl0b3JNYW5hZ2VyID0gdGhpcy5ydGVPYmouZm9ybWF0dGVyLmVkaXRvck1hbmFnZXI7XHJcbiAgICBsZXQgc3BsaXRCdXR0b24gPSBuZXcgRHJvcERvd25CdXR0b24oe1xyXG4gICAgICBpdGVtczogbGluZUhlaWdodF9pdGVtcyxcclxuICAgICAgaWNvbkNzczogXCJlLWljb25zIGUtbGluZS1zcGFjaW5nXCIsXHJcbiAgICAgIHNlbGVjdDogdGhpcy5vblNlbGVjdC5iaW5kKHRoaXMpLFxyXG4gICAgfSk7XHJcbiAgICBzcGxpdEJ1dHRvbi5hcHBlbmRUbyhcIiNsaW5laGVpZ2h0X3RiYXJcIik7XHJcbiAgICAvLyBhaSBhc3Npc3RcclxuICAgIGxldCBhaWFzc2lzdGFudEJ1dHRvbiA9IG5ldyBEcm9wRG93bkJ1dHRvbih7XHJcbiAgICAgIGl0ZW1zOiB0aGlzLnF1ZXJ5TGlzdCxcclxuICAgICAgLy8gaWNvbkNzczogXCJlLWJ0bi1pY29uIGUtaWNvbnMgZS1hc3Npc3R2aWV3LWljb24gZS1pY29uLWxlZnRcIixcclxuICAgICAgc2VsZWN0OiAoYXJncykgPT4gdGhpcy5haVF1ZXJ5U2VsZWN0ZWRNZW51KGFyZ3MpLFxyXG4gICAgfSk7XHJcbiAgICBhaWFzc2lzdGFudEJ1dHRvbi5hcHBlbmRUbyhcIiNhaV9hc3Npc3RhbnRfYnV0dG9uX3RiYXJcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uU2VsZWN0KGFyZ3MpIHtcclxuICAgIGlmICh0aGlzLnJ0ZU9iai5mb3JtYXR0ZXIuZ2V0VW5kb1JlZG9TdGFjaygpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnJ0ZU9iai5mb3JtYXR0ZXIuc2F2ZURhdGEoKTtcclxuICAgIH1cclxuICAgIGxldCBub2RlczogTm9kZVtdID0gdGhpcy5lZGl0b3JNYW5hZ2VyLmRvbU5vZGUuYmxvY2tOb2RlcygpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgbm9kZXMubGVuZ3RoID4gaTsgaSsrKSB7XHJcbiAgICAgIChub2Rlc1tpXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUubGluZUhlaWdodCA9IGFyZ3MuaXRlbS50ZXh0O1xyXG4gICAgfVxyXG4gICAgdGhpcy5ydGVPYmouZm9ybWF0dGVyLnNhdmVEYXRhKCk7XHJcbiAgICB0aGlzLnJ0ZU9iai5mb3JtYXR0ZXIuZW5hYmxlVW5kbyh0aGlzLnJ0ZU9iaik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFpUXVlcnlTZWxlY3RlZE1lbnUoYXJnczogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmRpYWxvZ3VlT3BlbihhcmdzLml0ZW0udGV4dCk7XHJcbiAgfVxyXG5cclxuICBkaWFsb2d1ZU9wZW4oc2VsZWN0ZWRRdWVyeTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB2YXIgc2VsZWN0aW9uVGV4dCA9IHRoaXMucnRlT2JqLmdldFNlbGVjdGVkSHRtbCgpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFF1ZXJ5ID0gc2VsZWN0ZWRRdWVyeTtcclxuICAgIGlmIChzZWxlY3Rpb25UZXh0KSB7XHJcbiAgICAgIGxldCByYW5nZTogUmFuZ2UgPSAoXHJcbiAgICAgICAgdGhpcy5ydGVPYmogYXMgYW55XHJcbiAgICAgICkuZm9ybWF0dGVyLmVkaXRvck1hbmFnZXIubm9kZVNlbGVjdGlvbi5nZXRSYW5nZShcclxuICAgICAgICAodGhpcy5ydGVPYmogYXMgYW55KS5jb250ZW50TW9kdWxlLmdldERvY3VtZW50KClcclxuICAgICAgKTtcclxuICAgICAgKHRoaXMucnRlT2JqIGFzIGFueSkuZm9ybWF0dGVyLmVkaXRvck1hbmFnZXIubm9kZVNlbGVjdGlvbi5zYXZlKFxyXG4gICAgICAgIHJhbmdlLFxyXG4gICAgICAgICh0aGlzLnJ0ZU9iaiBhcyBhbnkpLmNvbnRlbnRNb2R1bGUuZ2V0RG9jdW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmRyb3BWYWxJbmRleCA9IHRoaXMucXVlcnlMaXN0LmZpbmRJbmRleChcclxuICAgICAgICAocSkgPT4gcS50ZXh0LnRvTG93ZXJDYXNlKCkgPT09IHNlbGVjdGVkUXVlcnkudG9Mb3dlckNhc2UoKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnF1ZXJ5Q2F0ZWdvcnkuaW5kZXggPSB0aGlzLmRyb3BWYWxJbmRleDtcclxuICAgICAgdGhpcy5sZWZ0UnRlLnZhbHVlID0gdGhpcy5wcm9tcHRRdWVyeSA9IHNlbGVjdGlvblRleHQ7XHJcbiAgICAgIHRoaXMubGVmdFJ0ZS5yZWZyZXNoVUkoKTtcclxuICAgICAgdGhpcy5BSWRpYWxvZy5zaG93KCk7XHJcbiAgICAgIHRoaXMudXBkYXRlQUlTdWdlc3N0aW9uc0RhdGEoc2VsZWN0ZWRRdWVyeSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dNc2cgPSB0cnVlO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dNc2cgPSBmYWxzZTtcclxuICAgICAgfSwgMzAwMCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiUGxlYXNlIHNlbGVjdCB0aGUgY29udGVudCB0byBwZXJmb3JtIHRoZSBBSSBvcGVyYXRpb24uXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQUlTdWdlc3N0aW9uc0RhdGEoc2VsZWN0ZWRRdWVyeTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzU2VudGltZW50Q2hlY2sgPSBmYWxzZTtcclxuICAgIHN3aXRjaCAoc2VsZWN0ZWRRdWVyeSkge1xyXG4gICAgICBjYXNlIFwiU3VtbWFyaXplXCI6XHJcbiAgICAgICAgdGhpcy5zdWJRdWVyeSA9IFwiU3VtbWFyaXplIHRoZSB1cGNvbWluZyBzZW50ZW5jZSBzaG9ydGx5LlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiRWxhYm9yYXRlXCI6XHJcbiAgICAgICAgdGhpcy5zdWJRdWVyeSA9IFwiRWxhYm9yYXRlIG9uIHRoZSB1cGNvbWluZyBzZW50ZW5jZS5cIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlJlcGhyYXNlXCI6XHJcbiAgICAgICAgdGhpcy5zdWJRdWVyeSA9IHRoaXMuY2hpcFZhbHVlICsgXCIgcmVwaHJhc2UgdGhlIHVwY29taW5nIHNlbnRlbmNlLlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiQ29ycmVjdCBHcmFtbWFyXCI6XHJcbiAgICAgICAgdGhpcy5zdWJRdWVyeSA9IFwiQ29ycmVjdCB0aGUgZ3JhbW1hciBvZiB0aGUgdXBjb21pbmcgc2VudGVuY2UuXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJUcmFuc2xhdGVcIjpcclxuICAgICAgICB0aGlzLnN1YlF1ZXJ5ID1cclxuICAgICAgICAgIFwiVHJhbnNsYXRlIHRoZSB1cGNvbWluZyBzZW50ZW5jZSB0byBcIiArIHRoaXMudHJhbnNsYXRlbGFuZ3VhZ2UgKyBcIi5cIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlNlbnRpbWVudCBBbmFseXNpc1wiOlxyXG4gICAgICAgIHRoaXMuaXNTZW50aW1lbnRDaGVjayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zdWJRdWVyeSA9XHJcbiAgICAgICAgICAnQW5hbHl6ZSB0aGUgc2VudGltZW50IGFuZCBncmFtbWFyIG9mIHRoZSBmb2xsb3dpbmcgcGFyYWdyYXBocyBhbmQgcHJvdmlkZSB0aGUgZXhwcmVzc2lvbiBzY29yZSB3aXRoIGFuIGVtb2ppIGZvbGxvd2VkIGJ5IHRoZSBzZW50aW1lbnQgaW4gdGhlIGZvcm1hdDogXCLwn5iKIE5ldXRyYWxcIi4gXFxuXFxuTk9URTogQXZvaWQgYW55IGFkZGl0aW9uYWwgdGV4dCBvciBleHBsYW5hdGlvbjonO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVBSVN1Z2Vzc3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBSVN1Z2Vzc3Rpb25zKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMucHJvbXB0UXVlcnkpIHtcclxuICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJza2VsZXRvbklkXCIpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID1cclxuICAgICAgICAgIFwiXCI7XHJcbiAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRSdGVcIikgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPVxyXG4gICAgICAgICAgXCJub25lXCI7XHJcbiAgICAgICAgdGhpcy5zZW50aW1lbnRCdXR0b24uZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgdGhpcy5yZWdlbmVyYXRlQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNvcHlCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVwbGFjZUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hcGlSZXN1bHREYXRhID0gdGhpcy5nZXRSZXNwb25zZUZyb21PcGVuQUkoXHJcbiAgICAgICAgICB0aGlzLnN1YlF1ZXJ5LFxyXG4gICAgICAgICAgdGhpcy5wcm9tcHRRdWVyeVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5hcGlSZXN1bHREYXRhLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkFJUmVzdWx0ID0gdGhpcy5pc1NlbnRpbWVudENoZWNrID8gdGhpcy5wcm9tcHRRdWVyeSA6IHJlc3VsdDtcclxuICAgICAgICAgIHRoaXMuc2VudGltZW50QnV0dG9uLmNvbnRlbnQgPSByZXN1bHRcclxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgLmluY2x1ZGVzKFwicG9zaXRpdmVcIilcclxuICAgICAgICAgICAgPyBcIvCfmIogUG9zaXRpdmVcIlxyXG4gICAgICAgICAgICA6IHJlc3VsdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwibmVnYXRpdmVcIilcclxuICAgICAgICAgICAgPyBcIvCfmJ4gTmVnYXRpdmVcIlxyXG4gICAgICAgICAgICA6IFwi8J+YkCBOZXV0cmFsXCI7XHJcbiAgICAgICAgICB0aGlzLnNlbnRpbWVudEJ1dHRvbi5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAhdGhpcy5pc1NlbnRpbWVudENoZWNrXHJcbiAgICAgICAgICAgID8gXCJub25lXCJcclxuICAgICAgICAgICAgOiBcIlwiO1xyXG4gICAgICAgICAgdGhpcy5yaWdodFJ0ZS52YWx1ZSA9IHRoaXMuQUlSZXN1bHQ7XHJcbiAgICAgICAgICB2YXIgbm9SZXN1bHRzRm91bmQgPSAhKHRoaXMuQUlSZXN1bHQgfHwgdGhpcy5wcm9tcHRRdWVyeSk7XHJcbiAgICAgICAgICAoXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibm8tcmVzdWx0cy1mb3VuZFwiKSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgKS5zdHlsZS5kaXNwbGF5ID0gbm9SZXN1bHRzRm91bmQgPyBcIlwiIDogXCJub25lXCI7XHJcbiAgICAgICAgICB0aGlzLnJlZ2VuZXJhdGVCdXR0b24uZGlzYWJsZWQgPSBub1Jlc3VsdHNGb3VuZDtcclxuICAgICAgICAgIHRoaXMuY29weUJ1dHRvbi5kaXNhYmxlZCA9IG5vUmVzdWx0c0ZvdW5kO1xyXG4gICAgICAgICAgdGhpcy5yZXBsYWNlQnV0dG9uLmRpc2FibGVkID0gbm9SZXN1bHRzRm91bmQ7XHJcbiAgICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJza2VsZXRvbklkXCIpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID1cclxuICAgICAgICAgICAgXCJub25lXCI7XHJcbiAgICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyaWdodFJ0ZVwiKSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZGlzcGxheSA9XHJcbiAgICAgICAgICAgIG5vUmVzdWx0c0ZvdW5kID8gXCJub25lXCIgOiBcIlwiO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgIG5vUmVzdWx0c0ZvdW5kLFxyXG4gICAgICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyaWdodFJ0ZVwiKSBhcyBIVE1MRWxlbWVudCkuc3R5bGVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIHRoaXMudG9hc3RPYmouc2hvdygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0UmVzcG9uc2VGcm9tT3BlbkFJKFxyXG4gICAgc3ViUXVlcnk6IHN0cmluZyxcclxuICAgIHByb21wdFF1ZXJ5OiBzdHJpbmdcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IE9wZW5BaU1vZGVsUlRFKHN1YlF1ZXJ5LCBwcm9tcHRRdWVyeSk7XHJcbiAgICByZXR1cm4gY29udGVudCA/IChjb250ZW50IGFzIHN0cmluZykgOiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgZGlhbG9nU2hvdygpOiB2b2lkIHtcclxuICAgIHRoaXMucmVnZW5lcmF0ZUJ1dHRvbiEuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZUFJU3VnZXNzdGlvbnMoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jb3B5QnV0dG9uIS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuY29weVRleHRUb0NsaXBib2FyZCh0aGlzLkFJUmVzdWx0KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZXBsYWNlQnV0dG9uIS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgIGxldCByYW5nZTogUmFuZ2UgPSAoXHJcbiAgICAgICAgdGhpcy5ydGVPYmogYXMgYW55XHJcbiAgICAgICkuZm9ybWF0dGVyLmVkaXRvck1hbmFnZXIubm9kZVNlbGVjdGlvbi5nZXRSYW5nZShcclxuICAgICAgICAodGhpcy5ydGVPYmogYXMgYW55KS5jb250ZW50TW9kdWxlLmdldERvY3VtZW50KClcclxuICAgICAgKTtcclxuICAgICAgKHRoaXMucnRlT2JqIGFzIGFueSkuZm9ybWF0dGVyLmVkaXRvck1hbmFnZXIubm9kZVNlbGVjdGlvbi5yZXN0b3JlKHJhbmdlKTtcclxuICAgICAgKHRoaXMucnRlT2JqIGFzIGFueSkuZXhlY3V0ZUNvbW1hbmQoXCJpbnNlcnRIVE1MXCIsIHRoaXMuQUlSZXN1bHQsIHtcclxuICAgICAgICB1bmRvOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xyXG4gICAgfSk7XHJcbiAgICAodGhpcy5BSWRpYWxvZyBhcyBEaWFsb2dDb21wb25lbnQpLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcbiAgfVxyXG5cclxuICBjbG9zZURpYWxvZygpOiB2b2lkIHtcclxuICAgIHRoaXMuQUlkaWFsb2cuaGlkZSgpO1xyXG4gICAgdGhpcy5yaWdodFJ0ZS52YWx1ZSA9IFwiXCI7XHJcbiAgICB0aGlzLmxlZnRSdGUudmFsdWUgPSBcIlwiO1xyXG4gICAgdGhpcy5wcm9tcHRRdWVyeSA9IFwiXCI7XHJcbiAgICB0aGlzLmNoaXBWYWx1ZSA9IFwiU3RhbmRhcmRcIjtcclxuICAgIHRoaXMuQUlSZXN1bHQgPSBcIlwiO1xyXG4gICAgdGhpcy5kcm9wVmFsSW5kZXggPSAwO1xyXG4gICAgdGhpcy5zZWxlY3RlZFF1ZXJ5ID0gXCJSZXBocmFzZVwiO1xyXG4gICAgdGhpcy5zZW50aW1lbnRCdXR0b24uY29udGVudCA9IFwi8J+YiiBOZXV0cmFsXCI7XHJcbiAgfVxyXG5cclxuICBjb3B5VGV4dFRvQ2xpcGJvYXJkKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQpIHtcclxuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZFxyXG4gICAgICAgIC53cml0ZVRleHQodGV4dClcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlRleHQgY29waWVkIHRvIGNsaXBib2FyZCBzdWNjZXNzZnVsbHkhXCIpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY29weSB0ZXh0OiBcIiwgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEZhbGxiYWNrIGZvciBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBDbGlwYm9hcmQgQVBJXHJcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG4gICAgICB0ZXh0YXJlYS52YWx1ZSA9IHRleHQ7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dGFyZWEpO1xyXG4gICAgICB0ZXh0YXJlYS5zZWxlY3QoKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJUZXh0IGNvcGllZCB0byBjbGlwYm9hcmQgdXNpbmcgZXhlY0NvbW1hbmRcIik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY29weSB0ZXh0OiBcIiwgZXJyKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRhcmVhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25PdmVybGF5Q2xpY2soKTogdm9pZCB7XHJcbiAgICBsZXQgYWN0aXZlRWxlOiBIVE1MRWxlbWVudCB8IG51bGwgPSB0aGlzLkFJZGlhbG9nLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgXCIuY2hhcl9ibG9jay5lLWFjdGl2ZVwiXHJcbiAgICApO1xyXG4gICAgaWYgKGFjdGl2ZUVsZSkge1xyXG4gICAgICBhY3RpdmVFbGUuY2xhc3NMaXN0LnJlbW92ZShcImUtYWN0aXZlXCIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbG9zZURpYWxvZygpO1xyXG4gIH1cclxuXHJcbiAgb25RdWVyeVNlbGVjdChhcmdzKSB7XHJcbiAgICAvLyB0aGlzLmNoaXBMaXN0LnNlbGVjdGVkQ2hpcHMgPSAwO1xyXG4gICAgdGhpcy50cmFuc2xhdGVsYW5ndWFnZSA9IFwiRU5cIjtcclxuICAgIHRoaXMuc2VsZWN0ZWRRdWVyeSA9IGFyZ3MuaXRlbURhdGEudGV4dDtcclxuICAgIHRoaXMudXBkYXRlQUlTdWdlc3N0aW9uc0RhdGEoYXJncy5pdGVtRGF0YS50ZXh0KTtcclxuICB9XHJcblxyXG4gIG9uTGFuZ3VhZ2VTZWxlY3QoYXJnczogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZWxhbmd1YWdlID0gYXJncy5pdGVtRGF0YS5pZDtcclxuICAgIHRoaXMudXBkYXRlQUlTdWdlc3N0aW9uc0RhdGEoXCJUcmFuc2xhdGVcIik7XHJcbiAgfVxyXG5cclxuICBvbkNoaXBDbGljayhhcmdzOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hpcFZhbHVlID0gYXJncy5pdGVtRGF0YS50ZXh0O1xyXG4gICAgLy8g5LqL5Lu25Lya6Kem5Y+R5Lik5qyhIOW/hemhu+WIpOaWrWFyZ3MudGV4dOaYr+WQpuacieWAvFxyXG4gICAgaWYgKGFyZ3MuaXRlbURhdGEudGV4dCkgdGhpcy51cGRhdGVBSVN1Z2Vzc3Rpb25zRGF0YShcIlJlcGhyYXNlXCIpO1xyXG4gIH1cclxuXHJcbiAgX3Rvb2xiYXJDbGljayhhcmdzKSB7XHJcbiAgICB0aGlzLnRvb2xiYXJDbGljay5lbWl0KGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgaGlkZVRvYXN0KCkge1xyXG4gICAgdGhpcy5zaG93TXNnID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvblpvb20oKSB7XHJcbiAgICBpZiAodGhpcy5zaXplID09PSBcImxhcmdlc3RcIikge1xyXG4gICAgICB0aGlzLnNpemUgPSBcIlwiOyAvLyDmgaLlpI3liLDljp/lp4vlpKflsI9cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IFwibGFyZ2VzdFwiOyAvLyDorr7nva7kuLrmnIDlpKfljJZcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19