gamma-app-controller 2.0.25 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/esm2020/lib/application-controller/application-content.service.mjs +36 -36
  2. package/esm2020/lib/application-controller/application-controller.module.mjs +6 -1
  3. package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +2 -2
  4. package/esm2020/lib/application-controller/application-menu-controller/application-create-menu/application-create-menu.component.mjs +10 -27
  5. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +6 -3
  6. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +3 -3
  7. package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +32 -167
  8. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +4 -3
  9. package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +12 -228
  10. package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +24 -34
  11. package/esm2020/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +3 -4
  12. package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +39 -109
  13. package/esm2020/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +15 -2
  14. package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +7 -272
  15. package/esm2020/lib/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +3 -3
  16. package/esm2020/lib/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +439 -0
  17. package/esm2020/lib/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +57 -51
  18. package/esm2020/lib/shared/permission-helper.mjs +4 -35
  19. package/esm2020/lib/shared/template-dataset-call-service.mjs +5 -1
  20. package/esm2020/lib/shared/user-access/user-access.component.mjs +5 -5
  21. package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +275 -153
  22. package/esm2020/lib/template-module/KpiCreationModule/createKpi.service.mjs +6 -37
  23. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/basic/basic.component.mjs +3 -3
  24. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/collapsable/collapsable.component.mjs +15 -4
  25. package/esm2020/lib/template-module/KpiCreationModule/treeview/treeview.component.mjs +6 -4
  26. package/esm2020/lib/template-module/bookmarked-template/bookmarked-layout.service.mjs +8 -8
  27. package/esm2020/lib/template-module/cdrConfigModule/cdr-browser.service.mjs +2 -2
  28. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +2 -1
  29. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.service.mjs +8 -8
  30. package/esm2020/lib/template-module/defaulLandingMultiLayoutComponent/defaulLandingMultiLayout.service.mjs +8 -8
  31. package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.mjs +8 -8
  32. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.mjs +8 -16
  33. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.mjs +6 -10
  34. package/esm2020/public-api.mjs +3 -1
  35. package/fesm2015/gamma-app-controller.mjs +8672 -8850
  36. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  37. package/fesm2020/gamma-app-controller.mjs +8427 -8617
  38. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  39. package/lib/application-controller/application-content.service.d.ts +1 -1
  40. package/lib/application-controller/application-controller.module.d.ts +26 -25
  41. package/lib/application-controller/application-menu-controller/application-create-menu/application-create-menu.component.d.ts +0 -2
  42. package/lib/application-controller/support-components/dash-chart/dash-chart.component.d.ts +3 -18
  43. package/lib/application-controller/support-components/geo-map/geo-map.component.d.ts +2 -46
  44. package/lib/application-controller/support-components/single-card/single-card.component.d.ts +2 -5
  45. package/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +0 -1
  46. package/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +1 -3
  47. package/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +1 -0
  48. package/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +0 -40
  49. package/lib/shared/advanced-component/google-geo-map/google-geo-map.component.d.ts +62 -0
  50. package/lib/shared/gamma-bread-crumbs/bread-crumbs.component.d.ts +0 -2
  51. package/lib/shared/permission-helper.d.ts +0 -1
  52. package/lib/template-module/KpiCreationModule/create-kpi-tree.component.d.ts +15 -11
  53. package/lib/template-module/KpiCreationModule/createKpi.service.d.ts +0 -4
  54. package/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.d.ts +0 -1
  55. package/package.json +1 -1
  56. package/public-api.d.ts +2 -0
@@ -11,10 +11,9 @@ import * as i8 from "devextreme-angular/ui/nested";
11
11
  import * as i9 from "devextreme-angular/ui/check-box";
12
12
  import * as i10 from "devextreme-angular/ui/html-editor";
13
13
  import * as i11 from "devextreme-angular/ui/select-box";
14
- import * as i12 from "devextreme-angular/ui/tag-box";
15
- import * as i13 from "devextreme-angular/ui/text-box";
16
- import * as i14 from "../../shared/user-access/user-access.component";
17
- import * as i15 from "./treeview/treeview.component";
14
+ import * as i12 from "devextreme-angular/ui/text-box";
15
+ import * as i13 from "../../shared/user-access/user-access.component";
16
+ import * as i14 from "./treeview/treeview.component";
18
17
  export class CreateKpiTreeComponent {
19
18
  constructor(commonService, formBuilder, service, toastr, router) {
20
19
  this.commonService = commonService;
@@ -38,9 +37,6 @@ export class CreateKpiTreeComponent {
38
37
  this.kpi_external = false;
39
38
  this.isComponentUpdata = false;
40
39
  this.userOptionContainer = [];
41
- this.selected_aliases = [];
42
- this.isKpiTreePrepared = false;
43
- this.kpiConfigDataSource = [];
44
40
  }
45
41
  ngOnInit() {
46
42
  this.getAllKpiData();
@@ -56,12 +52,10 @@ export class CreateKpiTreeComponent {
56
52
  });
57
53
  }
58
54
  getAllKpiData() {
55
+ this.loadingModal = false;
59
56
  this.keiParentDataSource = [];
60
- this.service.listKpiEntryConfigs().subscribe((data) => {
61
- const userName = "admin";
62
- this.kpiConfigDataSource = data;
63
- this.kpiData = this.buildMenuTree(userName, data);
64
- this.loadingModal = false;
57
+ this.service.getlistKpiBrowser().subscribe((data) => {
58
+ this.kpiData = data;
65
59
  this.prepareParentDataSource(data);
66
60
  }, err => {
67
61
  this.loadingModal = false;
@@ -70,97 +64,104 @@ export class CreateKpiTreeComponent {
70
64
  }
71
65
  prepareParentDataSource(data) {
72
66
  data.forEach((result) => {
73
- if (result.tagType == 'parent') {
74
- this.keiParentDataSource.push(result);
67
+ if (result.tag_type == 'parent') {
68
+ let node = {
69
+ "name": result.name,
70
+ "tid": result.tid
71
+ };
72
+ this.keiParentDataSource.push(node);
73
+ this.prepareParentDataSource(result.nodes);
75
74
  }
76
75
  });
77
76
  }
78
- makeNewKpiWithUserEntity() {
79
- const pageData = (this.selected_page_id) ? this.templateDataSource.find((item) => item.pageId === this.selected_page_id) : null;
80
- let kpiObj = {
81
- "kpiId": this.selected_id,
82
- "kpiName": this.select_kpi_name,
83
- "aliases": this.selected_aliases,
84
- "pageId": this.selected_page_id,
85
- "description": this.selected_desc,
86
- "kpiInfo": "",
87
- "tagType": this.select_tag_type,
88
- "active": true,
89
- "visibility": this.kpi_visibility,
90
- "externalKpi": this.kpi_external,
91
- "target": "",
92
- "icon": "",
93
- "url": pageData ? pageData.pageUrl : "",
94
- "kpiType": this.select_tag_type == "parent" ? "collapsable" : "basic",
95
- "parentTid": this.selected_kpi_tid,
96
- "childTid": this.selected_kpi_child_tid,
97
- "permissions": this.userOptionContainer,
98
- };
99
- this.service.createKpiEntryConfig(kpiObj).subscribe(data => {
100
- this.toastr.success('KPI Created Successfully');
101
- this.getAllKpiData();
102
- this.getReseteKpi();
103
- }, err => {
104
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'KPI Config');
105
- });
106
- console.log("KPI with User Entity Obj:", kpiObj);
107
- }
108
- getEditableKpi(kpi) {
109
- const data = this.kpiConfigDataSource.find((item) => item.kpiId === kpi.id);
110
- const tidKey = data.tagType === 'child' && data.childTid && data.childTid.length > 3 ? 'childTid' : 'parentTid';
111
- const parentName = this.keiParentDataSource.find((item) => item[tidKey] == data["parentTid"]);
112
- this.parante_kpi_name = parentName ? parentName['kpiId'] : null;
113
- this.selected_id = data["kpiId"];
114
- this.select_kpi_name = data["kpiName"];
115
- this.selected_aliases = data["aliases"];
116
- this.selected_page_id = data["pageId"];
117
- this.selected_desc = data["description"];
118
- this.select_tag_type = data["tagType"];
119
- this.kpi_visibility = data["visibility"];
120
- this.kpi_external = data["externalKpi"];
121
- this.selected_kpi_tid = data["parentTid"];
122
- this.selected_kpi_child_tid = data["childTid"];
123
- this.userOptionContainer = (data["permissions"] && data["permissions"].length > 0) ? data["permissions"] : [];
124
- this.isEditKpiAdded = true;
77
+ makeNewKpi() {
78
+ if (this.selected_kpi_tid !== undefined && this.selected_kpi_tid.length > 0) {
79
+ this.getHeistId(this.kpiData, this.selected_kpi_tid);
80
+ this.createNewKpiWithTid();
81
+ }
82
+ else {
83
+ this.heistValue = (this.kpiData.length != 0) ? this.getHighestTid(this.kpiData) : 0;
84
+ let value = parseInt(this.heistValue) + 1;
85
+ let obj = {
86
+ "name": this.select_kpi_name,
87
+ "tid": value.toString(),
88
+ "isBookmarked": false,
89
+ "isAccessible": this.kpi_external,
90
+ "lastAccessTime": "",
91
+ "tag_type": this.select_tag_type,
92
+ "id": this.selected_id,
93
+ "pageId": this.selected_page_id,
94
+ "desc": this.selected_desc,
95
+ "isVisible": this.kpi_visibility,
96
+ "nodes": [],
97
+ "config": {}
98
+ };
99
+ this.kpiData.push(obj);
100
+ if (this.select_tag_type == 'parent') {
101
+ let obj = {
102
+ "name": this.select_kpi_name,
103
+ "tid": value.toString(),
104
+ };
105
+ this.keiParentDataSource.push(obj);
106
+ }
107
+ if (this.select_tag_type == 'child') {
108
+ let obj = {
109
+ "name": this.select_kpi_name,
110
+ "id": this.selected_id,
111
+ "pageId": this.selected_page_id,
112
+ "searchFilter": false,
113
+ "isSrvTypeOperator": false,
114
+ "operationLevels": [],
115
+ "fixOperationLevles": [],
116
+ "api_config": []
117
+ };
118
+ this.service.configureKpiBrowserConfig(obj).subscribe(data => {
119
+ console.log("kpi browser config created");
120
+ });
121
+ }
122
+ this.submitNewKpi();
123
+ }
125
124
  }
126
- getUpdateKpi() {
127
- const pageData = (this.selected_page_id) ? this.templateDataSource.find((item) => item.pageId === this.selected_page_id) : null;
128
- let kpiObj = {
129
- "kpiId": this.selected_id,
130
- "kpiName": this.select_kpi_name,
131
- "aliases": this.selected_aliases,
125
+ createNewKpiWithTid() {
126
+ let auto_tid = this.autoIncrement(this.selected_kpi_tid, this.heistValue);
127
+ let obj = {
128
+ "name": this.select_kpi_name,
129
+ "tid": auto_tid,
130
+ "isBookmarked": false,
131
+ "isAccessible": this.kpi_external,
132
+ "lastAccessTime": "",
133
+ "tag_type": this.select_tag_type,
134
+ "id": this.selected_id,
132
135
  "pageId": this.selected_page_id,
133
- "description": this.selected_desc,
134
- "kpiInfo": "",
135
- "tagType": this.select_tag_type,
136
- "active": true,
137
- "visibility": this.kpi_visibility,
138
- "externalKpi": this.kpi_external,
139
- "target": "",
140
- "icon": "",
141
- "url": pageData ? pageData.pageUrl : "",
142
- "kpiType": this.select_tag_type == "parent" ? "collapsable" : "basic",
143
- "parentTid": this.selected_kpi_tid,
144
- "childTid": this.selected_kpi_child_tid,
145
- "permissions": this.userOptionContainer,
136
+ "desc": this.selected_desc,
137
+ "isVisible": this.kpi_visibility,
138
+ "nodes": [],
139
+ "config": {}
146
140
  };
147
- this.service.updateKpiEntryConfig(kpiObj).subscribe(data => {
148
- this.toastr.success('KPI Updated Successfully');
149
- this.getAllKpiData();
150
- this.getReseteKpi();
151
- this.isEditKpiAdded = false;
152
- }, err => {
153
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'KPI Config');
154
- });
155
- console.log("KPI with User Entity Obj:", kpiObj);
156
- }
157
- onCustomDimentionCreating(args) {
158
- const newValue = args.text;
159
- args.customItem = newValue;
160
- const isItemInDataSource = this.selected_aliases.some((item) => item === newValue);
161
- if (!isItemInDataSource) {
162
- this.selected_aliases.unshift(newValue);
141
+ if (this.select_tag_type == 'parent') {
142
+ let obj = {
143
+ "name": this.select_kpi_name,
144
+ "tid": auto_tid
145
+ };
146
+ this.keiParentDataSource.push(obj);
163
147
  }
148
+ if (this.select_tag_type == 'child') {
149
+ let obj = {
150
+ "name": this.select_kpi_name,
151
+ "id": this.selected_id,
152
+ "pageId": this.selected_page_id,
153
+ "searchFilter": false,
154
+ "isSrvTypeOperator": false,
155
+ "operationLevels": [],
156
+ "fixOperationLevles": [],
157
+ "api_config": []
158
+ };
159
+ this.service.configureKpiBrowserConfig(obj).subscribe(data => {
160
+ console.log("kpi browser config created");
161
+ });
162
+ }
163
+ this.setKpibyTid(this.kpiData, this.selected_kpi_tid, obj);
164
+ this.submitNewKpi();
164
165
  }
165
166
  getReseteKpi() {
166
167
  this.select_kpi_name = '';
@@ -178,38 +179,73 @@ export class CreateKpiTreeComponent {
178
179
  this.editable_desc = '';
179
180
  this.editable_info = '';
180
181
  this.parante_kpi_name = '';
181
- this.selected_kpi_child_tid = '';
182
- this.selected_aliases = [];
183
182
  this.kpi_external = false;
184
183
  this.kpi_visibility = false;
185
184
  this.isComponentUpdata = false;
186
- this.isEditKpiAdded = false;
185
+ }
186
+ getDeletKpi(tid) {
187
+ console.log(this.selected_p_kpi);
187
188
  }
188
189
  addTagtypeValue(e) {
189
190
  this.select_tag_type = e.value;
190
191
  }
191
192
  getKpiItemValue(e) {
192
- if (e.event) {
193
- const kpi_data = this.keiParentDataSource.find((item) => item.kpiId === e.value);
194
- if (this.isEditKpiAdded) {
195
- const tidKey = this.select_tag_type === 'child' && this.isEditKpiAdded ? 'childTid' : 'parentTid';
196
- this.selected_kpi_tid = kpi_data[tidKey];
193
+ const kpi_data = this.keiParentDataSource.find((item) => item.tid === e.value);
194
+ this.selected_kpi_tid = kpi_data.tid;
195
+ }
196
+ autoIncrement(string1, string2) {
197
+ if (string2 === null) {
198
+ const numberPart = string1 + '.1';
199
+ return numberPart;
200
+ }
201
+ else {
202
+ const parts = string2.split('.');
203
+ let lastPart = parseInt(parts[parts.length - 1], 10);
204
+ let new_number = lastPart++;
205
+ parts[parts.length - 1] = lastPart.toString();
206
+ return parts.join(".");
207
+ }
208
+ }
209
+ setKpibyTid(data, tid, newKpiObj) {
210
+ data.forEach(result => {
211
+ if (result.nodes !== undefined) {
212
+ if (result.tid == tid) {
213
+ result.nodes.push(newKpiObj);
214
+ }
215
+ this.setKpibyTid(result.nodes, tid, newKpiObj);
216
+ }
217
+ });
218
+ }
219
+ getHeistId(data, tid) {
220
+ data.forEach((result) => {
221
+ if (result.tid === tid) {
222
+ if (result.nodes.length > 0) {
223
+ this.heistValue = this.getHighestTid(result.nodes);
224
+ }
225
+ else {
226
+ this.heistValue = null;
227
+ }
197
228
  }
198
- else {
199
- const tidKey = kpi_data.childTid && kpi_data.childTid.length > 1 ? 'childTid' : 'parentTid';
200
- this.selected_kpi_tid = kpi_data[tidKey];
201
- this.selected_kpi_child_tid = this.getNextChildTid(this.selected_kpi_tid, this.kpiConfigDataSource);
229
+ else if (result.nodes !== undefined && result.nodes.length > 0) {
230
+ this.getHeistId(result.nodes, tid);
202
231
  }
203
- }
232
+ });
204
233
  }
205
- getNextChildTid(parentTid, kpiConfigDataSource) {
206
- const children = kpiConfigDataSource.filter(item => item.parentTid === parentTid && item.childTid);
207
- const maxChildNumber = children.reduce((max, item) => {
208
- const parts = item.childTid.split('.');
209
- const lastNumber = Number(parts[parts.length - 1]);
210
- return lastNumber > max ? lastNumber : max;
211
- }, 0);
212
- return `${parentTid}.${maxChildNumber + 1}`;
234
+ getHighestTid(data) {
235
+ const highestTid = data.reduce((maxTid, currentItem) => {
236
+ const currentTidParts = currentItem.tid.split('.').map(part => parseInt(part, 10));
237
+ const maxTidParts = maxTid.split('.').map(part => parseInt(part, 10));
238
+ for (let i = 0; i < currentTidParts.length; i++) {
239
+ if (currentTidParts[i] > maxTidParts[i]) {
240
+ return currentItem.tid;
241
+ }
242
+ else if (currentTidParts[i] < maxTidParts[i]) {
243
+ return maxTid;
244
+ }
245
+ }
246
+ return maxTid;
247
+ }, data[0].tid);
248
+ return highestTid;
213
249
  }
214
250
  addNewKpi() {
215
251
  this.isNewKpiAdded = true;
@@ -218,6 +254,22 @@ export class CreateKpiTreeComponent {
218
254
  cancelUpdate() {
219
255
  this.isEditKpiAdded = false;
220
256
  }
257
+ getEditableKpi(data) {
258
+ this.isComponentUpdata = false;
259
+ this.isEditKpiAdded = true;
260
+ this.isNewKpiAdded = false;
261
+ this.isFromEditable = true;
262
+ this.editable_desc = data.desc;
263
+ this.editable_info = (data.kpiInfo) ? data.kpiInfo : "";
264
+ this.editable_kpi_name = data.name;
265
+ this.editable_tag_type = data.tag_type;
266
+ this.editable_kpi_tid = data.tid;
267
+ this.editable_id = data.id;
268
+ this.editable_page_id = data.pageId;
269
+ this.kpi_visibility = data.isVisible;
270
+ this.kpi_external = data.isAccessible;
271
+ this.parante_kpi_name = this.getKpiParrentName(data.tid);
272
+ }
221
273
  getKpiParrentName(input) {
222
274
  const lastIndex = input.lastIndexOf('.');
223
275
  if (lastIndex === -1) {
@@ -225,15 +277,55 @@ export class CreateKpiTreeComponent {
225
277
  }
226
278
  return input.substring(0, lastIndex);
227
279
  }
228
- getDeletKpi() {
229
- this.service.deleteKpiEntryConfig(this.selected_id).subscribe(data => {
280
+ getUpdateKpi() {
281
+ if (!this.isComponentUpdata) {
282
+ this.getUpdateKpiName(this.kpiData, this.editable_kpi_tid);
283
+ }
284
+ setTimeout(() => {
285
+ this.submitNewKpi();
286
+ this.toastr.success('KPI Updated Successfully');
287
+ this.reseteUpdateKpiForm();
288
+ this.isEditKpiAdded = false;
289
+ }, 500);
290
+ }
291
+ getDeleteKpi() {
292
+ this.getDeleteKpiName(this.kpiData, this.editable_kpi_tid);
293
+ setTimeout(() => {
294
+ this.submitNewKpi();
230
295
  this.toastr.success('KPI Deleted Successfully');
231
- this.getAllKpiData();
232
- this.getReseteKpi();
233
- }, err => {
234
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'KPI Config');
296
+ this.reseteUpdateKpiForm();
297
+ this.isEditKpiAdded = false;
298
+ }, 500);
299
+ }
300
+ getUpdateKpiName(data, tid) {
301
+ data.forEach((result) => {
302
+ if (result.tid === tid) {
303
+ result.desc = this.editable_desc;
304
+ result.kpiInfo = this.editable_info;
305
+ result.name = this.editable_kpi_name;
306
+ result.id = this.editable_id;
307
+ result.pageId = this.editable_page_id;
308
+ result.tag_type = this.editable_tag_type;
309
+ result.isVisible = this.kpi_visibility;
310
+ result.isAccessible = this.kpi_external;
311
+ result.tid = this.editable_kpi_tid;
312
+ }
313
+ else if (result.nodes !== undefined && result.nodes.length > 0) {
314
+ this.getUpdateKpiName(result.nodes, tid);
315
+ }
235
316
  });
236
317
  }
318
+ getDeleteKpiName(data, tid) {
319
+ for (let i = data.length - 1; i >= 0; i--) {
320
+ const result = data[i];
321
+ if (result.tid === tid) {
322
+ data.splice(i, 1);
323
+ }
324
+ else if (result.nodes !== undefined && result.nodes.length > 0) {
325
+ this.getDeleteKpiName(result.nodes, tid);
326
+ }
327
+ }
328
+ }
237
329
  reseteUpdateKpiForm() {
238
330
  this.editable_desc = undefined;
239
331
  this.editable_info = undefined;
@@ -254,40 +346,70 @@ export class CreateKpiTreeComponent {
254
346
  this.getReseteKpi();
255
347
  });
256
348
  }
257
- buildMenuTree(userName, kpiData) {
258
- let filteredMenus = kpiData;
259
- const menuMap = new Map();
260
- const menuTree = [];
261
- filteredMenus.forEach(menu => {
262
- menuMap.set(menu.childTid || menu.parentTid, {
263
- id: menu.kpiId,
264
- title: menu.kpiName,
265
- icon: menu.icon,
266
- type: menu.kpiType,
267
- tagType: menu.tagType,
268
- visibility: true,
269
- ...(menu.link && { link: menu.link.replace(/^\/+/, '') }),
270
- children: []
271
- });
272
- });
273
- filteredMenus.forEach(kpi => {
274
- if (kpi.parentTid && kpi.childTid) {
275
- const parent = menuMap.get(kpi.parentTid);
276
- if (parent) {
277
- parent.children.push(menuMap.get(kpi.childTid));
278
- }
279
- }
280
- else {
281
- menuTree.push(menuMap.get(kpi.parentTid));
282
- }
349
+ getNewParrentKpiItemValue(e) {
350
+ this.isComponentUpdata = true;
351
+ const kpi_data = this.keiParentDataSource.find((item) => item.tid === e.value);
352
+ this.getHeistId(this.kpiData, kpi_data.tid);
353
+ let auto_tid = this.autoIncrement(kpi_data.tid, this.heistValue);
354
+ let obj = {
355
+ "name": this.editable_kpi_name,
356
+ "tid": auto_tid,
357
+ "isBookmarked": false,
358
+ "isAccessible": this.kpi_external,
359
+ "lastAccessTime": "",
360
+ "tag_type": this.editable_tag_type,
361
+ "id": this.editable_id,
362
+ "pageId": this.editable_page_id,
363
+ "desc": this.editable_desc,
364
+ "kpiInfo": this.editable_info,
365
+ "isVisible": this.kpi_visibility,
366
+ "nodes": [],
367
+ "config": {}
368
+ };
369
+ this.getDeleteKpiName(this.kpiData, this.editable_kpi_tid);
370
+ this.setKpibyTid(this.kpiData, kpi_data.tid, obj);
371
+ this.editable_kpi_tid = kpi_data.tid;
372
+ }
373
+ makeNewKpiWithUserEntity() {
374
+ this.userOptionContainer.forEach(element => {
375
+ let att_value = element.attributeValues.split(",");
376
+ element.attributeValues = att_value;
283
377
  });
284
- return menuTree;
378
+ if (this.selected_kpi_tid !== undefined && this.selected_kpi_tid.length > 0) {
379
+ this.getHeistId(this.kpiData, this.selected_kpi_tid);
380
+ }
381
+ else {
382
+ this.heistValue = (this.kpiData.length != 0) ? this.getHighestTid(this.kpiData) : 0;
383
+ let value = parseInt(this.heistValue) + 1;
384
+ }
385
+ let kpiObj = {
386
+ "kpiId": this.selected_id,
387
+ "pageId": this.selected_page_id,
388
+ "title": this.select_kpi_name,
389
+ "description": this.selected_desc,
390
+ "kpiInfo": this.selected_info,
391
+ "tagType": this.select_tag_type,
392
+ "active": true,
393
+ "visibility": this.kpi_visibility,
394
+ "externalKpi": this.kpi_external,
395
+ "target": "",
396
+ "icon": "",
397
+ "url": "",
398
+ "kpiType": "",
399
+ "parentTid": this.selected_kpi_tid,
400
+ "childTid": "",
401
+ "measures": this.userOptionContainer,
402
+ };
403
+ console.log("KPI with User Entity Obj:", kpiObj);
404
+ }
405
+ routeToKpiConfig() {
406
+ this.router.navigate(['apps/controlPanel/kpiController/kpiConfig']);
285
407
  }
286
408
  }
287
409
  CreateKpiTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateKpiTreeComponent, deps: [{ token: i1.CommonService }, { token: i2.FormBuilder }, { token: i3.CreateKpIService }, { token: i4.ToastrService }, { token: i5.Router }], target: i0.ɵɵFactoryTarget.Component });
288
- CreateKpiTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CreateKpiTreeComponent, selector: "app-create-kpi", ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"p-4 flex flex-row w-full\" *ngIf=\"!loadingModal\">\n <div class=\"mx-2 bg-white dark:bg-transparent border-r\">\n <!-- <ng-container *ngIf=\"isKpiTreePrepared\"> -->\n <treeview class=\"dark bg-gray-900 dark:bg-transparent\" [name]=\"'mainNavigation'\" [routeKey]=\"'raKpi'\"\n [navigation]=\"kpiData\" [isSearchBox]=\"false\" [isEditIcon]=\"true\"\n (editableKpiData)=\"getEditableKpi($event)\">\n </treeview>\n <!-- </ng-container> -->\n\n </div>\n <div class=\"mx-2 w-full\">\n <!-- <div class=\"flex flex-row item-center justify-center my-8\">\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"addNewKpi()\">Add New KPI</button>\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"routeToKpiConfig()\"\n routerLinkActive=\"router-link-active\">Configure KPI</button>\n </div> -->\n <!-- <ng-container *ngIf=\"isNewKpiAdded\"> -->\n <!-- <div class=\"px-2 w-full\"> -->\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Name</p>\n <dx-text-box [(ngModel)]=\"select_kpi_name\"></dx-text-box>\n </div>\n </div>\n <div class=\"flex flex-row w-full\">\n <div class=\"m-1 w-1/3\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Tag Type</p>\n <dx-select-box [dataSource]=\"tagType\" [(ngModel)]=\"select_tag_type\"\n (onValueChanged)=\"addTagtypeValue($event)\"></dx-select-box>\n </div>\n </div>\n <!-- (onCustomItemCreating)=\"onCustomDimentionCreating($event)\" -->\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Aliases</p>\n <dx-tag-box [acceptCustomValue]=\"true\" [(ngModel)]=\"selected_aliases\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Page ID</p>\n <!-- <dx-text-box [(ngModel)]=\"selected_page_id\"></dx-text-box> -->\n <dx-select-box [items]=\"templateDataSource\" valueExpr=\"pageId\" displayExpr=\"pageName\"\n [searchEnabled]=\"true\" [(ngModel)]=\"selected_page_id\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Description</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_desc\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\" [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\" [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n\n\n <div class=\"flex flex-row w-full\">\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Parent Component </p>\n <dx-select-box [items]=\"keiParentDataSource\" displayExpr=\"kpiName\" valueExpr=\"kpiId\"\n (onValueChanged)=\"getKpiItemValue($event)\" [(ngModel)]=\"parante_kpi_name\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Parent TID</p>\n <dx-text-box [(ngModel)]=\"selected_kpi_tid\" [readOnly]=\"false\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">TID</p>\n <dx-text-box [(ngModel)]=\"selected_kpi_child_tid\" [readOnly]=\"false\"></dx-text-box>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_visibility\" text=\"Visibility\"></dx-check-box>\n </div>\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_external\" text=\"External KPI\"></dx-check-box>\n </div>\n </div>\n <!-- <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">KPI Info</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_info\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div> -->\n\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n\n <div class=\"flex flex-auto mt-5 justify-end\">\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"getUpdateKpi()\" *ngIf=\"isEditKpiAdded\">Update KPI\n </button>\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"getDeletKpi()\" *ngIf=\"isEditKpiAdded\">Delete KPI\n </button>\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"makeNewKpiWithUserEntity()\" *ngIf=\"!isEditKpiAdded\">Create KPI\n </button>\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"getReseteKpi()\">Reset</button>\n\n </div>\n <!-- </div> -->\n <!-- </ng-container> -->\n </div>\n\n\n\n\n</div>", styles: [":host ::ng-deep treeview .treeview-wrapper{width:100%!important}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i8.DxiItemComponent, selector: "dxi-item", inputs: ["disabled", "html", "icon", "template", "text", "title", "visible", "onClick", "stylingMode", "type", "baseSize", "box", "ratio", "shrink", "elementAttr", "hint", "beginGroup", "closeMenuOnClick", "items", "selectable", "selected", "colSpan", "cssClass", "dataField", "editorOptions", "editorType", "helpText", "isRequired", "itemType", "label", "name", "validationRules", "visibleIndex", "alignItemLabels", "caption", "colCount", "colCountByScreen", "tabPanelOptions", "tabs", "badge", "tabTemplate", "buttonOptions", "horizontalAlignment", "verticalAlignment", "locateInMenu", "location", "menuItemTemplate", "options", "showText", "widget", "height", "width", "imageAlt", "imageSrc", "acceptedValues", "formatName", "formatValues", "key", "showChevron", "menuTemplate", "heightRatio", "widthRatio", "expanded", "hasItems", "id", "parentId"] }, { kind: "component", type: i9.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i8.DxoToolbarComponent, selector: "dxo-toolbar", inputs: ["disabled", "items", "visible", "fileSelectionItems", "container", "multiline"] }, { kind: "component", type: i10.DxHtmlEditorComponent, selector: "dx-html-editor", inputs: ["accessKey", "activeStateEnabled", "allowSoftLineBreak", "customizeModules", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "imageUpload", "isValid", "mediaResizing", "mentions", "name", "placeholder", "readOnly", "rtlEnabled", "stylingMode", "tabIndex", "tableContextMenu", "tableResizing", "toolbar", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueType", "variables", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onFocusIn", "onFocusOut", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "allowSoftLineBreakChange", "customizeModulesChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "imageUploadChange", "isValidChange", "mediaResizingChange", "mentionsChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "tableContextMenuChange", "tableResizingChange", "toolbarChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueTypeChange", "variablesChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i8.DxoImageUploadComponent, selector: "dxo-image-upload", inputs: ["fileUploaderOptions", "fileUploadMode", "tabs", "uploadDirectory", "uploadUrl"] }, { kind: "component", type: i8.DxoMediaResizingComponent, selector: "dxo-media-resizing", inputs: ["allowedTargets", "enabled"] }, { kind: "component", type: i11.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i12.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i13.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i14.UserAccessComponent, selector: "app-user-access", inputs: ["userOptionContainer"], outputs: ["userOptionContainerChange"] }, { kind: "component", type: i15.TreeviewComponent, selector: "treeview", inputs: ["autoCollapse", "inner", "navigation", "opened", "isEditIcon", "isSearchBox", "transparentOverlay", "treeListForSearchBox", "name", "openTreeId", "routeKey"], outputs: ["editableKpiData"] }] });
410
+ CreateKpiTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CreateKpiTreeComponent, selector: "app-create-kpi", ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"p-4 flex flex-row w-full\">\n <div class=\"mx-2 bg-white dark:bg-transparent border-r\">\n\n <treeview class=\"dark bg-gray-900 dark:bg-transparent\" [name]=\"'mainNavigation'\" [routeKey]=\"'raKpi'\"\n [navigation]=\"kpiData\" [isSearchBox]=\"false\" [isEditIcon]=\"true\" (editableKpiData)=\"getEditableKpi($event)\">\n </treeview>\n </div>\n <div class=\"mx-2 w-full\">\n <div class=\"flex flex-row item-center justify-center my-8\">\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"addNewKpi()\">Add New KPI</button>\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"routeToKpiConfig()\"\n routerLinkActive=\"router-link-active\">Configure KPI</button>\n </div>\n <ng-container *ngIf=\"isNewKpiAdded\">\n <div class=\"px-2 w-full\">\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Name</p>\n <dx-text-box [(ngModel)]=\"select_kpi_name\"></dx-text-box>\n </div>\n </div>\n\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Tag Type</p>\n <dx-select-box [dataSource]=\"tagType\" [(ngModel)]=\"select_tag_type\"\n (onValueChanged)=\"addTagtypeValue($event)\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">ID</p>\n <dx-text-box [(ngModel)]=\"selected_id\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Page ID</p>\n <!-- <dx-text-box [(ngModel)]=\"selected_page_id\"></dx-text-box> -->\n <dx-select-box [items]=\"templateDataSource\" valueExpr=\"pageId\" displayExpr=\"pageName\" [searchEnabled]=\"true\"\n [(ngModel)]=\"selected_page_id\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Description</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_desc\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\" [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Parent Component </p>\n <dx-select-box [dataSource]=\"keiParentDataSource\" displayExpr=\"name\" valueExpr=\"tid\"\n (onValueChanged)=\"getKpiItemValue($event)\" [value]=\"parante_kpi_name\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">TID</p>\n <dx-text-box [(ngModel)]=\"selected_kpi_tid\" [readOnly]=\"true\"></dx-text-box>\n </div>\n </div>\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_visibility\" text=\"Visibility\"></dx-check-box>\n </div>\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_external\" text=\"External KPI\"></dx-check-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">KPI Info</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_info\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n\n <div class=\"flex flex-auto mt-5 justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"makeNewKpi()\">Create\n </button>\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"makeNewKpiWithUserEntity()\">Create With User Privilege\n </button>\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"getReseteKpi()\">Reset</button>\n\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isEditKpiAdded\">\n <div class=\"px-2 w-full\">\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mb-2\">Name</p>\n <dx-text-box [(ngModel)]=\"editable_kpi_name\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Tag Type</p>\n <dx-select-box [dataSource]=\"tagType\" [(ngModel)]=\"editable_tag_type\"\n (onValueChanged)=\"addTagtypeValue($event)\" [readOnly]=\"isFromEditable\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">ID</p>\n <dx-text-box [(ngModel)]=\"editable_id\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Page ID</p>\n <!-- <dx-text-box [(ngModel)]=\"editable_page_id\"></dx-text-box> -->\n <dx-select-box [items]=\"templateDataSource\" valueExpr=\"pageId\" displayExpr=\"pageName\" [searchEnabled]=\"true\"\n [(ngModel)]=\"editable_page_id\"></dx-select-box>\n\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Description</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"editable_desc\">\n <dxo-toolbar [multiline]=\"true\">\n <dxi-item name=\"undo\"></dxi-item>\n <dxi-item name=\"redo\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"blockquote\"></dxi-item>\n\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Parent Component </p>\n <dx-select-box [searchEnabled]=\"true\" [readOnly]=\"editable_tag_type == 'parent'\"\n [dataSource]=\"keiParentDataSource\" displayExpr=\"name\" valueExpr=\"tid\"\n (onValueChanged)=\"getNewParrentKpiItemValue($event)\"\n [value]=\"parante_kpi_name\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">TID</p>\n <dx-text-box [(ngModel)]=\"editable_kpi_tid\" [readOnly]=\"false\"></dx-text-box>\n </div>\n </div>\n <div class=\"flex flex-row justify-between mt-3\">\n\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_visibility\" text=\"Visibility\"></dx-check-box>\n </div>\n\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_external\" text=\"External KPI\"></dx-check-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">KPI Info</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"editable_info\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n <div class=\"flex flex-auto mt-3 justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"getUpdateKpi()\">Update\n </button>\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"getDeleteKpi()\">Delete\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}}\" (click)=\"cancelUpdate()\">Cancle</button> -->\n\n </div>\n </div>\n </ng-container>\n </div>\n\n\n\n\n</div>", styles: [":host ::ng-deep treeview .treeview-wrapper{width:100%!important}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i8.DxiItemComponent, selector: "dxi-item", inputs: ["disabled", "html", "icon", "template", "text", "title", "visible", "onClick", "stylingMode", "type", "baseSize", "box", "ratio", "shrink", "elementAttr", "hint", "beginGroup", "closeMenuOnClick", "items", "selectable", "selected", "colSpan", "cssClass", "dataField", "editorOptions", "editorType", "helpText", "isRequired", "itemType", "label", "name", "validationRules", "visibleIndex", "alignItemLabels", "caption", "colCount", "colCountByScreen", "tabPanelOptions", "tabs", "badge", "tabTemplate", "buttonOptions", "horizontalAlignment", "verticalAlignment", "locateInMenu", "location", "menuItemTemplate", "options", "showText", "widget", "height", "width", "imageAlt", "imageSrc", "acceptedValues", "formatName", "formatValues", "key", "showChevron", "menuTemplate", "heightRatio", "widthRatio", "expanded", "hasItems", "id", "parentId"] }, { kind: "component", type: i9.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i8.DxoToolbarComponent, selector: "dxo-toolbar", inputs: ["disabled", "items", "visible", "fileSelectionItems", "container", "multiline"] }, { kind: "component", type: i10.DxHtmlEditorComponent, selector: "dx-html-editor", inputs: ["accessKey", "activeStateEnabled", "allowSoftLineBreak", "customizeModules", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "imageUpload", "isValid", "mediaResizing", "mentions", "name", "placeholder", "readOnly", "rtlEnabled", "stylingMode", "tabIndex", "tableContextMenu", "tableResizing", "toolbar", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueType", "variables", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onFocusIn", "onFocusOut", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "allowSoftLineBreakChange", "customizeModulesChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "imageUploadChange", "isValidChange", "mediaResizingChange", "mentionsChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "tableContextMenuChange", "tableResizingChange", "toolbarChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueTypeChange", "variablesChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i8.DxoImageUploadComponent, selector: "dxo-image-upload", inputs: ["fileUploaderOptions", "fileUploadMode", "tabs", "uploadDirectory", "uploadUrl"] }, { kind: "component", type: i8.DxoMediaResizingComponent, selector: "dxo-media-resizing", inputs: ["allowedTargets", "enabled"] }, { kind: "component", type: i11.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i12.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i13.UserAccessComponent, selector: "app-user-access", inputs: ["userOptionContainer"], outputs: ["userOptionContainerChange"] }, { kind: "component", type: i14.TreeviewComponent, selector: "treeview", inputs: ["autoCollapse", "inner", "navigation", "opened", "isEditIcon", "isSearchBox", "transparentOverlay", "treeListForSearchBox", "name", "openTreeId", "routeKey"], outputs: ["editableKpiData"] }] });
289
411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateKpiTreeComponent, decorators: [{
290
412
  type: Component,
291
- args: [{ selector: 'app-create-kpi', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"p-4 flex flex-row w-full\" *ngIf=\"!loadingModal\">\n <div class=\"mx-2 bg-white dark:bg-transparent border-r\">\n <!-- <ng-container *ngIf=\"isKpiTreePrepared\"> -->\n <treeview class=\"dark bg-gray-900 dark:bg-transparent\" [name]=\"'mainNavigation'\" [routeKey]=\"'raKpi'\"\n [navigation]=\"kpiData\" [isSearchBox]=\"false\" [isEditIcon]=\"true\"\n (editableKpiData)=\"getEditableKpi($event)\">\n </treeview>\n <!-- </ng-container> -->\n\n </div>\n <div class=\"mx-2 w-full\">\n <!-- <div class=\"flex flex-row item-center justify-center my-8\">\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"addNewKpi()\">Add New KPI</button>\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"routeToKpiConfig()\"\n routerLinkActive=\"router-link-active\">Configure KPI</button>\n </div> -->\n <!-- <ng-container *ngIf=\"isNewKpiAdded\"> -->\n <!-- <div class=\"px-2 w-full\"> -->\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Name</p>\n <dx-text-box [(ngModel)]=\"select_kpi_name\"></dx-text-box>\n </div>\n </div>\n <div class=\"flex flex-row w-full\">\n <div class=\"m-1 w-1/3\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Tag Type</p>\n <dx-select-box [dataSource]=\"tagType\" [(ngModel)]=\"select_tag_type\"\n (onValueChanged)=\"addTagtypeValue($event)\"></dx-select-box>\n </div>\n </div>\n <!-- (onCustomItemCreating)=\"onCustomDimentionCreating($event)\" -->\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Aliases</p>\n <dx-tag-box [acceptCustomValue]=\"true\" [(ngModel)]=\"selected_aliases\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Page ID</p>\n <!-- <dx-text-box [(ngModel)]=\"selected_page_id\"></dx-text-box> -->\n <dx-select-box [items]=\"templateDataSource\" valueExpr=\"pageId\" displayExpr=\"pageName\"\n [searchEnabled]=\"true\" [(ngModel)]=\"selected_page_id\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Description</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_desc\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\" [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\" [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n\n\n <div class=\"flex flex-row w-full\">\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Parent Component </p>\n <dx-select-box [items]=\"keiParentDataSource\" displayExpr=\"kpiName\" valueExpr=\"kpiId\"\n (onValueChanged)=\"getKpiItemValue($event)\" [(ngModel)]=\"parante_kpi_name\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Parent TID</p>\n <dx-text-box [(ngModel)]=\"selected_kpi_tid\" [readOnly]=\"false\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1 w-full\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">TID</p>\n <dx-text-box [(ngModel)]=\"selected_kpi_child_tid\" [readOnly]=\"false\"></dx-text-box>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_visibility\" text=\"Visibility\"></dx-check-box>\n </div>\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_external\" text=\"External KPI\"></dx-check-box>\n </div>\n </div>\n <!-- <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">KPI Info</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_info\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div> -->\n\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n\n <div class=\"flex flex-auto mt-5 justify-end\">\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"getUpdateKpi()\" *ngIf=\"isEditKpiAdded\">Update KPI\n </button>\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"getDeletKpi()\" *ngIf=\"isEditKpiAdded\">Delete KPI\n </button>\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"makeNewKpiWithUserEntity()\" *ngIf=\"!isEditKpiAdded\">Create KPI\n </button>\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"getReseteKpi()\">Reset</button>\n\n </div>\n <!-- </div> -->\n <!-- </ng-container> -->\n </div>\n\n\n\n\n</div>", styles: [":host ::ng-deep treeview .treeview-wrapper{width:100%!important}\n"] }]
413
+ args: [{ selector: 'app-create-kpi', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"p-4 flex flex-row w-full\">\n <div class=\"mx-2 bg-white dark:bg-transparent border-r\">\n\n <treeview class=\"dark bg-gray-900 dark:bg-transparent\" [name]=\"'mainNavigation'\" [routeKey]=\"'raKpi'\"\n [navigation]=\"kpiData\" [isSearchBox]=\"false\" [isEditIcon]=\"true\" (editableKpiData)=\"getEditableKpi($event)\">\n </treeview>\n </div>\n <div class=\"mx-2 w-full\">\n <div class=\"flex flex-row item-center justify-center my-8\">\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"addNewKpi()\">Add New KPI</button>\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"routeToKpiConfig()\"\n routerLinkActive=\"router-link-active\">Configure KPI</button>\n </div>\n <ng-container *ngIf=\"isNewKpiAdded\">\n <div class=\"px-2 w-full\">\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Name</p>\n <dx-text-box [(ngModel)]=\"select_kpi_name\"></dx-text-box>\n </div>\n </div>\n\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Tag Type</p>\n <dx-select-box [dataSource]=\"tagType\" [(ngModel)]=\"select_tag_type\"\n (onValueChanged)=\"addTagtypeValue($event)\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">ID</p>\n <dx-text-box [(ngModel)]=\"selected_id\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Page ID</p>\n <!-- <dx-text-box [(ngModel)]=\"selected_page_id\"></dx-text-box> -->\n <dx-select-box [items]=\"templateDataSource\" valueExpr=\"pageId\" displayExpr=\"pageName\" [searchEnabled]=\"true\"\n [(ngModel)]=\"selected_page_id\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Description</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_desc\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\" [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Parent Component </p>\n <dx-select-box [dataSource]=\"keiParentDataSource\" displayExpr=\"name\" valueExpr=\"tid\"\n (onValueChanged)=\"getKpiItemValue($event)\" [value]=\"parante_kpi_name\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">TID</p>\n <dx-text-box [(ngModel)]=\"selected_kpi_tid\" [readOnly]=\"true\"></dx-text-box>\n </div>\n </div>\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_visibility\" text=\"Visibility\"></dx-check-box>\n </div>\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_external\" text=\"External KPI\"></dx-check-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">KPI Info</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"selected_info\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n\n <div class=\"flex flex-auto mt-5 justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"makeNewKpi()\">Create\n </button>\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"makeNewKpiWithUserEntity()\">Create With User Privilege\n </button>\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"getReseteKpi()\">Reset</button>\n\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isEditKpiAdded\">\n <div class=\"px-2 w-full\">\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mb-2\">Name</p>\n <dx-text-box [(ngModel)]=\"editable_kpi_name\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Tag Type</p>\n <dx-select-box [dataSource]=\"tagType\" [(ngModel)]=\"editable_tag_type\"\n (onValueChanged)=\"addTagtypeValue($event)\" [readOnly]=\"isFromEditable\"></dx-select-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">ID</p>\n <dx-text-box [(ngModel)]=\"editable_id\"></dx-text-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Page ID</p>\n <!-- <dx-text-box [(ngModel)]=\"editable_page_id\"></dx-text-box> -->\n <dx-select-box [items]=\"templateDataSource\" valueExpr=\"pageId\" displayExpr=\"pageName\" [searchEnabled]=\"true\"\n [(ngModel)]=\"editable_page_id\"></dx-select-box>\n\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">Description</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"editable_desc\">\n <dxo-toolbar [multiline]=\"true\">\n <dxi-item name=\"undo\"></dxi-item>\n <dxi-item name=\"redo\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"blockquote\"></dxi-item>\n\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\"> Parent Component </p>\n <dx-select-box [searchEnabled]=\"true\" [readOnly]=\"editable_tag_type == 'parent'\"\n [dataSource]=\"keiParentDataSource\" displayExpr=\"name\" valueExpr=\"tid\"\n (onValueChanged)=\"getNewParrentKpiItemValue($event)\"\n [value]=\"parante_kpi_name\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">TID</p>\n <dx-text-box [(ngModel)]=\"editable_kpi_tid\" [readOnly]=\"false\"></dx-text-box>\n </div>\n </div>\n <div class=\"flex flex-row justify-between mt-3\">\n\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_visibility\" text=\"Visibility\"></dx-check-box>\n </div>\n\n <div class=\"px-2 pt-1 w-full\">\n <dx-check-box [(ngModel)]=\"kpi_external\" text=\"External KPI\"></dx-check-box>\n </div>\n </div>\n <div class=\"m-1\">\n <div class=\"px-2 pt-1 w-full\">\n <p class=\"text-lg mt-2\">KPI Info</p>\n <dx-html-editor height=\"'auto'\" [(ngModel)]=\"editable_info\">\n <dxo-toolbar [multiline]=\"false\">\n\n <dxi-item name=\"size\"\n [acceptedValues]=\"['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt']\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font size' } }\"></dxi-item>\n <dxi-item name=\"font\" [acceptedValues]=\"[\n 'Arial',\n 'Courier New',\n 'Georgia',\n 'Impact',\n 'Lucida Console',\n 'Tahoma',\n 'Times New Roman',\n 'Verdana'\n ]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Font family' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"bold\"></dxi-item>\n <dxi-item name=\"italic\"></dxi-item>\n <dxi-item name=\"underline\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"alignLeft\"></dxi-item>\n <dxi-item name=\"alignCenter\"></dxi-item>\n <dxi-item name=\"alignRight\"></dxi-item>\n <dxi-item name=\"alignJustify\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"orderedList\"></dxi-item>\n <dxi-item name=\"bulletList\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"header\" [acceptedValues]=\"[false, 1, 2, 3, 4, 5]\"\n [options]=\"{ inputAttr: { 'aria-label': 'Header' } }\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"color\"></dxi-item>\n <dxi-item name=\"background\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"link\"></dxi-item>\n <dxi-item name=\"image\"></dxi-item>\n <dxi-item name=\"separator\"></dxi-item>\n <dxi-item name=\"clear\"></dxi-item>\n <dxi-item name=\"codeBlock\"></dxi-item>\n </dxo-toolbar>\n <dxo-media-resizing [enabled]=\"true\"> </dxo-media-resizing>\n <dxo-image-upload [tabs]=\"['file', 'url']\" fileUploadMode=\"base64\">\n </dxo-image-upload>\n </dx-html-editor>\n </div>\n </div>\n <div class=\"flex flex-auto mt-3 justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"getUpdateKpi()\">Update\n </button>\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"getDeleteKpi()\">Delete\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}}\" (click)=\"cancelUpdate()\">Cancle</button> -->\n\n </div>\n </div>\n </ng-container>\n </div>\n\n\n\n\n</div>", styles: [":host ::ng-deep treeview .treeview-wrapper{width:100%!important}\n"] }]
292
414
  }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.FormBuilder }, { type: i3.CreateKpIService }, { type: i4.ToastrService }, { type: i5.Router }]; } });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWtwaS10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvdGVtcGxhdGUtbW9kdWxlL0twaUNyZWF0aW9uTW9kdWxlL2NyZWF0ZS1rcGktdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3RlbXBsYXRlLW1vZHVsZS9LcGlDcmVhdGlvbk1vZHVsZS9jcmVhdGUta3BpLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhbEQsTUFBTSxPQUFPLHNCQUFzQjtJQTZDakMsWUFDUyxhQUE0QixFQUFVLFdBQXdCLEVBQzdELE9BQXlCLEVBQVUsTUFBcUIsRUFDeEQsTUFBYztRQUZmLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDN0QsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3hELFdBQU0sR0FBTixNQUFNLENBQVE7UUEvQ3hCLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBQzdCLHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUU5QixZQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsbUJBQWMsR0FBUSxFQUFFLENBQUM7UUFXekIsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFFbEIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsbUJBQWMsR0FBWSxLQUFL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Q2QsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDekQsUUFBUSxFQUFFLEVBQUU7YUFDYixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLE1BQU0sRUFBRTtvQkFDVixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNqRDthQUNGO2lCQUFNO2dCQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUMzQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7bUhBaFhVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLHNEQ2JuQyxpMFdBME1NOzJGRDdMTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBSb3V0ZXIsIFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDcmVhdGVLcElTZXJ2aWNlIH0gZnJvbSAnLi9jcmVhdGVLcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci9jb21tb24nO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jcmVhdGUta3BpJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1rcGktdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1rcGktdHJlZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENyZWF0ZUtwaVRyZWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBsb2FkaW5nTW9kYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBrZWlQYXJlbnREYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgbXlGb3JtOiBGb3JtR3JvdXA7XG4gIHRhZ1R5cGUgPSBbXCJwYXJlbnRcIiwgXCJjaGlsZFwiXTtcbiAga3BpX2NvbnN0cnVjdG9yID0gW107XG4gIHNlbGVjdGVkX3Bfa3BpOiBhbnkgPSB7fTtcblxuICBzZWxlY3Rfa3BpX25hbWU6IGFueTtcbiAgc2VsZWN0X3RhZ190eXBlOiBhbnk7XG4gIHNlbGVjdGVkX2lkOiBhbnk7XG4gIHNlbGVjdGVkX3BhZ2VfaWQ6IGFueTtcbiAgc2VsZWN0ZWRfbmVzdGVkX25hbWU6IGFueTtcbiAgc2VsZWN0ZWRfa3BpX3RpZDogYW55O1xuICBzZWxlY3RlZF9kZXNjOiBhbnk7XG4gIHNlbGVjdGVkX2luZm86IGFueTtcblxuICBoZWlnaHQgPSA5MDtcbiAga3BpRGF0YTogYW55ID0gW107XG4gIGhlaXN0VmFsdWU6IGFueTtcbiAgaXNGcm9tRWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNOZXdLcGlBZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0VkaXRLcGlBZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGVkaXRhYmxlX2Rlc2MgPSBcIlwiO1xuICBlZGl0YWJsZV9pbmZvID0gXCJcIjtcbiAgZWRpdGFibGVfaWQ7XG4gIGVkaXRhYmxlX3BhZ2VfaWQ7XG4gIGVkaXRhYmxlX3RhZ190eXBlO1xuICBlZGl0YWJsZV9rcGlfbmFtZTtcbiAgZWRpdGFibGVfa3BpX3RpZDtcbiAgc2VsZWN0ZWRfa3BpX2NoaWxkX3RpZDtcbiAga3BpX3Zpc2liaWxpdHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAga3BpX2V4dGVybmFsOiBib29sZWFuID0gZmFsc2U7XG4gIHBhcmFudGVfa3BpX25hbWU6IGFueTtcbiAgaXNDb21wb25lbnRVcGRhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGVtcGxhdGVEYXRhU291cmNlOiBhbnk7XG4gIC8vIGtwaURhdGFKc29uOmFueTtcbiAgdXNlck9wdGlvbkNvbnRhaW5lcjogYW55ID0gW107XG5cbiAgc2VsZWN0ZWRfYWxpYXNlczogYW55ID0gW107XG4gIGlzS3BpVHJlZVByZXBhcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAga3BpQ29uZmlnRGF0YVNvdXJjZTogYW55ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgc2VydmljZTogQ3JlYXRlS3BJU2VydmljZSwgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge1xuXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIHRoaXMuZ2V0QWxsS3BpRGF0YSgpO1xuICAgIHRoaXMuZ2V0QXBwUGFnZUNvbmZpZ3MoKTtcbiAgfVxuXG4gIGdldEFwcFBhZ2VDb25maWdzKCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBQYWdlQ29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVEYXRhU291cmNlID0gZGF0YTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdQYWdlIElEJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXRBbGxLcGlEYXRhKCkge1xuXG4gICAgdGhpcy5rZWlQYXJlbnREYXRhU291cmNlID0gW107XG4gICAgdGhpcy5zZXJ2aWNlLmxpc3RLcGlFbnRyeUNvbmZpZ3MoKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgY29uc3QgdXNlck5hbWUgPSBcImFkbWluXCI7XG4gICAgICB0aGlzLmtwaUNvbmZpZ0RhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgdGhpcy5rcGlEYXRhID0gdGhpcy5idWlsZE1lbnVUcmVlKHVzZXJOYW1lLCBkYXRhKTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAvLyAgdGhpcy5rZWlQYXJlbnREYXRhU291cmNlID0gZGF0YTtcbiAgICAgIHRoaXMucHJlcGFyZVBhcmVudERhdGFTb3VyY2UoZGF0YSlcblxuICAgIH0sIGVyciA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdLUEkgQ29uZmlnJylcbiAgICB9KVxuICB9XG5cbiAgcHJlcGFyZVBhcmVudERhdGFTb3VyY2UoZGF0YSkge1xuICAgIGRhdGEuZm9yRWFjaCgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQudGFnVHlwZSA9PSAncGFyZW50Jykge1xuICAgICAgICAvLyBjb25zdCB0aWRLZXkgPSBkYXRhLnRhZ1R5cGUgPT09ICdjaGlsZCcgPyAnY2hpbGRUaWQnIDogJ3BhcmVudFRpZCc7XG4gICAgICAgIC8vICBsZXQgbm9kZSA9IHtcbiAgICAgICAgLy8gICBcImtwaU5hbWVcIjogcmVzdWx0LmtwaU5hbWUsXG4gICAgICAgIC8vICAgXCJ0aWRcIjogcmVzdWx0W3RpZEtleV0sXG4gICAgICAgIC8vICAgXCJrcGlJZFwiOiByZXN1bHQua3BpSWRcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmtlaVBhcmVudERhdGFTb3VyY2UucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBtYWtlTmV3S3BpV2l0aFVzZXJFbnRpdHkoKSB7XG4gICAgY29uc3QgcGFnZURhdGEgPSAodGhpcy5zZWxlY3RlZF9wYWdlX2lkKSA/IHRoaXMudGVtcGxhdGVEYXRhU291cmNlLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5wYWdlSWQgPT09IHRoaXMuc2VsZWN0ZWRfcGFnZV9pZCkgOiBudWxsO1xuXG4gICAgbGV0IGtwaU9iaiA9IHtcbiAgICAgIFwia3BpSWRcIjogdGhpcy5zZWxlY3RlZF9pZCxcbiAgICAgIFwia3BpTmFtZVwiOiB0aGlzLnNlbGVjdF9rcGlfbmFtZSxcbiAgICAgIFwiYWxpYXNlc1wiOiB0aGlzLnNlbGVjdGVkX2FsaWFzZXMsXG4gICAgICBcInBhZ2VJZFwiOiB0aGlzLnNlbGVjdGVkX3BhZ2VfaWQsXG4gICAgICBcImRlc2NyaXB0aW9uXCI6IHRoaXMuc2VsZWN0ZWRfZGVzYyxcbiAgICAgIFwia3BpSW5mb1wiOiBcIlwiLFxuICAgICAgXCJ0YWdUeXBlXCI6IHRoaXMuc2VsZWN0X3RhZ190eXBlLFxuICAgICAgXCJhY3RpdmVcIjogdHJ1ZSxcbiAgICAgIFwidmlzaWJpbGl0eVwiOiB0aGlzLmtwaV92aXNpYmlsaXR5LFxuICAgICAgXCJleHRlcm5hbEtwaVwiOiB0aGlzLmtwaV9leHRlcm5hbCxcbiAgICAgIFwidGFyZ2V0XCI6IFwiXCIsXG4gICAgICBcImljb25cIjogXCJcIixcbiAgICAgIFwidXJsXCI6IHBhZ2VEYXRhID8gcGFnZURhdGEucGFnZVVybCA6IFwiXCIsXG4gICAgICBcImtwaVR5cGVcIjogdGhpcy5zZWxlY3RfdGFnX3R5cGUgPT0gXCJwYXJlbnRcIiA/IFwiY29sbGFwc2FibGVcIiA6IFwiYmFzaWNcIixcbiAgICAgIFwicGFyZW50VGlkXCI6IHRoaXMuc2VsZWN0ZWRfa3BpX3RpZCxcbiAgICAgIFwiY2hpbGRUaWRcIjogdGhpcy5zZWxlY3RlZF9rcGlfY2hpbGRfdGlkLFxuICAgICAgXCJwZXJtaXNzaW9uc1wiOiB0aGlzLnVzZXJPcHRpb25Db250YWluZXIsXG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2aWNlLmNyZWF0ZUtwaUVudHJ5Q29uZmlnKGtwaU9iaikuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnS1BJIENyZWF0ZWQgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIHRoaXMuZ2V0QWxsS3BpRGF0YSgpO1xuICAgICAgdGhpcy5nZXRSZXNldGVLcGkoKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdLUEkgQ29uZmlnJylcbiAgICB9KVxuXG4gICAgY29uc29sZS5sb2coXCJLUEkgd2l0aCBVc2VyIEVudGl0eSBPYmo6XCIsIGtwaU9iaik7XG4gIH1cblxuICBnZXRFZGl0YWJsZUtwaShrcGk6IGFueSkge1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMua3BpQ29uZmlnRGF0YVNvdXJjZS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0ua3BpSWQgPT09IGtwaS5pZCk7XG5cbiAgICAvLyBjb25zdCBwYXJlbnROYW1lID0gdGhpcy5rZWlQYXJlbnREYXRhU291cmNlLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJlbnRUaWQgPT0gZGF0YVtcInBhcmVudFRpZFwiXSk7XG5cblxuICAgIGNvbnN0IHRpZEtleSA9IGRhdGEudGFnVHlwZSA9PT0gJ2NoaWxkJyAmJiBkYXRhLmNoaWxkVGlkICYmIGRhdGEuY2hpbGRUaWQubGVuZ3RoID4gMyA/ICdjaGlsZFRpZCcgOiAncGFyZW50VGlkJztcbiAgICBjb25zdCBwYXJlbnROYW1lID0gdGhpcy5rZWlQYXJlbnREYXRhU291cmNlLmZpbmQoXG4gICAgICAoaXRlbTogYW55KSA9PiBpdGVtW3RpZEtleV0gPT0gZGF0YVtcInBhcmVudFRpZFwiXVxuICAgICk7XG4gICAgdGhpcy5wYXJhbnRlX2twaV9uYW1lID0gcGFyZW50TmFtZSA/IHBhcmVudE5hbWVbJ2twaUlkJ10gOiBudWxsO1xuXG5cbiAgICB0aGlzLnNlbGVjdGVkX2lkID0gZGF0YVtcImtwaUlkXCJdO1xuICAgIHRoaXMuc2VsZWN0X2twaV9uYW1lID0gZGF0YVtcImtwaU5hbWVcIl07XG4gICAgdGhpcy5zZWxlY3RlZF9hbGlhc2VzID0gZGF0YVtcImFsaWFzZXNcIl07XG4gICAgdGhpcy5zZWxlY3RlZF9wYWdlX2lkID0gZGF0YVtcInBhZ2VJZFwiXTtcbiAgICB0aGlzLnNlbGVjdGVkX2Rlc2MgPSBkYXRhW1wiZGVzY3JpcHRpb25cIl07XG4gICAgdGhpcy5zZWxlY3RfdGFnX3R5cGUgPSBkYXRhW1widGFnVHlwZVwiXTtcbiAgICB0aGlzLmtwaV92aXNpYmlsaXR5ID0gZGF0YVtcInZpc2liaWxpdHlcIl07XG4gICAgdGhpcy5rcGlfZXh0ZXJuYWwgPSBkYXRhW1wiZXh0ZXJuYWxLcGlcIl07XG4gICAgdGhpcy5zZWxlY3RlZF9rcGlfdGlkID0gZGF0YVtcInBhcmVudFRpZFwiXTtcbiAgICB0aGlzLnNlbGVjdGVkX2twaV9jaGlsZF90aWQgPSBkYXRhW1wiY2hpbGRUaWRcIl07XG4gICAgdGhpcy51c2VyT3B0aW9uQ29udGFpbmVyID0gKGRhdGFbXCJwZXJtaXNzaW9uc1wiXSAmJiBkYXRhW1wicGVybWlzc2lvbnNcIl0ubGVuZ3RoID4gMCkgPyBkYXRhW1wicGVybWlzc2lvbnNcIl0gOiBbXTtcbiAgICB0aGlzLmlzRWRpdEtwaUFkZGVkID0gdHJ1ZTtcblxuICB9XG5cbiAgZ2V0VXBkYXRlS3BpKCkge1xuICAgIGNvbnN0IHBhZ2VEYXRhID0gKHRoaXMuc2VsZWN0ZWRfcGFnZV9pZCkgPyB0aGlzLnRlbXBsYXRlRGF0YVNvdXJjZS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0ucGFnZUlkID09PSB0aGlzLnNlbGVjdGVkX3BhZ2VfaWQpIDogbnVsbDtcblxuICAgIGxldCBrcGlPYmogPSB7XG4gICAgICBcImtwaUlkXCI6IHRoaXMuc2VsZWN0ZWRfaWQsXG4gICAgICBcImtwaU5hbWVcIjogdGhpcy5zZWxlY3Rfa3BpX25hbWUsXG4gICAgICBcImFsaWFzZXNcIjogdGhpcy5zZWxlY3RlZF9hbGlhc2VzLFxuICAgICAgXCJwYWdlSWRcIjogdGhpcy5zZWxlY3RlZF9wYWdlX2lkLFxuICAgICAgXCJkZXNjcmlwdGlvblwiOiB0aGlzLnNlbGVjdGVkX2Rlc2MsXG4gICAgICBcImtwaUluZm9cIjogXCJcIixcbiAgICAgIFwidGFnVHlwZVwiOiB0aGlzLnNlbGVjdF90YWdfdHlwZSxcbiAgICAgIFwiYWN0aXZlXCI6IHRydWUsXG4gICAgICBcInZpc2liaWxpdHlcIjogdGhpcy5rcGlfdmlzaWJpbGl0eSxcbiAgICAgIFwiZXh0ZXJuYWxLcGlcIjogdGhpcy5rcGlfZXh0ZXJuYWwsXG4gICAgICBcInRhcmdldFwiOiBcIlwiLFxuICAgICAgXCJpY29uXCI6IFwiXCIsXG4gICAgICBcInVybFwiOiBwYWdlRGF0YSA/IHBhZ2VEYXRhLnBhZ2VVcmwgOiBcIlwiLFxuICAgICAgXCJrcGlUeXBlXCI6IHRoaXMuc2VsZWN0X3RhZ190eXBlID09IFwicGFyZW50XCIgPyBcImNvbGxhcHNhYmxlXCIgOiBcImJhc2ljXCIsXG4gICAgICBcInBhcmVudFRpZFwiOiB0aGlzLnNlbGVjdGVkX2twaV90aWQsXG4gICAgICBcImNoaWxkVGlkXCI6IHRoaXMuc2VsZWN0ZWRfa3BpX2NoaWxkX3RpZCxcbiAgICAgIFwicGVybWlzc2lvbnNcIjogdGhpcy51c2VyT3B0aW9uQ29udGFpbmVyLFxuICAgIH1cblxuICAgIHRoaXMuc2VydmljZS51cGRhdGVLcGlFbnRyeUNvbmZpZyhrcGlPYmopLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoJ0tQSSBVcGRhdGVkIFN1Y2Nlc3NmdWxseScpXG4gICAgICB0aGlzLmdldEFsbEtwaURhdGEoKTtcbiAgICAgIHRoaXMuZ2V0UmVzZXRlS3BpKCk7XG4gICAgICB0aGlzLmlzRWRpdEtwaUFkZGVkID0gZmFsc2U7XG5cbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdLUEkgQ29uZmlnJylcbiAgICB9KVxuXG4gICAgY29uc29sZS5sb2coXCJLUEkgd2l0aCBVc2VyIEVudGl0eSBPYmo6XCIsIGtwaU9iaik7XG4gIH1cblxuICBvbkN1c3RvbURpbWVudGlvbkNyZWF0aW5nKGFyZ3MpIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGFyZ3MudGV4dDtcbiAgICBhcmdzLmN1c3RvbUl0ZW0gPSBuZXdWYWx1ZTtcbiAgICBjb25zdCBpc0l0ZW1JbkRhdGFTb3VyY2UgPSB0aGlzLnNlbGVjdGVkX2FsaWFzZXMuc29tZSgoaXRlbSkgPT4gaXRlbSA9PT0gbmV3VmFsdWUpO1xuICAgIGlmICghaXNJdGVtSW5EYXRhU291cmNlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkX2FsaWFzZXMudW5zaGlmdChuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG5cblxuXG4gIGdldFJlc2V0ZUtwaSgpIHtcbiAgICB0aGlzLnNlbGVjdF9rcGlfbmFtZSA9ICcnO1xuICAgIHRoaXMuc2VsZWN0X3RhZ190eXBlID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZF9pZCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRfcGFnZV9pZCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRfa3BpX3RpZCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRfZGVzYyA9ICcnO1xuICAgIHRoaXMucGFyYW50ZV9rcGlfbmFtZSA9ICcnO1xuICAgIHRoaXMuZWRpdGFibGVfa3BpX25hbWUgPSAnJztcbiAgICB0aGlzLmVkaXRhYmxlX3RhZ190eXBlID0gJyc7XG4gICAgdGhpcy5lZGl0YWJsZV9pZCA9ICcnO1xuICAgIHRoaXMuZWRpdGFibGVfcGFnZV9pZCA9ICcnO1xuICAgIHRoaXMuZWRpdGFibGVfa3BpX3RpZCA9ICcnO1xuICAgIHRoaXMuZWRpdGFibGVfZGVzYyA9ICcnO1xuICAgIHRoaXMuZWRpdGFibGVfaW5mbyA9ICcnO1xuICAgIHRoaXMucGFyYW50ZV9rcGlfbmFtZSA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRfa3BpX2NoaWxkX3RpZCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRfYWxpYXNlcyA9IFtdO1xuICAgIHRoaXMua3BpX2V4dGVybmFsID0gZmFsc2U7XG4gICAgdGhpcy5rcGlfdmlzaWJpbGl0eSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDb21wb25lbnRVcGRhdGEgPSBmYWxzZTtcbiAgICB0aGlzLmlzRWRpdEtwaUFkZGVkID0gZmFsc2U7XG4gIH1cblxuXG4gIGFkZFRhZ3R5cGVWYWx1ZShlKSB7XG4gICAgdGhpcy5zZWxlY3RfdGFnX3R5cGUgPSBlLnZhbHVlO1xuICB9XG5cbiAgZ2V0S3BpSXRlbVZhbHVlKGUpIHtcbiAgICBpZiAoZS5ldmVudCkge1xuICAgICAgY29uc3Qga3BpX2RhdGEgPSB0aGlzLmtlaVBhcmVudERhdGFTb3VyY2UuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLmtwaUlkID09PSBlLnZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmlzRWRpdEtwaUFkZGVkKSB7XG4gICAgICAgIGNvbnN0IHRpZEtleSA9IHRoaXMuc2VsZWN0X3RhZ190eXBlID09PSAnY2hpbGQnICYmIHRoaXMuaXNFZGl0S3BpQWRkZWQgPyAnY2hpbGRUaWQnIDogJ3BhcmVudFRpZCc7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfa3BpX3RpZCA9IGtwaV9kYXRhW3RpZEtleV07XG4gICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRfa3BpX2NoaWxkX3RpZCA9IHRoaXMuZ2V0TmV4dENoaWxkVGlkKHRoaXMuc2VsZWN0ZWRfa3BpX3RpZCwgdGhpcy5rcGlDb25maWdEYXRhU291cmNlKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBjb25zdCB0aWRLZXkgPSBrcGlfZGF0YS5jaGlsZFRpZCAmJiBrcGlfZGF0YS5jaGlsZFRpZC5sZW5ndGggPiAxID8gJ2NoaWxkVGlkJyA6ICdwYXJlbnRUaWQnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkX2twaV90aWQgPSBrcGlfZGF0YVt0aWRLZXldO1xuICAgICAgICB0aGlzLnNlbGVjdGVkX2twaV9jaGlsZF90aWQgPSB0aGlzLmdldE5leHRDaGlsZFRpZCh0aGlzLnNlbGVjdGVkX2twaV90aWQsIHRoaXMua3BpQ29uZmlnRGF0YVNvdXJjZSk7XG5cbiAgICAgIH1cblxuICAgICBcblxuICAgIH1cblxuICB9XG5cbiAgIGdldE5leHRDaGlsZFRpZChwYXJlbnRUaWQ6IHN0cmluZywga3BpQ29uZmlnRGF0YVNvdXJjZTogYW55W10pOiBzdHJpbmcge1xuICAgICAgICAvLyAxLiBGaWx0ZXIgYnkgcGFyZW50VGlkXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0ga3BpQ29uZmlnRGF0YVNvdXJjZS5maWx0ZXIoXG4gICAgICAgICAgaXRlbSA9PiBpdGVtLnBhcmVudFRpZCA9PT0gcGFyZW50VGlkICYmIGl0ZW0uY2hpbGRUaWRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyAyLiBFeHRyYWN0IGxhc3QgbnVtZXJpYyBwYXJ0IG9mIGNoaWxkVGlkXG4gICAgICAgIGNvbnN0IG1heENoaWxkTnVtYmVyID0gY2hpbGRyZW4ucmVkdWNlKChtYXgsIGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IGl0ZW0uY2hpbGRUaWQuc3BsaXQoJy4nKTtcbiAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyID0gTnVtYmVyKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICByZXR1cm4gbGFzdE51bWJlciA+IG1heCA/IGxhc3ROdW1iZXIgOiBtYXg7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIC8vIDMuIFJldHVybiBuZXh0IGNoaWxkVGlkXG4gICAgICAgIHJldHVybiBgJHtwYXJlbnRUaWR9LiR7bWF4Q2hpbGROdW1iZXIgKyAxfWA7XG4gICAgICB9XG5cblxuICBhZGROZXdLcGkoKSB7XG4gICAgdGhpcy5pc05ld0twaUFkZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmlzRWRpdEtwaUFkZGVkID0gZmFsc2U7XG4gIH1cbiAgY2FuY2VsVXBkYXRlKCkge1xuICAgIHRoaXMuaXNFZGl0S3BpQWRkZWQgPSBmYWxzZTtcbiAgfVxuXG5cblxuICBnZXRLcGlQYXJyZW50TmFtZShpbnB1dCkge1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IGlucHV0Lmxhc3RJbmRleE9mKCcuJyk7XG4gICAgaWYgKGxhc3RJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnN1YnN0cmluZygwLCBsYXN0SW5kZXgpO1xuICB9XG5cblxuICBnZXREZWxldEtwaSgpIHtcbiAgICB0aGlzLnNlcnZpY2UuZGVsZXRlS3BpRW50cnlDb25maWcodGhpcy5zZWxlY3RlZF9pZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnS1BJIERlbGV0ZWQgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIHRoaXMuZ2V0QWxsS3BpRGF0YSgpO1xuICAgICAgdGhpcy5nZXRSZXNldGVLcGkoKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdLUEkgQ29uZmlnJylcbiAgICB9KVxuICB9XG5cblxuICByZXNldGVVcGRhdGVLcGlGb3JtKCkge1xuICAgIHRoaXMuZWRpdGFibGVfZGVzYyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVkaXRhYmxlX2luZm8gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0YWJsZV9rcGlfbmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVkaXRhYmxlX3RhZ190eXBlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZWRpdGFibGVfa3BpX3RpZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVkaXRhYmxlX2lkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZWRpdGFibGVfcGFnZV9pZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN1Ym1pdE5ld0twaSgpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5pc0VkaXRLcGlBZGRlZCA9IGZhbHNlO1xuICAgIGxldCBvYmogPSB7IGtwaUNvbmZpZ0RhdGE6IHRoaXMua3BpRGF0YSB9XG4gICAgY29uc29sZS5sb2cob2JqKTtcbiAgICB0aGlzLmlzQ29tcG9uZW50VXBkYXRhID0gZmFsc2U7XG4gICAgdGhpcy5zZXJ2aWNlLmdldENyZWF0ZUtwaShvYmopLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMuZ2V0QWxsS3BpRGF0YSgpO1xuICAgICAgdGhpcy5nZXRSZXNldGVLcGkoKTtcbiAgICB9KVxuICB9XG5cblxuICBidWlsZE1lbnVUcmVlKHVzZXJOYW1lOiBzdHJpbmcsIGtwaURhdGE6IGFueVtdKTogYW55W10ge1xuICAgIC8vIGxldCBmaWx0ZXJlZE1lbnVzID0gbWVudURhdGEuZmlsdGVyKG1lbnUgPT5cbiAgICAvLyAgICF1c2VyTmFtZSB8fCAobWVudS5wZXJtaXNzaW9ucyAmJiBtZW51LnBlcm1pc3Npb25zLnNvbWUocGVybSA9PiBwZXJtLmVudGl0eVZhbHVlcy5pbmNsdWRlcyh1c2VyTmFtZSkpKVxuICAgIC8vICk7XG5cbiAgICBsZXQgZmlsdGVyZWRNZW51cyA9IGtwaURhdGE7XG5cbiAgICBjb25zdCBtZW51TWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IG1lbnVUcmVlOiBhbnlbXSA9IFtdO1xuXG4gICAgZmlsdGVyZWRNZW51cy5mb3JFYWNoKG1lbnUgPT4ge1xuICAgICAgbWVudU1hcC5zZXQobWVudS5jaGlsZFRpZCB8fCBtZW51LnBhcmVudFRpZCwge1xuICAgICAgICBpZDogbWVudS5rcGlJZCxcbiAgICAgICAgdGl0bGU6IG1lbnUua3BpTmFtZSxcbiAgICAgICAgaWNvbjogbWVudS5pY29uLFxuICAgICAgICB0eXBlOiBtZW51LmtwaVR5cGUsXG4gICAgICAgIHRhZ1R5cGU6IG1lbnUudGFnVHlwZSxcbiAgICAgICAgdmlzaWJpbGl0eTogdHJ1ZSxcbiAgICAgICAgLi4uKG1lbnUubGluayAmJiB7IGxpbms6IG1lbnUubGluay5yZXBsYWNlKC9eXFwvKy8sICcnKSB9KSxcbiAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZpbHRlcmVkTWVudXMuZm9yRWFjaChrcGkgPT4ge1xuICAgICAgaWYgKGtwaS5wYXJlbnRUaWQgJiYga3BpLmNoaWxkVGlkKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IG1lbnVNYXAuZ2V0KGtwaS5wYXJlbnRUaWQpO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobWVudU1hcC5nZXQoa3BpLmNoaWxkVGlkKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbnVUcmVlLnB1c2gobWVudU1hcC5nZXQoa3BpLnBhcmVudFRpZCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1lbnVUcmVlO1xuICB9XG5cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG48ZGl2IGNsYXNzPVwicC00IGZsZXggZmxleC1yb3cgdy1mdWxsXCIgKm5nSWY9XCIhbG9hZGluZ01vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIm14LTIgYmctd2hpdGUgZGFyazpiZy10cmFuc3BhcmVudCBib3JkZXItclwiPlxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0twaVRyZWVQcmVwYXJlZFwiPiAtLT5cbiAgICAgICAgICAgIDx0cmVldmlldyBjbGFzcz1cImRhcmsgYmctZ3JheS05MDAgZGFyazpiZy10cmFuc3BhcmVudFwiIFtuYW1lXT1cIidtYWluTmF2aWdhdGlvbidcIiBbcm91dGVLZXldPVwiJ3JhS3BpJ1wiXG4gICAgICAgICAgICAgICAgW25hdmlnYXRpb25dPVwia3BpRGF0YVwiIFtpc1NlYXJjaEJveF09XCJmYWxzZVwiIFtpc0VkaXRJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChlZGl0YWJsZUtwaURhdGEpPVwiZ2V0RWRpdGFibGVLcGkoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC90cmVldmlldz5cbiAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LWZ1bGxcIj5cbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBteS04XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl93YXJuaW5nX21kfX1cIiAoY2xpY2spPVwiYWRkTmV3S3BpKClcIj5BZGQgTmV3IEtQSTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19XCIgKGNsaWNrKT1cInJvdXRlVG9LcGlDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgcm91dGVyTGlua0FjdGl2ZT1cInJvdXRlci1saW5rLWFjdGl2ZVwiPkNvbmZpZ3VyZSBLUEk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc05ld0twaUFkZGVkXCI+IC0tPlxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweC0yIHctZnVsbFwiPiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPk5hbWU8L3A+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwic2VsZWN0X2twaV9uYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgdy1mdWxsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+IFRhZyBUeXBlPC9wPlxuICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbZGF0YVNvdXJjZV09XCJ0YWdUeXBlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RfdGFnX3R5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImFkZFRhZ3R5cGVWYWx1ZSgkZXZlbnQpXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIChvbkN1c3RvbUl0ZW1DcmVhdGluZyk9XCJvbkN1c3RvbURpbWVudGlvbkNyZWF0aW5nKCRldmVudClcIiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+QWxpYXNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2FjY2VwdEN1c3RvbVZhbHVlXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkX2FsaWFzZXNcIj48L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+UGFnZSBJRDwvcD5cbiAgICAgICAgICAgICAgICA8IS0tIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkX3BhZ2VfaWRcIj48L2R4LXRleHQtYm94PiAtLT5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwidGVtcGxhdGVEYXRhU291cmNlXCIgdmFsdWVFeHByPVwicGFnZUlkXCIgZGlzcGxheUV4cHI9XCJwYWdlTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkX3BhZ2VfaWRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+RGVzY3JpcHRpb248L3A+XG4gICAgICAgICAgICAgICAgPGR4LWh0bWwtZWRpdG9yIGhlaWdodD1cIidhdXRvJ1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRfZGVzY1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZHhvLXRvb2xiYXIgW211bHRpbGluZV09XCJmYWxzZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNpemVcIiBbYWNjZXB0ZWRWYWx1ZXNdPVwiWyc4cHQnLCAnMTBwdCcsICcxMnB0JywgJzE0cHQnLCAnMThwdCcsICcyNHB0JywgJzM2cHQnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyBpbnB1dEF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnRm9udCBzaXplJyB9IH1cIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJmb250XCIgW2FjY2VwdGVkVmFsdWVzXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291cmllciBOZXcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dlb3JnaWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ltcGFjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTHVjaWRhIENvbnNvbGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhaG9tYScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGltZXMgTmV3IFJvbWFuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJkYW5hJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIiBbb3B0aW9uc109XCJ7IGlucHV0QXR0cjogeyAnYXJpYS1sYWJlbCc6ICdGb250IGZhbWlseScgfSB9XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYm9sZFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cIml0YWxpY1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInVuZGVybGluZVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduTGVmdFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduQ2VudGVyXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25SaWdodFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduSnVzdGlmeVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cIm9yZGVyZWRMaXN0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYnVsbGV0TGlzdFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImhlYWRlclwiIFthY2NlcHRlZFZhbHVlc109XCJbZmFsc2UsIDEsIDIsIDMsIDQsIDVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ7IGlucHV0QXR0cjogeyAnYXJpYS1sYWJlbCc6ICdIZWFkZXInIH0gfVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImNvbG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYmFja2dyb3VuZFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImxpbmtcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJpbWFnZVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImNsZWFyXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiY29kZUJsb2NrXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgPC9keG8tdG9vbGJhcj5cbiAgICAgICAgICAgICAgICAgICAgPGR4by1tZWRpYS1yZXNpemluZyBbZW5hYmxlZF09XCJ0cnVlXCI+IDwvZHhvLW1lZGlhLXJlc2l6aW5nPlxuICAgICAgICAgICAgICAgICAgICA8ZHhvLWltYWdlLXVwbG9hZCBbdGFic109XCJbJ2ZpbGUnLCAndXJsJ11cIiBmaWxlVXBsb2FkTW9kZT1cImJhc2U2NFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2R4by1pbWFnZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgPC9keC1odG1sLWVkaXRvcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHctZnVsbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBwdC0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPiBQYXJlbnQgQ29tcG9uZW50IDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cImtlaVBhcmVudERhdGFTb3VyY2VcIiBkaXNwbGF5RXhwcj1cImtwaU5hbWVcIiB2YWx1ZUV4cHI9XCJrcGlJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0S3BpSXRlbVZhbHVlKCRldmVudClcIiBbKG5nTW9kZWwpXT1cInBhcmFudGVfa3BpX25hbWVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+UGFyZW50IFRJRDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwic2VsZWN0ZWRfa3BpX3RpZFwiIFtyZWFkT25seV09XCJmYWxzZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+VElEPC9wPlxuICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJzZWxlY3RlZF9rcGlfY2hpbGRfdGlkXCIgW3JlYWRPbmx5XT1cImZhbHNlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cImtwaV92aXNpYmlsaXR5XCIgdGV4dD1cIlZpc2liaWxpdHlcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cImtwaV9leHRlcm5hbFwiIHRleHQ9XCJFeHRlcm5hbCBLUElcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxnIG10LTJcIj5LUEkgSW5mbzwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1odG1sLWVkaXRvciBoZWlnaHQ9XCInYXV0bydcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkX2luZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhvLXRvb2xiYXIgW211bHRpbGluZV09XCJmYWxzZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0ZWRWYWx1ZXNdPVwiWyc4cHQnLCAnMTBwdCcsICcxMnB0JywgJzE0cHQnLCAnMThwdCcsICcyNHB0JywgJzM2cHQnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ7IGlucHV0QXR0cjogeyAnYXJpYS1sYWJlbCc6ICdGb250IHNpemUnIH0gfVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiZm9udFwiIFthY2NlcHRlZFZhbHVlc109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291cmllciBOZXcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHZW9yZ2lhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW1wYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTHVjaWRhIENvbnNvbGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYWhvbWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaW1lcyBOZXcgUm9tYW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJkYW5hJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgaW5wdXRBdHRyOiB7ICdhcmlhLWxhYmVsJzogJ0ZvbnQgZmFtaWx5JyB9IH1cIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYm9sZFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiaXRhbGljXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJ1bmRlcmxpbmVcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25MZWZ0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnbkNlbnRlclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25SaWdodFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25KdXN0aWZ5XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cIm9yZGVyZWRMaXN0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJidWxsZXRMaXN0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImhlYWRlclwiIFthY2NlcHRlZFZhbHVlc109XCJbZmFsc2UsIDEsIDIsIDMsIDQsIDVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgaW5wdXRBdHRyOiB7ICdhcmlhLWxhYmVsJzogJ0hlYWRlcicgfSB9XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImNvbG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJiYWNrZ3JvdW5kXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImxpbmtcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImltYWdlXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImNsZWFyXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJjb2RlQmxvY2tcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHhvLXRvb2xiYXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4by1tZWRpYS1yZXNpemluZyBbZW5hYmxlZF09XCJ0cnVlXCI+IDwvZHhvLW1lZGlhLXJlc2l6aW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeG8taW1hZ2UtdXBsb2FkIFt0YWJzXT1cIlsnZmlsZScsICd1cmwnXVwiIGZpbGVVcGxvYWRNb2RlPVwiYmFzZTY0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keG8taW1hZ2UtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1odG1sLWVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgIDxhcHAtdXNlci1hY2Nlc3MgWyh1c2VyT3B0aW9uQ29udGFpbmVyKV09XCJ1c2VyT3B0aW9uQ29udGFpbmVyXCI+XG4gICAgICAgIDwvYXBwLXVzZXItYWNjZXNzPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtYXV0byBtdC01IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX1cIiAoY2xpY2spPVwiZ2V0VXBkYXRlS3BpKClcIiAqbmdJZj1cImlzRWRpdEtwaUFkZGVkXCI+VXBkYXRlIEtQSVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9tZH19XCIgKGNsaWNrKT1cImdldERlbGV0S3BpKClcIiAqbmdJZj1cImlzRWRpdEtwaUFkZGVkXCI+RGVsZXRlIEtQSVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fVwiIChjbGljayk9XCJtYWtlTmV3S3BpV2l0aFVzZXJFbnRpdHkoKVwiICpuZ0lmPVwiIWlzRWRpdEtwaUFkZGVkXCI+Q3JlYXRlIEtQSVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl93YXJuaW5nX21kfX1cIiAoY2xpY2spPVwiZ2V0UmVzZXRlS3BpKClcIj5SZXNldDwvYnV0dG9uPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIDwvZGl2PiAtLT5cbiAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgPC9kaXY+XG5cblxuXG5cbjwvZGl2PiJdfQ==
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWtwaS10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvdGVtcGxhdGUtbW9kdWxlL0twaUNyZWF0aW9uTW9kdWxlL2NyZWF0ZS1rcGktdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3RlbXBsYXRlLW1vZHVsZS9LcGlDcmVhdGlvbk1vZHVsZS9jcmVhdGUta3BpLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQWFsRCxNQUFNLE9BQU8sc0JBQXNCO0lBdUNqQyxZQUNTLGFBQTRCLEVBQVUsV0FBd0IsRUFDN0QsT0FBeUIsRUFBVSxNQUFxQixFQUN4RCxNQUFjO1FBRmYsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUM3RCxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDeEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXpDeEIsaUJBQVksR0FBWSxJQUFJLENBQUM7UUFDN0Isd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBRTlCLFlBQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQixtQkFBYyxHQUFRLEVBQUUsQ0FBQztRQVd6QixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osWUFBTyxHQUFRLEVBQUUsQ0FBQztRQUVsQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixtQkFBYyxHQUFZLEtBQUss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O1lBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7U0FDckMsQ0FBQTtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUtELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7O21IQWxlVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixzRENibkMsMndyQkFxV007MkZEeFZPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IFJvdXRlciwgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENyZWF0ZUtwSVNlcnZpY2UgfSBmcm9tICcuL2NyZWF0ZUtwaS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2NvbW1vbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNyZWF0ZS1rcGknLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLWtwaS10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3JlYXRlLWtwaS10cmVlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlS3BpVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbiA9IHRydWU7XG4gIGtlaVBhcmVudERhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBteUZvcm06IEZvcm1Hcm91cDtcbiAgdGFnVHlwZSA9IFtcInBhcmVudFwiLCBcImNoaWxkXCJdO1xuICBrcGlfY29uc3RydWN0b3IgPSBbXTtcbiAgc2VsZWN0ZWRfcF9rcGk6IGFueSA9IHt9O1xuXG4gIHNlbGVjdF9rcGlfbmFtZTogYW55O1xuICBzZWxlY3RfdGFnX3R5cGU6IGFueTtcbiAgc2VsZWN0ZWRfaWQ6IGFueTtcbiAgc2VsZWN0ZWRfcGFnZV9pZDogYW55O1xuICBzZWxlY3RlZF9uZXN0ZWRfbmFtZTogYW55O1xuICBzZWxlY3RlZF9rcGlfdGlkOiBhbnk7XG4gIHNlbGVjdGVkX2Rlc2M6IGFueTtcbiAgc2VsZWN0ZWRfaW5mbzogYW55O1xuXG4gIGhlaWdodCA9IDkwO1xuICBrcGlEYXRhOiBhbnkgPSBbXTtcbiAgaGVpc3RWYWx1ZTogYW55O1xuICBpc0Zyb21FZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc05ld0twaUFkZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRWRpdEtwaUFkZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZWRpdGFibGVfZGVzYyA9IFwiXCI7XG4gIGVkaXRhYmxlX2luZm8gPSBcIlwiO1xuICBlZGl0YWJsZV9pZDtcbiAgZWRpdGFibGVfcGFnZV9pZDtcbiAgZWRpdGFibGVfdGFnX3R5cGU7XG4gIGVkaXRhYmxlX2twaV9uYW1lO1xuICBlZGl0YWJsZV9rcGlfdGlkO1xuICBrcGlfdmlzaWJpbGl0eTogYm9vbGVhbiA9IGZhbHNlO1xuICBrcGlfZXh0ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGFyYW50ZV9rcGlfbmFtZTogYW55O1xuICBpc0NvbXBvbmVudFVwZGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICB0ZW1wbGF0ZURhdGFTb3VyY2U6IGFueTtcbiAgLy8ga3BpRGF0YUpzb246YW55O1xuICB1c2VyT3B0aW9uQ29udGFpbmVyOiBhbnkgPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSwgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBDcmVhdGVLcElTZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5nZXRBbGxLcGlEYXRhKCk7XG4gICAgdGhpcy5nZXRBcHBQYWdlQ29uZmlncygpO1xuICB9XG5cbiAgZ2V0QXBwUGFnZUNvbmZpZ3MoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcFBhZ2VDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZURhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1BhZ2UgSUQnKVxuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldEFsbEtwaURhdGEoKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcblxuICAgIHRoaXMua2VpUGFyZW50RGF0YVNvdXJjZSA9IFtdO1xuICAgIHRoaXMuc2VydmljZS5nZXRsaXN0S3BpQnJvd3NlcigpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLmtwaURhdGEgPSBkYXRhXG4gICAgICB0aGlzLnByZXBhcmVQYXJlbnREYXRhU291cmNlKGRhdGEpXG5cbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnS1BJIENvbmZpZycpXG4gICAgfSlcbiAgfVxuXG4gIHByZXBhcmVQYXJlbnREYXRhU291cmNlKGRhdGEpIHtcbiAgICBkYXRhLmZvckVhY2goKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnRhZ190eXBlID09ICdwYXJlbnQnKSB7XG4gICAgICAgIGxldCBub2RlID0ge1xuICAgICAgICAgIFwibmFtZVwiOiByZXN1bHQubmFtZSxcbiAgICAgICAgICBcInRpZFwiOiByZXN1bHQudGlkXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZWlQYXJlbnREYXRhU291cmNlLnB1c2gobm9kZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZVBhcmVudERhdGFTb3VyY2UocmVzdWx0Lm5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG5cbiAgfVxuXG5cbiAgbWFrZU5ld0twaSgpIHtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkX2twaV90aWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNlbGVjdGVkX2twaV90aWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5nZXRIZWlzdElkKHRoaXMua3BpRGF0YSwgdGhpcy5zZWxlY3RlZF9rcGlfdGlkKTtcbiAgICAgIHRoaXMuY3JlYXRlTmV3S3BpV2l0aFRpZCgpO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIHRoaXMuaGVpc3RWYWx1ZSA9ICh0aGlzLmtwaURhdGEubGVuZ3RoICE9IDApID8gdGhpcy5nZXRIaWdoZXN0VGlkKHRoaXMua3BpRGF0YSkgOiAwO1xuICAgICAgbGV0IHZhbHVlID0gcGFyc2VJbnQodGhpcy5oZWlzdFZhbHVlKSArIDE7XG5cbiAgICAgIGxldCBvYmogPSB7XG4gICAgICAgIFwibmFtZVwiOiB0aGlzLnNlbGVjdF9rcGlfbmFtZSxcbiAgICAgICAgXCJ0aWRcIjogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgXCJpc0Jvb2ttYXJrZWRcIjogZmFsc2UsXG4gICAgICAgIFwiaXNBY2Nlc3NpYmxlXCI6IHRoaXMua3BpX2V4dGVybmFsLFxuICAgICAgICBcImxhc3RBY2Nlc3NUaW1lXCI6IFwiXCIsXG4gICAgICAgIFwidGFnX3R5cGVcIjogdGhpcy5zZWxlY3RfdGFnX3R5cGUsXG4gICAgICAgIFwiaWRcIjogdGhpcy5zZWxlY3RlZF9pZCxcbiAgICAgICAgXCJwYWdlSWRcIjogdGhpcy5zZWxlY3RlZF9wYWdlX2lkLFxuICAgICAgICBcImRlc2NcIjogdGhpcy5zZWxlY3RlZF9kZXNjLFxuICAgICAgICBcImlzVmlzaWJsZVwiOiB0aGlzLmtwaV92aXNpYmlsaXR5LFxuICAgICAgICBcIm5vZGVzXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fVxuICAgICAgfVxuICAgICAgdGhpcy5rcGlEYXRhLnB1c2gob2JqKVxuICAgICAgaWYgKHRoaXMuc2VsZWN0X3RhZ190eXBlID09ICdwYXJlbnQnKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgXCJuYW1lXCI6IHRoaXMuc2VsZWN0X2twaV9uYW1lLFxuICAgICAgICAgIFwidGlkXCI6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZWlQYXJlbnREYXRhU291cmNlLnB1c2gob2JqKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0X3RhZ190eXBlID09ICdjaGlsZCcpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBcIm5hbWVcIjogdGhpcy5zZWxlY3Rfa3BpX25hbWUsXG4gICAgICAgICAgXCJpZFwiOiB0aGlzLnNlbGVjdGVkX2lkLFxuICAgICAgICAgIFwicGFnZUlkXCI6IHRoaXMuc2VsZWN0ZWRfcGFnZV9pZCxcbiAgICAgICAgICBcInNlYXJjaEZpbHRlclwiOiBmYWxzZSxcbiAgICAgICAgICBcImlzU3J2VHlwZU9wZXJhdG9yXCI6IGZhbHNlLFxuICAgICAgICAgIFwib3BlcmF0aW9uTGV2ZWxzXCI6IFtdLFxuICAgICAgICAgIFwiZml4T3BlcmF0aW9uTGV2bGVzXCI6IFtdLFxuICAgICAgICAgIFwiYXBpX2NvbmZpZ1wiOiBbXVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmNvbmZpZ3VyZUtwaUJyb3dzZXJDb25maWcob2JqKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJrcGkgYnJvd3NlciBjb25maWcgY3JlYXRlZFwiKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aGlzLnN1Ym1pdE5ld0twaSgpO1xuXG4gICAgfVxuXG4gIH1cblxuICBjcmVhdGVOZXdLcGlXaXRoVGlkKCkge1xuXG4gICAgbGV0IGF1dG9fdGlkID0gdGhpcy5hdXRvSW5jcmVtZW50KHRoaXMuc2VsZWN0ZWRfa3BpX3RpZCwgdGhpcy5oZWlzdFZhbHVlKTtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJuYW1lXCI6IHRoaXMuc2VsZWN0X2twaV9uYW1lLFxuICAgICAgXCJ0aWRcIjogYXV0b190aWQsXG4gICAgICBcImlzQm9va21hcmtlZFwiOiBmYWxzZSxcbiAgICAgIFwiaXNBY2Nlc3NpYmxlXCI6IHRoaXMua3BpX2V4dGVybmFsLFxuICAgICAgXCJsYXN0QWNjZXNzVGltZVwiOiBcIlwiLFxuICAgICAgXCJ0YWdfdHlwZVwiOiB0aGlzLnNlbGVjdF90YWdfdHlwZSxcbiAgICAgIFwiaWRcIjogdGhpcy5zZWxlY3RlZF9pZCxcbiAgICAgIFwicGFnZUlkXCI6IHRoaXMuc2VsZWN0ZWRfcGFnZV9pZCxcbiAgICAgIFwiZGVzY1wiOiB0aGlzLnNlbGVjdGVkX2Rlc2MsXG4gICAgICBcImlzVmlzaWJsZVwiOiB0aGlzLmtwaV92aXNpYmlsaXR5LFxuICAgICAgXCJub2Rlc1wiOiBbXSxcbiAgICAgIFwiY29uZmlnXCI6IHt9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0X3RhZ190eXBlID09ICdwYXJlbnQnKSB7XG4gICAgICBsZXQgb2JqID0ge1xuICAgICAgICBcIm5hbWVcIjogdGhpcy5zZWxlY3Rfa3BpX25hbWUsXG4gICAgICAgIFwidGlkXCI6IGF1dG9fdGlkXG4gICAgICB9XG4gICAgICB0aGlzLmtlaVBhcmVudERhdGFTb3VyY2UucHVzaChvYmopXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdF90YWdfdHlwZSA9PSAnY2hpbGQnKSB7XG4gICAgICBsZXQgb2JqID0ge1xuICAgICAgICBcIm5hbWVcIjogdGhpcy5zZWxlY3Rfa3BpX25hbWUsXG4gICAgICAgIFwiaWRcIjogdGhpcy5zZWxlY3RlZF9pZCxcbiAgICAgICAgXCJwYWdlSWRcIjogdGhpcy5zZWxlY3RlZF9wYWdlX2lkLFxuICAgICAgICBcInNlYXJjaEZpbHRlclwiOiBmYWxzZSxcbiAgICAgICAgXCJpc1NydlR5cGVPcGVyYXRvclwiOiBmYWxzZSxcbiAgICAgICAgXCJvcGVyYXRpb25MZXZlbHNcIjogW10sXG4gICAgICAgIFwiZml4T3BlcmF0aW9uTGV2bGVzXCI6IFtdLFxuICAgICAgICBcImFwaV9jb25maWdcIjogW11cblxuICAgICAgfVxuICAgICAgdGhpcy5zZXJ2aWNlLmNvbmZpZ3VyZUtwaUJyb3dzZXJDb25maWcob2JqKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwia3BpIGJyb3dzZXIgY29uZmlnIGNyZWF0ZWRcIilcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5zZXRLcGlieVRpZCh0aGlzLmtwaURhdGEsIHRoaXMuc2VsZWN0ZWRfa3BpX3RpZCwgb2JqKVxuICAgIHRoaXMuc3VibWl0TmV3S3BpKCk7XG4gIH1cblxuICBnZXRSZXNldGVLcGkoKSB7XG4gICAgdGhpcy5zZWxlY3Rfa3BpX25hbWUgPSAnJztcbiAgICB0aGlzLnNlbGVjdF90YWdfdHlwZSA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRfaWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkX3BhZ2VfaWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkX2twaV90aWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkX2Rlc2MgPSAnJztcbiAgICB0aGlzLnBhcmFudGVfa3BpX25hbWUgPSAnJztcbiAgICB0aGlzLmVkaXRhYmxlX2twaV9uYW1lID0gJyc7XG4gICAgdGhpcy5lZGl0YWJsZV90YWdfdHlwZSA9ICcnO1xuICAgIHRoaXMuZWRpdGFibGVfaWQgPSAnJztcbiAgICB0aGlzLmVkaXRhYmxlX3BhZ2VfaWQgPSAnJztcbiAgICB0aGlzLmVkaXRhYmxlX2twaV90aWQgPSAnJztcbiAgICB0aGlzLmVkaXRhYmxlX2Rlc2MgPSAnJztcbiAgICB0aGlzLmVkaXRhYmxlX2luZm8gPSAnJztcbiAgICB0aGlzLnBhcmFudGVfa3BpX25hbWUgPSAnJztcbiAgICB0aGlzLmtwaV9leHRlcm5hbCA9IGZhbHNlO1xuICAgIHRoaXMua3BpX3Zpc2liaWxpdHkgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ29tcG9uZW50VXBkYXRhID0gZmFsc2U7XG4gIH1cblxuICBnZXREZWxldEtwaSh0aWQpIHtcbiAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkX3Bfa3BpKVxuXG4gIH1cblxuICBhZGRUYWd0eXBlVmFsdWUoZSkge1xuICAgIHRoaXMuc2VsZWN0X3RhZ190eXBlID0gZS52YWx1ZTtcbiAgfVxuXG4gIGdldEtwaUl0ZW1WYWx1ZShlKSB7XG4gICAgY29uc3Qga3BpX2RhdGEgPSB0aGlzLmtlaVBhcmVudERhdGFTb3VyY2UuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLnRpZCA9PT0gZS52YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZF9rcGlfdGlkID0ga3BpX2RhdGEudGlkO1xuICB9XG5cbiAgYXV0b0luY3JlbWVudChzdHJpbmcxOiBzdHJpbmcsIHN0cmluZzI6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuXG4gICAgaWYgKHN0cmluZzIgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bWJlclBhcnQgPSBzdHJpbmcxICsgJy4xJztcbiAgICAgIHJldHVybiBudW1iZXJQYXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHN0cmluZzIuc3BsaXQoJy4nKTtcbiAgICAgIGxldCBsYXN0UGFydCA9IHBhcnNlSW50KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLCAxMCk7XG4gICAgICBsZXQgbmV3X251bWJlciA9IGxhc3RQYXJ0Kys7XG4gICAgICBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9IGxhc3RQYXJ0LnRvU3RyaW5nKCk7XG4gICAgICByZXR1cm4gcGFydHMuam9pbihcIi5cIik7XG4gICAgfVxuICB9XG5cbiAgc2V0S3BpYnlUaWQoZGF0YSwgdGlkLCBuZXdLcGlPYmopIHtcbiAgICBkYXRhLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQubm9kZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocmVzdWx0LnRpZCA9PSB0aWQpIHtcblxuICAgICAgICAgIHJlc3VsdC5ub2Rlcy5wdXNoKG5ld0twaU9iailcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEtwaWJ5VGlkKHJlc3VsdC5ub2RlcywgdGlkLCBuZXdLcGlPYmopO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldEhlaXN0SWQoZGF0YTogYW55LCB0aWQ6IHN0cmluZyk6IGFueSB7XG5cbiAgICBkYXRhLmZvckVhY2goKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnRpZCA9PT0gdGlkKSB7XG4gICAgICAgIGlmIChyZXN1bHQubm9kZXMubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgdGhpcy5oZWlzdFZhbHVlID0gdGhpcy5nZXRIaWdoZXN0VGlkKHJlc3VsdC5ub2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oZWlzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZXN1bHQubm9kZXMgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQubm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdldEhlaXN0SWQocmVzdWx0Lm5vZGVzLCB0aWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG5cbiAgfVxuXG4gIGdldEhpZ2hlc3RUaWQoZGF0YSkge1xuICAgIGNvbnN0IGhpZ2hlc3RUaWQgPSBkYXRhLnJlZHVjZSgobWF4VGlkLCBjdXJyZW50SXRlbSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFRpZFBhcnRzID0gY3VycmVudEl0ZW0udGlkLnNwbGl0KCcuJykubWFwKHBhcnQgPT4gcGFyc2VJbnQocGFydCwgMTApKTtcbiAgICAgIGNvbnN0IG1heFRpZFBhcnRzID0gbWF4VGlkLnNwbGl0KCcuJykubWFwKHBhcnQgPT4gcGFyc2VJbnQocGFydCwgMTApKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50VGlkUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUaWRQYXJ0c1tpXSA+IG1heFRpZFBhcnRzW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVtLnRpZDtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VGlkUGFydHNbaV0gPCBtYXhUaWRQYXJ0c1tpXSkge1xuICAgICAgICAgIHJldHVybiBtYXhUaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXhUaWQ7XG4gICAgfSwgZGF0YVswXS50aWQpO1xuICAgIHJldHVybiBoaWdoZXN0VGlkO1xuICB9XG5cbiAgYWRkTmV3S3BpKCkge1xuICAgIHRoaXMuaXNOZXdLcGlBZGRlZCA9IHRydWU7XG4gICAgdGhpcy5pc0VkaXRLcGlBZGRlZCA9IGZhbHNlO1xuICB9XG4gIGNhbmNlbFVwZGF0ZSgpIHtcbiAgICB0aGlzLmlzRWRpdEtwaUFkZGVkID0gZmFsc2U7XG4gIH1cblxuICBnZXRFZGl0YWJsZUtwaShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmlzQ29tcG9uZW50VXBkYXRhID0gZmFsc2U7XG4gICAgdGhpcy5pc0VkaXRLcGlBZGRlZCA9IHRydWU7XG4gICAgdGhpcy5pc05ld0twaUFkZGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0Zyb21FZGl0YWJsZSA9IHRydWU7XG4gICAgdGhpcy5lZGl0YWJsZV9kZXNjID0gZGF0YS5kZXNjO1xuICAgIHRoaXMuZWRpdGFibGVfaW5mbyA9IChkYXRhLmtwaUluZm8pID8gZGF0YS5rcGlJbmZvIDogXCJcIjtcbiAgICB0aGlzLmVkaXRhYmxlX2twaV9uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuZWRpdGFibGVfdGFnX3R5cGUgPSBkYXRhLnRhZ190eXBlO1xuICAgIHRoaXMuZWRpdGFibGVfa3BpX3RpZCA9IGRhdGEudGlkO1xuICAgIHRoaXMuZWRpdGFibGVfaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuZWRpdGFibGVfcGFnZV9pZCA9IGRhdGEucGFnZUlkO1xuICAgIHRoaXMua3BpX3Zpc2liaWxpdHkgPSBkYXRhLmlzVmlzaWJsZTtcbiAgICB0aGlzLmtwaV9leHRlcm5hbCA9IGRhdGEuaXNBY2Nlc3NpYmxlO1xuICAgIHRoaXMucGFyYW50ZV9rcGlfbmFtZSA9IHRoaXMuZ2V0S3BpUGFycmVudE5hbWUoZGF0YS50aWQpXG5cblxuICB9XG5cbiAgZ2V0S3BpUGFycmVudE5hbWUoaW5wdXQpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSBpbnB1dC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChsYXN0SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTtcbiAgfVxuXG4gIGdldFVwZGF0ZUtwaSgpIHtcblxuICAgIGlmICghdGhpcy5pc0NvbXBvbmVudFVwZGF0YSkge1xuICAgICAgdGhpcy5nZXRVcGRhdGVLcGlOYW1lKHRoaXMua3BpRGF0YSwgdGhpcy5lZGl0YWJsZV9rcGlfdGlkKVxuICAgIH1cblxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN1Ym1pdE5ld0twaSgpO1xuICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnS1BJIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIHRoaXMucmVzZXRlVXBkYXRlS3BpRm9ybSgpO1xuICAgICAgdGhpcy5pc0VkaXRLcGlBZGRlZCA9IGZhbHNlO1xuICAgIH0sIDUwMCk7XG5cbiAgfVxuXG4gIGdldERlbGV0ZUtwaSgpIHtcbiAgICB0aGlzLmdldERlbGV0ZUtwaU5hbWUodGhpcy5rcGlEYXRhLCB0aGlzLmVkaXRhYmxlX2twaV90aWQpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN1Ym1pdE5ld0twaSgpO1xuICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnS1BJIERlbGV0ZWQgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIHRoaXMucmVzZXRlVXBkYXRlS3BpRm9ybSgpO1xuICAgICAgdGhpcy5pc0VkaXRLcGlBZGRlZCA9IGZhbHNlO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuXG4gIGdldFVwZGF0ZUtwaU5hbWUoZGF0YTogYW55LCB0aWQ6IHN0cmluZyk6IGFueSB7XG5cbiAgICBkYXRhLmZvckVhY2goKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnRpZCA9PT0gdGlkKSB7XG4gICAgICAgIHJlc3VsdC5kZXNjID0gdGhpcy5lZGl0YWJsZV9kZXNjO1xuICAgICAgICByZXN1bHQua3BpSW5mbyA9IHRoaXMuZWRpdGFibGVfaW5mbztcbiAgICAgICAgcmVzdWx0Lm5hbWUgPSB0aGlzLmVkaXRhYmxlX2twaV9uYW1lO1xuICAgICAgICByZXN1bHQuaWQgPSB0aGlzLmVkaXRhYmxlX2lkO1xuICAgICAgICByZXN1bHQucGFnZUlkID0gdGhpcy5lZGl0YWJsZV9wYWdlX2lkO1xuICAgICAgICByZXN1bHQudGFnX3R5cGUgPSB0aGlzLmVkaXRhYmxlX3RhZ190eXBlO1xuICAgICAgICByZXN1bHQuaXNWaXNpYmxlID0gdGhpcy5rcGlfdmlzaWJpbGl0eTtcbiAgICAgICAgcmVzdWx0LmlzQWNjZXNzaWJsZSA9IHRoaXMua3BpX2V4dGVybmFsO1xuICAgICAgICByZXN1bHQudGlkID0gdGhpcy5lZGl0YWJsZV9rcGlfdGlkO1xuXG4gICAgICAgIC8vIHRoaXMuc2VydmljZS5jb25maWd1cmVLcGlCcm93c2VyQ29uZmlnKHJlc3VsdC5jb25maWcpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhcImtwaSBicm93c2VyIGNvbmZpZyBjcmVhdGVkXCIpXG4gICAgICAgIC8vIH0pXG5cbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lm5vZGVzICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0Lm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5nZXRVcGRhdGVLcGlOYW1lKHJlc3VsdC5ub2RlcywgdGlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgZ2V0RGVsZXRlS3BpTmFtZShkYXRhOiBhbnksIHRpZDogc3RyaW5nKTogYW55IHtcbiAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YVtpXTtcbiAgICAgIGlmIChyZXN1bHQudGlkID09PSB0aWQpIHtcbiAgICAgICAgZGF0YS5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5ub2RlcyAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5ub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZ2V0RGVsZXRlS3BpTmFtZShyZXN1bHQubm9kZXMsIHRpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzZXRlVXBkYXRlS3BpRm9ybSgpIHtcbiAgICB0aGlzLmVkaXRhYmxlX2Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0YWJsZV9pbmZvID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZWRpdGFibGVfa3BpX25hbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0YWJsZV90YWdfdHlwZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVkaXRhYmxlX2twaV90aWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0YWJsZV9pZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVkaXRhYmxlX3BhZ2VfaWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBzdWJtaXROZXdLcGkoKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuaXNFZGl0S3BpQWRkZWQgPSBmYWxzZTtcbiAgICBsZXQgb2JqID0geyBrcGlDb25maWdEYXRhOiB0aGlzLmtwaURhdGEgfVxuICAgIGNvbnNvbGUubG9nKG9iaik7XG4gICAgdGhpcy5pc0NvbXBvbmVudFVwZGF0YSA9IGZhbHNlO1xuICAgIHRoaXMuc2VydmljZS5nZXRDcmVhdGVLcGkob2JqKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmdldEFsbEtwaURhdGEoKTtcbiAgICAgIHRoaXMuZ2V0UmVzZXRlS3BpKCk7XG4gICAgfSlcbiAgfVxuXG4gIGdldE5ld1BhcnJlbnRLcGlJdGVtVmFsdWUoZSkge1xuICAgIHRoaXMuaXNDb21wb25lbnRVcGRhdGEgPSB0cnVlO1xuICAgIGNvbnN0IGtwaV9kYXRhID0gdGhpcy5rZWlQYXJlbnREYXRhU291cmNlLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS50aWQgPT09IGUudmFsdWUpO1xuICAgIHRoaXMuZ2V0SGVpc3RJZCh0aGlzLmtwaURhdGEsIGtwaV9kYXRhLnRpZCk7XG4gICAgbGV0IGF1dG9fdGlkID0gdGhpcy5hdXRvSW5jcmVtZW50KGtwaV9kYXRhLnRpZCwgdGhpcy5oZWlzdFZhbHVlKTtcblxuICAgIGxldCBvYmogPSB7XG4gICAgICBcIm5hbWVcIjogdGhpcy5lZGl0YWJsZV9rcGlfbmFtZSxcbiAgICAgIFwidGlkXCI6IGF1dG9fdGlkLFxuICAgICAgXCJpc0Jvb2ttYXJrZWRcIjogZmFsc2UsXG4gICAgICBcImlzQWNjZXNzaWJsZVwiOiB0aGlzLmtwaV9leHRlcm5hbCxcbiAgICAgIFwibGFzdEFjY2Vzc1RpbWVcIjogXCJcIixcbiAgICAgIFwidGFnX3R5cGVcIjogdGhpcy5lZGl0YWJsZV90YWdfdHlwZSxcbiAgICAgIFwiaWRcIjogdGhpcy5lZGl0YWJsZV9pZCxcbiAgICAgIFwicGFnZUlkXCI6IHRoaXMuZWRpdGFibGVfcGFnZV9pZCxcbiAgICAgIFwiZGVzY1wiOiB0aGlzLmVkaXRhYmxlX2Rlc2MsXG4gICAgICBcImtwaUluZm9cIjogdGhpcy5lZGl0YWJsZV9pbmZvLFxuICAgICAgXCJpc1Zpc2libGVcIjogdGhpcy5rcGlfdmlzaWJpbGl0eSxcbiAgICAgIFwibm9kZXNcIjogW10sXG4gICAgICBcImNvbmZpZ1wiOiB7fVxuICAgIH1cbiAgICB0aGlzLmdldERlbGV0ZUtwaU5hbWUodGhpcy5rcGlEYXRhLCB0aGlzLmVkaXRhYmxlX2twaV90aWQpXG4gICAgdGhpcy5zZXRLcGlieVRpZCh0aGlzLmtwaURhdGEsIGtwaV9kYXRhLnRpZCwgb2JqKVxuICAgIHRoaXMuZWRpdGFibGVfa3BpX3RpZCA9IGtwaV9kYXRhLnRpZDtcbiAgICAvLyB0aGlzLnN1Ym1pdE5ld0twaSgpO1xuICAgIC8vIHRoaXMuZWRpdGFibGVfa3BpX3RpZCA9IGtwaV9kYXRhLnRpZDtcbiAgICAvLyB0aGlzLmdldFVwZGF0ZUtwaU5hbWUodGhpcy5rcGlEYXRhLCBlLnZhbHVlKVxuICB9XG5cblxuXG4gIG1ha2VOZXdLcGlXaXRoVXNlckVudGl0eSgpIHtcblxuICAgIHRoaXMudXNlck9wdGlvbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgbGV0IGF0dF92YWx1ZSA9IGVsZW1lbnQuYXR0cmlidXRlVmFsdWVzLnNwbGl0KFwiLFwiKTtcbiAgICAgIGVsZW1lbnQuYXR0cmlidXRlVmFsdWVzID0gYXR0X3ZhbHVlO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkX2twaV90aWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNlbGVjdGVkX2twaV90aWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5nZXRIZWlzdElkKHRoaXMua3BpRGF0YSwgdGhpcy5zZWxlY3RlZF9rcGlfdGlkKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLmhlaXN0VmFsdWUgPSAodGhpcy5rcGlEYXRhLmxlbmd0aCAhPSAwKSA/IHRoaXMuZ2V0SGlnaGVzdFRpZCh0aGlzLmtwaURhdGEpIDogMDtcbiAgICAgIGxldCB2YWx1ZSA9IHBhcnNlSW50KHRoaXMuaGVpc3RWYWx1ZSkgKyAxO1xuXG4gICAgfVxuICAgIGxldCBrcGlPYmogPSB7XG4gICAgICBcImtwaUlkXCI6IHRoaXMuc2VsZWN0ZWRfaWQsXG4gICAgICBcInBhZ2VJZFwiOiB0aGlzLnNlbGVjdGVkX3BhZ2VfaWQsXG4gICAgICBcInRpdGxlXCI6IHRoaXMuc2VsZWN0X2twaV9uYW1lLFxuICAgICAgXCJkZXNjcmlwdGlvblwiOiB0aGlzLnNlbGVjdGVkX2Rlc2MsXG4gICAgICBcImtwaUluZm9cIjogdGhpcy5zZWxlY3RlZF9pbmZvLFxuICAgICAgXCJ0YWdUeXBlXCI6IHRoaXMuc2VsZWN0X3RhZ190eXBlLFxuICAgICAgXCJhY3RpdmVcIjogdHJ1ZSxcbiAgICAgIFwidmlzaWJpbGl0eVwiOiB0aGlzLmtwaV92aXNpYmlsaXR5LFxuICAgICAgXCJleHRlcm5hbEtwaVwiOiB0aGlzLmtwaV9leHRlcm5hbCxcbiAgICAgIFwidGFyZ2V0XCI6IFwiXCIsXG4gICAgICBcImljb25cIjogXCJcIixcbiAgICAgIFwidXJsXCI6IFwiXCIsXG4gICAgICBcImtwaVR5cGVcIjogXCJcIixcbiAgICAgIFwicGFyZW50VGlkXCI6IHRoaXMuc2VsZWN0ZWRfa3BpX3RpZCxcbiAgICAgIFwiY2hpbGRUaWRcIjogXCJcIixcbiAgICAgIFwibWVhc3VyZXNcIjogdGhpcy51c2VyT3B0aW9uQ29udGFpbmVyLFxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFwiS1BJIHdpdGggVXNlciBFbnRpdHkgT2JqOlwiLCBrcGlPYmopO1xuICB9XG5cblxuXG5cbiAgcm91dGVUb0twaUNvbmZpZygpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2twaUNvbnRyb2xsZXIva3BpQ29uZmlnJ10pXG4gIH1cblxufVxuIiwiPGFwcC1sb2FkaW5nICpuZ0lmPVwibG9hZGluZ01vZGFsXCI+PC9hcHAtbG9hZGluZz5cbjxkaXYgY2xhc3M9XCJwLTQgZmxleCBmbGV4LXJvdyB3LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtMiBiZy13aGl0ZSBkYXJrOmJnLXRyYW5zcGFyZW50IGJvcmRlci1yXCI+XG5cbiAgICAgICAgPHRyZWV2aWV3IGNsYXNzPVwiZGFyayBiZy1ncmF5LTkwMCBkYXJrOmJnLXRyYW5zcGFyZW50XCIgW25hbWVdPVwiJ21haW5OYXZpZ2F0aW9uJ1wiIFtyb3V0ZUtleV09XCIncmFLcGknXCJcbiAgICAgICAgICAgIFtuYXZpZ2F0aW9uXT1cImtwaURhdGFcIiBbaXNTZWFyY2hCb3hdPVwiZmFsc2VcIiBbaXNFZGl0SWNvbl09XCJ0cnVlXCIgKGVkaXRhYmxlS3BpRGF0YSk9XCJnZXRFZGl0YWJsZUtwaSgkZXZlbnQpXCI+XG4gICAgICAgIDwvdHJlZXZpZXc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm14LTIgdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW0tY2VudGVyIGp1c3RpZnktY2VudGVyIG15LThcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3dhcm5pbmdfbWR9fVwiIChjbGljayk9XCJhZGROZXdLcGkoKVwiPkFkZCBOZXcgS1BJPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX1cIiAoY2xpY2spPVwicm91dGVUb0twaUNvbmZpZygpXCJcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rQWN0aXZlPVwicm91dGVyLWxpbmstYWN0aXZlXCI+Q29uZmlndXJlIEtQSTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTmV3S3BpQWRkZWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+TmFtZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cInNlbGVjdF9rcGlfbmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBwdC0xICB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+IFRhZyBUeXBlPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2RhdGFTb3VyY2VdPVwidGFnVHlwZVwiIFsobmdNb2RlbCldPVwic2VsZWN0X3RhZ190eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiYWRkVGFndHlwZVZhbHVlKCRldmVudClcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPklEPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwic2VsZWN0ZWRfaWRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxnIG10LTJcIj5QYWdlIElEPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJzZWxlY3RlZF9wYWdlX2lkXCI+PC9keC10ZXh0LWJveD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwidGVtcGxhdGVEYXRhU291cmNlXCIgdmFsdWVFeHByPVwicGFnZUlkXCIgZGlzcGxheUV4cHI9XCJwYWdlTmFtZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRfcGFnZV9pZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBwdC0xICB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+RGVzY3JpcHRpb248L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtaHRtbC1lZGl0b3IgaGVpZ2h0PVwiJ2F1dG8nXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZF9kZXNjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4by10b29sYmFyIFttdWx0aWxpbmVdPVwiZmFsc2VcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdGVkVmFsdWVzXT1cIlsnOHB0JywgJzEwcHQnLCAnMTJwdCcsICcxNHB0JywgJzE4cHQnLCAnMjRwdCcsICczNnB0J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyBpbnB1dEF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnRm9udCBzaXplJyB9IH1cIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImZvbnRcIiBbYWNjZXB0ZWRWYWx1ZXNdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VyaWVyIE5ldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2VvcmdpYScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW1wYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMdWNpZGEgQ29uc29sZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFob21hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaW1lcyBOZXcgUm9tYW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcmRhbmEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiIFtvcHRpb25zXT1cInsgaW5wdXRBdHRyOiB7ICdhcmlhLWxhYmVsJzogJ0ZvbnQgZmFtaWx5JyB9IH1cIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYm9sZFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiaXRhbGljXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJ1bmRlcmxpbmVcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25MZWZ0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnbkNlbnRlclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25SaWdodFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25KdXN0aWZ5XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cIm9yZGVyZWRMaXN0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJidWxsZXRMaXN0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImhlYWRlclwiIFthY2NlcHRlZFZhbHVlc109XCJbZmFsc2UsIDEsIDIsIDMsIDQsIDVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgaW5wdXRBdHRyOiB7ICdhcmlhLWxhYmVsJzogJ0hlYWRlcicgfSB9XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImNvbG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJiYWNrZ3JvdW5kXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImxpbmtcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImltYWdlXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImNsZWFyXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJjb2RlQmxvY2tcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHhvLXRvb2xiYXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4by1tZWRpYS1yZXNpemluZyBbZW5hYmxlZF09XCJ0cnVlXCI+IDwvZHhvLW1lZGlhLXJlc2l6aW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeG8taW1hZ2UtdXBsb2FkIFt0YWJzXT1cIlsnZmlsZScsICd1cmwnXVwiIGZpbGVVcGxvYWRNb2RlPVwiYmFzZTY0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keG8taW1hZ2UtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1odG1sLWVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPiBQYXJlbnQgQ29tcG9uZW50IDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtkYXRhU291cmNlXT1cImtlaVBhcmVudERhdGFTb3VyY2VcIiBkaXNwbGF5RXhwcj1cIm5hbWVcIiB2YWx1ZUV4cHI9XCJ0aWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRLcGlJdGVtVmFsdWUoJGV2ZW50KVwiIFt2YWx1ZV09XCJwYXJhbnRlX2twaV9uYW1lXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxnIG10LTJcIj5USUQ8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJzZWxlY3RlZF9rcGlfdGlkXCIgW3JlYWRPbmx5XT1cInRydWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBwdC0xICB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggWyhuZ01vZGVsKV09XCJrcGlfdmlzaWJpbGl0eVwiIHRleHQ9XCJWaXNpYmlsaXR5XCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBwdC0xICB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggWyhuZ01vZGVsKV09XCJrcGlfZXh0ZXJuYWxcIiB0ZXh0PVwiRXh0ZXJuYWwgS1BJXCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPktQSSBJbmZvPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWh0bWwtZWRpdG9yIGhlaWdodD1cIidhdXRvJ1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRfaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeG8tdG9vbGJhciBbbXVsdGlsaW5lXT1cImZhbHNlXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRlZFZhbHVlc109XCJbJzhwdCcsICcxMHB0JywgJzEycHQnLCAnMTRwdCcsICcxOHB0JywgJzI0cHQnLCAnMzZwdCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgaW5wdXRBdHRyOiB7ICdhcmlhLWxhYmVsJzogJ0ZvbnQgc2l6ZScgfSB9XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJmb250XCIgW2FjY2VwdGVkVmFsdWVzXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VyaWVyIE5ldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dlb3JnaWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJbXBhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMdWNpZGEgQ29uc29sZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhaG9tYScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RpbWVzIE5ldyBSb21hbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcmRhbmEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyBpbnB1dEF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnRm9udCBmYW1pbHknIH0gfVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJib2xkXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJpdGFsaWNcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInVuZGVybGluZVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnbkxlZnRcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduQ2VudGVyXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnblJpZ2h0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnbkp1c3RpZnlcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwib3JkZXJlZExpc3RcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImJ1bGxldExpc3RcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiaGVhZGVyXCIgW2FjY2VwdGVkVmFsdWVzXT1cIltmYWxzZSwgMSwgMiwgMywgNCwgNV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyBpbnB1dEF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnSGVhZGVyJyB9IH1cIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiY29sb3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImJhY2tncm91bmRcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwibGlua1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiaW1hZ2VcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiY2xlYXJcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImNvZGVCbG9ja1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keG8tdG9vbGJhcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhvLW1lZGlhLXJlc2l6aW5nIFtlbmFibGVkXT1cInRydWVcIj4gPC9keG8tbWVkaWEtcmVzaXppbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4by1pbWFnZS11cGxvYWQgW3RhYnNdPVwiWydmaWxlJywgJ3VybCddXCIgZmlsZVVwbG9hZE1vZGU9XCJiYXNlNjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4by1pbWFnZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWh0bWwtZWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICA8YXBwLXVzZXItYWNjZXNzIFsodXNlck9wdGlvbkNvbnRhaW5lcildPVwidXNlck9wdGlvbkNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLXVzZXItYWNjZXNzPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1hdXRvIG10LTUganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19XCIgKGNsaWNrKT1cIm1ha2VOZXdLcGkoKVwiPkNyZWF0ZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19XCIgKGNsaWNrKT1cIm1ha2VOZXdLcGlXaXRoVXNlckVudGl0eSgpXCI+Q3JlYXRlIFdpdGggVXNlciBQcml2aWxlZ2VcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3dhcm5pbmdfbWR9fVwiIChjbGljayk9XCJnZXRSZXNldGVLcGkoKVwiPlJlc2V0PC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRWRpdEtwaUFkZGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbWItMlwiPk5hbWU8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJlZGl0YWJsZV9rcGlfbmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPiBUYWcgVHlwZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtkYXRhU291cmNlXT1cInRhZ1R5cGVcIiBbKG5nTW9kZWwpXT1cImVkaXRhYmxlX3RhZ190eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiYWRkVGFndHlwZVZhbHVlKCRldmVudClcIiBbcmVhZE9ubHldPVwiaXNGcm9tRWRpdGFibGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPklEPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZWRpdGFibGVfaWRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxnIG10LTJcIj5QYWdlIElEPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJlZGl0YWJsZV9wYWdlX2lkXCI+PC9keC10ZXh0LWJveD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwidGVtcGxhdGVEYXRhU291cmNlXCIgdmFsdWVFeHByPVwicGFnZUlkXCIgZGlzcGxheUV4cHI9XCJwYWdlTmFtZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZWRpdGFibGVfcGFnZV9pZFwiPjwvZHgtc2VsZWN0LWJveD5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxnIG10LTJcIj5EZXNjcmlwdGlvbjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1odG1sLWVkaXRvciBoZWlnaHQ9XCInYXV0bydcIiBbKG5nTW9kZWwpXT1cImVkaXRhYmxlX2Rlc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhvLXRvb2xiYXIgW211bHRpbGluZV09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwidW5kb1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwicmVkb1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRlZFZhbHVlc109XCJbJzhwdCcsICcxMHB0JywgJzEycHQnLCAnMTRwdCcsICcxOHB0JywgJzI0cHQnLCAnMzZwdCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgaW5wdXRBdHRyOiB7ICdhcmlhLWxhYmVsJzogJ0ZvbnQgc2l6ZScgfSB9XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJmb250XCIgW2FjY2VwdGVkVmFsdWVzXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VyaWVyIE5ldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dlb3JnaWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJbXBhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMdWNpZGEgQ29uc29sZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhaG9tYScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RpbWVzIE5ldyBSb21hbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcmRhbmEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyBpbnB1dEF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnRm9udCBmYW1pbHknIH0gfVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJib2xkXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJpdGFsaWNcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInVuZGVybGluZVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnbkxlZnRcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduQ2VudGVyXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnblJpZ2h0XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJhbGlnbkp1c3RpZnlcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwib3JkZXJlZExpc3RcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImJ1bGxldExpc3RcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiaGVhZGVyXCIgW2FjY2VwdGVkVmFsdWVzXT1cIltmYWxzZSwgMSwgMiwgMywgNCwgNV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyBpbnB1dEF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnSGVhZGVyJyB9IH1cIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiY29sb3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImJhY2tncm91bmRcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwibGlua1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiaW1hZ2VcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNlcGFyYXRvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiY2xlYXJcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImJsb2NrcXVvdGVcIj48L2R4aS1pdGVtPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keG8tdG9vbGJhcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhvLW1lZGlhLXJlc2l6aW5nIFtlbmFibGVkXT1cInRydWVcIj4gPC9keG8tbWVkaWEtcmVzaXppbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4by1pbWFnZS11cGxvYWQgW3RhYnNdPVwiWydmaWxlJywgJ3VybCddXCIgZmlsZVVwbG9hZE1vZGU9XCJiYXNlNjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4by1pbWFnZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWh0bWwtZWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPiBQYXJlbnQgQ29tcG9uZW50IDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbcmVhZE9ubHldPVwiZWRpdGFibGVfdGFnX3R5cGUgPT0gJ3BhcmVudCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImtlaVBhcmVudERhdGFTb3VyY2VcIiBkaXNwbGF5RXhwcj1cIm5hbWVcIiB2YWx1ZUV4cHI9XCJ0aWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXROZXdQYXJyZW50S3BpSXRlbVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYXJhbnRlX2twaV9uYW1lXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMSAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGcgbXQtMlwiPlRJRDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImVkaXRhYmxlX2twaV90aWRcIiBbcmVhZE9ubHldPVwiZmFsc2VcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHB0LTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFsobmdNb2RlbCldPVwia3BpX3Zpc2liaWxpdHlcIiB0ZXh0PVwiVmlzaWJpbGl0eVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBwdC0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cImtwaV9leHRlcm5hbFwiIHRleHQ9XCJFeHRlcm5hbCBLUElcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBwdC0xICB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sZyBtdC0yXCI+S1BJIEluZm88L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtaHRtbC1lZGl0b3IgaGVpZ2h0PVwiJ2F1dG8nXCIgWyhuZ01vZGVsKV09XCJlZGl0YWJsZV9pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4by10b29sYmFyIFttdWx0aWxpbmVdPVwiZmFsc2VcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cInNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdGVkVmFsdWVzXT1cIlsnOHB0JywgJzEwcHQnLCAnMTJwdCcsICcxNHB0JywgJzE4cHQnLCAnMjRwdCcsICczNnB0J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyBpbnB1dEF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnRm9udCBzaXplJyB9IH1cIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImZvbnRcIiBbYWNjZXB0ZWRWYWx1ZXNdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdXJpZXIgTmV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2VvcmdpYScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ltcGFjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0x1Y2lkYSBDb25zb2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFob21hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGltZXMgTmV3IFJvbWFuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyZGFuYSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ7IGlucHV0QXR0cjogeyAnYXJpYS1sYWJlbCc6ICdGb250IGZhbWlseScgfSB9XCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImJvbGRcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cIml0YWxpY1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwidW5kZXJsaW5lXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJzZXBhcmF0b3JcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduTGVmdFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYWxpZ25DZW50ZXJcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduUmlnaHRcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhpLWl0ZW0gbmFtZT1cImFsaWduSnVzdGlmeVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJvcmRlcmVkTGlzdFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYnVsbGV0TGlzdFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJoZWFkZXJcIiBbYWNjZXB0ZWRWYWx1ZXNdPVwiW2ZhbHNlLCAxLCAyLCAzLCA0LCA1XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ7IGlucHV0QXR0cjogeyAnYXJpYS1sYWJlbCc6ICdIZWFkZXInIH0gfVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJjb2xvclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiYmFja2dyb3VuZFwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJsaW5rXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJpbWFnZVwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwic2VwYXJhdG9yXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4aS1pdGVtIG5hbWU9XCJjbGVhclwiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeGktaXRlbSBuYW1lPVwiY29kZUJsb2NrXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4by10b29sYmFyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeG8tbWVkaWEtcmVzaXppbmcgW2VuYWJsZWRdPVwidHJ1ZVwiPiA8L2R4by1tZWRpYS1yZXNpemluZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHhvLWltYWdlLXVwbG9hZCBbdGFic109XCJbJ2ZpbGUnLCAndXJsJ11cIiBmaWxlVXBsb2FkTW9kZT1cImJhc2U2NFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHhvLWltYWdlLXVwbG9hZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtaHRtbC1lZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtYXV0byBtdC0zIGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fVwiIChjbGljayk9XCJnZXRVcGRhdGVLcGkoKVwiPlVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX21kfX1cIiAoY2xpY2spPVwiZ2V0RGVsZXRlS3BpKClcIj5EZWxldGVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX21kfX1cIiAoY2xpY2spPVwiY2FuY2VsVXBkYXRlKClcIj5DYW5jbGU8L2J1dHRvbj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuXG5cblxuPC9kaXY+Il19