@rangertechnologies/ngnxt 2.1.242 → 2.1.243-beta

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 (90) hide show
  1. package/fesm2022/rangertechnologies-ngnxt.mjs +153 -185
  2. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  3. package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
  4. package/lib/components/pick-location/pick-location.component.d.ts +0 -1
  5. package/package.json +4 -6
  6. package/rangertechnologies-ngnxt-2.1.243-beta.tgz +0 -0
  7. package/esm2022/environments/version.mjs +0 -15
  8. package/esm2022/lib/ar.i18n.mjs +0 -29
  9. package/esm2022/lib/components/button/nxt-button.component.mjs +0 -165
  10. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -371
  11. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -274
  12. package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -51
  13. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -156
  14. package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1625
  15. package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -283
  16. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -104
  17. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
  18. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
  19. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
  20. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
  21. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
  22. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
  23. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
  24. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
  25. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
  26. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
  27. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
  28. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
  29. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
  30. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
  31. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
  32. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
  33. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
  34. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
  35. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
  36. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -403
  37. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2925
  38. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -101
  39. package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -234
  40. package/esm2022/lib/components/search-box/search-box.component.mjs +0 -413
  41. package/esm2022/lib/country.json +0 -43237
  42. package/esm2022/lib/en.i18n.mjs +0 -29
  43. package/esm2022/lib/i18n-config.service.mjs +0 -4
  44. package/esm2022/lib/i18n.component.mjs +0 -47
  45. package/esm2022/lib/i18n.module.mjs +0 -38
  46. package/esm2022/lib/i18n.pipe.mjs +0 -26
  47. package/esm2022/lib/i18n.service.mjs +0 -56
  48. package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
  49. package/esm2022/lib/interfaces/apimeta.mjs +0 -2
  50. package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
  51. package/esm2022/lib/model/bookletWrapper.mjs +0 -9
  52. package/esm2022/lib/model/changeWrapper.mjs +0 -11
  53. package/esm2022/lib/model/errorWrapper.mjs +0 -6
  54. package/esm2022/lib/nxt-app.component.mjs +0 -22
  55. package/esm2022/lib/nxt-app.module.mjs +0 -139
  56. package/esm2022/lib/nxt-app.service.mjs +0 -14
  57. package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -675
  58. package/esm2022/lib/pages/builder/element/element.component.mjs +0 -466
  59. package/esm2022/lib/pages/builder/form/form.component.mjs +0 -45
  60. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -89
  61. package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1021
  62. package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -34
  63. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -676
  64. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1126
  65. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -841
  66. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2405
  67. package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -27
  68. package/esm2022/lib/pipe/date/date.pipe.mjs +0 -28
  69. package/esm2022/lib/pipe/editColumnCheck/edit-column-check.pipe.mjs +0 -28
  70. package/esm2022/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.mjs +0 -20
  71. package/esm2022/lib/pipe/editColumnType/edit-column-type.pipe.mjs +0 -20
  72. package/esm2022/lib/pipe/get-value.pipe.mjs +0 -48
  73. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -39
  74. package/esm2022/lib/pipe/time/time.pipe.mjs +0 -26
  75. package/esm2022/lib/sample.mjs +0 -3715
  76. package/esm2022/lib/services/change.service.mjs +0 -50
  77. package/esm2022/lib/services/country.service.mjs +0 -135
  78. package/esm2022/lib/services/data.service.mjs +0 -103
  79. package/esm2022/lib/services/form-builder.service.mjs +0 -375
  80. package/esm2022/lib/services/pdf-designer.service.mjs +0 -401
  81. package/esm2022/lib/services/salesforce.service.mjs +0 -46
  82. package/esm2022/lib/services/shared.service.mjs +0 -100
  83. package/esm2022/lib/services/storage.service.mjs +0 -44
  84. package/esm2022/lib/services/template.service.mjs +0 -351
  85. package/esm2022/lib/services/translation.service.mjs +0 -62
  86. package/esm2022/lib/tam.i18n.mjs +0 -29
  87. package/esm2022/lib/wrapper.mjs +0 -175
  88. package/esm2022/public-api.mjs +0 -25
  89. package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
  90. package/rangertechnologies-ngnxt-2.1.242.tgz +0 -0
@@ -1,675 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild, } from "@angular/core";
2
- import { QuestionbookComponent } from "../questionbook/questionbook.component";
3
- import { CommonModule } from "@angular/common";
4
- import { FormsModule } from "@angular/forms";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../services/salesforce.service";
7
- import * as i2 from "../../services/data.service";
8
- import * as i3 from "../../services/storage.service";
9
- import * as i4 from "@angular/platform-browser";
10
- import * as i5 from "../../services/change.service";
11
- import * as i6 from "@angular/common/http";
12
- import * as i7 from "@angular/common";
13
- export class BookletComponent {
14
- sfService;
15
- dataService;
16
- storageService;
17
- sanitizer;
18
- changeService;
19
- http;
20
- bookletId;
21
- serv;
22
- tkn;
23
- bookletJSON;
24
- allIcons; //MSM10JUL25 icon selector component input
25
- themeColor; //MSM10JUL25 icon selector component input
26
- cdnIconURL; //MSM10JUL25 icon selector component input
27
- dropdownDependentData;
28
- labelValue;
29
- token;
30
- languageCode; // VD 11Jun24 - translation changes
31
- fieldRestrictions; // VD 12Jun24 - field permission change
32
- from; // Form Builder dependent change
33
- apiUrl; // AP-16APR25 Input property to receive the API URL from the parent component
34
- isEdit; // AP-19MAY25 - Added isEdit input
35
- handleBookletActionEvent = new EventEmitter();
36
- handlePage = new EventEmitter();
37
- hadleDropDownDependent = new EventEmitter();
38
- // VD 06Sep24 calendar changes
39
- handleCalendarDate = new EventEmitter();
40
- handleCalendarEvent = new EventEmitter();
41
- nxtBooklet;
42
- booklet = [];
43
- abItem = {};
44
- actions = [];
45
- bookQuestionsMap = new Map();
46
- translateMap = new Map(); // VD 11Jun24 - translation changes
47
- sqOptions = new Map();
48
- isAnswerFlag = false;
49
- spinnerName;
50
- spinnerType;
51
- // HA 19DEC23 langDirection variable is created to assign the direction as class
52
- langDirection = 'ltr'; // HA 28DEC23 making ltr as default direction
53
- answerList = []; // HA 11-JAN-24 Answerlist to store the minimal value
54
- dataBind; // HA 18-JAN-24 To insert the endpoint value to the question
55
- allEvents = []; // VD 06Sep24 calendar changes
56
- //AP-19MAY25 - Accessing the QuestionbookComponent instance using ViewChild reference
57
- questionbookComponent;
58
- constructor(sfService, dataService, storageService, sanitizer, changeService, http) {
59
- this.sfService = sfService;
60
- this.dataService = dataService;
61
- this.storageService = storageService;
62
- this.sanitizer = sanitizer;
63
- this.changeService = changeService;
64
- this.http = http;
65
- this.spinnerName = "sp1";
66
- this.spinnerType = "ball-spin-clockwise";
67
- }
68
- ngOnInit() {
69
- this.processBooklet();
70
- //AP-16APR25 // Get the dynamic API URL and pass it to the service method
71
- let apidata = this.apiUrl;
72
- this.dataService.apikey(apidata);
73
- }
74
- // VD NOV23 - update the json data when bookletId and bookletJSON changes
75
- ngOnChanges(simplechanges) {
76
- // HA 23JAN24 To avoid undefined error
77
- if (simplechanges['bookletId'] || (simplechanges['bookletJSON'] && simplechanges['bookletJSON'].currentValue != null) || (simplechanges['dataBind'] && simplechanges['dataBind'].currentValue != null)) {
78
- this.allEvents = [];
79
- this.processBooklet();
80
- }
81
- //AP-19MAY25 - If bookletJSON input changes, trigger processData on QuestionbookComponent
82
- if (simplechanges['bookletJSON']) {
83
- const currentValue = simplechanges['bookletJSON'].currentValue;
84
- //AP-28MAY25 - If the action is a string, upgrade it to the new action model (array of objects)
85
- if (currentValue?.questionbook?.action && typeof currentValue.questionbook.action === 'string') {
86
- currentValue.questionbook.action = this.upgradeActions(currentValue.questionbook.action);
87
- }
88
- if (this.questionbookComponent) {
89
- this.questionbookComponent.processData();
90
- }
91
- }
92
- }
93
- // AP-28MAY25 - Converts old action string (JSON) into a new model (array of action objects)
94
- upgradeActions(actionString) {
95
- try {
96
- // Try to parse the action string to JSON
97
- const parsed = JSON.parse(actionString);
98
- // AP-28MAY25 If parsed result is an array, apply default styles and adjust position
99
- if (Array.isArray(parsed)) {
100
- return parsed.map((item, index) => ({
101
- ...item,
102
- positionPercent: item.name === 'Cancel' ? 3 : 14, // Set position based on action name
103
- width: 100,
104
- textColor: '#ffffff',
105
- borderRadius: 6,
106
- id: index
107
- }));
108
- }
109
- }
110
- catch (e) {
111
- console.error("Invalid JSON action format", e);
112
- }
113
- return [];
114
- }
115
- processBooklet() {
116
- if (this.bookletId) {
117
- if (this.bookletId.length == 18) {
118
- this.readBooklet(this.bookletId);
119
- }
120
- }
121
- else if (this.bookletJSON) {
122
- // Try to pass a value from Backend to differentiate the QuestionBook Read and AnswerBook Read
123
- this.isAnswerFlag = true;
124
- if (this.bookletJSON != null && this.bookletJSON != undefined && this.bookletJSON?.bookQuestionsMap) {
125
- // SKS28MAR25 get the nested reference qb
126
- let tempbook = this.bookletJSON?.bookQuestionsMap[Object.keys(this.bookletJSON?.bookQuestionsMap)[0]].subQuestions;
127
- tempbook.forEach((element) => {
128
- if (element.type === "book" && element?.qbReference) {
129
- this.getRefQbData(element?.qbReference).subscribe((response) => {
130
- element['qbReferenceQuestions'] = response; // Assign response to qbReferenceQuestions
131
- }, (error) => {
132
- console.error("API Error:", error);
133
- });
134
- }
135
- });
136
- this.bookletJSON['bookQuestionsMap'][Object.keys(this.bookletJSON?.bookQuestionsMap)[0]].subQuestions = tempbook;
137
- // Storing the API response for future use
138
- this.storageService.save(this.bookletJSON);
139
- }
140
- // Process the Sub Question Options - This should be merged with bookQuestionsMap in future
141
- for (var sq in this.bookletJSON?.sqOptions) {
142
- this.sqOptions.set(sq, this.bookletJSON?.sqOptions[sq]);
143
- }
144
- // Process the Questions
145
- // HA 28DEC23 this applies for booklet
146
- // HA 17JAN24 Added ternary operator to avoid undefined scenario
147
- // HA 09FEB24 Adding condition to avoid undefined error
148
- if (this.bookletJSON?.bookQuestionsMap && Object.keys(this.bookletJSON?.bookQuestionsMap).length > 0) {
149
- for (var value in this.bookletJSON?.bookQuestionsMap) {
150
- this.bookQuestionsMap.set(value, this.bookletJSON?.bookQuestionsMap[value]);
151
- }
152
- }
153
- // HA 28DEC23 this applies for book or questions
154
- else if (this.bookletJSON?.records) {
155
- var value = '';
156
- // HA 09FEB24 Added ternary
157
- // RS 09DEC24 Changed keys
158
- value = this.bookletJSON?.records[0]?.id;
159
- this.bookQuestionsMap.set(value, this.bookletJSON?.questionbook);
160
- }
161
- // VD 20Jun24 - translation changes
162
- for (var value in this.bookletJSON?.translationMap) {
163
- this.translateMap.set(value, this.bookletJSON?.translationMap[value]);
164
- }
165
- // AP 23MAY25 - supports both stringified and object formats
166
- if (this.bookletJSON?.questionbook?.action != undefined && this.bookletJSON?.questionbook?.action != '') {
167
- this.actions = typeof this.bookletJSON?.questionbook.action === 'string'
168
- ? JSON.parse(this.bookletJSON?.questionbook.action)
169
- : this.bookletJSON?.questionbook.action;
170
- }
171
- }
172
- // HA 19DEC23 langDirection variable value assigning
173
- // RS 09DEC24 Changed keys
174
- if (this.bookletJSON?.questionbook?.style) {
175
- var style = typeof this.bookletJSON?.questionbook?.style === 'object' ? this.bookletJSON?.questionbook?.style : JSON.parse(this.bookletJSON?.questionbook?.style);
176
- this.langDirection = style?.direction;
177
- }
178
- else if (this.bookletJSON?.records && this.bookletJSON?.records[0]?.style) {
179
- var style = typeof this.bookletJSON?.records[0]?.style === 'object' ? this.bookletJSON?.records[0]?.style : JSON.parse(this.bookletJSON?.records[0]?.style);
180
- this.langDirection = style?.direction;
181
- }
182
- // HA 18-JAN-24 The condition is used for Bind-In Logic
183
- this.handleCompleteBooklet(this.bookletJSON);
184
- this.booklet = this.bookletJSON?.records;
185
- this.abItem = this.bookletJSON?.answerbook;
186
- }
187
- // VD 12Jun24 - translation changes
188
- readBooklet = (uuid) => {
189
- if (this.serv == "api") {
190
- this.dataService.getAPIData(this.tkn, ["Booklet", "read", uuid, this.languageCode], this.successReadBooklet, this.failureReadBooklet);
191
- }
192
- else {
193
- // VD 31NOV24 param changes with new method
194
- let paramMap = { createAnswerBookFlag: false };
195
- paramMap['c__qb_id'] = '';
196
- paramMap["c__record_id"] = '';
197
- let para = {
198
- dataType: "Booklet",
199
- operation: "read",
200
- param1: uuid,
201
- paramJSON: JSON.stringify(paramMap),
202
- languageCode: this.languageCode
203
- };
204
- this.sfService.remoteAction("NxtController.processData", [JSON.stringify(para)], this.successReadBooklet, this.failureReadBooklet);
205
- }
206
- };
207
- successReadBooklet = (response) => {
208
- console.log('Inside the successReadBooklet');
209
- if (response != null || response != undefined) {
210
- // Storing the API response for future use
211
- this.storageService.save(response);
212
- // Try to pass a value from Backend to differentiate the QuestionBook Read and AnswerBook Read
213
- // this.isAnswerFlag = true;
214
- this.booklet = response.records;
215
- this.abItem = response.answerbook;
216
- // Process the Sub Question Options - This should be merged with bookQuestionsMap in future
217
- for (var sq in response.sqOptions) {
218
- this.sqOptions.set(sq, response.sqOptions[sq]);
219
- }
220
- // Process the Questions
221
- for (var value in response.bookQuestionsMap) {
222
- this.bookQuestionsMap.set(value, response.bookQuestionsMap[value]);
223
- }
224
- // VD 11Jun24 - translation changes
225
- for (var value in response.translationMap) {
226
- this.translateMap.set(value, response.translationMap[value]);
227
- }
228
- // VD 31NOV24 wrapper changes
229
- if (response.questionbook?.action != undefined) {
230
- this.actions = typeof response.questionbook?.action === 'string'
231
- ? JSON.parse(response.questionbook?.action)
232
- : response.questionbook?.action;
233
- }
234
- }
235
- // HA 19DEC23 langDirection variable value assigning
236
- if (response?.questionbook?.style) {
237
- var style = typeof response?.questionbook?.style === 'object' ? response?.questionbook?.style : JSON.parse(response?.questionbook?.style);
238
- this.langDirection = style?.direction;
239
- }
240
- else if (response?.records[0]?.style) {
241
- var style = typeof response?.records[0]?.style === 'object' ? response?.records[0]?.style : JSON.parse(response?.records[0]?.style);
242
- this.langDirection = style?.direction;
243
- }
244
- };
245
- failureReadBooklet = (response) => {
246
- };
247
- //SKS28MAR25 Function to fetch refqb data
248
- getRefQbData(refqbid) {
249
- return this.http.get(`https://dev-api.valarhr.com/nxt?name=${refqbid}`);
250
- }
251
- singleFieldChange(event) {
252
- console.log("single FieldChange", event);
253
- let actionButton;
254
- this.actions.forEach(action => {
255
- if (action.eventtoemit === 'submit') {
256
- actionButton = action;
257
- }
258
- });
259
- this.handleBookletActionClick(actionButton, event);
260
- }
261
- handleBookletActionClick(action, ques) {
262
- // HA 19JAN24 Action changes
263
- // RS 09DEC24 Changed keys
264
- this.answerList = [];
265
- this.dataBind = []; // HA 12FEB24 Clearing dataBind upon button action so that dataBind value will not override the changed value
266
- let dataToParent = {};
267
- let validForm = true; // VD 01Aug24 - validation change
268
- let isPrimaryKey = false;
269
- let primaryKeyElement;
270
- let dependentElementArray = [];
271
- // HA 22JAN24 this change to make close event work
272
- dataToParent['action'] = action.eventtoemit;
273
- if (!(action.eventtoemit === 'close' || action.eventtoemit === 'print')) {
274
- // HA 18-JAN-24 Sending the complete json data also
275
- dataToParent['jsonBook'] = this.storageService.get();
276
- // HA 17JAN24 nxtId to dataParent object
277
- if (this.bookletJSON) {
278
- dataToParent['nxtId'] = Object.keys(this.bookletJSON?.bookQuestionsMap)[0];
279
- }
280
- // HA 11-JAN-24 Minimizing the value which has to be passed to the server
281
- this.handleCompleteBooklet(dataToParent['jsonBook']);
282
- dataToParent['data'] = this.answerList ? this.answerList : dataToParent['data'];
283
- // when clicking the submit button validating the required fields
284
- for (let key in dataToParent['jsonBook'].bookQuestionsMap) {
285
- const currentBook = dataToParent['jsonBook'].bookQuestionsMap[key];
286
- currentBook.subQuestions.forEach(element => {
287
- if (!isPrimaryKey) {
288
- if (element?.primaryKey === true && element?.input !== undefined && element?.input !== '' && element?.input !== null) {
289
- isPrimaryKey = true;
290
- primaryKeyElement = element;
291
- }
292
- }
293
- // VD 01Aug24 - validation change
294
- if (element.isOptional && dataToParent['action'] == 'submit' && (!element.input || (Array.isArray(element.input) && element.input.length === 0)) && !element.isHidden && element.type != 'Label' && element.type != 'Image') { //SKS5NOV25
295
- element.error = true;
296
- validForm = false;
297
- this.changeService.submitChange(element.id);
298
- }
299
- // VD 02Aug24 - clear action changes
300
- if (dataToParent['action'] == 'clear') {
301
- if (element.type == 'Dropdown' || element.type == 'Location' || element.type == 'Radio') {
302
- element.selectedValue = undefined;
303
- }
304
- else if (element.type == 'File') {
305
- element.input = [];
306
- }
307
- else if (element.type === "Boolean") { // SKS23JUN25 defaultly set value false
308
- element.input = false;
309
- }
310
- else {
311
- element.input = '';
312
- }
313
- }
314
- });
315
- if (ques?.subText?.sourceQuestionId !== undefined && ques?.subText?.sourceQuestionId !== null && ques?.subText?.sourceQuestionId !== '' && !ques?.subText?.isDependentField) {
316
- }
317
- else if (ques?.subText?.sourceQuestionId !== undefined && ques?.subText?.sourceQuestionId !== null && ques?.subText?.sourceQuestionId !== '' && ques?.subText?.isDependentField) {
318
- }
319
- else {
320
- currentBook.subQuestions.forEach(ele => {
321
- if (ques?.id && ques?.id === ele?.subText?.sourceQuestionId) {
322
- dependentElementArray.push(ele.id);
323
- }
324
- });
325
- }
326
- }
327
- }
328
- // VD 13MAY24 - print QR button changes
329
- if (action.eventtoemit === 'print') {
330
- dataToParent['actionData'] = action['data'];
331
- }
332
- // MSM 17JUN25 - Close button event changes
333
- if (action.eventtoemit === 'close' && this.isEdit) {
334
- this.isEdit = false;
335
- }
336
- // HA 23JAN24 To call the action on any event
337
- // VD 01Aug24 - validation change
338
- if (validForm) {
339
- // SKS13JUN25 single field change emit
340
- if (ques && ques.singleFieldChange) {
341
- dataToParent.data = dataToParent.data.filter((inputData) => inputData.id === ques.id || inputData.id === primaryKeyElement?.id || dependentElementArray.includes(inputData.id));
342
- }
343
- if (isPrimaryKey) {
344
- dataToParent.action = 'save';
345
- }
346
- this.handleBookletActionEvent.emit(dataToParent);
347
- }
348
- else {
349
- dataToParent['action'] = 'error';
350
- this.handleBookletActionEvent.emit(dataToParent);
351
- }
352
- }
353
- // HA 18-JAN-24 handleCompleteBooklet is to simplify the logic
354
- handleCompleteBooklet(completeBooklet) {
355
- if (Object.keys(completeBooklet?.bookQuestionsMap ?? {}).length === 0) { // HA 11-JAN-24 If condition to load booklet
356
- this.handleBook(completeBooklet?.questionbook?.subQuestions);
357
- }
358
- else { // HA 11-JAN-24 To load book questions
359
- for (const key in completeBooklet.bookQuestionsMap) {
360
- const val = completeBooklet.bookQuestionsMap[key];
361
- if (val.type === 'Book') {
362
- this.handleBook(val.subQuestions);
363
- }
364
- else {
365
- this.handleQues(val);
366
- }
367
- }
368
- }
369
- }
370
- // HA 11-JAN-24 handleBook loads the Book
371
- // RS 09DEC24 Changed keys
372
- handleBook(quesList) {
373
- quesList?.forEach(element => {
374
- if (element.type === 'Book' && element.qbReferenceQuestions) {
375
- // HA 24JAN24 Fetching from QB reference
376
- var book = typeof element.qbReferenceQuestions === 'object' ? element.qbReferenceQuestions : JSON.parse(element.qbReferenceQuestions);
377
- const firstKey = Object.keys(book?.bookQuestionsMap || {})[0];
378
- book?.bookQuestionsMap[firstKey]?.subQuestions?.forEach(ques => {
379
- this.handleQues(ques);
380
- });
381
- }
382
- else {
383
- this.handleQues(element);
384
- }
385
- });
386
- // VD 13Sep24 - databind changes
387
- // VD 23 Oct24 - file type changes
388
- if (this.dataBind && Object.keys(this.dataBind).length > 0) {
389
- this.changeService.dataChanges('dataBind');
390
- }
391
- }
392
- // SKS20MAR25 flattening nested objects, mapping values using referenceField
393
- flattenObject(obj, parentKey = '') {
394
- let result = [];
395
- for (let [key, val] of Object.entries(obj)) {
396
- let newKey = parentKey ? `${parentKey}.${key}` : key;
397
- if (Array.isArray(val)) {
398
- result.push([newKey, val]); // Include full array
399
- val.forEach((item, index) => {
400
- if (typeof item === 'object' && item !== null) {
401
- result.push(...this.flattenObject(item, `${newKey}[${index}]`)); // Flatten objects in arrays
402
- }
403
- else {
404
- result.push([`${newKey}[${index}]`, item]); // Store primitive values in arrays
405
- }
406
- });
407
- }
408
- else if (typeof val === 'object' && val !== null) {
409
- result.push([newKey, val]); // Always include full object
410
- result.push(...this.flattenObject(val, newKey)); // Continue flattening
411
- }
412
- else {
413
- result.push([newKey, val]); // Store primitive value
414
- }
415
- }
416
- return result;
417
- }
418
- // SKS20MAR25 referenceField set like this
419
- // name --> normal
420
- // items[0].name --> value in a array set like this
421
- // addresses.line2 ---> if value in a json set like this
422
- // addresses.line4.dd ---> if value in a nested json set like this
423
- // HA 11-JAN-24 handleQues to load question
424
- // VD 06Sep24 calendar changes
425
- handleQues(ques) {
426
- // HA 19-JAN-24 If condition is for bind-in, correction
427
- // HA 09FEB24 Adding condition to avoid undefined error
428
- if (this.dataBind && Object.keys(this.dataBind).length > 0) {
429
- let result = this.flattenObject(this.dataBind);
430
- let found = false;
431
- for (let [key, val] of result) {
432
- let value = val;
433
- if (ques.referenceField === key) {
434
- found = true;
435
- if (ques.type === 'Dropdown' || ques.type === 'Radio') {
436
- this.sqOptions.forEach(element => {
437
- if (element['referenceField'] === key) {
438
- element['input'] = ques.input = value || ques.defaultValue;
439
- element['selectedValue'] = ques.selectedValue = value || ques.defaultValue;
440
- }
441
- });
442
- }
443
- // HA 24JAN24 To bind-in Date and DateTime
444
- else if (ques.type === 'Date' || ques.type == 'DateTime') {
445
- ques.input = new Date(value?.toString()) || ques.defaultValue;
446
- }
447
- // HA 12FEB24 To bind-in Location Type
448
- else if (ques.type === 'Location') {
449
- ques.input = value || ques.defaultValue;
450
- ques.selectedValue = value['address'] ? value['address'] : value || ques.defaultValue;
451
- }
452
- // VD 06Sep24 calendar changes for data bindIn
453
- else if (ques.type === 'Calendar') {
454
- let entries = typeof ques['fieldsMeta'] === 'object' ? ques['fieldsMeta'] : JSON.parse(ques['fieldsMeta']);
455
- if (entries) {
456
- let referenceQuestions = [];
457
- if (entries.length > 0) {
458
- entries.forEach(element => {
459
- if (element.questionReference) {
460
- let qReference = JSON.parse(element.questionReference);
461
- referenceQuestions.push(qReference?.question);
462
- }
463
- });
464
- }
465
- if (referenceQuestions.length > 0) {
466
- value?.forEach(calendarArray => {
467
- let date = new Date(calendarArray.date);
468
- calendarArray.entries.forEach(inputEntry => {
469
- for (let [k, v] of Object.entries(inputEntry)) {
470
- referenceQuestions.forEach(field => {
471
- if (field.referenceField == k) {
472
- if (field.type === 'Date' || field.type == 'DateTime' || field.type == 'Time') {
473
- field.input = new Date(v?.toString()) || ques.defaultValue;
474
- }
475
- if (field.type === 'Dropdown' || field.type === 'Radio') {
476
- field.selectedValue = v;
477
- field.input = v || ques.defaultValue;
478
- }
479
- else {
480
- field.input = v || ques.defaultValue;
481
- }
482
- }
483
- });
484
- }
485
- this.addEvent(date, referenceQuestions); //SKS 27SEP24 each event added to allEvents array
486
- });
487
- // this.addEvent(date,referenceQuestions); //this is only last event added to allEvents array
488
- });
489
- }
490
- }
491
- ques.input = this.allEvents.length > 0 ? this.allEvents : '';
492
- }
493
- // VD 23 Oct24 - file type changes
494
- else if (ques.type === 'File') {
495
- ques.input = [];
496
- ques.input = value;
497
- }
498
- else if (ques.type === "Boolean") { // SKS23JUN25 defaultly set value false
499
- ques.input = typeof value !== 'undefined' ? value === true || value === 'true' : typeof ques.defaultValue !== 'undefined' ? ques.defaultValue === true || ques.defaultValue === 'true' : false;
500
- }
501
- else {
502
- ques.input = value || ques.defaultValue;
503
- }
504
- this.answerList.push(ques); // HA 12FEB24 To give the value for data
505
- break; // AP-03JUN25 - Match found and value bound; no need to continue the loop
506
- }
507
- }
508
- if (!found) {
509
- ques.type === 'Boolean' ? ques.input = false : ques.input = null; // SKS23JUN25 defaultly set value false
510
- }
511
- }
512
- else {
513
- const question = {};
514
- question['id'] = ques.id;
515
- question['input'] = ques.input || ques.defaultValue || null;
516
- // HA 12FEB24 To bind-out Location Type
517
- if (ques.type === 'Location') {
518
- question['input'] = ques.input ? ques.input : ques.selectedValue || null;
519
- }
520
- else if (ques.type == 'File') {
521
- // VD 23 Oct24 - file type changes
522
- question['input'] = ques.input ? ques.input : ques.defaultValue || [];
523
- }
524
- else if (ques.type === "Boolean") { // SKS23JUN25 defaultly set value false
525
- question['input'] = typeof ques.input !== 'undefined' ? ques.input === true || ques.input === 'true' : typeof ques.defaultValue !== 'undefined' ? ques.defaultValue === true || ques.defaultValue === 'true' : false;
526
- }
527
- question['type'] = ques.type;
528
- question['questionNumber'] = ques.questionNumber;
529
- question['referenceField'] = ques?.referenceField;
530
- question['selectedValue'] = ques?.selectedValue; // MR 31JAN24 Need to pass the selected value too
531
- this.answerList.push(question);
532
- }
533
- }
534
- // VD 06Sep24 calendar changes for data bindIn
535
- addEvent(day, entryQues) {
536
- // Transform new entries into the desired format
537
- const newEntries = entryQues.reduce((acc, q) => {
538
- acc[q.id] = { ...q };
539
- return acc;
540
- }, {});
541
- // Find if an event already exists for the given date
542
- const existingEvent = this.allEvents.find(event => event.date.toDateString() === day.toDateString());
543
- if (existingEvent) {
544
- // If the event exists, push the new entries to the existing entries
545
- const existingEntries = existingEvent.entries.map(entry => ({ ...entry }));
546
- existingEntries.push(newEntries);
547
- existingEvent.entries = existingEntries;
548
- }
549
- else {
550
- // Create a new event if it doesn't exist for the given date
551
- const newEvent = {
552
- id: '_' + Math.random().toString(36).substr(2, 9),
553
- date: day,
554
- entries: [newEntries] // Wrap the new entries in an array
555
- };
556
- this.allEvents.push(newEvent);
557
- }
558
- }
559
- readQuestions(qbId) {
560
- let questions = [];
561
- // HA 31-JAN-24 Added ternary to avoid undefined
562
- for (var sq in this.bookQuestionsMap?.get(qbId)?.subQuestions) {
563
- // AP-14MAY25 Extracted question from subQuestions into variable 'q'
564
- let q = this.bookQuestionsMap?.get(qbId).subQuestions[sq];
565
- // HA 09FEB24 if question is there process
566
- if (q) {
567
- if ((q.type == 'Dropdown' || q.type == 'Radio') && this.sqOptions.get(q.id)) {
568
- questions.push(this.sqOptions.get(q.id));
569
- }
570
- else {
571
- questions.push(q);
572
- }
573
- }
574
- }
575
- // VD 12Jun24 field permisision changes
576
- if (this.fieldRestrictions) {
577
- const fieldRestrictions = new Map(Object.entries(this.fieldRestrictions.fields));
578
- questions.forEach(ques => {
579
- const restriction = fieldRestrictions.get(ques.uniqueIdentifier);
580
- if (restriction) {
581
- ques.isReadOnly = restriction === 'readOnly';
582
- ques.isHidden = restriction === 'hide';
583
- }
584
- });
585
- }
586
- return questions;
587
- }
588
- // VD 11Jun24 - translation changes
589
- readTransQuestions(qbId) {
590
- let record = [];
591
- let translateRecord = this.translateMap.get(qbId);
592
- if (translateRecord && translateRecord.length > 0) {
593
- translateRecord.forEach(lanRec => {
594
- if (lanRec.languageCode == this.languageCode) {
595
- record = lanRec.fields;
596
- }
597
- });
598
- }
599
- return record;
600
- }
601
- getText(value) {
602
- var doc = new DOMParser().parseFromString(value, "text/html");
603
- return this.sanitizer.bypassSecurityTrustHtml(doc.documentElement.textContent);
604
- }
605
- getDropDown(event) {
606
- this.hadleDropDownDependent.emit(event);
607
- }
608
- // VD 06Sep24 calendar changes
609
- getCalendarDate(event) {
610
- this.handleCalendarDate.emit(event);
611
- }
612
- getCalendarEvent(event) {
613
- event["nxtId"] = Object.keys(this.bookletJSON?.bookQuestionsMap)[0];
614
- this.handleCalendarEvent.emit(event);
615
- }
616
- editChangeClick(action) {
617
- this.isEdit = true;
618
- }
619
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookletComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.StorageService }, { token: i4.DomSanitizer }, { token: i5.ChangeService }, { token: i6.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
620
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: BookletComponent, isStandalone: true, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", allIcons: "allIcons", themeColor: "themeColor", cdnIconURL: "cdnIconURL", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", languageCode: "languageCode", fieldRestrictions: "fieldRestrictions", from: "from", apiUrl: "apiUrl", isEdit: "isEdit", dataBind: "dataBind" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, viewQueries: [{ propertyName: "questionbookComponent", first: true, predicate: ["questionbook"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [translatedQuestions]=\"readTransQuestions(qb.id)\"\n [questions]=\"readQuestions(qb.id)\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ qb?.questionText }}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [ngClass]=\"langDirection\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.eventtoemit === 'submit'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ action.name }}\n </button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "translatedQuestions", "questions", "errorFieldId", "labelValue", "token", "isEdit", "dropDownData", "dataBind", "allIcons", "themeColor", "cdnIconURL"], outputs: ["handleDropDown", "handleQuestion", "singleFieldChangeEmit", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }] });
621
- }
622
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookletComponent, decorators: [{
623
- type: Component,
624
- args: [{ selector: 'lib-booklet', standalone: true, imports: [
625
- CommonModule,
626
- FormsModule,
627
- QuestionbookComponent
628
- ], template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [translatedQuestions]=\"readTransQuestions(qb.id)\"\n [questions]=\"readQuestions(qb.id)\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ qb?.questionText }}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [ngClass]=\"langDirection\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.eventtoemit === 'submit'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ action.name }}\n </button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"] }]
629
- }], ctorParameters: () => [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.StorageService }, { type: i4.DomSanitizer }, { type: i5.ChangeService }, { type: i6.HttpClient }], propDecorators: { bookletId: [{
630
- type: Input
631
- }], serv: [{
632
- type: Input
633
- }], tkn: [{
634
- type: Input
635
- }], bookletJSON: [{
636
- type: Input
637
- }], allIcons: [{
638
- type: Input
639
- }], themeColor: [{
640
- type: Input
641
- }], cdnIconURL: [{
642
- type: Input
643
- }], dropdownDependentData: [{
644
- type: Input
645
- }], labelValue: [{
646
- type: Input
647
- }], token: [{
648
- type: Input
649
- }], languageCode: [{
650
- type: Input
651
- }], fieldRestrictions: [{
652
- type: Input
653
- }], from: [{
654
- type: Input
655
- }], apiUrl: [{
656
- type: Input
657
- }], isEdit: [{
658
- type: Input
659
- }], handleBookletActionEvent: [{
660
- type: Output
661
- }], handlePage: [{
662
- type: Output
663
- }], hadleDropDownDependent: [{
664
- type: Output
665
- }], handleCalendarDate: [{
666
- type: Output
667
- }], handleCalendarEvent: [{
668
- type: Output
669
- }], dataBind: [{
670
- type: Input
671
- }], questionbookComponent: [{
672
- type: ViewChild,
673
- args: ['questionbook']
674
- }] } });
675
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFZdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBYTdDLE1BQU0sT0FBTyxnQkFBZ0I7SUE0Q2pCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWhERCxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLFFBQVEsQ0FBTSxDQUFDLDBDQUEwQztJQUN6RCxVQUFVLENBQVMsQ0FBQywwQ0FBMEM7SUFDOUQsVUFBVSxDQUFTLENBQUMsMENBQTBDO0lBQzlELHFCQUFxQixDQUFNO0lBQzNCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQVM7SUFDZCxZQUFZLENBQVMsQ0FBRSxtQ0FBbUM7SUFDMUQsaUJBQWlCLENBQU0sQ0FBQyx1Q0FBdUM7SUFDL0QsSUFBSSxDQUFNLENBQUMsZ0NBQWdDO0lBQzNDLE1BQU0sQ0FBTSxDQUFDLDZFQUE2RTtJQUMxRixNQUFNLENBQVcsQ0FBQyxrQ0FBa0M7SUFFbkQsd0JBQXdCLEdBQXNCLElBQUksWUFBWSxFQUFF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RixZQUFZLDZWQUNaLFdBQVcsK0JBQ1gscUJBQXFCOzs0RkFLWixnQkFBZ0I7a0JBWDVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gscUJBQXFCO3FCQUN0Qjs2TkFLUSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBZ0JFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR3FCLHFCQUFxQjtzQkFBL0MsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBFbGVtZW50UmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTYWxlc2ZvcmNlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zYWxlc2ZvcmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcbmltcG9ydCB7IEFjdGlvbk1ldGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjdGlvbk1ldGEnO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vLi4vd3JhcHBlclwiO1xuaW1wb3J0IHsgQm9va2xldFdyYXBwZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWwvYm9va2xldFdyYXBwZXJcIjtcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY2hhbmdlLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25ib29rQ29tcG9uZW50IH0gZnJvbSBcIi4uL3F1ZXN0aW9uYm9vay9xdWVzdGlvbmJvb2suY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYm9va2xldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUXVlc3Rpb25ib29rQ29tcG9uZW50XG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9ib29rbGV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYm9va2xldC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQm9va2xldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGJvb2tsZXRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBzZXJ2OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRrbjogc3RyaW5nO1xuICBASW5wdXQoKSBib29rbGV0SlNPTjogYW55O1xuICBASW5wdXQoKSBhbGxJY29uczogYW55OyAvL01TTTEwSlVMMjUgaWNvbiBzZWxlY3RvciBjb21wb25lbnQgaW5wdXRcbiAgQElucHV0KCkgdGhlbWVDb2xvcjogc3RyaW5nOyAvL01TTTEwSlVMMjUgaWNvbiBzZWxlY3RvciBjb21wb25lbnQgaW5wdXRcbiAgQElucHV0KCkgY2RuSWNvblVSTDogc3RyaW5nOyAvL01TTTEwSlVMMjUgaWNvbiBzZWxlY3RvciBjb21wb25lbnQgaW5wdXRcbiAgQElucHV0KCkgZHJvcGRvd25EZXBlbmRlbnREYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGxhYmVsVmFsdWU6IHN0cmluZztcbiAgQElucHV0KCkgdG9rZW46IHN0cmluZztcbiAgQElucHV0KCkgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7ICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBASW5wdXQoKSBmaWVsZFJlc3RyaWN0aW9uczogYW55OyAvLyBWRCAxMkp1bjI0IC0gZmllbGQgcGVybWlzc2lvbiBjaGFuZ2VcbiAgQElucHV0KCkgZnJvbTogYW55OyAvLyBGb3JtIEJ1aWxkZXIgZGVwZW5kZW50IGNoYW5nZVxuICBASW5wdXQoKSBhcGlVcmw6IGFueTsgLy8gQVAtMTZBUFIyNSBJbnB1dCBwcm9wZXJ0eSB0byByZWNlaXZlIHRoZSBBUEkgVVJMIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnRcbiAgQElucHV0KCkgaXNFZGl0OiBib29sZWFuIDsgLy8gQVAtMTlNQVkyNSAtIEFkZGVkIGlzRWRpdCBpbnB1dFxuXG4gIEBPdXRwdXQoKSBoYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaGFuZGxlUGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYWRsZURyb3BEb3duRGVwZW5kZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIEBPdXRwdXQoKSBoYW5kbGVDYWxlbmRhckRhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaGFuZGxlQ2FsZW5kYXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIG54dEJvb2tsZXQ6IEJvb2tsZXRXcmFwcGVyO1xuXG4gIHB1YmxpYyBib29rbGV0OiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgYWJJdGVtOiBhbnkgPSB7fTtcbiAgcHVibGljIGFjdGlvbnM6IEFjdGlvbk1ldGFbXSA9IFtdO1xuICBwdWJsaWMgYm9va1F1ZXN0aW9uc01hcDogYW55ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgdHJhbnNsYXRlTWFwOiBhbnkgPSBuZXcgTWFwKCk7ICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBwcml2YXRlIHNxT3B0aW9uczogYW55ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgaXNBbnN3ZXJGbGFnOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzcGlubmVyTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgc3Bpbm5lclR5cGU6IHN0cmluZztcbiAgLy8gSEEgMTlERUMyMyBsYW5nRGlyZWN0aW9uIHZhcmlhYmxlIGlzIGNyZWF0ZWQgdG8gYXNzaWduIHRoZSBkaXJlY3Rpb24gYXMgY2xhc3NcbiAgbGFuZ0RpcmVjdGlvbiA9ICdsdHInOyAvLyBIQSAyOERFQzIzIG1ha2luZyBsdHIgYXMgZGVmYXVsdCBkaXJlY3Rpb25cbiAgYW5zd2VyTGlzdCA9IFtdOyAvLyBIQSAxMS1KQU4tMjQgQW5zd2VybGlzdCB0byBzdG9yZSB0aGUgbWluaW1hbCB2YWx1ZVxuICBASW5wdXQoKSBkYXRhQmluZDogYW55Oy8vIEhBIDE4LUpBTi0yNCBUbyBpbnNlcnQgdGhlIGVuZHBvaW50IHZhbHVlIHRvIHRoZSBxdWVzdGlvblxuICBhbGxFdmVudHM6IGFueVtdID0gW107ICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgLy9BUC0xOU1BWTI1IC0gQWNjZXNzaW5nIHRoZSBRdWVzdGlvbmJvb2tDb21wb25lbnQgaW5zdGFuY2UgdXNpbmcgVmlld0NoaWxkIHJlZmVyZW5jZVxuICBAVmlld0NoaWxkKCdxdWVzdGlvbmJvb2snKSBxdWVzdGlvbmJvb2tDb21wb25lbnQhOiBRdWVzdGlvbmJvb2tDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZlNlcnZpY2U6IFNhbGVzZm9yY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxuICApIHtcbiAgICB0aGlzLnNwaW5uZXJOYW1lID0gXCJzcDFcIjtcbiAgICB0aGlzLnNwaW5uZXJUeXBlID0gXCJiYWxsLXNwaW4tY2xvY2t3aXNlXCI7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb2Nlc3NCb29rbGV0KCk7XG4gICAgLy9BUC0xNkFQUjI1IC8vIEdldCB0aGUgZHluYW1pYyBBUEkgVVJMIGFuZCBwYXNzIGl0IHRvIHRoZSBzZXJ2aWNlIG1ldGhvZFxuICAgIGxldCBhcGlkYXRhID0gIHRoaXMuYXBpVXJsO1xuICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpa2V5KGFwaWRhdGEpO1xuICB9XG4gIC8vIFZEIE5PVjIzIC0gdXBkYXRlIHRoZSBqc29uIGRhdGEgd2hlbiBib29rbGV0SWQgYW5kIGJvb2tsZXRKU09OIGNoYW5nZXNcbiAgbmdPbkNoYW5nZXMoc2ltcGxlY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIEhBIDIzSkFOMjQgVG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICAgaWYgKHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRJZCddIHx8IChzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddICYmIHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRKU09OJ10uY3VycmVudFZhbHVlICE9IG51bGwpIHx8IChzaW1wbGVjaGFuZ2VzWydkYXRhQmluZCddICYmIHNpbXBsZWNoYW5nZXNbJ2RhdGFCaW5kJ10uY3VycmVudFZhbHVlICE9IG51bGwpKSB7XG4gICAgICB0aGlzLmFsbEV2ZW50cyA9IFtdO1xuICAgICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICAgIH1cbiAgICAvL0FQLTE5TUFZMjUgLSBJZiBib29rbGV0SlNPTiBpbnB1dCBjaGFuZ2VzLCB0cmlnZ2VyIHByb2Nlc3NEYXRhIG9uIFF1ZXN0aW9uYm9va0NvbXBvbmVudFxuICAgIGlmIChzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddLmN1cnJlbnRWYWx1ZTtcbiAgICAvL0FQLTI4TUFZMjUgLSBJZiB0aGUgYWN0aW9uIGlzIGEgc3RyaW5nLCB1cGdyYWRlIGl0IHRvIHRoZSBuZXcgYWN0aW9uIG1vZGVsIChhcnJheSBvZiBvYmplY3RzKVxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZT8ucXVlc3Rpb25ib29rPy5hY3Rpb24gJiYgdHlwZW9mIGN1cnJlbnRWYWx1ZS5xdWVzdGlvbmJvb2suYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICBjdXJyZW50VmFsdWUucXVlc3Rpb25ib29rLmFjdGlvbiA9IHRoaXMudXBncmFkZUFjdGlvbnMoY3VycmVudFZhbHVlLnF1ZXN0aW9uYm9vay5hY3Rpb24pO1xuICAgICAgfSAgXG4gICAgICBpZiAodGhpcy5xdWVzdGlvbmJvb2tDb21wb25lbnQpe1xuICAgICAgICB0aGlzLnF1ZXN0aW9uYm9va0NvbXBvbmVudC5wcm9jZXNzRGF0YSgpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFQLTI4TUFZMjUgLSBDb252ZXJ0cyBvbGQgYWN0aW9uIHN0cmluZyAoSlNPTikgaW50byBhIG5ldyBtb2RlbCAoYXJyYXkgb2YgYWN0aW9uIG9iamVjdHMpXG4gIHVwZ3JhZGVBY3Rpb25zKGFjdGlvblN0cmluZzogc3RyaW5nKTogYW55W10ge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gcGFyc2UgdGhlIGFjdGlvbiBzdHJpbmcgdG8gSlNPTlxuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShhY3Rpb25TdHJpbmcpO1xuICAvLyBBUC0yOE1BWTI1IElmIHBhcnNlZCByZXN1bHQgaXMgYW4gYXJyYXksIGFwcGx5IGRlZmF1bHQgc3R5bGVzIGFuZCBhZGp1c3QgcG9zaXRpb25cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgcG9zaXRpb25QZXJjZW50OiBpdGVtLm5hbWUgPT09ICdDYW5jZWwnID8gMyA6IDE0LCAvLyBTZXQgcG9zaXRpb24gYmFzZWQgb24gYWN0aW9uIG5hbWVcbiAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIHRleHRDb2xvcjogJyNmZmZmZmYnLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogNixcbiAgICAgICAgICBpZDogaW5kZXhcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIEpTT04gYWN0aW9uIGZvcm1hdFwiLCBlKTtcbiAgICB9XG4gIFxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByb2Nlc3NCb29rbGV0KCkgeyBcbiAgICBpZiAodGhpcy5ib29rbGV0SWQpIHtcbiAgICAgIGlmICh0aGlzLmJvb2tsZXRJZC5sZW5ndGggPT0gMTgpIHtcbiAgICAgICAgdGhpcy5yZWFkQm9va2xldCh0aGlzLmJvb2tsZXRJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmJvb2tsZXRKU09OKSB7XG4gICAgICAvLyBUcnkgdG8gcGFzcyBhIHZhbHVlIGZyb20gQmFja2VuZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBRdWVzdGlvbkJvb2sgUmVhZCBhbmQgQW5zd2VyQm9vayBSZWFkXG4gICAgICB0aGlzLmlzQW5zd2VyRmxhZyA9IHRydWU7XG5cbiAgICAgIGlmICh0aGlzLmJvb2tsZXRKU09OICE9IG51bGwgJiYgdGhpcy5ib29rbGV0SlNPTiAhPSB1bmRlZmluZWQgJiYgdGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICAvLyBTS1MyOE1BUjI1IGdldCB0aGUgbmVzdGVkIHJlZmVyZW5jZSBxYiBcbiAgICAgICAgbGV0IHRlbXBib29rID0gdGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcFtPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKVswXV0uc3ViUXVlc3Rpb25zO1xuICAgICAgICB0ZW1wYm9vay5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJib29rXCIgJiYgZWxlbWVudD8ucWJSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVmUWJEYXRhKGVsZW1lbnQ/LnFiUmVmZXJlbmNlKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10gPSByZXNwb25zZTsgLy8gQXNzaWduIHJlc3BvbnNlIHRvIHFiUmVmZXJlbmNlUXVlc3Rpb25zXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBUEkgRXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJvb2tsZXRKU09OWydib29rUXVlc3Rpb25zTWFwJ11bT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcClbMF1dLnN1YlF1ZXN0aW9ucyA9IHRlbXBib29rXG4gICAgICAgIC8vIFN0b3JpbmcgdGhlIEFQSSByZXNwb25zZSBmb3IgZnV0dXJlIHVzZVxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUodGhpcy5ib29rbGV0SlNPTik7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFN1YiBRdWVzdGlvbiBPcHRpb25zIC0gVGhpcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggYm9va1F1ZXN0aW9uc01hcCBpbiBmdXR1cmVcbiAgICAgIGZvciAodmFyIHNxIGluIHRoaXMuYm9va2xldEpTT04/LnNxT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNxT3B0aW9ucy5zZXQoc3EsIHRoaXMuYm9va2xldEpTT04/LnNxT3B0aW9uc1tzcV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBRdWVzdGlvbnNcbiAgICAgIC8vIEhBIDI4REVDMjMgdGhpcyBhcHBsaWVzIGZvciBib29rbGV0XG4gICAgICAvLyBIQSAxN0pBTjI0IEFkZGVkIHRlcm5hcnkgb3BlcmF0b3IgdG8gYXZvaWQgdW5kZWZpbmVkIHNjZW5hcmlvXG4gICAgICAvLyBIQSAwOUZFQjI0IEFkZGluZyBjb25kaXRpb24gdG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICAgICBpZiAodGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcCAmJiBPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwW3ZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEhBIDI4REVDMjMgdGhpcyBhcHBsaWVzIGZvciBib29rIG9yIHF1ZXN0aW9uc1xuICAgICAgZWxzZSBpZih0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAvLyBIQSAwOUZFQjI0IEFkZGVkIHRlcm5hcnlcbiAgICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICAgICAgdmFsdWUgPSB0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5pZDtcbiAgICAgICAgdGhpcy5ib29rUXVlc3Rpb25zTWFwLnNldCh2YWx1ZSwgdGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rKTtcbiAgICAgIH1cblxuICAgICAgLy8gVkQgMjBKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMuYm9va2xldEpTT04/LnRyYW5zbGF0aW9uTWFwKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWFwLnNldCh2YWx1ZSwgdGhpcy5ib29rbGV0SlNPTj8udHJhbnNsYXRpb25NYXBbdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIC8vIEFQIDIzTUFZMjUgLSBzdXBwb3J0cyBib3RoIHN0cmluZ2lmaWVkIGFuZCBvYmplY3QgZm9ybWF0c1xuICAgICAgaWYgKHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vaz8uYWN0aW9uICE9IHVuZGVmaW5lZCAmJiB0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LmFjdGlvbiAhPSAnJykge1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSB0eXBlb2YgdGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rLmFjdGlvbiA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBKU09OLnBhcnNlKHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vay5hY3Rpb24pXG4gICAgICAgIDogdGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rLmFjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSEEgMTlERUMyMyBsYW5nRGlyZWN0aW9uIHZhcmlhYmxlIHZhbHVlIGFzc2lnbmluZ1xuICAgIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXG4gICAgaWYgKHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vaz8uc3R5bGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IHR5cGVvZiB0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LnN0eWxlID09PSAnb2JqZWN0JyA/IHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vaz8uc3R5bGUgOiBKU09OLnBhcnNlKHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vaz8uc3R5bGUpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5ib29rbGV0SlNPTj8ucmVjb3JkcyAmJiB0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5zdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gdHlwZW9mIHRoaXMuYm9va2xldEpTT04/LnJlY29yZHNbMF0/LnN0eWxlID09PSAnb2JqZWN0JyA/IHRoaXMuYm9va2xldEpTT04/LnJlY29yZHNbMF0/LnN0eWxlIDogSlNPTi5wYXJzZSh0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5zdHlsZSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIC8vIEhBIDE4LUpBTi0yNCBUaGUgY29uZGl0aW9uIGlzIHVzZWQgZm9yIEJpbmQtSW4gTG9naWMgXG4gICAgdGhpcy5oYW5kbGVDb21wbGV0ZUJvb2tsZXQodGhpcy5ib29rbGV0SlNPTik7XG4gICAgdGhpcy5ib29rbGV0ID0gdGhpcy5ib29rbGV0SlNPTj8ucmVjb3JkcztcbiAgICB0aGlzLmFiSXRlbSA9IHRoaXMuYm9va2xldEpTT04/LmFuc3dlcmJvb2s7XG4gIH1cbiAgLy8gVkQgMTJKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgcHJpdmF0ZSByZWFkQm9va2xldCA9ICh1dWlkOiBzdHJpbmcpID0+IHtcbiAgICBpZiAodGhpcy5zZXJ2ID09IFwiYXBpXCIpIHtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuZ2V0QVBJRGF0YShcbiAgICAgICAgdGhpcy50a24sXG4gICAgICAgIFtcIkJvb2tsZXRcIiwgXCJyZWFkXCIsIHV1aWQsIHRoaXMubGFuZ3VhZ2VDb2RlXSxcbiAgICAgICAgdGhpcy5zdWNjZXNzUmVhZEJvb2tsZXQsXG4gICAgICAgIHRoaXMuZmFpbHVyZVJlYWRCb29rbGV0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBWRCAzMU5PVjI0IHBhcmFtIGNoYW5nZXMgd2l0aCBuZXcgbWV0aG9kXG4gICAgICBsZXQgcGFyYW1NYXAgPSB7IGNyZWF0ZUFuc3dlckJvb2tGbGFnOiBmYWxzZSB9O1xuICAgICAgcGFyYW1NYXBbJ2NfX3FiX2lkJ10gPSAnJztcbiAgICAgIHBhcmFtTWFwW1wiY19fcmVjb3JkX2lkXCJdID0gJyc7XG4gICAgICBsZXQgcGFyYSA9IHtcbiAgICAgICAgZGF0YVR5cGU6IFwiQm9va2xldFwiLFxuICAgICAgICBvcGVyYXRpb246IFwicmVhZFwiLFxuICAgICAgICBwYXJhbTE6IHV1aWQsXG4gICAgICAgIHBhcmFtSlNPTjogSlNPTi5zdHJpbmdpZnkocGFyYW1NYXApLFxuICAgICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlXG4gICAgICB9XG4gICAgICB0aGlzLnNmU2VydmljZS5yZW1vdGVBY3Rpb24oXG4gICAgICAgIFwiTnh0Q29udHJvbGxlci5wcm9jZXNzRGF0YVwiLFxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkocGFyYSldLFxuICAgICAgICB0aGlzLnN1Y2Nlc3NSZWFkQm9va2xldCxcbiAgICAgICAgdGhpcy5mYWlsdXJlUmVhZEJvb2tsZXRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdWNjZXNzUmVhZEJvb2tsZXQgPSAocmVzcG9uc2UpID0+IHtcbiAgICBjb25zb2xlLmxvZygnSW5zaWRlIHRoZSBzdWNjZXNzUmVhZEJvb2tsZXQnKTtcbiAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCB8fCByZXNwb25zZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFN0b3JpbmcgdGhlIEFQSSByZXNwb25zZSBmb3IgZnV0dXJlIHVzZVxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKHJlc3BvbnNlKTtcblxuICAgICAgLy8gVHJ5IHRvIHBhc3MgYSB2YWx1ZSBmcm9tIEJhY2tlbmQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgUXVlc3Rpb25Cb29rIFJlYWQgYW5kIEFuc3dlckJvb2sgUmVhZFxuICAgICAgLy8gdGhpcy5pc0Fuc3dlckZsYWcgPSB0cnVlO1xuXG4gICAgICB0aGlzLmJvb2tsZXQgPSByZXNwb25zZS5yZWNvcmRzO1xuICAgICAgdGhpcy5hYkl0ZW0gPSByZXNwb25zZS5hbnN3ZXJib29rO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBTdWIgUXVlc3Rpb24gT3B0aW9ucyAtIFRoaXMgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIGJvb2tRdWVzdGlvbnNNYXAgaW4gZnV0dXJlXG4gICAgICBmb3IgKHZhciBzcSBpbiByZXNwb25zZS5zcU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcU9wdGlvbnMuc2V0KHNxLCByZXNwb25zZS5zcU9wdGlvbnNbc3FdKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyB0aGUgUXVlc3Rpb25zXG4gICAgICBmb3IgKHZhciB2YWx1ZSBpbiByZXNwb25zZS5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgIHRoaXMuYm9va1F1ZXN0aW9uc01hcC5zZXQodmFsdWUsIHJlc3BvbnNlLmJvb2tRdWVzdGlvbnNNYXBbdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXG4gICAgICBmb3IgKHZhciB2YWx1ZSBpbiByZXNwb25zZS50cmFuc2xhdGlvbk1hcCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1hcC5zZXQodmFsdWUsIHJlc3BvbnNlLnRyYW5zbGF0aW9uTWFwW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgICAvLyBWRCAzMU5PVjI0IHdyYXBwZXIgY2hhbmdlc1xuICAgICAgaWYgKHJlc3BvbnNlLnF1ZXN0aW9uYm9vaz8uYWN0aW9uICE9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSB0eXBlb2YgcmVzcG9uc2UucXVlc3Rpb25ib29rPy5hY3Rpb24gPT09ICdzdHJpbmcnXG4gICAgICAgID8gSlNPTi5wYXJzZShyZXNwb25zZS5xdWVzdGlvbmJvb2s/LmFjdGlvbilcbiAgICAgICAgOiByZXNwb25zZS5xdWVzdGlvbmJvb2s/LmFjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSEEgMTlERUMyMyBsYW5nRGlyZWN0aW9uIHZhcmlhYmxlIHZhbHVlIGFzc2lnbmluZ1xuICAgIGlmIChyZXNwb25zZT8ucXVlc3Rpb25ib29rPy5zdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gdHlwZW9mIHJlc3BvbnNlPy5xdWVzdGlvbmJvb2s/LnN0eWxlID09PSAnb2JqZWN0JyA/IHJlc3BvbnNlPy5xdWVzdGlvbmJvb2s/LnN0eWxlIDogSlNPTi5wYXJzZShyZXNwb25zZT8ucXVlc3Rpb25ib29rPy5zdHlsZSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXNwb25zZT8ucmVjb3Jkc1swXT8uc3R5bGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IHR5cGVvZiByZXNwb25zZT8ucmVjb3Jkc1swXT8uc3R5bGUgPT09ICdvYmplY3QnID8gcmVzcG9uc2U/LnJlY29yZHNbMF0/LnN0eWxlIDogSlNPTi5wYXJzZShyZXNwb25zZT8ucmVjb3Jkc1swXT8uc3R5bGUpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZhaWx1cmVSZWFkQm9va2xldCA9IChyZXNwb25zZSkgPT4ge1xuXG4gIH1cbiAgLy9TS1MyOE1BUjI1IEZ1bmN0aW9uIHRvIGZldGNoIHJlZnFiIGRhdGFcbiAgZ2V0UmVmUWJEYXRhKHJlZnFiaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgaHR0cHM6Ly9kZXYtYXBpLnZhbGFyaHIuY29tL254dD9uYW1lPSR7cmVmcWJpZH1gKTtcbiAgfVxuICBzaW5nbGVGaWVsZENoYW5nZShldmVudDogYW55KXtcbiAgICBjb25zb2xlLmxvZyhcInNpbmdsZSBGaWVsZENoYW5nZVwiLCBldmVudCk7XG4gICAgbGV0IGFjdGlvbkJ1dHRvblxuICAgIHRoaXMuYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBpZiAoYWN0aW9uLmV2ZW50dG9lbWl0ID09PSAnc3VibWl0Jyl7XG4gICAgICAgIGFjdGlvbkJ1dHRvbiA9IGFjdGlvblxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaGFuZGxlQm9va2xldEFjdGlvbkNsaWNrKGFjdGlvbkJ1dHRvbixldmVudClcbiAgfVxuICBoYW5kbGVCb29rbGV0QWN0aW9uQ2xpY2soYWN0aW9uOiBBY3Rpb25NZXRhLHF1ZXM/OmFueSkge1xuICAgIC8vIEhBIDE5SkFOMjQgQWN0aW9uIGNoYW5nZXNcbiAgICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICAgIHRoaXMuYW5zd2VyTGlzdCA9IFtdO1xuICAgIHRoaXMuZGF0YUJpbmQgPSBbXTsgLy8gSEEgMTJGRUIyNCBDbGVhcmluZyBkYXRhQmluZCB1cG9uIGJ1dHRvbiBhY3Rpb24gc28gdGhhdCBkYXRhQmluZCB2YWx1ZSB3aWxsIG5vdCBvdmVycmlkZSB0aGUgY2hhbmdlZCB2YWx1ZVxuICAgIGxldCBkYXRhVG9QYXJlbnQ6YW55ID0ge307XG4gICAgbGV0IHZhbGlkRm9ybSA9IHRydWU7IC8vIFZEIDAxQXVnMjQgLSB2YWxpZGF0aW9uIGNoYW5nZVxuICAgIGxldCBpc1ByaW1hcnlLZXkgPSBmYWxzZTtcbiAgICBsZXQgcHJpbWFyeUtleUVsZW1lbnQ6IGFueTtcbiAgICBsZXQgZGVwZW5kZW50RWxlbWVudEFycmF5IDogYW55W10gPSBbXTtcbiAgICAvLyBIQSAyMkpBTjI0IHRoaXMgY2hhbmdlIHRvIG1ha2UgY2xvc2UgZXZlbnQgd29ya1xuICAgIGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPSBhY3Rpb24uZXZlbnR0b2VtaXQ7XG4gICAgaWYgKCEoYWN0aW9uLmV2ZW50dG9lbWl0ID09PSAnY2xvc2UnIHx8IGFjdGlvbi5ldmVudHRvZW1pdCA9PT0gJ3ByaW50JykpIHtcbiAgICAgIC8vIEhBIDE4LUpBTi0yNCBTZW5kaW5nIHRoZSBjb21wbGV0ZSBqc29uIGRhdGEgYWxzbyBcbiAgICAgIGRhdGFUb1BhcmVudFsnanNvbkJvb2snXSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCk7XG4gICAgICAvLyBIQSAxN0pBTjI0IG54dElkIHRvIGRhdGFQYXJlbnQgb2JqZWN0XG4gICAgICBpZiAodGhpcy5ib29rbGV0SlNPTikge1xuICAgICAgICBkYXRhVG9QYXJlbnRbJ254dElkJ10gPSBPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKVswXTtcbiAgICAgIH1cbiAgICAgIC8vIEhBIDExLUpBTi0yNCBNaW5pbWl6aW5nIHRoZSB2YWx1ZSB3aGljaCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzZXJ2ZXJcbiAgICAgIHRoaXMuaGFuZGxlQ29tcGxldGVCb29rbGV0KGRhdGFUb1BhcmVudFsnanNvbkJvb2snXSk7XG4gICAgICBkYXRhVG9QYXJlbnRbJ2RhdGEnXSA9IHRoaXMuYW5zd2VyTGlzdCA/IHRoaXMuYW5zd2VyTGlzdCA6IGRhdGFUb1BhcmVudFsnZGF0YSddO1xuICAgICAgLy8gd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvbiB2YWxpZGF0aW5nIHRoZSByZXF1aXJlZCBmaWVsZHNcbiAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICBjb25zdCBjdXJyZW50Qm9vayA9IGRhdGFUb1BhcmVudFsnanNvbkJvb2snXS5ib29rUXVlc3Rpb25zTWFwW2tleV07XG4gICAgICAgIGN1cnJlbnRCb29rLnN1YlF1ZXN0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGlmICghaXNQcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudD8ucHJpbWFyeUtleSA9PT0gdHJ1ZSAmJiBlbGVtZW50Py5pbnB1dCAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQ/LmlucHV0ICE9PSAnJyAmJiBlbGVtZW50Py5pbnB1dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBpc1ByaW1hcnlLZXkgPSB0cnVlO1xuICAgICAgICAgICAgICBwcmltYXJ5S2V5RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFZEIDAxQXVnMjQgLSB2YWxpZGF0aW9uIGNoYW5nZVxuICAgICAgICAgIGlmIChlbGVtZW50LmlzT3B0aW9uYWwgJiYgZGF0YVRvUGFyZW50WydhY3Rpb24nXSA9PSAnc3VibWl0JyAmJiAoIWVsZW1lbnQuaW5wdXQgfHwgKEFycmF5LmlzQXJyYXkoZWxlbWVudC5pbnB1dCkgJiYgZWxlbWVudC5pbnB1dC5sZW5ndGggPT09IDApKSAmJiAhZWxlbWVudC5pc0hpZGRlbiAmJiBlbGVtZW50LnR5cGUgIT0gJ0xhYmVsJyAmJiBlbGVtZW50LnR5cGUgIT0gJ0ltYWdlJykgeyAvL1NLUzVOT1YyNSBcbiAgICAgICAgICAgIGVsZW1lbnQuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdmFsaWRGb3JtID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZpY2Uuc3VibWl0Q2hhbmdlKGVsZW1lbnQuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBWRCAwMkF1ZzI0IC0gY2xlYXIgYWN0aW9uIGNoYW5nZXNcbiAgICAgICAgICBpZiAoZGF0YVRvUGFyZW50WydhY3Rpb24nXSA9PSAnY2xlYXInKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09ICdEcm9wZG93bicgfHwgZWxlbWVudC50eXBlID09ICdMb2NhdGlvbicgfHwgZWxlbWVudC50eXBlID09ICdSYWRpbycpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZWxlY3RlZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT0gJ0ZpbGUnKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXQgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihlbGVtZW50LnR5cGUgPT09IFwiQm9vbGVhblwiKSB7IC8vIFNLUzIzSlVOMjUgZGVmYXVsdGx5IHNldCB2YWx1ZSBmYWxzZVxuICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZihxdWVzPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkICE9PSB1bmRlZmluZWQgJiYgcXVlcz8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCAhPT0gbnVsbCAmJiBxdWVzPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkICE9PSAnJyAmJiAhcXVlcz8uc3ViVGV4dD8uaXNEZXBlbmRlbnRGaWVsZCkge1xuXG4gICAgICAgIH0gZWxzZSBpZihxdWVzPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkICE9PSB1bmRlZmluZWQgJiYgcXVlcz8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCAhPT0gbnVsbCAmJiBxdWVzPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkICE9PSAnJyAmJiAgcXVlcz8uc3ViVGV4dD8uaXNEZXBlbmRlbnRGaWVsZCl7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50Qm9vay5zdWJRdWVzdGlvbnMuZm9yRWFjaChlbGUgPT4ge1xuICAgICAgICAgICAgaWYocXVlcz8uaWQgJiYgcXVlcz8uaWQgPT09IGVsZT8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCl7XG4gICAgICAgICAgICAgIGRlcGVuZGVudEVsZW1lbnRBcnJheS5wdXNoKGVsZS5pZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFZEIDEzTUFZMjQgLSBwcmludCBRUiBidXR0b24gY2hhbmdlc1xuICAgIGlmIChhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdwcmludCcpIHtcbiAgICAgIGRhdGFUb1BhcmVudFsnYWN0aW9uRGF0YSddID0gYWN0aW9uWydkYXRhJ107XG4gICAgfVxuICAgIC8vIE1TTSAxN0pVTjI1IC0gQ2xvc2UgYnV0dG9uIGV2ZW50IGNoYW5nZXNcbiAgICBpZiAoYWN0aW9uLmV2ZW50dG9lbWl0ID09PSAnY2xvc2UnICYmIHRoaXMuaXNFZGl0KSB7XG4gICAgICB0aGlzLmlzRWRpdCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBIQSAyM0pBTjI0IFRvIGNhbGwgdGhlIGFjdGlvbiBvbiBhbnkgZXZlbnRcbiAgICAvLyAgVkQgMDFBdWcyNCAtIHZhbGlkYXRpb24gY2hhbmdlXG4gICAgaWYgKHZhbGlkRm9ybSkge1xuICAgICAgLy8gU0tTMTNKVU4yNSBzaW5nbGUgZmllbGQgY2hhbmdlIGVtaXRcbiAgICAgIGlmIChxdWVzICYmIHF1ZXMuc2luZ2xlRmllbGRDaGFuZ2UpIHtcbiAgICAgICAgZGF0YVRvUGFyZW50LmRhdGEgPSBkYXRhVG9QYXJlbnQuZGF0YS5maWx0ZXIoKGlucHV0RGF0YTogYW55KSA9PiBpbnB1dERhdGEuaWQgPT09IHF1ZXMuaWQgfHwgaW5wdXREYXRhLmlkID09PSBwcmltYXJ5S2V5RWxlbWVudD8uaWQgfHwgZGVwZW5kZW50RWxlbWVudEFycmF5LmluY2x1ZGVzKGlucHV0RGF0YS5pZCkgKTtcbiAgICAgIH1cbiAgICAgIGlmKGlzUHJpbWFyeUtleSkge1xuICAgICAgICBkYXRhVG9QYXJlbnQuYWN0aW9uID0gJ3NhdmUnO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQuZW1pdChkYXRhVG9QYXJlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID0gJ2Vycm9yJztcbiAgICAgIHRoaXMuaGFuZGxlQm9va2xldEFjdGlvbkV2ZW50LmVtaXQoZGF0YVRvUGFyZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBIQSAxOC1KQU4tMjQgaGFuZGxlQ29tcGxldGVCb29rbGV0IGlzIHRvIHNpbXBsaWZ5IHRoZSBsb2dpY1xuICBoYW5kbGVDb21wbGV0ZUJvb2tsZXQoY29tcGxldGVCb29rbGV0KSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbXBsZXRlQm9va2xldD8uYm9va1F1ZXN0aW9uc01hcCA/PyB7fSkubGVuZ3RoID09PSAwKSB7IC8vIEhBIDExLUpBTi0yNCBJZiBjb25kaXRpb24gdG8gbG9hZCBib29rbGV0XG4gICAgICB0aGlzLmhhbmRsZUJvb2soY29tcGxldGVCb29rbGV0Py5xdWVzdGlvbmJvb2s/LnN1YlF1ZXN0aW9ucyk7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBIQSAxMS1KQU4tMjQgVG8gbG9hZCBib29rIHF1ZXN0aW9uc1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcGxldGVCb29rbGV0LmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgY29uc3QgdmFsID0gY29tcGxldGVCb29rbGV0LmJvb2tRdWVzdGlvbnNNYXBba2V5XTtcbiAgICAgICAgaWYgKHZhbC50eXBlID09PSAnQm9vaycpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUJvb2sodmFsLnN1YlF1ZXN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVRdWVzKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBIQSAxMS1KQU4tMjQgaGFuZGxlQm9vayBsb2FkcyB0aGUgQm9va1xuICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICBoYW5kbGVCb29rKHF1ZXNMaXN0OiBhbnkpIHtcbiAgICBxdWVzTGlzdD8uZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdCb29rJyAmJiBlbGVtZW50LnFiUmVmZXJlbmNlUXVlc3Rpb25zKSB7XG4gICAgICAgIC8vIEhBIDI0SkFOMjQgRmV0Y2hpbmcgZnJvbSBRQiByZWZlcmVuY2VcbiAgICAgICAgdmFyIGJvb2sgPSB0eXBlb2YgZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucyA9PT0gJ29iamVjdCcgPyBlbGVtZW50LnFiUmVmZXJlbmNlUXVlc3Rpb25zIDogSlNPTi5wYXJzZShlbGVtZW50LnFiUmVmZXJlbmNlUXVlc3Rpb25zKVxuICAgICAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKGJvb2s/LmJvb2tRdWVzdGlvbnNNYXAgfHwge30pWzBdO1xuICAgICAgICBib29rPy5ib29rUXVlc3Rpb25zTWFwW2ZpcnN0S2V5XT8uc3ViUXVlc3Rpb25zPy5mb3JFYWNoKHF1ZXMgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcyhxdWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVzKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFZEIDEzU2VwMjQgLSBkYXRhYmluZCBjaGFuZ2VzXG4gICAgLy8gVkQgMjMgT2N0MjQgLSBmaWxlIHR5cGUgY2hhbmdlc1xuICAgIGlmICh0aGlzLmRhdGFCaW5kICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YUJpbmQpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY2hhbmdlU2VydmljZS5kYXRhQ2hhbmdlcygnZGF0YUJpbmQnKTtcbiAgICB9XG4gIH1cbiAgLy8gU0tTMjBNQVIyNSBmbGF0dGVuaW5nIG5lc3RlZCBvYmplY3RzLCBtYXBwaW5nIHZhbHVlcyB1c2luZyAgcmVmZXJlbmNlRmllbGRcbiAgZmxhdHRlbk9iamVjdChvYmo6IGFueSwgcGFyZW50S2V5ID0gJycpOiBhbnlbXSB7XG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgXG4gICAgZm9yIChsZXQgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICBsZXQgbmV3S2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fS4ke2tleX1gIDoga2V5O1xuICBcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goW25ld0tleSwgdmFsXSk7IC8vIEluY2x1ZGUgZnVsbCBhcnJheVxuICBcbiAgICAgICAgdmFsLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZsYXR0ZW5PYmplY3QoaXRlbSwgYCR7bmV3S2V5fVske2luZGV4fV1gKSk7IC8vIEZsYXR0ZW4gb2JqZWN0cyBpbiBhcnJheXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2Ake25ld0tleX1bJHtpbmRleH1dYCwgaXRlbV0pOyAvLyBTdG9yZSBwcmltaXRpdmUgdmFsdWVzIGluIGFycmF5c1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQucHVzaChbbmV3S2V5LCB2YWxdKTsgLy8gQWx3YXlzIGluY2x1ZGUgZnVsbCBvYmplY3RcbiAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5mbGF0dGVuT2JqZWN0KHZhbCwgbmV3S2V5KSk7IC8vIENvbnRpbnVlIGZsYXR0ZW5pbmdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFtuZXdLZXksIHZhbF0pOyAvLyBTdG9yZSBwcmltaXRpdmUgdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBcbiAgLy8gU0tTMjBNQVIyNSByZWZlcmVuY2VGaWVsZCBzZXQgbGlrZSB0aGlzXG4gIC8vIG5hbWUgIC0tPiBub3JtYWxcbiAgLy8gaXRlbXNbMF0ubmFtZSAgLS0+IHZhbHVlIGluIGEgYXJyYXkgc2V0IGxpa2UgdGhpc1xuICAvLyBhZGRyZXNzZXMubGluZTIgIC0tLT4gaWYgdmFsdWUgaW4gYSBqc29uIHNldCBsaWtlIHRoaXNcbiAgLy8gYWRkcmVzc2VzLmxpbmU0LmRkIC0tLT4gaWYgdmFsdWUgaW4gYSBuZXN0ZWQganNvbiBzZXQgbGlrZSB0aGlzXG5cbiAgLy8gSEEgMTEtSkFOLTI0IGhhbmRsZVF1ZXMgdG8gbG9hZCBxdWVzdGlvblxuICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgaGFuZGxlUXVlcyhxdWVzOiBhbnkpIHtcbiAgICAvLyBIQSAxOS1KQU4tMjQgSWYgY29uZGl0aW9uIGlzIGZvciBiaW5kLWluLCBjb3JyZWN0aW9uXG4gICAgLy8gSEEgMDlGRUIyNCBBZGRpbmcgY29uZGl0aW9uIHRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvclxuICAgIGlmICh0aGlzLmRhdGFCaW5kICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YUJpbmQpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLmZsYXR0ZW5PYmplY3QodGhpcy5kYXRhQmluZClcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsXSBvZiByZXN1bHQpIHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSB2YWw7XG4gICAgICAgIGlmIChxdWVzLnJlZmVyZW5jZUZpZWxkID09PSBrZXkpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHF1ZXMudHlwZSA9PT0gJ0Ryb3Bkb3duJyB8fCBxdWVzLnR5cGUgPT09ICdSYWRpbycpIHtcbiAgICAgICAgICAgIHRoaXMuc3FPcHRpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50WydyZWZlcmVuY2VGaWVsZCddID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50WydpbnB1dCddID0gcXVlcy5pbnB1dCA9IHZhbHVlIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ3NlbGVjdGVkVmFsdWUnXSA9IHF1ZXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSEEgMjRKQU4yNCBUbyBiaW5kLWluIERhdGUgYW5kIERhdGVUaW1lXG4gICAgICAgICAgZWxzZSBpZiAocXVlcy50eXBlID09PSAnRGF0ZScgfHwgcXVlcy50eXBlID09ICdEYXRlVGltZScpIHtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSBuZXcgRGF0ZSh2YWx1ZT8udG9TdHJpbmcoKSkgIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIQSAxMkZFQjI0IFRvIGJpbmQtaW4gTG9jYXRpb24gVHlwZVxuICAgICAgICAgIGVsc2UgaWYgKHF1ZXMudHlwZSA9PT0gJ0xvY2F0aW9uJykge1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHZhbHVlIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgcXVlcy5zZWxlY3RlZFZhbHVlID0gdmFsdWVbJ2FkZHJlc3MnXSA/IHZhbHVlWydhZGRyZXNzJ10gOiB2YWx1ZSB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzIGZvciBkYXRhIGJpbmRJblxuICAgICAgICAgIGVsc2UgaWYgKHF1ZXMudHlwZSA9PT0gJ0NhbGVuZGFyJykge1xuICAgICAgICAgICAgbGV0IGVudHJpZXMgPSB0eXBlb2YgcXVlc1snZmllbGRzTWV0YSddID09PSAnb2JqZWN0JyA/IHF1ZXNbJ2ZpZWxkc01ldGEnXSA6IEpTT04ucGFyc2UocXVlc1snZmllbGRzTWV0YSddKTtcbiAgICAgICAgICAgIGlmIChlbnRyaWVzKSB7XG4gICAgICAgICAgICAgIGxldCByZWZlcmVuY2VRdWVzdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnF1ZXN0aW9uUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxUmVmZXJlbmNlID0gSlNPTi5wYXJzZShlbGVtZW50LnF1ZXN0aW9uUmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlUXVlc3Rpb25zLnB1c2gocVJlZmVyZW5jZT8ucXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VRdWVzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhbHVlPy5mb3JFYWNoKGNhbGVuZGFyQXJyYXkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShjYWxlbmRhckFycmF5LmRhdGUpO1xuICAgICAgICAgICAgICAgICAgY2FsZW5kYXJBcnJheS5lbnRyaWVzLmZvckVhY2goaW5wdXRFbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhpbnB1dEVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVF1ZXN0aW9ucy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5yZWZlcmVuY2VGaWVsZCA9PSBrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnRGF0ZScgfHwgZmllbGQudHlwZSA9PSAnRGF0ZVRpbWUnIHx8IGZpZWxkLnR5cGUgPT0gJ1RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaW5wdXQgPSBuZXcgRGF0ZSh2Py50b1N0cmluZygpKSB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBpZiAoZmllbGQudHlwZSA9PT0gJ0Ryb3Bkb3duJyB8fCBmaWVsZC50eXBlID09PSAnUmFkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0ZWRWYWx1ZSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaW5wdXQgPSB2ICB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5pbnB1dCA9IHYgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGRhdGUsIHJlZmVyZW5jZVF1ZXN0aW9ucyk7Ly9TS1MgMjdTRVAyNCBlYWNoIGV2ZW50IGFkZGVkIHRvIGFsbEV2ZW50cyBhcnJheVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuYWRkRXZlbnQoZGF0ZSxyZWZlcmVuY2VRdWVzdGlvbnMpOyAvL3RoaXMgaXMgb25seSBsYXN0IGV2ZW50IGFkZGVkIHRvIGFsbEV2ZW50cyBhcnJheVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdGhpcy5hbGxFdmVudHMubGVuZ3RoID4gMCA/IHRoaXMuYWxsRXZlbnRzIDogJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFZEIDIzIE9jdDI0IC0gZmlsZSB0eXBlIGNoYW5nZXNcbiAgICAgICAgICBlbHNlIGlmIChxdWVzLnR5cGUgPT09ICdGaWxlJykge1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IFtdO1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZihxdWVzLnR5cGUgPT09IFwiQm9vbGVhblwiKSB7IC8vIFNLUzIzSlVOMjUgZGVmYXVsdGx5IHNldCB2YWx1ZSBmYWxzZVxuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnIDogdHlwZW9mIHF1ZXMuZGVmYXVsdFZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHF1ZXMuZGVmYXVsdFZhbHVlID09PSB0cnVlIHx8IHF1ZXMuZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgOiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHZhbHVlIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFuc3dlckxpc3QucHVzaChxdWVzKTsgLy8gSEEgMTJGRUIyNCBUbyBnaXZlIHRoZSB2YWx1ZSBmb3IgZGF0YVxuICAgICAgICAgIGJyZWFrOyAvLyBBUC0wM0pVTjI1IC0gTWF0Y2ggZm91bmQgYW5kIHZhbHVlIGJvdW5kOyBubyBuZWVkIHRvIGNvbnRpbnVlIHRoZSBsb29wXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgcXVlcy50eXBlID09PSAnQm9vbGVhbicgPyBxdWVzLmlucHV0ID0gZmFsc2UgOiBxdWVzLmlucHV0ID0gbnVsbCAgLy8gU0tTMjNKVU4yNSBkZWZhdWx0bHkgc2V0IHZhbHVlIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgcXVlc3Rpb24gPSB7fTtcbiAgICAgIHF1ZXN0aW9uWydpZCddID0gcXVlcy5pZDtcbiAgICAgIHF1ZXN0aW9uWydpbnB1dCddID0gcXVlcy5pbnB1dCB8fCBxdWVzLmRlZmF1bHRWYWx1ZSAgfHwgbnVsbDtcbiAgICAgIC8vIEhBIDEyRkVCMjQgVG8gYmluZC1vdXQgTG9jYXRpb24gVHlwZVxuICAgICAgaWYgKHF1ZXMudHlwZSA9PT0gJ0xvY2F0aW9uJykge1xuICAgICAgICBxdWVzdGlvblsnaW5wdXQnXSA9IHF1ZXMuaW5wdXQgPyBxdWVzLmlucHV0IDogcXVlcy5zZWxlY3RlZFZhbHVlIHx8IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHF1ZXMudHlwZSA9PSAnRmlsZScpIHtcbiAgICAgICAgLy8gVkQgMjMgT2N0MjQgLSBmaWxlIHR5cGUgY2hhbmdlc1xuICAgICAgICBxdWVzdGlvblsnaW5wdXQnXSA9IHF1ZXMuaW5wdXQgPyBxdWVzLmlucHV0IDogcXVlcy5kZWZhdWx0VmFsdWUgfHwgW107XG4gICAgICB9ICBlbHNlIGlmKHF1ZXMudHlwZSA9PT0gXCJCb29sZWFuXCIpIHsgLy8gU0tTMjNKVU4yNSBkZWZhdWx0bHkgc2V0IHZhbHVlIGZhbHNlXG4gICAgICAgIHF1ZXN0aW9uWydpbnB1dCddID0gdHlwZW9mIHF1ZXMuaW5wdXQgIT09ICd1bmRlZmluZWQnID8gcXVlcy5pbnB1dCA9PT0gdHJ1ZSB8fCBxdWVzLmlucHV0ID09PSAndHJ1ZScgOiB0eXBlb2YgcXVlcy5kZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnID8gcXVlcy5kZWZhdWx0VmFsdWUgPT09IHRydWUgfHwgcXVlcy5kZWZhdWx0VmFsdWUgPT09ICd0cnVlJyA6IGZhbHNlO1xuICAgICAgfVxuICAgICAgcXVlc3Rpb25bJ3R5cGUnXSA9IHF1ZXMudHlwZTtcbiAgICAgIHF1ZXN0aW9uWydxdWVzdGlvbk51bWJlciddID0gcXVlcy5xdWVzdGlvbk51bWJlcjtcbiAgICAgIHF1ZXN0aW9uWydyZWZlcmVuY2VGaWVsZCddID0gcXVlcz8ucmVmZXJlbmNlRmllbGQ7XG4gICAgICBxdWVzdGlvblsnc2VsZWN0ZWRWYWx1ZSddID0gcXVlcz8uc2VsZWN0ZWRWYWx1ZTsgIC8vIE1SIDMxSkFOMjQgTmVlZCB0byBwYXNzIHRoZSBzZWxlY3RlZCB2YWx1ZSB0b29cbiAgICAgIHRoaXMuYW5zd2VyTGlzdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXMgZm9yIGRhdGEgYmluZEluXG4gIGFkZEV2ZW50KGRheTogYW55LCBlbnRyeVF1ZXMpIHtcbiAgICAvLyBUcmFuc2Zvcm0gbmV3IGVudHJpZXMgaW50byB0aGUgZGVzaXJlZCBmb3JtYXRcbiAgICBjb25zdCBuZXdFbnRyaWVzID0gZW50cnlRdWVzLnJlZHVjZSgoYWNjLCBxKSA9PiB7XG4gICAgICBhY2NbcS5pZF0gPSB7IC4uLnEgfTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgLy8gRmluZCBpZiBhbiBldmVudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIGdpdmVuIGRhdGVcbiAgICBjb25zdCBleGlzdGluZ0V2ZW50ID0gdGhpcy5hbGxFdmVudHMuZmluZChldmVudCA9PiBldmVudC5kYXRlLnRvRGF0ZVN0cmluZygpID09PSBkYXkudG9EYXRlU3RyaW5nKCkpO1xuXG4gICAgaWYgKGV4aXN0aW5nRXZlbnQpIHtcbiAgICAgIC8vIElmIHRoZSBldmVudCBleGlzdHMsIHB1c2ggdGhlIG5ldyBlbnRyaWVzIHRvIHRoZSBleGlzdGluZyBlbnRyaWVzXG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSBleGlzdGluZ0V2ZW50LmVudHJpZXMubWFwKGVudHJ5ID0+ICh7IC4uLmVudHJ5IH0pKTtcbiAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKG5ld0VudHJpZXMpO1xuICAgICAgZXhpc3RpbmdFdmVudC5lbnRyaWVzID0gZXhpc3RpbmdFbnRyaWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgZXZlbnQgaWYgaXQgZG9lc24ndCBleGlzdCBmb3IgdGhlIGdpdmVuIGRhdGVcbiAgICAgIGNvbnN0IG5ld0V2ZW50ID0ge1xuICAgICAgICBpZDogJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpLFxuICAgICAgICBkYXRlOiBkYXksXG4gICAgICAgIGVudHJpZXM6IFtuZXdFbnRyaWVzXSAvLyBXcmFwIHRoZSBuZXcgZW50cmllcyBpbiBhbiBhcnJheVxuICAgICAgfTtcbiAgICAgIHRoaXMuYWxsRXZlbnRzLnB1c2gobmV3RXZlbnQpO1xuICAgIH1cbiAgfVxuXG5cbiAgcmVhZFF1ZXN0aW9ucyhxYklkOiBzdHJpbmcpIHtcbiAgICBsZXQgcXVlc3Rpb25zID0gW107XG4gICAgLy8gSEEgMzEtSkFOLTI0IEFkZGVkIHRlcm5hcnkgdG8gYXZvaWQgdW5kZWZpbmVkXG4gICAgZm9yICh2YXIgc3EgaW4gdGhpcy5ib29rUXVlc3Rpb25zTWFwPy5nZXQocWJJZCk/LnN1YlF1ZXN0aW9ucykge1xuICAgICAgLy8gQVAtMTRNQVkyNSBFeHRyYWN0ZWQgcXVlc3Rpb24gZnJvbSBzdWJRdWVzdGlvbnMgaW50byB2YXJpYWJsZSAncSdcbiAgICAgIGxldCBxOiBhbnkgPSB0aGlzLmJvb2tRdWVzdGlvbnNNYXA/LmdldChxYklkKS5zdWJRdWVzdGlvbnNbc3FdO1xuICAgICAgLy8gSEEgMDlGRUIyNCBpZiBxdWVzdGlvbiBpcyB0aGVyZSBwcm9jZXNzXG4gICAgICBpZiAocSkge1xuICAgICAgICBpZiAoKHEudHlwZSA9PSAnRHJvcGRvd24nIHx8IHEudHlwZSA9PSAnUmFkaW8nKSAmJiB0aGlzLnNxT3B0aW9ucy5nZXQocS5pZCkpIHtcbiAgICAgICAgICBxdWVzdGlvbnMucHVzaCh0aGlzLnNxT3B0aW9ucy5nZXQocS5pZCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXN0aW9ucy5wdXNoKHEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVkQgMTJKdW4yNCBmaWVsZCBwZXJtaXNpc2lvbiBjaGFuZ2VzXG4gICAgaWYgKHRoaXMuZmllbGRSZXN0cmljdGlvbnMpIHtcbiAgICAgIGNvbnN0IGZpZWxkUmVzdHJpY3Rpb25zID0gbmV3IE1hcChPYmplY3QuZW50cmllcyh0aGlzLmZpZWxkUmVzdHJpY3Rpb25zLmZpZWxkcykpO1xuICAgICAgcXVlc3Rpb25zLmZvckVhY2gocXVlcyA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3RyaWN0aW9uID0gZmllbGRSZXN0cmljdGlvbnMuZ2V0KHF1ZXMudW5pcXVlSWRlbnRpZmllcik7XG5cbiAgICAgICAgaWYgKHJlc3RyaWN0aW9uKSB7XG4gICAgICAgICAgcXVlcy5pc1JlYWRPbmx5ID0gcmVzdHJpY3Rpb24gPT09ICdyZWFkT25seSc7XG4gICAgICAgICAgcXVlcy5pc0hpZGRlbiA9IHJlc3RyaWN0aW9uID09PSAnaGlkZSc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25zO1xuICB9XG4gIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXG4gIHJlYWRUcmFuc1F1ZXN0aW9ucyhxYklkOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVjb3JkID0gW107XG4gICAgbGV0IHRyYW5zbGF0ZVJlY29yZCA9IHRoaXMudHJhbnNsYXRlTWFwLmdldChxYklkKTtcbiAgICBpZiAodHJhbnNsYXRlUmVjb3JkICYmIHRyYW5zbGF0ZVJlY29yZC5sZW5ndGggPiAwKSB7XG4gICAgICB0cmFuc2xhdGVSZWNvcmQuZm9yRWFjaChsYW5SZWMgPT4ge1xuICAgICAgICBpZiAobGFuUmVjLmxhbmd1YWdlQ29kZSA9PSB0aGlzLmxhbmd1YWdlQ29kZSkge1xuICAgICAgICAgIHJlY29yZCA9IGxhblJlYy5maWVsZHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICBnZXRUZXh0KHZhbHVlKSB7XG4gICAgdmFyIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodmFsdWUsIFwidGV4dC9odG1sXCIpO1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnRcbiAgICApO1xuICB9XG4gIGdldERyb3BEb3duKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmhhZGxlRHJvcERvd25EZXBlbmRlbnQuZW1pdChldmVudCk7XG4gIH1cbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIGdldENhbGVuZGFyRGF0ZShldmVudDogYW55KSB7XG4gICAgdGhpcy5oYW5kbGVDYWxlbmRhckRhdGUuZW1pdChldmVudCk7XG4gIH1cbiAgZ2V0Q2FsZW5kYXJFdmVudChldmVudDogYW55KSB7XG4gICAgZXZlbnRbXCJueHRJZFwiXSA9IE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApWzBdO1xuICAgIHRoaXMuaGFuZGxlQ2FsZW5kYXJFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuICBlZGl0Q2hhbmdlQ2xpY2soYWN0aW9uOiBhbnkpe1xuICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZVxuICB9XG59XG4iLCI8IS0tIEJvb2tsZXQgSGFuZGxpbmctLT5cbjwhLS0gSEEgMTlERUMyMyBGb3IgRGlyZWN0aW9uIC0tPlxuPGRpdiAqbmdGb3I9XCJsZXQgcWIgb2YgYm9va2xldFwiIFtuZ0NsYXNzXT1cImxhbmdEaXJlY3Rpb25cIj5cbiAgICA8IS0tIE1SIENvbW1lbnRlZCBiZWxvdyBjb2RlIHRvIGVuc3VyZSBzaW5nbGUgSlNPTiBmb3IgVU5DT05ESVRJT05BTCBCb29rbGV0cyAtLT5cbiAgICA8IS0tIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzLS0+XG4gICAgPCEtLSA8bGliLXF1ZXN0aW9ubmFpcmUgW3NlcnZdPVwic2VydlwiIFtxYklkXT1cInFiLmlkXCIgW3Rrbl09XCJ0a25cIj48L2xpYi1xdWVzdGlvbm5haXJlPiAtLT5cbiAgICA8IS0tIEhBIDI4REVDMjMgQmVsb3cgSWYgbG9naWMgaXMgdG8gbG9hZCBmcm9tIGJvb2tsZXQgIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJxYi5zdWJRdWVzdGlvbnM7IGVsc2UgZWxzZUJsb2NrXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHF1ZXMgb2YgcWIuc3ViUXVlc3Rpb25zXCIgY2xhc3M9XCJxdWVzdGlvbmRpdjFcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBIQSAxN0pBTjI0IC0gSXMgdGl0bGUgaXMgZW5hYmxlZCBzbyB0aGF0IGJhc2VkIG9uIHRoZSBib29sZWFuIGRpdiB3aWxsIGJlIHZpc2libGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMuaXNUaXRsZVwiIFtjbGFzc109XCJxYi5pc1NoZW5nZWwgPyAnaGVhZGVyLXN0eWxlJyA6ICdxdWVzdGlvbi1mLXNpemUgYWRkaXRpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBWRCAwOE5PVjIzIC0gc2hvd2luZyBsYWJlbCB3aGVuIGl0cyBhdmFpbGFibGUtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImdldFRleHQocXVlcz8ucXVlc3Rpb25UZXh0KVwiICpuZ0lmPVwicXVlcz8ucXVlc3Rpb25UZXh0ICYmIHF1ZXM/LnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcXVlcz8ucXVlc3Rpb25UZXh0IH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPiA8IS0tVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXMtLT5cbiAgICAgICAgICAgICAgICA8IS0tVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzLS0+XG4gICAgICAgICAgICAgICAgPCEtLSBBUC0xNE1BWTI1IC0gQWRkZWQgW2RhdGFCaW5kXSBpbnB1dCBiaW5kaW5nIC0tPlxuICAgICAgICAgICAgICAgICA8IS0tIEFQLTE5TUFZMjUgLSBBZGRlZCBbaXNFZGl0XSBiaW5kaW5nIC0tPiBcbiAgICAgICAgICAgICAgICAgIDwhLS0gLy9NU00xMEpVTDI1ICBhbGxJY29ucywgdGhlbWVDb2xvciwgY2RuSWNvblVSTCBhZGRlZCBmb3IgaWNvbi1zZWxlY3Rvci0tPlxuICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJcIiBbdG9rZW5dPVwidG9rZW5cIlxuICAgICAgICAgICAgICAgIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIlxuICAgICAgICAgICAgICAgIFtxdWVzdGlvbkl0ZW1dPVwicXVlc1wiXG4gICAgICAgICAgICAgICAgW3RyYW5zbGF0ZWRRdWVzdGlvbnNdPVwicmVhZFRyYW5zUXVlc3Rpb25zKHFiLmlkKVwiXG4gICAgICAgICAgICAgICAgW3F1ZXN0aW9uc109XCJyZWFkUXVlc3Rpb25zKHFiLmlkKVwiXG4gICAgICAgICAgICAgICAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckRhdGUpPVwiZ2V0Q2FsZW5kYXJEYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckV2ZW50KT1cImdldENhbGVuZGFyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNpbmdsZUZpZWxkQ2hhbmdlRW1pdCkgPSdzaW5nbGVGaWVsZENoYW5nZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgIFtkYXRhQmluZF09XCJkYXRhQmluZFwiXG4gICAgICAgICAgICAgICAgW2lzRWRpdF09XCJpc0VkaXRcIiBcbiAgICAgICAgICAgICAgICBbYWxsSWNvbnNdPVwiYWxsSWNvbnNcIlxuICAgICAgICAgICAgICAgIFt0aGVtZUNvbG9yXT1cInRoZW1lQ29sb3JcIlxuICAgICAgICAgICAgICAgIFtjZG5JY29uVVJMXT1cImNkbkljb25VUkxcIlxuICAgICAgICAgICAgICAgID48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBIQSAyOERFQzIzIEJlbG93IGVsc2UgbG9naWMgaXMgdG8gbG9hZCBmcm9tIGJvb2tzIG9yIHF1ZXN0aW9ucyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uZGl2MVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXFiLmlzVGl0bGVcIiBbY2xhc3NdPVwicWIuaXNTaGVuZ2VsID8gJ2hlYWRlci1zdHlsZScgOiAncXVlc3Rpb24tZi1zaXplIGFkZGl0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVkQgMDhOT1YyMyAtIHNob3dpbmcgbGFiZWwgd2hlbiBpdHMgYXZhaWxhYmxlLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJnZXRUZXh0KHFiPy5xdWVzdGlvblRleHQpXCIgKm5nSWY9XCJxYj8ucXVlc3Rpb25UZXh0ICYmIHFiPy5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHFiPy5xdWVzdGlvblRleHQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHFiPy50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gPCEtLSBWRCAxOUpBTjI0IC0gZ2V0dGluZyB0b2tlbiBhcyBpbnB1dCAtLT4gPCEtLSAgLy8gVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXMtLT5cbiAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uYm9vayBbcWJJdGVtXT1cInFiXCIgW3Rva2VuXT1cInRva2VuXCIgW2xhYmVsVmFsdWVdPVwibGFiZWxWYWx1ZVwiIFtxdWVzdGlvbkl0ZW1dPVwicWJcIiBbdHJhbnNsYXRlZFF1ZXN0aW9uc109XCJyZWFkVHJhbnNRdWVzdGlvbnMocWIuaWQpXCIgW3F1ZXN0aW9uc109XCJyZWFkUXVlc3Rpb25zKHFiLmlkKVwiICAoaGFuZGxlRHJvcERvd24pPVwiZ2V0RHJvcERvd24oJGV2ZW50KVwiPjwvbGliLXF1ZXN0aW9uYm9vaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSUyAwOURFQzI0IENoYW5nZWQga2V5cy0tPlxuICAgIDwhLS0gR3JvdXAgQWN0aW9ucyAtLT5cbiAgICA8IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbiAgICA8IS0tIEFQIDIzTUFZMjUgLSBBY3Rpb24gQnV0dG9uczogRHluYW1pY2FsbHkgcG9zaXRpb25lZCBidXR0b25zIHdpdGggSlNPTi1jb25maWd1cmVkIHN0eWxlcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYWxpZ24tc3VibWl0LXJvd1wiICpuZ0lmPVwiYWJJdGVtPy5zdGF0dXMgIT0gJ0NvbXBsZXRlZCdcIiBbbmdDbGFzc109XCJsYW5nRGlyZWN0aW9uXCI+IDwhLS0gcG9zaXRpb24tcmVsYXRpdmUgcmVtb3ZlZCBpbiB0aGlzIHRhZy0tPlxuICAgICAgICA8bmctY29udGFpbmVyICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGFjdGlvbnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24td3JhcHBlclwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImFjdGlvbi53aWR0aCB8fCAxMDBcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiPiAgPCEtLSBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgW3N0eWxlLmxlZnQuJV09XCJhY3Rpb24ucG9zaXRpb25QZXJjZW50IHx8IDBcIiAgcmVtb3ZlZCBpbiB0aGlzIHRhZyAtLT5cbiAgICAgICAgICAgICAgICBAaWYoIWlzRWRpdCAmJiBhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdzdWJtaXQnKXtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q2hhbmdlQ2xpY2soYWN0aW9uKVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgZmMtYnV0dG9uIG54dEJ1dHRvbiBhY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS4tLWJ0bi1iZ109XCJhY3Rpb24uYmdDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJhY3Rpb24uYmdDb2xvciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiYWN0aW9uLnRleHRDb2xvciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyLXJhZGl1cy5weF09XCJhY3Rpb24uYm9yZGVyUmFkaXVzIHx8IDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVCb29rbGV0QWN0aW9uQ2xpY2soYWN0aW9uKVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgZmMtYnV0dG9uIG54dEJ1dHRvbiBhY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS4tLWJ0bi1iZ109XCJhY3Rpb24uYmdDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJhY3Rpb24uYmdDb2xvciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiYWN0aW9uLnRleHRDb2xvciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyLXJhZGl1cy5weF09XCJhY3Rpb24uYm9yZGVyUmFkaXVzIHx8IDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==