ezlibrary_v2 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +24 -0
  2. package/esm2020/ezlibrary_v2.mjs +5 -0
  3. package/esm2020/lib/admin-service/admin-service.service.mjs +34 -0
  4. package/esm2020/lib/analysis-search/analysis-search.component.mjs +1077 -0
  5. package/esm2020/lib/assort-service/assort-service.service.mjs +28 -0
  6. package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +225 -0
  7. package/esm2020/lib/auth/auth.guard.mjs +37 -0
  8. package/esm2020/lib/bi-service/bi.service.mjs +57 -0
  9. package/esm2020/lib/call-info/callinfo.component.mjs +125 -0
  10. package/esm2020/lib/comman-service/comman-service.service.mjs +678 -0
  11. package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
  12. package/esm2020/lib/contact-search/contact-search.component.mjs +690 -0
  13. package/esm2020/lib/contact-service/contact-service.service.mjs +45 -0
  14. package/esm2020/lib/ez-lib.component.mjs +26 -0
  15. package/esm2020/lib/ez-lib.module.mjs +232 -0
  16. package/esm2020/lib/ez-lib.service.mjs +14 -0
  17. package/esm2020/lib/ezheader/header.component.mjs +400 -0
  18. package/esm2020/lib/file-upload/fileupload.component.mjs +918 -0
  19. package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +169 -0
  20. package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
  21. package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
  22. package/esm2020/lib/fileupload-module/fileupload.module.mjs +80 -0
  23. package/esm2020/lib/footer/footer.component.mjs +18 -0
  24. package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
  25. package/esm2020/lib/globle/globle-env.service.mjs +45 -0
  26. package/esm2020/lib/globle/memo-report.service.mjs +2798 -0
  27. package/esm2020/lib/globle/shared-services.service.mjs +25 -0
  28. package/esm2020/lib/globle/upload-service.service.mjs +63 -0
  29. package/esm2020/lib/header/header.component.mjs +172 -0
  30. package/esm2020/lib/invalid/invalid.component.mjs +70 -0
  31. package/esm2020/lib/logout/logout.component.mjs +104 -0
  32. package/esm2020/lib/menu-right/menu-right.component.mjs +258 -0
  33. package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
  34. package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
  35. package/esm2020/lib/pipes/selectedCount.mjs +19 -0
  36. package/esm2020/lib/pipes/sum.pipe.mjs +17 -0
  37. package/esm2020/lib/pkt-data/pkt-data.component.mjs +1109 -0
  38. package/esm2020/lib/pricing-service/pricing.service.mjs +64 -0
  39. package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1028 -0
  40. package/esm2020/lib/report-format/report-format.component.mjs +403 -0
  41. package/esm2020/lib/sessionend/session-end.guard.mjs +27 -0
  42. package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
  43. package/esm2020/lib/stock-service/stock-service.service.mjs +58 -0
  44. package/esm2020/lib/system-module/subform/subform.component.mjs +2817 -0
  45. package/esm2020/lib/system-module/system/system.component.mjs +970 -0
  46. package/esm2020/lib/system-module/system-service/system-service.service.mjs +83 -0
  47. package/esm2020/lib/system-module/system-service/upload-file.service.mjs +83 -0
  48. package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +24 -0
  49. package/esm2020/lib/utility/constants.mjs +5 -0
  50. package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
  51. package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
  52. package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
  53. package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
  54. package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
  55. package/esm2020/lib/utility/tranform.directive.mjs +27 -0
  56. package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
  57. package/esm2020/public-api.mjs +59 -0
  58. package/ezlibrary_v2.d.ts +5 -0
  59. package/fesm2015/ezlibrary_v2.mjs +15300 -0
  60. package/fesm2015/ezlibrary_v2.mjs.map +1 -0
  61. package/fesm2020/ezlibrary_v2.mjs +15291 -0
  62. package/fesm2020/ezlibrary_v2.mjs.map +1 -0
  63. package/lib/admin-service/admin-service.service.d.ts +13 -0
  64. package/lib/analysis-search/analysis-search.component.d.ts +118 -0
  65. package/lib/assort-service/assort-service.service.d.ts +12 -0
  66. package/lib/attribute-definition/attribute-definition.component.d.ts +43 -0
  67. package/lib/auth/auth.guard.d.ts +14 -0
  68. package/lib/bi-service/bi.service.d.ts +16 -0
  69. package/lib/call-info/callinfo.component.d.ts +26 -0
  70. package/lib/comman-service/comman-service.service.d.ts +106 -0
  71. package/lib/comman-service/share-data-service.service.d.ts +10 -0
  72. package/lib/contact-search/contact-search.component.d.ts +111 -0
  73. package/lib/contact-service/contact-service.service.d.ts +15 -0
  74. package/lib/ez-lib.component.d.ts +8 -0
  75. package/lib/ez-lib.module.d.ts +43 -0
  76. package/lib/ez-lib.service.d.ts +6 -0
  77. package/lib/ezheader/header.component.d.ts +57 -0
  78. package/lib/file-upload/fileupload.component.d.ts +127 -0
  79. package/lib/file-upload-log/file-upload-log.component.d.ts +49 -0
  80. package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
  81. package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
  82. package/lib/fileupload-module/fileupload.module.d.ts +15 -0
  83. package/lib/footer/footer.component.d.ts +9 -0
  84. package/lib/globle/common-pdf.service.d.ts +9 -0
  85. package/lib/globle/globle-env.service.d.ts +16 -0
  86. package/lib/globle/memo-report.service.d.ts +107 -0
  87. package/lib/globle/shared-services.service.d.ts +12 -0
  88. package/lib/globle/upload-service.service.d.ts +16 -0
  89. package/lib/header/header.component.d.ts +41 -0
  90. package/lib/invalid/invalid.component.d.ts +12 -0
  91. package/lib/logout/logout.component.d.ts +19 -0
  92. package/lib/menu-right/menu-right.component.d.ts +43 -0
  93. package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
  94. package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
  95. package/lib/pipes/selectedCount.d.ts +7 -0
  96. package/lib/pipes/sum.pipe.d.ts +7 -0
  97. package/lib/pkt-data/pkt-data.component.d.ts +184 -0
  98. package/lib/pricing-service/pricing.service.d.ts +16 -0
  99. package/lib/qa-analysis/qa-analysis.component.d.ts +95 -0
  100. package/lib/report-format/report-format.component.d.ts +74 -0
  101. package/lib/sessionend/session-end.guard.d.ts +10 -0
  102. package/lib/stock-service/lazyload.service.d.ts +7 -0
  103. package/lib/stock-service/stock-service.service.d.ts +15 -0
  104. package/lib/system-module/subform/subform.component.d.ts +222 -0
  105. package/lib/system-module/system/system.component.d.ts +109 -0
  106. package/lib/system-module/system-service/system-service.service.d.ts +23 -0
  107. package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
  108. package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
  109. package/lib/utility/constants.d.ts +4 -0
  110. package/lib/utility/contact-table-search.pipe.d.ts +7 -0
  111. package/lib/utility/formate-num-field.pipe.d.ts +7 -0
  112. package/lib/utility/search-pipe.pipe.d.ts +7 -0
  113. package/lib/utility/selective-preloading-strategy.d.ts +9 -0
  114. package/lib/utility/table-search.pipe.d.ts +7 -0
  115. package/lib/utility/tranform.directive.d.ts +10 -0
  116. package/lib/websearch-history/websearch-history.component.d.ts +56 -0
  117. package/package.json +31 -0
  118. package/public-api.d.ts +54 -0
@@ -0,0 +1,918 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ // import { FlashMessagesService } from 'angular2-flash-messages'
3
+ // import { Ng4LoadingSpinnerService } from 'ng4-loading-spinner';
4
+ import { Cookie } from 'ng2-cookies/ng2-cookies';
5
+ // import * as XLSX from 'ts-xlsx';
6
+ // import * as XLSX from 'xlsx/xlsx.mjs';
7
+ import * as XLSX from 'xlsx';
8
+ import { document } from 'ngx-bootstrap';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/router";
11
+ import * as i2 from "@angular/common/http";
12
+ import * as i3 from "../comman-service/comman-service.service";
13
+ import * as i4 from "@ng-select/ng-select";
14
+ import * as i5 from "@angular/common";
15
+ import * as i6 from "@angular/forms";
16
+ import * as i7 from "../utility/app-no-dbl-click.directive";
17
+ // import { AsyncLocalStorage } from 'async_hooks';
18
+ export class FileuploadComponent {
19
+ constructor(router, route,
20
+ // private flashMessagesService: FlashMessagesService,
21
+ // private spinnerService: Ng4LoadingSpinnerService,
22
+ http, cs) {
23
+ this.router = router;
24
+ this.route = route;
25
+ this.http = http;
26
+ this.cs = cs;
27
+ this.header = {};
28
+ this.fileToUpload = null;
29
+ this.fileName = "";
30
+ this.step = 1;
31
+ this.sheetData = [];
32
+ this.headerAttributeDtl = {};
33
+ this.defultDisplayLen = 5;
34
+ this.defultDisplayObj = [];
35
+ this.attrStructureDtl = [];
36
+ this.headerList = [];
37
+ this.totalmatch = 0;
38
+ this.totalignore = 0;
39
+ this.pageDefination = {};
40
+ this.rowdatamapDetails = {};
41
+ this.rowdistinctDataMap = {};
42
+ this.charHeaderList = [];
43
+ this.attributeDtlMap = {};
44
+ this.mappSheetData = [];
45
+ this.lable = "";
46
+ this.lableFile = "";
47
+ this.statusList = [];
48
+ this.fileDetails = [];
49
+ this.fileTypeList = [];
50
+ this.fileOptionsList = [];
51
+ this.check_status = [];
52
+ this.pkt_status = [];
53
+ this.colFormate = [];
54
+ this.ignoreFormate = [];
55
+ this.allcols = [];
56
+ this.fileLogIdn = 0;
57
+ this.show = false;
58
+ this.stepMsg = '';
59
+ this.dateFormatMap = {};
60
+ this.mappingskip = false;
61
+ this.dateFormatList = [{ "k": "dd/mm/yy", "v": "dd/mm/yy" },
62
+ { "k": "mm/dd/yy", "v": "mm/dd/yy" },
63
+ { "k": "dd/Mon/yy", "v": "dd/Mon/yy" },
64
+ ];
65
+ this.gmatchedCount = 0;
66
+ this.gresultCount = 0;
67
+ this.sttsFile = {};
68
+ // checkUploadStt() {
69
+ // this.spinnerService.show();
70
+ // let reqObj = {};
71
+ // reqObj['formNme'] = this.route.snapshot.params['frmname'];
72
+ // reqObj['file_log_idn'] = this.fileLogIdn;
73
+ // console.log(JSON.stringify(reqObj));
74
+ // this.us.data(reqObj, 'getFileLogStatus', 'fileUpload/load').subscribe(response => {
75
+ // if (response.status == 'SUCCESS') {
76
+ // this.clicked = true;
77
+ // let result = response.result || {};
78
+ // console.log(result);
79
+ // this.stts['C'] = result['C'];
80
+ // this.stts['P'] = result['P'];
81
+ // this.stts['E'] = result['E'];
82
+ // this.stts['T'] = result['T'];
83
+ // this.step = 4;
84
+ // this.spinnerService.hide();
85
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
86
+ // }
87
+ // this.spinnerService.hide();
88
+ // }, error => {
89
+ // this.spinnerService.hide();
90
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
91
+ // });
92
+ // }
93
+ this.stts = {};
94
+ this.clicked = false;
95
+ this.totProgress = 0;
96
+ this.totProgressFile = 0;
97
+ this.lastRefreshTimeFile = null;
98
+ this.lastRefreshTime = null;
99
+ }
100
+ handleFileInput(files) {
101
+ this.fileToUpload = files.item(0);
102
+ this.fileName = files[0].name;
103
+ }
104
+ onFileSelect(input) {
105
+ const files = input.files;
106
+ if (files && files.length) {
107
+ const fileToRead = files[0];
108
+ const fileReader = new FileReader();
109
+ fileReader.onload = this.onFileLoad;
110
+ fileReader.readAsText(fileToRead, "UTF-8");
111
+ }
112
+ }
113
+ onFileLoad(fileLoadedEvent) {
114
+ const csvSeparator = ';';
115
+ const textFromFileLoaded = fileLoadedEvent.target.result;
116
+ this.csvContent = textFromFileLoaded;
117
+ const txt = textFromFileLoaded;
118
+ const csv = [];
119
+ const lines = txt.split('\n');
120
+ console.log(lines[0]);
121
+ lines.forEach(element => {
122
+ const cols = element.split(csvSeparator);
123
+ csv.push(cols);
124
+ });
125
+ this.parsedCsv = csv;
126
+ // demo output as alert
127
+ var output = "";
128
+ csv.forEach(row => {
129
+ output += "\n";
130
+ var colNo = 0;
131
+ row.forEach(col => {
132
+ if (colNo > 0)
133
+ output += " | ";
134
+ output += col;
135
+ colNo++;
136
+ });
137
+ });
138
+ return output;
139
+ }
140
+ incomingfile(event) {
141
+ this.file = event.target.files[0];
142
+ this.fileName = this.file.name;
143
+ this.Upload();
144
+ }
145
+ Upload() {
146
+ this.show = true;
147
+ this.stepMsg = 'File upload in process..';
148
+ // this.spinnerService.show();
149
+ this.mappSheetData = [];
150
+ this.sheetData = [];
151
+ let fileReader = new FileReader();
152
+ fileReader.onload = (e) => {
153
+ this.arrayBuffer = fileReader.result;
154
+ var data = new Uint8Array(this.arrayBuffer);
155
+ var arr = new Array();
156
+ for (var i = 0; i != data.length; ++i)
157
+ arr[i] = String.fromCharCode(data[i]);
158
+ var bstr = arr.join("");
159
+ var workbook = XLSX.read(bstr, { type: "binary" });
160
+ var first_sheet_name = workbook.SheetNames[0];
161
+ var worksheet = workbook.Sheets[first_sheet_name];
162
+ var sheetDataMap = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
163
+ let headerList = sheetDataMap[0];
164
+ headerList.forEach(hdr => {
165
+ this.headerList.push(hdr.trim());
166
+ });
167
+ this.sheetData = XLSX.utils.sheet_to_json(worksheet);
168
+ this.mappSheetData = XLSX.utils.sheet_to_json(worksheet);
169
+ this.fileLogIdn = 0;
170
+ console.log("this.headerList", this.headerList);
171
+ this.getHeaderMatch();
172
+ // const distinctSh = [...new Set(this.sheetData.map(x=>x.SHAPE))];
173
+ };
174
+ fileReader.readAsArrayBuffer(this.file);
175
+ }
176
+ setSetp(step) {
177
+ this.step = step;
178
+ if (step == 1) {
179
+ this.ngOnDestroy();
180
+ this.ngOnInit();
181
+ }
182
+ }
183
+ getHeaderMatch() {
184
+ this.show = true;
185
+ debugger;
186
+ this.stepMsg = 'Header verification in process ...';
187
+ // this.spinnerService.show();
188
+ let reqObj = {};
189
+ reqObj['formNme'] = 'fileUpload';
190
+ reqObj['attrList'] = this.headerList;
191
+ reqObj['fileIdn'] = this.fileType;
192
+ this.header["method"] = 'loadHeaderAttr';
193
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
194
+ if (response.status == 'SUCCESS') {
195
+ let result = response.result;
196
+ this.headerAttributeDtl = result.attrDetails || '';
197
+ console.log("this.headerAttributeDtl", this.headerAttributeDtl);
198
+ let headerListLnt = this.headerList.length;
199
+ this.totalmatch = result.totalmatch || 0;
200
+ if (this.headerAttributeDtl != '') {
201
+ this.attrStructureDtl = result.attrStructureDtl || [];
202
+ if (this.sheetData.length < 5)
203
+ this.defultDisplayLen = this.sheetData.length;
204
+ for (var i = 0; i < this.defultDisplayLen; i++)
205
+ this.defultDisplayObj[i] = this.sheetData[i];
206
+ let ignoreColumnLst = result.ignore_column || [];
207
+ ignoreColumnLst.forEach(hdrDsc => {
208
+ if (this.headerAttributeDtl[hdrDsc] != undefined) {
209
+ this.headerAttributeDtl[hdrDsc].ignore = 'Y';
210
+ headerListLnt--;
211
+ this.totalignore++;
212
+ if (this.headerAttributeDtl[hdrDsc].attr != "")
213
+ this.totalmatch--;
214
+ }
215
+ });
216
+ let isDate = false;
217
+ this.headerList.forEach(hdr => {
218
+ let hdrAttr = this.headerAttributeDtl[hdr] || {};
219
+ if (hdrAttr.dta_typ == 'd') {
220
+ this.dateFormatMap[hdr] = this.dateFormat;
221
+ isDate = true;
222
+ }
223
+ });
224
+ if (this.totalmatch == headerListLnt && isDate == false) {
225
+ this.ValidateFileHeaderMapping('N');
226
+ this.show = false;
227
+ this.step = 3;
228
+ }
229
+ else {
230
+ this.step = 2;
231
+ }
232
+ this.show = false;
233
+ }
234
+ else {
235
+ // this.flashMessagesService.show("Some problem in File Header Matching", { cssClass: 'alert-danger', timeout: 3000 });
236
+ }
237
+ //this.spinnerService.hide();
238
+ this.show = false;
239
+ }
240
+ else {
241
+ this.show = false;
242
+ //this.spinnerService.hide();
243
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-danger', timeout: 3000 });
244
+ }
245
+ }, error => {
246
+ // this.spinnerService.hide();
247
+ this.show = false;
248
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
249
+ });
250
+ }
251
+ updatecolumnstatue(hdr) {
252
+ var isIgnore = this.headerAttributeDtl[hdr].ignore || '';
253
+ if (isIgnore == 'Y') {
254
+ this.headerAttributeDtl[hdr].ignore = 'N';
255
+ this.totalignore--;
256
+ }
257
+ else {
258
+ this.totalignore++;
259
+ this.headerAttributeDtl[hdr].ignore = 'Y';
260
+ }
261
+ console.log(this.headerAttributeDtl[hdr]);
262
+ }
263
+ confirmsetHeaderMapp(hdr) {
264
+ this.maphdr = hdr;
265
+ let attr = this.headerAttributeDtl[hdr].attr;
266
+ this.attrStructureDtl.forEach(ele => {
267
+ if (ele.attr == attr) {
268
+ this.hdrmassage = this.headerAttributeDtl[hdr].attr + "(" + ele.print + ")";
269
+ }
270
+ });
271
+ document.getElementById('btnCofirmmaphdr').click();
272
+ }
273
+ CancelHeaderMapp() {
274
+ this.headerAttributeDtl[this.maphdr].attr = "";
275
+ }
276
+ setHeaderMapp() {
277
+ debugger;
278
+ let attr = this.headerAttributeDtl[this.maphdr].attr || '';
279
+ if (attr != '') {
280
+ let reqObj = {};
281
+ reqObj['formNme'] = 'fileUpload';
282
+ reqObj['optionaVal'] = this.maphdr;
283
+ reqObj['attr'] = attr;
284
+ console.log(JSON.stringify(reqObj));
285
+ this.header["method"] = 'addHeaderAttr';
286
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
287
+ console.log(response);
288
+ if (response.status == 'SUCCESS') {
289
+ let result = response.result || {};
290
+ let hdrDtl = result.attrDetails[this.maphdr] || '';
291
+ if (hdrDtl != '') {
292
+ this.totalmatch++;
293
+ this.headerAttributeDtl[this.maphdr] = hdrDtl;
294
+ }
295
+ else {
296
+ this.headerAttributeDtl[this.maphdr] = {
297
+ "attr": "",
298
+ "print": "",
299
+ "srt": "",
300
+ "dta_typ": "",
301
+ "attr_idn": ""
302
+ };
303
+ }
304
+ }
305
+ // this.spinnerService.hide();
306
+ }, error => {
307
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
308
+ });
309
+ }
310
+ else {
311
+ // this.flashMessagesService.show("Mapping attribute is empty please retry.", { cssClass: 'alert-danger', timeout: 3000 });
312
+ }
313
+ }
314
+ setRowDataMapp() {
315
+ if (!this.mappingskip) {
316
+ let rowMatchCount = 0;
317
+ this.charHeaderList = [];
318
+ debugger;
319
+ this.headerList.forEach(hdr => {
320
+ let attr = this.headerAttributeDtl[hdr].attr || '';
321
+ let attrType = this.headerAttributeDtl[hdr].dta_typ || '';
322
+ let isIgnore = this.headerAttributeDtl[hdr].ignore || '';
323
+ if (attr != '' && isIgnore != 'N' && attrType == 'c') {
324
+ debugger;
325
+ var distinctlist = Array.from(new Set(this.sheetData.map((item) => item[hdr])));
326
+ distinctlist = distinctlist.filter(function (e) { return e; });
327
+ if (distinctlist.length > 0) {
328
+ this.rowdistinctDataMap[attr] = distinctlist;
329
+ rowMatchCount = rowMatchCount + distinctlist.length;
330
+ this.gmatchedCount = rowMatchCount;
331
+ this.charHeaderList.push(hdr);
332
+ let attrDetails = this.attrStructureDtl.find(attrdtl => attrdtl.attr == attr) || {};
333
+ this.attributeDtlMap[attr] = attrDetails.prpList || [];
334
+ }
335
+ }
336
+ });
337
+ let reqObj = {};
338
+ reqObj['formNme'] = 'fileUpload';
339
+ reqObj['attrMap'] = this.rowdistinctDataMap;
340
+ console.log(JSON.stringify(reqObj));
341
+ this.header["method"] = 'loadHeaderAttrDtl';
342
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
343
+ // this.spinnerService.hide();
344
+ if (response.status == 'SUCCESS') {
345
+ let result = response.result;
346
+ console.log(result);
347
+ console.log(rowMatchCount);
348
+ debugger;
349
+ this.rowdatamapDetails = result.attrDetails || {};
350
+ this.gresultCount = result.totalmatch;
351
+ this.step = 3;
352
+ if (rowMatchCount == result.totalmatch) {
353
+ this.step = 4;
354
+ this.uploadFile();
355
+ }
356
+ else {
357
+ // this.flashMessagesService.show("please verify data mapping.", { cssClass: 'alert-danger', timeout: 3000 });
358
+ }
359
+ }
360
+ else {
361
+ // this.flashMessagesService.show("something go wrong in row data.", { cssClass: 'alert-danger', timeout: 3000 });
362
+ }
363
+ }, error => {
364
+ // this.spinnerService.hide();
365
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
366
+ });
367
+ }
368
+ else {
369
+ this.step = 4;
370
+ this.uploadFile();
371
+ }
372
+ }
373
+ confirmHeaderDetailsMapp(attr, attr_idn, optionval) {
374
+ this.dtlAttr = attr;
375
+ this.dtlattr_idn = attr_idn;
376
+ this.dtloptionval = optionval;
377
+ let val = this.rowdatamapDetails[this.dtlAttr][this.dtloptionval].val;
378
+ let attributeDtlList = this.attributeDtlMap[attr];
379
+ attributeDtlList.forEach(ele => {
380
+ if (ele.val == val) {
381
+ this.dtlmassage = val + "(" + ele.print + ")";
382
+ }
383
+ });
384
+ document.getElementById('btnCofirmmapdtl').click();
385
+ }
386
+ CancelHeaderDetailsMapp() {
387
+ this.rowdatamapDetails[this.dtlAttr][this.dtloptionval].val = "";
388
+ }
389
+ setHeaderDetailsMapp() {
390
+ let attrDtlVal = this.rowdatamapDetails[this.dtlAttr][this.dtloptionval].val || '';
391
+ if (attrDtlVal != '') {
392
+ let reqObj = {};
393
+ reqObj['formNme'] = 'fileUpload';
394
+ reqObj['optionaVal'] = this.dtloptionval;
395
+ reqObj['attr_idn'] = this.dtlattr_idn;
396
+ reqObj['attr'] = this.dtlAttr;
397
+ reqObj['attrVal'] = attrDtlVal;
398
+ this.header["method"] = 'addDetailAttr';
399
+ console.log(JSON.stringify(reqObj));
400
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
401
+ console.log("addDetailAttr", response);
402
+ if (response.status == 'SUCCESS') {
403
+ this.gresultCount++;
404
+ let result = response.result || {};
405
+ console.log(result.attrDetails);
406
+ let attrDetails = result.attrDetails || {};
407
+ this.rowdatamapDetails[this.dtlAttr][this.dtloptionval] = attrDetails[this.dtloptionval];
408
+ // this.spinnerService.hide();
409
+ }
410
+ // this.spinnerService.hide();
411
+ }, error => {
412
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
413
+ });
414
+ }
415
+ else {
416
+ // this.flashMessagesService.show("Mapping attribute is empty please retry.", { cssClass: 'alert-danger', timeout: 3000 });
417
+ }
418
+ }
419
+ onSubmit(formVal) {
420
+ var t = Object.keys(formVal.form.controls).forEach(field => {
421
+ const control = formVal.form.get(field);
422
+ });
423
+ this.saveFileOption(formVal.value);
424
+ }
425
+ saveFileOption(frmvals) {
426
+ // this.spinnerService.show();
427
+ let reqObj = {};
428
+ reqObj = { ...frmvals, column_format: this.colFormate, ignore_column: this.ignoreFormate };
429
+ reqObj['formNme'] = 'fileUpload';
430
+ console.log(JSON.stringify(reqObj));
431
+ debugger;
432
+ this.header["method"] = 'addFileOption';
433
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
434
+ if (response.status == 'SUCCESS') {
435
+ debugger;
436
+ let result = response.result || {};
437
+ this.fileOptionsList = result.fileOptionsList;
438
+ this.fileType = result.file_idn;
439
+ this.ValidateFileHeaderMapping('N');
440
+ // this.spinnerService.hide();
441
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
442
+ }
443
+ // this.spinnerService.hide();
444
+ }, error => {
445
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
446
+ });
447
+ }
448
+ addFileLog(fileIdn) {
449
+ debugger;
450
+ let reqObj = {};
451
+ reqObj['formNme'] = 'fileUpload';
452
+ reqObj['file_idn'] = fileIdn;
453
+ reqObj['file_status'] = "Header Inserted";
454
+ reqObj['validation_remarks'] = "Header validated";
455
+ reqObj['header_row'] = this.allcols;
456
+ reqObj['header_attr_row'] = this.colFormate;
457
+ this.header["method"] = 'addFileLog';
458
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
459
+ if (response.status == 'SUCCESS') {
460
+ debugger;
461
+ let result = response.result || {};
462
+ this.fileLogIdn = result.file_log_idn;
463
+ this.setRowDataMapp();
464
+ // this.spinnerService.hide();
465
+ // this.flashMessagesService.show("Header validated successfully", { cssClass: 'alert-success', timeout: 3000 });
466
+ }
467
+ // this.spinnerService.hide();
468
+ }, error => {
469
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
470
+ });
471
+ }
472
+ ValidateFileHeaderMapping(formatSave) {
473
+ // this.spinnerService.show();
474
+ this.show = true;
475
+ this.stepMsg = 'Header verification in process ...';
476
+ this.colFormate = [];
477
+ this.ignoreFormate = [];
478
+ this.allcols = [];
479
+ let isValidate = true;
480
+ this.headerList.forEach(hdr => {
481
+ let hdrDtl = this.headerAttributeDtl[hdr] || '';
482
+ if (hdrDtl.attr == '' && hdrDtl.ignore != 'Y') {
483
+ isValidate = false;
484
+ }
485
+ if (hdrDtl.attr != '' && hdrDtl.ignore != 'N') {
486
+ this.colFormate.push(hdrDtl.attr);
487
+ }
488
+ if (hdrDtl.ignore == 'Y') {
489
+ this.ignoreFormate.push(hdr);
490
+ }
491
+ this.allcols.push(hdr);
492
+ });
493
+ if (isValidate && (this.fileType == null || this.fileType == undefined || this.fileType == "")) {
494
+ // this.spinnerService.hide();
495
+ this.stepMsg = "";
496
+ document.getElementById('btnfileUploadModal').click();
497
+ this.step = 2;
498
+ return;
499
+ }
500
+ else {
501
+ if (isValidate) {
502
+ if (formatSave == 'Y') {
503
+ this.updatefileOption();
504
+ }
505
+ this.addFileLog(this.fileType);
506
+ }
507
+ else {
508
+ // this.spinnerService.hide();
509
+ // this.flashMessagesService.show("Please specify mapping or marke as ignore ", { cssClass: 'alert-danger', timeout: 3000 });
510
+ }
511
+ }
512
+ this.show = false;
513
+ }
514
+ updatefileOption() {
515
+ let reqObj = {};
516
+ reqObj['formNme'] = 'fileUpload';
517
+ reqObj['fileIdn'] = this.fileType;
518
+ reqObj['column_format'] = this.colFormate;
519
+ reqObj['ignore_column'] = this.ignoreFormate;
520
+ this.header["method"] = 'updateColumnFormat';
521
+ console.log(JSON.stringify(reqObj));
522
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
523
+ if (response.status == 'SUCCESS') {
524
+ }
525
+ }, error => {
526
+ });
527
+ }
528
+ uploadFile() {
529
+ this.dateFormat = this.dateFormat || 'dd/mm/yy';
530
+ this.delim = this.delim || '/';
531
+ this.show = true;
532
+ let dateValid = true;
533
+ let massage = "";
534
+ if (!this.mappingskip) {
535
+ this.stepMsg = "Data verification in process ...";
536
+ this.headerList.forEach(hdr => {
537
+ debugger;
538
+ let attr = this.headerAttributeDtl[hdr].attr || '';
539
+ let attrType = this.headerAttributeDtl[hdr].dta_typ || '';
540
+ let isIgnore = this.headerAttributeDtl[hdr].ignore || '';
541
+ if (isIgnore == 'Y') {
542
+ this.mappSheetData.map((rowData, i) => {
543
+ delete this.mappSheetData[i][hdr];
544
+ });
545
+ }
546
+ else {
547
+ if (attrType == 'c') {
548
+ this.mappSheetData.map((rowData, i) => {
549
+ if (this.charHeaderList.indexOf(hdr) != -1) {
550
+ let attrdtlVal = rowData[hdr] || '';
551
+ if (attrdtlVal != '') {
552
+ let attrDtlMapVal = this.rowdatamapDetails[attr][attrdtlVal].srt;
553
+ this.mappSheetData[i][attr] = attrDtlMapVal.toString();
554
+ }
555
+ if (attr != hdr)
556
+ delete this.mappSheetData[i][hdr];
557
+ }
558
+ });
559
+ }
560
+ else if (attrType == 'n') {
561
+ this.mappSheetData.map((rowData, i) => {
562
+ let attrdtlVal = rowData[hdr] || '';
563
+ if (attrdtlVal != '') {
564
+ debugger;
565
+ attrdtlVal = attrdtlVal.replace(/[^0-9.-]/g, "");
566
+ this.mappSheetData[i][attr] = attrdtlVal.toString();
567
+ }
568
+ if (attr != hdr)
569
+ delete this.mappSheetData[i][hdr];
570
+ });
571
+ }
572
+ else if (attrType == 'd') {
573
+ this.mappSheetData.map((rowData, i) => {
574
+ debugger;
575
+ let attrdtlVal = rowData[hdr] || '';
576
+ let dtFrm = this.dateFormatMap[hdr] || 'dd/mm/yy';
577
+ if (attrdtlVal != '')
578
+ attrdtlVal = this.cs.dateValidation(attrdtlVal, dtFrm);
579
+ if (attrdtlVal == 'invaild') {
580
+ dateValid = false;
581
+ massage = "Please check Date :" + rowData[hdr] + " Date Format :" + dtFrm;
582
+ }
583
+ this.mappSheetData[i][attr] = attrdtlVal.toString();
584
+ if (attr != hdr)
585
+ delete this.mappSheetData[i][hdr];
586
+ });
587
+ }
588
+ else if (attrType == 't') {
589
+ this.mappSheetData.map((rowData, i) => {
590
+ let attrdtlVal = rowData[hdr] || '';
591
+ this.mappSheetData[i][attr] = attrdtlVal.toString();
592
+ if (attr != hdr)
593
+ delete this.mappSheetData[i][hdr];
594
+ });
595
+ }
596
+ }
597
+ });
598
+ }
599
+ if (dateValid) {
600
+ let reqObj = {};
601
+ reqObj['formNme'] = 'fileUpload'; //this.route.snapshot.params['frmname'];
602
+ reqObj['file_log_idn'] = this.fileLogIdn;
603
+ reqObj['attr_data'] = this.mappSheetData;
604
+ reqObj['in_data'] = this.sheetData;
605
+ reqObj['dateformat'] = this.dateFormatMap;
606
+ this.header["method"] = 'fileUpload';
607
+ let url = "fileUpload/load";
608
+ if (this.mdl == 'inward') {
609
+ url = 'inward/loadFile';
610
+ reqObj['inward_idn'] = this.inward_idn;
611
+ }
612
+ // console.log(reqObj);
613
+ console.log(JSON.stringify(reqObj));
614
+ // console.log(this.header);
615
+ this.cs.loadiFile(reqObj, this.header, url).then((response) => {
616
+ if (response.status == 'SUCCESS') {
617
+ let result = response.result || {};
618
+ console.log(result);
619
+ this.show = false;
620
+ this.step = 4;
621
+ this.fileLogIdn = result.file_log_idn;
622
+ this.hdrIdn = result.hdrIdn;
623
+ this.getProgressFile(this.fileLogIdn);
624
+ this.lableFile = "File Sequence No. " + this.fileLogIdn + " Uploading in progress...";
625
+ // set file id to local storage
626
+ // AsyncLocalStorage.arguments('uploadedFileId', result.file_log_idn);
627
+ this.lable = "Pricing Sequence No. " + this.hdrIdn + " Price calculations in progress...";
628
+ this.getProgressPrice(this.hdrIdn);
629
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
630
+ }
631
+ this.show = false;
632
+ // this.spinnerService.hide();
633
+ }, error => {
634
+ this.show = false;
635
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
636
+ });
637
+ }
638
+ else {
639
+ this.ngOnInit();
640
+ // this.flashMessagesService.show(massage, { cssClass: 'alert-danger', timeout: 4000 });
641
+ }
642
+ console.log("mappSheetData", JSON.stringify(this.mappSheetData));
643
+ console.log("this.sheetData", JSON.stringify(this.sheetData));
644
+ }
645
+ changeMapping(hdrObj, hdr, attr) {
646
+ this.headerAttributeDtl[hdr].ignore = 'Y';
647
+ this.headerAttributeDtl[hdr].attr = '';
648
+ this.removeAttrOptVal(attr, hdr);
649
+ }
650
+ removeAttrOptVal(attr, optionaVal) {
651
+ let reqObj = {};
652
+ reqObj['formNme'] = 'fileUpload';
653
+ reqObj['attr'] = attr;
654
+ reqObj['optionaVal'] = optionaVal;
655
+ console.log(JSON.stringify(reqObj));
656
+ this.header["method"] = 'removeAttrOptVal';
657
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
658
+ if (response.status == 'SUCCESS') {
659
+ // this.spinnerService.hide();
660
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
661
+ }
662
+ // this.spinnerService.hide();
663
+ }, error => {
664
+ // this.spinnerService.hide();
665
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
666
+ });
667
+ }
668
+ removeDetailAttrOptVal(attrIdn, optionaVal, val, hdrAttr) {
669
+ this.rowdatamapDetails[hdrAttr][optionaVal].val = '';
670
+ let reqObj = {};
671
+ reqObj['formNme'] = 'fileUpload';
672
+ reqObj['attrVal'] = val;
673
+ reqObj['optionaVal'] = optionaVal;
674
+ reqObj['attr_idn'] = attrIdn;
675
+ console.log(JSON.stringify(reqObj));
676
+ this.header["method"] = 'removeAttrOptVal';
677
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
678
+ if (response.status == 'SUCCESS') {
679
+ // this.spinnerService.hide();
680
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
681
+ }
682
+ // this.spinnerService.hide();
683
+ }, error => {
684
+ // this.spinnerService.hide();
685
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
686
+ });
687
+ }
688
+ getProgressFile(fileLogIdn) {
689
+ let reqObj = {};
690
+ reqObj['formNme'] = 'fileUpload';
691
+ reqObj['file_log_idn'] = fileLogIdn; //this.fileLogIdn;
692
+ console.log(JSON.stringify(reqObj));
693
+ this.header["method"] = 'getFileLogStatus';
694
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
695
+ if (response.status == 'SUCCESS') {
696
+ this.clicked = true;
697
+ let result = response.result || {};
698
+ console.log(result);
699
+ this.sttsFile['C'] = result['C'];
700
+ this.sttsFile['P'] = result['P'];
701
+ this.sttsFile['E'] = result['E'];
702
+ this.sttsFile['T'] = result['T'];
703
+ this.sttsFile['I'] = result['I'];
704
+ this.step = 4;
705
+ this.totProgressFile = Math.ceil(parseFloat(result['C']) * 100 / parseFloat(result['T']));
706
+ this.recallFile(fileLogIdn);
707
+ console.log(this.totProgress);
708
+ // this.spinnerService.hide();
709
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
710
+ }
711
+ // this.spinnerService.hide();
712
+ }, error => {
713
+ // this.spinnerService.hide();
714
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
715
+ });
716
+ }
717
+ getProgressPrice(hdrIdn) {
718
+ // this.spinnerService.show();
719
+ let reqObj = {};
720
+ reqObj['formNme'] = 'fileUpload';
721
+ reqObj['seqNo'] = hdrIdn; //"846";//this.fileLogIdn;
722
+ console.log(JSON.stringify(reqObj));
723
+ this.header["method"] = 'getPriceStatus';
724
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
725
+ if (response.status == 'SUCCESS') {
726
+ this.clicked = true;
727
+ let result = response.result || {};
728
+ console.log(result);
729
+ this.stts['C'] = result['C'];
730
+ this.stts['P'] = result['P'];
731
+ this.stts['E'] = result['E'];
732
+ this.stts['T'] = result['T'];
733
+ this.step = 4;
734
+ this.totProgress = Math.ceil(parseFloat(result['C']) * 100 / parseFloat(result['T']));
735
+ this.recall(this.hdrIdn);
736
+ console.log(this.totProgress);
737
+ // this.spinnerService.hide();
738
+ // this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
739
+ }
740
+ // this.spinnerService.hide();
741
+ }, error => {
742
+ // this.spinnerService.hide();
743
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
744
+ });
745
+ }
746
+ recallFile(fileLogIdn) {
747
+ if (this.totProgressFile < 100) {
748
+ this.lastRefreshTimeFile = new Date();
749
+ this.timerfile =
750
+ setTimeout(() => {
751
+ this.getProgressFile(fileLogIdn);
752
+ }, 5000);
753
+ }
754
+ else {
755
+ clearTimeout(this.timerfile);
756
+ // this.PlanningComponent.getPacketsByHeaderId(hdrIdn);
757
+ // this.closebtn.nativeElement.click();
758
+ if (this.totProgressFile == 100 && this.totProgress == 100) {
759
+ document.getElementById('btnfileUploadModal').click();
760
+ this.router.navigate(['/pricing/rough/planingscreen/roughPlaningScreen'], { queryParams: { hdrId: this.hdrIdn } });
761
+ }
762
+ }
763
+ }
764
+ recall(hdrIdn) {
765
+ if (this.totProgress < 100) {
766
+ this.lastRefreshTime = new Date();
767
+ this.timerPrice =
768
+ setTimeout(() => {
769
+ this.getProgressPrice(hdrIdn);
770
+ }, 5000);
771
+ }
772
+ else {
773
+ clearTimeout(this.timerPrice);
774
+ if (this.totProgressFile == 100 && this.totProgress == 100) {
775
+ document.getElementById('btnfileUploadModal').click();
776
+ this.router.navigate(['/pricing/rough/planingscreen/roughPlaningScreen'], { queryParams: { hdrId: this.hdrIdn } });
777
+ }
778
+ }
779
+ }
780
+ SkipVerification() {
781
+ debugger;
782
+ this.mappingskip = true;
783
+ this.addFileLog(this.fileType);
784
+ }
785
+ SkipVerificationDtl() {
786
+ this.mappingskip = true;
787
+ this.step = 4;
788
+ this.uploadFile();
789
+ }
790
+ loadFileTypeData(fileUpload, mdl) {
791
+ this.sheetData = [];
792
+ this.headerAttributeDtl = {};
793
+ this.defultDisplayLen = 5;
794
+ this.defultDisplayObj = [];
795
+ this.attrStructureDtl = [];
796
+ this.headerList = [];
797
+ this.headerprp;
798
+ this.attrprp;
799
+ this.totalmatch = 0;
800
+ this.totalignore = 0;
801
+ this.pageDefination = {};
802
+ this.rowdatamapDetails = {};
803
+ this.rowdistinctDataMap = {};
804
+ this.charHeaderList = [];
805
+ this.attributeDtlMap = {};
806
+ this.mappSheetData = [];
807
+ this.statusList = [];
808
+ this.fileDetails = [];
809
+ this.fileTypeList = [];
810
+ this.fileOptionsList = [];
811
+ this.fileType;
812
+ this.nme;
813
+ this.typ;
814
+ this.description;
815
+ this.check_status = [];
816
+ this.pkt_status = [];
817
+ this.colFormate = [];
818
+ this.allcols = [];
819
+ this.fileLogIdn = 0;
820
+ this.show = false;
821
+ this.stepMsg = '';
822
+ this.stts = {};
823
+ this.clicked = false;
824
+ this.totProgress = 0;
825
+ this.totProgressFile = 0;
826
+ this.step = 1;
827
+ this.lable = "";
828
+ this.filenme = "";
829
+ let reqObj = {};
830
+ this.dateFormatMap = {};
831
+ let filetype = this.route.snapshot.params['filetype'] || '';
832
+ this.mdl = mdl;
833
+ this.filenme = this.route.snapshot.params['filetype'] || '';
834
+ this.mappingskip = false;
835
+ reqObj['formNme'] = fileUpload;
836
+ if (mdl != '')
837
+ reqObj['mdl'] = mdl;
838
+ if (filetype != '')
839
+ reqObj['filenme'] = filetype;
840
+ console.log(JSON.stringify(this.header));
841
+ console.log(JSON.stringify(reqObj));
842
+ this.header["method"] = 'loadFileUpload';
843
+ this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
844
+ if (response.status == 'SUCCESS') {
845
+ console.log(response);
846
+ debugger;
847
+ let result = response.result || {};
848
+ this.pageDefination = result.pageDefination;
849
+ this.statusList = result.statusList;
850
+ this.fileDetails = result.fileDetails;
851
+ this.fileTypeList = result.fileTypeList;
852
+ this.fileOptionsList = result.fileOptionsList || [];
853
+ if (this.fileOptionsList.length > 0)
854
+ this.fileType = this.fileOptionsList[0].k;
855
+ let addlAttr = this.fileOptionsList[0].addl_attr || {};
856
+ this.dateFormat = addlAttr.dateformat || 'dd/mm/yy';
857
+ this.delim = addlAttr.delim || '/';
858
+ this.statusList = result.statusList.map(option => ({
859
+ value: option.k,
860
+ label: option.v
861
+ }));
862
+ }
863
+ // this.spinnerService.hide();
864
+ }, error => {
865
+ // this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
866
+ });
867
+ }
868
+ ngOnInit() {
869
+ let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
870
+ let cUrl = this.router.url;
871
+ this.cDt = new Date();
872
+ this.header = {
873
+ 'clientkey': Cookie.get('_ck'),
874
+ 'Content-Type': 'application/json',
875
+ 'loginid': Cookie.get('_logid'),
876
+ 'modulekey': mdlk[cUrl.split('/')[1]],
877
+ 'source': 'qs'
878
+ };
879
+ this.route.params.subscribe((params) => {
880
+ let mdl = this.route.snapshot.params['grp'] || '';
881
+ this.loadFileTypeData('fileUpload', mdl);
882
+ });
883
+ }
884
+ stockInwardUpload(inwardDtl, mdl) {
885
+ this.inward_idn = inwardDtl.inward_idn;
886
+ this.inwardStockType = inwardDtl.stock_type;
887
+ this.mdl = mdl;
888
+ this.loadFileTypeData('fileUpload', mdl);
889
+ }
890
+ ngOnDestroy() {
891
+ if (this.timerfile != undefined)
892
+ clearTimeout(this.timerfile);
893
+ if (this.timerPrice != undefined)
894
+ clearTimeout(this.timerPrice);
895
+ }
896
+ setOptionsForMixToSingle() {
897
+ this.fileOptionsList = [
898
+ { "k": "696", "v": "Marketing Stock" }
899
+ ];
900
+ this.fileType = "696";
901
+ }
902
+ }
903
+ FileuploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileuploadComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.HttpClient }, { token: i3.CommanServiceService }], target: i0.ɵɵFactoryTarget.Component });
904
+ FileuploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: FileuploadComponent, selector: "app-fileupload", viewQueries: [{ propertyName: "closehdrbtn", first: true, predicate: ["closehdrbtn"], descendants: true }, { propertyName: "closedtlbtn", first: true, predicate: ["closedtlbtn"], descendants: true }, { propertyName: "Cofirmmapdtl", first: true, predicate: ["Cofirmmapdtl"], descendants: true }], ngImport: i0, template: "<div class=\"mt\" style=\"background: #fff;\">\r\n\r\n <div class=\"content-frame\">\r\n <p *ngIf=\"show\" class=\"loading-text\" style=\"z-index: 9999\"> {{stepMsg}} </p>\r\n\r\n <div class=\"innerD\">\r\n <div class=\"mt-element-step\">\r\n <div class=\"row step-thin\">\r\n\r\n <div class=\"col-md-2 bg-grey mt-step-col\" [ngClass]=\"{'done':step==1 ? 'done':''}\"\r\n (click)=setSetp(1)>\r\n <div class=\"mt-step-number bg-white font-grey\">1</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Browse</div>\r\n </div>\r\n <div class=\"col-md-4 bg-grey mt-step-col\" [ngClass]=\"{'done':step==2 ? 'done':''}\"\r\n (click)=setSetp(2)>\r\n <div class=\"mt-step-number bg-white font-grey\">2</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Header Verification</div>\r\n </div>\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==3 ? 'done':''}\"\r\n (click)=setSetp(3)>\r\n <div class=\"mt-step-number bg-white font-grey\">3</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Data Verification</div>\r\n </div>\r\n\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==4 ? 'done':''}\"\r\n (click)=setSetp(4)>\r\n <div class=\"mt-step-number bg-white font-grey\">4</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Uploading..</div>\r\n </div>\r\n </div>\r\n <div class=\"row upload\" *ngIf=\"step==1\">\r\n\r\n\r\n <div class=\"col-md-offset-3 col-md-3\" style=\"margin-top: 15px;\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-4 control-label\" style=\"padding: 5px;\">File Type :</label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"fileType\" [(ngModel)]=\"fileType\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileOptionsList\" value=\"{{file?.k}}\">{{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-md-2\">\r\n <a class=\"fileinput-wrapper btn btn-default fileinput btn-primary\"\r\n style=\"background: #3a5898\"><span>Browse file</span>\r\n <input type=\"file\" class=\"fileinput btn-primary\" name=\"filename\" id=\"filename\"\r\n title=\"Browse file\" accept=\".xlsx,.csv\" (change)=\"incomingfile($event)\"\r\n style=\"left: -163.75px; top: 9px;\"></a>\r\n\r\n </div>\r\n\r\n <!-- <label class=\"control-label\">Upload File : &nbsp;&nbsp;&nbsp;</label>\r\n\r\n <input type=\"file\" class=\"fileinput btn-primary\" accept=\".xlsx,.csv\" name=\"filename\" id=\"filename\"\r\n (change)=\"incomingfile($event)\" title=\"Browse file\"> -->\r\n\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==2\">\r\n <div class=\"row\">\r\n <div class=\"col-md-1\">\r\n Total Match : {{totalmatch}}\r\n </div>\r\n <div class=\"col-md-1\">\r\n Total Ignore : {{totalignore}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"row col-md-12\" style=\"overflow: auto;width: 100%;\">\r\n <table class=\"fileuploadview\">\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th [ngClass]=\"{\r\n 'match':headerAttributeDtl[hdr].attr!='' && headerAttributeDtl[hdr].ignore!='Y',\r\n 'ignore':headerAttributeDtl[hdr].ignore=='Y',\r\n 'thbg':headerAttributeDtl[hdr].attr=='' && headerAttributeDtl[hdr].ignore!='Y'\r\n }\" (click)=\"updatecolumnstatue(hdr)\">{{hdr}}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr==''\">\r\n <!-- <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr,$event.target)\"> -->\r\n <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr)\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let attrDtl of attrStructureDtl\"\r\n value=\"{{attrDtl?.attr}}\">{{attrDtl?.attr}}</option>\r\n </select>\r\n </ng-container>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr!=''\">\r\n {{headerAttributeDtl[hdr].attr}}\r\n \r\n </ng-container>\r\n\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].dta_typ=='d'\">\r\n <select class=\"select-control\" name=\"{{dateFormatMap[hdr]}}\"\r\n [(ngModel)]=\"dateFormatMap[hdr]\"\r\n >\r\n <option *ngFor=\"let dteFmt of dateFormatList\"\r\n value=\"{{dteFmt?.k}}\">{{dteFmt?.v}}</option>\r\n </select>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr> \r\n <tr *ngFor=\"let rowDis of defultDisplayObj ;\">\r\n <td *ngFor=\"let hdr of headerList ;\">\r\n {{rowDis[hdr]}}\r\n </td>\r\n\r\n </tr>\r\n\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerification()\">Skip</button>\r\n &nbsp; &nbsp;\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"ValidateFileHeaderMapping('Y')\">Verify</button>\r\n\r\n \r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row upload \" *ngIf=\"step==3\">\r\n <div class=\"row table-responsive col-md-12\">\r\n <table cellspacing=\"10\" class=\"displayTable fileuploadview\">\r\n <ng-container *ngFor=\"let hdr of charHeaderList ;let j=index;\">\r\n\r\n <tr>\r\n <th style=\"color:white;border: 1px solid white\">\r\n {{hdr}}({{headerAttributeDtl[hdr].attr}})</th>\r\n <td [ngClass]=\"{'even':j%2==0,'odd':j%2==1}\">\r\n <div class=\"row\" style=\"display: flex;\">\r\n <ng-container\r\n *ngFor=\"let attrVal of rowdistinctDataMap[headerAttributeDtl[hdr].attr];\">\r\n <div style=\"width:160px;margin-right: 1px\"\r\n [ngClass]=\"{'matchedUl':rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val !=''}\">\r\n <ul style=\"list-style: none;text-align:left\">\r\n <li> {{attrVal}} </li>\r\n <li>\r\n <select\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val==''\"\r\n class=\"select-control\"\r\n name=\"{{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}}\"\r\n [(ngModel)]=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val\"\r\n (change)=\"confirmHeaderDetailsMapp(headerAttributeDtl[hdr].attr,headerAttributeDtl[hdr].attr_idn,attrVal)\">\r\n <option value=\"\">--select--</option>\r\n <option\r\n *ngFor=\"let attrdtlmap of attributeDtlMap[headerAttributeDtl[hdr].attr]\"\r\n value=\"{{attrdtlmap?.val}}\">{{attrdtlmap?.val}}\r\n </option>\r\n </select>\r\n\r\n <span\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val!=''\">\r\n {{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}} \r\n &nbsp;&nbsp; <i (click)=\"removeDetailAttrOptVal(headerAttributeDtl[hdr].attr_idn,attrVal,rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val,[headerAttributeDtl[hdr].attr])\" class=\"fa fa-times\" aria-hidden=\"true\" style=\"color: red;cursor: pointer;\"></i>\r\n </span>\r\n \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerificationDtl()\">Skip</button>\r\n &nbsp; &nbsp;\r\n <button type=\"button\" class=\"btn btn-success pull-right\" style=\"margin: 5px\"\r\n (click)=\"uploadFile()\" [disabled]=\"gmatchedCount!=gresultCount\">Upload</button>\r\n \r\n \r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==4\">\r\n\r\n <div class=\"row\">\r\n\r\n </div>\r\n\r\n <div class=\"row\">\r\n\r\n <p *ngIf=\"step==4\" style=\"margin-left: 15px;color:green;font-size: 20px;text-align: left\">\r\n {{lableFile}}\r\n <span style=\"font-size: 14px;\" *ngIf=\"lastRefreshTimeFile != null\">Last\r\n refresh time :\r\n ({{lastRefreshTimeFile | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgressFile+'%'} \">\r\n {{totProgressFile}} %\r\n </div>\r\n </div>\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{sttsFile['C']}}\r\n &nbsp;&nbsp;&nbsp; Pending : {{sttsFile['P']}} &nbsp;&nbsp;&nbsp; Error :\r\n {{sttsFile['E']}}&nbsp;&nbsp;&nbsp; Invaild Status :\r\n {{sttsFile['I']}}\r\n &nbsp;&nbsp;&nbsp; Total : {{sttsFile['T']}}</strong></p>\r\n\r\n\r\n <p *ngIf=\"step==4\"\r\n style=\"margin-left: 15px;color:green;font-size: 20px;margin-top: 15px;text-align: left\">\r\n {{lable}}\r\n <span style=\"font-size: 12px;margin-left: 20px;color: black;\"\r\n *ngIf=\"lastRefreshTime != null\">Last\r\n refresh time :\r\n ({{lastRefreshTime | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgress+'%'} \">\r\n {{totProgress}} %\r\n </div>\r\n </div>\r\n\r\n <!-- <button type=\"button\" class=\"btn btn-success text-center\" style=\"margin: 5px\"\r\n (click)=\"checkUploadStt()\">Check\r\n Status</button> -->\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{stts['C']}}\r\n &nbsp;&nbsp;&nbsp; Pending : {{stts['P']}} &nbsp;&nbsp;&nbsp; Error : {{stts['E']}}\r\n &nbsp;&nbsp;&nbsp; Total : {{stts['T']}}</strong></p>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n<div class=\"modal\" id=\"fileUploadModal\" tabindex=\"-1\" style=\"z-index: 999999\" role=\"dialog\"\r\n aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog \">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" #fileUploadclsbtn>\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Add file upload option</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n <div class=\"col-md-12\">\r\n <form class=\"form-horizontal\" role=\"form\" #f=\"ngForm\" (ngSubmit)=\"onSubmit(f)\" name=\"appForm\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Name\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nme\" name=\"nme\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Description\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"description\"\r\n name=\"description\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Type\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"typ\" [(ngModel)]=\"typ\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileTypeList\" value=\"{{file?.k}}\">\r\n {{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Check status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"check_status\" name=\"check_status\" [multiple]=\"true\"\r\n [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Packet status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"pkt_status\" name=\"pkt_status\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" #fileUploadclsbtn>Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"onSubmit(f)\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"Cofirmmaphdr\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{maphdr}}</b> To Attribute <b>{{hdrmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" (click)=\"CancelHeaderMapp()\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderMapp();\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"Cofirmmapdtl\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{dtloptionval}}</b> To Attribute <b> {{dtlAttr}} </b> with AttributeDetail <b>{{dtlmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" (click)=\"CancelHeaderDetailsMapp()\">Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderDetailsMapp()\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n<button id=\"btnfileUploadModal\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#fileUploadModal\"></button>\r\n\r\n<button id=\"btnCofirmmaphdr\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmaphdr\"></button>\r\n<button id=\"btnCofirmmapdtl\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmapdtl\"></button>\r\n\r\n\r\n\r\n<!-- <div class=\"centered\">\r\n <div id=\"divSpinner\" class=\"spinner loading\">\r\n <div class=\"loading-text\">Loading ...</div>\r\n </div>\r\n\r\n <button (click)=\"test()\" id=\"btnLoadRecords\" style=\"cursor:pointer;position: absolute; top: 52%; left: 45%;\">Load Records</button>\r\n </div> -->", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px;background:#1b1e24}.innerD{min-height:calc(100vh - 100px);background:#fff}.mt-element-step .row{margin:0}.mt-element-step .step-thin .mt-step-col{padding-top:10px;padding-bottom:10px}.mt-element-step .step-thin .mt-step-number{font-size:22px;border-radius:50%!important;float:left;margin:auto;padding:3px 14px}.mt-element-step .step-thin .mt-step-title{font-size:20px;font-weight:100;padding-left:60px;margin-top:-4px}.mt-element-step .step-thin .mt-step-content{padding-left:60px;margin-top:-5px}.mt-element-step .step-thin .done{background-color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-number{color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-content,.mt-element-step .step-thin .done .mt-step-title{color:#fff!important}.font-grey-cascade{color:#95a5a6!important}.font-grey{color:#e5e5e5!important}.bg-grey{background:#E5E5E5!important}.bg-white{background:#fff!important}.mt-element-step .upload{text-align:center;padding-top:15px;padding-bottom:10px}.fileuploadview{width:calc(100% - 1px)}.fileuploadview th{padding:2px 5px;font-weight:700;font-size:12px;color:#000;height:35px;white-space:nowrap;text-align:center;vertical-align:middle}.fileuploadview tr{background-color:#fff}.fileuploadview td{height:25px;white-space:nowrap;text-align:center;font-size:9pt;padding:5px;border:1px solid white}.match{background-color:#95b75d!important}.ignore{background-color:#ff7a7a!important}.thbg{background-color:#e5e5e5!important}.select-control{height:20px;font-size:12px;line-height:18px;box-shadow:none;border:1px solid #D5D5D5;background:#F9F9F9;display:block;width:100%;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.displayTable td.odd:hover,.displayTable td.even:hover{background-color:#e3f6ff}.displayTable td.odd{background-color:#efefef}.displayTable td.even{background-color:#f8f8f8}.displayTable td a:BEFORE{color:green}.displayTable th a{text-align:center;color:#000}.displayTable th a:visited{text-align:center;color:#fff}.displayTable th a:hover{color:#fc0;background-color:transparent;text-align:center}.matchedUl{background-color:#beccd2}.loading-text{width:400px;position:absolute;top:calc(50% - 370px);left:calc(50% - 180px);text-align:center;color:#00f;font-size:25px}\n"], components: [{ type: i4.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }], pipes: { "date": i5.DatePipe } });
905
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileuploadComponent, decorators: [{
906
+ type: Component,
907
+ args: [{ selector: 'app-fileupload', template: "<div class=\"mt\" style=\"background: #fff;\">\r\n\r\n <div class=\"content-frame\">\r\n <p *ngIf=\"show\" class=\"loading-text\" style=\"z-index: 9999\"> {{stepMsg}} </p>\r\n\r\n <div class=\"innerD\">\r\n <div class=\"mt-element-step\">\r\n <div class=\"row step-thin\">\r\n\r\n <div class=\"col-md-2 bg-grey mt-step-col\" [ngClass]=\"{'done':step==1 ? 'done':''}\"\r\n (click)=setSetp(1)>\r\n <div class=\"mt-step-number bg-white font-grey\">1</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Browse</div>\r\n </div>\r\n <div class=\"col-md-4 bg-grey mt-step-col\" [ngClass]=\"{'done':step==2 ? 'done':''}\"\r\n (click)=setSetp(2)>\r\n <div class=\"mt-step-number bg-white font-grey\">2</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Header Verification</div>\r\n </div>\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==3 ? 'done':''}\"\r\n (click)=setSetp(3)>\r\n <div class=\"mt-step-number bg-white font-grey\">3</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Data Verification</div>\r\n </div>\r\n\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==4 ? 'done':''}\"\r\n (click)=setSetp(4)>\r\n <div class=\"mt-step-number bg-white font-grey\">4</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Uploading..</div>\r\n </div>\r\n </div>\r\n <div class=\"row upload\" *ngIf=\"step==1\">\r\n\r\n\r\n <div class=\"col-md-offset-3 col-md-3\" style=\"margin-top: 15px;\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-4 control-label\" style=\"padding: 5px;\">File Type :</label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"fileType\" [(ngModel)]=\"fileType\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileOptionsList\" value=\"{{file?.k}}\">{{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-md-2\">\r\n <a class=\"fileinput-wrapper btn btn-default fileinput btn-primary\"\r\n style=\"background: #3a5898\"><span>Browse file</span>\r\n <input type=\"file\" class=\"fileinput btn-primary\" name=\"filename\" id=\"filename\"\r\n title=\"Browse file\" accept=\".xlsx,.csv\" (change)=\"incomingfile($event)\"\r\n style=\"left: -163.75px; top: 9px;\"></a>\r\n\r\n </div>\r\n\r\n <!-- <label class=\"control-label\">Upload File : &nbsp;&nbsp;&nbsp;</label>\r\n\r\n <input type=\"file\" class=\"fileinput btn-primary\" accept=\".xlsx,.csv\" name=\"filename\" id=\"filename\"\r\n (change)=\"incomingfile($event)\" title=\"Browse file\"> -->\r\n\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==2\">\r\n <div class=\"row\">\r\n <div class=\"col-md-1\">\r\n Total Match : {{totalmatch}}\r\n </div>\r\n <div class=\"col-md-1\">\r\n Total Ignore : {{totalignore}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"row col-md-12\" style=\"overflow: auto;width: 100%;\">\r\n <table class=\"fileuploadview\">\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th [ngClass]=\"{\r\n 'match':headerAttributeDtl[hdr].attr!='' && headerAttributeDtl[hdr].ignore!='Y',\r\n 'ignore':headerAttributeDtl[hdr].ignore=='Y',\r\n 'thbg':headerAttributeDtl[hdr].attr=='' && headerAttributeDtl[hdr].ignore!='Y'\r\n }\" (click)=\"updatecolumnstatue(hdr)\">{{hdr}}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr==''\">\r\n <!-- <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr,$event.target)\"> -->\r\n <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr)\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let attrDtl of attrStructureDtl\"\r\n value=\"{{attrDtl?.attr}}\">{{attrDtl?.attr}}</option>\r\n </select>\r\n </ng-container>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr!=''\">\r\n {{headerAttributeDtl[hdr].attr}}\r\n \r\n </ng-container>\r\n\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].dta_typ=='d'\">\r\n <select class=\"select-control\" name=\"{{dateFormatMap[hdr]}}\"\r\n [(ngModel)]=\"dateFormatMap[hdr]\"\r\n >\r\n <option *ngFor=\"let dteFmt of dateFormatList\"\r\n value=\"{{dteFmt?.k}}\">{{dteFmt?.v}}</option>\r\n </select>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr> \r\n <tr *ngFor=\"let rowDis of defultDisplayObj ;\">\r\n <td *ngFor=\"let hdr of headerList ;\">\r\n {{rowDis[hdr]}}\r\n </td>\r\n\r\n </tr>\r\n\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerification()\">Skip</button>\r\n &nbsp; &nbsp;\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"ValidateFileHeaderMapping('Y')\">Verify</button>\r\n\r\n \r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row upload \" *ngIf=\"step==3\">\r\n <div class=\"row table-responsive col-md-12\">\r\n <table cellspacing=\"10\" class=\"displayTable fileuploadview\">\r\n <ng-container *ngFor=\"let hdr of charHeaderList ;let j=index;\">\r\n\r\n <tr>\r\n <th style=\"color:white;border: 1px solid white\">\r\n {{hdr}}({{headerAttributeDtl[hdr].attr}})</th>\r\n <td [ngClass]=\"{'even':j%2==0,'odd':j%2==1}\">\r\n <div class=\"row\" style=\"display: flex;\">\r\n <ng-container\r\n *ngFor=\"let attrVal of rowdistinctDataMap[headerAttributeDtl[hdr].attr];\">\r\n <div style=\"width:160px;margin-right: 1px\"\r\n [ngClass]=\"{'matchedUl':rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val !=''}\">\r\n <ul style=\"list-style: none;text-align:left\">\r\n <li> {{attrVal}} </li>\r\n <li>\r\n <select\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val==''\"\r\n class=\"select-control\"\r\n name=\"{{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}}\"\r\n [(ngModel)]=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val\"\r\n (change)=\"confirmHeaderDetailsMapp(headerAttributeDtl[hdr].attr,headerAttributeDtl[hdr].attr_idn,attrVal)\">\r\n <option value=\"\">--select--</option>\r\n <option\r\n *ngFor=\"let attrdtlmap of attributeDtlMap[headerAttributeDtl[hdr].attr]\"\r\n value=\"{{attrdtlmap?.val}}\">{{attrdtlmap?.val}}\r\n </option>\r\n </select>\r\n\r\n <span\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val!=''\">\r\n {{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}} \r\n &nbsp;&nbsp; <i (click)=\"removeDetailAttrOptVal(headerAttributeDtl[hdr].attr_idn,attrVal,rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val,[headerAttributeDtl[hdr].attr])\" class=\"fa fa-times\" aria-hidden=\"true\" style=\"color: red;cursor: pointer;\"></i>\r\n </span>\r\n \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerificationDtl()\">Skip</button>\r\n &nbsp; &nbsp;\r\n <button type=\"button\" class=\"btn btn-success pull-right\" style=\"margin: 5px\"\r\n (click)=\"uploadFile()\" [disabled]=\"gmatchedCount!=gresultCount\">Upload</button>\r\n \r\n \r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==4\">\r\n\r\n <div class=\"row\">\r\n\r\n </div>\r\n\r\n <div class=\"row\">\r\n\r\n <p *ngIf=\"step==4\" style=\"margin-left: 15px;color:green;font-size: 20px;text-align: left\">\r\n {{lableFile}}\r\n <span style=\"font-size: 14px;\" *ngIf=\"lastRefreshTimeFile != null\">Last\r\n refresh time :\r\n ({{lastRefreshTimeFile | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgressFile+'%'} \">\r\n {{totProgressFile}} %\r\n </div>\r\n </div>\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{sttsFile['C']}}\r\n &nbsp;&nbsp;&nbsp; Pending : {{sttsFile['P']}} &nbsp;&nbsp;&nbsp; Error :\r\n {{sttsFile['E']}}&nbsp;&nbsp;&nbsp; Invaild Status :\r\n {{sttsFile['I']}}\r\n &nbsp;&nbsp;&nbsp; Total : {{sttsFile['T']}}</strong></p>\r\n\r\n\r\n <p *ngIf=\"step==4\"\r\n style=\"margin-left: 15px;color:green;font-size: 20px;margin-top: 15px;text-align: left\">\r\n {{lable}}\r\n <span style=\"font-size: 12px;margin-left: 20px;color: black;\"\r\n *ngIf=\"lastRefreshTime != null\">Last\r\n refresh time :\r\n ({{lastRefreshTime | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgress+'%'} \">\r\n {{totProgress}} %\r\n </div>\r\n </div>\r\n\r\n <!-- <button type=\"button\" class=\"btn btn-success text-center\" style=\"margin: 5px\"\r\n (click)=\"checkUploadStt()\">Check\r\n Status</button> -->\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{stts['C']}}\r\n &nbsp;&nbsp;&nbsp; Pending : {{stts['P']}} &nbsp;&nbsp;&nbsp; Error : {{stts['E']}}\r\n &nbsp;&nbsp;&nbsp; Total : {{stts['T']}}</strong></p>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n<div class=\"modal\" id=\"fileUploadModal\" tabindex=\"-1\" style=\"z-index: 999999\" role=\"dialog\"\r\n aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog \">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" #fileUploadclsbtn>\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Add file upload option</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n <div class=\"col-md-12\">\r\n <form class=\"form-horizontal\" role=\"form\" #f=\"ngForm\" (ngSubmit)=\"onSubmit(f)\" name=\"appForm\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Name\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nme\" name=\"nme\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Description\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"description\"\r\n name=\"description\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Type\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"typ\" [(ngModel)]=\"typ\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileTypeList\" value=\"{{file?.k}}\">\r\n {{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Check status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"check_status\" name=\"check_status\" [multiple]=\"true\"\r\n [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Packet status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"pkt_status\" name=\"pkt_status\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" #fileUploadclsbtn>Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"onSubmit(f)\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"Cofirmmaphdr\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{maphdr}}</b> To Attribute <b>{{hdrmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" (click)=\"CancelHeaderMapp()\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderMapp();\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"Cofirmmapdtl\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{dtloptionval}}</b> To Attribute <b> {{dtlAttr}} </b> with AttributeDetail <b>{{dtlmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" (click)=\"CancelHeaderDetailsMapp()\">Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderDetailsMapp()\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n<button id=\"btnfileUploadModal\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#fileUploadModal\"></button>\r\n\r\n<button id=\"btnCofirmmaphdr\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmaphdr\"></button>\r\n<button id=\"btnCofirmmapdtl\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmapdtl\"></button>\r\n\r\n\r\n\r\n<!-- <div class=\"centered\">\r\n <div id=\"divSpinner\" class=\"spinner loading\">\r\n <div class=\"loading-text\">Loading ...</div>\r\n </div>\r\n\r\n <button (click)=\"test()\" id=\"btnLoadRecords\" style=\"cursor:pointer;position: absolute; top: 52%; left: 45%;\">Load Records</button>\r\n </div> -->", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px;background:#1b1e24}.innerD{min-height:calc(100vh - 100px);background:#fff}.mt-element-step .row{margin:0}.mt-element-step .step-thin .mt-step-col{padding-top:10px;padding-bottom:10px}.mt-element-step .step-thin .mt-step-number{font-size:22px;border-radius:50%!important;float:left;margin:auto;padding:3px 14px}.mt-element-step .step-thin .mt-step-title{font-size:20px;font-weight:100;padding-left:60px;margin-top:-4px}.mt-element-step .step-thin .mt-step-content{padding-left:60px;margin-top:-5px}.mt-element-step .step-thin .done{background-color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-number{color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-content,.mt-element-step .step-thin .done .mt-step-title{color:#fff!important}.font-grey-cascade{color:#95a5a6!important}.font-grey{color:#e5e5e5!important}.bg-grey{background:#E5E5E5!important}.bg-white{background:#fff!important}.mt-element-step .upload{text-align:center;padding-top:15px;padding-bottom:10px}.fileuploadview{width:calc(100% - 1px)}.fileuploadview th{padding:2px 5px;font-weight:700;font-size:12px;color:#000;height:35px;white-space:nowrap;text-align:center;vertical-align:middle}.fileuploadview tr{background-color:#fff}.fileuploadview td{height:25px;white-space:nowrap;text-align:center;font-size:9pt;padding:5px;border:1px solid white}.match{background-color:#95b75d!important}.ignore{background-color:#ff7a7a!important}.thbg{background-color:#e5e5e5!important}.select-control{height:20px;font-size:12px;line-height:18px;box-shadow:none;border:1px solid #D5D5D5;background:#F9F9F9;display:block;width:100%;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.displayTable td.odd:hover,.displayTable td.even:hover{background-color:#e3f6ff}.displayTable td.odd{background-color:#efefef}.displayTable td.even{background-color:#f8f8f8}.displayTable td a:BEFORE{color:green}.displayTable th a{text-align:center;color:#000}.displayTable th a:visited{text-align:center;color:#fff}.displayTable th a:hover{color:#fc0;background-color:transparent;text-align:center}.matchedUl{background-color:#beccd2}.loading-text{width:400px;position:absolute;top:calc(50% - 370px);left:calc(50% - 180px);text-align:center;color:#00f;font-size:25px}\n"] }]
908
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.HttpClient }, { type: i3.CommanServiceService }]; }, propDecorators: { closehdrbtn: [{
909
+ type: ViewChild,
910
+ args: ['closehdrbtn']
911
+ }], closedtlbtn: [{
912
+ type: ViewChild,
913
+ args: ['closedtlbtn']
914
+ }], Cofirmmapdtl: [{
915
+ type: ViewChild,
916
+ args: ['Cofirmmapdtl']
917
+ }] } });
918
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lei1saWIvc3JjL2xpYi9maWxlLXVwbG9hZC9maWxldXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V6LWxpYi9zcmMvbGliL2ZpbGUtdXBsb2FkL2ZpbGV1cGxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFekUsaUVBQWlFO0FBQ2pFLGtFQUFrRTtBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFNakQsbUNBQW1DO0FBQ25DLHlDQUF5QztBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUk3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFDekMsbURBQW1EO0FBU25ELE1BQU0sT0FBTyxtQkFBbUI7SUF5RDlCLFlBQ1MsTUFBYyxFQUNiLEtBQXFCO0lBQzdCLHNEQUFzRDtJQUN0RCxvREFBb0Q7SUFDNUMsSUFBZ0IsRUFDaEIsRUFBd0I7UUFMekIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNiLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBR3JCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsT0FBRSxHQUFGLEVBQUUsQ0FBc0I7UUExRGxDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixpQkFBWSxHQUFTLElBQUksQ0FBQztRQUMxQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHFCQUFnQixH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QyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0csWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuLy8gaW1wb3J0IHsgRmxhc2hNZXNzYWdlc1NlcnZpY2UgfSBmcm9tICdhbmd1bGFyMi1mbGFzaC1tZXNzYWdlcydcclxuLy8gaW1wb3J0IHsgTmc0TG9hZGluZ1NwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnbmc0LWxvYWRpbmctc3Bpbm5lcic7XHJcbmltcG9ydCB7IENvb2tpZSB9IGZyb20gJ25nMi1jb29raWVzL25nMi1jb29raWVzJztcclxuLy8gaW1wb3J0IHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9odHRwJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBDb21tYW5TZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uL2NvbW1hbi1zZXJ2aWNlL2NvbW1hbi1zZXJ2aWNlLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3RzLXhsc3gnO1xyXG4vLyBpbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gveGxzeC5tanMnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5cclxuLy8gaW1wb3J0IHsgVXBsb2FkU2VydmljZVNlcnZpY2UgfSBmcm9tICdzcmMvYXBwL2NvbXBvbmVudHMvZmlsZXVwbG9hZC1tb2R1bGUvdXBsb2FkLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZGFsRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCdcclxuaW1wb3J0IHsgZG9jdW1lbnQgfSBmcm9tICduZ3gtYm9vdHN0cmFwJztcclxuLy8gaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdhc3luY19ob29rcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1maWxldXBsb2FkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZXVwbG9hZC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZXVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Nsb3NlaGRyYnRuJykgY2xvc2VoZHJidG46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnY2xvc2VkdGxidG4nKSBjbG9zZWR0bGJ0bjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdDb2Zpcm1tYXBkdGwnKSBDb2Zpcm1tYXBkdGw6IE1vZGFsRGlyZWN0aXZlO1xyXG4gIGhlYWRlciA9IHt9O1xyXG4gIGZpbGVUb1VwbG9hZDogRmlsZSA9IG51bGw7XHJcbiAgZmlsZU5hbWUgPSBcIlwiO1xyXG4gIGNEdDtcclxuICBzdGVwID0gMTtcclxuICBzaGVldERhdGEgPSBbXTtcclxuICBoZWFkZXJBdHRyaWJ1dGVEdGwgPSB7fTtcclxuICBkZWZ1bHREaXNwbGF5TGVuID0gNTtcclxuICBkZWZ1bHREaXNwbGF5T2JqID0gW107XHJcbiAgYXR0clN0cnVjdHVyZUR0bCA9IFtdO1xyXG4gIGhlYWRlckxpc3QgPSBbXTtcclxuICBoZWFkZXJwcnA7XHJcbiAgYXR0cnBycDtcclxuICB0b3RhbG1hdGNoID0gMDtcclxuICB0b3RhbGlnbm9yZSA9IDA7XHJcbiAgcGFnZURlZmluYXRpb24gPSB7fTtcclxuICByb3dkYXRhbWFwRGV0YWlscyA9IHt9O1xyXG4gIHJvd2Rpc3RpbmN0RGF0YU1hcCA9IHt9O1xyXG4gIGNoYXJIZWFkZXJMaXN0ID0gW107XHJcbiAgYXR0cmlidXRlRHRsTWFwID0ge307XHJcbiAgbWFwcFNoZWV0RGF0YSA9IFtdO1xyXG4gIGxhYmxlID0gXCJcIjtcclxuICBsYWJsZUZpbGUgPSBcIlwiO1xyXG4gIHN0YXR1c0xpc3QgPSBbXTtcclxuICBmaWxlRGV0YWlscyA9IFtdO1xyXG4gIGZpbGVUeXBlTGlzdCA9IFtdO1xyXG4gIGZpbGVPcHRpb25zTGlzdCA9IFtdO1xyXG4gIGZpbGVUeXBlO1xyXG4gIG5tZTtcclxuICB0eXA7XHJcbiAgbWRsO1xyXG4gIGRlc2NyaXB0aW9uO1xyXG4gIGNoZWNrX3N0YXR1cyA9IFtdO1xyXG4gIHBrdF9zdGF0dXMgPSBbXTtcclxuICBjb2xGb3JtYXRlID0gW107XHJcbiAgaWdub3JlRm9ybWF0ZSA9IFtdO1xyXG4gIGFsbGNvbHMgPSBbXTtcclxuICBmaWxlTG9nSWRuID0gMDtcclxuICBzaG93ID0gZmFsc2U7XHJcbiAgc3RlcE1zZyA9ICcnO1xyXG4gIHRpbWVyZmlsZTtcclxuICB0aW1lclByaWNlO1xyXG4gIGRhdGVGb3JtYXQ7XHJcbiAgZGVsaW07XHJcbiAgZGF0ZUZvcm1hdE1hcCA9IHt9O1xyXG4gIG1hcHBpbmdza2lwID0gZmFsc2U7XHJcbiAgZmlsZXR5cGU7XHJcbiAgZmlsZW5tZTtcclxuICBkYXRlRm9ybWF0TGlzdCA9IFt7IFwia1wiOiBcImRkL21tL3l5XCIsIFwidlwiOiBcImRkL21tL3l5XCIgfSxcclxuICB7IFwia1wiOiBcIm1tL2RkL3l5XCIsIFwidlwiOiBcIm1tL2RkL3l5XCIgfSxcclxuICB7IFwia1wiOiBcImRkL01vbi95eVwiLCBcInZcIjogXCJkZC9Nb24veXlcIiB9LFxyXG4gIF1cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgLy8gcHJpdmF0ZSBmbGFzaE1lc3NhZ2VzU2VydmljZTogRmxhc2hNZXNzYWdlc1NlcnZpY2UsXHJcbiAgICAvLyBwcml2YXRlIHNwaW5uZXJTZXJ2aWNlOiBOZzRMb2FkaW5nU3Bpbm5lclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGNzOiBDb21tYW5TZXJ2aWNlU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIGhhbmRsZUZpbGVJbnB1dChmaWxlczogRmlsZUxpc3QpIHtcclxuICAgIHRoaXMuZmlsZVRvVXBsb2FkID0gZmlsZXMuaXRlbSgwKTtcclxuICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlc1swXS5uYW1lO1xyXG4gIH1cclxuICBvbkZpbGVTZWxlY3QoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGZpbGVzID0gaW5wdXQuZmlsZXM7XHJcblxyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xyXG5cclxuICAgICAgY29uc3QgZmlsZVRvUmVhZCA9IGZpbGVzWzBdO1xyXG5cclxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gdGhpcy5vbkZpbGVMb2FkO1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGZpbGVUb1JlYWQsIFwiVVRGLThcIik7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBjc3ZDb250ZW50OiBzdHJpbmc7XHJcbiAgcGFyc2VkQ3N2OiBzdHJpbmdbXVtdO1xyXG4gIG9uRmlsZUxvYWQoZmlsZUxvYWRlZEV2ZW50KSB7XHJcbiAgICBjb25zdCBjc3ZTZXBhcmF0b3IgPSAnOyc7XHJcbiAgICBjb25zdCB0ZXh0RnJvbUZpbGVMb2FkZWQgPSBmaWxlTG9hZGVkRXZlbnQudGFyZ2V0LnJlc3VsdDtcclxuICAgIHRoaXMuY3N2Q29udGVudCA9IHRleHRGcm9tRmlsZUxvYWRlZDtcclxuICAgIGNvbnN0IHR4dCA9IHRleHRGcm9tRmlsZUxvYWRlZDtcclxuICAgIGNvbnN0IGNzdiA9IFtdO1xyXG4gICAgY29uc3QgbGluZXMgPSB0eHQuc3BsaXQoJ1xcbicpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGxpbmVzWzBdKTtcclxuXHJcblxyXG4gICAgbGluZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgY29uc3QgY29sczogc3RyaW5nW10gPSBlbGVtZW50LnNwbGl0KGNzdlNlcGFyYXRvcik7XHJcbiAgICAgIGNzdi5wdXNoKGNvbHMpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhcnNlZENzdiA9IGNzdjtcclxuXHJcbiAgICAvLyBkZW1vIG91dHB1dCBhcyBhbGVydFxyXG4gICAgdmFyIG91dHB1dDogc3RyaW5nID0gXCJcIjtcclxuICAgIGNzdi5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIG91dHB1dCArPSBcIlxcblwiO1xyXG4gICAgICB2YXIgY29sTm8gPSAwO1xyXG4gICAgICByb3cuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGlmIChjb2xObyA+IDApIG91dHB1dCArPSBcIiB8IFwiO1xyXG4gICAgICAgIG91dHB1dCArPSBjb2w7XHJcbiAgICAgICAgY29sTm8rKztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgYXJyYXlCdWZmZXI6IGFueTtcclxuICBmaWxlOiBGaWxlO1xyXG4gIGluY29taW5nZmlsZShldmVudCkge1xyXG4gICAgdGhpcy5maWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gICAgdGhpcy5maWxlTmFtZSA9IHRoaXMuZmlsZS5uYW1lO1xyXG4gICAgdGhpcy5VcGxvYWQoKTtcclxuICB9XHJcblxyXG4gIFVwbG9hZCgpIHtcclxuXHJcbiAgICB0aGlzLnNob3cgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGVwTXNnID0gJ0ZpbGUgdXBsb2FkIGluIHByb2Nlc3MuLic7XHJcbiAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMubWFwcFNoZWV0RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5zaGVldERhdGEgPSBbXTtcclxuICAgIGxldCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGUpID0+IHtcclxuICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IGZpbGVSZWFkZXIucmVzdWx0O1xyXG4gICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xyXG4gICAgICB2YXIgYXJyID0gbmV3IEFycmF5KCk7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICE9IGRhdGEubGVuZ3RoOyArK2kpIGFycltpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtpXSk7XHJcbiAgICAgIHZhciBic3RyID0gYXJyLmpvaW4oXCJcIik7XHJcbiAgICAgIHZhciB3b3JrYm9vayA9IFhMU1gucmVhZChic3RyLCB7IHR5cGU6IFwiYmluYXJ5XCIgfSk7XHJcbiAgICAgIHZhciBmaXJzdF9zaGVldF9uYW1lID0gd29ya2Jvb2suU2hlZXROYW1lc1swXTtcclxuICAgICAgdmFyIHdvcmtzaGVldCA9IHdvcmtib29rLlNoZWV0c1tmaXJzdF9zaGVldF9uYW1lXTtcclxuXHJcbiAgICAgIHZhciBzaGVldERhdGFNYXA6IGFueSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3b3Jrc2hlZXQsIHsgaGVhZGVyOiAxIH0pO1xyXG4gICAgICBsZXQgaGVhZGVyTGlzdCA9IHNoZWV0RGF0YU1hcFswXTtcclxuICAgICAgaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJMaXN0LnB1c2goaGRyLnRyaW0oKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNoZWV0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3b3Jrc2hlZXQpO1xyXG4gICAgICB0aGlzLm1hcHBTaGVldERhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24od29ya3NoZWV0KTtcclxuICAgICAgdGhpcy5maWxlTG9nSWRuID0gMDtcclxuICAgICAgY29uc29sZS5sb2coXCJ0aGlzLmhlYWRlckxpc3RcIiwgdGhpcy5oZWFkZXJMaXN0KTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0SGVhZGVyTWF0Y2goKTtcclxuICAgICAgLy8gY29uc3QgZGlzdGluY3RTaCA9IFsuLi5uZXcgU2V0KHRoaXMuc2hlZXREYXRhLm1hcCh4PT54LlNIQVBFKSldO1xyXG4gICAgfVxyXG4gICAgZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcih0aGlzLmZpbGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2V0cChzdGVwKSB7XHJcbiAgICB0aGlzLnN0ZXAgPSBzdGVwO1xyXG5cclxuICAgIGlmIChzdGVwID09IDEpIHtcclxuICAgICAgdGhpcy5uZ09uRGVzdHJveSgpO1xyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJNYXRjaCgpIHtcclxuICAgIHRoaXMuc2hvdyA9IHRydWU7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIHRoaXMuc3RlcE1zZyA9ICdIZWFkZXIgdmVyaWZpY2F0aW9uIGluIHByb2Nlc3MgLi4uJztcclxuICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICByZXFPYmpbJ2F0dHJMaXN0J10gPSB0aGlzLmhlYWRlckxpc3Q7XHJcbiAgICByZXFPYmpbJ2ZpbGVJZG4nXSA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9ICdsb2FkSGVhZGVyQXR0cic7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGwgPSByZXN1bHQuYXR0ckRldGFpbHMgfHwgJyc7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFwiLCB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bCk7XHJcbiAgICAgICAgbGV0IGhlYWRlckxpc3RMbnQgPSB0aGlzLmhlYWRlckxpc3QubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMudG90YWxtYXRjaCA9IHJlc3VsdC50b3RhbG1hdGNoIHx8IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsICE9ICcnKSB7XHJcbiAgICAgICAgICB0aGlzLmF0dHJTdHJ1Y3R1cmVEdGwgPSByZXN1bHQuYXR0clN0cnVjdHVyZUR0bCB8fCBbXTtcclxuICAgICAgICAgIGlmICh0aGlzLnNoZWV0RGF0YS5sZW5ndGggPCA1KVxyXG4gICAgICAgICAgICB0aGlzLmRlZnVsdERpc3BsYXlMZW4gPSB0aGlzLnNoZWV0RGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGVmdWx0RGlzcGxheUxlbjsgaSsrKVxyXG4gICAgICAgICAgICB0aGlzLmRlZnVsdERpc3BsYXlPYmpbaV0gPSB0aGlzLnNoZWV0RGF0YVtpXTtcclxuXHJcbiAgICAgICAgICBsZXQgaWdub3JlQ29sdW1uTHN0ID0gcmVzdWx0Lmlnbm9yZV9jb2x1bW4gfHwgW107XHJcbiAgICAgICAgICBpZ25vcmVDb2x1bW5Mc3QuZm9yRWFjaChoZHJEc2MgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkckRzY10gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyRHNjXS5pZ25vcmUgPSAnWSc7XHJcbiAgICAgICAgICAgICAgaGVhZGVyTGlzdExudC0tO1xyXG4gICAgICAgICAgICAgIHRoaXMudG90YWxpZ25vcmUrKztcclxuICAgICAgICAgICAgICBpZiAodGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyRHNjXS5hdHRyICE9IFwiXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsbWF0Y2gtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBsZXQgaXNEYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgdGhpcy5oZWFkZXJMaXN0LmZvckVhY2goaGRyID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxldCBoZHJBdHRyID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXSB8fCB7fTtcclxuICAgICAgICAgICAgaWYgKGhkckF0dHIuZHRhX3R5cCA9PSAnZCcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXRNYXBbaGRyXSA9IHRoaXMuZGF0ZUZvcm1hdDtcclxuICAgICAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50b3RhbG1hdGNoID09IGhlYWRlckxpc3RMbnQgJiYgaXNEYXRlID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmFsaWRhdGVGaWxlSGVhZGVyTWFwcGluZygnTicpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdGVwID0gMztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN0ZXAgPSAyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcIlNvbWUgcHJvYmxlbSBpbiBGaWxlIEhlYWRlciBNYXRjaGluZ1wiLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAvL3RoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgdXBkYXRlY29sdW1uc3RhdHVlKGhkcikge1xyXG5cclxuICAgIHZhciBpc0lnbm9yZSA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uaWdub3JlIHx8ICcnO1xyXG4gICAgaWYgKGlzSWdub3JlID09ICdZJykge1xyXG4gICAgICB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSA9ICdOJ1xyXG4gICAgICB0aGlzLnRvdGFsaWdub3JlLS07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvdGFsaWdub3JlKys7XHJcbiAgICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uaWdub3JlID0gJ1knO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXSk7XHJcbiAgfVxyXG4gIG1hcGhkcjtcclxuICBoZHJtYXNzYWdlO1xyXG4gIGNvbmZpcm1zZXRIZWFkZXJNYXBwKGhkcikge1xyXG4gICAgdGhpcy5tYXBoZHIgPSBoZHI7XHJcbiAgICBsZXQgYXR0ciA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cjtcclxuICAgIHRoaXMuYXR0clN0cnVjdHVyZUR0bC5mb3JFYWNoKGVsZSA9PiB7XHJcblxyXG4gICAgICBpZiAoZWxlLmF0dHIgPT0gYXR0cikge1xyXG4gICAgICAgIHRoaXMuaGRybWFzc2FnZSA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciArIFwiKFwiICsgZWxlLnByaW50ICsgXCIpXCI7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkNvZmlybW1hcGhkcicpLmNsaWNrKCk7XHJcbiAgfVxyXG4gIENhbmNlbEhlYWRlck1hcHAoKSB7XHJcbiAgICB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFt0aGlzLm1hcGhkcl0uYXR0ciA9IFwiXCI7XHJcbiAgfVxyXG4gIHNldEhlYWRlck1hcHAoKSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIGxldCBhdHRyID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbdGhpcy5tYXBoZHJdLmF0dHIgfHwgJyc7XHJcbiAgICBpZiAoYXR0ciAhPSAnJykge1xyXG4gICAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICByZXFPYmpbJ29wdGlvbmFWYWwnXSA9IHRoaXMubWFwaGRyXHJcbiAgICAgIHJlcU9ialsnYXR0ciddID0gYXR0cjtcclxuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2FkZEhlYWRlckF0dHInO1xyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgICBsZXQgaGRyRHRsID0gcmVzdWx0LmF0dHJEZXRhaWxzW3RoaXMubWFwaGRyXSB8fCAnJztcclxuICAgICAgICAgIGlmIChoZHJEdGwgIT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy50b3RhbG1hdGNoKys7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW3RoaXMubWFwaGRyXSA9IGhkckR0bDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW3RoaXMubWFwaGRyXSA9IHtcclxuICAgICAgICAgICAgICBcImF0dHJcIjogXCJcIixcclxuICAgICAgICAgICAgICBcInByaW50XCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgXCJzcnRcIjogXCJcIixcclxuICAgICAgICAgICAgICBcImR0YV90eXBcIjogXCJcIixcclxuICAgICAgICAgICAgICBcImF0dHJfaWRuXCI6IFwiXCJcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coXCJNYXBwaW5nIGF0dHJpYnV0ZSBpcyBlbXB0eSBwbGVhc2UgcmV0cnkuXCIsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGdtYXRjaGVkQ291bnQgPSAwO1xyXG4gIGdyZXN1bHRDb3VudCA9IDA7XHJcbiAgc2V0Um93RGF0YU1hcHAoKSB7XHJcbiAgICBpZiAoIXRoaXMubWFwcGluZ3NraXApIHtcclxuICAgICAgbGV0IHJvd01hdGNoQ291bnQgPSAwO1xyXG4gICAgICB0aGlzLmNoYXJIZWFkZXJMaXN0ID0gW107XHJcbiAgICAgIGRlYnVnZ2VyXHJcbiAgICAgIHRoaXMuaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcblxyXG4gICAgICAgIGxldCBhdHRyID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyIHx8ICcnO1xyXG4gICAgICAgIGxldCBhdHRyVHlwZSA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uZHRhX3R5cCB8fCAnJztcclxuICAgICAgICBsZXQgaXNJZ25vcmUgPSB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSB8fCAnJztcclxuICAgICAgICBpZiAoYXR0ciAhPSAnJyAmJiBpc0lnbm9yZSAhPSAnTicgJiYgYXR0clR5cGUgPT0gJ2MnKSB7XHJcbiAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgdmFyIGRpc3RpbmN0bGlzdCA9IEFycmF5LmZyb20obmV3IFNldCh0aGlzLnNoZWV0RGF0YS5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbVtoZHJdKSkpO1xyXG4gICAgICAgICAgZGlzdGluY3RsaXN0ID0gZGlzdGluY3RsaXN0LmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSB9KTtcclxuICAgICAgICAgIGlmIChkaXN0aW5jdGxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnJvd2Rpc3RpbmN0RGF0YU1hcFthdHRyXSA9IGRpc3RpbmN0bGlzdDtcclxuICAgICAgICAgICAgcm93TWF0Y2hDb3VudCA9IHJvd01hdGNoQ291bnQgKyBkaXN0aW5jdGxpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLmdtYXRjaGVkQ291bnQgPSByb3dNYXRjaENvdW50O1xyXG4gICAgICAgICAgICB0aGlzLmNoYXJIZWFkZXJMaXN0LnB1c2goaGRyKTtcclxuICAgICAgICAgICAgbGV0IGF0dHJEZXRhaWxzID0gdGhpcy5hdHRyU3RydWN0dXJlRHRsLmZpbmQoYXR0cmR0bCA9PiBhdHRyZHRsLmF0dHIgPT0gYXR0cikgfHwge307XHJcbiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlRHRsTWFwW2F0dHJdID0gYXR0ckRldGFpbHMucHJwTGlzdCB8fCBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICByZXFPYmpbJ2F0dHJNYXAnXSA9IHRoaXMucm93ZGlzdGluY3REYXRhTWFwO1xyXG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnbG9hZEhlYWRlckF0dHJEdGwnO1xyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xyXG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJvd01hdGNoQ291bnQpO1xyXG4gICAgICAgICAgZGVidWdnZXI7XHJcblxyXG4gICAgICAgICAgdGhpcy5yb3dkYXRhbWFwRGV0YWlscyA9IHJlc3VsdC5hdHRyRGV0YWlscyB8fCB7fTtcclxuICAgICAgICAgIHRoaXMuZ3Jlc3VsdENvdW50ID0gcmVzdWx0LnRvdGFsbWF0Y2g7XHJcbiAgICAgICAgICB0aGlzLnN0ZXAgPSAzO1xyXG4gICAgICAgICAgaWYgKHJvd01hdGNoQ291bnQgPT0gcmVzdWx0LnRvdGFsbWF0Y2gpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGVwID0gNDtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlKCk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcInBsZWFzZSB2ZXJpZnkgZGF0YSBtYXBwaW5nLlwiLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcInNvbWV0aGluZyBnbyB3cm9uZyBpbiByb3cgZGF0YS5cIiwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0ZXAgPSA0O1xyXG4gICAgICB0aGlzLnVwbG9hZEZpbGUoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIGR0bEF0dHI7XHJcbiAgZHRsYXR0cl9pZG47XHJcbiAgZHRsb3B0aW9udmFsO1xyXG4gIGR0bG1hc3NhZ2U7XHJcbiAgY29uZmlybUhlYWRlckRldGFpbHNNYXBwKGF0dHIsIGF0dHJfaWRuLCBvcHRpb252YWwpIHtcclxuICAgIHRoaXMuZHRsQXR0ciA9IGF0dHI7XHJcbiAgICB0aGlzLmR0bGF0dHJfaWRuID0gYXR0cl9pZG47XHJcbiAgICB0aGlzLmR0bG9wdGlvbnZhbCA9IG9wdGlvbnZhbDtcclxuICAgIGxldCB2YWwgPSB0aGlzLnJvd2RhdGFtYXBEZXRhaWxzW3RoaXMuZHRsQXR0cl1bdGhpcy5kdGxvcHRpb252YWxdLnZhbDtcclxuICAgIGxldCBhdHRyaWJ1dGVEdGxMaXN0ID0gdGhpcy5hdHRyaWJ1dGVEdGxNYXBbYXR0cl07XHJcbiAgICBhdHRyaWJ1dGVEdGxMaXN0LmZvckVhY2goZWxlID0+IHtcclxuXHJcbiAgICAgIGlmIChlbGUudmFsID09IHZhbCkge1xyXG4gICAgICAgIHRoaXMuZHRsbWFzc2FnZSA9IHZhbCArIFwiKFwiICsgZWxlLnByaW50ICsgXCIpXCI7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkNvZmlybW1hcGR0bCcpLmNsaWNrKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgQ2FuY2VsSGVhZGVyRGV0YWlsc01hcHAoKSB7XHJcbiAgICB0aGlzLnJvd2RhdGFtYXBEZXRhaWxzW3RoaXMuZHRsQXR0cl1bdGhpcy5kdGxvcHRpb252YWxdLnZhbCA9IFwiXCI7XHJcbiAgfVxyXG4gIHNldEhlYWRlckRldGFpbHNNYXBwKCkge1xyXG4gICAgbGV0IGF0dHJEdGxWYWwgPSB0aGlzLnJvd2RhdGFtYXBEZXRhaWxzW3RoaXMuZHRsQXR0cl1bdGhpcy5kdGxvcHRpb252YWxdLnZhbCB8fCAnJztcclxuICAgIGlmIChhdHRyRHRsVmFsICE9ICcnKSB7XHJcbiAgICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgICAgcmVxT2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICAgIHJlcU9ialsnb3B0aW9uYVZhbCddID0gdGhpcy5kdGxvcHRpb252YWxcclxuICAgICAgcmVxT2JqWydhdHRyX2lkbiddID0gdGhpcy5kdGxhdHRyX2lkbjtcclxuICAgICAgcmVxT2JqWydhdHRyJ10gPSB0aGlzLmR0bEF0dHI7XHJcbiAgICAgIHJlcU9ialsnYXR0clZhbCddID0gYXR0ckR0bFZhbDtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnYWRkRGV0YWlsQXR0cic7XHJcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRkRGV0YWlsQXR0clwiLCByZXNwb25zZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICAgIHRoaXMuZ3Jlc3VsdENvdW50Kys7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IHx8IHt9O1xyXG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LmF0dHJEZXRhaWxzKTtcclxuICAgICAgICAgIGxldCBhdHRyRGV0YWlscyA9IHJlc3VsdC5hdHRyRGV0YWlscyB8fCB7fVxyXG4gICAgICAgICAgdGhpcy5yb3dkYXRhbWFwRGV0YWlsc1t0aGlzLmR0bEF0dHJdW3RoaXMuZHRsb3B0aW9udmFsXSA9IGF0dHJEZXRhaWxzW3RoaXMuZHRsb3B0aW9udmFsXTtcclxuICAgICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG5cclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcIk1hcHBpbmcgYXR0cmlidXRlIGlzIGVtcHR5IHBsZWFzZSByZXRyeS5cIiwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBvblN1Ym1pdChmb3JtVmFsKSB7XHJcbiAgICB2YXIgdCA9IE9iamVjdC5rZXlzKGZvcm1WYWwuZm9ybS5jb250cm9scykuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtVmFsLmZvcm0uZ2V0KGZpZWxkKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zYXZlRmlsZU9wdGlvbihmb3JtVmFsLnZhbHVlKTtcclxuICB9XHJcbiAgc2F2ZUZpbGVPcHRpb24oZnJtdmFscykge1xyXG4gICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmogPSB7IC4uLmZybXZhbHMsIGNvbHVtbl9mb3JtYXQ6IHRoaXMuY29sRm9ybWF0ZSwgaWdub3JlX2NvbHVtbjogdGhpcy5pZ25vcmVGb3JtYXRlIH07XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2FkZEZpbGVPcHRpb24nO1xyXG4gICAgdGhpcy5jcy5sb2FkaUZpbGUocmVxT2JqLCB0aGlzLmhlYWRlciwgJ2ZpbGVVcGxvYWQvbG9hZCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgdGhpcy5maWxlT3B0aW9uc0xpc3QgPSByZXN1bHQuZmlsZU9wdGlvbnNMaXN0O1xyXG4gICAgICAgIHRoaXMuZmlsZVR5cGUgPSByZXN1bHQuZmlsZV9pZG47XHJcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUZpbGVIZWFkZXJNYXBwaW5nKCdOJyk7XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1zdWNjZXNzJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBhZGRGaWxlTG9nKGZpbGVJZG4pIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIHJlcU9ialsnZmlsZV9pZG4nXSA9IGZpbGVJZG47XHJcbiAgICByZXFPYmpbJ2ZpbGVfc3RhdHVzJ10gPSBcIkhlYWRlciBJbnNlcnRlZFwiO1xyXG4gICAgcmVxT2JqWyd2YWxpZGF0aW9uX3JlbWFya3MnXSA9IFwiSGVhZGVyIHZhbGlkYXRlZFwiO1xyXG4gICAgcmVxT2JqWydoZWFkZXJfcm93J10gPSB0aGlzLmFsbGNvbHM7XHJcbiAgICByZXFPYmpbJ2hlYWRlcl9hdHRyX3JvdyddID0gdGhpcy5jb2xGb3JtYXRlO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnYWRkRmlsZUxvZyc7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCB8fCB7fTtcclxuICAgICAgICB0aGlzLmZpbGVMb2dJZG4gPSByZXN1bHQuZmlsZV9sb2dfaWRuO1xyXG4gICAgICAgIHRoaXMuc2V0Um93RGF0YU1hcHAoKTtcclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coXCJIZWFkZXIgdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseVwiLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFZhbGlkYXRlRmlsZUhlYWRlck1hcHBpbmcoZm9ybWF0U2F2ZSkge1xyXG4gICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5zaG93ID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RlcE1zZyA9ICdIZWFkZXIgdmVyaWZpY2F0aW9uIGluIHByb2Nlc3MgLi4uJztcclxuICAgIHRoaXMuY29sRm9ybWF0ZSA9IFtdO1xyXG4gICAgdGhpcy5pZ25vcmVGb3JtYXRlID0gW107XHJcbiAgICB0aGlzLmFsbGNvbHMgPSBbXTtcclxuICAgIGxldCBpc1ZhbGlkYXRlID0gdHJ1ZTtcclxuICAgIHRoaXMuaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgIGxldCBoZHJEdGwgPSB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdIHx8ICcnXHJcbiAgICAgIGlmIChoZHJEdGwuYXR0ciA9PSAnJyAmJiBoZHJEdGwuaWdub3JlICE9ICdZJykge1xyXG4gICAgICAgIGlzVmFsaWRhdGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaGRyRHRsLmF0dHIgIT0gJycgJiYgaGRyRHRsLmlnbm9yZSAhPSAnTicpIHtcclxuICAgICAgICB0aGlzLmNvbEZvcm1hdGUucHVzaChoZHJEdGwuYXR0cik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGhkckR0bC5pZ25vcmUgPT0gJ1knKSB7XHJcbiAgICAgICAgdGhpcy5pZ25vcmVGb3JtYXRlLnB1c2goaGRyKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFsbGNvbHMucHVzaChoZHIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGlzVmFsaWRhdGUgJiYgKHRoaXMuZmlsZVR5cGUgPT0gbnVsbCB8fCB0aGlzLmZpbGVUeXBlID09IHVuZGVmaW5lZCB8fCB0aGlzLmZpbGVUeXBlID09IFwiXCIpKSB7XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG5cclxuICAgICAgdGhpcy5zdGVwTXNnID0gXCJcIjtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bmZpbGVVcGxvYWRNb2RhbCcpLmNsaWNrKCk7XHJcbiAgICAgIHRoaXMuc3RlcCA9IDI7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBpZiAoaXNWYWxpZGF0ZSkge1xyXG4gICAgICAgIGlmIChmb3JtYXRTYXZlID09ICdZJykge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVmaWxlT3B0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkRmlsZUxvZyh0aGlzLmZpbGVUeXBlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coXCJQbGVhc2Ugc3BlY2lmeSBtYXBwaW5nIG9yIG1hcmtlIGFzIGlnbm9yZSBcIiwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG5cclxuXHJcbiAgfVxyXG4gIGhkcklkbjtcclxuICB1cGRhdGVmaWxlT3B0aW9uKCkge1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICByZXFPYmpbJ2ZpbGVJZG4nXSA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICByZXFPYmpbJ2NvbHVtbl9mb3JtYXQnXSA9IHRoaXMuY29sRm9ybWF0ZTtcclxuICAgIHJlcU9ialsnaWdub3JlX2NvbHVtbiddID0gdGhpcy5pZ25vcmVGb3JtYXRlO1xyXG5cclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ3VwZGF0ZUNvbHVtbkZvcm1hdCc7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuY3MubG9hZGlGaWxlKHJlcU9iaiwgdGhpcy5oZWFkZXIsICdmaWxlVXBsb2FkL2xvYWQnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgIH1cclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkRmlsZSgpIHtcclxuICAgIHRoaXMuZGF0ZUZvcm1hdCA9IHRoaXMuZGF0ZUZvcm1hdCB8fCAnZGQvbW0veXknO1xyXG4gICAgdGhpcy5kZWxpbSA9IHRoaXMuZGVsaW0gfHwgJy8nO1xyXG4gICAgdGhpcy5zaG93ID0gdHJ1ZTtcclxuICAgIGxldCBkYXRlVmFsaWQgPSB0cnVlO1xyXG4gICAgbGV0IG1hc3NhZ2UgPSBcIlwiO1xyXG5cclxuICAgIGlmICghdGhpcy5tYXBwaW5nc2tpcCkge1xyXG4gICAgICB0aGlzLnN0ZXBNc2cgPSBcIkRhdGEgdmVyaWZpY2F0aW9uIGluIHByb2Nlc3MgLi4uXCI7XHJcbiAgICAgIHRoaXMuaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgICAgZGVidWdnZXJcclxuICAgICAgICBsZXQgYXR0ciA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciB8fCAnJztcclxuICAgICAgICBsZXQgYXR0clR5cGUgPSB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmR0YV90eXAgfHwgJyc7XHJcbiAgICAgICAgbGV0IGlzSWdub3JlID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5pZ25vcmUgfHwgJyc7XHJcbiAgICAgICAgaWYgKGlzSWdub3JlID09ICdZJykge1xyXG4gICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhLm1hcCgocm93RGF0YSwgaSkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2hkcl07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGF0dHJUeXBlID09ICdjJykge1xyXG4gICAgICAgICAgICB0aGlzLm1hcHBTaGVldERhdGEubWFwKChyb3dEYXRhLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhckhlYWRlckxpc3QuaW5kZXhPZihoZHIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXR0cmR0bFZhbCA9IHJvd0RhdGFbaGRyXSB8fCAnJztcclxuICAgICAgICAgICAgICAgIGlmIChhdHRyZHRsVmFsICE9ICcnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgYXR0ckR0bE1hcFZhbCA9IHRoaXMucm93ZGF0YW1hcERldGFpbHNbYXR0cl1bYXR0cmR0bFZhbF0uc3J0O1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcHBTaGVldERhdGFbaV1bYXR0cl0gPSBhdHRyRHRsTWFwVmFsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBoZHIpXHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcHBTaGVldERhdGFbaV1baGRyXVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIH0gZWxzZSBpZiAoYXR0clR5cGUgPT0gJ24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFwcFNoZWV0RGF0YS5tYXAoKHJvd0RhdGEsIGkpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgYXR0cmR0bFZhbCA9IHJvd0RhdGFbaGRyXSB8fCAnJztcclxuICAgICAgICAgICAgICBpZiAoYXR0cmR0bFZhbCAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgZGVidWdnZXJcclxuICAgICAgICAgICAgICAgIGF0dHJkdGxWYWwgPSBhdHRyZHRsVmFsLnJlcGxhY2UoL1teMC05Li1dL2csIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2F0dHJdID0gYXR0cmR0bFZhbC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBoZHIpXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2hkcl1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhdHRyVHlwZSA9PSAnZCcpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWFwcFNoZWV0RGF0YS5tYXAoKHJvd0RhdGEsIGkpID0+IHtcclxuICAgICAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgICAgIGxldCBhdHRyZHRsVmFsID0gcm93RGF0YVtoZHJdIHx8ICcnO1xyXG4gICAgICAgICAgICAgIGxldCBkdEZybSA9IHRoaXMuZGF0ZUZvcm1hdE1hcFtoZHJdIHx8ICdkZC9tbS95eSc7XHJcbiAgICAgICAgICAgICAgaWYgKGF0dHJkdGxWYWwgIT0gJycpXHJcbiAgICAgICAgICAgICAgICBhdHRyZHRsVmFsID0gdGhpcy5jcy5kYXRlVmFsaWRhdGlvbihhdHRyZHRsVmFsLCBkdEZybSk7XHJcbiAgICAgICAgICAgICAgaWYgKGF0dHJkdGxWYWwgPT0gJ2ludmFpbGQnKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIG1hc3NhZ2UgPSBcIlBsZWFzZSBjaGVjayBEYXRlIDpcIiArIHJvd0RhdGFbaGRyXSArIFwiIERhdGUgRm9ybWF0IDpcIiArIGR0RnJtO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2F0dHJdID0gYXR0cmR0bFZhbC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIGlmIChhdHRyICE9IGhkcilcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcHBTaGVldERhdGFbaV1baGRyXVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIGlmIChhdHRyVHlwZSA9PSAndCcpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhLm1hcCgocm93RGF0YSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBhdHRyZHRsVmFsID0gcm93RGF0YVtoZHJdIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLm1hcHBTaGVldERhdGFbaV1bYXR0cl0gPSBhdHRyZHRsVmFsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gaGRyKVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWFwcFNoZWV0RGF0YVtpXVtoZHJdXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGRhdGVWYWxpZCkge1xyXG4gICAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnOy8vdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5hbWUnXTtcclxuICAgICAgcmVxT2JqWydmaWxlX2xvZ19pZG4nXSA9IHRoaXMuZmlsZUxvZ0lkbjtcclxuICAgICAgcmVxT2JqWydhdHRyX2RhdGEnXSA9IHRoaXMubWFwcFNoZWV0RGF0YTtcclxuICAgICAgcmVxT2JqWydpbl9kYXRhJ10gPSB0aGlzLnNoZWV0RGF0YTtcclxuICAgICAgcmVxT2JqWydkYXRlZm9ybWF0J10gPSB0aGlzLmRhdGVGb3JtYXRNYXA7XHJcbiAgICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICBsZXQgdXJsID0gXCJmaWxlVXBsb2FkL2xvYWRcIjtcclxuICAgICAgaWYgKHRoaXMubWRsID09ICdpbndhcmQnKSB7XHJcbiAgICAgICAgdXJsID0gJ2lud2FyZC9sb2FkRmlsZSc7XHJcbiAgICAgICAgcmVxT2JqWydpbndhcmRfaWRuJ10gPSB0aGlzLmlud2FyZF9pZG47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHJlcU9iaik7XHJcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmhlYWRlcik7XHJcblxyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCB1cmwpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCB8fCB7fTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgICAgICAgICB0aGlzLmZpbGVMb2dJZG4gPSByZXN1bHQuZmlsZV9sb2dfaWRuO1xyXG4gICAgICAgICAgdGhpcy5oZHJJZG4gPSByZXN1bHQuaGRySWRuO1xyXG4gICAgICAgICAgdGhpcy5nZXRQcm9ncmVzc0ZpbGUodGhpcy5maWxlTG9nSWRuKTtcclxuICAgICAgICAgIHRoaXMubGFibGVGaWxlID0gXCJGaWxlIFNlcXVlbmNlIE5vLiBcIiArIHRoaXMuZmlsZUxvZ0lkbiArIFwiIFVwbG9hZGluZyBpbiBwcm9ncmVzcy4uLlwiO1xyXG4gICAgICAgICAgLy8gc2V0IGZpbGUgaWQgdG8gbG9jYWwgc3RvcmFnZVxyXG4gICAgICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2UuYXJndW1lbnRzKCd1cGxvYWRlZEZpbGVJZCcsIHJlc3VsdC5maWxlX2xvZ19pZG4pO1xyXG5cclxuICAgICAgICAgIHRoaXMubGFibGUgPSBcIlByaWNpbmcgU2VxdWVuY2UgTm8uIFwiICsgdGhpcy5oZHJJZG4gKyBcIiBQcmljZSBjYWxjdWxhdGlvbnMgaW4gcHJvZ3Jlc3MuLi5cIjtcclxuXHJcbiAgICAgICAgICB0aGlzLmdldFByb2dyZXNzUHJpY2UodGhpcy5oZHJJZG4pO1xyXG5cclxuICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3cobWFzc2FnZSwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDQwMDAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIm1hcHBTaGVldERhdGFcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5tYXBwU2hlZXREYXRhKSk7XHJcbiAgICBjb25zb2xlLmxvZyhcInRoaXMuc2hlZXREYXRhXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hlZXREYXRhKSk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VNYXBwaW5nKGhkck9iaiwgaGRyLCBhdHRyKSB7XHJcbiAgICB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSA9ICdZJztcclxuICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciA9ICcnO1xyXG4gICAgdGhpcy5yZW1vdmVBdHRyT3B0VmFsKGF0dHIsIGhkcik7XHJcbiAgfVxyXG5cclxuXHJcbiAgcmVtb3ZlQXR0ck9wdFZhbChhdHRyLCBvcHRpb25hVmFsKSB7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIHJlcU9ialsnYXR0ciddID0gYXR0cjtcclxuICAgIHJlcU9ialsnb3B0aW9uYVZhbCddID0gb3B0aW9uYVZhbDtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAncmVtb3ZlQXR0ck9wdFZhbCc7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcmVtb3ZlRGV0YWlsQXR0ck9wdFZhbChhdHRySWRuLCBvcHRpb25hVmFsLCB2YWwsIGhkckF0dHIpIHtcclxuICAgIHRoaXMucm93ZGF0YW1hcERldGFpbHNbaGRyQXR0cl1bb3B0aW9uYVZhbF0udmFsID0gJyc7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIHJlcU9ialsnYXR0clZhbCddID0gdmFsO1xyXG4gICAgcmVxT2JqWydvcHRpb25hVmFsJ10gPSBvcHRpb25hVmFsO1xyXG4gICAgcmVxT2JqWydhdHRyX2lkbiddID0gYXR0cklkbjtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAncmVtb3ZlQXR0ck9wdFZhbCc7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICBzdHRzRmlsZSA9IHt9XHJcbiAgZ2V0UHJvZ3Jlc3NGaWxlKGZpbGVMb2dJZG4pIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgcmVxT2JqWydmaWxlX2xvZ19pZG4nXSA9IGZpbGVMb2dJZG47Ly90aGlzLmZpbGVMb2dJZG47XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2dldEZpbGVMb2dTdGF0dXMnO1xyXG4gICAgdGhpcy5jcy5sb2FkaUZpbGUocmVxT2JqLCB0aGlzLmhlYWRlciwgJ2ZpbGVVcGxvYWQvbG9hZCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydDJ10gPSByZXN1bHRbJ0MnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydQJ10gPSByZXN1bHRbJ1AnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydFJ10gPSByZXN1bHRbJ0UnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydUJ10gPSByZXN1bHRbJ1QnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydJJ10gPSByZXN1bHRbJ0knXTtcclxuICAgICAgICB0aGlzLnN0ZXAgPSA0O1xyXG4gICAgICAgIHRoaXMudG90UHJvZ3Jlc3NGaWxlID0gTWF0aC5jZWlsKHBhcnNlRmxvYXQocmVzdWx0WydDJ10pICogMTAwIC8gcGFyc2VGbG9hdChyZXN1bHRbJ1QnXSkpO1xyXG4gICAgICAgIHRoaXMucmVjYWxsRmlsZShmaWxlTG9nSWRuKTtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnRvdFByb2dyZXNzKTtcclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3cocmVzcG9uc2UubWVzc2FnZSwgeyBjc3NDbGFzczogJ2FsZXJ0LXN1Y2Nlc3MnLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyBjaGVja1VwbG9hZFN0dCgpIHtcclxuICAvLyAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gIC8vICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gIC8vICAgcmVxT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbmFtZSddO1xyXG4gIC8vICAgcmVxT2JqWydmaWxlX2xvZ19pZG4nXSA9IHRoaXMuZmlsZUxvZ0lkbjtcclxuICAvLyAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gIC8vICAgdGhpcy51cy5kYXRhKHJlcU9iaiwgJ2dldEZpbGVMb2dTdGF0dXMnLCAnZmlsZVVwbG9hZC9sb2FkJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAvLyAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAvLyAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xyXG4gIC8vICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgLy8gICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAvLyAgICAgICB0aGlzLnN0dHNbJ0MnXSA9IHJlc3VsdFsnQyddO1xyXG4gIC8vICAgICAgIHRoaXMuc3R0c1snUCddID0gcmVzdWx0WydQJ107XHJcbiAgLy8gICAgICAgdGhpcy5zdHRzWydFJ10gPSByZXN1bHRbJ0UnXTtcclxuICAvLyAgICAgICB0aGlzLnN0dHNbJ1QnXSA9IHJlc3VsdFsnVCddO1xyXG4gIC8vICAgICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgLy8gICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgLy8gICAgICAgdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1zdWNjZXNzJywgdGltZW91dDogMzAwMCB9KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAvLyAgIH0sIGVycm9yID0+IHtcclxuICAvLyAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgLy8gICAgIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgLy8gICB9KTtcclxuXHJcbiAgLy8gfVxyXG5cclxuICBzdHRzID0ge307XHJcbiAgY2xpY2tlZCA9IGZhbHNlO1xyXG4gIHRvdFByb2dyZXNzID0gMDtcclxuICB0b3RQcm9ncmVzc0ZpbGUgPSAwO1xyXG4gIGdldFByb2dyZXNzUHJpY2UoaGRySWRuKSB7XHJcbiAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgcmVxT2JqWydzZXFObyddID0gaGRySWRuOy8vXCI4NDZcIjsvL3RoaXMuZmlsZUxvZ0lkbjtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnZ2V0UHJpY2VTdGF0dXMnO1xyXG4gICAgdGhpcy5jcy5sb2FkaUZpbGUocmVxT2JqLCB0aGlzLmhlYWRlciwgJ2ZpbGVVcGxvYWQvbG9hZCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICB0aGlzLnN0dHNbJ0MnXSA9IHJlc3VsdFsnQyddO1xyXG4gICAgICAgIHRoaXMuc3R0c1snUCddID0gcmVzdWx0WydQJ107XHJcbiAgICAgICAgdGhpcy5zdHRzWydFJ10gPSByZXN1bHRbJ0UnXTtcclxuICAgICAgICB0aGlzLnN0dHNbJ1QnXSA9IHJlc3VsdFsnVCddO1xyXG4gICAgICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgICAgICAgdGhpcy50b3RQcm9ncmVzcyA9IE1hdGguY2VpbChwYXJzZUZsb2F0KHJlc3VsdFsnQyddKSAqIDEwMCAvIHBhcnNlRmxvYXQocmVzdWx0WydUJ10pKTtcclxuICAgICAgICB0aGlzLnJlY2FsbCh0aGlzLmhkcklkbik7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy50b3RQcm9ncmVzcyk7XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1zdWNjZXNzJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG4gIGxhc3RSZWZyZXNoVGltZUZpbGUgPSBudWxsO1xyXG4gIHJlY2FsbEZpbGUoZmlsZUxvZ0lkbikge1xyXG5cclxuICAgIGlmICh0aGlzLnRvdFByb2dyZXNzRmlsZSA8IDEwMCkge1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoVGltZUZpbGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB0aGlzLnRpbWVyZmlsZSA9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldFByb2dyZXNzRmlsZShmaWxlTG9nSWRuKTtcclxuICAgICAgICB9LCA1MDAwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcmZpbGUpO1xyXG4gICAgICAvLyB0aGlzLlBsYW5uaW5nQ29tcG9uZW50LmdldFBhY2tldHNCeUhlYWRlcklkKGhkcklkbik7XHJcbiAgICAgIC8vIHRoaXMuY2xvc2VidG4ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICBpZiAodGhpcy50b3RQcm9ncmVzc0ZpbGUgPT0gMTAwICYmIHRoaXMudG90UHJvZ3Jlc3MgPT0gMTAwKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bmZpbGVVcGxvYWRNb2RhbCcpLmNsaWNrKCk7XHJcblxyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3ByaWNpbmcvcm91Z2gvcGxhbmluZ3NjcmVlbi9yb3VnaFBsYW5pbmdTY3JlZW4nXSwgeyBxdWVyeVBhcmFtczogeyBoZHJJZDogdGhpcy5oZHJJZG4gfSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcbiAgbGFzdFJlZnJlc2hUaW1lID0gbnVsbDtcclxuICByZWNhbGwoaGRySWRuKSB7XHJcbiAgICBpZiAodGhpcy50b3RQcm9ncmVzcyA8IDEwMCkge1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIHRoaXMudGltZXJQcmljZSA9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldFByb2dyZXNzUHJpY2UoaGRySWRuKTtcclxuICAgICAgICB9LCA1MDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXJQcmljZSk7XHJcbiAgICAgIGlmICh0aGlzLnRvdFByb2dyZXNzRmlsZSA9PSAxMDAgJiYgdGhpcy50b3RQcm9ncmVzcyA9PSAxMDApIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuZmlsZVVwbG9hZE1vZGFsJykuY2xpY2soKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9wcmljaW5nL3JvdWdoL3BsYW5pbmdzY3JlZW4vcm91Z2hQbGFuaW5nU2NyZWVuJ10sIHsgcXVlcnlQYXJhbXM6IHsgaGRySWQ6IHRoaXMuaGRySWRuIH0gfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgU2tpcFZlcmlmaWNhdGlvbigpIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICB0aGlzLm1hcHBpbmdza2lwID0gdHJ1ZTtcclxuICAgIHRoaXMuYWRkRmlsZUxvZyh0aGlzLmZpbGVUeXBlKTtcclxuXHJcbiAgfVxyXG4gIFNraXBWZXJpZmljYXRpb25EdGwoKSB7XHJcbiAgICB0aGlzLm1hcHBpbmdza2lwID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgICB0aGlzLnVwbG9hZEZpbGUoKTtcclxuICB9XHJcblxyXG4gIGxvYWRGaWxlVHlwZURhdGEoZmlsZVVwbG9hZCwgbWRsKSB7XHJcbiAgICB0aGlzLnNoZWV0RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGwgPSB7fTtcclxuICAgIHRoaXMuZGVmdWx0RGlzcGxheUxlbiA9IDU7XHJcbiAgICB0aGlzLmRlZnVsdERpc3BsYXlPYmogPSBbXTtcclxuICAgIHRoaXMuYXR0clN0cnVjdHVyZUR0bCA9IFtdO1xyXG4gICAgdGhpcy5oZWFkZXJMaXN0ID0gW107XHJcbiAgICB0aGlzLmhlYWRlcnBycDtcclxuICAgIHRoaXMuYXR0cnBycDtcclxuICAgIHRoaXMudG90YWxtYXRjaCA9IDA7XHJcbiAgICB0aGlzLnRvdGFsaWdub3JlID0gMDtcclxuICAgIHRoaXMucGFnZURlZmluYXRpb24gPSB7fTtcclxuICAgIHRoaXMucm93ZGF0YW1hcERldGFpbHMgPSB7fTtcclxuICAgIHRoaXMucm93ZGlzdGluY3REYXRhTWFwID0ge307XHJcbiAgICB0aGlzLmNoYXJIZWFkZXJMaXN0ID0gW107XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUR0bE1hcCA9IHt9O1xyXG4gICAgdGhpcy5tYXBwU2hlZXREYXRhID0gW107XHJcbiAgICB0aGlzLnN0YXR1c0xpc3QgPSBbXTtcclxuICAgIHRoaXMuZmlsZURldGFpbHMgPSBbXTtcclxuICAgIHRoaXMuZmlsZVR5cGVMaXN0ID0gW107XHJcbiAgICB0aGlzLmZpbGVPcHRpb25zTGlzdCA9IFtdO1xyXG4gICAgdGhpcy5maWxlVHlwZTtcclxuICAgIHRoaXMubm1lO1xyXG4gICAgdGhpcy50eXA7XHJcbiAgICB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gICAgdGhpcy5jaGVja19zdGF0dXMgPSBbXTtcclxuICAgIHRoaXMucGt0X3N0YXR1cyA9IFtdO1xyXG4gICAgdGhpcy5jb2xGb3JtYXRlID0gW107XHJcbiAgICB0aGlzLmFsbGNvbHMgPSBbXTtcclxuICAgIHRoaXMuZmlsZUxvZ0lkbiA9IDA7XHJcbiAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RlcE1zZyA9ICcnO1xyXG4gICAgdGhpcy5zdHRzID0ge307XHJcbiAgICB0aGlzLmNsaWNrZWQgPSBmYWxzZTtcclxuICAgIHRoaXMudG90UHJvZ3Jlc3MgPSAwO1xyXG4gICAgdGhpcy50b3RQcm9ncmVzc0ZpbGUgPSAwO1xyXG4gICAgdGhpcy5zdGVwID0gMTtcclxuICAgIHRoaXMubGFibGUgPSBcIlwiO1xyXG4gICAgdGhpcy5maWxlbm1lID0gXCJcIjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHRoaXMuZGF0ZUZvcm1hdE1hcCA9IHt9O1xyXG4gICAgbGV0IGZpbGV0eXBlID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZpbGV0eXBlJ10gfHwgJyc7XHJcbiAgICB0aGlzLm1kbCA9IG1kbDtcclxuICAgIHRoaXMuZmlsZW5tZSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmaWxldHlwZSddIHx8ICcnO1xyXG4gICAgdGhpcy5tYXBwaW5nc2tpcCA9IGZhbHNlO1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSBmaWxlVXBsb2FkO1xyXG4gICAgaWYgKG1kbCAhPSAnJylcclxuICAgICAgcmVxT2JqWydtZGwnXSA9IG1kbDtcclxuICAgIGlmIChmaWxldHlwZSAhPSAnJylcclxuICAgICAgcmVxT2JqWydmaWxlbm1lJ10gPSBmaWxldHlwZTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMuaGVhZGVyKSk7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2xvYWRGaWxlVXBsb2FkJztcclxuICAgIHRoaXMuY3MubG9hZGlGaWxlKHJlcU9iaiwgdGhpcy5oZWFkZXIsICdmaWxlVXBsb2FkL2xvYWQnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvbiA9IHJlc3VsdC5wYWdlRGVmaW5hdGlvblxyXG4gICAgICAgIHRoaXMuc3RhdHVzTGlzdCA9IHJlc3VsdC5zdGF0dXNMaXN0O1xyXG4gICAgICAgIHRoaXMuZmlsZURldGFpbHMgPSByZXN1bHQuZmlsZURldGFpbHM7XHJcbiAgICAgICAgdGhpcy5maWxlVHlwZUxpc3QgPSByZXN1bHQuZmlsZVR5cGVMaXN0O1xyXG4gICAgICAgIHRoaXMuZmlsZU9wdGlvbnNMaXN0ID0gcmVzdWx0LmZpbGVPcHRpb25zTGlzdCB8fCBbXTtcclxuICAgICAgICBpZiAodGhpcy5maWxlT3B0aW9uc0xpc3QubGVuZ3RoID4gMClcclxuICAgICAgICAgIHRoaXMuZmlsZVR5cGUgPSB0aGlzLmZpbGVPcHRpb25zTGlzdFswXS5rO1xyXG4gICAgICAgIGxldCBhZGRsQXR0ciA9IHRoaXMuZmlsZU9wdGlvbnNMaXN0WzBdLmFkZGxfYXR0ciB8fCB7fTtcclxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQgPSBhZGRsQXR0ci5kYXRlZm9ybWF0IHx8ICdkZC9tbS95eSc7XHJcbiAgICAgICAgdGhpcy5kZWxpbSA9IGFkZGxBdHRyLmRlbGltIHx8ICcvJztcclxuICAgICAgICB0aGlzLnN0YXR1c0xpc3QgPSByZXN1bHQuc3RhdHVzTGlzdC5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgICBsYWJlbDogb3B0aW9uLnZcclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcblxyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG5cclxuICAgIGxldCBtZGxrID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWRsS2V5JykpO1xyXG4gICAgbGV0IGNVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcbiAgICB0aGlzLmNEdCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmhlYWRlciA9IHtcclxuICAgICAgJ2NsaWVudGtleSc6IENvb2tpZS5nZXQoJ19jaycpLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnbG9naW5pZCc6IENvb2tpZS5nZXQoJ19sb2dpZCcpLFxyXG4gICAgICAnbW9kdWxla2V5JzogbWRsa1tjVXJsLnNwbGl0KCcvJylbMV1dLFxyXG4gICAgICAnc291cmNlJzogJ3FzJ1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgbWRsID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2dycCddIHx8ICcnO1xyXG5cclxuICAgICAgdGhpcy5sb2FkRmlsZVR5cGVEYXRhKCdmaWxlVXBsb2FkJywgbWRsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpbndhcmRfaWRuO1xyXG4gIGlud2FyZFN0b2NrVHlwZTtcclxuICBzdG9ja0lud2FyZFVwbG9hZChpbndhcmREdGwsIG1kbCkge1xyXG4gICAgdGhpcy5pbndhcmRfaWRuID0gaW53YXJkRHRsLmlud2FyZF9pZG47XHJcbiAgICB0aGlzLmlud2FyZFN0b2NrVHlwZSA9IGlud2FyZER0bC5zdG9ja190eXBlO1xyXG4gICAgdGhpcy5tZGwgPSBtZGw7XHJcbiAgICB0aGlzLmxvYWRGaWxlVHlwZURhdGEoJ2ZpbGVVcGxvYWQnLCBtZGwpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy50aW1lcmZpbGUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcmZpbGUpO1xyXG5cclxuICAgIGlmICh0aGlzLnRpbWVyUHJpY2UgIT0gdW5kZWZpbmVkKVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lclByaWNlKTtcclxuXHJcbiAgfVxyXG5cclxuICBzZXRPcHRpb25zRm9yTWl4VG9TaW5nbGUoKSB7XHJcbiAgICB0aGlzLmZpbGVPcHRpb25zTGlzdCA9IFtcclxuICAgICAgeyBcImtcIjogXCI2OTZcIiwgXCJ2XCI6IFwiTWFya2V0aW5nIFN0b2NrXCIgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuZmlsZVR5cGUgPSBcIjY5NlwiO1xyXG4gIH1cclxuXHJcblxyXG59IiwiPGRpdiBjbGFzcz1cIm10XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiAjZmZmO1wiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lXCI+XHJcbiAgICAgICAgPHAgKm5nSWY9XCJzaG93XCIgY2xhc3M9XCJsb2FkaW5nLXRleHRcIiBzdHlsZT1cInotaW5kZXg6IDk5OTlcIj4ge3tzdGVwTXNnfX0gPC9wPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXJEXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1lbGVtZW50LXN0ZXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc3RlcC10aGluXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBiZy1ncmV5IG10LXN0ZXAtY29sXCIgW25nQ2xhc3NdPVwieydkb25lJzpzdGVwPT0xID8gJ2RvbmUnOicnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9c2V0U2V0cCgxKT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LXN0ZXAtbnVtYmVyIGJnLXdoaXRlIGZvbnQtZ3JleVwiPjE8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LXN0ZXAtdGl0bGUgdXBwZXJjYXNlIGZvbnQtZ3JleS1jYXNjYWRlXCI+QnJvd3NlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGJnLWdyZXkgbXQtc3RlcC1jb2xcIiBbbmdDbGFzc109XCJ7J2RvbmUnOnN0ZXA9PTIgPyAnZG9uZSc6Jyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1zZXRTZXRwKDIpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC1udW1iZXIgYmctd2hpdGUgZm9udC1ncmV5XCI+MjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC10aXRsZSB1cHBlcmNhc2UgZm9udC1ncmV5LWNhc2NhZGVcIj5IZWFkZXIgVmVyaWZpY2F0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGJnLWdyZXkgbXQtc3RlcC1jb2xcIiBbbmdDbGFzc109XCJ7J2RvbmUnOnN0ZXA9PTMgPyAnZG9uZSc6Jyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1zZXRTZXRwKDMpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC1udW1iZXIgYmctd2hpdGUgZm9udC1ncmV5XCI+MzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC10aXRsZSB1cHBlcmNhc2UgZm9udC1ncmV5LWNhc2NhZGVcIj5EYXRhIFZlcmlmaWNhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgYmctZ3JleSBtdC1zdGVwLWNvbFwiIFtuZ0NsYXNzXT1cInsnZG9uZSc6c3RlcD09NCA/ICdkb25lJzonJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPXNldFNldHAoNCk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1zdGVwLW51bWJlciBiZy13aGl0ZSBmb250LWdyZXlcIj40PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1zdGVwLXRpdGxlIHVwcGVyY2FzZSBmb250LWdyZXktY2FzY2FkZVwiPlVwbG9hZGluZy4uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdXBsb2FkXCIgKm5nSWY9XCJzdGVwPT0xXCI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLW9mZnNldC0zIGNvbC1tZC0zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTQgY29udHJvbC1sYWJlbFwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPkZpbGUgVHlwZSA6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cImZpbGVUeXBlXCIgWyhuZ01vZGVsKV09XCJmaWxlVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tc2VsZWN0LS08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZU9wdGlvbnNMaXN0XCIgdmFsdWU9XCJ7e2ZpbGU/Lmt9fVwiPnt7ZmlsZT8udn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmaWxlaW5wdXQtd3JhcHBlciBidG4gYnRuLWRlZmF1bHQgIGZpbGVpbnB1dCBidG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6ICMzYTU4OThcIj48c3Bhbj5Ccm93c2UgZmlsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGNsYXNzPVwiZmlsZWlucHV0IGJ0bi1wcmltYXJ5XCIgbmFtZT1cImZpbGVuYW1lXCIgaWQ9XCJmaWxlbmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJCcm93c2UgZmlsZVwiIGFjY2VwdD1cIi54bHN4LC5jc3ZcIiAoY2hhbmdlKT1cImluY29taW5nZmlsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImxlZnQ6IC0xNjMuNzVweDsgdG9wOiA5cHg7XCI+PC9hPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+VXBsb2FkIEZpbGUgOiAmbmJzcDsmbmJzcDsmbmJzcDs8L2xhYmVsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImZpbGVpbnB1dCBidG4tcHJpbWFyeVwiIGFjY2VwdD1cIi54bHN4LC5jc3ZcIiBuYW1lPVwiZmlsZW5hbWVcIiBpZD1cImZpbGVuYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJpbmNvbWluZ2ZpbGUoJGV2ZW50KVwiIHRpdGxlPVwiQnJvd3NlIGZpbGVcIj4gLS0+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdXBsb2FkXCIgKm5nSWY9XCJzdGVwPT0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIE1hdGNoIDoge3t0b3RhbG1hdGNofX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgSWdub3JlIDoge3t0b3RhbGlnbm9yZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbC1tZC0xMlwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87d2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZpbGV1cGxvYWR2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGRyIG9mIGhlYWRlckxpc3QgO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGNoJzpoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyIT0nJyAmJiBoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5pZ25vcmUhPSdZJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZ25vcmUnOmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZT09J1knLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoYmcnOmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHI9PScnICYmIGhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSE9J1knXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJ1cGRhdGVjb2x1bW5zdGF0dWUoaGRyKVwiPnt7aGRyfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGRyIG9mIGhlYWRlckxpc3QgO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cj09JydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3QtY29udHJvbFwiIG5hbWU9XCJ7e2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0clwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29uZmlybXNldEhlYWRlck1hcHAoaGRyLCRldmVudC50YXJnZXQpXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwic2VsZWN0LWNvbnRyb2xcIiBuYW1lPVwie3toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbmZpcm1zZXRIZWFkZXJNYXBwKGhkcilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tc2VsZWN0LS08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYXR0ckR0bCBvZiBhdHRyU3RydWN0dXJlRHRsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3thdHRyRHRsPy5hdHRyfX1cIj57e2F0dHJEdGw/LmF0dHJ9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciE9JydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJ9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkZXJMaXN0IDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmR0YV90eXA9PSdkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3QtY29udHJvbFwiIG5hbWU9XCJ7e2RhdGVGb3JtYXRNYXBbaGRyXX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRlRm9ybWF0TWFwW2hkcl1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZHRlRm10IG9mIGRhdGVGb3JtYXRMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3tkdGVGbXQ/Lmt9fVwiPnt7ZHRlRm10Py52fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3dEaXMgb2YgZGVmdWx0RGlzcGxheU9iaiA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZGVyTGlzdCA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cm93RGlzW2hkcl19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLW9mZnNldC0xMSBjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZmlsZUxvZ0lkbj09MCAmJiBmaWxlbm1lPT0nZ2VuZXJpYydcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNXB4XCIgKGNsaWNrKT1cIlNraXBWZXJpZmljYXRpb24oKVwiPlNraXA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImZpbGVMb2dJZG49PTBcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNXB4XCIgKGNsaWNrKT1cIlZhbGlkYXRlRmlsZUhlYWRlck1hcHBpbmcoJ1knKVwiPlZlcmlmeTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB1cGxvYWQgXCIgKm5nSWY9XCJzdGVwPT0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB0YWJsZS1yZXNwb25zaXZlIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9XCIxMFwiIGNsYXNzPVwiZGlzcGxheVRhYmxlIGZpbGV1cGxvYWR2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZHIgb2YgY2hhckhlYWRlckxpc3QgO2xldCBqPWluZGV4O1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cImNvbG9yOndoaXRlO2JvcmRlcjogMXB4IHNvbGlkIHdoaXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hkcn19KHt7aGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cn19KTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBbbmdDbGFzc109XCJ7J2V2ZW4nOmolMj09MCwnb2RkJzpqJTI9PTF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGF0dHJWYWwgb2Ygcm93ZGlzdGluY3REYXRhTWFwW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6MTYwcHg7bWFyZ2luLXJpZ2h0OiAxcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXRjaGVkVWwnOnJvd2RhdGFtYXBEZXRhaWxzW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdW2F0dHJWYWxdLnZhbCAhPScnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIHN0eWxlPVwibGlzdC1zdHlsZTogbm9uZTt0ZXh0LWFsaWduOmxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+IHt7YXR0clZhbH19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvd2RhdGFtYXBEZXRhaWxzW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdW2F0dHJWYWxdLnZhbD09JydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tyb3dkYXRhbWFwRGV0YWlsc1toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVthdHRyVmFsXS52YWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd2RhdGFtYXBEZXRhaWxzW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdW2F0dHJWYWxdLnZhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbmZpcm1IZWFkZXJEZXRhaWxzTWFwcChoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyLGhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJfaWRuLGF0dHJWYWwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS1zZWxlY3QtLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdHRyZHRsbWFwIG9mIGF0dHJpYnV0ZUR0bE1hcFtoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e2F0dHJkdGxtYXA/LnZhbH19XCI+e3thdHRyZHRsbWFwPy52YWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicm93ZGF0YW1hcERldGFpbHNbaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cl1bYXR0clZhbF0udmFsIT0nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyb3dkYXRhbWFwRGV0YWlsc1toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVthdHRyVmFsXS52YWx9fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsgPGkgKGNsaWNrKT1cInJlbW92ZURldGFpbEF0dHJPcHRWYWwoaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cl9pZG4sYXR0clZhbCxyb3dkYXRhbWFwRGV0YWlsc1toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVthdHRyVmFsXS52YWwsW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdKVwiIGNsYXNzPVwiZmEgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiByZWQ7Y3Vyc29yOiBwb2ludGVyO1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLW9mZnNldC0xMSBjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZmlsZUxvZ0lkbj09MCAmJiBmaWxlbm1lPT0nZ2VuZXJpYydcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNXB4XCIgKGNsaWNrKT1cIlNraXBWZXJpZmljYXRpb25EdGwoKVwiPlNraXA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCIgc3R5bGU9XCJtYXJnaW46IDVweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwbG9hZEZpbGUoKVwiIFtkaXNhYmxlZF09XCJnbWF0Y2hlZENvdW50IT1ncmVzdWx0Q291bnRcIj5VcGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdXBsb2FkXCIgKm5nSWY9XCJzdGVwPT00XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic3RlcD09NFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE1cHg7Y29sb3I6Z3JlZW47Zm9udC1zaXplOiAyMHB4O3RleHQtYWxpZ246IGxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFibGVGaWxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiICpuZ0lmPVwibGFzdFJlZnJlc2hUaW1lRmlsZSAhPSBudWxsXCI+TGFzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggdGltZSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt7bGFzdFJlZnJlc2hUaW1lRmlsZSB8IGRhdGU6J21lZGl1bSd9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiIHN0eWxlPVwibWFyZ2luOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItd2FybmluZ1wiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCI2MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgW25nU3R5bGVdPVwieyd3aWR0aCc6dG90UHJvZ3Jlc3NGaWxlKyclJ30gIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dG90UHJvZ3Jlc3NGaWxlfX0gJVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzdGVwPT00ICYmIGNsaWNrZWRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDM1cHg7XCI+PHN0cm9uZz4gQ29tcGxldGUgOnt7c3R0c0ZpbGVbJ0MnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IFBlbmRpbmcgOiB7e3N0dHNGaWxlWydQJ119fSAmbmJzcDsmbmJzcDsmbmJzcDsgRXJyb3IgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c3R0c0ZpbGVbJ0UnXX19Jm5ic3A7Jm5ic3A7Jm5ic3A7IEludmFpbGQgU3RhdHVzIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N0dHNGaWxlWydJJ119fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBUb3RhbCA6IHt7c3R0c0ZpbGVbJ1QnXX19PC9zdHJvbmc+PC9wPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic3RlcD09NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxNXB4O2NvbG9yOmdyZWVuO2ZvbnQtc2l6ZTogMjBweDttYXJnaW4tdG9wOiAxNXB4O3RleHQtYWxpZ246IGxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFibGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEycHg7bWFyZ2luLWxlZnQ6IDIwcHg7Y29sb3I6IGJsYWNrO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJsYXN0UmVmcmVzaFRpbWUgIT0gbnVsbFwiPkxhc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoIHRpbWUgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7e2xhc3RSZWZyZXNoVGltZSB8IGRhdGU6J21lZGl1bSd9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiIHN0eWxlPVwibWFyZ2luOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItd2FybmluZ1wiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCI2MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgW25nU3R5bGVdPVwieyd3aWR0aCc6dG90UHJvZ3Jlc3MrJyUnfSAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0b3RQcm9ncmVzc319ICVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3MgdGV4dC1jZW50ZXJcIiBzdHlsZT1cIm1hcmdpbjogNXB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGVja1VwbG9hZFN0dCgpXCI+Q2hlY2tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czwvYnV0dG9uPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic3RlcD09NCAmJiBjbGlja2VkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAzNXB4O1wiPjxzdHJvbmc+IENvbXBsZXRlIDp7e3N0dHNbJ0MnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IFBlbmRpbmcgOiB7e3N0dHNbJ1AnXX19ICZuYnNwOyZuYnNwOyZuYnNwOyBFcnJvciA6IHt7c3R0c1snRSddfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgVG90YWwgOiB7e3N0dHNbJ1QnXX19PC9zdHJvbmc+PC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJmaWxlVXBsb2FkTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgc3R5bGU9XCJ6LWluZGV4OiA5OTk5OTlcIiByb2xlPVwiZGlhbG9nXCJcclxuICAgIGFyaWEtbGFiZWxsZWRieT1cInNtYWxsTW9kYWxIZWFkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iYWNrZHJvcD1cInN0YXRpY1wiIGRhdGEta2V5Ym9hcmQ9XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiICNmaWxlVXBsb2FkY2xzYnRuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJzbWFsbE1vZGFsSGVhZFwiPkFkZCBmaWxlIHVwbG9hZCBvcHRpb248L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiIHJvbGU9XCJmb3JtXCIgI2Y9XCJuZ0Zvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoZilcIiBuYW1lPVwiYXBwRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5OYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cIm5tZVwiIG5hbWU9XCJubWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5EZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPlR5cGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInR5cFwiIFsobmdNb2RlbCldPVwidHlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLXNlbGVjdC0tPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZVR5cGVMaXN0XCIgdmFsdWU9XCJ7e2ZpbGU/Lmt9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmaWxlPy52fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5DaGVjayBzdGF0dXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiIFtvcHRpb25zXT1cInN0YXR1c0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNoZWNrX3N0YXR1c1wiIG5hbWU9XCJjaGVja19zdGF0dXNcIiBbbXVsdGlwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0NsZWFyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNvcHRpb25UZW1wbGF0ZSBsZXQtb3B0aW9uPVwib3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFtZmFtZmFtLWZsYWdzIHt7b3B0aW9uPy52YWx1ZX19XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbj8ubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5QYWNrZXQgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGF0dXNcIiBbb3B0aW9uc109XCJzdGF0dXNMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwa3Rfc3RhdHVzXCIgbmFtZT1cInBrdF9zdGF0dXNcIiBbYWxsb3dDbGVhcl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uVGVtcGxhdGUgbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZhbWZhbWZhbS1mbGFncyB7e29wdGlvbj8udmFsdWV9fVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24/LmxhYmVsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgI2ZpbGVVcGxvYWRjbHNidG4+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcHBBcHBOb0RibENsaWNrXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0KGYpXCI+U2F2ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiQ29maXJtbWFwaGRyXCIgIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzbWFsbE1vZGFsSGVhZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIlxyXG4gIGRhdGEta2V5Ym9hcmQ9XCJmYWxzZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiQ2FuY2VsSGVhZGVyTWFwcCgpXCIgY2xhc3M9XCJjbG9zZVwiICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiID5DbG9zZTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwic21hbGxNb2RhbEhlYWRcIj5BbGVydDwvaDQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSBGb3IgTWFwcGluZyA8Yj57e21hcGhkcn19PC9iPiBUbyBBdHRyaWJ1dGUgPGI+e3toZHJtYXNzYWdlfX08L2I+IFxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwiQ2FuY2VsSGVhZGVyTWFwcCgpXCIgICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiID5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJzZXRIZWFkZXJNYXBwKCk7XCI+Q29uZmlybTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cIkNvZmlybW1hcGR0bFwiICByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwic21hbGxNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCJcclxuICBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIkNhbmNlbEhlYWRlck1hcHAoKVwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiID5cclxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIiA+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInNtYWxsTW9kYWxIZWFkXCI+QWxlcnQ8L2g0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICBBcmUgeW91IHN1cmUgRm9yIE1hcHBpbmcgPGI+e3tkdGxvcHRpb252YWx9fTwvYj4gVG8gQXR0cmlidXRlICA8Yj4ge3tkdGxBdHRyfX0gPC9iPiB3aXRoIEF0dHJpYnV0ZURldGFpbCA8Yj57e2R0bG1hc3NhZ2V9fTwvYj4gXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cIkNhbmNlbEhlYWRlckRldGFpbHNNYXBwKClcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJzZXRIZWFkZXJEZXRhaWxzTWFwcCgpXCI+Q29uZmlybTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbjxidXR0b24gaWQ9XCJidG5maWxlVXBsb2FkTW9kYWxcIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjZmlsZVVwbG9hZE1vZGFsXCI+PC9idXR0b24+XHJcblxyXG48YnV0dG9uIGlkPVwiYnRuQ29maXJtbWFwaGRyXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI0NvZmlybW1hcGhkclwiPjwvYnV0dG9uPlxyXG48YnV0dG9uIGlkPVwiYnRuQ29maXJtbWFwZHRsXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI0NvZmlybW1hcGR0bFwiPjwvYnV0dG9uPlxyXG5cclxuXHJcblxyXG48IS0tIDxkaXYgY2xhc3M9XCJjZW50ZXJlZFwiPlxyXG4gICAgPGRpdiBpZD1cImRpdlNwaW5uZXJcIiBjbGFzcz1cInNwaW5uZXIgbG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+TG9hZGluZyAuLi48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxidXR0b24gKGNsaWNrKT1cInRlc3QoKVwiIGlkPVwiYnRuTG9hZFJlY29yZHNcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MiU7IGxlZnQ6IDQ1JTtcIj5Mb2FkIFJlY29yZHM8L2J1dHRvbj5cclxuICA8L2Rpdj4gLS0+Il19