gamma-app-controller 1.1.22 → 1.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/application-controller/application-content.service.mjs +12 -12
- package/esm2020/lib/application-controller/application-controller.module.mjs +6 -3
- package/esm2020/lib/gamma-app-controller.module.mjs +4 -128
- package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +357 -0
- package/esm2020/lib/template-module/exceptionConfigModule/exception-service.mjs +101 -0
- package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +146 -0
- package/esm2020/public-api.mjs +3 -2
- package/fesm2015/gamma-app-controller.mjs +2881 -2763
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +2880 -2764
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/application-content.service.d.ts +10 -5
- package/lib/gamma-app-controller.module.d.ts +4 -13
- package/lib/{application-controller/page-module/exception-operation → template-module/exceptionConfigModule}/exception-operation.component.d.ts +3 -3
- package/lib/template-module/exceptionConfigModule/exception-service.d.ts +26 -0
- package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +16 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -1
- package/esm2020/lib/application-controller/page-module/exception-operation/exception-operation.component.mjs +0 -357
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { confirm } from 'devextreme/ui/dialog';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../application-controller/common";
|
|
5
|
+
import * as i2 from "./exception-service";
|
|
6
|
+
import * as i3 from "ngx-toastr";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
import * as i5 from "../../application-controller/shared/loading/loading.component";
|
|
9
|
+
import * as i6 from "devextreme-angular/core";
|
|
10
|
+
import * as i7 from "devextreme-angular/ui/nested";
|
|
11
|
+
import * as i8 from "devextreme-angular/ui/data-grid";
|
|
12
|
+
import * as i9 from "devextreme-angular/ui/select-box";
|
|
13
|
+
import * as i10 from "devextreme-angular/ui/tag-box";
|
|
14
|
+
import * as i11 from "devextreme-angular/ui/text-box";
|
|
15
|
+
import * as i12 from "@angular/forms";
|
|
16
|
+
import * as i13 from "@angular/material/icon";
|
|
17
|
+
export class ExceptionOperationComponent {
|
|
18
|
+
constructor(commonService, service, toastr) {
|
|
19
|
+
this.commonService = commonService;
|
|
20
|
+
this.service = service;
|
|
21
|
+
this.toastr = toastr;
|
|
22
|
+
this.contentType = "create";
|
|
23
|
+
this.exceptionMainObject = {
|
|
24
|
+
configId: "",
|
|
25
|
+
configName: "",
|
|
26
|
+
datasource: "",
|
|
27
|
+
active: false,
|
|
28
|
+
analyzerType: "",
|
|
29
|
+
dbConfig: "",
|
|
30
|
+
tableName: "",
|
|
31
|
+
dataSelectionType: "",
|
|
32
|
+
fileNameAttributeName: "",
|
|
33
|
+
filterList: [{
|
|
34
|
+
"columnName": "",
|
|
35
|
+
"dataType": "",
|
|
36
|
+
"operator": "",
|
|
37
|
+
"windowFunctionName": "",
|
|
38
|
+
"value": "",
|
|
39
|
+
"dateFormat": "",
|
|
40
|
+
}],
|
|
41
|
+
patternList: [
|
|
42
|
+
{
|
|
43
|
+
"regex": "",
|
|
44
|
+
"sample": "?_??_?",
|
|
45
|
+
"fileAttributes": [],
|
|
46
|
+
"analyzerKeys": [],
|
|
47
|
+
"sequenceKey": "",
|
|
48
|
+
"dynamicArgs": {}
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
};
|
|
52
|
+
this.analyzer_type = [{ key: "numeric_sequence", name: "Numeric Sequence" }, { key: "date_sequence", name: "Date Sequence" }];
|
|
53
|
+
this.isLoader = true;
|
|
54
|
+
}
|
|
55
|
+
ngOnInit() {
|
|
56
|
+
this.getExceptionDataCongigs();
|
|
57
|
+
this.service.getAppSqlFunctionList().subscribe(data => {
|
|
58
|
+
this.functionNameContainer = data;
|
|
59
|
+
});
|
|
60
|
+
this.service.getCdrBrowserOperations().subscribe(data => {
|
|
61
|
+
this.operator_list = data;
|
|
62
|
+
});
|
|
63
|
+
this.service.getAppDatasource().subscribe(data => {
|
|
64
|
+
this.datasourcelist = (data['datasource']) ? data['datasource'] : data;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
getExceptionDataCongigs() {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
this.service.listFileSequenceAnalyzerGroups().subscribe((data) => {
|
|
70
|
+
this.allExceptionConfigDataSource = data;
|
|
71
|
+
this.isLoader = false;
|
|
72
|
+
resolve();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
editExceptionConfigConfig(data) {
|
|
77
|
+
this.contentType = "edit";
|
|
78
|
+
this.isExceptionConfigCreation = true;
|
|
79
|
+
this.exceptionMainObject = data;
|
|
80
|
+
}
|
|
81
|
+
createExceptionConfig() {
|
|
82
|
+
this.isExceptionConfigCreation = true;
|
|
83
|
+
this.exceptionMainObject = {
|
|
84
|
+
configId: "",
|
|
85
|
+
configName: "",
|
|
86
|
+
datasource: "",
|
|
87
|
+
active: true,
|
|
88
|
+
analyzerType: "",
|
|
89
|
+
dbConfig: "",
|
|
90
|
+
tableName: "",
|
|
91
|
+
dataSelectionType: "",
|
|
92
|
+
fileNameAttributeName: "",
|
|
93
|
+
filterList: [{
|
|
94
|
+
"columnName": "",
|
|
95
|
+
"dataType": "",
|
|
96
|
+
"operator": "",
|
|
97
|
+
"windowFunctionName": "",
|
|
98
|
+
"dateFormat": "",
|
|
99
|
+
"value": ""
|
|
100
|
+
}],
|
|
101
|
+
patternList: [
|
|
102
|
+
{
|
|
103
|
+
"regex": "",
|
|
104
|
+
"sample": "",
|
|
105
|
+
"fileAttributes": [],
|
|
106
|
+
"analyzerKeys": [],
|
|
107
|
+
"sequenceKey": "",
|
|
108
|
+
"dynamicArgs": {}
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
getCancleExceptionCreation() {
|
|
114
|
+
this.isExceptionConfigCreation = false;
|
|
115
|
+
this.exceptionMainObject = {
|
|
116
|
+
configId: "",
|
|
117
|
+
configName: "",
|
|
118
|
+
datasource: "",
|
|
119
|
+
active: true,
|
|
120
|
+
analyzerType: "",
|
|
121
|
+
dbConfig: "",
|
|
122
|
+
tableName: "",
|
|
123
|
+
dataSelectionType: "",
|
|
124
|
+
fileNameAttributeName: "",
|
|
125
|
+
filterList: [{
|
|
126
|
+
"columnName": "",
|
|
127
|
+
"dataType": "",
|
|
128
|
+
"operator": "",
|
|
129
|
+
"windowFunctionName": "",
|
|
130
|
+
"value": "",
|
|
131
|
+
"dateFormat": ""
|
|
132
|
+
}],
|
|
133
|
+
patternList: [
|
|
134
|
+
{
|
|
135
|
+
"regex": "",
|
|
136
|
+
"sample": "",
|
|
137
|
+
"fileAttributes": [],
|
|
138
|
+
"analyzerKeys": [],
|
|
139
|
+
"sequenceKey": "",
|
|
140
|
+
"dynamicArgs": {}
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
getDataConfig(e) {
|
|
146
|
+
}
|
|
147
|
+
getProcessForConfig() {
|
|
148
|
+
this.exceptionMainObject.filterList.push({
|
|
149
|
+
"columnName": "",
|
|
150
|
+
"dataType": "",
|
|
151
|
+
"operator": "",
|
|
152
|
+
"windowFunctionName": "",
|
|
153
|
+
"dateFormat": "",
|
|
154
|
+
"value": ""
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
deleteColume(i) {
|
|
158
|
+
this.exceptionMainObject.filterList.splice(i, 1);
|
|
159
|
+
}
|
|
160
|
+
deleteDynamicArguments(item, key, index) {
|
|
161
|
+
delete this.exceptionMainObject.patternList[index]['dynamicArgs'][key];
|
|
162
|
+
}
|
|
163
|
+
addDynamicArgument(index) {
|
|
164
|
+
let newKey = '';
|
|
165
|
+
let newValue = '';
|
|
166
|
+
this.exceptionMainObject.patternList[index]['dynamicArgs'][newKey] = newValue;
|
|
167
|
+
}
|
|
168
|
+
moveItemForColumns(index, direction) {
|
|
169
|
+
if (index < 0 || index >= this.exceptionMainObject.filterList.length)
|
|
170
|
+
return;
|
|
171
|
+
const newPosition = direction === 'up' ? index - 1 : index + 1;
|
|
172
|
+
if (newPosition < 0 || newPosition >= this.exceptionMainObject.filterList.length)
|
|
173
|
+
return;
|
|
174
|
+
const itemToMove = this.exceptionMainObject.filterList[index];
|
|
175
|
+
this.exceptionMainObject.filterList.splice(index, 1);
|
|
176
|
+
this.exceptionMainObject.filterList.splice(newPosition, 0, itemToMove);
|
|
177
|
+
}
|
|
178
|
+
getAddPatternsConfig() {
|
|
179
|
+
this.exceptionMainObject.patternList.push({
|
|
180
|
+
"regex": "",
|
|
181
|
+
"sample": "",
|
|
182
|
+
"sequenceKey": "",
|
|
183
|
+
"fileAttributes": [],
|
|
184
|
+
"analyzerKeys": [],
|
|
185
|
+
"dynamicArgs": {}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
moveItemForpatterns(index, direction) {
|
|
189
|
+
if (index < 0 || index >= this.exceptionMainObject.patternList.length)
|
|
190
|
+
return;
|
|
191
|
+
const newPosition = direction === 'up' ? index - 1 : index + 1;
|
|
192
|
+
if (newPosition < 0 || newPosition >= this.exceptionMainObject.patternList.length)
|
|
193
|
+
return;
|
|
194
|
+
const itemToMove = this.exceptionMainObject.patternList[index];
|
|
195
|
+
this.exceptionMainObject.patternList.splice(index, 1);
|
|
196
|
+
this.exceptionMainObject.patternList.splice(newPosition, 0, itemToMove);
|
|
197
|
+
}
|
|
198
|
+
deletePatternsColume(i) {
|
|
199
|
+
this.exceptionMainObject.patternList.splice(i, 1);
|
|
200
|
+
}
|
|
201
|
+
onCustomFileAttributesAdd(args) {
|
|
202
|
+
const newValue = args.text;
|
|
203
|
+
args.customItem = newValue;
|
|
204
|
+
const isItemInDataSource = this.exceptionMainObject.patternList['fileAttributes'].some((item) => item === newValue);
|
|
205
|
+
if (!isItemInDataSource) {
|
|
206
|
+
this.exceptionMainObject.patternList['fileAttributes'].unshift(newValue);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
onCustomAnalizerKeyAdd(args) {
|
|
210
|
+
const newValue = args.text;
|
|
211
|
+
args.customItem = newValue;
|
|
212
|
+
const isItemInDataSource = this.exceptionMainObject.patternList['analyzerKeys'].some((item) => item === newValue);
|
|
213
|
+
if (!isItemInDataSource) {
|
|
214
|
+
this.exceptionMainObject.patternList['analyzerKeys'].unshift(newValue);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
updateExceptionConfig() {
|
|
218
|
+
this.loadingModal = true;
|
|
219
|
+
this.service.editFileSequenceAnalyzerGroup(this.exceptionMainObject).subscribe({
|
|
220
|
+
next: (data) => {
|
|
221
|
+
this.isExceptionConfigCreation = false;
|
|
222
|
+
this.loadingModal = false;
|
|
223
|
+
this.isLoader = true;
|
|
224
|
+
this.getExceptionDataCongigs();
|
|
225
|
+
}, error: (err) => {
|
|
226
|
+
this.loadingModal = false;
|
|
227
|
+
this.isLoader = false;
|
|
228
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Exception Config');
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
console.log(this.exceptionMainObject);
|
|
232
|
+
}
|
|
233
|
+
saveExceptionConfig() {
|
|
234
|
+
for (const element of this.exceptionMainObject.patternList) {
|
|
235
|
+
if (!element.fileAttributes.includes(element.sequenceKey)) {
|
|
236
|
+
this.toastr.error('Sequence Key not valid');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const allMatch = element.analyzerKeys.every(item => element.fileAttributes.includes(item));
|
|
240
|
+
const allKeysMatch = Object.keys(element.dynamicArgs).every(key => element.fileAttributes.includes(key));
|
|
241
|
+
if (!allMatch) {
|
|
242
|
+
this.toastr.error('Analyzer Keys not valid');
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (!allKeysMatch) {
|
|
246
|
+
this.toastr.error('Filler not valid');
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const updatedObj = Object.fromEntries(Object.entries(element.dynamicArgs).map(([key, value]) => [`default_${key}_filter`, value]));
|
|
250
|
+
element.dynamicArgs = updatedObj;
|
|
251
|
+
}
|
|
252
|
+
this.loadingModal = true;
|
|
253
|
+
this.service.saveFileSequenceAnalyzerGroup(this.exceptionMainObject).subscribe({
|
|
254
|
+
next: (data) => {
|
|
255
|
+
this.isExceptionConfigCreation = false;
|
|
256
|
+
this.loadingModal = false;
|
|
257
|
+
this.isLoader = true;
|
|
258
|
+
this.getExceptionDataCongigs();
|
|
259
|
+
}, error: (err) => {
|
|
260
|
+
this.loadingModal = false;
|
|
261
|
+
this.isLoader = false;
|
|
262
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Exception Config');
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
deleteExceptionConfig(data) {
|
|
267
|
+
let result = confirm("<i>Are You Sure?</i>", "Delete Config");
|
|
268
|
+
result.then((dialogResult) => {
|
|
269
|
+
if (dialogResult) {
|
|
270
|
+
this.loadingModal = true;
|
|
271
|
+
this.service.deleteFileSequenceAnalyzerGroup(data.configId).subscribe({
|
|
272
|
+
next: (data) => {
|
|
273
|
+
const currentPageIndex = this.dataGrid?.instance.pageIndex();
|
|
274
|
+
this.getExceptionDataCongigs().then(() => {
|
|
275
|
+
if (currentPageIndex !== undefined) {
|
|
276
|
+
this.dataGrid.instance.pageIndex(currentPageIndex);
|
|
277
|
+
}
|
|
278
|
+
this.isLoader = false;
|
|
279
|
+
this.toastr.success(data.response);
|
|
280
|
+
});
|
|
281
|
+
}, error: (err) => {
|
|
282
|
+
this.loadingModal = false;
|
|
283
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config Delete');
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
activatedException(data) {
|
|
290
|
+
let result = confirm("<i>Are You Sure?</i>", "Activate Config");
|
|
291
|
+
result.then((dialogResult) => {
|
|
292
|
+
if (dialogResult) {
|
|
293
|
+
this.service.activateFileSequenceAnalyzerGroup(data.configId).subscribe({
|
|
294
|
+
next: (data) => {
|
|
295
|
+
const currentPageIndex = this.dataGrid?.instance.pageIndex();
|
|
296
|
+
this.getExceptionDataCongigs().then(() => {
|
|
297
|
+
if (currentPageIndex !== undefined) {
|
|
298
|
+
this.dataGrid.instance.pageIndex(currentPageIndex);
|
|
299
|
+
}
|
|
300
|
+
this.isLoader = false;
|
|
301
|
+
this.toastr.success(data.response);
|
|
302
|
+
});
|
|
303
|
+
}, error: (err) => {
|
|
304
|
+
console.log(err);
|
|
305
|
+
this.loadingModal = false;
|
|
306
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
deActivatedException(data) {
|
|
313
|
+
let result = confirm("<i>Are You Sure?</i>", "Deactivate Config");
|
|
314
|
+
result.then((dialogResult) => {
|
|
315
|
+
if (dialogResult) {
|
|
316
|
+
this.service.deactivateFileSequenceAnalyzerGroup(data.configId).subscribe({
|
|
317
|
+
next: (data) => {
|
|
318
|
+
const currentPageIndex = this.dataGrid?.instance.pageIndex();
|
|
319
|
+
this.getExceptionDataCongigs().then(() => {
|
|
320
|
+
if (currentPageIndex !== undefined) {
|
|
321
|
+
this.dataGrid.instance.pageIndex(currentPageIndex);
|
|
322
|
+
}
|
|
323
|
+
this.isLoader = false;
|
|
324
|
+
this.toastr.success(data.response);
|
|
325
|
+
});
|
|
326
|
+
}, error: (err) => {
|
|
327
|
+
console.log(err);
|
|
328
|
+
this.loadingModal = false;
|
|
329
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
updateFileSequenceAnalyzerJobs() {
|
|
336
|
+
this.loadingModal = true;
|
|
337
|
+
this.service.updateFileSequenceAnalyzerJobs().subscribe({
|
|
338
|
+
next: (data) => {
|
|
339
|
+
this.loadingModal = false;
|
|
340
|
+
this.toastr.success("File Sequence Analyzer Jobs Updated");
|
|
341
|
+
}, error: err => {
|
|
342
|
+
this.loadingModal = false;
|
|
343
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
ExceptionOperationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExceptionOperationComponent, deps: [{ token: i1.CommonService }, { token: i2.ExceptionConfigsService }, { token: i3.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
|
|
349
|
+
ExceptionOperationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ExceptionOperationComponent, selector: "app-exception-operation", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: ["gridContainer"], descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Exception Configuration\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createExceptionConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-table mr-2\"></i> File Sequence Analyzer configs | \n <button class=\"{{commonService.btn_success_md}}\" (click)=\"updateFileSequenceAnalyzerJobs()\">Update</button>\n </h6>\n <!-- <app-loader *ngIf=\"isLoader\"></app-loader> -->\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allExceptionConfigDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"configName\"></dxi-column>\n <dxi-column dataField=\"datasource\"></dxi-column>\n <dxi-column dataField=\"dbConfig\"></dxi-column>\n <dxi-column dataField=\"analyzerType\"></dxi-column>\n <dxi-column dataField=\"fileNameAttributeName\"></dxi-column>\n <dxi-column dataField=\"dataSelectionType\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button>\n <!-- <button class=\"{{commonService.btnPrimaryBlue}}\" *ngIf=\"data.data.active == false\"\n (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button> -->\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteExceptionConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\" class=\"{{commonService.btnSuccessGreen}}\"\n (click)=\"deActivatedException(data.data)\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\" class=\"{{commonService.btnWarningYellow}}\"\n (click)=\"activatedException(data.data)\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isExceptionConfigCreation\">\n <div class=\"m-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center capitalize\">\n {{contentType}} Exception Configurations\n\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btnOthersPurple}}\" (click)=\"getCancleExceptionCreation()\">\n Back\n </button>\n </div>\n </h6>\n\n <!-- (onValueChanged)=\"valueChangeForDatabaseName($event)\" -->\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Config Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.configName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Datasource</div>\n <dx-select-box [items]=\"datasourcelist\" [(ngModel)]=\"exceptionMainObject.datasource\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Analyzer Type</div>\n <dx-select-box [items]=\"analyzer_type\" valueExpr=\"key\" displayExpr=\"name\"\n [(ngModel)]=\"exceptionMainObject.analyzerType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col\">\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"pt-2\">\n <div class=\"flex flex-row p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"exceptionMainObject.dbConfig\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.tableName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Selection Type</div>\n <dx-select-box [items]=\"['select','distinct']\"\n [(ngModel)]=\"exceptionMainObject.dataSelectionType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> File Column Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.fileNameAttributeName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Filter List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getProcessForConfig()\">\n Add Filter\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <div class=\"flex flex-row my-2\"\n *ngFor=\"let items of exceptionMainObject.filterList;let i = index;\">\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Column Name</p>\n <dx-text-box [(ngModel)]=\"items.columnName\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Operator</p>\n <dx-select-box [items]=\"operator_list\" valueExpr=\"value\"\n displayExpr=\"name\" [(ngModel)]=\"items.operator\"\n [searchEnabled]=\"true\">\n </dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Datatype</p>\n <dx-select-box\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"items.dataType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Select Function</p>\n <dx-select-box [items]=\"functionNameContainer\"\n [(ngModel)]=\"items.windowFunctionName\" [searchEnabled]=\"true\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\"\n *ngIf=\"items.dataType == 'date' || items.dataType == 'timestamp'\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Date Format</p>\n <dx-text-box [(ngModel)]=\"items.dateFormat\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Default Value</p>\n <dx-text-box [(ngModel)]=\"items.value\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Pattern List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getAddPatternsConfig()\">\n Add Pattern\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <ng-container *ngFor=\"let items of exceptionMainObject.patternList;let i = index;\">\n <div class=\"flex flex-wrap my-2\">\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Regex</p>\n <dx-text-box [(ngModel)]=\"items.regex\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">File Attributes</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomFileAttributesAdd($event)\"\n [(ngModel)]=\"items.fileAttributes\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">SequenceKey</p>\n <dx-text-box [(ngModel)]=\"items.sequenceKey\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Analyzer Keys</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomAnalizerKeyAdd($event)\"\n [(ngModel)]=\"items.analyzerKeys\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Sample</p>\n <dx-text-box [(ngModel)]=\"items.sample\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deletePatternsColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-xl mb-2\">Dynamic Arguments |\n <button class=\"{{commonService.btn_primary_sm}}\"\n (click)=\"addDynamicArgument(i)\">Add Arguments</button>\n </div>\n <div class=\"m-5\">\n\n <div class=\"flex flex-wrap\">\n <ng-container *ngFor=\"let item of items.dynamicArgs | keyvalue\">\n <div class=\"w-1/2 p-2\">\n <div class=\"flex flex-row\">\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Key</div>\n <dx-text-box [(ngModel)]=\"item.key\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Value</div>\n <dx-text-box\n [(ngModel)]=\"items.dynamicArgs[item.key]\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteDynamicArguments(item,item.key,i)\"><i\n class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i></button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n\n\n </ng-container>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full justify-end mt-5 border-t\" *ngIf=\"contentType !== 'view'\">\n\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"saveExceptionConfig()\" *ngIf=\"contentType == 'create'\">\n Create Exception Config\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"updateExceptionConfig()\" *ngIf=\"contentType == 'edit'\">\n Update Exception Config\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.LoadingComponent, selector: "app-loading" }, { kind: "directive", type: i6.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i7.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "proxyUrl", "svgToCanvas", "allowExportSelectedData", "customizeExcelCell", "excelFilterEnabled", "excelWrapTextEnabled", "ignoreExcelErrors", "texts"] }, { kind: "component", type: i8.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "customizeExportData", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "focusStateEnabled", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExported", "onExporting", "onFileSaving", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "customizeExportDataChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "focusStateEnabledChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i7.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i7.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i7.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i7.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "component", type: i9.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: i10.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: i11.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: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i13.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i4.KeyValuePipe, name: "keyvalue" }] });
|
|
350
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExceptionOperationComponent, decorators: [{
|
|
351
|
+
type: Component,
|
|
352
|
+
args: [{ selector: 'app-exception-operation', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Exception Configuration\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createExceptionConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-table mr-2\"></i> File Sequence Analyzer configs | \n <button class=\"{{commonService.btn_success_md}}\" (click)=\"updateFileSequenceAnalyzerJobs()\">Update</button>\n </h6>\n <!-- <app-loader *ngIf=\"isLoader\"></app-loader> -->\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allExceptionConfigDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"configName\"></dxi-column>\n <dxi-column dataField=\"datasource\"></dxi-column>\n <dxi-column dataField=\"dbConfig\"></dxi-column>\n <dxi-column dataField=\"analyzerType\"></dxi-column>\n <dxi-column dataField=\"fileNameAttributeName\"></dxi-column>\n <dxi-column dataField=\"dataSelectionType\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button>\n <!-- <button class=\"{{commonService.btnPrimaryBlue}}\" *ngIf=\"data.data.active == false\"\n (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button> -->\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteExceptionConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\" class=\"{{commonService.btnSuccessGreen}}\"\n (click)=\"deActivatedException(data.data)\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\" class=\"{{commonService.btnWarningYellow}}\"\n (click)=\"activatedException(data.data)\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isExceptionConfigCreation\">\n <div class=\"m-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center capitalize\">\n {{contentType}} Exception Configurations\n\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btnOthersPurple}}\" (click)=\"getCancleExceptionCreation()\">\n Back\n </button>\n </div>\n </h6>\n\n <!-- (onValueChanged)=\"valueChangeForDatabaseName($event)\" -->\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Config Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.configName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Datasource</div>\n <dx-select-box [items]=\"datasourcelist\" [(ngModel)]=\"exceptionMainObject.datasource\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Analyzer Type</div>\n <dx-select-box [items]=\"analyzer_type\" valueExpr=\"key\" displayExpr=\"name\"\n [(ngModel)]=\"exceptionMainObject.analyzerType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col\">\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"pt-2\">\n <div class=\"flex flex-row p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"exceptionMainObject.dbConfig\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.tableName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Selection Type</div>\n <dx-select-box [items]=\"['select','distinct']\"\n [(ngModel)]=\"exceptionMainObject.dataSelectionType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> File Column Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.fileNameAttributeName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Filter List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getProcessForConfig()\">\n Add Filter\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <div class=\"flex flex-row my-2\"\n *ngFor=\"let items of exceptionMainObject.filterList;let i = index;\">\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Column Name</p>\n <dx-text-box [(ngModel)]=\"items.columnName\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Operator</p>\n <dx-select-box [items]=\"operator_list\" valueExpr=\"value\"\n displayExpr=\"name\" [(ngModel)]=\"items.operator\"\n [searchEnabled]=\"true\">\n </dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Datatype</p>\n <dx-select-box\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"items.dataType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Select Function</p>\n <dx-select-box [items]=\"functionNameContainer\"\n [(ngModel)]=\"items.windowFunctionName\" [searchEnabled]=\"true\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\"\n *ngIf=\"items.dataType == 'date' || items.dataType == 'timestamp'\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Date Format</p>\n <dx-text-box [(ngModel)]=\"items.dateFormat\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Default Value</p>\n <dx-text-box [(ngModel)]=\"items.value\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Pattern List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getAddPatternsConfig()\">\n Add Pattern\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <ng-container *ngFor=\"let items of exceptionMainObject.patternList;let i = index;\">\n <div class=\"flex flex-wrap my-2\">\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Regex</p>\n <dx-text-box [(ngModel)]=\"items.regex\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">File Attributes</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomFileAttributesAdd($event)\"\n [(ngModel)]=\"items.fileAttributes\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">SequenceKey</p>\n <dx-text-box [(ngModel)]=\"items.sequenceKey\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Analyzer Keys</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomAnalizerKeyAdd($event)\"\n [(ngModel)]=\"items.analyzerKeys\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Sample</p>\n <dx-text-box [(ngModel)]=\"items.sample\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deletePatternsColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-xl mb-2\">Dynamic Arguments |\n <button class=\"{{commonService.btn_primary_sm}}\"\n (click)=\"addDynamicArgument(i)\">Add Arguments</button>\n </div>\n <div class=\"m-5\">\n\n <div class=\"flex flex-wrap\">\n <ng-container *ngFor=\"let item of items.dynamicArgs | keyvalue\">\n <div class=\"w-1/2 p-2\">\n <div class=\"flex flex-row\">\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Key</div>\n <dx-text-box [(ngModel)]=\"item.key\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Value</div>\n <dx-text-box\n [(ngModel)]=\"items.dynamicArgs[item.key]\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteDynamicArguments(item,item.key,i)\"><i\n class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i></button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n\n\n </ng-container>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full justify-end mt-5 border-t\" *ngIf=\"contentType !== 'view'\">\n\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"saveExceptionConfig()\" *ngIf=\"contentType == 'create'\">\n Create Exception Config\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"updateExceptionConfig()\" *ngIf=\"contentType == 'edit'\">\n Update Exception Config\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n</div>" }]
|
|
353
|
+
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ExceptionConfigsService }, { type: i3.ToastrService }]; }, propDecorators: { dataGrid: [{
|
|
354
|
+
type: ViewChild,
|
|
355
|
+
args: ['gridContainer', { static: false }]
|
|
356
|
+
}] } });
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3RlbXBsYXRlLW1vZHVsZS9leGNlcHRpb25Db25maWdNb2R1bGUvZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3RlbXBsYXRlLW1vZHVsZS9leGNlcHRpb25Db25maWdNb2R1bGUvZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVcvQyxNQUFNLE9BQU8sMkJBQTJCO0lBK0N0QyxZQUNTLGFBQTRCLEVBQzNCLE9BQWdDLEVBQ2hDLE1BQXFCO1FBRnRCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUE5Qy9CLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBRXZCLHdCQUFtQixHQUFHO1lBQ3BCLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLEVBQUU7WUFDZCxVQUFVLEVBQUUsRUFBRTtZQUNkLE1BQU0sRUFBRSxLQUFLO1lBQ2IsWUFBWSxFQUFFLEVBQUU7WUFDaEIsUUFBUSxFQUFFLEVBQUU7WUFDWixTQUFTLEVBQUUsRUFBRTtZQUNiLGlCQUFpQixFQUFFLEVBQUU7WUFDckIscUJBQXFCLEVBQUUsRUFBRTtZQUN6QixVQUFVLEVBQUUsQ0FBQztvQkFDWCxZQUFZLEVBQUUsRUFBRTtvQkFDaEIs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QyxDQUFDO29CQUNyRyxDQUFDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsOEJBQThCO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDdEQsSUFBSSxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUUxQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO1lBQzVELENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBRTFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJEQUEyRCxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFFckcsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7O3dIQTNZVSwyQkFBMkI7NEdBQTNCLDJCQUEyQiwwS0NieEMsdS8wQkEyWk07MkZEOVlPLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSx5QkFBeUI7c0tBS1ksUUFBUTtzQkFBdEQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gaW1wb3J0IHsgQXBwbGljYXRpb25Db250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnZGV2ZXh0cmVtZS91aS9kaWFsb2cnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgRHhEYXRhR3JpZENvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XG5pbXBvcnQgeyBFeGNlcHRpb25Db25maWdzU2VydmljZSB9IGZyb20gJy4vZXhjZXB0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWV4Y2VwdGlvbi1vcGVyYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2V4Y2VwdGlvbi1vcGVyYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFeGNlcHRpb25PcGVyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKCdncmlkQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGRhdGFHcmlkOiBEeERhdGFHcmlkQ29tcG9uZW50O1xuXG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgY29udGVudFR5cGUgPSBcImNyZWF0ZVwiO1xuICBmdW5jdGlvbk5hbWVDb250YWluZXI6IGFueTtcbiAgZXhjZXB0aW9uTWFpbk9iamVjdCA9IHtcbiAgICBjb25maWdJZDogXCJcIixcbiAgICBjb25maWdOYW1lOiBcIlwiLFxuICAgIGRhdGFzb3VyY2U6IFwiXCIsXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBhbmFseXplclR5cGU6IFwiXCIsXG4gICAgZGJDb25maWc6IFwiXCIsXG4gICAgdGFibGVOYW1lOiBcIlwiLFxuICAgIGRhdGFTZWxlY3Rpb25UeXBlOiBcIlwiLFxuICAgIGZpbGVOYW1lQXR0cmlidXRlTmFtZTogXCJcIixcbiAgICBmaWx0ZXJMaXN0OiBbe1xuICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdG9yXCI6IFwiXCIsXG4gICAgICBcIndpbmRvd0Z1bmN0aW9uTmFtZVwiOiBcIlwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcIlwiLFxuICAgICAgXCJkYXRlRm9ybWF0XCI6IFwiXCIsXG4gICAgfV0sXG4gICAgcGF0dGVybkxpc3Q6IFtcbiAgICAgIHtcbiAgICAgICAgXCJyZWdleFwiOiBcIlwiLFxuICAgICAgICBcInNhbXBsZVwiOiBcIj9fPz9fP1wiLFxuICAgICAgICBcImZpbGVBdHRyaWJ1dGVzXCI6IFtcblxuICAgICAgICBdLFxuICAgICAgICBcImFuYWx5emVyS2V5c1wiOiBbXG5cbiAgICAgICAgXSxcbiAgICAgICAgXCJzZXF1ZW5jZUtleVwiOiBcIlwiLFxuICAgICAgICBcImR5bmFtaWNBcmdzXCI6IHtcblxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9XG4gIGFuYWx5emVyX3R5cGUgPSBbeyBrZXk6IFwibnVtZXJpY19zZXF1ZW5jZVwiLCBuYW1lOiBcIk51bWVyaWMgU2VxdWVuY2VcIiB9LCB7IGtleTogXCJkYXRlX3NlcXVlbmNlXCIsIG5hbWU6IFwiRGF0ZSBTZXF1ZW5jZVwiIH1dXG4gIG9wZXJhdG9yX2xpc3Q6IGFueTtcbiAgYWxsRXhjZXB0aW9uQ29uZmlnRGF0YVNvdXJjZTogYW55O1xuICBpc0xvYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIGlzRXhjZXB0aW9uQ29uZmlnQ3JlYXRpb246IGJvb2xlYW47XG4gIGRhdGFzb3VyY2VsaXN0OiBhbnk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmljZTogRXhjZXB0aW9uQ29uZmlnc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldEV4Y2VwdGlvbkRhdGFDb25naWdzKCk7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcFNxbEZ1bmN0aW9uTGlzdCgpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMuZnVuY3Rpb25OYW1lQ29udGFpbmVyID0gZGF0YTtcbiAgICB9KVxuXG4gICAgdGhpcy5zZXJ2aWNlLmdldENkckJyb3dzZXJPcGVyYXRpb25zKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5vcGVyYXRvcl9saXN0ID0gZGF0YTtcbiAgICB9KVxuICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc291cmNlKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5kYXRhc291cmNlbGlzdCA9IChkYXRhWydkYXRhc291cmNlJ10pID8gZGF0YVsnZGF0YXNvdXJjZSddIDogZGF0YTtcbiAgICB9KVxuICB9XG5cbiAgZ2V0RXhjZXB0aW9uRGF0YUNvbmdpZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNlcnZpY2UubGlzdEZpbGVTZXF1ZW5jZUFuYWx5emVyR3JvdXBzKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuYWxsRXhjZXB0aW9uQ29uZmlnRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgZWRpdEV4Y2VwdGlvbkNvbmZpZ0NvbmZpZyhkYXRhKSB7XG4gICAgdGhpcy5jb250ZW50VHlwZSA9IFwiZWRpdFwiXG4gICAgdGhpcy5pc0V4Y2VwdGlvbkNvbmZpZ0NyZWF0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QgPSBkYXRhO1xuICB9XG5cblxuXG4gIGNyZWF0ZUV4Y2VwdGlvbkNvbmZpZygpIHtcbiAgICB0aGlzLmlzRXhjZXB0aW9uQ29uZmlnQ3JlYXRpb24gPSB0cnVlO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdCA9IHtcbiAgICAgIGNvbmZpZ0lkOiBcIlwiLFxuICAgICAgY29uZmlnTmFtZTogXCJcIixcbiAgICAgIGRhdGFzb3VyY2U6IFwiXCIsXG4gICAgICBhY3RpdmU6IHRydWUsXG4gICAgICBhbmFseXplclR5cGU6IFwiXCIsXG4gICAgICBkYkNvbmZpZzogXCJcIixcbiAgICAgIHRhYmxlTmFtZTogXCJcIixcbiAgICAgIGRhdGFTZWxlY3Rpb25UeXBlOiBcIlwiLFxuICAgICAgZmlsZU5hbWVBdHRyaWJ1dGVOYW1lOiBcIlwiLFxuICAgICAgZmlsdGVyTGlzdDogW3tcbiAgICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgICAgXCJvcGVyYXRvclwiOiBcIlwiLFxuICAgICAgICBcIndpbmRvd0Z1bmN0aW9uTmFtZVwiOiBcIlwiLFxuICAgICAgICBcImRhdGVGb3JtYXRcIjogXCJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIlwiXG4gICAgICB9XSxcbiAgICAgIHBhdHRlcm5MaXN0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcInJlZ2V4XCI6IFwiXCIsXG4gICAgICAgICAgXCJzYW1wbGVcIjogXCJcIixcbiAgICAgICAgICBcImZpbGVBdHRyaWJ1dGVzXCI6IFtcblxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJhbmFseXplcktleXNcIjogW1xuXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcInNlcXVlbmNlS2V5XCI6IFwiXCIsXG4gICAgICAgICAgXCJkeW5hbWljQXJnc1wiOiB7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cblxuICBnZXRDYW5jbGVFeGNlcHRpb25DcmVhdGlvbigpIHtcbiAgICB0aGlzLmlzRXhjZXB0aW9uQ29uZmlnQ3JlYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QgPSB7XG4gICAgICBjb25maWdJZDogXCJcIixcbiAgICAgIGNvbmZpZ05hbWU6IFwiXCIsXG4gICAgICBkYXRhc291cmNlOiBcIlwiLFxuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgYW5hbHl6ZXJUeXBlOiBcIlwiLFxuICAgICAgZGJDb25maWc6IFwiXCIsXG4gICAgICB0YWJsZU5hbWU6IFwiXCIsXG4gICAgICBkYXRhU2VsZWN0aW9uVHlwZTogXCJcIixcbiAgICAgIGZpbGVOYW1lQXR0cmlidXRlTmFtZTogXCJcIixcbiAgICAgIGZpbHRlckxpc3Q6IFt7XG4gICAgICAgIFwiY29sdW1uTmFtZVwiOiBcIlwiLFxuICAgICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICAgIFwib3BlcmF0b3JcIjogXCJcIixcbiAgICAgICAgXCJ3aW5kb3dGdW5jdGlvbk5hbWVcIjogXCJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIlwiLFxuICAgICAgICBcImRhdGVGb3JtYXRcIjogXCJcIlxuICAgICAgfV0sXG4gICAgICBwYXR0ZXJuTGlzdDogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJyZWdleFwiOiBcIlwiLFxuICAgICAgICAgIFwic2FtcGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJmaWxlQXR0cmlidXRlc1wiOiBbXG5cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwiYW5hbHl6ZXJLZXlzXCI6IFtcblxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJzZXF1ZW5jZUtleVwiOiBcIlwiLFxuICAgICAgICAgIFwiZHluYW1pY0FyZ3NcIjoge1xuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG5cblxuICBnZXREYXRhQ29uZmlnKGUpIHtcblxuICB9XG5cblxuICBnZXRQcm9jZXNzRm9yQ29uZmlnKCkge1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0LnB1c2goe1xuICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdG9yXCI6IFwiXCIsXG4gICAgICBcIndpbmRvd0Z1bmN0aW9uTmFtZVwiOiBcIlwiLFxuICAgICAgXCJkYXRlRm9ybWF0XCI6IFwiXCIsXG4gICAgICBcInZhbHVlXCI6IFwiXCJcbiAgICB9KVxuICB9XG5cbiAgZGVsZXRlQ29sdW1lKGkpIHtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5zcGxpY2UoaSwgMSlcbiAgfVxuXG4gIGRlbGV0ZUR5bmFtaWNBcmd1bWVudHMoaXRlbSwga2V5LCBpbmRleCkge1xuICAgIGRlbGV0ZSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3RbaW5kZXhdWydkeW5hbWljQXJncyddW2tleV07XG4gIH1cbiAgYWRkRHluYW1pY0FyZ3VtZW50KGluZGV4KSB7XG4gICAgbGV0IG5ld0tleSA9ICcnO1xuICAgIGxldCBuZXdWYWx1ZSA9ICcnO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdFtpbmRleF1bJ2R5bmFtaWNBcmdzJ11bbmV3S2V5XSA9IG5ld1ZhbHVlO1xuICB9XG5cblxuXG4gIG1vdmVJdGVtRm9yQ29sdW1ucyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIGlmIChuZXdQb3NpdGlvbiA8IDAgfHwgbmV3UG9zaXRpb24gPj0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3QubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3RbaW5kZXhdO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3Quc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTtcbiAgfVxuXG5cblxuICBnZXRBZGRQYXR0ZXJuc0NvbmZpZygpIHtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3QucHVzaCh7XG4gICAgICBcInJlZ2V4XCI6IFwiXCIsXG4gICAgICBcInNhbXBsZVwiOiBcIlwiLFxuICAgICAgXCJzZXF1ZW5jZUtleVwiOiBcIlwiLFxuICAgICAgXCJmaWxlQXR0cmlidXRlc1wiOiBbXSxcbiAgICAgIFwiYW5hbHl6ZXJLZXlzXCI6IFtdLFxuICAgICAgXCJkeW5hbWljQXJnc1wiOiB7fVxuICAgIH0pXG4gIH1cblxuICBtb3ZlSXRlbUZvcnBhdHRlcm5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIGlmIChuZXdQb3NpdGlvbiA8IDAgfHwgbmV3UG9zaXRpb24gPj0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXRlbVRvTW92ZSA9IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdFtpbmRleF07XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0LnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7XG4gIH1cblxuICBkZWxldGVQYXR0ZXJuc0NvbHVtZShpKSB7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0LnNwbGljZShpLCAxKVxuICB9XG5cbiAgb25DdXN0b21GaWxlQXR0cmlidXRlc0FkZChhcmdzKSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBhcmdzLnRleHQ7XG4gICAgYXJncy5jdXN0b21JdGVtID0gbmV3VmFsdWU7XG4gICAgY29uc3QgaXNJdGVtSW5EYXRhU291cmNlID0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0WydmaWxlQXR0cmlidXRlcyddLnNvbWUoKGl0ZW0pID0+IGl0ZW0gPT09IG5ld1ZhbHVlKTtcbiAgICBpZiAoIWlzSXRlbUluRGF0YVNvdXJjZSkge1xuICAgICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0WydmaWxlQXR0cmlidXRlcyddLnVuc2hpZnQobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3VzdG9tQW5hbGl6ZXJLZXlBZGQoYXJncykge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gYXJncy50ZXh0O1xuICAgIGFyZ3MuY3VzdG9tSXRlbSA9IG5ld1ZhbHVlO1xuICAgIGNvbnN0IGlzSXRlbUluRGF0YVNvdXJjZSA9IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdFsnYW5hbHl6ZXJLZXlzJ10uc29tZSgoaXRlbSkgPT4gaXRlbSA9PT0gbmV3VmFsdWUpO1xuICAgIGlmICghaXNJdGVtSW5EYXRhU291cmNlKSB7XG4gICAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3RbJ2FuYWx5emVyS2V5cyddLnVuc2hpZnQobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuXG5cbiAgdXBkYXRlRXhjZXB0aW9uQ29uZmlnKCkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2UuZWRpdEZpbGVTZXF1ZW5jZUFuYWx5emVyR3JvdXAodGhpcy5leGNlcHRpb25NYWluT2JqZWN0KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzRXhjZXB0aW9uQ29uZmlnQ3JlYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IHRydWU7XG4gICAgICAgIHRoaXMuZ2V0RXhjZXB0aW9uRGF0YUNvbmdpZ3MoKTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0NyZWF0ZSBFeGNlcHRpb24gQ29uZmlnJylcblxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc29sZS5sb2codGhpcy5leGNlcHRpb25NYWluT2JqZWN0KVxuICB9XG4gIHNhdmVFeGNlcHRpb25Db25maWcoKSB7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0KSB7XG4gICAgICBpZiAoIWVsZW1lbnQuZmlsZUF0dHJpYnV0ZXMuaW5jbHVkZXMoZWxlbWVudC5zZXF1ZW5jZUtleSkpIHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1NlcXVlbmNlIEtleSBub3QgdmFsaWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhbGxNYXRjaCA9IGVsZW1lbnQuYW5hbHl6ZXJLZXlzLmV2ZXJ5KGl0ZW0gPT4gZWxlbWVudC5maWxlQXR0cmlidXRlcy5pbmNsdWRlcyhpdGVtKSk7XG4gICAgICBjb25zdCBhbGxLZXlzTWF0Y2ggPSBPYmplY3Qua2V5cyhlbGVtZW50LmR5bmFtaWNBcmdzKS5ldmVyeShrZXkgPT4gZWxlbWVudC5maWxlQXR0cmlidXRlcy5pbmNsdWRlcyhrZXkpKTtcblxuICAgICAgaWYgKCFhbGxNYXRjaCkge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignQW5hbHl6ZXIgS2V5cyBub3QgdmFsaWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFsbEtleXNNYXRjaCkge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignRmlsbGVyIG5vdCB2YWxpZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRPYmogPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVsZW1lbnQuZHluYW1pY0FyZ3MpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbYGRlZmF1bHRfJHtrZXl9X2ZpbHRlcmAsIHZhbHVlXSlcbiAgICAgICk7XG4gICAgICBlbGVtZW50LmR5bmFtaWNBcmdzID0gdXBkYXRlZE9iajtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLnNhdmVGaWxlU2VxdWVuY2VBbmFseXplckdyb3VwKHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc0V4Y2VwdGlvbkNvbmZpZ0NyZWF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLmdldEV4Y2VwdGlvbkRhdGFDb25naWdzKCk7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDcmVhdGUgRXhjZXB0aW9uIENvbmZpZycpXG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGVsZXRlRXhjZXB0aW9uQ29uZmlnKGRhdGEpIHtcbiAgICBsZXQgcmVzdWx0ID0gY29uZmlybShcIjxpPkFyZSBZb3UgU3VyZT88L2k+XCIsIFwiRGVsZXRlIENvbmZpZ1wiKTtcbiAgICByZXN1bHQudGhlbigoZGlhbG9nUmVzdWx0KSA9PiB7XG4gICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZVxuICAgICAgICB0aGlzLnNlcnZpY2UuZGVsZXRlRmlsZVNlcXVlbmNlQW5hbHl6ZXJHcm91cChkYXRhLmNvbmZpZ0lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLmRhdGFHcmlkPy5pbnN0YW5jZS5wYWdlSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RXhjZXB0aW9uRGF0YUNvbmdpZ3MoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucGFnZUluZGV4KGN1cnJlbnRQYWdlSW5kZXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhkYXRhLnJlc3BvbnNlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQ0RSIENvbmZpZyBEZWxldGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhY3RpdmF0ZWRFeGNlcHRpb24oZGF0YSkge1xuICAgIGxldCByZXN1bHQgPSBjb25maXJtKFwiPGk+QXJlIFlvdSBTdXJlPzwvaT5cIiwgXCJBY3RpdmF0ZSBDb25maWdcIik7XG4gICAgcmVzdWx0LnRoZW4oKGRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgaWYgKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICB0aGlzLnNlcnZpY2UuYWN0aXZhdGVGaWxlU2VxdWVuY2VBbmFseXplckdyb3VwKGRhdGEuY29uZmlnSWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlLnBhZ2VJbmRleCgpO1xuICAgICAgICAgICAgdGhpcy5nZXRFeGNlcHRpb25EYXRhQ29uZ2lncygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhR3JpZC5pbnN0YW5jZS5wYWdlSW5kZXgoY3VycmVudFBhZ2VJbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKGRhdGEucmVzcG9uc2UpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRXhjZXB0aW9uIENvbmZpZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBkZUFjdGl2YXRlZEV4Y2VwdGlvbihkYXRhKSB7XG4gICAgbGV0IHJlc3VsdCA9IGNvbmZpcm0oXCI8aT5BcmUgWW91IFN1cmU/PC9pPlwiLCBcIkRlYWN0aXZhdGUgQ29uZmlnXCIpO1xuICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgIGlmIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmRlYWN0aXZhdGVGaWxlU2VxdWVuY2VBbmFseXplckdyb3VwKGRhdGEuY29uZmlnSWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlLnBhZ2VJbmRleCgpO1xuICAgICAgICAgICAgdGhpcy5nZXRFeGNlcHRpb25EYXRhQ29uZ2lncygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhR3JpZC5pbnN0YW5jZS5wYWdlSW5kZXgoY3VycmVudFBhZ2VJbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKGRhdGEucmVzcG9uc2UpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRXhjZXB0aW9uIENvbmZpZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZUZpbGVTZXF1ZW5jZUFuYWx5emVySm9icygpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUZpbGVTZXF1ZW5jZUFuYWx5emVySm9icygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcIkZpbGUgU2VxdWVuY2UgQW5hbHl6ZXIgSm9icyBVcGRhdGVkXCIpXG4gICAgICB9LCBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0V4Y2VwdGlvbiBDb25maWcnKTtcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG59XG4iLCI8YXBwLWxvYWRpbmcgKm5nSWY9XCJsb2FkaW5nTW9kYWxcIj48L2FwcC1sb2FkaW5nPlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIHctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiAgZGFyazpiZy10cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggIGZsZXgtY29sIG1sLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCAgaXRlbXMtY2VudGVyIGZsb2F0LXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24tc2l6ZS0yXCIgW3N2Z0ljb25dPVwiJ2hlcm9pY29uc19zb2xpZDp0ZW1wbGF0ZSdcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGgyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMnhsIG1kOnRleHQtMnhsIHB5LTMgZm9udC1leHRyYWJvbGQgaXRlbXMtY2VudGVyIG1sLTIgdHJhY2tpbmctdGlnaHQgbGVhZGluZy01IHRydW5jYXRlIGNhcGl0YWxpemVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBDb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGJvcmRlci1sLTIgcC0wIG0tMFwiPlxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xIGgtZnVsbCBib3JkZXItbC0yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcC0xXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZUV4Y2VwdGlvbkNvbmZpZygpXCI+Q3JlYXRlIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTMgcC00IGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1sZyBzaGFkb3ctbWQgZGFyazpiZy1ncmF5LTgwMCBkYXJrOmJvcmRlci1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItMiBmb250LWJvbGQgdGV4dC1sZyB0cmFja2luZy10aWdodCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSBib3JkZXItYiBwYi0zXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10YWJsZSBtci0yXCI+PC9pPiBGaWxlIFNlcXVlbmNlIEFuYWx5emVyIGNvbmZpZ3MgfCBcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19XCIgKGNsaWNrKT1cInVwZGF0ZUZpbGVTZXF1ZW5jZUFuYWx5emVySm9icygpXCI+VXBkYXRlPC9idXR0b24+XG4gICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPCEtLSA8YXBwLWxvYWRlciAqbmdJZj1cImlzTG9hZGVyXCI+PC9hcHAtbG9hZGVyPiAtLT5cbiAgICAgICAgICAgIDxkeC1kYXRhLWdyaWQgW2NvbHVtbkF1dG9XaWR0aF09XCJ0cnVlXCIgW2RhdGFTb3VyY2VdPVwiYWxsRXhjZXB0aW9uQ29uZmlnRGF0YVNvdXJjZVwiIFtzZWxlY3RlZFJvd0tleXNdPVwiW11cIlxuICAgICAgICAgICAgICAgIFtzaG93Qm9yZGVyc109XCJ0cnVlXCIgW3Nob3dSb3dMaW5lc109XCJ0cnVlXCIgaWQ9XCJncmlkQ29udGFpbmVyXCIgW2hvdmVyU3RhdGVFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzTG9hZGVyXCI+XG5cbiAgICAgICAgICAgICAgICA8ZHhvLXNlYXJjaC1wYW5lbCBbaGlnaGxpZ2h0Q2FzZVNlbnNpdGl2ZV09XCJ0cnVlXCIgW3Zpc2libGVdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDwvZHhvLXNlYXJjaC1wYW5lbD5cbiAgICAgICAgICAgICAgICA8ZHhvLWV4cG9ydCBbZW5hYmxlZF09XCJ0cnVlXCIgZmlsZU5hbWU9XCJhbGVydF9kYXRhX2J5X3N0YXR1c1wiPjwvZHhvLWV4cG9ydD5cbiAgICAgICAgICAgICAgICA8ZHhvLXBhZ2luZyBbcGFnZVNpemVdPVwiMTBcIj48L2R4by1wYWdpbmc+XG4gICAgICAgICAgICAgICAgPGR4by1wYWdlciBbc2hvd0luZm9dPVwidHJ1ZVwiIFtzaG93UGFnZVNpemVTZWxlY3Rvcl09XCJ0cnVlXCIgW2FsbG93ZWRQYWdlU2l6ZXNdPVwiWzEwLDIwLDUwLDEwMF1cIj5cbiAgICAgICAgICAgICAgICA8L2R4by1wYWdlcj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJjb25maWdOYW1lXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImRhdGFzb3VyY2VcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZGJDb25maWdcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiYW5hbHl6ZXJUeXBlXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImZpbGVOYW1lQXR0cmlidXRlTmFtZVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJkYXRhU2VsZWN0aW9uVHlwZVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBjYXB0aW9uPVwiU3RhdHVzXCIgZGF0YUZpZWxkPVwiYWN0aXZlXCIgY2VsbFRlbXBsYXRlPVwiY2VsbFRlbXBsYXRlMVwiPjwvZHhpLWNvbHVtbj5cblxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImFjdGlvblwiIGNlbGxUZW1wbGF0ZT1cImNlbGxUZW1wbGF0ZVwiIFtmaXhlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgZml4ZWRQb3NpdGlvbj1cInJpZ2h0XCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY2VsbFRlbXBsYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0blByaW1hcnlCbHVlfX1cIiAoY2xpY2spPVwiZWRpdEV4Y2VwdGlvbkNvbmZpZ0NvbmZpZyhkYXRhLmRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuUHJpbWFyeUJsdWV9fVwiICpuZ0lmPVwiZGF0YS5kYXRhLmFjdGl2ZSA9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdEV4Y2VwdGlvbkNvbmZpZ0NvbmZpZyhkYXRhLmRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfbWR9fVwiIChjbGljayk9XCJkZWxldGVFeGNlcHRpb25Db25maWcoZGF0YS5kYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY2VsbFRlbXBsYXRlMSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLmRhdGEuYWN0aXZlID09IHRydWVcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5TdWNjZXNzR3JlZW59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVBY3RpdmF0ZWRFeGNlcHRpb24oZGF0YS5kYXRhKVwiPkFjdGl2ZTwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5kYXRhLmFjdGl2ZSA9PSBmYWxzZVwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bldhcm5pbmdZZWxsb3d9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVkRXhjZXB0aW9uKGRhdGEuZGF0YSlcIj5JbmFjdGl2ZTwvYnV0dG9uPlxuXG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9keC1kYXRhLWdyaWQ+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRXhjZXB0aW9uQ29uZmlnQ3JlYXRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibS0zIHAtNCBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbGcgc2hhZG93LW1kIGRhcms6YmctZ3JheS04MDAgZGFyazpib3JkZXItZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICA8aDZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0yIHRleHQtbGcgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItMyBmbGV4IGl0ZW1zLWNlbnRlciBjYXBpdGFsaXplXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFR5cGV9fSBFeGNlcHRpb24gQ29uZmlndXJhdGlvbnNcblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5PdGhlcnNQdXJwbGV9fVwiIChjbGljayk9XCJnZXRDYW5jbGVFeGNlcHRpb25DcmVhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvaDY+XG5cbiAgICAgICAgICAgICAgICA8IS0tICAob25WYWx1ZUNoYW5nZWQpPVwidmFsdWVDaGFuZ2VGb3JEYXRhYmFzZU5hbWUoJGV2ZW50KVwiIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgYm9yZGVyLXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+Q29uZmlnIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImV4Y2VwdGlvbk1haW5PYmplY3QuY29uZmlnTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkRhdGFzb3VyY2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJkYXRhc291cmNlbGlzdFwiIFsobmdNb2RlbCldPVwiZXhjZXB0aW9uTWFpbk9iamVjdC5kYXRhc291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5BbmFseXplciBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiYW5hbHl6ZXJfdHlwZVwiIHZhbHVlRXhwcj1cImtleVwiIGRpc3BsYXlFeHByPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJleGNlcHRpb25NYWluT2JqZWN0LmFuYWx5emVyVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBib3JkZXItYiBteS00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYiBDb25maWc8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXhjZXB0aW9uTWFpbk9iamVjdC5kYkNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRhYmxlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJleGNlcHRpb25NYWluT2JqZWN0LnRhYmxlTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYXRhIFNlbGVjdGlvbiBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnc2VsZWN0JywnZGlzdGluY3QnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXhjZXB0aW9uTWFpbk9iamVjdC5kYXRhU2VsZWN0aW9uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEZpbGUgQ29sdW1uIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJleGNlcHRpb25NYWluT2JqZWN0LmZpbGVOYW1lQXR0cmlidXRlTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGJvcmRlci1iIG15LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0yIGJvcmRlci1iIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtMnhsIGZvbnQtZXh0cmFib2xkXCI+RmlsdGVyIExpc3Q8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0UHJvY2Vzc0ZvckNvbmZpZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXktMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW1zIG9mIGV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdDtsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPkNvbHVtbiBOYW1lPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbXMuY29sdW1uTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+T3BlcmF0b3I8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwib3BlcmF0b3JfbGlzdFwiIHZhbHVlRXhwcj1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcj1cIm5hbWVcIiBbKG5nTW9kZWwpXT1cIml0ZW1zLm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPkRhdGF0eXBlPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiWydkYXRlJywnc3RyaW5nJywndGltZXN0YW1wJywnaW50JywgJ2RvdWJsZScsICdib29sZWFuJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbXMuZGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+U2VsZWN0IEZ1bmN0aW9uPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cImZ1bmN0aW9uTmFtZUNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtcy53aW5kb3dGdW5jdGlvbk5hbWVcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW1zLmRhdGFUeXBlID09ICdkYXRlJyB8fCBpdGVtcy5kYXRhVHlwZSA9PSAndGltZXN0YW1wJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPkRhdGUgRm9ybWF0PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbXMuZGF0ZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPkRlZmF1bHQgVmFsdWU8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTEgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSBleGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3QubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTEgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQ29sdW1lKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgYm9yZGVyLWIgbXktNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTIgYm9yZGVyLWIgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC0yeGwgZm9udC1leHRyYWJvbGRcIj5QYXR0ZXJuIExpc3Q8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0QWRkUGF0dGVybnNDb25maWcoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBQYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtcyBvZiBleGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0O2xldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTIgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+UmVnZXg8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbXMucmVnZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTIgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+RmlsZSBBdHRyaWJ1dGVzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFttdWx0aWxpbmVdPVwidHJ1ZVwiIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRDdXN0b21WYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ3VzdG9tSXRlbUNyZWF0aW5nKT1cIm9uQ3VzdG9tRmlsZUF0dHJpYnV0ZXNBZGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbXMuZmlsZUF0dHJpYnV0ZXNcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMyBweC0yIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPlNlcXVlbmNlS2V5PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW1zLnNlcXVlbmNlS2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8zIHB4LTIgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+QW5hbHl6ZXIgS2V5czwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbbXVsdGlsaW5lXT1cInRydWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0Q3VzdG9tVmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkN1c3RvbUl0ZW1DcmVhdGluZyk9XCJvbkN1c3RvbUFuYWxpemVyS2V5QWRkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW1zLmFuYWx5emVyS2V5c1wiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvNiBweC0yIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPlNhbXBsZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtcy5zYW1wbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS82IHB4LTIgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9ycGF0dGVybnMoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSBleGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3QubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9ycGF0dGVybnMoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVQYXR0ZXJuc0NvbHVtZShpKVwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14bCBtYi0yXCI+RHluYW1pYyBBcmd1bWVudHMgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZER5bmFtaWNBcmd1bWVudChpKVwiPkFkZCBBcmd1bWVudHM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS01XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zLmR5bmFtaWNBcmdzIHwga2V5dmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWRcIj4gQXJndW1lbnQgS2V5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5rZXlcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWRcIj4gQXJndW1lbnQgVmFsdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtcy5keW5hbWljQXJnc1tpdGVtLmtleV1cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUR5bmFtaWNBcmd1bWVudHMoaXRlbSxpdGVtLmtleSxpKVwiPjxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwganVzdGlmeS1lbmQgbXQtNSBib3JkZXItdFwiICpuZ0lmPVwiY29udGVudFR5cGUgIT09ICd2aWV3J1wiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBteC0xIG15LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVFeGNlcHRpb25Db25maWcoKVwiICpuZ0lmPVwiY29udGVudFR5cGUgPT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBFeGNlcHRpb24gQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBteS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVFeGNlcHRpb25Db25maWcoKVwiICpuZ0lmPVwiY29udGVudFR5cGUgPT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUgRXhjZXB0aW9uIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==
|